manta/test/test_logic_analyzer_sim.py

83 lines
2.4 KiB
Python
Raw Normal View History

2023-12-28 23:22:29 +01:00
from amaranth.sim import Simulator
from manta.logic_analyzer_core import LogicAnalyzerCore
from manta.utils import *
from random import sample
config = {
"type": "logic_analyzer",
"sample_depth": 1024,
"trigger_loc": 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)
def print_data_at_addr(addr):
# place read transaction on the bus
yield la.addr_i.eq(addr)
yield la.data_i.eq(0)
yield la.rw_i.eq(0)
yield la.valid_i.eq(1)
yield
yield la.addr_i.eq(0)
yield la.valid_i.eq(0)
# wait for output to be valid
while not (yield la.valid_o):
yield
print(f"addr: {hex(addr)} data: {hex((yield la.data_o))}")
def set_logic_analyzer_register(name, data):
addr = la.registers.mmap[f"{name}_buf"]["addrs"][0]
yield from write_register(la, 0, 0)
yield from write_register(la, addr, data)
yield from write_register(la, 0, 1)
yield from write_register(la, 0, 0)
def test_do_you_fucking_work():
def testbench():
# # ok nice what happens if we try to run the core, which includes:
yield from set_logic_analyzer_register("request_stop", 1)
yield from set_logic_analyzer_register("request_stop", 0)
# setting triggers
yield from set_logic_analyzer_register("curly_op", la.operations["EQ"])
yield from set_logic_analyzer_register("curly_arg", 4)
# setting trigger mode
yield from set_logic_analyzer_register(
"trigger_mode", 0
) # right now this is not actually respected...oops
# setting trigger location
yield from set_logic_analyzer_register("trigger_loc", 511)
2023-12-28 23:22:29 +01:00
# starting capture
yield from set_logic_analyzer_register("request_start", 1)
yield from set_logic_analyzer_register("request_start", 0)
# wait a few hundred clock cycles, see what happens
for _ in range(700):
yield
# provide the trigger condition
yield la.probe_signals["curly"]["top_level"].eq(4)
for _ in range(700):
yield
# 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)
for addr in range(la.get_max_addr()):
yield from print_data_at_addr(addr)
simulate(la, testbench, "la_core.vcd")