forked from M-Labs/artiq
drtio: fixes, add aux packet test
This commit is contained in:
parent
e59142e344
commit
95d7cba34a
|
@ -56,7 +56,7 @@ class LinkLayerTX(Module):
|
||||||
self.submodules += aux_scrambler
|
self.submodules += aux_scrambler
|
||||||
aux_data_ctl = []
|
aux_data_ctl = []
|
||||||
for i in range(nwords):
|
for i in range(nwords):
|
||||||
aux_data_ctl.append(self.aux_data[i*2:i*2+1])
|
aux_data_ctl.append(self.aux_data[i*2:i*2+2])
|
||||||
aux_data_ctl.append(0)
|
aux_data_ctl.append(0)
|
||||||
self.comb += [
|
self.comb += [
|
||||||
If(self.aux_frame,
|
If(self.aux_frame,
|
||||||
|
@ -129,6 +129,7 @@ class LinkLayerRX(Module):
|
||||||
|
|
||||||
self.link_init = Signal()
|
self.link_init = Signal()
|
||||||
|
|
||||||
|
self.aux_stb = Signal()
|
||||||
self.aux_frame = Signal()
|
self.aux_frame = Signal()
|
||||||
self.aux_data = Signal(2*nwords)
|
self.aux_data = Signal(2*nwords)
|
||||||
|
|
||||||
|
@ -137,7 +138,7 @@ class LinkLayerRX(Module):
|
||||||
|
|
||||||
# # #
|
# # #
|
||||||
|
|
||||||
aux_descrambler = ResetInserter()(CEInserter()(Scrambler(2*nwords)))
|
aux_descrambler = ResetInserter()(CEInserter()(Scrambler(3*nwords)))
|
||||||
rt_descrambler = ResetInserter()(CEInserter()(Scrambler(8*nwords)))
|
rt_descrambler = ResetInserter()(CEInserter()(Scrambler(8*nwords)))
|
||||||
self.submodules += aux_descrambler, rt_descrambler
|
self.submodules += aux_descrambler, rt_descrambler
|
||||||
self.comb += [
|
self.comb += [
|
||||||
|
@ -148,9 +149,11 @@ class LinkLayerRX(Module):
|
||||||
]
|
]
|
||||||
|
|
||||||
link_init_d = Signal()
|
link_init_d = Signal()
|
||||||
|
aux_stb_d = Signal()
|
||||||
rt_frame_d = Signal()
|
rt_frame_d = Signal()
|
||||||
self.sync += [
|
self.sync += [
|
||||||
self.link_init.eq(link_init_d),
|
self.link_init.eq(link_init_d),
|
||||||
|
self.aux_stb.eq(aux_stb_d),
|
||||||
self.rt_frame.eq(rt_frame_d)
|
self.rt_frame.eq(rt_frame_d)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -160,12 +163,14 @@ class LinkLayerRX(Module):
|
||||||
link_init_d.eq(1),
|
link_init_d.eq(1),
|
||||||
aux_descrambler.reset.eq(1),
|
aux_descrambler.reset.eq(1),
|
||||||
rt_descrambler.reset.eq(1)
|
rt_descrambler.reset.eq(1)
|
||||||
|
).Else(
|
||||||
|
aux_stb_d.eq(1)
|
||||||
),
|
),
|
||||||
aux_descrambler.ce.eq(1)
|
aux_descrambler.ce.eq(1)
|
||||||
).Else(
|
).Else(
|
||||||
rt_frame_d.eq(1),
|
rt_frame_d.eq(1),
|
||||||
rt_descrambler.ce.eq(1)
|
rt_descrambler.ce.eq(1)
|
||||||
),
|
),
|
||||||
aux_descrambler.i.eq(Cat(*[d.d >> 5 for d in decoders])),
|
aux_descrambler.i.eq(Cat(*[d.d[5:] for d in decoders])),
|
||||||
rt_descrambler.i.eq(Cat(*[d.d for d in decoders]))
|
rt_descrambler.i.eq(Cat(*[d.d for d in decoders]))
|
||||||
]
|
]
|
||||||
|
|
|
@ -55,7 +55,8 @@ class TestLinkLayer(unittest.TestCase):
|
||||||
rt_packets = [
|
rt_packets = [
|
||||||
[0x12459970, 0x9938cdef, 0x12340000],
|
[0x12459970, 0x9938cdef, 0x12340000],
|
||||||
[0xabcdef00, 0x12345678],
|
[0xabcdef00, 0x12345678],
|
||||||
[0xeeeeeeee, 0xffffffff, 0x01020304, 0x11223344]
|
[0xeeeeeeee, 0xffffffff, 0x01020304, 0x11223344],
|
||||||
|
[0x88277475, 0x19883332, 0x19837662, 0x81726668, 0x81876261]
|
||||||
]
|
]
|
||||||
def transmit_rt_packets():
|
def transmit_rt_packets():
|
||||||
while not (yield dut.tx.link_init):
|
while not (yield dut.tx.link_init):
|
||||||
|
@ -77,22 +78,77 @@ class TestLinkLayer(unittest.TestCase):
|
||||||
rx_rt_packets = []
|
rx_rt_packets = []
|
||||||
@passive
|
@passive
|
||||||
def receive_rt_packets():
|
def receive_rt_packets():
|
||||||
|
while not (yield dut.rx.link_init):
|
||||||
|
yield
|
||||||
|
while (yield dut.rx.link_init):
|
||||||
|
yield
|
||||||
|
|
||||||
|
previous_frame = 0
|
||||||
|
while True:
|
||||||
|
frame = yield dut.rx.rt_frame
|
||||||
|
if frame and not previous_frame:
|
||||||
|
packet = []
|
||||||
|
rx_rt_packets.append(packet)
|
||||||
|
previous_frame = frame
|
||||||
|
if frame:
|
||||||
|
packet.append((yield dut.rx.rt_data))
|
||||||
|
yield
|
||||||
|
|
||||||
|
aux_packets = [
|
||||||
|
[0x12, 0x34],
|
||||||
|
[0x44, 0x11, 0x98, 0x78],
|
||||||
|
[0xbb, 0xaa, 0xdd, 0xcc, 0x00, 0xff, 0xee]
|
||||||
|
]
|
||||||
|
def transmit_aux_packets():
|
||||||
while not (yield dut.tx.link_init):
|
while not (yield dut.tx.link_init):
|
||||||
yield
|
yield
|
||||||
while (yield dut.tx.link_init):
|
while (yield dut.tx.link_init):
|
||||||
yield
|
yield
|
||||||
|
|
||||||
while True:
|
for packet in aux_packets:
|
||||||
packet = []
|
yield dut.tx.aux_frame.eq(1)
|
||||||
rx_rt_packets.append(packet)
|
for data in packet:
|
||||||
while not (yield dut.rx.rt_frame):
|
yield dut.tx.aux_data.eq(data)
|
||||||
yield
|
yield
|
||||||
while (yield dut.rx.rt_frame):
|
while not (yield dut.tx.aux_ack):
|
||||||
packet.append((yield dut.rx.rt_data))
|
yield
|
||||||
|
yield dut.tx.aux_frame.eq(0)
|
||||||
|
yield
|
||||||
|
while not (yield dut.tx.aux_ack):
|
||||||
|
yield
|
||||||
|
# flush
|
||||||
|
for i in range(20):
|
||||||
|
yield
|
||||||
|
|
||||||
|
rx_aux_packets = []
|
||||||
|
@passive
|
||||||
|
def receive_aux_packets():
|
||||||
|
while not (yield dut.rx.link_init):
|
||||||
|
yield
|
||||||
|
while (yield dut.rx.link_init):
|
||||||
|
yield
|
||||||
|
|
||||||
|
previous_frame = 0
|
||||||
|
while True:
|
||||||
|
if (yield dut.rx.aux_stb):
|
||||||
|
frame = yield dut.rx.aux_frame
|
||||||
|
if frame and not previous_frame:
|
||||||
|
packet = []
|
||||||
|
rx_aux_packets.append(packet)
|
||||||
|
previous_frame = frame
|
||||||
|
if frame:
|
||||||
|
packet.append((yield dut.rx.aux_data))
|
||||||
yield
|
yield
|
||||||
|
|
||||||
run_simulation(dut, [link_init(),
|
run_simulation(dut, [link_init(),
|
||||||
transmit_rt_packets(), receive_rt_packets()])
|
transmit_rt_packets(), receive_rt_packets(),
|
||||||
|
transmit_aux_packets(), receive_aux_packets()])
|
||||||
|
|
||||||
for packet in rx_rt_packets:
|
# print("RT:")
|
||||||
print(" ".join("{:08x}".format(x) for x in packet))
|
# for packet in rx_rt_packets:
|
||||||
|
# print(" ".join("{:08x}".format(x) for x in packet))
|
||||||
|
# print("AUX:")
|
||||||
|
# for packet in rx_aux_packets:
|
||||||
|
# print(" ".join("{:02x}".format(x) for x in packet))
|
||||||
|
self.assertEqual(rt_packets, rx_rt_packets)
|
||||||
|
self.assertEqual(aux_packets, rx_aux_packets)
|
||||||
|
|
Loading…
Reference in New Issue