Let's create a reusable driver for a simple Valid/Ready interface.
import cocotb
from cocotb.triggers import RisingEdge
class StreamDriver:
def __init__(self, bus, clock):
self.bus = bus
self.clock = clock
async def send(self, data):
"""Send one transaction"""
self.bus.valid.value = 1
self.bus.data.value = data
while True:
await RisingEdge(self.clock)
if self.bus.ready.value == 1:
break
self.bus.valid.value = 0