From 008d903bb97827a757987d1fce2d2f92ce514b28 Mon Sep 17 00:00:00 2001 From: Alex Forencich Date: Mon, 12 Apr 2021 15:10:52 -0700 Subject: [PATCH] Send data without using pop --- cocotbext/eth/eth_mac.py | 7 +++++-- cocotbext/eth/gmii.py | 29 ++++++++++++++++++----------- cocotbext/eth/mii.py | 26 +++++++++++++++----------- cocotbext/eth/rgmii.py | 29 ++++++++++++++++++----------- cocotbext/eth/xgmii.py | 9 ++++++--- 5 files changed, 62 insertions(+), 38 deletions(-) diff --git a/cocotbext/eth/eth_mac.py b/cocotbext/eth/eth_mac.py index c6b912c..80db83c 100644 --- a/cocotbext/eth/eth_mac.py +++ b/cocotbext/eth/eth_mac.py @@ -462,6 +462,7 @@ class EthMacRx(Reset): async def _run(self): frame = None + frame_offset = 0 tuser = 0 self.active = False @@ -477,6 +478,7 @@ class EthMacRx(Reset): frame.sim_time_sfd = None frame.sim_time_end = None self.log.info("TX frame: %s", frame) + frame_offset = 0 # wait for preamble time await Timer(self.time_scale*8*8//self.speed, 'step') @@ -499,11 +501,12 @@ class EthMacRx(Reset): cycle.tuser = tuser for offset in range(self.byte_lanes): - cycle.tdata |= (frame.data.pop(0) & self.byte_mask) << (offset * self.byte_size) + cycle.tdata |= (frame.data[frame_offset] & self.byte_mask) << (offset * self.byte_size) cycle.tkeep |= 1 << offset byte_count += 1 + frame_offset += 1 - if len(frame.data) == 0: + if frame_offset >= len(frame.data): cycle.tlast = 1 frame.sim_time_end = get_sim_time() frame.handle_tx_complete() diff --git a/cocotbext/eth/gmii.py b/cocotbext/eth/gmii.py index c1a3c92..0bd9a6f 100644 --- a/cocotbext/eth/gmii.py +++ b/cocotbext/eth/gmii.py @@ -258,6 +258,9 @@ class GmiiSource(Reset): async def _run(self): frame = None + frame_offset = 0 + frame_data = None + frame_error = None ifg_cnt = 0 self.active = False @@ -286,28 +289,32 @@ class GmiiSource(Reset): self.mii_mode = bool(self.mii_select.value.integer) if self.mii_mode: - mii_data = [] - mii_error = [] + # convert to MII + frame_data = [] + frame_error = [] for b, e in zip(frame.data, frame.error): - mii_data.append(b & 0x0F) - mii_data.append(b >> 4) - mii_error.append(e) - mii_error.append(e) - frame.data = mii_data - frame.error = mii_error + frame_data.append(b & 0x0F) + frame_data.append(b >> 4) + frame_error.append(e) + frame_error.append(e) + else: + frame_data = frame.data + frame_error = frame.error self.active = True + frame_offset = 0 if frame is not None: - d = frame.data.pop(0) + d = frame_data[frame_offset] if frame.sim_time_sfd is None and d in (EthPre.SFD, 0xD): frame.sim_time_sfd = get_sim_time() self.data <= d if self.er is not None: - self.er <= frame.error.pop(0) + self.er <= frame_error[frame_offset] self.dv <= 1 + frame_offset += 1 - if not frame.data: + if frame_offset >= len(frame_data): ifg_cnt = max(self.ifg, 1) frame.sim_time_end = get_sim_time() frame.handle_tx_complete() diff --git a/cocotbext/eth/mii.py b/cocotbext/eth/mii.py index 22b7e74..d6dc823 100644 --- a/cocotbext/eth/mii.py +++ b/cocotbext/eth/mii.py @@ -159,6 +159,9 @@ class MiiSource(Reset): async def _run(self): frame = None + frame_offset = 0 + frame_data = None + frame_error = None ifg_cnt = 0 self.active = False @@ -183,28 +186,29 @@ class MiiSource(Reset): self.log.info("TX frame: %s", frame) frame.normalize() - mii_data = [] - mii_error = [] + # convert to MII + frame_data = [] + frame_error = [] for b, e in zip(frame.data, frame.error): - mii_data.append(b & 0x0F) - mii_data.append(b >> 4) - mii_error.append(e) - mii_error.append(e) - frame.data = mii_data - frame.error = mii_error + frame_data.append(b & 0x0F) + frame_data.append(b >> 4) + frame_error.append(e) + frame_error.append(e) self.active = True + frame_offset = 0 if frame is not None: - d = frame.data.pop(0) + d = frame_data[frame_offset] if frame.sim_time_sfd is None and d == 0xD: frame.sim_time_sfd = get_sim_time() self.data <= d if self.er is not None: - self.er <= frame.error.pop(0) + self.er <= frame_error[frame_offset] self.dv <= 1 + frame_offset += 1 - if not frame.data: + if frame_offset >= len(frame_data): ifg_cnt = max(self.ifg, 1) frame.sim_time_end = get_sim_time() frame.handle_tx_complete() diff --git a/cocotbext/eth/rgmii.py b/cocotbext/eth/rgmii.py index 2befbc4..c9de46c 100644 --- a/cocotbext/eth/rgmii.py +++ b/cocotbext/eth/rgmii.py @@ -157,6 +157,9 @@ class RgmiiSource(Reset): async def _run(self): frame = None + frame_offset = 0 + frame_data = None + frame_error = None ifg_cnt = 0 self.active = False d = 0 @@ -192,27 +195,31 @@ class RgmiiSource(Reset): self.mii_mode = bool(self.mii_select.value.integer) if self.mii_mode: - mii_data = [] - mii_error = [] + # convert to MII + frame_data = [] + frame_error = [] for b, e in zip(frame.data, frame.error): - mii_data.append((b & 0x0F)*0x11) - mii_data.append((b >> 4)*0x11) - mii_error.append(e) - mii_error.append(e) - frame.data = mii_data - frame.error = mii_error + frame_data.append((b & 0x0F)*0x11) + frame_data.append((b >> 4)*0x11) + frame_error.append(e) + frame_error.append(e) + else: + frame_data = frame.data + frame_error = frame.error self.active = True + frame_offset = 0 if frame is not None: - d = frame.data.pop(0) - er = frame.error.pop(0) + d = frame_data[frame_offset] + er = frame_error[frame_offset] en = 1 + frame_offset += 1 if frame.sim_time_sfd is None and d in (EthPre.SFD, 0xD, 0xDD): frame.sim_time_sfd = get_sim_time() - if not frame.data: + if frame_offset >= len(frame_data): ifg_cnt = max(self.ifg, 1) frame.sim_time_end = get_sim_time() frame.handle_tx_complete() diff --git a/cocotbext/eth/xgmii.py b/cocotbext/eth/xgmii.py index 033eede..076b239 100644 --- a/cocotbext/eth/xgmii.py +++ b/cocotbext/eth/xgmii.py @@ -262,6 +262,7 @@ class XgmiiSource(Reset): async def _run(self): frame = None + frame_offset = 0 ifg_cnt = 0 deficit_idle_cnt = 0 self.active = False @@ -316,6 +317,7 @@ class XgmiiSource(Reset): deficit_idle_cnt = max(deficit_idle_cnt+ifg_cnt, 0) ifg_cnt = 0 self.active = True + frame_offset = 0 else: # clear counters deficit_idle_cnt = 0 @@ -327,13 +329,14 @@ class XgmiiSource(Reset): for k in range(self.byte_width): if frame is not None: - d = frame.data.pop(0) + d = frame.data[frame_offset] if frame.sim_time_sfd is None and d == EthPre.SFD: frame.sim_time_sfd = get_sim_time() d_val |= d << k*8 - c_val |= frame.ctrl.pop(0) << k + c_val |= frame.ctrl[frame_offset] << k + frame_offset += 1 - if not frame.data: + if frame_offset >= len(frame.data): ifg_cnt = max(self.ifg - (self.byte_width-k), 0) frame.sim_time_end = get_sim_time() frame.handle_tx_complete()