summaryrefslogtreecommitdiff
path: root/tb/gfx_shader_bind/testbench/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'tb/gfx_shader_bind/testbench/main.py')
-rw-r--r--tb/gfx_shader_bind/testbench/main.py91
1 files changed, 91 insertions, 0 deletions
diff --git a/tb/gfx_shader_bind/testbench/main.py b/tb/gfx_shader_bind/testbench/main.py
new file mode 100644
index 0000000..f31e198
--- /dev/null
+++ b/tb/gfx_shader_bind/testbench/main.py
@@ -0,0 +1,91 @@
+import random
+
+import cocotb
+from cocotb.triggers import ClockCycles, FallingEdge, ReadOnly, RisingEdge
+
+from cocotb_bus.scoreboard import Scoreboard
+
+from cocotb_coverage.coverage import coverage_db
+
+from .axi import AXI4Agent
+from .data import FrontWave
+from .common import MAX_GROUPS, MEM_WORDS, log
+from .models import Memory, PcTable
+from .drivers import ClockResetDriver, LoopDriver, PcDriver
+from .checkers import PcChecker, PipelineIntegrityChecker
+from .monitors import FrontWaveMonitor
+
+@cocotb.test()
+async def test(dut):
+ mem = Memory('insn_mem', word_size=4, words=MEM_WORDS)
+ mem_agent = AXI4Agent(dut, 'mem', dut.clk, mem, case_insensitive=False)
+
+ out_groups = set()
+ out_groups_retry = set()
+ out_monitor = FrontWaveMonitor(dut, 'wave', dut.clk, case_insensitive=False)
+
+ def out_callback(wave):
+ nonlocal out_groups, out_groups_retry
+
+ out_groups.add(wave.group)
+ if wave.insn is None:
+ out_groups_retry.add(wave.group)
+
+ out_monitor.add_callback(out_callback)
+
+ out_expected = []
+ out_scoreboard = Scoreboard(dut, fail_immediately=False)
+ out_scoreboard.add_interface(out_monitor, out_expected)
+
+ clock_reset = ClockResetDriver(dut)
+ clock_reset.start()
+
+ pc_table = PcTable()
+ pc_driver = PcDriver(dut, 'pc_front', dut.clk, table=pc_table, case_insensitive=False)
+ loop_driver = LoopDriver(dut, 'loop', dut.clk, case_insensitive=False)
+
+ pc_checker = PcChecker(dut, 'bind', dut.clk, mem=mem, pc_table=pc_table)
+ pipeline_checker = PipelineIntegrityChecker(dut, 'bind', dut.clk)
+
+ out_monitor.add_callback(pc_checker.sample_wave)
+
+ await clock_reset.wait_for_reset()
+
+ await FallingEdge(dut.front.bind_.icache.in_flush) #FIXME
+ await RisingEdge(dut.clk)
+
+ for iteration in range(1000):
+ all_groups = list(range(MAX_GROUPS))
+ random.shuffle(all_groups)
+
+ for group in all_groups:
+ pc = random.randint(0, MEM_WORDS) * 4
+ pc_table[group] = pc
+ mem.randomize_line(pc)
+
+ out_expected.append(FrontWave(group=group, insn=mem.read(pc), soft=True))
+ await loop_driver.put(group)
+
+ #while out_groups_retry or len(out_groups) < MAX_GROUPS:
+ for _ in range(100):
+ if out_groups_retry:
+ group = out_groups_retry.pop()
+ out_groups.remove(group)
+
+ out_expected.append(FrontWave(group=group, insn=mem.read(pc_table[group] * 4), soft=True))
+
+ await loop_driver.put(group)
+
+ await RisingEdge(dut.clk)
+
+ for _ in range(100):
+ await RisingEdge(dut.clk)
+
+ out_groups.clear()
+ out_groups_retry.clear()
+
+ coverage_db.report_coverage(log.info, bins=True)
+ coverage_db.export_to_xml(filename="coverage.xml")
+ coverage_db.export_to_yaml(filename='coverage.yml')
+
+ raise out_scoreboard.result