import logging
|
|
from cocotb.triggers import FallingEdge, RisingEdge, Timer, ReadOnly
|
|
|
|
|
|
class Vai:
|
|
"""VAI base class"""
|
|
|
|
def __init__(self, clock, data, valid, accept, *args, **kwargs):
|
|
self._version = "0.0.1"
|
|
|
|
self.log = logging.getLogger(f"cocotb.{data._path}")
|
|
|
|
self._data = data
|
|
self._valid = valid
|
|
self._accept = accept
|
|
self._clock = clock
|
|
|
|
self._clkedge = RisingEdge(self._clock)
|
|
|
|
|
|
class VaiDriver(Vai):
|
|
"""Valid-Accept Driver"""
|
|
|
|
def __init__(self, clock, data, valid, accept, *args, **kwargs):
|
|
super().__init__(clock, data, valid, accept, *args, **kwargs)
|
|
|
|
self.log.info("Valid-accept driver")
|
|
self.log.info(" cocotbext-vai version %s", self._version)
|
|
self.log.info(" Copyright (c) 2022 Torsten Meissner")
|
|
|
|
# Drive input defaults (setimmediatevalue to avoid x asserts)
|
|
self._data.setimmediatevalue(0)
|
|
self._valid.setimmediatevalue(0)
|
|
|
|
async def send(self, data, sync=True):
|
|
if sync:
|
|
await self._clkedge
|
|
|
|
self.log.info("Sending data: %s", hex(data))
|
|
self._valid.value = 1
|
|
self._data.value = data
|
|
|
|
while True:
|
|
await ReadOnly()
|
|
if self._accept.value:
|
|
break
|
|
await self._clkedge
|
|
await self._clkedge
|
|
|
|
self._valid.value = 0
|
|
|
|
|
|
|
|
class VaiReceiver(Vai):
|
|
"""Valid-Accept Receiver"""
|
|
|
|
def __init__(self, clock, data, valid, accept, *args, **kwargs):
|
|
super().__init__(clock, data, valid, accept, *args, **kwargs)
|
|
|
|
self.log.info("Valid-accept receiver")
|
|
self.log.info(" cocotbext-vai version %s", self._version)
|
|
self.log.info(" Copyright (c) 2022 Torsten Meissner")
|
|
|
|
# Drive input defaults (setimmediatevalue to avoid x asserts)
|
|
self._accept.setimmediatevalue(0)
|
|
|
|
async def receive(self, sync=True):
|
|
if sync:
|
|
await self._clkedge
|
|
|
|
while True:
|
|
await ReadOnly()
|
|
if self._valid.value:
|
|
break
|
|
await self._clkedge
|
|
|
|
await self._clkedge
|
|
self._accept.value = 1
|
|
_rec = self._data.value
|
|
self.log.info("Received data: %s", hex(_rec))
|
|
|
|
await self._clkedge
|
|
self._accept.value = 0
|
|
|
|
return _rec
|