manta/test/test_logic_analyzer_sim.py

101 lines
2.7 KiB
Python
Raw Normal View History

2023-12-28 23:22:29 +01:00
from amaranth.sim import Simulator
2024-01-06 01:50:25 +01:00
from manta.logic_analyzer import LogicAnalyzerCore
2024-02-19 00:50:51 +01:00
from manta.logic_analyzer.trigger_block import Operations
2023-12-28 23:22:29 +01:00
from manta.utils import *
from random import sample
config = {
"type": "logic_analyzer",
"sample_depth": 1024,
"trigger_location": 512,
2023-12-28 23:22:29 +01:00
"probes": {"larry": 1, "curly": 3, "moe": 9},
"triggers": ["moe RISING"],
}
la = LogicAnalyzerCore(config, base_addr=0, interface=None)
2024-01-06 01:50:25 +01:00
2023-12-28 23:22:29 +01:00
def print_data_at_addr(addr):
# place read transaction on the bus
2024-01-08 07:35:15 +01:00
yield la.bus_i.addr.eq(addr)
yield la.bus_i.data.eq(0)
yield la.bus_i.rw.eq(0)
yield la.bus_i.valid.eq(1)
2023-12-28 23:22:29 +01:00
yield
2024-01-08 07:35:15 +01:00
yield la.bus_i.addr.eq(0)
yield la.bus_i.valid.eq(0)
2023-12-28 23:22:29 +01:00
# wait for output to be valid
2024-01-08 07:35:15 +01:00
while not (yield la.bus_o.valid):
2023-12-28 23:22:29 +01:00
yield
2024-01-08 07:35:15 +01:00
print(f"addr: {hex(addr)} data: {hex((yield la.bus_o.data))}")
2023-12-28 23:22:29 +01:00
2024-01-06 01:50:25 +01:00
def set_fsm_register(name, data):
2024-02-19 20:42:28 +01:00
addr = la._fsm.registers._memory_map[name]["addrs"][0]
strobe_addr = la._fsm.registers._base_addr
2024-01-06 01:50:25 +01:00
yield from write_register(la, strobe_addr, 0)
2024-01-06 01:50:25 +01:00
yield from write_register(la, addr, data)
yield from write_register(la, strobe_addr, 1)
yield from write_register(la, strobe_addr, 0)
2024-01-06 01:50:25 +01:00
def set_trig_blk_register(name, data):
2024-02-19 20:42:28 +01:00
addr = la._trig_blk.registers._memory_map[name]["addrs"][0]
strobe_addr = la._trig_blk.registers._base_addr
2023-12-28 23:22:29 +01:00
yield from write_register(la, strobe_addr, 0)
2023-12-28 23:22:29 +01:00
yield from write_register(la, addr, data)
yield from write_register(la, strobe_addr, 1)
yield from write_register(la, strobe_addr, 0)
2023-12-28 23:22:29 +01:00
2024-01-06 01:50:25 +01:00
def set_probe(name, value):
probe = None
2024-02-19 20:42:28 +01:00
for p in la._probes:
2024-01-06 01:50:25 +01:00
if p.name == name:
probe = p
yield probe.eq(value)
2023-12-28 23:22:29 +01:00
2024-03-03 11:14:12 +01:00
@simulate(la)
def test_single_shot_capture():
2024-03-03 11:14:12 +01:00
# # ok nice what happens if we try to run the core, which includes:
yield from set_fsm_register("request_stop", 1)
yield from set_fsm_register("request_stop", 0)
2023-12-28 23:22:29 +01:00
2024-03-03 11:14:12 +01:00
# setting triggers
yield from set_trig_blk_register("curly_op", Operations.EQ)
yield from set_trig_blk_register("curly_arg", 4)
2023-12-28 23:22:29 +01:00
2024-03-03 11:14:12 +01:00
# setting trigger mode
yield from set_fsm_register("trigger_mode", 0)
2023-12-28 23:22:29 +01:00
2024-03-03 11:14:12 +01:00
# setting trigger location
yield from set_fsm_register("trigger_location", 511)
2023-12-28 23:22:29 +01:00
2024-03-03 11:14:12 +01:00
# starting capture
yield from set_fsm_register("request_start", 1)
yield from set_fsm_register("request_start", 0)
2023-12-28 23:22:29 +01:00
2024-03-03 11:14:12 +01:00
# wait a few hundred clock cycles, see what happens
for _ in range(700):
yield
2023-12-28 23:22:29 +01:00
2024-03-03 11:14:12 +01:00
# provide the trigger condition
yield from set_probe("curly", 4)
2023-12-28 23:22:29 +01:00
2024-03-03 11:14:12 +01:00
for _ in range(700):
yield
2023-12-28 23:22:29 +01:00
2024-03-03 11:14:12 +01:00
# dump sample memory contents
yield from write_register(la, 0, 0)
yield from write_register(la, 0, 1)
yield from write_register(la, 0, 0)
2023-12-28 23:22:29 +01:00
2024-03-03 11:14:12 +01:00
for addr in range(la.get_max_addr()):
yield from print_data_at_addr(addr)