tests: convert to async simulator syntax.

This causes one test to fail due to a now-exposed bug.

Co-authored-by: Wanda <wanda-phi@users.noreply.github.com>
This commit is contained in:
Catherine 2024-06-10 11:02:18 +01:00
parent 7cabe350d9
commit e24b9b4983
6 changed files with 452 additions and 465 deletions

View file

@ -23,16 +23,14 @@ class FFSynchronizerTestCase(FHDLTestCase):
sim = Simulator(frag)
sim.add_clock(1e-6)
def process():
self.assertEqual((yield o), 0)
yield i.eq(1)
yield Tick()
self.assertEqual((yield o), 0)
yield Tick()
self.assertEqual((yield o), 0)
yield Tick()
self.assertEqual((yield o), 1)
sim.add_process(process)
async def testbench(ctx):
self.assertEqual(ctx.get(o), 0)
ctx.set(i, 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 0)
await ctx.tick()
self.assertEqual(ctx.get(o), 1)
sim.add_testbench(testbench)
sim.run()
def test_init_value(self):
@ -42,16 +40,14 @@ class FFSynchronizerTestCase(FHDLTestCase):
sim = Simulator(frag)
sim.add_clock(1e-6)
def process():
self.assertEqual((yield o), 1)
yield i.eq(0)
yield Tick()
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 0)
sim.add_process(process)
async def testbench(ctx):
self.assertEqual(ctx.get(o), 1)
ctx.set(i, 0)
await ctx.tick()
self.assertEqual(ctx.get(o), 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 0)
sim.add_testbench(testbench)
sim.run()
def test_reset_value(self):
@ -63,16 +59,14 @@ class FFSynchronizerTestCase(FHDLTestCase):
sim = Simulator(frag)
sim.add_clock(1e-6)
def process():
self.assertEqual((yield o), 1)
yield i.eq(0)
yield Tick()
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 0)
sim.add_process(process)
async def testbench(ctx):
self.assertEqual(ctx.get(o), 1)
ctx.set(i, 0)
await ctx.tick()
self.assertEqual(ctx.get(o), 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 0)
sim.add_testbench(testbench)
sim.run()
def test_reset_wrong(self):
@ -114,31 +108,31 @@ class AsyncFFSynchronizerTestCase(FHDLTestCase):
sim = Simulator(m)
sim.add_clock(1e-6)
def process():
async def testbench(ctx):
# initial reset
self.assertEqual((yield i), 0)
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 0)
yield Tick()
self.assertEqual((yield o), 0)
yield Tick()
self.assertEqual(ctx.get(i), 0)
self.assertEqual(ctx.get(o), 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 0)
await ctx.tick()
self.assertEqual(ctx.get(o), 0)
await ctx.tick()
yield i.eq(1)
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 1)
yield i.eq(0)
yield Tick()
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 0)
yield Tick()
self.assertEqual((yield o), 0)
yield Tick()
sim.add_testbench(process)
ctx.set(i, 1)
self.assertEqual(ctx.get(o), 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 1)
ctx.set(i, 0)
await ctx.tick()
self.assertEqual(ctx.get(o), 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 0)
await ctx.tick()
self.assertEqual(ctx.get(o), 0)
await ctx.tick()
sim.add_testbench(testbench)
with sim.write_vcd("test.vcd"):
sim.run()
@ -151,31 +145,31 @@ class AsyncFFSynchronizerTestCase(FHDLTestCase):
sim = Simulator(m)
sim.add_clock(1e-6)
def process():
async def testbench(ctx):
# initial reset
self.assertEqual((yield i), 1)
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 0)
yield Tick()
self.assertEqual((yield o), 0)
yield Tick()
self.assertEqual(ctx.get(i), 1)
self.assertEqual(ctx.get(o), 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 0)
await ctx.tick()
self.assertEqual(ctx.get(o), 0)
await ctx.tick()
yield i.eq(0)
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 1)
yield i.eq(1)
yield Tick()
self.assertEqual((yield o), 1)
yield Tick()
self.assertEqual((yield o), 0)
yield Tick()
self.assertEqual((yield o), 0)
yield Tick()
sim.add_testbench(process)
ctx.set(i, 0)
self.assertEqual(ctx.get(o), 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 1)
ctx.set(i, 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 1)
await ctx.tick()
self.assertEqual(ctx.get(o), 0)
await ctx.tick()
self.assertEqual(ctx.get(o), 0)
await ctx.tick()
sim.add_testbench(testbench)
with sim.write_vcd("test.vcd"):
sim.run()
@ -199,31 +193,30 @@ class ResetSynchronizerTestCase(FHDLTestCase):
sim = Simulator(m)
sim.add_clock(1e-6)
def process():
async def testbench(ctx):
# initial reset
self.assertEqual((yield s), 1)
yield Tick()
self.assertEqual((yield s), 1)
yield Tick()
self.assertEqual((yield s), 1)
yield Tick()
self.assertEqual((yield s), 0)
yield Tick()
self.assertEqual(ctx.get(s), 1)
await ctx.tick()
self.assertEqual(ctx.get(s), 1)
await ctx.tick()
self.assertEqual(ctx.get(s), 1)
await ctx.tick()
self.assertEqual(ctx.get(s), 0)
await ctx.tick()
yield arst.eq(1)
yield Delay(1e-8)
self.assertEqual((yield s), 0)
yield Tick()
self.assertEqual((yield s), 1)
yield arst.eq(0)
yield Tick()
self.assertEqual((yield s), 1)
yield Tick()
self.assertEqual((yield s), 1)
yield Tick()
self.assertEqual((yield s), 0)
yield Tick()
sim.add_testbench(process)
ctx.set(arst, 1)
self.assertEqual(ctx.get(s), 0)
await ctx.tick()
self.assertEqual(ctx.get(s), 1)
ctx.set(arst, 0)
await ctx.tick()
self.assertEqual(ctx.get(s), 1)
await ctx.tick()
self.assertEqual(ctx.get(s), 1)
await ctx.tick()
self.assertEqual(ctx.get(s), 0)
await ctx.tick()
sim.add_testbench(testbench)
with sim.write_vcd("test.vcd"):
sim.run()
@ -245,21 +238,21 @@ class PulseSynchronizerTestCase(FHDLTestCase):
sim = Simulator(m)
sim.add_clock(1e-6)
def process():
yield ps.i.eq(0)
async def testbench(ctx):
ctx.set(ps.i, 0)
# TODO: think about reset
for n in range(5):
yield Tick()
await ctx.tick()
# Make sure no pulses are generated in quiescent state
for n in range(3):
yield Tick()
self.assertEqual((yield ps.o), 0)
await ctx.tick()
self.assertEqual(ctx.get(ps.o), 0)
# Check conservation of pulses
accum = 0
for n in range(10):
yield ps.i.eq(1 if n < 4 else 0)
yield Tick()
accum += yield ps.o
ctx.set(ps.i, 1 if n < 4 else 0)
await ctx.tick()
accum += ctx.get(ps.o)
self.assertEqual(accum, 4)
sim.add_process(process)
sim.add_testbench(testbench)
sim.run()

