从协议到PCB:PCIe高速硬件设计实战指南
1. 从协议到PCB为什么PCIe硬件设计是个“瓷器活”大家好我是老张在高速硬件设计这个行当里摸爬滚打了十几年从早期的PCIe 2.0一路做到现在的PCIe 5.0踩过的坑比走过的路还多。今天想和大家聊聊一个听起来高大上、做起来却处处是细节的活儿——PCIe的硬件设计。很多人觉得这不就是选个支持PCIe的芯片把线连起来就行了吗如果你也这么想那可能离“翻车”不远了。这绝对是个“瓷器活”没点“金刚钻”信号质量、系统稳定性都无从谈起。我们常说的PCIe设计远不止是原理图上画几对差分线那么简单。它是一个从协议规范理解开始贯穿芯片选型、电路设计、PCB布局布线直到最终信号测试与调试的完整链路。任何一个环节的疏忽都可能导致整个链路性能不达标甚至根本无法工作。比如你选了一个支持PCIe 4.0的CPU却给它配了只适用于PCIe 3.0的耦合电容或者PCB走线长度严重不匹配那么即使软件配置正确信号眼图也可能惨不忍睹数据传输错误频发。所以这篇实战指南的目的就是把我这些年从理论到实践从图纸到实物的经验系统地分享给大家。我会尽量避开那些深奥难懂的数学公式和晦涩的协议文本用大白话和实际案例带你走一遍PCIe硬件设计的全流程。无论你是刚入行的硬件新人还是想深入理解高速信号设计的老手相信都能从中找到一些实用的“避坑”指南和设计思路。我们的目标很明确把高速信号稳稳当当地从A点送到B点并且能让测试仪器给出一个漂亮又合规的眼图。2. 第一步明确需求与芯片选型——你的设计起点在哪里动手画图之前我们必须先搞清楚两个最根本的问题我需要多快的速度以及我的芯片能提供什么这就像盖房子先打地基方向错了后面的一切努力都可能白费。2.1 PCIe协议版本与速率不只是数字游戏首先我们得把PCIe的“代际”和速率理清楚。网上资料很多但有时说法不一我结合最新的规范和实际应用给大家梳理一下协议版本单通道原始速率 (GT/s)编码方式单通道有效带宽 (近似)主流应用场景PCIe 1.02.5 GT/s8b/10b~250 MB/s老旧设备现已少见PCIe 2.05.0 GT/s8b/10b~500 MB/s一些工业控制、传统扩展卡PCIe 3.08.0 GT/s128b/130b~985 MB/s当前最广泛CPU与FPGA、GPU、NVMe SSD通信PCIe 4.016.0 GT/s128b/130b~1.97 GB/s高端显卡、数据中心NVMe SSDPCIe 5.032.0 GT/s128b/130b~3.94 GB/s下一代数据中心、AI加速卡PCIe 6.064.0 GT/sPAM-4, 1b/1b~7.56 GB/s前沿规范开始进入设计阶段PCIe 7.0128.0 GT/sPAM-4, 1b/1b已发布规范未来方向这里有几个关键点需要理解。第一GT/sGiga Transfers per second指的是原始比特率而有效带宽要去除编码开销。比如PCIe 3.0的8 GT/s采用128b/130b编码开销约1.54%单通道双向有效带宽大约是8 * (128/130) / 8 ≈ 0.985 GB/s我们通常粗略记为1GB/s。一个x4的链路就是约4GB/s。第二选择版本不是越高越好。PCIe 5.0/6.0的速率极高对PCB板材、加工工艺、连接器、芯片SerDes性能都提出了地狱级的要求设计成本和难度呈指数级上升。对于大多数嵌入式、工控、消费电子项目PCIe 3.0依然是性价比和可靠性的黄金选择。我做过不少AI推理盒子项目CPU和加速卡之间用PCIe 3.0 x4带宽完全够用而且设计稳定一次成功率高。2.2 芯片管脚确认一字一句读手册确定了协议版本和所需通道数x1, x4, x8, x16接下来就要在芯片数据手册里“寻宝”了。这一步千万不能想当然不同芯片、甚至同一芯片的不同封装PCIe管脚定义都可能不同。对于CPU/SoC如瑞芯微RK3588、英伟达Jetson系列这部分相对简单。你需要在芯片的Datasheet或硬件设计指南里找到专门的“Pin Description”或“Interface”章节。里面会明确列出哪些Bank的哪些引脚是PCIe接口并标注是PCIe RX接收还是TX发送差分对。务必注意有些引脚是复用的可能通过芯片内部配置或上下拉电阻选择为PCIe功能或其他功能如SATA、USB3.0。你需要根据手册说明正确配置这些复用设置否则引脚功能不对电路自然不通。对于FPGA如Xilinx/AMD的7系列、UltraScale情况就复杂一些但规律性很强。FPGA的PCIe接口通常使用其高速串行收发器GTX/GTH/GTY等。首先你需要确认你的FPGA型号是否包含PCIe硬核Hard IP。硬核是芯片内部固化好的PCIe协议处理单元性能稳定资源占用少必须使用。以经典的Xilinx 7系列为例查找手册PG023《7 Series FPGAs Integrated Block for PCI Express》这里会告诉你该系列FPGA支持多少个PCIe硬核分别位于哪个Bank。然后根据PG023给出的位置信息去查UG476《7 Series FPGAs GTX/GTH Transceivers》找到对应Bank的GTX收发器引脚定义。这里有个大坑PCIe Lane的序号Lane0, Lane1...与GTX收发器的编号例如X0Y0, X0Y1...的映射关系手册里有专门的表格必须核对清楚。我曾经就遇到过把Lane0接到GTX X0Y2上结果死活不识别折腾了两天最后发现映射表看错行了。一个实用的建议在原理图设计阶段就把芯片手册中关于PCIe引脚描述的那几页打印出来用荧光笔标出你要用的差分对并在旁边注明其对应的PCIe Lane号和方向TX/RX。这能极大减少连错线的低级错误。3. 电路设计那些容易被忽略的关键器件原理图设计阶段除了连接差分线还有几个关键的被动元件它们的选型和布局直接影响信号质量。3.1 交流耦合电容小身板大作用PCIe链路是交流耦合的这意味着发射端TX和接收端RX之间必须串联一个电容这就是交流耦合电容AC-Coupling Capacitor。它的作用主要是隔离两端的直流偏置电压防止因设备供电电压不同导致直流电流流通。容值怎么选PCIe协议规范给出了一个范围75nF到265nF但实际设计中我们有更经验性的选择PCIe 1.0/2.0常用0.1uF (100nF)。这个值在协议推荐范围内且是非常通用的容值。PCIe 3.0主流选择是0.22uF (220nF)。这里可能有人会疑惑速率越高信号频率越高按理说为了降低容抗电容应该越小越好比如选更接近下限的75nF为什么反而用更大的0.22uF呢这主要和历史编码方式有关。PCIe 1.0/2.0使用8b/10b编码其直流平衡性好低频能量少。而PCIe 3.0虽然用了效率更高的128b/130b编码但其直流平衡性稍差低频能量更多。更大的耦合电容可以为这些低频分量提供更低的阻抗路径保证信号完整性。所以这是一个综合考虑编码特性和信号衰减后的折中选择。PCIe 4.0/5.0及以上回归到更小的容值如0.1uF甚至更小。因为到了这个速率任何微小的寄生参数都会被放大小容值电容的等效串联电感ESL和等效串联电阻ESR更小对高速信号的衰减更少。Intel的PCIe 4.0设计指南就明确推荐使用0201封装的0.1uF电容而非0402。封装与布局封装越小越好。优先选择0201其次是0402。小封装的电容寄生电感小对信号造成的阻抗不连续影响更小。布局上这个电容必须紧靠接收端RX的引脚放置。理想情况是电容的一端直接打在RX端的焊盘上另一端通过短线连接到传输线。绝对不要放在TX端或者链路中间。3.2 端接与参考时钟为信号铺好轨道除了耦合电容另外两个容易出问题的地方是差分线的端接和参考时钟。差分线端接PCIe链路在接收端内部已经集成了端接电阻通常是100欧姆差分所以在PCB上我们不需要再外接端接电阻。这是一个常见的误解。你需要做的是保证PCB上差分走线的特征阻抗控制在85欧姆到100欧姆之间通常目标值为85欧姆或90欧姆并与芯片内部的端接电阻匹配。这就涉及到我们后面要讲的PCB叠层设计和线宽线距计算。参考时钟REFCLKPCIe设备需要一个非常干净的100MHz参考时钟。这个时钟可以由主板提供也可以由设备自己通过晶体振荡器产生。无论哪种方式都要注意时钟质量要求相位抖动非常低。要选择专用的PCIe时钟发生器或高性能的晶体振荡器。布线要求REFCLK走线要按差分线处理虽然它频率不高但要求严格同样需要做阻抗控制并且要远离高速数据线和开关电源等噪声源。时钟线周围最好用接地过孔“护卫”起来。电源滤波时钟芯片的电源引脚必须用磁珠和多个容值如10uF, 0.1uF, 0.01uF的电容进行充分的滤波确保电源纹波足够小。4. PCB布局布线高速信号的“高速公路”规划这是整个硬件设计中最具挑战性、最体现功力的环节。画得好信号畅通无阻画得不好后期调试就是噩梦。4.1 布局原则分区域守规矩首先在布局上就要为高速信号打好基础。器件分区将PCIe相关的芯片CPU、FPGA、交换机尽量靠近放置缩短高速信号的整体走线长度。将连接器如PCIe插槽、M.2接口放在板边便于插拔的位置并规划好从芯片到连接器的信号通道这个通道应尽可能短、直。电源分区为PCIe SerDes串行解串器和PLL锁相环供电的电源必须是干净、低噪声的电源。通常需要使用独立的电源网络并通过磁珠或0欧姆电阻与数字电源隔离。每个电源引脚附近都要布置足够的多级去耦电容大容值储能小容值滤高频。耦合电容摆放如前所述交流耦合电容必须紧靠接收端放置。对于BGA封装的芯片优先考虑放在芯片背面对应的位置通过过孔引下如果空间不允许也要放在信号从芯片引出后最先经过的位置。4.2 布线规则长度、间距与阻抗的平衡艺术布线是重头戏有几条黄金法则必须遵守阻抗控制这是底线。你必须和PCB板厂密切沟通根据他们提供的叠层结构板材型号、每层厚度、铜箔厚度使用阻抗计算工具如SI9000计算出达到目标差分阻抗如90欧姆所需的线宽和线距。并在设计说明文件中明确标注这些高速差分线需要做阻抗控制。等长匹配一组差分线P和N之间的长度差要尽可能小一般要求小于5 mils0.127毫米。同一个PCIe Lane的TX和RX对之间以及不同Lane之间的长度也需要匹配通常要求长度差在几十个mil以内例如PCIe 3.0要求可能到50 mils。这就需要大量使用蛇形走线Serpentine Tuning来进行长度补偿。注意蛇形走线要使用圆弧或45度角拐弯避免90度直角蛇形线的幅度Amplitude要大于3倍线宽间距大于2倍线宽以减少差分对内的串扰。远离干扰源PCIe差分线要远离时钟线、开关电源、晶振、电感等强噪声源。如果必须交叉应使用电源或地平面作为隔离层即让它们在不同层上垂直交叉。过孔处理尽量减少过孔数量。如果必须打孔换层要使用接地返回过孔Ground Return Vias。即在信号过孔旁边非常近的位置打一个连接到地平面的过孔为高速信号提供最短的返回路径。过孔本身也会引入阻抗不连续和寄生电容对于PCIe 4.0/5.0甚至需要板厂使用背钻Back Drill技术来去除过孔中无用的铜柱Stub以减少信号反射。参考平面完整性高速差分线正下方必须有一个完整、无分割的参考平面通常是地平面。信号线绝对不能跨过平面分割区。如果实在无法避免需要在分割处跨接缝合电容通常为0.1uF但这是下下策应尽量避免。在实际操作中我通常会为PCIe布线设置严格的约束规则Constraint Rules差分阻抗、线宽线距、对内等长、对间等长、与其他信号的间距等等。利用EDA工具如Cadence Allegro、Mentor Xpedition的约束管理器可以实时检查布线是否符合规则这是保证设计正确性的高效手段。5. 信号测试与眼图调优是骡子是马拉出来遛遛板子做回来焊接好上电初始化成功这只是万里长征第一步。高速信号的实际质量如何必须用仪器说话。5.1 测试准备选对“尺子”测试PCIe信号核心工具是高速实时示波器并且要配备高带宽的差分探头。这里有个关键原则示波器的带宽至少要是被测信号最高频率分量的2倍以上。对于PCIe信号我们通常关注其基础比特率。一个经验法则是示波器带宽 ≥ 2.5 * 比特率GT/s。例如测试PCIe 3.08 GT/s的信号示波器带宽最好在20 GHz以上测试PCIe 4.016 GT/s则需要40 GHz以上的带宽。带宽不足示波器就无法捕获信号的高频边沿测出来的眼图会显得“模糊”、“闭合”但这其实是仪器失真并非真实信号问题。主流厂商如是德科技Keysight和泰克Tektronix都有相应的解决方案。测试时需要使用探头点测PCIe连接器金手指背面的测试点TP或者主板预留的测试孔。探头的地线要尽可能短最好使用探头自带的接地弹簧针形成一个最小的测量环路。5.2 眼图分析看懂这张“成绩单”眼图是评估高速串行信号质量最直观的工具。它是由无数个比特位的波形叠加在一起形成的图形形似一只眼睛。一张“健康”的眼图应该眼睛张开得又大又亮。我们主要关注几个关键参数眼高Eye Height垂直方向张开的幅度。代表了信号抗噪声干扰的能力。眼高越大噪声容限越高。眼宽Eye Width水平方向张开的宽度。代表了信号对时序抖动的容忍度。眼宽越大时序裕量越大。抖动Jitter包括随机抖动RJ和确定性抖动DJ。抖动过大会侵蚀眼宽。眼图模板Eye MaskPCIe协议定义了每个速率等级对应的眼图模板一组多边形区域。测试时如果采集到的信号波形有任何一部分侵入到这个模板区域内就视为违规Mask Hit。我们的目标就是让眼图完全避开这个模板区域。5.3 调优实战如何让眼睛“睁大”如果测出来的眼图不理想眼睛眯成一条缝甚至碰到了模板我们就需要进行调优。调优主要在发射端TX进行通过调整SerDes的驱动参数来实现。发射端均衡Tx Equalization这是最主要的调优手段。它通过预加重Pre-emphasis和去加重De-emphasis来补偿信道的高频损耗。预加重是在信号跳变时增加发射幅度让边沿更陡峭去加重是在信号保持稳态时降低幅度。两者结合可以让接收端收到一个更“方正”的信号。在芯片的配置寄存器中通常会有几个级别的预加重/去加重参数可供选择如0dB, 3.5dB, 6dB等。你需要结合PCB的损耗情况逐个尝试观察眼图的变化。一般来说信道损耗越大需要的均衡强度越高。摆幅Swing调整差分信号的峰值电压。增大摆幅可以增加眼高但也会增加功耗和EMI。通常在保证眼高达标的前提下使用尽可能小的摆幅。接收端均衡Rx Equalization一些高级的接收器也具备均衡能力如连续时间线性均衡CTLE可以进一步优化信号。但这通常需要链路训练协议配合调整起来更复杂。调优过程是一个迭代和权衡的过程。我的经验是先从默认配置开始测试如果眼图不好先微调预加重/去加重每次只改变一个参数观察眼图改善效果。同时要关注接收端的误码率测试如果条件允许因为有时眼图好看不代表误码率一定低。这个过程需要耐心也是硬件工程师的“手感”和“经验”所在。我曾经为了调优一个PCIe 3.0 x8的链路在实验室里泡了整整三天对比了上百组参数最终才找到一个在所有温度条件下都稳定可靠的配置点。当看到眼图从最初的一条缝慢慢张开成一个清晰明亮的“大眼睛”时那种成就感是无与伦比的。记住硬件设计没有捷径每一个漂亮的信号背后都是对细节的极致把控和无数次的调试验证。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2411036.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!