一般情况下,GT的TX和RX中都会存在Buffer用于进行XCLK与TXUSRCLK/RXUSRCLK间的时钟域转换。Buffer的存在会带来较长的逻辑级数进而带来额外的数据路径,进而影响延迟。
Buffer | Buffer Bypass(相位对齐) | |
---|---|---|
延时(Latency) | 延时较高 | 相位对齐电路使用更少的寄存器,延时更低且固定 |
多lane间偏斜(Skew) | 偏斜较大 | 相位对齐电路能够共享同一TXUSRCLK时钟,减少多GTY的lane间偏斜 |
TXUSRCLK时钟抖动(Jitter)敏感 | 不敏感 | 对TXUSRCLK时钟抖动敏感,当TXUSRCLK大于325MHz时,不建议直接使用(Contact your local FAE) |
为此,GT支持选择Buffer Bypass模式,通过相位调整电路和延迟调整电路代替Buffer进行时钟域的转换,如下图所示。
GT手册中对于Buffer Bypass的介绍十分详细,在实际使用时,GTY IP核会生成自动相位及延迟对齐模式所需的逻辑电路,无需用户过多参与。在最基本情况下,用户只需要关注gtwiz_buffbypass_tx_done_out与gtwiz_buffbypass_rx_done_out相位对齐电路完成信号。本文基于已有64B66B Sync Gearbox工程,将gtwiz_buffbypass_tx_done_out与gtwiz_buffbypass_rx_done_out作跨时钟域处理(实际实现后发现,GTY IP核内部已将两信号同步到USRCLK2时钟域)后,作为复位完成指示信号。
assign gtwiz_buffbypass_tx_reset_in = 1'b0;
assign gtwiz_buffbypass_tx_start_user_in = 1'b0;
assign gtwiz_buffbypass_rx_reset_in = 1'b0;
assign gtwiz_buffbypass_rx_start_user_in = 1'b0;
logic gtwiz_buffbypass_tx_done_meta, gtwiz_buffbypass_tx_done_usrclk2_r;
logic gtwiz_buffbypass_rx_done_meta, gtwiz_buffbypass_rx_done_usrclk2_r;
logic gtwiz_reset_tx_all_done_out_r, gtwiz_reset_rx_all_done_out_r;
always_ff @(posedge gtwiz_userclk_tx_usrclk2_out) begin
gtwiz_buffbypass_tx_done_meta <= gtwiz_buffbypass_tx_done_out;
gtwiz_buffbypass_tx_done_usrclk2_r <= gtwiz_buffbypass_tx_done_meta;
gtwiz_reset_tx_all_done_out_r <= gtwiz_buffbypass_tx_done_usrclk2_r & gtwiz_reset_tx_done_out;
end
always_ff @(posedge gtwiz_userclk_rx_usrclk2_out) begin
gtwiz_buffbypass_rx_done_meta <= gtwiz_buffbypass_rx_done_out;
gtwiz_buffbypass_rx_done_usrclk2_r <= gtwiz_buffbypass_rx_done_meta;
gtwiz_reset_rx_all_done_out_r <= gtwiz_buffbypass_rx_done_usrclk2_r & gtwiz_reset_rx_done_out;
end
上板测试
完整代码
完整代码可于同名公众号回复GTY_BUFFER_BYPASS下载。