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
|
2023-12-28 23:22:29 +01:00
|
|
|
from manta.utils import *
|
|
|
|
|
from random import sample
|
|
|
|
|
|
|
|
|
|
config = {
|
|
|
|
|
"type": "logic_analyzer",
|
|
|
|
|
"sample_depth": 1024,
|
2024-01-03 21:35:09 +01:00
|
|
|
"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)
|
|
|
|
|
|
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
|
|
|
|
|
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))}")
|
|
|
|
|
|
|
|
|
|
|
2024-01-06 01:50:25 +01:00
|
|
|
def set_fsm_register(name, data):
|
|
|
|
|
addr = la.fsm.r.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 set_trig_blk_register(name, data):
|
|
|
|
|
addr = la.trig_blk.r.mmap[f"{name}_buf"]["addrs"][0]
|
2023-12-28 23:22:29 +01:00
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
|
2024-01-06 01:50:25 +01:00
|
|
|
def set_probe(name, value):
|
|
|
|
|
probe = None
|
|
|
|
|
for p in la.probes:
|
|
|
|
|
if p.name == name:
|
|
|
|
|
probe = p
|
|
|
|
|
|
|
|
|
|
yield p.eq(value)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
|
|
|
|
def test_do_you_fucking_work():
|
|
|
|
|
def testbench():
|
|
|
|
|
# # ok nice what happens if we try to run the core, which includes:
|
2024-01-06 01:50:25 +01:00
|
|
|
yield from set_fsm_register("request_stop", 1)
|
|
|
|
|
yield from set_fsm_register("request_stop", 0)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
|
|
|
|
# setting triggers
|
2024-01-06 01:50:25 +01:00
|
|
|
yield from set_trig_blk_register("curly_op", la.trig_blk.triggers[0].operations["EQ"])
|
|
|
|
|
yield from set_trig_blk_register("curly_arg", 4)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
|
|
|
|
# setting trigger mode
|
2024-01-06 01:50:25 +01:00
|
|
|
yield from set_fsm_register("trigger_mode", 0)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
|
|
|
|
# setting trigger location
|
2024-01-06 01:50:25 +01:00
|
|
|
yield from set_fsm_register("trigger_location", 511)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
|
|
|
|
# starting capture
|
2024-01-06 01:50:25 +01:00
|
|
|
yield from set_fsm_register("request_start", 1)
|
|
|
|
|
yield from set_fsm_register("request_start", 0)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
|
|
|
|
# wait a few hundred clock cycles, see what happens
|
|
|
|
|
for _ in range(700):
|
|
|
|
|
yield
|
|
|
|
|
|
|
|
|
|
# provide the trigger condition
|
2024-01-06 01:50:25 +01:00
|
|
|
yield from set_probe("curly", 4)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
|
|
|
|
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")
|