View file

@ -12,68 +12,68 @@ from .utils import *
class EncoderTestCase(FHDLTestCase):
def test_basic(self):
enc = Encoder(4)
def process():
self.assertEqual((yield enc.n), 1)
self.assertEqual((yield enc.o), 0)
async def testbench(ctx):
self.assertEqual(ctx.get(enc.n), 1)
self.assertEqual(ctx.get(enc.o), 0)
yield enc.i.eq(0b0001)
self.assertEqual((yield enc.n), 0)
self.assertEqual((yield enc.o), 0)
ctx.set(enc.i, 0b0001)
self.assertEqual(ctx.get(enc.n), 0)
self.assertEqual(ctx.get(enc.o), 0)
yield enc.i.eq(0b0100)
self.assertEqual((yield enc.n), 0)
self.assertEqual((yield enc.o), 2)
ctx.set(enc.i, 0b0100)
self.assertEqual(ctx.get(enc.n), 0)
self.assertEqual(ctx.get(enc.o), 2)
yield enc.i.eq(0b0110)
self.assertEqual((yield enc.n), 1)
self.assertEqual((yield enc.o), 0)
ctx.set(enc.i, 0b0110)
self.assertEqual(ctx.get(enc.n), 1)
self.assertEqual(ctx.get(enc.o), 0)
sim = Simulator(enc)
sim.add_testbench(process)
sim.add_testbench(testbench)
sim.run()
class PriorityEncoderTestCase(FHDLTestCase):
def test_basic(self):
enc = PriorityEncoder(4)
def process():
self.assertEqual((yield enc.n), 1)
self.assertEqual((yield enc.o), 0)
async def testbench(ctx):
self.assertEqual(ctx.get(enc.n), 1)
self.assertEqual(ctx.get(enc.o), 0)
yield enc.i.eq(0b0001)
self.assertEqual((yield enc.n), 0)
self.assertEqual((yield enc.o), 0)
ctx.set(enc.i, 0b0001)
self.assertEqual(ctx.get(enc.n), 0)
self.assertEqual(ctx.get(enc.o), 0)
yield enc.i.eq(0b0100)
self.assertEqual((yield enc.n), 0)
self.assertEqual((yield enc.o), 2)
ctx.set(enc.i, 0b0100)
self.assertEqual(ctx.get(enc.n), 0)
self.assertEqual(ctx.get(enc.o), 2)
yield enc.i.eq(0b0110)
self.assertEqual((yield enc.n), 0)
self.assertEqual((yield enc.o), 1)
ctx.set(enc.i, 0b0110)
self.assertEqual(ctx.get(enc.n), 0)
self.assertEqual(ctx.get(enc.o), 1)
sim = Simulator(enc)
sim.add_testbench(process)
sim.add_testbench(testbench)
sim.run()
class DecoderTestCase(FHDLTestCase):
def test_basic(self):
dec = Decoder(4)
def process():
self.assertEqual((yield dec.o), 0b0001)
async def testbench(ctx):
self.assertEqual(ctx.get(dec.o), 0b0001)
yield dec.i.eq(1)
self.assertEqual((yield dec.o), 0b0010)
ctx.set(dec.i, 1)
self.assertEqual(ctx.get(dec.o), 0b0010)
yield dec.i.eq(3)
self.assertEqual((yield dec.o), 0b1000)
ctx.set(dec.i, 3)
self.assertEqual(ctx.get(dec.o), 0b1000)
yield dec.n.eq(1)
self.assertEqual((yield dec.o), 0b0000)
ctx.set(dec.n, 1)
self.assertEqual(ctx.get(dec.o), 0b0000)
sim = Simulator(dec)
sim.add_testbench(process)
sim.add_testbench(testbench)
sim.run()

View file

