6 Commits

Author SHA1 Message Date
Alex Forencich
6a35c31b4b Release v0.1.18 2021-11-07 12:40:42 -08:00
Alex Forencich
73fe54705f Remove deprecated assignments 2021-11-07 01:21:39 -08:00
Alex Forencich
448451e274 Add BASE-R related mappings 2021-10-15 02:00:03 -07:00
Alex Forencich
21c2c05c57 Normalize names 2021-10-14 19:13:51 -07:00
Alex Forencich
ab84a3b100 Add cocotb framework classifier 2021-08-31 14:43:03 -07:00
Alex Forencich
0f3060b9ba Bump to dev version 2021-08-31 01:04:20 -07:00
9 changed files with 105 additions and 66 deletions

View File

@@ -42,12 +42,12 @@ class XgmiiCtrl(enum.IntEnum):
TERM = 0xfd TERM = 0xfd
ERROR = 0xfe ERROR = 0xfe
SEQ_OS = 0x9c SEQ_OS = 0x9c
RES0 = 0x1c RES_0 = 0x1c
RES1 = 0x3c RES_1 = 0x3c
RES2 = 0x7c RES_2 = 0x7c
RES3 = 0xbc RES_3 = 0xbc
RES4 = 0xdc RES_4 = 0xdc
RES5 = 0xf7 RES_5 = 0xf7
SIG_OS = 0x5c SIG_OS = 0x5c
@@ -93,3 +93,41 @@ class BaseRBlockType(enum.IntEnum):
TERM_5 = 0xd2 # C7 C6 D4 D3 D2 D1 D0 BT TERM_5 = 0xd2 # C7 C6 D4 D3 D2 D1 D0 BT
TERM_6 = 0xe1 # C7 D5 D4 D3 D2 D1 D0 BT TERM_6 = 0xe1 # C7 D5 D4 D3 D2 D1 D0 BT
TERM_7 = 0xff # D6 D5 D4 D3 D2 D1 D0 BT TERM_7 = 0xff # D6 D5 D4 D3 D2 D1 D0 BT
xgmii_ctrl_to_baser_mapping = {
XgmiiCtrl.IDLE: BaseRCtrl.IDLE,
XgmiiCtrl.LPI: BaseRCtrl.LPI,
XgmiiCtrl.ERROR: BaseRCtrl.ERROR,
XgmiiCtrl.RES_0: BaseRCtrl.RES_0,
XgmiiCtrl.RES_1: BaseRCtrl.RES_1,
XgmiiCtrl.RES_2: BaseRCtrl.RES_2,
XgmiiCtrl.RES_3: BaseRCtrl.RES_3,
XgmiiCtrl.RES_4: BaseRCtrl.RES_4,
XgmiiCtrl.RES_5: BaseRCtrl.RES_5,
}
baser_ctrl_to_xgmii_mapping = {
BaseRCtrl.IDLE: XgmiiCtrl.IDLE,
BaseRCtrl.LPI: XgmiiCtrl.LPI,
BaseRCtrl.ERROR: XgmiiCtrl.ERROR,
BaseRCtrl.RES_0: XgmiiCtrl.RES_0,
BaseRCtrl.RES_1: XgmiiCtrl.RES_1,
BaseRCtrl.RES_2: XgmiiCtrl.RES_2,
BaseRCtrl.RES_3: XgmiiCtrl.RES_3,
BaseRCtrl.RES_4: XgmiiCtrl.RES_4,
BaseRCtrl.RES_5: XgmiiCtrl.RES_5,
}
block_type_term_lane_mapping = {
BaseRBlockType.TERM_0: 0,
BaseRBlockType.TERM_1: 1,
BaseRBlockType.TERM_2: 2,
BaseRBlockType.TERM_3: 3,
BaseRBlockType.TERM_4: 4,
BaseRBlockType.TERM_5: 5,
BaseRBlockType.TERM_6: 6,
BaseRBlockType.TERM_7: 7,
}

View File

