From a8a1bbde3025584c48d5672af5265f1cb8b09640 Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Thu, 24 Dec 2020 14:35:16 -0800 Subject: [PATCH] Add mii_mode attribute to GMII and RGMII models --- cocotbext/eth/gmii.py | 13 +++++++++++-- cocotbext/eth/rgmii.py | 15 ++++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/cocotbext/eth/gmii.py b/cocotbext/eth/gmii.py index 1eceb13..b3b7529 100644 --- a/cocotbext/eth/gmii.py +++ b/cocotbext/eth/gmii.py @@ -137,6 +137,7 @@ class GmiiSource(object): self.queue = deque() self.ifg = 12 + self.mii_mode = False self.queue_occupancy_bytes = 0 self.queue_occupancy_frames = 0 @@ -209,7 +210,10 @@ class GmiiSource(object): self.log.info("TX frame: %s", frame) frame.normalize() - if self.mii_select is not None and self.mii_select.value: + if self.mii_select is not None: + self.mii_mode = bool(self.mii_select.value.integer) + + if self.mii_mode: mii_data = [] mii_error = [] for b, e in zip(frame.data, frame.error): @@ -262,6 +266,8 @@ class GmiiSink(object): self.queue = deque() self.sync = Event() + self.mii_mode = False + self.queue_occupancy_bytes = 0 self.queue_occupancy_frames = 0 @@ -336,7 +342,10 @@ class GmiiSink(object): if not dv_val: # end of frame - if self.mii_select is not None and self.mii_select.value: + if self.mii_select is not None: + self.mii_mode = bool(self.mii_select.value.integer) + + if self.mii_mode: odd = True sync = False b = 0 diff --git a/cocotbext/eth/rgmii.py b/cocotbext/eth/rgmii.py index c4e953e..8da8607 100644 --- a/cocotbext/eth/rgmii.py +++ b/cocotbext/eth/rgmii.py @@ -56,6 +56,7 @@ class RgmiiSource(object): self.queue = deque() self.ifg = 12 + self.mii_mode = False self.queue_occupancy_bytes = 0 self.queue_occupancy_frames = 0 @@ -113,7 +114,7 @@ class RgmiiSource(object): self.ctrl <= 0 continue - if self.mii_select is None or not self.mii_select.value: + if not self.mii_mode: # send high nibble after rising edge, leading in to falling edge self.data <= d >> 4 self.ctrl <= en ^ er @@ -131,7 +132,10 @@ class RgmiiSource(object): self.log.info("TX frame: %s", frame) frame.normalize() - if self.mii_select is not None and self.mii_select.value: + if self.mii_select is not None: + self.mii_mode = bool(self.mii_select.value.integer) + + if self.mii_mode: mii_data = [] mii_error = [] for b, e in zip(frame.data, frame.error): @@ -187,6 +191,8 @@ class RgmiiSink(object): self.queue = deque() self.sync = Event() + self.mii_mode = False + self.queue_occupancy_bytes = 0 self.queue_occupancy_frames = 0 @@ -268,7 +274,10 @@ class RgmiiSink(object): if not dv_val: # end of frame - if self.mii_select is not None and self.mii_select.value: + if self.mii_select is not None: + self.mii_mode = bool(self.mii_select.value.integer) + + if self.mii_mode: odd = True sync = False b = 0