@ -241,18 +241,18 @@ class CRCTestCase(unittest.TestCase):
crc = getattr(catalog, name)(data_width=8).create()
check = CRC_CHECKS[name][0]
def process():
async def testbench(ctx):
for word in b"123456789":
yield crc.start.eq(word == b"1")
yield crc.data.eq(word)
yield crc.valid.eq(1)
yield Tick()
yield crc.valid.eq(0)
yield Tick()
assert (yield crc.crc) == check
ctx.set(crc.start, word == b"1")
ctx.set(crc.data, word)
ctx.set(crc.valid, 1)
await ctx.tick()
ctx.set(crc.valid, 0)
await ctx.tick()
assert ctx.get(crc.crc) == check
sim = Simulator(crc)
sim.add_testbench(process)
sim.add_testbench(testbench)
sim.add_clock(1e-6)
sim.run()
@ -287,20 +287,20 @@ class CRCTestCase(unittest.TestCase):
d = [bits[i : i+m] for i in range(0, len(bits), m)]
words = [int(x, 2) for x in d]
def process():
yield crc.start.eq(1)
yield Tick()
yield crc.start.eq(0)
async def testbench(ctx):
ctx.set(crc.start, 1)
await ctx.tick()
ctx.set(crc.start, 0)
for word in words:
yield crc.data.eq(word)
yield crc.valid.eq(1)
yield Tick()
yield crc.valid.eq(0)
yield Tick()
assert (yield crc.crc) == check
ctx.set(crc.data, word)
ctx.set(crc.valid, 1)
await ctx.tick()
ctx.set(crc.valid, 0)
await ctx.tick()
assert ctx.get(crc.crc) == check
sim = Simulator(crc)
sim.add_testbench(process)
sim.add_testbench(testbench)
sim.add_clock(1e-6)
sim.run()
@ -344,20 +344,20 @@ class CRCTestCase(unittest.TestCase):
words += [int(x) for x in f"{byte:08b}"]
words = words[:72 + n]
def process():
yield crc.start.eq(1)
yield Tick()
yield crc.start.eq(0)
async def testbench(ctx):
ctx.set(crc.start, 1)
await ctx.tick()
ctx.set(crc.start, 0)
for word in words:
yield crc.data.eq(word)
yield crc.valid.eq(1)
yield Tick()
yield crc.valid.eq(0)
yield Tick()
assert (yield crc.match_detected)
ctx.set(crc.data, word)
ctx.set(crc.valid, 1)
await ctx.tick()
ctx.set(crc.valid, 0)
await ctx.tick()
assert ctx.get(crc.match_detected)
sim = Simulator(crc)
sim.add_testbench(process)
sim.add_testbench(testbench)
sim.add_clock(1e-6)
sim.run()

View file