@@ -253,7 +253,7 @@ class EthMacTx(Reset):
self._run_ts_cr = None self._run_ts_cr = None
if self.ptp_ts_valid: if self.ptp_ts_valid:
self.ptp_ts_valid <= 0 self.ptp_ts_valid.value = 0
self.active = False self.active = False
@@ -324,14 +324,14 @@ class EthMacTx(Reset):
async def _run_ts(self): async def _run_ts(self):
while True: while True:
await RisingEdge(self.clock) await RisingEdge(self.clock)
self.ptp_ts_valid <= 0 self.ptp_ts_valid.value = 0
if not self.ts_queue.empty(): if not self.ts_queue.empty():
ts, tag = self.ts_queue.get_nowait() ts, tag = self.ts_queue.get_nowait()
self.ptp_ts <= ts self.ptp_ts.value = ts
if self.ptp_ts_tag is not None: if self.ptp_ts_tag is not None:
self.ptp_ts_tag <= tag self.ptp_ts_tag.value = tag
self.ptp_ts_valid <= 1 self.ptp_ts_valid.value = 1
class EthMacRx(Reset): class EthMacRx(Reset):

View File

@@ -239,10 +239,10 @@ class GmiiSource(Reset):
self._run_cr = None self._run_cr = None
self.active = False self.active = False
self.data <= 0 self.data.value = 0
if self.er is not None: if self.er is not None:
self.er <= 0 self.er.value = 0
self.dv <= 0 self.dv.value = 0
if self.current_frame: if self.current_frame:
self.log.warning("Flushed transmit frame during reset: %s", self.current_frame) self.log.warning("Flushed transmit frame during reset: %s", self.current_frame)
@@ -308,10 +308,10 @@ class GmiiSource(Reset):
d = frame_data[frame_offset] 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.value = d
if self.er is not None: if self.er is not None:
self.er <= frame_error[frame_offset] self.er.value = frame_error[frame_offset]
self.dv <= 1 self.dv.value = 1
frame_offset += 1 frame_offset += 1
if frame_offset >= len(frame_data): if frame_offset >= len(frame_data):
@@ -321,10 +321,10 @@ class GmiiSource(Reset):
frame = None frame = None
self.current_frame = None self.current_frame = None
else: else:
self.data <= 0 self.data.value = 0
if self.er is not None: if self.er is not None:
self.er <= 0 self.er.value = 0
self.dv <= 0 self.dv.value = 0
self.active = False self.active = False
self.idle_event.set() self.idle_event.set()
@@ -536,8 +536,8 @@ class GmiiPhy:
while True: while True:
await t await t
self.rx_clk <= 1 self.rx_clk.value = 1
self.tx_clk <= 1 self.tx_clk.value = 1
await t await t
self.rx_clk <= 0 self.rx_clk.value = 0
self.tx_clk <= 0 self.tx_clk.value = 0

View File

@@ -140,10 +140,10 @@ class MiiSource(Reset):
self._run_cr = None self._run_cr = None
self.active = False self.active = False
self.data <= 0 self.data.value = 0
if self.er is not None: if self.er is not None:
self.er <= 0 self.er.value = 0
self.dv <= 0 self.dv.value = 0
if self.current_frame: if self.current_frame:
self.log.warning("Flushed transmit frame during reset: %s", self.current_frame) self.log.warning("Flushed transmit frame during reset: %s", self.current_frame)
@@ -202,10 +202,10 @@ class MiiSource(Reset):
d = frame_data[frame_offset] 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.value = d
if self.er is not None: if self.er is not None:
self.er <= frame_error[frame_offset] self.er.value = frame_error[frame_offset]
self.dv <= 1 self.dv.value = 1
frame_offset += 1 frame_offset += 1
if frame_offset >= len(frame_data): if frame_offset >= len(frame_data):
@@ -215,10 +215,10 @@ class MiiSource(Reset):
frame = None frame = None
self.current_frame = None self.current_frame = None
else: else:
self.data <= 0 self.data.value = 0
if self.er is not None: if self.er is not None:
self.er <= 0 self.er.value = 0
self.dv <= 0 self.dv.value = 0
self.active = False self.active = False
self.idle_event.set() self.idle_event.set()
@@ -410,8 +410,8 @@ class MiiPhy:
while True: while True:
await t await t
self.tx_clk <= 1 self.tx_clk.value = 1
self.rx_clk <= 1 self.rx_clk.value = 1
await t await t
self.tx_clk <= 0 self.tx_clk.value = 0
self.rx_clk <= 0 self.rx_clk.value = 0

