ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

UltraScale+ GTY参考时钟跨Bank共享机制与Vivado配置实战

UltraScale+ GTY参考时钟跨Bank共享机制与Vivado配置实战 1. 为什么GTY参考时钟的跨Bank共享值得单独拿出来讲做过UltraScale系列FPGA高速接口设计的人大概率都遇到过这样一个场景板子上有一路质量非常好的差分参考时钟比如来自一颗专用时钟芯片的125MHz或156.25MHz你希望把它同时喂给两个甚至三个Quad里的GTY收发器使用。结果打开Vivado的Clocking Wizard或者手动例化IBUFDS_GTE4的时候发现参考时钟的输入引脚是绑定在某个特定Bank上的另一个Bank的GTY似乎够不着这路时钟。这个问题的本质就是GTY参考时钟的跨Bank共享机制。它不是一个可以随便忽略的细节而是直接决定了你的时钟树方案能不能成立、PCB上要不要多放一颗时钟芯片、以及整个高速接口的抖动预算能不能达标。UltraScale的GTY收发器在架构上属于Quad级别的资源每个Quad包含4个通道每个通道有自己的CDR和PLL但参考时钟的入口是Quad共享的。具体来说每个Quad有两个专用的参考时钟输入对通常标记为MGTREFCLK0和MGTREFCLK1它们通过IBUFDS_GTE4这个专用缓冲器进入Quad内部的时钟网络。问题在于当你的参考时钟物理上连接到了Quad 0的MGTREFCLK0引脚而Quad 1的GTY也需要这路时钟时你不可能在PCB上把同一对差分线同时拉到两个Quad的引脚上——那样会引入严重的阻抗不连续和反射。所以Xilinx在GTY的时钟架构里设计了一套跨Quad的参考时钟路由网络允许相邻Quad之间共享参考时钟。这套机制在UG578UltraScale Architecture GTY Transceivers User Guide里有详细描述但文档的表述比较分散很多做FPGA开发的工程师第一次接触时容易看漏关键约束。这篇文章面向的是已经有一定FPGA高速接口设计基础、正在使用UltraScale系列比如KU15P、VU9P、ZU19EG等做GTY相关项目的工程师。我会把跨Bank共享的架构原理、约束写法、Vivado里的具体操作、以及实际调试中踩过的坑按照我自己的项目经验完整梳理一遍。如果你正在画板子或者正在调GTY的链路这篇内容应该能帮你省下不少来回试错的时间。2. GTY参考时钟架构与跨Quad共享的底层逻辑2.1 每个Quad的时钟资源到底有哪些先把这个事情说清楚一个GTY Quad里参考时钟相关的资源包括两个差分参考时钟输入对MGTREFCLK0P/N和MGTREFCLK1P/N、对应的IBUFDS_GTE4缓冲器、以及Quad内部的时钟分配网络。每个通道的TX和RX可以独立选择使用哪个参考时钟源这个选择通过CHANNEL的TX/RX Clock Source配置来完成。关键点在于IBUFDS_GTE4的输出并不是直接送到PLL的而是先进入一个叫做参考时钟选择网络的结构。这个网络允许Quad内的4个通道各自选择MGTREFCLK0、MGTREFCLK1、或者来自相邻Quad的参考时钟。这就是跨Quad共享的硬件基础。具体来说UltraScale的GTY Quad在物理布局上相邻Quad之间有一组专用的时钟路由线。Quad N的参考时钟可以路由到Quad N1和Quad N-1但不能再往更远的Quad传。也就是说跨Quad共享的范围是相邻的不是任意距离的。这个约束非常关键很多人在规划Bank分配的时候没有注意到这一点导致后面发现时钟根本过不去。2.2 跨Quad共享的信号流向从信号流向来看每个Quad的参考时钟选择网络有两个输入端口本地参考时钟和来自相邻Quad的参考时钟。选择哪个由配置决定。当你在Vivado里例化GTY的IP核时如果选择了Use an external reference clock from another Quad之类的选项工具会自动帮你配置这个选择路径。但这里有一个容易混淆的地方跨Quad共享的参考时钟其方向是双向的。也就是说Quad 0可以把时钟传给Quad 1Quad 1也可以把时钟传给Quad 0。但同一时刻一个Quad的某个参考时钟输入只能选择一个来源。你不能让Quad 1的MGTREFCLK0同时接收来自Quad 0和Quad 2的时钟——这在硬件上就不支持。另外跨Quad共享的参考时钟在进入目标Quad后仍然要经过目标Quad的IBUFDS_GTE4吗答案是不经过。共享路径是直接连接到目标Quad的参考时钟选择网络的绕过了输入缓冲器。这意味着源Quad的IBUFDS_GTE4必须被正确例化和配置否则整条链路都没有时钟。2.3 为什么要有这个机制从板级设计的角度来理解这个机制的必要性。假设你有一个4通道的100G以太网接口用了两个Quad每个Quad两个通道。如果每个Quad都要求独立的参考时钟输入那PCB上就需要至少两对差分时钟线而且这两对线的长度匹配、阻抗控制、抖动要求都要满足。如果这两个Quad可以使用同一路参考时钟那板子上就只需要一对差分线通过FPGA内部的共享网络分发到两个Quad。这直接减少了时钟芯片的输出路数、PCB的布线层数、以及连接器的引脚数。从信号完整性的角度少一对高速差分线意味着少一份串扰和反射的风险。特别是当参考时钟频率较高比如156.25MHz或312.5MHz时PCB上的每一段走线都需要仔细的阻抗控制和端接匹配。能少走一对线就少一份调试的麻烦。从功耗角度每个IBUFDS_GTE4都是要消耗功耗的。如果两个Quad共享一路参考时钟那目标Quad的输入缓冲器就可以不使能省掉一部分静态功耗。虽然单看不多但在大规模FPGA设计里积少成多。3. 跨Bank共享的约束配置与Vivado实操3.1 在IP核配置里怎么选在Vivado里使用GTY的IP核比如UltraScale FPGAs Transceivers Wizard时参考时钟的配置在Clocking或者Refclk相关的页面里。你需要为每个通道指定它使用的参考时钟来源。选项通常包括使用本Quad的MGTREFCLK0使用本Quad的MGTREFCLK1使用来自相邻Quad的参考时钟当你选择来自相邻Quad时IP核会要求你指定源Quad的位置。这个位置信息在IP核的配置界面里通常以Quad编号或者相对位置来表示。这里有一个实操细节IP核的配置界面里跨Quad共享的选项有时候是灰色的不能选。这通常是因为你选择的源Quad和目标Quad在物理位置上不相邻或者你还没有正确配置源Quad的参考时钟。Vivado的IP核在配置阶段就会做这种合法性检查这其实是好事能帮你在早期发现规划错误。3.2 XDC约束的写法IP核配置完成后Vivado会自动生成一部分XDC约束但跨Quad共享的参考时钟通常需要你手动补充一些约束。最关键的是参考时钟的输入引脚位置约束和时钟周期约束。引脚位置约束的写法大致是这样的set_property PACKAGE_PIN AD12 [get_ports mgtrefclk0_quad0_p] set_property PACKAGE_PIN AD11 [get_ports mgtrefclk0_quad0_n] set_property IOSTANDARD LVDS [get_ports mgtrefclk0_quad0_p]但注意GTY的参考时钟引脚不是普通的IO不能用普通的IOSTANDARD约束。实际上GTY的参考时钟引脚在Vivado里是通过GTYE4_CHANNEL或者GTYE4_COMMON的原语来引出的引脚约束通常写在IP核生成的XDC里不需要你手动指定PACKAGE_PIN。你需要关注的是时钟周期约束create_clock -period 6.400 -name mgtrefclk0_quad0 [get_ports mgtrefclk0_quad0_p]这个周期对应156.25MHz。如果你的参考时钟是125MHz周期就是8.000ns。这个约束必须加否则Vivado的时序分析会报错而且会影响GTY的初始化。对于跨Quad共享的参考时钟你还需要确认源Quad的IBUFDS_GTE4被正确例化。在IP核的示例设计里通常会自动生成这个缓冲器的例化代码。如果你是自己手写RTL需要确保例化了IBUFDS_GTE4并且它的输出连接到了GTYE4_COMMON的GTREFCLK0或者GTREFCLK1端口。3.3 一个具体的配置案例假设你的板子上有一颗Si5341时钟芯片输出一路156.25MHz的差分时钟连接到了Quad 0的MGTREFCLK0引脚。你的设计里Quad 0和Quad 1都有GTY通道需要使用这路时钟。在IP核配置里Quad 0的通道选择MGTREFCLK0作为参考时钟源。Quad 1的通道选择来自相邻Quad的参考时钟源指定为Quad 0的MGTREFCLK0。生成的RTL里Quad 0的GTYE4_COMMON会有一个GTREFCLK0端口连接到IBUFDS_GTE4的输出。Quad 1的GTYE4_COMMON会有一个GTREFCLK0端口但它的来源是Quad 0的共享输出。这个共享输出在GTYE4_COMMON原语里通常标记为GTREFCLK00_OUT或者类似的名称需要连接到Quad 1的GTREFCLK00_IN。具体的端口名称和连接方式不同版本的Vivado和不同的IP核版本可能会有差异。最可靠的做法是参考IP核生成的示例设计Example Design里面会有完整的连接关系。4. 跨Quad共享的时钟质量与抖动分析4.1 共享路径对抖动的影响参考时钟经过跨Quad共享路径后抖动会恶化吗这是很多人关心的问题。从Xilinx的文档和实际测试来看跨Quad共享路径引入的附加抖动additive jitter非常小通常在几十飞秒的量级。对于大多数应用比如10G/25G以太网、PCIe Gen3/Gen4、JESD204B等这个量级的附加抖动是可以忽略的。但有一个前提源Quad的参考时钟本身质量要足够好。如果源时钟的抖动已经接近协议规范的极限那经过共享路径后可能会超标。所以我的建议是在规划时钟树的时候给参考时钟留足够的抖动余量。比如PCIe Gen4要求参考时钟的RMS抖动在0.5ps以下你最好选一颗抖动在0.2ps以内的时钟芯片。4.2 共享路径的时钟频率范围跨Quad共享的参考时钟频率范围和本地参考时钟是一样的都是GTY支持的参考时钟频率范围。对于UltraScale的GTY这个范围大致是60MHz到820MHz具体取决于速度等级和器件型号。但实际使用时常见的参考时钟频率是125MHz、156.25MHz、161.1328125MHz、312.5MHz等。需要注意的是跨Quad共享路径对频率没有额外的限制但如果你使用的参考时钟频率非常高比如超过500MHz建议在PCB上就把时钟走线做好因为高频时钟对走线的损耗和反射更敏感。4.3 实测数据与经验值我在一个KU15P的项目里用同一路156.25MHz参考时钟通过跨Quad共享同时驱动了两个Quad的GTY通道分别跑10.3125Gbps和25.78125Gbps的线速率。用示波器测量GTY恢复出来的时钟相位噪声和本地参考时钟的差异在测量误差范围内。链路误码率测试跑了24小时没有出现误码。另一个经验是跨Quad共享的参考时钟在Vivado的时序报告里会显示为一个跨时钟域的路径。你需要确保这个路径被正确约束否则时序分析可能会给出不确定的结果。具体来说源Quad的参考时钟输出到目标Quad的参考时钟输入这条路径的延迟在Vivado里是自动计算的但你需要确保create_clock约束覆盖了这条路径的源端。5. 常见问题与排查技巧实录5.1 跨Quad共享不生效的几种典型表现第一种表现Vivado在Implementation阶段报错提示参考时钟路径不合法。这通常是因为源Quad和目标Quad不相邻或者源Quad的参考时钟没有被正确配置。检查方法是打开Vivado的Device视图确认两个Quad的物理位置关系。第二种表现链路能起来但误码率很高。这可能是参考时钟的抖动超标或者共享路径上的时钟被其他逻辑干扰。检查方法是先用示波器测量参考时钟的眼图和相位噪声排除时钟源的问题。第三种表现Vivado的时序报告里跨Quad的参考时钟路径显示为unconstrained。这通常是因为create_clock约束没有正确覆盖共享路径。你需要检查XDC里是否为源Quad的参考时钟输入端口创建了时钟约束。5.2 常见问题速查表问题现象可能原因排查方法解决措施跨Quad选项灰色不可选源和目标Quad不相邻查看Device视图确认物理位置调整Bank分配或改用本地参考时钟Implementation报错参考时钟约束缺失检查XDC里的create_clock补充源Quad参考时钟的周期约束链路误码率高参考时钟抖动超标测量参考时钟相位噪声更换低抖动时钟芯片或优化PCB走线时序报告unconstrained共享路径未约束检查时序报告的时钟域添加跨时钟域约束或set_clock_groupsGTY初始化失败IBUFDS_GTE4未例化检查RTL里的缓冲器例化确保源Quad的IBUFDS_GTE4正确连接5.3 几个容易踩的坑第一个坑以为跨Quad共享是自动的。实际上你需要在IP核配置里显式选择并且在RTL里正确连接共享路径。Vivado不会自动帮你做这个连接。第二个坑忽略了源Quad的参考时钟约束。如果源Quad的参考时钟没有create_clock约束Vivado的时序分析会认为这个时钟是未定义的跨Quad共享路径的时序检查就会失效。第三个坑在PCB上把参考时钟同时连接到两个Quad的引脚。这是绝对要避免的。同一对差分线拉到两个地方会引入严重的阻抗不连续导致信号反射和抖动恶化。正确的做法是只连接到一个Quad然后通过FPGA内部的共享网络分发。第四个坑没有考虑共享路径的延迟。虽然跨Quad共享路径的延迟很小通常在百皮秒量级但在某些对时钟相位敏感的应用里比如JESD204B的多通道同步这个延迟可能会影响通道间的确定性延迟。如果应用对确定性延迟有要求建议在系统层面做延迟校准。6. 板级设计与系统规划中的实际考量6.1 什么时候该用跨Quad共享什么时候不该用跨Quad共享适合的场景多个Quad需要使用同一路参考时钟且这些Quad在物理位置上相邻。比如一个多通道的以太网接口或者一个需要多通道同步的JESD204B应用。不适合的场景如果两个Quad的参考时钟需求不同比如一个需要125MHz另一个需要156.25MHz那就不能共享。另外如果两个Quad在物理位置上不相邻也不能共享这时候只能各自使用本地参考时钟。还有一个考量是时钟冗余。如果系统对可靠性要求很高可能需要为每个Quad提供独立的参考时钟这样即使一路时钟失效其他Quad还能正常工作。跨Quad共享会引入单点故障的风险。6.2 对PCB布局的指导意义从PCB设计的角度跨Quad共享机制意味着你可以在板子上少放一颗时钟芯片或者少用一路时钟输出。这直接降低了BOM成本和布线复杂度。但前提是你要在原理图设计阶段就规划好哪个Quad作为时钟源哪个Quad作为共享目标。我的建议是在原理图设计阶段就把FPGA的Bank分配和时钟树规划清楚。具体来说先确定哪些GTY通道需要用到它们分别属于哪些Quad然后确定参考时钟的来源和分配方式。如果决定用跨Quad共享就在原理图上只把参考时钟连接到源Quad的引脚目标Quad的参考时钟引脚可以悬空或者端接。另外源Quad的参考时钟引脚在PCB上要尽量靠近时钟芯片的输出走线要短、直、阻抗匹配。目标Quad的参考时钟引脚虽然不用但最好也做端接处理避免悬空引脚引入噪声。6.3 系统级时钟规划的建议在系统级时钟规划时我通常会把所有GTY通道的参考时钟需求列一个表包括频率、抖动要求、通道数量、所属Quad。然后根据这个表来决定时钟芯片的选型和输出分配。如果多个Quad可以使用同一路参考时钟就优先考虑共享方案。如果频率不同或者抖动要求不同就分开。在UltraScale的器件里一个Bank通常包含多个Quad跨Quad共享的范围是相邻Quad所以在分配Bank的时候要考虑到这一点。还有一个细节UltraScale的GTY Quad在器件里的排列顺序不同型号可能不一样。比如KU15P的GTY Quad分布和VU9P就不完全相同。在规划之前最好先查一下具体型号的封装图和Bank分布确认Quad的物理位置关系。7. 我个人的几条实操心得第一个心得在Vivado里做GTY的IP核配置时先把所有通道的参考时钟需求列清楚再动手配置。我见过太多人配到一半发现某个通道的参考时钟选错了回头改起来很麻烦因为IP核的配置是联动的改一个地方可能影响其他通道。第二个心得跨Quad共享的参考时钟在Vivado的Implementation阶段建议打开Report Clock Networks看一下实际的时钟树。这个报告会显示每个时钟的源、经过的缓冲器、到达的负载。如果共享路径没有出现在报告里说明配置有问题。第三个心得如果链路调试时误码率不稳定先查参考时钟再查电源最后查信号完整性。参考时钟的问题往往表现为误码率随温度变化或者随时间漂移而电源的问题通常表现为固定的误码率。这个排查顺序能帮你快速定位问题。第四个心得跨Quad共享的参考时钟在PCB上不需要额外的端接。因为共享路径是在FPGA内部不经过PCB。但源Quad的参考时钟输入引脚需要按照GTY的参考时钟输入要求做端接通常是AC耦合加上合适的偏置电压。第五个心得如果你的设计里用了多个Quad的GTY而且它们共享参考时钟建议在系统复位后先检查每个Quad的PLL锁定状态。如果某个Quad的PLL没有锁定可能是共享路径的配置有问题。Vivado的ILA或者调试工具可以帮你观察这些状态信号。第六个心得跨Quad共享的参考时钟在时序约束里建议用set_clock_groups把源Quad的参考时钟和目标Quad的参考时钟设为异步或者逻辑互斥除非你的应用确实需要它们之间的相位关系。这样可以避免不必要的时序分析复杂度。第七个心得在文档里记录清楚哪个Quad是时钟源、哪个Quad是共享目标、参考时钟的频率和抖动要求。这个记录在项目后期调试或者版本迭代时非常有用能帮你快速回忆起当时的规划思路。
返回列表