Send data without using pop
This commit is contained in:
@@ -462,6 +462,7 @@ class EthMacRx(Reset):
|
|||||||
|
|
||||||
async def _run(self):
|
async def _run(self):
|
||||||
frame = None
|
frame = None
|
||||||
|
frame_offset = 0
|
||||||
tuser = 0
|
tuser = 0
|
||||||
self.active = False
|
self.active = False
|
||||||
|
|
||||||
@@ -477,6 +478,7 @@ class EthMacRx(Reset):
|
|||||||
frame.sim_time_sfd = None
|
frame.sim_time_sfd = None
|
||||||
frame.sim_time_end = None
|
frame.sim_time_end = None
|
||||||
self.log.info("TX frame: %s", frame)
|
self.log.info("TX frame: %s", frame)
|
||||||
|
frame_offset = 0
|
||||||
|
|
||||||
# wait for preamble time
|
# wait for preamble time
|
||||||
await Timer(self.time_scale*8*8//self.speed, 'step')
|
await Timer(self.time_scale*8*8//self.speed, 'step')
|
||||||
@@ -499,11 +501,12 @@ class EthMacRx(Reset):
|
|||||||
cycle.tuser = tuser
|
cycle.tuser = tuser
|
||||||
|
|
||||||
for offset in range(self.byte_lanes):
|
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
|
cycle.tkeep |= 1 << offset
|
||||||
byte_count += 1
|
byte_count += 1
|
||||||
|
frame_offset += 1
|
||||||
|
|
||||||
if len(frame.data) == 0:
|
if frame_offset >= len(frame.data):
|
||||||
cycle.tlast = 1
|
cycle.tlast = 1
|
||||||
frame.sim_time_end = get_sim_time()
|
frame.sim_time_end = get_sim_time()
|
||||||
frame.handle_tx_complete()
|
frame.handle_tx_complete()
|
||||||
|
|||||||
@@ -258,6 +258,9 @@ class GmiiSource(Reset):
|
|||||||
|
|
||||||
async def _run(self):
|
async def _run(self):
|
||||||
frame = None
|
frame = None
|
||||||
|
frame_offset = 0
|
||||||
|
frame_data = None
|
||||||
|
frame_error = None
|
||||||
ifg_cnt = 0
|
ifg_cnt = 0
|
||||||
self.active = False
|
self.active = False
|
||||||
|
|
||||||
@@ -286,28 +289,32 @@ class GmiiSource(Reset):
|
|||||||
self.mii_mode = bool(self.mii_select.value.integer)
|
self.mii_mode = bool(self.mii_select.value.integer)
|
||||||
|
|
||||||
if self.mii_mode:
|
if self.mii_mode:
|
||||||
mii_data = []
|
# convert to MII
|
||||||
mii_error = []
|
frame_data = []
|
||||||
|
frame_error = []
|
||||||
for b, e in zip(frame.data, frame.error):
|
for b, e in zip(frame.data, frame.error):
|
||||||
mii_data.append(b & 0x0F)
|
frame_data.append(b & 0x0F)
|
||||||
mii_data.append(b >> 4)
|
frame_data.append(b >> 4)
|
||||||
mii_error.append(e)
|
frame_error.append(e)
|
||||||
mii_error.append(e)
|
frame_error.append(e)
|
||||||
frame.data = mii_data
|
else:
|
||||||
frame.error = mii_error
|
frame_data = frame.data
|
||||||
|
frame_error = frame.error
|
||||||
|
|
||||||
self.active = True
|
self.active = True
|
||||||
|
frame_offset = 0
|
||||||
|
|
||||||
if frame is not None:
|
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):
|
if frame.sim_time_sfd is None and d in (EthPre.SFD, 0xD):
|
||||||
frame.sim_time_sfd = get_sim_time()
|
frame.sim_time_sfd = get_sim_time()
|
||||||
self.data <= d
|
self.data <= d
|
||||||
if self.er is not None:
|
if self.er is not None:
|
||||||
self.er <= frame.error.pop(0)
|
self.er <= frame_error[frame_offset]
|
||||||
self.dv <= 1
|
self.dv <= 1
|
||||||
|
frame_offset += 1
|
||||||
|
|
||||||
if not frame.data:
|
if frame_offset >= len(frame_data):
|
||||||
ifg_cnt = max(self.ifg, 1)
|
ifg_cnt = max(self.ifg, 1)
|
||||||
frame.sim_time_end = get_sim_time()
|
frame.sim_time_end = get_sim_time()
|
||||||
frame.handle_tx_complete()
|
frame.handle_tx_complete()
|
||||||
|
|||||||
@@ -159,6 +159,9 @@ class MiiSource(Reset):
|
|||||||
|
|
||||||
async def _run(self):
|
async def _run(self):
|
||||||
frame = None
|
frame = None
|
||||||
|
frame_offset = 0
|
||||||
|
frame_data = None
|
||||||
|
frame_error = None
|
||||||
ifg_cnt = 0
|
ifg_cnt = 0
|
||||||
self.active = False
|
self.active = False
|
||||||
|
|
||||||
@@ -183,28 +186,29 @@ class MiiSource(Reset):
|
|||||||
self.log.info("TX frame: %s", frame)
|
self.log.info("TX frame: %s", frame)
|
||||||
frame.normalize()
|
frame.normalize()
|
||||||
|
|
||||||
mii_data = []
|
# convert to MII
|
||||||
mii_error = []
|
frame_data = []
|
||||||
|
frame_error = []
|
||||||
for b, e in zip(frame.data, frame.error):
|
for b, e in zip(frame.data, frame.error):
|
||||||
mii_data.append(b & 0x0F)
|
frame_data.append(b & 0x0F)
|
||||||
mii_data.append(b >> 4)
|
frame_data.append(b >> 4)
|
||||||
mii_error.append(e)
|
frame_error.append(e)
|
||||||
mii_error.append(e)
|
frame_error.append(e)
|
||||||
frame.data = mii_data
|
|
||||||
frame.error = mii_error
|
|
||||||
|
|
||||||
self.active = True
|
self.active = True
|
||||||
|
frame_offset = 0
|
||||||
|
|
||||||
if frame is not None:
|
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:
|
if frame.sim_time_sfd is None and d == 0xD:
|
||||||
frame.sim_time_sfd = get_sim_time()
|
frame.sim_time_sfd = get_sim_time()
|
||||||
self.data <= d
|
self.data <= d
|
||||||
if self.er is not None:
|
if self.er is not None:
|
||||||
self.er <= frame.error.pop(0)
|
self.er <= frame_error[frame_offset]
|
||||||
self.dv <= 1
|
self.dv <= 1
|
||||||
|
frame_offset += 1
|
||||||
|
|
||||||
if not frame.data:
|
if frame_offset >= len(frame_data):
|
||||||
ifg_cnt = max(self.ifg, 1)
|
ifg_cnt = max(self.ifg, 1)
|
||||||
frame.sim_time_end = get_sim_time()
|
frame.sim_time_end = get_sim_time()
|
||||||
frame.handle_tx_complete()
|
frame.handle_tx_complete()
|
||||||
|
|||||||
@@ -157,6 +157,9 @@ class RgmiiSource(Reset):
|
|||||||
|
|
||||||
async def _run(self):
|
async def _run(self):
|
||||||
frame = None
|
frame = None
|
||||||
|
frame_offset = 0
|
||||||
|
frame_data = None
|
||||||
|
frame_error = None
|
||||||
ifg_cnt = 0
|
ifg_cnt = 0
|
||||||
self.active = False
|
self.active = False
|
||||||
d = 0
|
d = 0
|
||||||
@@ -192,27 +195,31 @@ class RgmiiSource(Reset):
|
|||||||
self.mii_mode = bool(self.mii_select.value.integer)
|
self.mii_mode = bool(self.mii_select.value.integer)
|
||||||
|
|
||||||
if self.mii_mode:
|
if self.mii_mode:
|
||||||
mii_data = []
|
# convert to MII
|
||||||
mii_error = []
|
frame_data = []
|
||||||
|
frame_error = []
|
||||||
for b, e in zip(frame.data, frame.error):
|
for b, e in zip(frame.data, frame.error):
|
||||||
mii_data.append((b & 0x0F)*0x11)
|
frame_data.append((b & 0x0F)*0x11)
|
||||||
mii_data.append((b >> 4)*0x11)
|
frame_data.append((b >> 4)*0x11)
|
||||||
mii_error.append(e)
|
frame_error.append(e)
|
||||||
mii_error.append(e)
|
frame_error.append(e)
|
||||||
frame.data = mii_data
|
else:
|
||||||
frame.error = mii_error
|
frame_data = frame.data
|
||||||
|
frame_error = frame.error
|
||||||
|
|
||||||
self.active = True
|
self.active = True
|
||||||
|
frame_offset = 0
|
||||||
|
|
||||||
if frame is not None:
|
if frame is not None:
|
||||||
d = frame.data.pop(0)
|
d = frame_data[frame_offset]
|
||||||
er = frame.error.pop(0)
|
er = frame_error[frame_offset]
|
||||||
en = 1
|
en = 1
|
||||||
|
frame_offset += 1
|
||||||
|
|
||||||
if frame.sim_time_sfd is None and d in (EthPre.SFD, 0xD, 0xDD):
|
if frame.sim_time_sfd is None and d in (EthPre.SFD, 0xD, 0xDD):
|
||||||
frame.sim_time_sfd = get_sim_time()
|
frame.sim_time_sfd = get_sim_time()
|
||||||
|
|
||||||
if not frame.data:
|
if frame_offset >= len(frame_data):
|
||||||
ifg_cnt = max(self.ifg, 1)
|
ifg_cnt = max(self.ifg, 1)
|
||||||
frame.sim_time_end = get_sim_time()
|
frame.sim_time_end = get_sim_time()
|
||||||
frame.handle_tx_complete()
|
frame.handle_tx_complete()
|
||||||
|
|||||||
@@ -262,6 +262,7 @@ class XgmiiSource(Reset):
|
|||||||
|
|
||||||
async def _run(self):
|
async def _run(self):
|
||||||
frame = None
|
frame = None
|
||||||
|
frame_offset = 0
|
||||||
ifg_cnt = 0
|
ifg_cnt = 0
|
||||||
deficit_idle_cnt = 0
|
deficit_idle_cnt = 0
|
||||||
self.active = False
|
self.active = False
|
||||||
@@ -316,6 +317,7 @@ class XgmiiSource(Reset):
|
|||||||
deficit_idle_cnt = max(deficit_idle_cnt+ifg_cnt, 0)
|
deficit_idle_cnt = max(deficit_idle_cnt+ifg_cnt, 0)
|
||||||
ifg_cnt = 0
|
ifg_cnt = 0
|
||||||
self.active = True
|
self.active = True
|
||||||
|
frame_offset = 0
|
||||||
else:
|
else:
|
||||||
# clear counters
|
# clear counters
|
||||||
deficit_idle_cnt = 0
|
deficit_idle_cnt = 0
|
||||||
@@ -327,13 +329,14 @@ class XgmiiSource(Reset):
|
|||||||
|
|
||||||
for k in range(self.byte_width):
|
for k in range(self.byte_width):
|
||||||
if frame is not None:
|
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:
|
if frame.sim_time_sfd is None and d == EthPre.SFD:
|
||||||
frame.sim_time_sfd = get_sim_time()
|
frame.sim_time_sfd = get_sim_time()
|
||||||
d_val |= d << k*8
|
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)
|
ifg_cnt = max(self.ifg - (self.byte_width-k), 0)
|
||||||
frame.sim_time_end = get_sim_time()
|
frame.sim_time_end = get_sim_time()
|
||||||
frame.handle_tx_complete()
|
frame.handle_tx_complete()
|
||||||
|
|||||||
Reference in New Issue
Block a user