Untitled

Pasted by zyp on Wed Apr 9 19:49:53 2025 UTC as Python
from sim_client import SimBusClient

from amaranth import Module, Signal

from amaranth.sim import Simulator, SimulatorContext

from amaranth_ila.ila import ILACapture, ILAControl
from amaranth_ila.client import csr

def test_ila_capture():
    m = Module()

    cnt = Signal(8)
    m.d.sync += cnt.eq(cnt + 1)

    m.submodules.capture = capture = ILACapture(width = 8, depth = 64)
    m.submodules.control = control = ILAControl(capture)

    m.d.comb += [
        capture.inputs.eq(cnt),
        capture.trigger.eq(cnt == 18),
        capture.pre_trigger.eq(4),
    ]

    sim = Simulator(m)
    sim.add_clock(1e-6)

    @sim.add_testbench
    async def testbench(ctx: SimulatorContext):
        client = csr.Client(control.metadata.as_json()['interface']['members']['bus']['annotations'], bus_client = SimBusClient(ctx, control.bus))

        # Start the capture.
        await client.cmd.write(1)

        # Wait for the capture to finish.
        while await client.status.read() != 3:
            pass

        # Read the captured data.
        data = [await client.data.read() for _ in range(64)]

        # Confirm all data is drained.
        await ctx.tick()
        assert ctx.get(capture.output.valid) == 0

        assert data == list(range(18 - 4, 18 - 4 + 64))

    @sim.add_process
    async def timeout(ctx: SimulatorContext):
        await ctx.tick().repeat(10_000)
        raise TimeoutError('Simulation timed out')

    with sim.write_vcd('test.vcd'):
        sim.run()