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/drivers.py | |
| parent | a3559d9e53100cd2d9c1e481ec81eeb90ca0ba5b (diff) | |
tb/gfx_shader_bind: initial commit
Diffstat (limited to 'tb/gfx_shader_bind/testbench/drivers.py')
| -rw-r--r-- | tb/gfx_shader_bind/testbench/drivers.py | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/tb/gfx_shader_bind/testbench/drivers.py b/tb/gfx_shader_bind/testbench/drivers.py new file mode 100644 index 0000000..c069d97 --- /dev/null +++ b/tb/gfx_shader_bind/testbench/drivers.py @@ -0,0 +1,85 @@ +import cocotb +from cocotb.clock import Clock +from cocotb.queue import Queue +from cocotb.triggers import Event, ReadOnly, RisingEdge + +from cocotb_bus.drivers import BusDriver + +from .data import BAD_PC + +class ClockResetDriver: + def __init__(self, dut): + self._reset_event = Event('reset_done') + + dut.clk.setimmediatevalue(0) + dut.rst_n.setimmediatevalue(0) + + self._dut = dut + self._clock_gen = Clock(dut.clk, 2, 'step') + + def start(self): + cocotb.start_soon(self._clock_gen.start()) + cocotb.start_soon(self.reset()) + + async def reset(self): + self._reset_event.clear() + + self._dut.rst_n.value = 0 + await RisingEdge(self._dut.clk) + self._dut.rst_n.value = 1 + await ReadOnly() + + self._reset_event.set() + + async def wait_for_reset(self): + await self._reset_event.wait() + +class PcDriver(BusDriver): + _signals = ['pc', 'group'] + + def __init__(self, *args, table, **kwargs): + super().__init__(*args, **kwargs) + + self._table = table + self._delay1 = BAD_PC + self._delay2 = BAD_PC + self._delay3 = BAD_PC + + cocotb.start_soon(self._run()) + + async def _run(self): + while True: + self.bus.pc.value = self._delay3 + + await RisingEdge(self.clock) + + self._delay3 = self._delay2 + self._delay2 = self._delay1 + self._delay1 = self._table[self.bus.group.value] + +class LoopDriver(BusDriver): + _signals = ['group', 'valid'] + + def __init__(self, *args, maxsize=8, **kwargs): + super().__init__(*args, **kwargs) + + self._queue = Queue(maxsize=maxsize) + self.bus.valid.setimmediatevalue(0) + + cocotb.start_soon(self._run()) + + async def put(self, group): + await self._queue.put(group) + + async def _run(self): + while True: + await RisingEdge(self.clock) + + valid = not self._queue.empty() + if valid: + group = self._queue.get_nowait() + valid = group is not None + + self.bus.valid.value = int(valid) + if valid: + self.bus.group.value = group |
