change name to LiteEth (LiteEthernet is too long...)
[litex.git] / liteeth / mac / test / preamble_tb.py
1 from migen.fhdl.std import *
2
3 from misoclib.ethmac.common import *
4 from misoclib.ethmac.preamble import *
5 from misoclib.ethmac.test.common import *
6
7 preamble = [
8 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xD5
9 ]
10
11 payload = [
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
20 ]
21
22 mux = {
23 "inserter": 0,
24 "checker": 1,
25 "both": 2
26 }
27
28 class TB(Module):
29 def __init__(self, random_level=50):
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)
35
36 self.comb += [
37 self.streamer.source.connect(self.streamer_randomizer.sink),
38 self.logger_randomizer.source.connect(self.logger.sink)
39 ]
40
41 sm.preamble_inserter = PreambleInserter(8)
42 sm.preamble_checker = PreambleChecker(8)
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 ]
58 def gen_simulation(self, selfp):
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))
65
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))
72
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))
79
80 if __name__ == "__main__":
81 from migen.sim.generic import run_simulation
82 run_simulation(TB(), ncycles=1000, vcd_name="my.vcd")