diff --git a/README.md b/README.md index 7f8dee2..b7aa3f9 100644 --- a/README.md +++ b/README.md @@ -73,8 +73,10 @@ To receive data with a `GmiiSink`, call `recv()`. Call `wait()` to wait for new #### Methods -* `send(frame)`: send _frame_ (source) -* `recv()`: receive a frame as a `GmiiFrame` (sink) +* `send(frame)`: send _frame_ (blocking) (source) +* `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) * `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) @@ -147,8 +149,10 @@ To receive data with an `RgmiiSink`, call `recv()`. Call `wait()` to wait for n #### Methods -* `send(frame)`: send _frame_ (source) -* `recv()`: receive a frame as a `GmiiFrame` (sink) +* `send(frame)`: send _frame_ (blocking) (source) +* `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) * `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) @@ -198,8 +202,10 @@ To receive data with an `XgmiiSink`, call `recv()`. Call `wait()` to wait for n #### Methods -* `send(frame)`: send _frame_ (source) -* `recv()`: receive a frame as an `XgmiiFrame` (sink) +* `send(frame)`: send _frame_ (blocking) (source) +* `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) * `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) diff --git a/cocotbext/eth/gmii.py b/cocotbext/eth/gmii.py index e0adfc7..0dd129a 100644 --- a/cocotbext/eth/gmii.py +++ b/cocotbext/eth/gmii.py @@ -156,7 +156,10 @@ class GmiiSource(object): 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) self.queue_occupancy_bytes += len(frame) self.queue_occupancy_frames += 1 @@ -278,7 +281,13 @@ class GmiiSink(object): 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: frame = self.queue.popleft() self.queue_occupancy_bytes -= len(frame) diff --git a/cocotbext/eth/rgmii.py b/cocotbext/eth/rgmii.py index 731a833..61bca69 100644 --- a/cocotbext/eth/rgmii.py +++ b/cocotbext/eth/rgmii.py @@ -72,7 +72,10 @@ class RgmiiSource(object): 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) self.queue_occupancy_bytes += len(frame) self.queue_occupancy_frames += 1 @@ -200,7 +203,13 @@ class RgmiiSink(object): 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: frame = self.queue.popleft() self.queue_occupancy_bytes -= len(frame) diff --git a/cocotbext/eth/xgmii.py b/cocotbext/eth/xgmii.py index 327ef57..9ef4c26 100644 --- a/cocotbext/eth/xgmii.py +++ b/cocotbext/eth/xgmii.py @@ -163,7 +163,10 @@ class XgmiiSource(object): 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) self.queue_occupancy_bytes += len(frame) self.queue_occupancy_frames += 1 @@ -305,7 +308,13 @@ class XgmiiSink(object): 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: frame = self.queue.popleft() self.queue_occupancy_bytes -= len(frame) diff --git a/tests/gmii/test_gmii.py b/tests/gmii/test_gmii.py index ac6c136..c6d7f4b 100644 --- a/tests/gmii/test_gmii.py +++ b/tests/gmii/test_gmii.py @@ -103,11 +103,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_ for test_data in test_frames: test_frame = GmiiFrame.from_payload(test_data) - tb.source.send(test_frame) + await tb.source.send(test_frame) for test_data in test_frames: - await tb.sink.wait() - rx_frame = tb.sink.recv() + rx_frame = await tb.sink.recv() assert rx_frame.get_payload() == test_data assert rx_frame.check_fcs() diff --git a/tests/rgmii/test_rgmii.py b/tests/rgmii/test_rgmii.py index 57fafb7..d4bf262 100644 --- a/tests/rgmii/test_rgmii.py +++ b/tests/rgmii/test_rgmii.py @@ -101,11 +101,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_ for test_data in test_frames: test_frame = GmiiFrame.from_payload(test_data) - tb.source.send(test_frame) + await tb.source.send(test_frame) for test_data in test_frames: - await tb.sink.wait() - rx_frame = tb.sink.recv() + rx_frame = await tb.sink.recv() assert rx_frame.get_payload() == test_data assert rx_frame.check_fcs() diff --git a/tests/xgmii/test_xgmii.py b/tests/xgmii/test_xgmii.py index 28e2493..c96e648 100644 --- a/tests/xgmii/test_xgmii.py +++ b/tests/xgmii/test_xgmii.py @@ -103,11 +103,10 @@ async def run_test(dut, payload_lengths=None, payload_data=None, ifg=12, enable_ for test_data in test_frames: test_frame = XgmiiFrame.from_payload(test_data) - tb.source.send(test_frame) + await tb.source.send(test_frame) for test_data in test_frames: - await tb.sink.wait() - rx_frame = tb.sink.recv() + rx_frame = await tb.sink.recv() assert rx_frame.get_payload() == test_data 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: test_frame = XgmiiFrame.from_payload(test_data) - tb.source.send(test_frame) + await tb.source.send(test_frame) for test_data in test_frames: - await tb.sink.wait() - rx_frame = tb.sink.recv() + rx_frame = await tb.sink.recv() assert rx_frame.get_payload() == test_data assert rx_frame.check_fcs()