文章目录
- 前言
- 1、万兆网给8B10B PHY共享
- 2、8B10B PHY给万兆网共享
- 3、综合实现
- 4、总结
- 4.1、上板验证
- 4.1.1、第一路数据:万兆网
- 4.1.2、第二路数据:8B10B PHY
前言
一个GT BANK有四个GT channel,他们之间是可以共享同一个QPLL输出参考时钟,之前的实验当中,我都是同样的工程例化多个channel进行时钟共享,这次在做一个BANK上同时存在万兆王、8B10B、64B66B的时候出现了问题。
本次设计当中在同一个BANK当中输入了俩路高速接口数据,一路是之前自己设计的万兆以太网接口数据,一路是之前的8B10B PHY数据,俩者各自在拓展自己多路输入输出的时候,都直接共享时钟即可,但是按照一样的办法,会出现以下问题:
1、万兆网给8B10B PHY共享
我用万兆网的ten_gig_eth_pcs_pma_0_gt_common模块去给8B10B PHY共享的时候,ten_gig_eth_pcs_pma_0_gt_common模块是没有QPLLREFCLKLOST_OUT信号输出的,进入到common原语内部去将该信号引出来后发现这个信号一直为高,导致8B10B PHY这路是没有时钟信号的,而万兆网这一路数据是一切正常的,万兆网多channel共享逻辑的时候不需要QPLLREFCLKLOST_OUT信号。
2、8B10B PHY给万兆网共享
使用8B10B PHY的gtwizard_0_common模块给万兆网进行GT参考时钟共享的时候,万兆以太网倒是有时钟信号,并且8B10B PHY这路数据一切正常,至于万兆网尽管有数据,但CRC全部出错了,观察波形发现是接收端数据是乱的。。。。
观察俩者共享逻辑代码,发现俩者的QPLL_FBDIV_TOP参数不一样
万兆网ten_gig_eth_pcs_pma_0_gt_common:
localparam QPLL_FBDIV_TOP = 66;
8B10B PHY的gtwizard_0_common模块:
localparam QPLL_FBDIV_TOP = 64;
这个信号会影响QPLL的分频系数:
但是俩路IP核设置参考时钟是完全一样的,唯一区别就是编码方式了,万兆网是64b66b,在example当中,万兆网这个参数是66,对照上图可以理解,但不知道为啥8b10b是64,因为我参考时钟给的依旧是156.25Mhz。
通过测试进一步发现,对于万兆网而言,这个参数必须是66,否则数据是错的,对于8b10b而言,俩个倒是都可以,至少都有时钟产生,但是参数改为66之后,gtwizard_0_common模块的复位输入,必须是8b10b当中IP和的o_qpllreset信号,否则也不行,具体原因尚未查明。。。
3、综合实现
综合实现的时候
gtwizard_0_common模块的参考时钟必须只能输入一个,仿真的时候倒是无所谓,但是实现的时候如果GTREFCLK0_IN和GTREFCLK1_IN都有信号输入,哪怕你QPLLREFCLKSEL_IN只选择了其中之一,布局布线还是会失败。所以不需要的哪路一定要直接接0。如下:
gtwizard_0_common #
(.WRAPPER_SIM_GTRESET_SPEEDUP(),.SIM_QPLLREFCLK_SEL (3'b010)
)
common0_i
(.QPLLREFCLKSEL_IN (3'b010 ),//1:参考时钟0;2:参考时钟1 3:北时钟 4:南时钟.GTREFCLK0_IN (0 ),.GTREFCLK1_IN ( w_gt_refclk ),.QPLLLOCK_OUT (w_qplllock ),.QPLLLOCKDETCLK_IN (w_sys_clk ),.QPLLOUTCLK_OUT (w_qplloutclk ),.QPLLOUTREFCLK_OUT (w_qplloutrefclk ),.QPLLREFCLKLOST_OUT (w_qpllrefclklost ), .QPLLRESET_IN (w_qpllreset_gt_phy )
);
4、总结
最终完整可用的方法就是:
共享逻辑代码当中:
参数QPLL_FBDIV_TOP为66,保证万兆网数据正确:
localparam QPLL_FBDIV_TOP = 66;
QPLLRESET_IN :QPLL复位信号要接8B10B模块输出的复位,以保证8B10B这路数据正常工作