diff options
| author | Alejandro Soto <alejandro@34project.org> | 2024-05-18 09:13:11 -0600 |
|---|---|---|
| committer | Alejandro Soto <alejandro@34project.org> | 2024-05-24 05:58:41 -0600 |
| commit | 4cf5ed94a8767efd13265abcc20a5082acc02824 (patch) | |
| tree | 0a98aaac24245a8daf76d25e8161cd3c03acd2fb /tb/gfx_shader_bind/testbench/checkers.py | |
| parent | a3559d9e53100cd2d9c1e481ec81eeb90ca0ba5b (diff) | |
tb/gfx_shader_bind: initial commit
Diffstat (limited to 'tb/gfx_shader_bind/testbench/checkers.py')
| -rw-r--r-- | tb/gfx_shader_bind/testbench/checkers.py | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/tb/gfx_shader_bind/testbench/checkers.py b/tb/gfx_shader_bind/testbench/checkers.py new file mode 100644 index 0000000..0109249 --- /dev/null +++ b/tb/gfx_shader_bind/testbench/checkers.py @@ -0,0 +1,68 @@ +import cocotb +from cocotb.triggers import RisingEdge, ReadOnly + +from cocotb_coverage.coverage import CoverCheck + +class PipelineIntegrityChecker: + def __init__(self, dut, name, clk): + self._clk, self._dut = clk, dut + self._queue = [None] * dut.front.bind_.BIND_STAGES.value + self._ready_sticky = False + + @CoverCheck( + f'{name}.runnable_tx_ready', + f_pass = lambda ready: not self._ready_sticky and ready, + f_fail = lambda ready: self._ready_sticky and not ready, + ) + def sample_ready(ready): + self._ready_sticky = self._ready_sticky or ready + + @CoverCheck( + f'{name}.in_to_out_integrity', + f_pass = lambda group: group == self._queue[0] and group is not None, + f_fail = lambda group: group != self._queue[0], + ) + def sample_wave_group(group): + pass + + self._sample_ready = sample_ready + self._sample_wave_group = sample_wave_group + + cocotb.start_soon(self._run()) + + async def _run(self): + while True: + await RisingEdge(self._clk) + await ReadOnly() + + self._sample_ready(self._dut.runnable_in_ready.value) + + if self._dut.wave_valid.value: + self._sample_wave_group(self._dut.wave_group.value) + else: + self._sample_wave_group(None) + + new_group = None + if self._dut.runnable_out_valid.value: + new_group = self._dut.runnable_out_data.value + + self._queue[:-1] = self._queue[1:] + self._queue[-1] = new_group + +class PcChecker: + def __init__(self, dut, name, clk, *, mem, pc_table): + self._clk, self._dut = clk, dut + self._mem, self._pc_table = mem, pc_table + + @CoverCheck( + f'{name}.pc_ok', + f_pass = lambda wave: wave.insn and self._pc_ok(wave), + f_fail = lambda wave: wave.insn and not self._pc_ok(wave), + ) + def sample_wave(wave): + pass + + self.sample_wave = sample_wave + + def _pc_ok(self, wave): + return wave.insn == self._mem.read(self._pc_table[wave.group] * 4) |
