Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6a35c31b4b | ||
|
|
73fe54705f | ||
|
|
448451e274 | ||
|
|
21c2c05c57 | ||
|
|
ab84a3b100 | ||
|
|
0f3060b9ba |
@@ -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,
|
||||||
|
}
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
__version__ = "0.1.16"
|
__version__ = "0.1.18"
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
Reference in New Issue
Block a user