032、PCIE参考时钟与扩频时钟:那些年时钟信号挖的坑
032、PCIE参考时钟与扩频时钟那些年时钟信号挖的坑最近调一块PCIE 3.0的板卡链路训练老是失败LTSSM状态机在Recovery状态打转。用示波器抓参考时钟100MHz的时钟频率倒是准的但眼图张开度总觉得不对劲。折腾两天才发现问题——时钟芯片的扩频功能默认开启了而Endpoint芯片的扩频配置却没匹配上。今天就聊聊PCIE参考时钟那些容易踩的坑。参考时钟PCIE链路的“心跳”PCIE链路两端必须使用同源时钟这是铁律。常见的有两种架构Common Clock架构和Data Clock架构。现在主流板卡基本都用Common Clock一个时钟源同时给Root Complex和Endpoint供电。时钟精度要求可不低基础频率100MHz偏差必须控制在±300ppm以内。实际布线时参考时钟走线要按差分对严格处理。曾经有个项目为了绕开BGA区域把时钟线拉长了50mil结果链路就变得不稳定。后来仿真发现时钟对的长度差超过5mil接收端的共模噪声就明显恶化。现在我们的设计规范里明确写着时钟差分对长度匹配必须控制在2mil以内阻抗保持100Ω±10%。扩频时钟既是解药也是毒药扩频时钟SSC本质上是个环保设计——把时钟能量分散到一定频率范围内降低EMI辐射。PCIE规范允许在下扩频-0.5%调制频率30-33kHz。听起来很美对吧但这里埋着大坑。那次调试的问题就出在这里时钟芯片默认开启了0.5%的下扩频而FPGA的PCIE IP核配置里SSC设置却是关闭的。两端的扩频配置不匹配导致时钟数据恢复CDR电路始终无法锁定。示波器上看时钟频率在99.5MHz到100MHz之间周期性摆动但单独测某一时刻又是准的这种问题最让人头疼。硬件设计的暗礁时钟芯片的配置引脚一定要仔细查。有些芯片通过硬件引脚配置扩频参数上电采样后生效。曾经有块板子时钟芯片的SSC_EN引脚悬空了内部上拉电阻不靠谱有时使能有时禁止造成批次性不稳定。后来全部改成明确接地处理。电源噪声对时钟抖动的影响超乎想象。有个案例PCIE插槽旁的12V转1.8V电源开关频率刚好是扩频调制频率的倍频导致时钟抖动从0.3ps飙升到2.1ps。解决方案是在时钟芯片的电源入口加了个π型滤波器磁珠别乱选要关注在100MHz附近的阻抗特性。软件配置的陷阱BIOS里的PCIE配置项经常被忽略。有些服务器平台默认开启“PCI Express Spread Spectrum”选项而有些加速卡固件没考虑这个场景。遇到过最诡异的问题是同一张卡在某些主板上稳定在某些主板上训练失败最后追踪到就是BIOS的SSC设置不一致。驱动程序也要注意。Linux下可以用lspci -vv看设备的Control寄存器Bit 4就是SSC使能状态。曾经写驱动时发现某个Endpoint设备在枚举阶段需要主动设置SSC相关配置位否则物理层无法进入正常工作状态。这个细节在芯片勘误表里才找到数据手册根本没提。调试实战心得遇到PCIE链路不稳定先查时钟。别一上来就抓数据眼图参考时钟的质量才是根本。示波器要用高带宽的至少5GHz以上打开抖动分析功能。重点看TIE抖动Time Interval ErrorPCIE 3.0要求不超过1ps RMS。测量时注意方法。探头接地要尽量短最好用焊接式接地环。曾经用探头标配的鳄鱼夹接地测出来抖动多了0.8ps误导了半天判断。如果条件允许用差分探头直接测差分信号单端测量会丢失共模信息。给工程师的几点血泪建议时钟芯片选型时一定仔细看SSC的默认状态。最好选择能通过I2C动态配置的型号硬件引脚配置的灵活度太差。新设计建议预留I2C控制通路哪怕当前不用。PCB设计阶段时钟线要当作“一等公民”对待。两边包地、远离高速数据线、避开电源分割区域这些老生常谈的规则每次都有项目因为面积紧张而妥协每次都会付出调试时间的代价。验证阶段要做交叉测试。用已知好的板卡作对比交换测试主机和Endpoint角色。遇到过Root Complex的时钟有问题却一直在折腾Endpoint板卡的情况浪费了两周时间。最后说个玄学经验PCIE链路对温度敏感。有个产品在常温下测试一切正常高温老化时出现偶发性掉链。最后发现是时钟芯片的供电LDO温漂太大高温下输出电压跌落时钟振幅不足。现在我们的高可靠性项目时钟电源都要用低温漂的专用电源芯片。时钟问题就像隐形的链条平时不显山露水一旦出问题就是系统级故障。把这些经验写下来希望后来者能少走点弯路。调试PCIE链路时第一个怀疑对象就应该是时钟这能省下至少三分之一的时间。