View File

@@ -195,13 +195,13 @@ class PtpClock(Reset):
self.ts_64_fns = 0 self.ts_64_fns = 0
self.drift_cnt = 0 self.drift_cnt = 0
if self.ts_96 is not None: if self.ts_96 is not None:
self.ts_96 <= 0 self.ts_96.value = 0
if self.ts_64 is not None: if self.ts_64 is not None:
self.ts_64 <= 0 self.ts_64.value = 0
if self.ts_step is not None: if self.ts_step is not None:
self.ts_step <= 0 self.ts_step.value = 0
if self.pps is not None: if self.pps is not None:
self.pps <= 0 self.pps.value = 0
else: else:
self.log.info("Reset de-asserted") self.log.info("Reset de-asserted")
if self._run_cr is None: if self._run_cr is None:
@@ -212,11 +212,11 @@ class PtpClock(Reset):
await RisingEdge(self.clock) await RisingEdge(self.clock)
if self.ts_step is not None: if self.ts_step is not None:
self.ts_step <= self.ts_updated self.ts_step.value = self.ts_updated
self.ts_updated = False self.ts_updated = False
if self.pps is not None: if self.pps is not None:
self.pps <= 0 self.pps.value = 0
# increment 96 bit timestamp # increment 96 bit timestamp
if self.ts_96 is not None or self.pps is not None: if self.ts_96 is not None or self.pps is not None:
@@ -229,13 +229,13 @@ class PtpClock(Reset):
self.ts_96_s += 1 self.ts_96_s += 1
t -= (1000000000 << 16) t -= (1000000000 << 16)
if self.pps is not None: if self.pps is not None:
self.pps <= 1 self.pps.value = 1
self.ts_96_fns = t & 0xffff self.ts_96_fns = t & 0xffff
self.ts_96_ns = t >> 16 self.ts_96_ns = t >> 16
if self.ts_96 is not None: if self.ts_96 is not None:
self.ts_96 <= (self.ts_96_s << 48) | (self.ts_96_ns << 16) | (self.ts_96_fns) self.ts_96.value = (self.ts_96_s << 48) | (self.ts_96_ns << 16) | (self.ts_96_fns)
# increment 64 bit timestamp # increment 64 bit timestamp
if self.ts_64 is not None: if self.ts_64 is not None:
@@ -247,7 +247,7 @@ class PtpClock(Reset):
self.ts_64_fns = t & 0xffff self.ts_64_fns = t & 0xffff
self.ts_64_ns = t >> 16 self.ts_64_ns = t >> 16
self.ts_64 <= (self.ts_64_ns << 16) | self.ts_64_fns self.ts_64.value = (self.ts_64_ns << 16) | self.ts_64_fns
if self.drift_rate: if self.drift_rate:
if self.drift_cnt > 0: if self.drift_cnt > 0:
@@ -286,7 +286,7 @@ class PtpClockSimTime:
if self.ts_64 is not None: if self.ts_64 is not None:
self.ts_64.setimmediatevalue(0) self.ts_64.setimmediatevalue(0)
if self.pps is not None: if self.pps is not None:
self.pps <= 0 self.pps.value = 0
self._run_cr = cocotb.fork(self._run()) self._run_cr = cocotb.fork(self._run())
@@ -321,12 +321,12 @@ class PtpClockSimTime:
self.ts_96_fns = self.ts_64_fns self.ts_96_fns = self.ts_64_fns
if self.ts_96 is not None: if self.ts_96 is not None:
self.ts_96 <= (self.ts_96_s << 48) | (self.ts_96_ns << 16) | self.ts_96_fns self.ts_96.value = (self.ts_96_s << 48) | (self.ts_96_ns << 16) | self.ts_96_fns
if self.ts_64 is not None: if self.ts_64 is not None:
self.ts_64 <= (self.ts_64_ns << 16) | self.ts_64_fns self.ts_64.value = (self.ts_64_ns << 16) | self.ts_64_fns
if self.pps is not None: if self.pps is not None:
self.pps <= int(self.last_ts_96_s != self.ts_96_s) self.pps.value = int(self.last_ts_96_s != self.ts_96_s)
self.last_ts_96_s = self.ts_96_s self.last_ts_96_s = self.ts_96_s

