forked from M-Labs/artiq
drtio: basic RT packet echo test
This commit is contained in:
parent
cb0d1549c6
commit
0574e882d2
|
@ -0,0 +1,67 @@
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from migen import *
|
||||||
|
|
||||||
|
from artiq.gateware.drtio.rt_packets import *
|
||||||
|
|
||||||
|
|
||||||
|
class PacketInterface:
|
||||||
|
def __init__(self, direction, frame, data):
|
||||||
|
if direction == "m2s":
|
||||||
|
self.plm = get_m2s_layouts(len(data))
|
||||||
|
elif direction == "s2m":
|
||||||
|
self.plm = get_s2m_layouts(len(data))
|
||||||
|
else:
|
||||||
|
raise ValueError
|
||||||
|
self.frame = frame
|
||||||
|
self.data = data
|
||||||
|
|
||||||
|
def send(self, ty, **kwargs):
|
||||||
|
idx = 8
|
||||||
|
value = self.plm.types[ty]
|
||||||
|
for field_name, field_size in self.plm.layouts[ty][1:]:
|
||||||
|
try:
|
||||||
|
fvalue = kwargs[field_name]
|
||||||
|
del kwargs[field_name]
|
||||||
|
except KeyError:
|
||||||
|
fvalue = 0
|
||||||
|
value = value | (fvalue << idx)
|
||||||
|
idx += field_size
|
||||||
|
if kwargs:
|
||||||
|
raise ValueError
|
||||||
|
|
||||||
|
ws = len(self.data)
|
||||||
|
yield self.frame.eq(1)
|
||||||
|
for i in range(idx//ws):
|
||||||
|
yield self.data.eq(value)
|
||||||
|
value >>= ws
|
||||||
|
yield
|
||||||
|
yield self.frame.eq(0)
|
||||||
|
yield
|
||||||
|
|
||||||
|
@passive
|
||||||
|
def receive(self, callback):
|
||||||
|
previous_frame = 0
|
||||||
|
frame_words = []
|
||||||
|
while True:
|
||||||
|
frame = yield self.frame
|
||||||
|
if frame:
|
||||||
|
frame_words.append((yield self.data))
|
||||||
|
if previous_frame and not frame:
|
||||||
|
callback(frame_words)
|
||||||
|
frame_words = []
|
||||||
|
previous_frame = frame
|
||||||
|
yield
|
||||||
|
|
||||||
|
|
||||||
|
class TestSatellite(unittest.TestCase):
|
||||||
|
def test_echo(self):
|
||||||
|
nwords = 4
|
||||||
|
dut = RTPacketSatellite(nwords)
|
||||||
|
pt = PacketInterface("m2s", dut.rx_rt_frame, dut.rx_rt_data)
|
||||||
|
pr = PacketInterface("s2m", dut.tx_rt_frame, dut.tx_rt_data)
|
||||||
|
def send():
|
||||||
|
yield from pt.send("echo_request")
|
||||||
|
for i in range(40):
|
||||||
|
yield
|
||||||
|
run_simulation(dut, [send(), pr.receive(print)])
|
Loading…
Reference in New Issue