@ -1277,8 +1277,8 @@ class RFCExamplesTestCase(TestCase):
]
@self.simulate(m1)
def check_m1():
self.assertEqual((yield flt_a.as_value()), 0xbf800000)
async def check_m1(ctx):
self.assertEqual(ctx.get(flt_a.as_value()), 0xbf800000)
class FloatOrInt32(data.Union):
float: Float32
@ -1293,8 +1293,8 @@ class RFCExamplesTestCase(TestCase):
]
@self.simulate(m2)
def check_m2():
self.assertEqual((yield is_gt_1), 1)
async def check_m2(ctx):
self.assertEqual(ctx.get(is_gt_1), 1)
class Op(Enum):
ADD = 0
@ -1317,8 +1317,8 @@ class RFCExamplesTestCase(TestCase):
]
@self.simulate(m3)
def check_m3():
self.assertEqual((yield adder_op.as_value()), 0x7c40000000000001)
async def check_m3(ctx):
self.assertEqual(ctx.get(adder_op.as_value()), 0x7c40000000000001)
def test_rfc_example_2(self):
class Kind(Enum):
@ -1346,8 +1346,8 @@ class RFCExamplesTestCase(TestCase):
]
@self.simulate(m1)
def check_m1():
self.assertEqual((yield view1.as_value()), 0b011)
async def check_m1(ctx):
self.assertEqual(ctx.get(view1.as_value()), 0b011)
class SomeVariant(data.Struct):
class Value(data.Union):
@ -1371,8 +1371,8 @@ class RFCExamplesTestCase(TestCase):
]
@self.simulate(m2)
def check_m2():
self.assertEqual((yield view2.as_value()), 0b010)
async def check_m2(ctx):
self.assertEqual(ctx.get(view2.as_value()), 0b010)
layout2 = data.StructLayout({
"ready": unsigned(1),

View file

@ -325,47 +325,47 @@ class AsyncFIFOSimCase(FHDLTestCase):
ff_syncronizer_latency = 2
def testbench():
async def testbench(ctx):
for i in range(10):
yield fifo.w_data.eq(i)
yield fifo.w_en.eq(1)
yield Tick()
ctx.set(fifo.w_data, i)
ctx.set(fifo.w_en, 1)
_, _, r_level = await ctx.tick().sample(fifo.r_level)
if (i - ff_syncronizer_latency) > 0:
self.assertEqual((yield fifo.r_level), i - ff_syncronizer_latency)
self.assertEqual(r_level, i - ff_syncronizer_latency)
else:
self.assertEqual((yield fifo.r_level), 0)
self.assertEqual(r_level, 0)
simulator = Simulator(fifo)
simulator.add_clock(100e-6)
simulator.add_process(testbench)
simulator.add_testbench(testbench)
simulator.run()
def check_async_fifo_level(self, fifo, fill_in, expected_level, read=False):
write_done = Signal()
def write_process():
async def testbench_write(ctx):
for i in range(fill_in):
yield fifo.w_data.eq(i)
yield fifo.w_en.eq(1)
yield Tick("write")
yield fifo.w_en.eq(0)
yield Tick ("write")
self.assertEqual((yield fifo.w_level), expected_level)
yield write_done.eq(1)
ctx.set(fifo.w_data, i)
ctx.set(fifo.w_en, 1)
await ctx.tick("write")
ctx.set(fifo.w_en, 0)
await ctx.tick ("write")
self.assertEqual(ctx.get(fifo.w_level), expected_level)
ctx.set(write_done, 1)
def read_process():
async def testbench_read(ctx):
if read:
yield fifo.r_en.eq(1)
while not (yield write_done):
yield Tick("read")
self.assertEqual((yield fifo.r_level), expected_level)
ctx.set(fifo.r_en, 1)
while not ctx.get(write_done):
await ctx.tick("read")
self.assertEqual(ctx.get(fifo.r_level), expected_level)
simulator = Simulator(fifo)
simulator.add_clock(100e-6, domain="write")
simulator.add_testbench(write_process)
simulator.add_testbench(testbench_write)
simulator.add_clock(50e-6, domain="read")
simulator.add_testbench(read_process)
simulator.add_testbench(testbench_read)
with simulator.write_vcd("test.vcd"):
simulator.run()

View file

@ -511,7 +511,8 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
yield Delay(1e-6)
yield self.sync.clk.eq(0)
self.assertEqual((yield self.count), 0)
sim.add_process(process)
with _ignore_deprecated():
sim.add_process(process)
def test_counter_clock_and_sync_process(self):
self.setUp_counter()
@ -534,17 +535,17 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
sim = Simulator(self.m)
sim.add_clock(1e-6)
times = 0
def process():
async def testbench(ctx):
nonlocal times
yield Tick()
self.assertEqual((yield self.count), 4)
yield Tick()
self.assertEqual((yield self.count), 5)
yield Tick()
self.assertEqual((yield self.count), 6)
yield Tick()
await ctx.tick()
self.assertEqual(ctx.get(self.count), 5)
await ctx.tick()
self.assertEqual(ctx.get(self.count), 6)
await ctx.tick()
self.assertEqual(ctx.get(self.count), 7)
await ctx.tick()
times += 1
sim.add_process(process)
sim.add_testbench(testbench)
sim.run()
sim.reset()
sim.run()
@ -590,13 +591,14 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
yield Tick()
yield Tick()
self.assertEqual((yield self.o), 0)
sim.add_process(process)
with _ignore_deprecated():
sim.add_process(process)
def test_alu_bench(self):
self.setUp_alu()
with self.assertSimulation(self.m) as sim:
sim.add_clock(1e-6)
async def process(ctx):
async def testbench(ctx):
ctx.set(self.a, 5)
ctx.set(self.b, 1)
self.assertEqual(ctx.get(self.x), 4)
@ -608,7 +610,7 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
ctx.set(self.s, 2)
await ctx.tick()
self.assertEqual(ctx.get(self.o), 0)
sim.add_testbench(process)
sim.add_testbench(testbench)
def setUp_clock_phase(self):
self.m = Module()
@ -683,12 +685,12 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
def test_complex_lhs_rhs(self):
self.setUp_lhs_rhs()
with self.assertSimulation(self.m) as sim:
def process():
yield self.i.eq(0b10101010)
yield self.i[:4].eq(-1)
self.assertEqual((yield self.i[:4]), 0b1111)
self.assertEqual((yield self.i), 0b10101111)
sim.add_testbench(process)
async def testbench(ctx):
ctx.set(self.i, 0b10101010)
ctx.set(self.i[:4], -1)
self.assertEqual(ctx.get(self.i[:4]), 0b1111)
self.assertEqual(ctx.get(self.i), 0b10101111)
sim.add_testbench(testbench)
def test_run_until(self):
m = Module()
@ -778,7 +780,8 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
r"Received unsupported command 1 from process .+?"):
yield 1
survived = True
sim.add_process(process)
with _ignore_deprecated():
sim.add_process(process)
self.assertTrue(survived)
def test_sync_command_wrong(self):
@ -821,7 +824,8 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
r"Command \(settle\) is not allowed in testbenches"):
yield settle
survived = True
sim.add_testbench(process)
with _ignore_deprecated():
sim.add_testbench(process)
self.assertTrue(survived)
def setUp_memory(self, rd_synchronous=True, rd_transparent=False, wr_granularity=None):
@ -834,7 +838,7 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
def test_memory_init(self):
self.setUp_memory()
with self.assertSimulation(self.m) as sim:
async def process(ctx):
async def testbench(ctx):
ctx.set(self.rdport.addr, 1)
await ctx.tick()
self.assertEqual(ctx.get(self.rdport.data), 0x55)
@ -842,107 +846,107 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
await ctx.tick()
self.assertEqual(ctx.get(self.rdport.data), 0x00)
sim.add_clock(1e-6)
sim.add_testbench(process)
sim.add_testbench(testbench)
def test_memory_write(self):
self.setUp_memory()
with self.assertSimulation(self.m) as sim:
def process():
yield self.wrport.addr.eq(4)
yield self.wrport.data.eq(0x33)
yield self.wrport.en.eq(1)
yield Tick()
yield self.wrport.en.eq(0)
yield self.rdport.addr.eq(4)
yield Tick()
self.assertEqual((yield self.rdport.data), 0x33)
async def testbench(ctx):
ctx.set(self.wrport.addr, 4)
ctx.set(self.wrport.data, 0x33)
ctx.set(self.wrport.en, 1)
await ctx.tick()
ctx.set(self.wrport.en, 0)
ctx.set(self.rdport.addr, 4)
await ctx.tick()
self.assertEqual(ctx.get(self.rdport.data), 0x33)
sim.add_clock(1e-6)
sim.add_testbench(process)
sim.add_testbench(testbench)
def test_memory_write_granularity(self):
self.setUp_memory(wr_granularity=4)
with self.assertSimulation(self.m) as sim:
def process():
yield self.wrport.data.eq(0x50)
yield self.wrport.en.eq(0b00)
yield Tick()
yield self.wrport.en.eq(0)
yield Tick()
self.assertEqual((yield self.rdport.data), 0xaa)
yield self.wrport.en.eq(0b10)
yield Tick()
yield self.wrport.en.eq(0)
yield Tick()
self.assertEqual((yield self.rdport.data), 0x5a)
yield self.wrport.data.eq(0x33)
yield self.wrport.en.eq(0b01)
yield Tick()
yield self.wrport.en.eq(0)
yield Tick()
self.assertEqual((yield self.rdport.data), 0x53)
async def testbench(ctx):
ctx.set(self.wrport.data, 0x50)
ctx.set(self.wrport.en, 0b00)
await ctx.tick()
ctx.set(self.wrport.en, 0)
await ctx.tick()
self.assertEqual(ctx.get(self.rdport.data), 0xaa)
ctx.set(self.wrport.en, 0b10)
await ctx.tick()
ctx.set(self.wrport.en, 0)
await ctx.tick()
self.assertEqual(ctx.get(self.rdport.data), 0x5a)
ctx.set(self.wrport.data, 0x33)
ctx.set(self.wrport.en, 0b01)
await ctx.tick()
ctx.set(self.wrport.en, 0)
await ctx.tick()
self.assertEqual(ctx.get(self.rdport.data), 0x53)
sim.add_clock(1e-6)
sim.add_testbench(process)
sim.add_testbench(testbench)
def test_memory_read_before_write(self):
self.setUp_memory(rd_transparent=False)
with self.assertSimulation(self.m) as sim:
def process():
yield self.wrport.data.eq(0x33)
yield self.wrport.en.eq(1)
yield Tick()
self.assertEqual((yield self.rdport.data), 0xaa)
yield Tick()
self.assertEqual((yield self.rdport.data), 0x33)
async def testbench(ctx):
ctx.set(self.wrport.data, 0x33)
ctx.set(self.wrport.en, 1)
await ctx.tick()
self.assertEqual(ctx.get(self.rdport.data), 0xaa)
await ctx.tick()
self.assertEqual(ctx.get(self.rdport.data), 0x33)
sim.add_clock(1e-6)
sim.add_testbench(process)
sim.add_testbench(testbench)
def test_memory_write_through(self):
self.setUp_memory(rd_transparent=True)
with self.assertSimulation(self.m) as sim:
def process():
yield Tick()
yield self.wrport.data.eq(0x33)
yield self.wrport.en.eq(1)
self.assertEqual((yield self.rdport.data), 0xaa)
yield Tick()
self.assertEqual((yield self.rdport.data), 0x33)
yield Tick()
yield self.rdport.addr.eq(1)
self.assertEqual((yield self.rdport.data), 0x33)
async def testbench(ctx):
await ctx.tick()
ctx.set(self.wrport.data, 0x33)
ctx.set(self.wrport.en, 1)
self.assertEqual(ctx.get(self.rdport.data), 0xaa)
await ctx.tick()
self.assertEqual(ctx.get(self.rdport.data), 0x33)
await ctx.tick()
ctx.set(self.rdport.addr, 1)
self.assertEqual(ctx.get(self.rdport.data), 0x33)
sim.add_clock(1e-6)
sim.add_testbench(process)
sim.add_testbench(testbench)
def test_memory_async_read_write(self):
self.setUp_memory(rd_synchronous=False)
with self.assertSimulation(self.m) as sim:
def process():
yield self.rdport.addr.eq(0)
self.assertEqual((yield self.rdport.data), 0xaa)
yield self.rdport.addr.eq(1)
self.assertEqual((yield self.rdport.data), 0x55)
yield self.rdport.addr.eq(0)
yield self.wrport.addr.eq(0)
yield self.wrport.data.eq(0x33)
yield self.wrport.en.eq(1)
self.assertEqual((yield self.rdport.data), 0xaa)
yield Tick("sync")
self.assertEqual((yield self.rdport.data), 0x33)
async def testbench(ctx):
ctx.set(self.rdport.addr, 0)
self.assertEqual(ctx.get(self.rdport.data), 0xaa)
ctx.set(self.rdport.addr, 1)
self.assertEqual(ctx.get(self.rdport.data), 0x55)
ctx.set(self.rdport.addr, 0)
ctx.set(self.wrport.addr, 0)
ctx.set(self.wrport.data, 0x33)
ctx.set(self.wrport.en, 1)
self.assertEqual(ctx.get(self.rdport.data), 0xaa)
await ctx.tick("sync")
self.assertEqual(ctx.get(self.rdport.data), 0x33)
sim.add_clock(1e-6)
sim.add_testbench(process)
sim.add_testbench(testbench)
def test_memory_read_only(self):
self.m = Module()
self.m.submodules.memory = self.memory = Memory(shape=8, depth=4, init=[0xaa, 0x55])
self.rdport = self.memory.read_port()
with self.assertSimulation(self.m) as sim:
def process():
yield Tick()
self.assertEqual((yield self.rdport.data), 0xaa)
yield self.rdport.addr.eq(1)
yield Tick()
self.assertEqual((yield self.rdport.data), 0x55)
async def testbench(ctx):
await ctx.tick()
self.assertEqual(ctx.get(self.rdport.data), 0xaa)
ctx.set(self.rdport.addr, 1)
await ctx.tick()
self.assertEqual(ctx.get(self.rdport.data), 0x55)
sim.add_clock(1e-6)
sim.add_testbench(process)
sim.add_testbench(testbench)
def test_comb_bench_process(self):
m = Module()
@ -950,13 +954,13 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
b = Signal()
m.d.comb += b.eq(a)
with self.assertSimulation(m) as sim:
def process():
self.assertEqual((yield a), 1)
self.assertEqual((yield b), 1)
yield a.eq(0)
self.assertEqual((yield a), 0)
self.assertEqual((yield b), 0)
sim.add_testbench(process)
async def testbench(ctx):
self.assertEqual(ctx.get(a), 1)
self.assertEqual(ctx.get(b), 1)
ctx.set(a, 0)
self.assertEqual(ctx.get(a), 0)
self.assertEqual(ctx.get(b), 0)
sim.add_testbench(testbench)
def test_sync_bench_process(self):
m = Module()
@ -966,26 +970,26 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
t = Signal()
m.d.sync += t.eq(~t)
with self.assertSimulation(m) as sim:
def process():
self.assertEqual((yield a), 1)
self.assertEqual((yield b), 0)
self.assertEqual((yield t), 0)
yield Tick()
self.assertEqual((yield a), 1)
self.assertEqual((yield b), 1)
self.assertEqual((yield t), 1)
yield Tick()
self.assertEqual((yield a), 1)
self.assertEqual((yield b), 1)
self.assertEqual((yield t), 0)
yield a.eq(0)
self.assertEqual((yield a), 0)
self.assertEqual((yield b), 1)
yield Tick()
self.assertEqual((yield a), 0)
self.assertEqual((yield b), 0)
async def testbench(ctx):
self.assertEqual(ctx.get(a), 1)
self.assertEqual(ctx.get(b), 0)
self.assertEqual(ctx.get(t), 0)
await ctx.tick()
self.assertEqual(ctx.get(a), 1)
self.assertEqual(ctx.get(b), 1)
self.assertEqual(ctx.get(t), 1)
await ctx.tick()
self.assertEqual(ctx.get(a), 1)
self.assertEqual(ctx.get(b), 1)
self.assertEqual(ctx.get(t), 0)
ctx.set(a, 0)
self.assertEqual(ctx.get(a), 0)
self.assertEqual(ctx.get(b), 1)
await ctx.tick()
self.assertEqual(ctx.get(a), 0)
self.assertEqual(ctx.get(b), 0)
sim.add_clock(1e-6)
sim.add_testbench(process)
sim.add_testbench(testbench)
def test_memory_transparency_simple(self):
m = Module()
@ -994,37 +998,37 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
wrport = memory.write_port(granularity=8)
rdport = memory.read_port(transparent_for=[wrport])
with self.assertSimulation(m) as sim:
def process():
yield rdport.addr.eq(0)
yield Tick()
self.assertEqual((yield rdport.data), 0x11)
yield rdport.addr.eq(1)
yield Tick()
self.assertEqual((yield rdport.data), 0x22)
yield wrport.addr.eq(0)
yield wrport.data.eq(0x44444444)
yield wrport.en.eq(1)
yield Tick()
self.assertEqual((yield rdport.data), 0x22)
yield wrport.addr.eq(1)
yield wrport.data.eq(0x55)
yield wrport.en.eq(1)
yield Tick()
self.assertEqual((yield rdport.data), 0x55)
yield wrport.addr.eq(1)
yield wrport.data.eq(0x66)
yield wrport.en.eq(1)
yield rdport.en.eq(0)
yield Tick()
self.assertEqual((yield rdport.data), 0x55)
yield wrport.addr.eq(2)
yield wrport.data.eq(0x77)
yield wrport.en.eq(1)
yield rdport.en.eq(1)
yield Tick()
self.assertEqual((yield rdport.data), 0x66)
async def testbench(ctx):
ctx.set(rdport.addr, 0)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x11)
ctx.set(rdport.addr, 1)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x22)
ctx.set(wrport.addr, 0)
ctx.set(wrport.data, 0x44444444)
ctx.set(wrport.en, 1)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x22)
ctx.set(wrport.addr, 1)
ctx.set(wrport.data, 0x55)
ctx.set(wrport.en, 1)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x55)
ctx.set(wrport.addr, 1)
ctx.set(wrport.data, 0x66)
ctx.set(wrport.en, 1)
ctx.set(rdport.en, 0)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x55)
ctx.set(wrport.addr, 2)
ctx.set(wrport.data, 0x77)
ctx.set(wrport.en, 1)
ctx.set(rdport.en, 1)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x66)
sim.add_clock(1e-6)
sim.add_testbench(process)
sim.add_testbench(testbench)
def test_memory_transparency_multibit(self):
m = Module()
@ -1033,58 +1037,58 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
wrport = memory.write_port(granularity=8)
rdport = memory.read_port(transparent_for=[wrport])
with self.assertSimulation(m) as sim:
def process():
yield rdport.addr.eq(0)
yield Tick()
self.assertEqual((yield rdport.data), 0x11111111)
yield rdport.addr.eq(1)
yield Tick()
self.assertEqual((yield rdport.data), 0x22222222)
yield wrport.addr.eq(0)
yield wrport.data.eq(0x44444444)
yield wrport.en.eq(1)
yield Tick()
self.assertEqual((yield rdport.data), 0x22222222)
yield wrport.addr.eq(1)
yield wrport.data.eq(0x55555555)
yield wrport.en.eq(1)
yield Tick()
self.assertEqual((yield rdport.data), 0x22222255)
yield wrport.addr.eq(1)
yield wrport.data.eq(0x66666666)
yield wrport.en.eq(2)
yield rdport.en.eq(0)
yield Tick()
self.assertEqual((yield rdport.data), 0x22222255)
yield wrport.addr.eq(1)
yield wrport.data.eq(0x77777777)
yield wrport.en.eq(4)
yield rdport.en.eq(1)
yield Tick()
self.assertEqual((yield rdport.data), 0x22776655)
async def testbench(ctx):
ctx.set(rdport.addr, 0)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x11111111)
ctx.set(rdport.addr, 1)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x22222222)
ctx.set(wrport.addr, 0)
ctx.set(wrport.data, 0x44444444)
ctx.set(wrport.en, 1)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x22222222)
ctx.set(wrport.addr, 1)
ctx.set(wrport.data, 0x55555555)
ctx.set(wrport.en, 1)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x22222255)
ctx.set(wrport.addr, 1)
ctx.set(wrport.data, 0x66666666)
ctx.set(wrport.en, 2)
ctx.set(rdport.en, 0)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x22222255)
ctx.set(wrport.addr, 1)
ctx.set(wrport.data, 0x77777777)
ctx.set(wrport.en, 4)
ctx.set(rdport.en, 1)
await ctx.tick()
self.assertEqual(ctx.get(rdport.data), 0x22776655)
sim.add_clock(1e-6)
sim.add_testbench(process)
sim.add_testbench(testbench)
def test_memory_access(self):
self.setUp_memory()
with self.assertSimulation(self.m) as sim:
def process():
self.assertEqual((yield self.memory.data[1]), 0x55)
self.assertEqual((yield self.memory.data[1]), 0x55)
self.assertEqual((yield self.memory.data[2]), 0x00)
yield self.memory.data[1].eq(Const(0x33))
self.assertEqual((yield self.memory.data[1]), 0x33)
yield self.memory.data[1][2:5].eq(Const(0x7))
self.assertEqual((yield self.memory.data[1]), 0x3f)
yield self.wrport.addr.eq(3)
yield self.wrport.data.eq(0x22)
yield self.wrport.en.eq(1)
self.assertEqual((yield self.memory.data[3]), 0)
yield Tick()
self.assertEqual((yield self.memory.data[3]), 0x22)
async def testbench(ctx):
self.assertEqual(ctx.get(self.memory.data[1]), 0x55)
self.assertEqual(ctx.get(self.memory.data[1]), 0x55)
self.assertEqual(ctx.get(self.memory.data[2]), 0x00)
ctx.set(self.memory.data[1], Const(0x33))
self.assertEqual(ctx.get(self.memory.data[1]), 0x33)
ctx.set(self.memory.data[1][2:5], Const(0x7))
self.assertEqual(ctx.get(self.memory.data[1]), 0x3f)
ctx.set(self.wrport.addr, 3)
ctx.set(self.wrport.data, 0x22)
ctx.set(self.wrport.en, 1)
self.assertEqual(ctx.get(self.memory.data[3]), 0)
await ctx.tick()
self.assertEqual(ctx.get(self.memory.data[3]), 0x22)
sim.add_clock(1e-6)
sim.add_testbench(process)
sim.add_testbench(testbench)
def test_memory_access_sync(self):
self.setUp_memory()
@ -1099,7 +1103,8 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
self.assertEqual((yield self.memory.data[1]), 0x33)
sim.add_clock(1e-6)
sim.add_process(process)
with _ignore_deprecated():
sim.add_process(process)
def test_vcd_wrong_nonzero_time(self):
s = Signal()
@ -1159,9 +1164,9 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
with m.Case(""):
m.d.comb += o.eq(1)
with self.assertSimulation(m) as sim:
def process():
self.assertEqual((yield o), 1)
sim.add_testbench(process)
async def testbench(ctx):
self.assertEqual(ctx.get(o), 1)
sim.add_testbench(testbench)
def test_print(self):
m = Module()
@ -1173,9 +1178,9 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
with redirect_stdout(output):
with self.assertSimulation(m) as sim:
sim.add_clock(1e-6, domain="sync")
def process():
yield Delay(1e-5)
sim.add_testbench(process)
async def testbench(ctx):
await ctx.delay(1e-5)
sim.add_testbench(testbench)
self.assertEqual(output.getvalue(), dedent("""\
Counter: 000
Counter: 003
@ -1204,9 +1209,9 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
with redirect_stdout(output):
with self.assertSimulation(m) as sim:
sim.add_clock(1e-6, domain="sync")
def process():
yield Delay(1e-5)
sim.add_testbench(process)
async def testbench(ctx):
await ctx.delay(1e-5)
sim.add_testbench(testbench)
self.assertEqual(output.getvalue(), dedent("""\
Counter: zero
Counter: non-zero
@ -1232,12 +1237,9 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
with redirect_stdout(output):
with self.assertSimulation(m) as sim:
sim.add_clock(1e-6, domain="sync")
def process():
yield Tick()
yield Tick()
yield Tick()
yield Tick()
sim.add_testbench(process)
async def testbench(ctx):
await ctx.tick().repeat(4)
sim.add_testbench(testbench)
self.assertEqual(output.getvalue(), dedent("""\
A
B
@ -1255,9 +1257,9 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
r"^Assertion violated: Counter too large: 4$"):
with self.assertSimulation(m) as sim:
sim.add_clock(1e-6, domain="sync")
def process():
yield Delay(1e-5)
sim.add_testbench(process)
async def testbench(ctx):
await ctx.delay(1e-5)
sim.add_testbench(testbench)
def test_assume(self):
m = Module()
@ -1268,9 +1270,9 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
r"^Assumption violated$"):
with self.assertSimulation(m) as sim:
sim.add_clock(1e-6, domain="sync")
def process():
yield Delay(1e-5)
sim.add_testbench(process)
async def testbench(ctx):
await ctx.delay(1e-5)
sim.add_testbench(testbench)
def test_cover(self):
m = Module()
@ -1283,9 +1285,9 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
with redirect_stdout(output):
with self.assertSimulation(m) as sim:
sim.add_clock(1e-6, domain="sync")
def process():
yield Delay(1e-5)
sim.add_testbench(process)
async def testbench(ctx):
await ctx.delay(1e-5)
sim.add_testbench(testbench)
self.assertRegex(output.getvalue(), dedent(r"""
Coverage hit at .*test_sim\.py:\d+: Counter: 000
Coverage hit at .*test_sim\.py:\d+: Counter: 003
@ -1305,17 +1307,9 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
assert val in (0, 0b01011010), f"{val=:#010b}"
yield Delay(0)
sim = Simulator(Module())
sim.add_testbench(testbench_1)
sim.add_testbench(testbench_2)
with sim.write_vcd("test.vcd", fs_per_delta=1):
sim.run()
def test_process_name_collision(self):
def testbench():
yield Passive()
sim = Simulator(Module())
sim.add_testbench(testbench)
sim.add_testbench(testbench)
with _ignore_deprecated():
sim.add_testbench(testbench_1)
sim.add_testbench(testbench_2)
with sim.write_vcd("test.vcd", fs_per_delta=1):
sim.run()
@ -1331,23 +1325,23 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
sig4 = Signal(data.ArrayLayout(2, 4))
sig5 = Signal(32, init=0x44434241)
def testbench():
async def testbench(ctx):
state = sim._engine._state
yield sig.eq(123)
ctx.set(sig, 123)
self.assertEqual(eval_format(state, sig._format), "123")
self.assertEqual(eval_format(state, Format("{:#04x}", sig)), "0x7b")
self.assertEqual(eval_format(state, Format("sig={}", sig)), "sig=123")
self.assertEqual(eval_format(state, sig2.as_value()._format), "A")
yield sig2.eq(1)
ctx.set(sig2, 1)
self.assertEqual(eval_format(state, sig2.as_value()._format), "B")
yield sig2.eq(3)
ctx.set(sig2.as_value(), 3)
self.assertEqual(eval_format(state, sig2.as_value()._format), "[unknown]")
yield sig3.eq(0xc)
ctx.set(sig3, {"a": -4, "b": 1})
self.assertEqual(eval_format(state, sig3.as_value()._format), "{a=-4, b=1}")
yield sig4.eq(0x1e)
ctx.set(sig4, [2, 3, 1, 0])
self.assertEqual(eval_format(state, sig4.as_value()._format), "[2, 3, 1, 0]")
self.assertEqual(eval_format(state, Format("{:s}", sig5)), "ABCD")
@ -1362,12 +1356,12 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
sig = Signal(2, decoder=decoder)
def testbench():
yield Delay(1e-6)
yield sig.eq(1)
yield Delay(1e-6)
yield sig.eq(2)
yield Delay(1e-6)
async def testbench(ctx):
await ctx.delay(1e-6)
ctx.set(sig, 1)
await ctx.delay(1e-6)
ctx.set(sig, 2)
await ctx.delay(1e-6)
with self.assertSimulation(Module(), traces=[sig]) as sim:
sim.add_testbench(testbench)
@ -1382,12 +1376,12 @@ class SimulatorIntegrationTestCase(FHDLTestCase):
mem2 = MemoryData(shape=MyEnum, depth=4, init=[MyEnum.A, MyEnum.B, MyEnum.C])
mem3 = MemoryData(shape=data.StructLayout({"a": signed(3), "b": 2}), depth=4, init=[{"a": 2, "b": 1}])
def testbench():
yield Delay(1e-6)
yield mem1[0].eq(4)
yield mem2[3].eq(MyEnum.C)
yield mem3[2].eq(mem3._shape.const({"a": -1, "b": 2}))
yield Delay(1e-6)
async def testbench(ctx):
await ctx.delay(1e-6)
ctx.set(mem1[0], 4)
ctx.set(mem2[3], MyEnum.C)
ctx.set(mem3[2], {"a": -1, "b": 2})
await ctx.delay(1e-6)
with self.assertSimulation(Module(), traces=[mem1, mem2, mem3]) as sim:
sim.add_testbench(testbench)
@ -1397,11 +1391,11 @@ class SimulatorTracesTestCase(FHDLTestCase):
def assertDef(self, traces, flat_traces):
frag = Fragment()
def process():
yield Delay(1e-6)
async def testbench(ctx):
await ctx.delay(1e-6)
sim = Simulator(frag)
sim.add_testbench(process)
sim.add_testbench(testbench)
with sim.write_vcd("test.vcd", "test.gtkw", traces=traces):
sim.run()
@ -1444,9 +1438,9 @@ class SimulatorRegressionTestCase(FHDLTestCase):
def test_bug_473(self):
sim = Simulator(Module())
def process():
self.assertEqual((yield -(Const(0b11, 2).as_signed())), 1)
sim.add_testbench(process)
async def testbench(ctx):
self.assertEqual(ctx.get(-(Const(0b11, 2).as_signed())), 1)
sim.add_testbench(testbench)
sim.run()
def test_bug_595(self):
@ -1484,11 +1478,11 @@ class SimulatorRegressionTestCase(FHDLTestCase):
def test_bug_826(self):
sim = Simulator(Module())
def process():
self.assertEqual((yield C(0b0000, 4) | ~C(1, 1)), 0b0000)
self.assertEqual((yield C(0b1111, 4) & ~C(1, 1)), 0b0000)
self.assertEqual((yield C(0b1111, 4) ^ ~C(1, 1)), 0b1111)
sim.add_testbench(process)
async def testbench(ctx):
self.assertEqual(ctx.get(C(0b0000, 4) | ~C(1, 1)), 0b0000)
self.assertEqual(ctx.get(C(0b1111, 4) & ~C(1, 1)), 0b0000)
self.assertEqual(ctx.get(C(0b1111, 4) ^ ~C(1, 1)), 0b1111)
sim.add_testbench(testbench)
sim.run()
def test_comb_assign(self):
@ -1496,10 +1490,10 @@ class SimulatorRegressionTestCase(FHDLTestCase):
m = Module()
m.d.comb += c.eq(1)
sim = Simulator(m)
def testbench():
async def testbench(ctx):
with self.assertRaisesRegex(DriverConflict,
r"^Combinationally driven signals cannot be overriden by testbenches$"):
yield c.eq(0)
ctx.set(c, 0)
sim.add_testbench(testbench)
sim.run()