View File

@@ -140,8 +140,8 @@ class RgmiiSource(Reset):
self._run_cr = None self._run_cr = None
self.active = False self.active = False
self.data <= 0 self.data.value = 0
self.ctrl <= 0 self.ctrl.value = 0
if self.current_frame: if self.current_frame:
self.log.warning("Flushed transmit frame during reset: %s", self.current_frame) self.log.warning("Flushed transmit frame during reset: %s", self.current_frame)
@@ -170,8 +170,8 @@ class RgmiiSource(Reset):
await RisingEdge(self.clock) await RisingEdge(self.clock)
# send high nibble after rising edge, leading in to falling edge # send high nibble after rising edge, leading in to falling edge
self.data <= d >> 4 self.data.value = d >> 4
self.ctrl <= en ^ er self.ctrl.value = en ^ er
if self.enable is None or self.enable.value: if self.enable is None or self.enable.value:
if ifg_cnt > 0: if ifg_cnt > 0:
@@ -235,8 +235,8 @@ class RgmiiSource(Reset):
await FallingEdge(self.clock) await FallingEdge(self.clock)
# send low nibble after falling edge, leading in to rising edge # send low nibble after falling edge, leading in to rising edge
self.data <= d & 0x0F self.data.value = d & 0x0F
self.ctrl <= en self.ctrl.value = en
class RgmiiSink(Reset): class RgmiiSink(Reset):
@@ -448,6 +448,6 @@ class RgmiiPhy:
while True: while True:
await t await t
self.rx_clk <= 1 self.rx_clk.value = 1
await t await t
self.rx_clk <= 0 self.rx_clk.value = 0

View File

@@ -1 +1 @@
__version__ = "0.1.16" __version__ = "0.1.18"

View File

@@ -250,8 +250,8 @@ class XgmiiSource(Reset):
self._run_cr = None self._run_cr = None
self.active = False self.active = False
self.data <= 0 self.data.value = 0
self.ctrl <= 0 self.ctrl.value = 0
if self.current_frame: if self.current_frame:
self.log.warning("Flushed transmit frame during reset: %s", self.current_frame) self.log.warning("Flushed transmit frame during reset: %s", self.current_frame)
@@ -351,11 +351,11 @@ class XgmiiSource(Reset):
d_val |= XgmiiCtrl.IDLE << k*8 d_val |= XgmiiCtrl.IDLE << k*8
c_val |= 1 << k c_val |= 1 << k
self.data <= d_val self.data.value = d_val
self.ctrl <= c_val self.ctrl.value = c_val
else: else:
self.data <= self.idle_d self.data.value = self.idle_d
self.ctrl <= self.idle_c self.ctrl.value = self.idle_c
self.active = False self.active = False
self.idle_event.set() self.idle_event.set()

View File

@@ -17,9 +17,10 @@ long-description-content-type = text/markdown
platforms = any platforms = any
classifiers = classifiers =
Development Status :: 3 - Alpha Development Status :: 3 - Alpha
Programming Language :: Python :: 3 Framework :: cocotb
License :: OSI Approved :: MIT License License :: OSI Approved :: MIT License
Operating System :: OS Independent Operating System :: OS Independent
Programming Language :: Python :: 3
Topic :: Scientific/Engineering :: Electronic Design Automation (EDA) Topic :: Scientific/Engineering :: Electronic Design Automation (EDA)
[options] [options]