ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

FPGA GTY Transceiver时钟方案设计与功耗优化实战

FPGA GTY Transceiver时钟方案设计与功耗优化实战 1. 为什么GTY的时钟方案值得单独拿出来聊做过高速接口的同行都有个共识FPGA里最让人睡不着觉的往往不是逻辑写错了而是时钟没搞对。尤其是Xilinx UltraScale系列里的GTY Transceiver这东西跑起来动不动就是10G、25G甚至56G PAM4时钟方案稍微有点闪失轻则误码率飙升重则链路根本起不来。我前后做过几个100G以太网和Aurora 64b/66b的项目GTY的时钟配置和功耗优化这块踩过的坑说实话比写RTL的时间还多。这篇文章想聊的就是GTY Transceiver的时钟方案怎么设计、功耗怎么优化。核心受众是已经上手过FPGA、正在或者准备用GTY做高速接口的工程师。如果你还在纠结SelectIO怎么用那这篇可能稍微超前了一点但如果你已经在Vivado里对着Transceiver Wizard的时钟页面发过呆那接下来的内容应该能帮你省下不少调试时间。GTY的时钟方案之所以复杂是因为它涉及三个层面的时钟参考时钟REFCLK、收发器内部时钟TXOUTCLK/RXOUTCLK、以及用户逻辑时钟TXUSRCLK/RXUSRCLK。这三层时钟之间的关系、约束方式、以及在不同协议下的配置策略直接决定了链路能不能稳定工作。而功耗优化则是在保证性能的前提下通过合理配置均衡器、调整PLL设置、关闭未用通道等手段把功耗压下来。这两件事其实是绑在一起的——时钟方案选得激进功耗就上去了功耗压得太狠时序裕量又不够。2. GTY时钟架构的核心细节拆解2.1 三层时钟的层级关系与来源先把GTY的时钟树理清楚。GTY的时钟可以分成三个层级第一层是参考时钟REFCLK。这是从外部晶振或者时钟芯片送进来的频率通常在100MHz到161.1328125MHz之间不同协议要求不同。REFCLK进入GTY后先经过IBUFDS_GTE4这个专用缓冲器然后送到QPLL或者CPLL。第二层是PLL输出时钟。GTY内部有两个PLLQPLL和CPLL。QPLL是每个Quad共享的CPLL是每个Channel独立的。QPLL适合高速率场景比如10G以上因为它的VCO频率范围更高CPLL适合低速率或者需要独立时钟的场景。PLL的作用是把REFCLK倍频到线速率所需的频率。第三层是用户时钟TXUSRCLK/RXUSRCLK。这是从TXOUTCLK/RXOUTCLK分频出来的供给FPGA逻辑使用。TXUSRCLK的频率取决于数据位宽和线速率比如64位位宽、10.3125Gbps线速率时TXUSRCLK就是161.1328125MHz。这三层时钟的关系可以用一个简单的公式串起来线速率 REFCLK频率 × PLL倍频系数 × 2DDR模式而用户时钟频率 线速率 / 位宽。2.2 QPLL与CPLL的选型逻辑选QPLL还是CPLL这是时钟方案设计的第一个分叉口。我的经验是线速率 ≥ 10Gbps优先用QPLL。QPLL的VCO频率范围是9.8GHz到16.375GHz能覆盖大多数高速协议。线速率 10Gbps可以用CPLL。CPLL的VCO范围是2.0GHz到6.25GHz适合低速场景。多通道需要独立时钟用CPLL。比如一个Quad里四个通道跑不同协议那就每个通道用自己的CPLL。多通道同协议用QPLL。共享QPLL可以省功耗因为只需要一个PLL工作。这里有个细节QPLL有QPLL0和QPLL1两个分别对应不同的VCO频段。QPLL0覆盖9.8-16.375GHzQPLL1覆盖8.0-13.0GHz。选的时候要根据线速率反推VCO频率确保落在范围内。2.3 参考时钟的约束与PCB设计要点REFCLK的质量直接决定链路性能。在PCB设计阶段有几条硬性要求差分阻抗100欧姆REFCLK是差分信号走线阻抗必须控制好。远离高速信号REFCLK走线要远离TX/RX差分对避免串扰。参考时钟抖动要低一般要求RMS抖动小于1ps12kHz-20MHz积分范围。抖动大了误码率直接崩。REFCLK频率精度±100ppm以内否则协议侧可能不认。在Vivado里REFCLK的约束通过create_clock实现。比如create_clock -name refclk_156m25 -period 6.400 [get_ports refclk_p]注意这里周期是6.400ns对应156.25MHz。这个约束要加在IBUFDS_GTE4的输入端口上。2.4 TXOUTCLK与RXOUTCLK的使用策略TXOUTCLK和RXOUTCLK是GTY输出给用户逻辑的时钟。这里有个常见误区很多人以为TXOUTCLK可以直接驱动用户逻辑其实不行。TXOUTCLK必须先经过BUFG_GT才能进入FPGA的时钟网络。BUFG_GT是个专用缓冲器它支持动态分频。比如你可以配置BUFG_GT的输出是输入的三分之一这样就能用同一个TXOUTCLK生成不同频率的用户时钟。RXOUTCLK的使用稍微复杂一点。在RX方向如果用了RXOUTCLK来驱动用户逻辑那就需要注意RX缓冲器的延迟。一般来说RXOUTCLK要经过BUFG_GT后再送给RXUSRCLK域的逻辑。3. 功耗优化的实操路径与参数计算3.1 功耗构成与优化优先级GTY的功耗主要来自四块功耗来源占比优化手段PLL20-30%选QPLL共享、降低VCO频率均衡器30-40%根据信道损耗调整CTLE/DFE档位输出驱动15-25%降低差分摆幅、调整预加重数字逻辑10-20%关闭未用通道、降低位宽优化优先级应该是先关未用通道再调均衡器最后动PLL和驱动。3.2 均衡器配置与功耗的权衡GTY的RX均衡器包括CTLE连续时间线性均衡和DFE判决反馈均衡。CTLE的功耗相对低DFE的功耗高但补偿能力强。配置策略短距离背板10dB损耗只用CTLEDFE关掉。中距离10-20dBCTLE 少量DFE抽头。长距离20dBCTLE 全DFE抽头。在Vivado的Transceiver Wizard里这些配置在“RX Equalizer”页面。有个技巧先用手动模式调找到能开链路的临界配置然后再加一点裕量。不要一上来就用自动自适应那样功耗会偏高。3.3 PLL功耗优化与VCO频率选择QPLL的功耗和VCO频率正相关。VCO频率越高功耗越大。所以在线速率允许的情况下尽量选低VCO频率。举个例子线速率10.3125Gbps位宽64位。如果用QPLL0VCO频率可能是10.3125GHz如果用QPLL1VCO频率可能是10.3125GHz。两者功耗差不多。但如果线速率是25.78125GbpsQPLL0的VCO可能要到12.890625GHz这时候功耗就上去了。计算VCO频率的公式VCO频率 线速率 / 2 × (QPLL反馈分频比 / QPLL输出分频比)具体参数在Vivado的QPLL配置页面能看到。我的建议是先用Wizard的默认配置然后看功耗估算再手动调VCO频率试试能不能降。3.4 关闭未用通道与动态功耗管理一个Quad有四个Channel如果只用了两个另外两个一定要在Vivado里Disable掉。Disable后这两个通道的PLL和驱动都会关掉能省不少功耗。动态功耗管理方面GTY支持TX/RX的Power Down模式。在链路空闲时可以通过寄存器把TX或RX关掉。不过这个操作要小心关之前要确保协议侧允许。4. 完整实操流程从配置到上板调试4.1 Vivado Transceiver Wizard配置步骤打开IP Catalog搜“UltraScale FPGAs Transceivers Wizard”双击打开。然后按以下步骤走选择GTY Quad和Channel根据原理图勾选实际使用的Channel。选择协议模板如果有现成模板如100G Ethernet直接选没有就选“Start from scratch”。配置线速率和位宽在“TX/RX Line Rate”页面填线速率位宽一般选64位或32位。选择PLL在“PLL Selection”页面选QPLL0/QPLL1/CPLL。配置参考时钟填REFCLK频率注意要和PCB上的晶振一致。配置均衡器在“RX Equalizer”页面选CTLE/DFE档位。生成IP点OK生成IP核。生成后Vivado会自动创建example design。建议先跑example design的仿真确认时钟和复位逻辑没问题。4.2 时钟约束的编写与检查时钟约束是GTY设计里最容易出错的地方。以下是一个典型的约束脚本# REFCLK约束 create_clock -name refclk_156m25 -period 6.400 [get_ports refclk_p] # TXOUTCLK约束 create_clock -name txoutclk -period 6.400 [get_pins gty_wrapper_i/gtp_i/TXOUTCLK] # RXOUTCLK约束 create_clock -name rxoutclk -period 6.400 [get_pins gty_wrapper_i/gtp_i/RXOUTCLK] # 用户时钟约束 create_clock -name txusrclk -period 6.400 [get_pins gty_wrapper_i/txusrclk]写完约束后一定要跑report_clocks检查。如果看到时钟没约束上或者有unconstrained paths那就得回去查。4.3 上板调试与眼图扫描上板后第一步是确认PLL锁定。在Vivado的Hardware Manager里找到GTY的寄存器看QPLL Lock信号是不是拉高了。如果没锁先查REFCLK有没有进来。PLL锁定后用IBERT做眼图扫描。IBERT是Xilinx提供的误码率测试工具可以扫描眼图、测误码率。扫描时注意扫描范围水平和垂直方向都要扫范围要覆盖整个眼图。扫描步进先粗扫找到眼图中心后再细扫。误码率门限一般要求BER 1e-12。眼图张开度不够的话回去调均衡器档位。如果调了还是不行查PCB走线损耗。4.4 功耗测量与对比功耗测量可以用Xilinx的Power Estimator也可以用实际测量。实际测量的话在VCCINT和VCCAUX供电上串一个电流表读电流值。我做过一个对比同样跑10.3125GbpsQPLL共享 vs CPLL独立功耗差了大约15%。所以如果多通道同协议一定要用QPLL共享。5. 常见问题与排查技巧实录5.1 PLL不锁定的排查思路PLL不锁定是最常见的问题。排查顺序查REFCLK用示波器看REFCLK有没有波形频率对不对幅度够不够。查约束在Vivado里report_clocks看REFCLK约束有没有加上。查PLL配置确认VCO频率在范围内反馈分频比和输出分频比算对了。查电源GTY的供电VCCINT、VCCAUX、VCCAUX_IO是否正常。有个坑我踩过REFCLK的差分对正负接反了。原理图上P/N标反了导致PLL死活不锁。后来在约束里把P/N对调才解决。所以画原理图的时候一定要仔细。5.2 误码率偏高的调试方法误码率高先别急着改RTL。按以下顺序查眼图扫描用IBERT看眼图张开度。如果眼图闭合说明均衡器没调好。均衡器档位手动调CTLE和DFE找到最佳档位。参考时钟抖动用相位噪声分析仪测REFCLK的抖动。抖动大了误码率肯定高。PCB走线查TX/RX差分对的走线损耗。损耗大了均衡器补不回来。5.3 时钟约束报错的典型场景时钟约束报错常见的有报错信息原因解决方法Unconstrained path时钟没约束加create_clockClock crossing跨时钟域没处理加set_clock_groupsGenerated clock not found生成时钟没定义加create_generated_clockClock uncertainty抖动没约束加set_clock_uncertainty5.4 功耗异常升高的排查清单功耗突然升高查这几项是否有通道没关检查Vivado里未用通道是否Disable。均衡器档位是否过高DFE抽头越多功耗越大。VCO频率是否过高VCO频率高PLL功耗大。输出摆幅是否过大差分摆幅越大驱动功耗越大。6. 几个容易被忽略的实操心得6.1 BUFG_GT的动态分频用法BUFG_GT支持动态分频这个功能很多人不知道。比如你的TXOUTCLK是322.265625MHz但用户逻辑只需要161.1328125MHz那就可以把BUFG_GT的分频比设成2。这样就不用额外加一个MMCM了省功耗省资源。配置方法在Vivado的IP核里找到BUFG_GT的配置页面把DIV参数设成2。然后在RTL里通过BUFG_GT的CE和CLR端口控制。6.2 参考时钟的抖动预算分配参考时钟的抖动预算要提前分配好。一般来说整个链路的抖动预算里REFCLK占30-40%PCB走线占20-30%GTY内部占30-40%。如果REFCLK抖动超标后面怎么调都补不回来。选晶振的时候看相位噪声指标。100Hz offset的相位噪声要低于-100dBc/Hz1MHz offset要低于-150dBc/Hz。6.3 上板前的仿真验证清单上板前一定要跑仿真。仿真清单PLL锁定仿真确认PLL在复位释放后能锁定。时钟切换仿真如果有动态时钟切换确认切换过程无毛刺。复位序列仿真确认复位释放顺序正确。数据通路仿真用PRBS序列测误码率。6.4 温度对GTY性能的影响GTY的性能和温度相关。高温下PLL的VCO频率会漂移均衡器的补偿能力会下降。所以做温度测试的时候要在高温比如85度下重新扫眼图。如果高温下眼图闭合可以考虑降低线速率增加均衡器档位改善散热7. 关于时钟方案与功耗优化的个人体会做了这么多项目我最大的体会是GTY的时钟方案没有“万能配置”必须根据具体协议、PCB走线、功耗预算来调。Vivado的Transceiver Wizard给了很多默认配置但默认配置往往不是最优的。比如默认的DFE档位通常偏高功耗会多出不少。另一个体会是功耗优化要趁早。不要等板子做完了再想着降功耗那时候改配置的空间很小。在方案设计阶段就要把PLL选型、均衡器档位、通道数量这些定下来。最后分享一个小技巧如果链路偶尔出现误码但眼图看着还行那大概率是参考时钟的抖动问题。这时候可以试着换一个抖动更低的晶振或者加一个时钟净化芯片。我遇到过好几次换了晶振之后误码率直接从1e-9降到1e-13。这个内容后续还可以这样扩展一是结合具体协议比如100G Ethernet或Aurora 64b/66b做更详细的配置案例二是用Xilinx的Power Estimator做更精确的功耗建模三是把IBERT的扫描结果和均衡器配置做关联分析找出最优档位。
返回列表