manta/test/test_logic_analyzer_fsm_sim.py

231 lines
6.0 KiB
Python
Raw Normal View History

from manta.logic_analyzer import *
2024-01-21 00:25:04 +01:00
from manta.utils import *
config = {"sample_depth": 8}
fsm = LogicAnalyzerFSM(config, base_addr=0, interface=None)
2024-03-03 11:14:12 +01:00
@simulate(fsm)
2024-06-20 20:47:34 +02:00
async def test_signals_reset_correctly(ctx):
2024-03-03 11:14:12 +01:00
# Make sure pointers and write enable reset to zero
for sig in [fsm.write_pointer, fsm.read_pointer, fsm.write_enable]:
2024-06-20 20:47:34 +02:00
if ctx.get(sig) != 0:
raise ValueError
2024-03-03 11:14:12 +01:00
# Make sure state resets to IDLE
2024-06-20 20:47:34 +02:00
if ctx.get(fsm.state) != States.IDLE:
2024-03-03 11:14:12 +01:00
raise ValueError
2024-03-03 11:14:12 +01:00
@simulate(fsm)
2024-06-20 20:47:34 +02:00
async def test_single_shot_no_wait_for_trigger(ctx):
2024-03-03 11:14:12 +01:00
# Configure and start FSM
2024-06-20 20:47:34 +02:00
ctx.set(fsm.trigger, 1)
ctx.set(fsm.trigger_mode, TriggerModes.SINGLE_SHOT)
ctx.set(fsm.trigger_location, 4)
ctx.set(fsm.request_start, 1)
2024-01-21 00:25:04 +01:00
2024-03-03 11:14:12 +01:00
# Wait until write_enable is asserted
2024-06-20 20:47:34 +02:00
while not ctx.get(fsm.write_enable):
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Wait 8 clock cycles for capture to complete
for i in range(8):
# Make sure that read_pointer does not increase
2024-06-20 20:47:34 +02:00
if ctx.get(fsm.read_pointer) != 0:
raise ValueError
2024-03-03 11:14:12 +01:00
# Make sure that write_pointer increases by one each cycle
2024-06-20 20:47:34 +02:00
if ctx.get(fsm.write_pointer) != i:
raise ValueError
2024-06-20 20:47:34 +02:00
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Wait one clock cycle (to let BRAM contents cycle in)
2024-06-20 20:47:34 +02:00
await ctx.tick()
2024-01-21 00:25:04 +01:00
2024-03-03 11:14:12 +01:00
# Check that write_pointer points to the end of memory
2024-06-20 20:47:34 +02:00
if ctx.get(fsm.write_pointer) != 7:
2024-03-03 11:14:12 +01:00
raise ValueError
2024-03-03 11:14:12 +01:00
# Check that state is CAPTURED
2024-06-20 20:47:34 +02:00
if ctx.get(fsm.state) != States.CAPTURED:
2024-03-03 11:14:12 +01:00
raise ValueError
2024-03-03 11:14:12 +01:00
@simulate(fsm)
2024-06-20 20:47:34 +02:00
async def test_single_shot_wait_for_trigger(ctx):
2024-03-03 11:14:12 +01:00
# Configure and start FSM
2024-06-20 20:47:34 +02:00
ctx.set(fsm.trigger_mode, TriggerModes.SINGLE_SHOT)
ctx.set(fsm.trigger_location, 4)
ctx.set(fsm.request_start, 1)
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Check that write_enable is asserted a cycle after request_start
2024-06-20 20:47:34 +02:00
if not ctx.get(fsm.write_enable):
2024-03-03 11:14:12 +01:00
raise ValueError
# Wait 4 clock cycles to get to IN_POSITION
for i in range(4):
2024-06-20 20:47:34 +02:00
rp = ctx.get(fsm.read_pointer)
wp = ctx.get(fsm.write_pointer)
2024-03-03 11:14:12 +01:00
# Make sure that read_pointer does not increase
if rp != 0:
raise ValueError
2024-03-03 11:14:12 +01:00
# Make sure that write_pointer increases by one each cycle
if wp != i:
raise ValueError
2024-06-20 20:47:34 +02:00
await ctx.tick()
2024-01-21 00:25:04 +01:00
2024-03-03 11:14:12 +01:00
# Wait a few cycles before triggering
for _ in range(10):
2024-06-20 20:47:34 +02:00
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Provide the trigger, and check that the capture completes 4 cycles later
2024-06-20 20:47:34 +02:00
ctx.set(fsm.trigger, 1)
await ctx.tick()
2024-03-03 11:14:12 +01:00
for i in range(4):
2024-06-20 20:47:34 +02:00
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Wait one clock cycle (to let BRAM contents cycle in)
2024-06-20 20:47:34 +02:00
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Check that write_pointer points to the end of memory
2024-06-20 20:47:34 +02:00
rp = ctx.get(fsm.read_pointer)
wp = ctx.get(fsm.write_pointer)
2024-03-03 11:14:12 +01:00
if (wp + 1) % config["sample_depth"] != rp:
raise ValueError
2024-03-03 11:14:12 +01:00
# Check that state is CAPTURED
2024-06-20 20:47:34 +02:00
if ctx.get(fsm.state) != States.CAPTURED:
2024-03-03 11:14:12 +01:00
raise ValueError
2024-03-03 11:14:12 +01:00
@simulate(fsm)
2024-06-20 20:47:34 +02:00
async def test_immediate(ctx):
2024-03-03 11:14:12 +01:00
# Configure and start FSM
2024-06-20 20:47:34 +02:00
ctx.set(fsm.trigger_mode, TriggerModes.IMMEDIATE)
ctx.set(fsm.request_start, 1)
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Check that write_enable is asserted a cycle after request_start
2024-06-20 20:47:34 +02:00
if not ctx.get(fsm.write_enable):
2024-03-03 11:14:12 +01:00
raise ValueError
2024-03-03 11:14:12 +01:00
for i in range(config["sample_depth"]):
2024-06-20 20:47:34 +02:00
rp = ctx.get(fsm.read_pointer)
wp = ctx.get(fsm.write_pointer)
2024-03-03 11:14:12 +01:00
if rp != 0:
raise ValueError
2024-03-03 11:14:12 +01:00
if wp != i:
raise ValueError
2024-06-20 20:47:34 +02:00
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Wait one clock cycle (to let BRAM contents cycle in)
2024-06-20 20:47:34 +02:00
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Check that write_pointer points to the end of memory
2024-06-20 20:47:34 +02:00
rp = ctx.get(fsm.read_pointer)
wp = ctx.get(fsm.write_pointer)
2024-03-03 11:14:12 +01:00
if rp != 0:
raise ValueError
if wp != 7:
raise ValueError
2024-03-03 11:14:12 +01:00
# Check that state is CAPTURED
2024-06-20 20:47:34 +02:00
if ctx.get(fsm.state) != States.CAPTURED:
2024-03-03 11:14:12 +01:00
raise ValueError
2024-03-03 11:14:12 +01:00
@simulate(fsm)
2024-06-20 20:47:34 +02:00
async def test_incremental(ctx):
2024-03-03 11:14:12 +01:00
# Configure and start FSM
2024-06-20 20:47:34 +02:00
ctx.set(fsm.trigger_mode, TriggerModes.INCREMENTAL)
ctx.set(fsm.request_start, 1)
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Check that write_enable is asserted on the same edge as request_start
2024-06-20 20:47:34 +02:00
if not ctx.get(fsm.write_enable):
2024-03-03 11:14:12 +01:00
raise ValueError
for _ in range(10):
2024-06-20 20:47:34 +02:00
await ctx.tick().repeat(3)
2024-01-21 00:25:04 +01:00
2024-06-20 20:47:34 +02:00
ctx.set(fsm.trigger, 1)
await ctx.tick()
ctx.set(fsm.trigger, 0)
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Check that state is CAPTURED
2024-06-20 20:47:34 +02:00
if ctx.get(fsm.state) != States.CAPTURED:
2024-03-03 11:14:12 +01:00
raise ValueError
2024-01-21 00:25:04 +01:00
2024-06-20 20:47:34 +02:00
# @simulate(fsm)
# async def test_single_shot_write_enable(ctx):
# # Configure FSM
# ctx.set(fsm.trigger_mode, TriggerModes.SINGLE_SHOT)
# ctx.set(fsm.trigger_location, 4)
# await ctx.tick()
2024-03-03 11:14:12 +01:00
2024-06-20 20:47:34 +02:00
# # Make sure write is not enabled before starting the FSM
# if ctx.get(fsm.write_enable):
# raise ValueError
2024-06-20 20:47:34 +02:00
# # Start the FSM, ensure write enable is asserted throughout the capture
# ctx.set(fsm.request_start, 1)
# await ctx.tick()
# await ctx.tick()
2024-03-03 11:14:12 +01:00
2024-06-20 20:47:34 +02:00
# for _ in range(config["sample_depth"]):
# if not ctx.get(fsm.write_enable):
# raise ValueError
2024-01-21 00:25:04 +01:00
2024-06-20 20:47:34 +02:00
# await ctx.tick()
2024-06-20 20:47:34 +02:00
# ctx.set(fsm.trigger, 1)
# await ctx.tick()
2024-01-21 00:25:04 +01:00
2024-06-20 20:47:34 +02:00
# for _ in range(4):
# if not ctx.get(fsm.write_enable):
# raise ValueError
2024-01-21 00:25:04 +01:00
2024-06-20 20:47:34 +02:00
# await ctx.tick()
2024-06-20 20:47:34 +02:00
# # Make sure write_enable is deasserted after
# if ctx.get(fsm.write_enable):
# raise ValueError
2024-03-03 11:14:12 +01:00
@simulate(fsm)
2024-06-20 20:47:34 +02:00
async def test_immediate_write_enable(ctx):
2024-03-03 11:14:12 +01:00
# Configure FSM
2024-06-20 20:47:34 +02:00
ctx.set(fsm.trigger_mode, TriggerModes.IMMEDIATE)
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Make sure write is not enabled before starting the FSM
2024-06-20 20:47:34 +02:00
if ctx.get(fsm.write_enable):
2024-03-03 11:14:12 +01:00
raise ValueError
2024-03-03 11:14:12 +01:00
# Start the FSM, ensure write enable is asserted throughout the capture
2024-06-20 20:47:34 +02:00
ctx.set(fsm.request_start, 1)
await ctx.tick()
2024-03-03 11:14:12 +01:00
for _ in range(config["sample_depth"]):
2024-06-20 20:47:34 +02:00
if not ctx.get(fsm.write_enable):
raise ValueError
2024-06-20 20:47:34 +02:00
await ctx.tick()
2024-03-03 11:14:12 +01:00
# Make sure write_enable is deasserted after
2024-06-20 20:47:34 +02:00
if ctx.get(fsm.write_enable):
2024-03-03 11:14:12 +01:00
raise ValueError