Convert send/recv to blocking, add nonblocking send_nowait/recv_nowait
This commit is contained in:
18
README.md
18
README.md
@@ -73,8 +73,10 @@ To receive data with a `GmiiSink`, call `recv()`. Call `wait()` to wait for new
|
|||||||
|
|
||||||
#### Methods
|
#### Methods
|
||||||
|
|
||||||
* `send(frame)`: send _frame_ (source)
|
* `send(frame)`: send _frame_ (blocking) (source)
|
||||||
* `recv()`: receive a frame as a `GmiiFrame` (sink)
|
* `send_nowait(frame)`: send _frame_ (non-blocking) (source)
|
||||||
|
* `recv()`: receive a frame as a `GmiiFrame` (blocking) (sink)
|
||||||
|
* `recv_nowait()`: receive a frame as a `GmiiFrame` (non-blocking) (sink)
|
||||||
* `count()`: returns the number of items in the queue (all)
|
* `count()`: returns the number of items in the queue (all)
|
||||||
* `empty()`: returns _True_ if the queue is empty (all)
|
* `empty()`: returns _True_ if the queue is empty (all)
|
||||||
* `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source)
|
* `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source)
|
||||||
@@ -147,8 +149,10 @@ To receive data with an `RgmiiSink`, call `recv()`. Call `wait()` to wait for n
|
|||||||
|
|
||||||
#### Methods
|
#### Methods
|
||||||
|
|
||||||
* `send(frame)`: send _frame_ (source)
|
* `send(frame)`: send _frame_ (blocking) (source)
|
||||||
* `recv()`: receive a frame as a `GmiiFrame` (sink)
|
* `send_nowait(frame)`: send _frame_ (non-blocking) (source)
|
||||||
|
* `recv()`: receive a frame as a `GmiiFrame` (blocking) (sink)
|
||||||
|
* `recv_nowait()`: receive a frame as a `GmiiFrame` (non-blocking) (sink)
|
||||||
* `count()`: returns the number of items in the queue (all)
|
* `count()`: returns the number of items in the queue (all)
|
||||||
* `empty()`: returns _True_ if the queue is empty (all)
|
* `empty()`: returns _True_ if the queue is empty (all)
|
||||||
* `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source)
|
* `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source)
|
||||||
@@ -198,8 +202,10 @@ To receive data with an `XgmiiSink`, call `recv()`. Call `wait()` to wait for n
|
|||||||
|
|
||||||
#### Methods
|
#### Methods
|
||||||
|
|
||||||
* `send(frame)`: send _frame_ (source)
|
* `send(frame)`: send _frame_ (blocking) (source)
|
||||||
* `recv()`: receive a frame as an `XgmiiFrame` (sink)
|
* `send_nowait(frame)`: send _frame_ (non-blocking) (source)
|
||||||
|
* `recv()`: receive a frame as an `XgmiiFrame` (blocking) (sink)
|
||||||
|
* `recv_nowait()`: receive a frame as an `XgmiiFrame` (non-blocking) (sink)
|
||||||
* `count()`: returns the number of items in the queue (all)
|
* `count()`: returns the number of items in the queue (all)
|
||||||
* `empty()`: returns _True_ if the queue is empty (all)
|
* `empty()`: returns _True_ if the queue is empty (all)
|
||||||
* `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source)
|
* `idle()`: returns _True_ if no transfer is in progress (all) or if the queue is not empty (source)
|
||||||
|
|||||||
@@ -156,7 +156,10 @@ class GmiiSource(object):
|
|||||||
|
|
||||||
cocotb.fork(self._run())
|
cocotb.fork(self._run())
|
||||||
|
|
||||||
def send(self, frame):
|
async def send(self, frame):
|
||||||
|
self.send_nowait(frame)
|
||||||
|
|
||||||
|
def send_nowait(self, frame):
|
||||||
frame = GmiiFrame(frame)
|
frame = GmiiFrame(frame)
|
||||||
self.queue_occupancy_bytes += len(frame)
|
self.queue_occupancy_bytes += len(frame)
|
||||||
self.queue_occupancy_frames += 1
|
self.queue_occupancy_frames += 1
|
||||||
@@ -278,7 +281,13 @@ class GmiiSink(object):
|
|||||||
|
|
||||||
cocotb.fork(self._run())
|
cocotb.fork(self._run())
|
||||||
|
|
||||||
def recv(self):
|
async def recv(self, compact=True):
|
||||||
|
while self.empty():
|
||||||
|
self.sync.clear()
|
||||||
|
await self.sync.wait()
|
||||||
|
return self.recv_nowait(compact)
|
||||||
|
|
||||||
|
def recv_nowait(self, compact=True):
|
||||||
if self.queue:
|
if self.queue:
|
||||||
frame = self.queue.popleft()
|
frame = self.queue.popleft()
|
||||||
self.queue_occupancy_bytes -= len(frame)
|
self.queue_occupancy_bytes -= len(frame)
|
||||||
|
|||||||
@@ -72,7 +72,10 @@ class RgmiiSource(object):
|
|||||||
|
|
||||||
cocotb.fork(self._run())
|
cocotb.fork(self._run())
|
||||||
|
|
||||||
def send(self, frame):
|
async def send(self, frame):
|
||||||
|
self.send_nowait(frame)
|
||||||
|
|
||||||
|
def send_nowait(self, frame):
|
||||||
frame = GmiiFrame(frame)
|
frame = GmiiFrame(frame)
|
||||||
self.queue_occupancy_bytes += len(frame)
|
self.queue_occupancy_bytes += len(frame)
|
||||||
self.queue_occupancy_frames += 1
|
self.queue_occupancy_frames += 1
|
||||||
@@ -200,7 +203,13 @@ class RgmiiSink(object):
|
|||||||
|
|
||||||
cocotb.fork(self._run())
|
cocotb.fork(self._run())
|
||||||
|
|
||||||
def recv(self):
|
async def recv(self, compact=True):
|
||||||
|
while self.empty():
|
||||||
|
self.sync.clear()
|
||||||
|
await self.sync.wait()
|
||||||
|
return self.recv_nowait(compact)
|
||||||
|
|
||||||
|
def recv_nowait(self, compact=True):
|
||||||
if self.queue:
|
if self.queue:
|
||||||
frame = self.queue.popleft()
|
frame = self.queue.popleft()
|
||||||
self.queue_occupancy_bytes -= len(frame)
|
self.queue_occupancy_bytes -= len(frame)
|
||||||
|
|||||||
@@ -163,7 +163,10 @@ class XgmiiSource(object):
|
|||||||
|
|
||||||
cocotb.fork(self._run())
|
cocotb.fork(self._run())
|
||||||
|
|
||||||
def send(self, frame):
|
async def send(self, frame):
|
||||||
|
self.send_nowait(frame)
|
||||||
|
|
||||||
|
def send_nowait(self, frame):
|
||||||
frame = XgmiiFrame(frame)
|
frame = XgmiiFrame(frame)
|
||||||
self.queue_occupancy_bytes += len(frame)
|
self.queue_occupancy_bytes += len(frame)
|
||||||
self.queue_occupancy_frames += 1
|
self.queue_occupancy_frames += 1
|
||||||
@@ -305,7 +308,13 @@ class XgmiiSink(object):
|
|||||||
|
|
||||||
cocotb.fork(self._run())
|
cocotb.fork(self._run())
|
||||||
|
|
||||||
def recv(self):
|
async def recv(self, compact=True):
|
||||||
|
while self.empty():
|
||||||
|
self.sync.clear()
|
||||||
|
await self.sync.wait()
|
||||||
|
return self.recv_nowait(compact)
|
||||||
|
|
||||||
|
def recv_nowait(self, compact=True):
|
||||||
if self.queue:
|
if self.queue:
|
||||||
frame = self.queue.popleft()
|
frame = self.queue.popleft()
|
||||||
self.queue_occupancy_bytes -= len(frame)
|
self.queue_occupancy_bytes -= len(frame)
|
||||||
|
|||||||
@@ -103,11 +103,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_
|
|||||||
|
|
||||||
for test_data in test_frames:
|
for test_data in test_frames:
|
||||||
test_frame = GmiiFrame.from_payload(test_data)
|
test_frame = GmiiFrame.from_payload(test_data)
|
||||||
tb.source.send(test_frame)
|
await tb.source.send(test_frame)
|
||||||
|
|
||||||
for test_data in test_frames:
|
for test_data in test_frames:
|
||||||
await tb.sink.wait()
|
rx_frame = await tb.sink.recv()
|
||||||
rx_frame = tb.sink.recv()
|
|
||||||
|
|
||||||
assert rx_frame.get_payload() == test_data
|
assert rx_frame.get_payload() == test_data
|
||||||
assert rx_frame.check_fcs()
|
assert rx_frame.check_fcs()
|
||||||
|
|||||||
@@ -101,11 +101,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_
|
|||||||
|
|
||||||
for test_data in test_frames:
|
for test_data in test_frames:
|
||||||
test_frame = GmiiFrame.from_payload(test_data)
|
test_frame = GmiiFrame.from_payload(test_data)
|
||||||
tb.source.send(test_frame)
|
await tb.source.send(test_frame)
|
||||||
|
|
||||||
for test_data in test_frames:
|
for test_data in test_frames:
|
||||||
await tb.sink.wait()
|
rx_frame = await tb.sink.recv()
|
||||||
rx_frame = tb.sink.recv()
|
|
||||||
|
|
||||||
assert rx_frame.get_payload() == test_data
|
assert rx_frame.get_payload() == test_data
|
||||||
assert rx_frame.check_fcs()
|
assert rx_frame.check_fcs()
|
||||||
|
|||||||
@@ -103,11 +103,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_
|
|||||||
|
|
||||||
for test_data in test_frames:
|
for test_data in test_frames:
|
||||||
test_frame = XgmiiFrame.from_payload(test_data)
|
test_frame = XgmiiFrame.from_payload(test_data)
|
||||||
tb.source.send(test_frame)
|
await tb.source.send(test_frame)
|
||||||
|
|
||||||
for test_data in test_frames:
|
for test_data in test_frames:
|
||||||
await tb.sink.wait()
|
rx_frame = await tb.sink.recv()
|
||||||
rx_frame = tb.sink.recv()
|
|
||||||
|
|
||||||
assert rx_frame.get_payload() == test_data
|
assert rx_frame.get_payload() == test_data
|
||||||
assert rx_frame.check_fcs()
|
assert rx_frame.check_fcs()
|
||||||
@@ -142,11 +141,10 @@ async def run_test_alignment(dut, payload_data=None, ifg=12, enable_dic=True,
|
|||||||
|
|
||||||
for test_data in test_frames:
|
for test_data in test_frames:
|
||||||
test_frame = XgmiiFrame.from_payload(test_data)
|
test_frame = XgmiiFrame.from_payload(test_data)
|
||||||
tb.source.send(test_frame)
|
await tb.source.send(test_frame)
|
||||||
|
|
||||||
for test_data in test_frames:
|
for test_data in test_frames:
|
||||||
await tb.sink.wait()
|
rx_frame = await tb.sink.recv()
|
||||||
rx_frame = tb.sink.recv()
|
|
||||||
|
|
||||||
assert rx_frame.get_payload() == test_data
|
assert rx_frame.get_payload() == test_data
|
||||||
assert rx_frame.check_fcs()
|
assert rx_frame.check_fcs()
|
||||||
|
|||||||
Reference in New Issue
Block a user