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,
|
2024-01-08 03:17:09 +01:00
|
|
|
"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
|
|
|
|
2024-06-20 20:47:34 +02:00
|
|
|
async def print_data_at_addr(ctx, addr):
|
2023-12-28 23:22:29 +01:00
|
|
|
# place read transaction on the bus
|
2024-06-20 20:47:34 +02:00
|
|
|
ctx.set(la.bus_i.addr, addr)
|
|
|
|
|
ctx.set(la.bus_i.data, 0)
|
|
|
|
|
ctx.set(la.bus_i.rw, 0)
|
|
|
|
|
ctx.set(la.bus_i.valid, True)
|
|
|
|
|
|
|
|
|
|
await ctx.tick()
|
|
|
|
|
|
|
|
|
|
ctx.set(la.bus_i.addr, 0)
|
|
|
|
|
ctx.set(la.bus_i.valid, 0)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
|
|
|
|
# wait for output to be valid
|
2024-06-20 20:47:34 +02:00
|
|
|
while not ctx.get(la.bus_o.valid):
|
|
|
|
|
await ctx.tick()
|
2023-12-28 23:22:29 +01:00
|
|
|
|
2024-06-20 20:47:34 +02:00
|
|
|
print(f"addr: {hex(addr)} data: {hex(ctx.get(la.bus_o.data))}")
|
2023-12-28 23:22:29 +01:00
|
|
|
|
|
|
|
|
|
2024-06-20 20:47:34 +02:00
|
|
|
async def set_fsm_register(ctx, 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
|
|
|
|
2024-06-20 20:47:34 +02:00
|
|
|
await write_register(la, ctx, strobe_addr, 0)
|
|
|
|
|
await write_register(la, ctx, addr, data)
|
|
|
|
|
await write_register(la, ctx, strobe_addr, 1)
|
|
|
|
|
await write_register(la, ctx, strobe_addr, 0)
|
2024-01-06 06:43:53 +01:00
|
|
|
|
2024-01-06 01:50:25 +01:00
|
|
|
|
2024-06-20 20:47:34 +02:00
|
|
|
async def set_trig_blk_register(ctx, 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
|
|
|
|
2024-06-20 20:47:34 +02:00
|
|
|
await write_register(la, ctx, strobe_addr, 0)
|
|
|
|
|
await write_register(la, ctx, addr, data)
|
|
|
|
|
await write_register(la, ctx, strobe_addr, 1)
|
|
|
|
|
await write_register(la, ctx, strobe_addr, 0)
|
2024-01-06 06:43:53 +01:00
|
|
|
|
2023-12-28 23:22:29 +01:00
|
|
|
|
2024-06-20 20:47:34 +02:00
|
|
|
async def set_probe(ctx, name, value):
|
2024-01-06 01:50:25 +01:00
|
|
|
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
|
|
|
|
|
|
2024-06-20 20:47:34 +02:00
|
|
|
ctx.set(probe, value)
|
2024-01-06 06:43:53 +01:00
|
|
|
|
2023-12-28 23:22:29 +01:00
|
|
|
|
2024-03-03 11:14:12 +01:00
|
|
|
@simulate(la)
|
2024-06-20 20:47:34 +02:00
|
|
|
async def test_single_shot_capture(ctx):
|
|
|
|
|
# request FSM to stop
|
|
|
|
|
await set_fsm_register(ctx, "request_stop", 1)
|
|
|
|
|
await set_fsm_register(ctx, "request_stop", 0)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
2024-03-03 11:14:12 +01:00
|
|
|
# setting triggers
|
2024-06-20 20:47:34 +02:00
|
|
|
await set_trig_blk_register(ctx, "curly_op", Operations.EQ)
|
|
|
|
|
await set_trig_blk_register(ctx, "curly_arg", 4)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
2024-03-03 11:14:12 +01:00
|
|
|
# setting trigger mode
|
2024-06-20 20:47:34 +02:00
|
|
|
await set_fsm_register(ctx, "trigger_mode", 0)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
2024-03-03 11:14:12 +01:00
|
|
|
# setting trigger location
|
2024-06-20 20:47:34 +02:00
|
|
|
await set_fsm_register(ctx, "trigger_location", 511)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
2024-03-03 11:14:12 +01:00
|
|
|
# starting capture
|
2024-06-20 20:47:34 +02:00
|
|
|
await set_fsm_register(ctx, "request_start", 1)
|
|
|
|
|
await set_fsm_register(ctx, "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
|
2024-06-20 20:47:34 +02:00
|
|
|
await ctx.tick().repeat(700)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
2024-03-03 11:14:12 +01:00
|
|
|
# provide the trigger condition
|
2024-06-20 20:47:34 +02:00
|
|
|
await set_probe(ctx, "curly", 4)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
2024-06-20 20:47:34 +02:00
|
|
|
await ctx.tick().repeat(700)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
2024-03-03 11:14:12 +01:00
|
|
|
# dump sample memory contents
|
2024-06-20 20:47:34 +02:00
|
|
|
await write_register(la, ctx, 0, 0)
|
|
|
|
|
await write_register(la, ctx, 0, 1)
|
|
|
|
|
await write_register(la, ctx, 0, 0)
|
2023-12-28 23:22:29 +01:00
|
|
|
|
2024-03-04 03:53:08 +01:00
|
|
|
for addr in range(la.max_addr):
|
2024-06-20 20:47:34 +02:00
|
|
|
await print_data_at_addr(ctx, addr)
|