Enforce max queue depth on streaming sources

This commit is contained in:
Alex Forencich
2021-03-21 22:25:18 -07:00
parent a34a1cd125
commit 295db437f7
5 changed files with 84 additions and 4 deletions

View File

@@ -27,7 +27,7 @@ import struct
import zlib
import cocotb
from cocotb.queue import Queue
from cocotb.queue import Queue, QueueFull
from cocotb.triggers import RisingEdge, Timer, First, Event
from cocotb.utils import get_sim_time
@@ -154,6 +154,7 @@ class XgmiiSource(Reset):
self.active = False
self.queue = Queue()
self.dequeue_event = Event()
self.current_frame = None
self.idle_event = Event()
self.idle_event.set()
@@ -165,6 +166,9 @@ class XgmiiSource(Reset):
self.queue_occupancy_bytes = 0
self.queue_occupancy_frames = 0
self.queue_occupancy_limit_bytes = -1
self.queue_occupancy_limit_frames = -1
self.width = len(self.data)
self.byte_width = len(self.ctrl)
@@ -185,6 +189,9 @@ class XgmiiSource(Reset):
self._init_reset(reset, reset_active_level)
async def send(self, frame):
while self.full():
self.dequeue_event.clear()
await self.dequeue_event.wait()
frame = XgmiiFrame(frame)
await self.queue.put(frame)
self.idle_event.clear()
@@ -192,6 +199,8 @@ class XgmiiSource(Reset):
self.queue_occupancy_frames += 1
def send_nowait(self, frame):
if self.full():
raise QueueFull()
frame = XgmiiFrame(frame)
self.queue.put_nowait(frame)
self.idle_event.clear()
@@ -204,6 +213,14 @@ class XgmiiSource(Reset):
def empty(self):
return self.queue.empty()
def full(self):
if self.queue_occupancy_limit_bytes > 0 and self.queue_occupancy_bytes > self.queue_occupancy_limit_bytes:
return True
elif self.queue_occupancy_limit_frames > 0 and self.queue_occupancy_frames > self.queue_occupancy_limit_frames:
return True
else:
return False
def idle(self):
return self.empty() and not self.active
@@ -212,6 +229,7 @@ class XgmiiSource(Reset):
frame = self.queue.get_nowait()
frame.sim_time_end = None
frame.handle_tx_complete()
self.dequeue_event.set()
self.idle_event.set()
self.queue_occupancy_bytes = 0
self.queue_occupancy_frames = 0
@@ -265,6 +283,7 @@ class XgmiiSource(Reset):
if not self.queue.empty():
# send frame
frame = self.queue.get_nowait()
self.dequeue_event.set()
self.queue_occupancy_bytes -= len(frame)
self.queue_occupancy_frames -= 1
self.current_frame = frame