1
0
Fork 0

cxp downconn: cleanup & add reason for comma_det

This commit is contained in:
morgan 2024-08-12 11:13:05 +08:00
parent e055a11e1c
commit 2cd1da81c1
1 changed files with 14 additions and 11 deletions

View File

@ -286,8 +286,8 @@ class QPLL(Module):
# Warning: Xilinx transceivers are LSB first, and comma needs to be flipped # Warning: Xilinx transceivers are LSB first, and comma needs to be flipped
# compared to the usual 8b10b binary representation. # compared to the usual 8b10b binary representation.
class Comma_Detector(Module): class Comma_Detector(Module):
def __init__(self, comma, check_period=100_000, width=20): def __init__(self, comma, check_period=100_000):
self.data = Signal(width) self.data = Signal(20)
self.rxinit_done = Signal() self.rxinit_done = Signal()
self.aligner_en_rxclk = Signal() self.aligner_en_rxclk = Signal()
@ -296,6 +296,12 @@ class Comma_Detector(Module):
# # # # # #
# The built-in RXBYTEISALIGNED can be falsely asserted at linerate higher than 5Gbps
# - UG476 (v1.12.1) p.228
# The validity of data & comma are checked externally
aligned = Signal() aligned = Signal()
valid_data = Signal() valid_data = Signal()
aligned_rxclk = Signal() aligned_rxclk = Signal()
@ -308,7 +314,6 @@ class Comma_Detector(Module):
self.submodules.check_ps = check_ps = PulseSynchronizer("sys", "cxp_gtx_rx") self.submodules.check_ps = check_ps = PulseSynchronizer("sys", "cxp_gtx_rx")
comma_n = ~comma & 0b1111111111 comma_n = ~comma & 0b1111111111
self.sync.cxp_gtx_rx += [ self.sync.cxp_gtx_rx += [
If(check_ps.o, If(check_ps.o,
aligned_rxclk.eq(0), aligned_rxclk.eq(0),
@ -327,7 +332,6 @@ class Comma_Detector(Module):
check_counter = Signal(reset=check_period-1, max=check_period) check_counter = Signal(reset=check_period-1, max=check_period)
check = Signal() check = Signal()
self.sync += [ self.sync += [
check.eq(0), check.eq(0),
If(check_counter == 0, If(check_counter == 0,
@ -338,12 +342,11 @@ class Comma_Detector(Module):
) )
] ]
self.submodules.fsm = fsm = FSM(reset_state="IDLE") self.submodules.fsm = fsm = FSM(reset_state="WAIT_COMMA_ALIGN")
aligner_en = Signal() aligner_en = Signal()
self.specials += MultiReg(aligner_en, self.aligner_en_rxclk, odomain="cxp_gtx_rx") self.specials += MultiReg(aligner_en, self.aligner_en_rxclk, odomain="cxp_gtx_rx")
fsm.act("WAIT_COMMA_ALIGN",
fsm.act("IDLE",
aligner_en.eq(1), aligner_en.eq(1),
If(check, If(check,
check_ps.i.eq(1), check_ps.i.eq(1),
@ -363,7 +366,7 @@ class Comma_Detector(Module):
NextState("READY"), NextState("READY"),
).Else( ).Else(
self.restart.eq(1), self.restart.eq(1),
NextState("IDLE"), NextState("WAIT_COMMA_ALIGN"),
) )
) )
) )
@ -374,7 +377,7 @@ class Comma_Detector(Module):
check_ps.i.eq(1), check_ps.i.eq(1),
If(~(aligned & valid_data), If(~(aligned & valid_data),
self.restart.eq(1), self.restart.eq(1),
NextState("IDLE"), NextState("WAIT_COMMA_ALIGN"),
) )
) )
) )
@ -564,7 +567,7 @@ class GTX(Module):
# RX Byte and Word Alignment Attributes # RX Byte and Word Alignment Attributes
p_ALIGN_COMMA_DOUBLE="FALSE", p_ALIGN_COMMA_DOUBLE="FALSE",
p_ALIGN_COMMA_ENABLE=0b1111111111, p_ALIGN_COMMA_ENABLE=0b1111111111,
p_ALIGN_COMMA_WORD=2, # allow rxslide to shift 20 times p_ALIGN_COMMA_WORD=2, # align comma to rxdata[:10] only
p_ALIGN_MCOMMA_DET="TRUE", p_ALIGN_MCOMMA_DET="TRUE",
p_ALIGN_MCOMMA_VALUE=0b1010000011, p_ALIGN_MCOMMA_VALUE=0b1010000011,
p_ALIGN_PCOMMA_DET="TRUE", p_ALIGN_PCOMMA_DET="TRUE",
@ -575,7 +578,7 @@ class GTX(Module):
p_RX_SIG_VALID_DLY=10, p_RX_SIG_VALID_DLY=10,
i_RXPCOMMAALIGNEN=comma_aligner_en, i_RXPCOMMAALIGNEN=comma_aligner_en,
i_RXMCOMMAALIGNEN=comma_aligner_en, i_RXMCOMMAALIGNEN=comma_aligner_en,
i_RXCOMMADETEN=1, # enable auto word alignment i_RXCOMMADETEN=1,
# RX 8B/10B Decoder Attributes # RX 8B/10B Decoder Attributes
p_RX_DISPERR_SEQ_MATCH="FALSE", p_RX_DISPERR_SEQ_MATCH="FALSE",