ofb_pa_gty: Architecture and Design Description¶
1. Block diagram¶
FreeRunClk, Rst RefClk (IBUFDS_GTE5 outside)
| |
v v
PhyTx_* ---> +----------------------------------------------+ ---> Gt_TxP / Gt_TxN
(LaneClk) | ofb_gtw (Versal Transceivers Wizard, 1 quad) |
PhyRx_* <--- | reset controller, 4 channels: 8B/10B, comma | <--- Gt_RxP / Gt_RxN
| alignment, RX elastic buffer, clock corr. |
+----------------------------------------------+
| QUAD0_TX0_outclk | rst_tx_done, rst_rx_done, rxelecidle, rxbyteisaligned
v v
BUFG_GT ---> LaneClk ---> olo_ft_sync -----> LaneRst, PhyRx_Valid, Phy_NoSignal, status
(CLR = TX_clr_out)
2. Clocking¶
The transmit output clock of channel 0 (TXOUTCLKPMA, 6.25 Gbit/s / 40 bits = 156.25 MHz) drives one BUFG_GT. Its
output is the user clock of all eight transmitters and receivers of the quad and LaneClk of the core. The receive
elastic buffers cross from the recovered clocks to this clock and remove or insert SKIP words (clock correction
sequence of four symbols, RX_CC_LEN_SEQ 4). The wizard reset controller clears the BUFG_GT (INTF0_TX_clr_out)
until the transmit PLL is locked and holds the receivers in reset until their PMA reset is done.
3. Channel mapping¶
| Core port (lane l) | Transceiver channel l |
|---|---|
PhyTx_Data word l |
ch_txdata(31:0) |
PhyTx_K flags l |
ch_txctrl2(3:0) (K character per byte); ch_txctrl0, ch_txctrl1 zero (normal disparity) |
Phy_TxEnable(l) |
ch_txelecidle = not enable |
Phy_RxInvert(l) |
ch_rxpolarity |
Phy_CdrEnable(l) |
ch_rxcdrhold = not enable |
PhyRx_Data word l |
ch_rxdata(31:0) |
PhyRx_K flags l |
ch_rxctrl0(3:0) (K character per byte) |
PhyRx_DispErr flags l |
ch_rxctrl1(3:0) (disparity error per byte) |
PhyRx_CodeErr flags l |
ch_rxctrl3(3:0) (not in table per byte) |
PhyRx_Valid(l) |
receivers ready (synchronised rst_rx_done), Phy_RxEnable(l) and a K character received on the lane since the receivers are ready (the receive buffer outputs zero words while it starts) |
Phy_NoSignal(l) |
ch_rxelecidle, synchronised |
Phy_SerialNearLoopback(l), Phy_SerialFarLoopback(l) |
QUAD0_chl_loopback = 010 (near-end PMA loopback) or 100 (far-end PMA loopback); a change of the far-end loopback (synchronised to FreeRunClk) pulses INTF0_rst_tx_datapath_in for 256 cycles |
Phy_PrbsTxSel(l), Phy_PrbsForceErr(l) |
ch_txprbssel, ch_txprbsforceerr (PRBS generator of the channel, after the 8B/10B encoder) |
Phy_PrbsRxSel(l), Phy_PrbsCntReset(l) |
ch_rxprbssel, ch_rxprbscntreset (PRBS checker of the channel, before the 8B/10B decoder) |
Phy_PrbsErr(l), Phy_PrbsLocked(l) |
ch_rxprbserr, ch_rxprbslocked (receive user clock = LaneClk) |
Stat_ClkCor(l) |
ch_rxclkcorcnt /= 0 (a SKIP word inserted or removed in this cycle) |
Stat_RxBufErr(l) |
ch_rxbufstatus(2) (receive elastic buffer overflow or underflow) |
Channels without a lane (NumLanes_g < 4) send electrical idle; their receive outputs are not used.
4. Status crossing¶
rst_tx_done and rst_rx_done (free-running clock domain), ch_rxelecidle and ch_rxbyteisaligned (asynchronous)
cross to LaneClk in one olo_ft_sync (two stages, three synchroniser chains with a majority voter). LaneRst is
the inverted transmitter ready.
5. Transceiver configuration¶
tcl/ofb_gtw.tcl sets the line rate settings LR0_SETTINGS of interface 0 (INTF0_GT_SETTINGS) and the optional
ports (INTF0_OPTIONAL_PORTS, the dictionary of all ports with the used ones enabled). The settings are listed in the
specification (section 3).