buffers: Add TX/RX buffer helpers
This commit is contained in:
parent
a93f8b08ca
commit
e2c72ef61d
62
buffers.py
Normal file
62
buffers.py
Normal file
@ -0,0 +1,62 @@
|
||||
#!/usr/bin/env python
|
||||
|
||||
import cocotb
|
||||
from cocotb.triggers import *
|
||||
from cocotb.result import *
|
||||
from cocotb.queue import Queue
|
||||
|
||||
class tx_buffer:
|
||||
def __init__(self, dut, prefix):
|
||||
self.queue = Queue()
|
||||
self.queue_start_ev = Event()
|
||||
self.queue_done_ev = Event()
|
||||
self.dut = dut
|
||||
self.prefix = prefix
|
||||
pass
|
||||
|
||||
async def main(self):
|
||||
while True:
|
||||
await self.queue_start_ev.wait()
|
||||
self.queue_start_ev.clear()
|
||||
while not self.queue.empty():
|
||||
data = await self.queue.get()
|
||||
getattr(self.dut, self.prefix + "dv").value = True
|
||||
for byte in data:
|
||||
getattr(self.dut, self.prefix + "d").value = byte
|
||||
await Edge(getattr(self.dut, self.prefix + "da"))
|
||||
getattr(self.dut, self.prefix + "dv").value = False
|
||||
await Edge(getattr(self.dut, self.prefix + "da"))
|
||||
self.queue_done_ev.set()
|
||||
|
||||
async def start(self):
|
||||
await cocotb.start(self.main())
|
||||
|
||||
async def send(self, data, send_now=True, wait=None):
|
||||
if wait is None:
|
||||
wait = send_now
|
||||
self.queue.put_nowait(data)
|
||||
if send_now:
|
||||
self.queue_start_ev.set()
|
||||
if wait:
|
||||
await self.queue_done_ev.wait()
|
||||
self.queue_done_ev.clear()
|
||||
|
||||
class rx_buffer:
|
||||
def __init__(self, dut, prefix):
|
||||
self.queue = Queue()
|
||||
self.dut = dut
|
||||
self.prefix = prefix
|
||||
|
||||
async def main(self):
|
||||
while True:
|
||||
d = bytearray(b'')
|
||||
await RisingEdge(getattr(self.dut, self.prefix + "a"))
|
||||
while True:
|
||||
await First(Edge(getattr(self.dut, self.prefix + "dt")), Edge(getattr(self.dut, self.prefix + "a")))
|
||||
if not getattr(self.dut, self.prefix + "a").value:
|
||||
break
|
||||
d.append(getattr(self.dut, self.prefix + "d").value)
|
||||
self.queue.put_nowait(d)
|
||||
|
||||
async def start(self):
|
||||
await cocotb.start(self.main())
|
Loading…
Reference in New Issue
Block a user