From 28f4585c087606fdacf1eebb9d8825b3db3c1fce Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Sun, 13 Aug 2023 13:20:35 -0700 Subject: [PATCH] Clean up sink pause handling Signed-off-by: Alex Forencich --- cocotbext/axi/axis.py | 16 +++++++++++----- cocotbext/axi/stream.py | 16 +++++++++++----- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/cocotbext/axi/axis.py b/cocotbext/axi/axis.py index 25a141e..bb3b9d2 100644 --- a/cocotbext/axi/axis.py +++ b/cocotbext/axi/axis.py @@ -784,7 +784,7 @@ class AxiStreamSink(AxiStreamMonitor, AxiStreamPause): wake_event = self.wake_event.wait() while True: - pause_sample = self.pause + pause_sample = bool(self.pause) await clock_edge_event @@ -827,8 +827,14 @@ class AxiStreamSink(AxiStreamMonitor, AxiStreamPause): self.active = bool(frame) if has_tready: - self.bus.tready.value = (not self.full() and not pause_sample) + paused = self.full() or pause_sample - if not tvalid_sample or (self.pause and pause_sample) or self.full(): - self.wake_event.clear() - await wake_event + self.bus.tready.value = not paused + + if (not tvalid_sample or paused) and (pause_sample == bool(self.pause)): + self.wake_event.clear() + await wake_event + else: + if not tvalid_sample: + self.wake_event.clear() + await wake_event diff --git a/cocotbext/axi/stream.py b/cocotbext/axi/stream.py index 9d560b8..59d6932 100644 --- a/cocotbext/axi/stream.py +++ b/cocotbext/axi/stream.py @@ -398,7 +398,7 @@ class StreamSink(StreamMonitor, StreamPause): wake_event = self.wake_event.wait() while True: - pause_sample = self.pause + pause_sample = bool(self.pause) await clock_edge_event @@ -413,11 +413,17 @@ class StreamSink(StreamMonitor, StreamPause): self.active_event.set() if has_ready: - self.ready.value = (not self.full() and not pause_sample) + paused = self.full() or pause_sample - if not valid_sample or (self.pause and pause_sample) or self.full(): - self.wake_event.clear() - await wake_event + self.ready.value = not paused + + if (not valid_sample or paused) and (pause_sample == bool(self.pause)): + self.wake_event.clear() + await wake_event + else: + if not valid_sample: + self.wake_event.clear() + await wake_event def define_stream(name, signals, optional_signals=None, valid_signal=None, ready_signal=None, signal_widths=None):