forked from M-Labs/artiq
rtio: add simulation unit test for input collector
This commit is contained in:
parent
d37577a8a1
commit
06a0707c00
|
@ -0,0 +1,90 @@
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from migen import *
|
||||||
|
|
||||||
|
from artiq.gateware import rtio
|
||||||
|
from artiq.gateware.rtio import rtlink
|
||||||
|
from artiq.gateware.rtio import cri
|
||||||
|
from artiq.gateware.rtio.input_collector import *
|
||||||
|
|
||||||
|
|
||||||
|
class OscInput(Module):
|
||||||
|
def __init__(self):
|
||||||
|
self.rtlink = rtlink.Interface(
|
||||||
|
rtlink.OInterface(1),
|
||||||
|
rtlink.IInterface(1))
|
||||||
|
self.overrides = []
|
||||||
|
self.probes = []
|
||||||
|
|
||||||
|
# # #
|
||||||
|
|
||||||
|
counter = Signal(2)
|
||||||
|
trigger = Signal()
|
||||||
|
self.sync += [
|
||||||
|
Cat(counter, trigger).eq(counter + 1),
|
||||||
|
self.rtlink.i.stb.eq(0),
|
||||||
|
If(trigger,
|
||||||
|
self.rtlink.i.stb.eq(1),
|
||||||
|
self.rtlink.i.data.eq(~self.rtlink.i.data)
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
class DUT(Module):
|
||||||
|
def __init__(self):
|
||||||
|
self.submodules.phy0 = OscInput()
|
||||||
|
self.submodules.phy1 = OscInput()
|
||||||
|
rtio_channels = [
|
||||||
|
rtio.Channel.from_phy(self.phy0, ififo_depth=4),
|
||||||
|
rtio.Channel.from_phy(self.phy1, ififo_depth=4)
|
||||||
|
]
|
||||||
|
self.submodules.input_collector = InputCollector(rtio_channels, 0, "sync")
|
||||||
|
self.sync += self.input_collector.coarse_timestamp.eq(self.input_collector.coarse_timestamp + 1)
|
||||||
|
self.comb += self.input_collector.cri.counter.eq(self.input_collector.coarse_timestamp)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def cri(self):
|
||||||
|
return self.input_collector.cri
|
||||||
|
|
||||||
|
|
||||||
|
def simulate(wait_cycles, ts_timeouts):
|
||||||
|
result = []
|
||||||
|
dut = DUT()
|
||||||
|
def gen():
|
||||||
|
for _ in range(wait_cycles):
|
||||||
|
yield
|
||||||
|
|
||||||
|
for ts_timeout in ts_timeouts:
|
||||||
|
yield dut.cri.timestamp.eq(ts_timeout)
|
||||||
|
yield dut.cri.cmd.eq(cri.commands["read"])
|
||||||
|
yield
|
||||||
|
yield dut.cri.cmd.eq(cri.commands["nop"])
|
||||||
|
yield
|
||||||
|
while (yield dut.cri.i_status) & 4:
|
||||||
|
yield
|
||||||
|
status = yield dut.cri.i_status
|
||||||
|
if status & 2:
|
||||||
|
result.append("overflow")
|
||||||
|
elif status & 1:
|
||||||
|
result.append("timeout")
|
||||||
|
else:
|
||||||
|
i_timestamp = yield dut.cri.i_timestamp
|
||||||
|
i_data = yield dut.cri.i_data
|
||||||
|
result.append((i_timestamp, i_data))
|
||||||
|
|
||||||
|
run_simulation(dut, gen())
|
||||||
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
class TestInput(unittest.TestCase):
|
||||||
|
def test_get_data(self):
|
||||||
|
result = simulate(0, [256]*8)
|
||||||
|
self.assertEqual(result, [(n*4+1, n % 2) for n in range(1, 9)])
|
||||||
|
|
||||||
|
def test_timeout(self):
|
||||||
|
result = simulate(0, [3, 16])
|
||||||
|
self.assertEqual(result, ["timeout", (5, 1)])
|
||||||
|
|
||||||
|
def test_overflow(self):
|
||||||
|
result = simulate(32, [256])
|
||||||
|
self.assertEqual(result, ["overflow"])
|
Loading…
Reference in New Issue