From 63e6eafc07a63545b3e7bb9ca4e866271a790a67 Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Sun, 21 Mar 2021 14:08:27 -0700 Subject: [PATCH] Handle dropped transmit frames during reset --- cocotbext/eth/gmii.py | 8 ++++++++ cocotbext/eth/mii.py | 8 ++++++++ cocotbext/eth/rgmii.py | 8 ++++++++ cocotbext/eth/xgmii.py | 8 ++++++++ 4 files changed, 32 insertions(+) diff --git a/cocotbext/eth/gmii.py b/cocotbext/eth/gmii.py index 03983eb..d614288 100644 --- a/cocotbext/eth/gmii.py +++ b/cocotbext/eth/gmii.py @@ -153,6 +153,7 @@ class GmiiSource(Reset): self.active = False self.queue = Queue() + self.current_frame = None self.idle_event = Event() self.idle_event.set() @@ -223,6 +224,11 @@ class GmiiSource(Reset): self.er <= 0 self.dv <= 0 + if self.current_frame: + self.log.warning("Flushed transmit frame during reset: %s", self.current_frame) + self.current_frame.handle_tx_complete() + self.current_frame = None + if self.queue.empty(): self.idle_event.set() else: @@ -248,6 +254,7 @@ class GmiiSource(Reset): frame = self.queue.get_nowait() self.queue_occupancy_bytes -= len(frame) self.queue_occupancy_frames -= 1 + self.current_frame = frame frame.sim_time_start = get_sim_time() frame.sim_time_sfd = None frame.sim_time_end = None @@ -284,6 +291,7 @@ class GmiiSource(Reset): frame.sim_time_end = get_sim_time() frame.handle_tx_complete() frame = None + self.current_frame = None else: self.data <= 0 if self.er is not None: diff --git a/cocotbext/eth/mii.py b/cocotbext/eth/mii.py index 64088a4..a763d31 100644 --- a/cocotbext/eth/mii.py +++ b/cocotbext/eth/mii.py @@ -55,6 +55,7 @@ class MiiSource(Reset): self.active = False self.queue = Queue() + self.current_frame = None self.idle_event = Event() self.idle_event.set() @@ -124,6 +125,11 @@ class MiiSource(Reset): self.er <= 0 self.dv <= 0 + if self.current_frame: + self.log.warning("Flushed transmit frame during reset: %s", self.current_frame) + self.current_frame.handle_tx_complete() + self.current_frame = None + if self.queue.empty(): self.idle_event.set() else: @@ -149,6 +155,7 @@ class MiiSource(Reset): frame = self.queue.get_nowait() self.queue_occupancy_bytes -= len(frame) self.queue_occupancy_frames -= 1 + self.current_frame = frame frame.sim_time_start = get_sim_time() frame.sim_time_sfd = None frame.sim_time_end = None @@ -181,6 +188,7 @@ class MiiSource(Reset): frame.sim_time_end = get_sim_time() frame.handle_tx_complete() frame = None + self.current_frame = None else: self.data <= 0 if self.er is not None: diff --git a/cocotbext/eth/rgmii.py b/cocotbext/eth/rgmii.py index a40e476..1c8cf95 100644 --- a/cocotbext/eth/rgmii.py +++ b/cocotbext/eth/rgmii.py @@ -57,6 +57,7 @@ class RgmiiSource(Reset): self.active = False self.queue = Queue() + self.current_frame = None self.idle_event = Event() self.idle_event.set() @@ -122,6 +123,11 @@ class RgmiiSource(Reset): self.data <= 0 self.ctrl <= 0 + if self.current_frame: + self.log.warning("Flushed transmit frame during reset: %s", self.current_frame) + self.current_frame.handle_tx_complete() + self.current_frame = None + if self.queue.empty(): self.idle_event.set() else: @@ -154,6 +160,7 @@ class RgmiiSource(Reset): frame = self.queue.get_nowait() self.queue_occupancy_bytes -= len(frame) self.queue_occupancy_frames -= 1 + self.current_frame = frame frame.sim_time_start = get_sim_time() frame.sim_time_sfd = None frame.sim_time_end = None @@ -189,6 +196,7 @@ class RgmiiSource(Reset): frame.sim_time_end = get_sim_time() frame.handle_tx_complete() frame = None + self.current_frame = None else: d = 0 er = 0 diff --git a/cocotbext/eth/xgmii.py b/cocotbext/eth/xgmii.py index bc19293..c417d70 100644 --- a/cocotbext/eth/xgmii.py +++ b/cocotbext/eth/xgmii.py @@ -154,6 +154,7 @@ class XgmiiSource(Reset): self.active = False self.queue = Queue() + self.current_frame = None self.idle_event = Event() self.idle_event.set() @@ -227,6 +228,11 @@ class XgmiiSource(Reset): self.data <= 0 self.ctrl <= 0 + if self.current_frame: + self.log.warning("Flushed transmit frame during reset: %s", self.current_frame) + self.current_frame.handle_tx_complete() + self.current_frame = None + if self.queue.empty(): self.idle_event.set() else: @@ -259,6 +265,7 @@ class XgmiiSource(Reset): frame = self.queue.get_nowait() self.queue_occupancy_bytes -= len(frame) self.queue_occupancy_frames -= 1 + self.current_frame = frame frame.sim_time_start = get_sim_time() frame.sim_time_sfd = None frame.sim_time_end = None @@ -310,6 +317,7 @@ class XgmiiSource(Reset): frame.sim_time_end = get_sim_time() frame.handle_tx_complete() frame = None + self.current_frame = None else: d_val |= XgmiiCtrl.IDLE << k*8 c_val |= 1 << k