|
2 | 2 |
|
3 | 3 | from misoclib.ethmac.common import *
|
4 | 4 | from misoclib.ethmac.preamble import *
|
5 |
| -from misoclib.ethmac.test import * |
| 5 | +from misoclib.ethmac.test.common import * |
6 | 6 |
|
7 |
| -frame_preamble = [ |
| 7 | +preamble = [ |
8 | 8 | 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xD5
|
9 | 9 | ]
|
10 | 10 |
|
11 |
| -frame_data = [ |
| 11 | +payload = [ |
12 | 12 | 0x00, 0x0A, 0xE6, 0xF0, 0x05, 0xA3, 0x00, 0x12,
|
13 |
| - 0x34, 0x56, 0x78, 0x90, 0x08, 0x00, 0x45, 0x00, |
14 |
| - 0x00, 0x30, 0xB3, 0xFE, 0x00, 0x00, 0x80, 0x11, |
15 |
| - 0x72, 0xBA, 0x0A, 0x00, 0x00, 0x03, 0x0A, 0x00, |
16 |
| - 0x00, 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x1C, |
17 |
| - 0x89, 0x4D, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, |
18 |
| - 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, |
19 |
| - 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13 |
| 13 | + 0x34, 0x56, 0x78, 0x90, 0x08, 0x00, 0x45, 0x00, |
| 14 | + 0x00, 0x30, 0xB3, 0xFE, 0x00, 0x00, 0x80, 0x11, |
| 15 | + 0x72, 0xBA, 0x0A, 0x00, 0x00, 0x03, 0x0A, 0x00, |
| 16 | + 0x00, 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x1C, |
| 17 | + 0x89, 0x4D, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, |
| 18 | + 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, |
| 19 | + 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13 |
20 | 20 | ]
|
21 | 21 |
|
| 22 | +mux = { |
| 23 | + "inserter": 0, |
| 24 | + "checker": 1, |
| 25 | + "both": 2 |
| 26 | +} |
| 27 | + |
22 | 28 | class TB(Module):
|
23 |
| - def __init__(self): |
| 29 | + def __init__(self, random_level=50): |
24 | 30 | sm = self.submodules
|
| 31 | + sm.streamer = PacketStreamer(eth_description(8)) |
| 32 | + sm.streamer_randomizer = AckRandomizer(eth_description(8), random_level) |
| 33 | + sm.logger = PacketLogger(eth_description(8)) |
| 34 | + sm.logger_randomizer = AckRandomizer(eth_description(8), random_level) |
25 | 35 |
|
26 |
| - # Streamer (DATA) --> PreambleInserter --> Logger (expect PREAMBLE + DATA) |
27 |
| - sm.inserter_streamer = PacketStreamer(frame_data) |
28 |
| - sm.preamble_inserter = PreambleInserter(8) |
29 |
| - sm.inserter_logger = PacketLogger() |
30 |
| - self.comb +=[ |
31 |
| - self.inserter_streamer.source.connect(self.preamble_inserter.sink), |
32 |
| - self.preamble_inserter.source.connect(self.inserter_logger.sink), |
| 36 | + self.comb += [ |
| 37 | + self.streamer.source.connect(self.streamer_randomizer.sink), |
| 38 | + self.logger_randomizer.source.connect(self.logger.sink) |
33 | 39 | ]
|
34 | 40 |
|
35 |
| - # Streamer (PREAMBLE + DATA) --> CRC32Checher --> Logger (except DATA + check) |
36 |
| - sm.checker_streamer = PacketStreamer(frame_preamble + frame_data) |
| 41 | + sm.preamble_inserter = PreambleInserter(8) |
37 | 42 | sm.preamble_checker = PreambleChecker(8)
|
38 |
| - sm.checker_logger = PacketLogger() |
39 |
| - self.comb +=[ |
40 |
| - self.checker_streamer.source.connect(self.preamble_checker.sink), |
41 |
| - self.preamble_checker.source.connect(self.checker_logger.sink), |
42 |
| - ] |
43 | 43 |
|
| 44 | + self.mux = Signal(2) |
| 45 | + self.comb += [ |
| 46 | + If(self.mux == mux["inserter"], |
| 47 | + self.streamer_randomizer.source.connect(self.preamble_inserter.sink), |
| 48 | + self.preamble_inserter.source.connect(self.logger_randomizer.sink) |
| 49 | + ).Elif(self.mux == mux["checker"], |
| 50 | + self.streamer_randomizer.source.connect(self.preamble_checker.sink), |
| 51 | + self.preamble_checker.source.connect(self.logger_randomizer.sink) |
| 52 | + ).Elif(self.mux == mux["both"], |
| 53 | + self.streamer_randomizer.source.connect(self.preamble_inserter.sink), |
| 54 | + self.preamble_inserter.source.connect(self.preamble_checker.sink), |
| 55 | + self.preamble_checker.source.connect(self.logger_randomizer.sink) |
| 56 | + ) |
| 57 | + ] |
44 | 58 | def gen_simulation(self, selfp):
|
45 |
| - for i in range(500): |
46 |
| - yield |
47 |
| - inserter_reference = frame_preamble + frame_data |
48 |
| - inserter_generated = self.inserter_logger.data |
| 59 | + selfp.mux = mux["inserter"] |
| 60 | + print("streamer --> preamble_inserter --> logger:") |
| 61 | + self.streamer.send(Packet(payload)) |
| 62 | + yield from self.logger.receive() |
| 63 | + s, l, e = check(preamble+payload, self.logger.packet) |
| 64 | + print("shift "+ str(s) + " / length " + str(l) + " / errors " + str(e)) |
49 | 65 |
|
50 |
| - checker_reference = frame_data |
51 |
| - checker_generated = self.checker_logger.data |
| 66 | + selfp.mux = mux["checker"] |
| 67 | + print("streamer --> preamble_checker --> logger:") |
| 68 | + self.streamer.send(Packet(preamble+payload)) |
| 69 | + yield from self.logger.receive() |
| 70 | + s, l, e = check(payload, self.logger.packet) |
| 71 | + print("shift "+ str(s) + " / length " + str(l) + " / errors " + str(e)) |
52 | 72 |
|
53 |
| - print_results("inserter", inserter_reference, inserter_generated) |
54 |
| - print_results("checker", checker_reference, checker_generated) |
| 73 | + selfp.mux = mux["both"] |
| 74 | + print("streamer --> preamble_inserter --> preamble_checker --> logger:") |
| 75 | + self.streamer.send(Packet(payload)) |
| 76 | + yield from self.logger.receive() |
| 77 | + s, l, e = check(payload, self.logger.packet) |
| 78 | + print("shift "+ str(s) + " / length " + str(l) + " / errors " + str(e)) |
55 | 79 |
|
56 | 80 | if __name__ == "__main__":
|
57 | 81 | from migen.sim.generic import run_simulation
|
58 |
| - run_simulation(TB(), ncycles=1000, vcd_name="my.vcd", keep_files=True) |
| 82 | + run_simulation(TB(), ncycles=1000, vcd_name="my.vcd") |
0 commit comments