ARTICLE DETAIL

资讯详情

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

PCIe PCB设计实战指南:从阻抗控制到链路调试的完整要点

PCIe PCB设计实战指南:从阻抗控制到链路调试的完整要点 最早做FPGA板卡那会我照着参考设计画了一版PCIe结果上电后系统里死活认不到设备。当时第一反应是驱动问题折腾了两天最后发现是REFCLK走线跨了分割、离一个DC-DC电感又太近时钟质量差到链路训练根本走不完。从那以后我开始把PCIe相关的PCB设计要求单独整理成备忘遇到新项目直接翻能少走很多弯路。PCIe和普通并行总线、低速串口的设计逻辑完全不一样它是高速串行总线链路能不能训练成功直接取决于PCB上的信号完整性和电源完整性。很多问题不是固件能救的而是从Layout阶段就埋下了雷。这篇内容主要覆盖PCIe链路参数与枚举机制对布板的约束、叠层与阻抗控制、走线等长与回流路径、电源时钟布局、mini PCIe和M.2这些接口形态的选型差异、布线布板时的DRC设置以及上板调试时的排查顺序。适合画过几块板子、想深入理解PCIe硬件设计的工程师也适合刚接触高速Layout的朋友做参考。1. 设计起步前必须吃透的PCIe链路参数与枚举机制1.1 速率代际与通道数量决定布局预算PCIe代际速率直接决定了你在Layout阶段可以“挥霍”多少预算。先把基本参数列出来代际每通道速率编码方案x1理论带宽x16理论带宽Gen12.5 GT/s8b/10b250 MB/s4 GB/sGen25 GT/s8b/10b500 MB/s8 GB/sGen38 GT/s128b/130b约985 MB/s约15.75 GB/sGen416 GT/s128b/130b约1.97 GB/s约31.5 GB/sGen532 GT/s128b/130b约3.94 GB/s约63 GB/s设计的时候要清楚Gen3以上不能按普通差分线随便画必须考虑损耗预算。芯片厂商手册里一般会给出建议例如FPGA或CPU到PCIe插槽的板内走线尽量控制在8到12英寸以内过孔数量越少越好。PCIe链路对插入损耗、回波损耗都有明确要求速率越高走线越长眼图闭合得越厉害最后就是协商降速甚至直接训练失败。通道数方面x1和x16不只是带宽差别Layout难度完全不是一个量级。x16插卡的差分对数量很多加上电源、地、辅助信号整板走线密度会明显增大这时候叠层、参考平面、走线分区就要提前规划不能等布完线再回头调整。1.2 枚举过程的隐含约束对PCB设计的影响PCIe系统上电后根复合体Root Complex会发起枚举遍历总线上的设备给每个设备分配总线号、设备号、功能号再读取BAR寄存器完成地址空间分配。这个过程有个前提LTSSM链路训练状态机必须先完成链路训练。如果物理层训练不稳定枚举就会卡住设备在系统里根本看不到。从PCB设计角度来看有几个点容易被忽略PERST#复位信号要满足上电时序在PERST#撤销之前所有电源轨必须已经稳定。复位走线如果太长、受干扰会出现偶发复位失败表现就是设备时有时无。REFCLK参考时钟一旦质量差LTSSM会一直停在Detect或者Polling状态现象同样是“认不到设备”。链路损耗太大时链路会自动降速甚至降Lane数比如协商成Gen1 x1勉强能用但性能不对。所以别把枚举失败都归咎于软件。早期布线时复位、时钟、电源时序这三件事必须按高速PCB的标准对待而不是当成普通低速信号随意处理。2. PCB叠层与阻抗控制PCIe信号的物理基础2.1 层叠结构选择与参考平面PCIe板子选几层主要看成本和速率要求。4层板跑Gen1或Gen2是可行的走线短、环境干净的话能用但如果想稳定跑Gen3以上我建议至少6层起。6层板的好处是信号层可以挨着完整参考平面电源和地也有独立层对高速信号的回流和屏蔽都友好。8层以上则更适合Gen4/Gen5或者板上同时有很多高速接口需要更灵活的走线规划和隔离。层叠设计有一条铁律高速信号所在层必须邻接完整参考平面最好是地平面。不要让PCIe信号参考到被割裂的电源平面更不要让关键信号跨越平面分割。如果信号必须换层要保证换层前后的参考平面是同一个网络并且在换层过孔旁边放地过孔让回流电流有顺畅的路径。2.2 差分阻抗PCIe要85欧姆不是100欧姆这是最容易踩的坑。很多人习惯了USB、HDMI这类接口的90欧姆或100欧姆差分阻抗但PCIe规范规定的是85欧姆差分阻抗上下浮动约10%Gen3及以上更严格。如果板厂按100欧姆去做阻抗链路上的反射会明显增大高速时误码率直接恶化。设计时用阻抗计算工具Polar Si9000或者嘉立创EDA自带的阻抗计算功能时需要输入介质厚度、铜厚、目标阻抗、线宽、线距这些参数。举例来说6层板、板厚1.6mm、表层1oz铜、L2为GND参考层、目标85欧姆差分通常会算出来类似线宽0.15mm、线距0.15mm的一组值。但请注意这只是示例实际必须让板厂按他们的真实叠层去计算因为不同板厂的PP片组合不一样。顺带提一句叠层厚度不是随便定的。板厚1.6mm时表层到参考层的介质厚度决定走线宽度如果想把走线做细可以让板厂调整PP层叠。不要自己拍脑袋改线宽一定要和板厂确认。2.3 连接器、焊盘和过孔的阻抗不连续即便走线阻抗算准了PCIe插槽焊盘、芯片BGA扇出过孔、连接器引脚本身仍然是阻抗不连续点。工程上能做的优化包括让差分对以对称方式进入焊盘区过孔不要离焊盘太近在连接器区域按需对铜皮做挖空处理减少寄生电容。这里就涉及到热词里常出现的“ad20中pcb板铜皮挖空”。比如高速连接器下方为了降低焊盘和过孔带来的寄生电容可以在对应层挖掉部分铜皮。操作上用Polygon Pour Cutout在铜皮上画闭合区域即可但关键是搞清楚你挖的是哪一层、哪些网络不要好心办坏事把参考平面给破坏了。3. 走线规则等长、间距、换层与回流路径3.1 差分对内部等长与对间等长PCIe每条Lane是收发分离的差分对。Layout规则一般这么定对内等长同一对P/N的长度差控制在5mil以内。差太多会产生共模转换增加EMI也影响接收端眼图。对间等长x4或者x8各Lane之间总长度差控制在10到20mil以内Gen3以上建议更严。有人问“PCIe发送差分对间需不需要等长”严格说PCIe发送端有De-skew机制可以在一定范围内补偿Lane间的skew所以不是比特级严格等长。但千万别因此放飞自我如果Lane之间长度差得离谱接收端的BufFer会溢出链路余量也会变差。我的习惯是统一做等长约束不给调试留隐患。蛇形绕线的时候注意绕线间距至少3倍线宽否则相邻线段会产生耦合等于白绕。等长不是目的控制skew和串扰才是目的。3.2 过孔设计与回流路径控制过孔对高速信号影响最大的就是stub也就是过孔残桩。4到6层板的贯穿孔一般问题不大但8层以上厚板跑Gen4时残桩对信号的影响就很明显了必要时得跟板厂确认能不能做背钻。如果不能背钻那就尽量减少换层次数。换层时的回流路径非常关键。信号从L2换到L5如果L2的参考平面是GNDL5的参考平面也是GND那么换层过孔旁边一定要放地过孔让回流电流在两个地平面之间平滑切换。否则回流电流绕大圈会产生共模噪声严重时直接导致链路误码。3.3 走线间距与隔离PCIe差分对与其它信号建议保持3W以上间距W为线宽与时钟、电源开关节点这些干扰源至少拉开5W距离。板面实在紧张的话差分对之间也不要贴得太近避免串扰。高速信号不跨分割、不走孤岛铜皮这些讲过很多次但每次画板还是能看到有人踩。还有一个容易忽略的点PCIe差分对尽量不要与其它高速信号平行长距离走线平行长度越长串扰越大。3.4 板内互连和插卡互连的差异板内芯片到芯片的连接比如CPU到PCIe Switch走线短2到3英寸以内Gen3以下不用太担心。但经过连接器、线缆或背板的链路就完全不一样了连接器本身、线缆阻抗、背板过孔都会贡献损耗这些都要计入链路预算。设计前期最好用芯片厂商提供的通道预算工具把板内走线、过孔、连接器、线缆的损耗都估算一遍看总损耗是否在接收端允许范围内。前期多花半小时做预算比板子回来之后对着示波器干瞪眼要强得多。4. 电源与时钟决定PCIe成败的“命脉”4.1 电源网络与去耦电容PCIe设备常见的电源轨有3.3V、12V还有1.8V、0.9V等芯核电压。电源设计不好信号完整性再漂亮也没用。电源平面的完整性直接影响参考平面质量如果PCIe信号的参考平面恰好是某个分割得乱七八糟的电源层那信号回流路径会非常糟糕。去耦电容要放在负载引脚附近而且电容的电源和地过孔要直接打到对应平面不要绕远路。DC-DC电感底下不要走高速信号开关节点对临近走线的干扰非常大。电源纹波和时钟抖动之间的关系尤其要注意热词里也有提到ADC/DAC电路里规避时钟抖动与电源噪声的布局要点PCIe同理电源纹波会通过时钟芯片和PHY的PLL转化为抖动最终劣化眼图。所以REFCLK芯片和PHY/MAC的供电最好加一级π型滤波或者LC滤波示波器上测不到纹波不代表PLL端真的干净。4.2 参考时钟REFCLK的布局要点PCIe参考时钟是一对100MHz差分信号REFCLK/-。它不像数据信号那样有编码和均衡机制来纠正错误一旦质量差PLL直接失锁整个链路就起不来。REFCLK的布局要求走线尽量短、直从时钟源到每个端点不要绕大圈。时钟差分对要做包地处理与其它信号至少保持5W距离。如果需要一颗时钟驱动多个设备用专门的时钟缓冲器不要简单并联。时钟芯片下方要留完整地平面周围不要放开关电源。我那次调试失败就是因为REFCLK离电感太近后来把时钟走线挪走并包地问题就消失了。这种问题用软件查一辈子都查不出来只能靠Layout规范从源头避免。4.3 弹性缓冲Elastic Buffer和PCB的暗线关系热词里有一条“别再被时钟频偏搞懵了手把手拆解pcie弹性缓存elastic buffer如何搞定跨时钟域”这里也展开说一下。PCIe允许发送端和接收端的参考时钟存在一定频偏。接收端物理层里的Elastic Buffer本质上是一个FIFO用来吸收两个时钟域之间的相位和频率差异。协议通过周期性地插入或删除SKP有序符号避免FIFO溢出。这个机制在芯片内部就能完成但很多人忽略了它对PCB设计的影响EB能容忍的频偏范围是有限的。如果PCB上的REFCLK抖动很大时钟恢复电路CDR输出的恢复时钟质量变差EB的读写指针就会逼近边界轻则频繁插入SKP导致效率下降重则出现误码甚至链路重训练。所以不要把EB当作万能药Layout时把REFCLK做好让CDR输入干净EB才能真正稳。这也是为什么做高速板时钟布线优先级永远高于普通数据线。5. 接口形态选型mini PCIe、M.2与挡板尺寸5.1 mini PCIe与M.2接口的区别热词里高频出现“网卡mini pcie接口和m2接口有什么区别”。我做过转接小板简单说一下。mini PCIe是早期笔记本和工控机常用的接口54pin引脚定义基本沿用PCIe总线支持PCIe x1同时复用了USB 2.0信号。很多老式WiFi网卡、3G模块都是这个形态。M.2是后起之秀Key有B Key、M Key、BM Key之分支持PCIe x2/x4、SATA、USB等多种协议。尺寸规格从2230、2242、2260到2280都有长度不同引脚定义也不同。两者物理上完全不兼容。如果想把M.2设备转接到mini PCIe接口需要专门的转接板而且还要注意接口供电能力3.3V能不能供够M.2设备的峰值电流。NVMe设备引导要求老平台在BIOS里可能没有NVMe选项。WiFi卡的天线射频走线转接后RF线缆长度和损耗增加对信号质量有影响。所以选型阶段就要想清楚到底走哪个形态而不是画完板子再转接徒增成本和故障点。5.2 半高挡板等机械尺寸做PCIe网卡或加速卡一定会碰到全高挡板和半高挡板。半高挡板常见高度约79.2mm全高挡板约120mm固定孔和PCIe插槽的卡槽位置都有严格公差。画结构件的时候不要拿卡尺量一下就往3D里放最好直接找机箱厂或者板厂要挡板图纸。PCIe插卡PCB的外形也有标准包括金手指长度、定位卡口位置、元件高度限制。挡板附近的元件高度尤其要注意有些卡装进机箱才发现元件顶着机箱盖板那种体验很难受。画板前先确认散热器高度、电容高度和挡板缺口是否冲突比打样后再改省太多时间。6. 布线布板流程中的DRC设置与可制造性检查6.1 用AD/嘉立创EDA设定PCIe规则很多Layout工程师习惯先画完再设规则或者干脆只靠默认规则。PCIe这种高速总线建议在布线前就把规则写清楚让软件帮你看住底线。以AD为例差分对规则在Differential Pairs Rules里给PCIe网络创建差分对设置目标阻抗、线宽、线距。前提是你已经用阻抗工具算好了一组可用参数。长度规则在Matched Length或者Relative Propagation Delay里把同组Lane放进同一个时序类设置Tolerance等长约束直接交给规则管理。常规规则Clearance至少3到5mil线宽按阻抗要求过孔孔径和环宽按板厂工艺能力填。嘉立创EDA专业版也支持差分对、长度匹配、阻抗连续这些规则操作逻辑类似。规则设置得越完整最后DRC跑出来的问题越少。6.2 铜皮挖空的实际操作“AD20中PCB板铜皮挖空”是一个很具体的问题。常见场景有三个天线净空区板边需要挖掉整块铜皮。高速连接器焊盘附近为了减少寄生电容对反焊盘区域做铜皮挖空。板内高压区域为了保证爬电距离把高低压之间的铜皮挖开。在AD里用Polygon Pour Cutout在铜皮上画闭合区域就能挖空注意选择正确的层。如果是想挖掉某个网络区域下的铜皮而不影响其它网络可以用Keepout或规则区域限定。挖空之后一定要重新铺铜再跑一遍DRC防止出现尖角铜皮或者意外断路。6.3 DRC检查与生产文件输出DRC检查要覆盖电气规则短路、未连接、间距规则、孔尺寸、丝印到焊盘距离、铜皮到板边距离。很多时候问题是布线时不小心把地网络截断了或者过孔盖油把焊盘挡住了这些都能靠DRC查出来。输出生产文件方面AD24可以在Fabrication Outputs里直接生成Gerber和钻孔文件。关键点是导出的层映射要和板厂约定一致顶层、底层、内层、阻焊、助焊、丝印、钻孔一个都不能少。导出后用CAM工具或板厂提供的在线Gerber查看器检查一遍确认文件没问题再丢给板厂省一次加急费都够吃顿好的。7. 上板调试阶段常见问题与排查顺序7.1 链路训练失败的常规检查链路遇到PCIe设备枚举不出来先不要怀疑芯片。按照这个顺序排查供电用示波器确认各路电源是否按时序稳定尤其是PERST#释放之前所有电源必须已经OK。复位量PERST#的高电平时间看是否被提前释放或者有没有毛刺。参考时钟看REFCLK波形频率稳定在100MHz幅度符合接收端要求抖动不能太大。信号完整性有条件的话用采样示波器看TX眼图没条件就查PCB阻抗测试报告确认板厂做出来的阻抗是否在85欧姆±10%范围内。链路协商Linux下用lspci -vvv看设备有没有枚举到LinkSta协商到多少速率、多少Lane。我在第三步栽过跟头REFCLK走线旁边有根GPIOGPIO每次翻转链路就掉一次。硬件上拉开距离、加包地之后恢复正常。这种问题从日志、代码里根本看不到所以排查别一头扎进软件里。7.2 带宽测试与性能验证设备能枚举出来不代表性能就对。带宽测试通常用两个办法一个是真实业务验证比如NVMe SSD跑dd或fio另一个是用DMA测试例程统计吞吐典型的就是Xilinx的XDMA Demo通过PCIe DMA把数据从主机搬到FPGA再打印速率。如果实测带宽远低于理论值优先查两件事Lanes是不是协商到了x4或x8而不是降级到x1。代际是不是Gen3而不是降级到Gen1或Gen2。链路的降级往往发生在系统启动阶段跑一遍lspci -vvv就能看出来。如果持续掉到低速率就要回头检查PCB阻抗、REFCLK质量和连接器接触是否可靠了。7.3 静电、搬运气流和再上电这类板卡调试时还有几个容易被忽略的琐碎问题。PCIe插槽的热插拔细节很多普通台式机允许关机插拔但不代表上电后随便拔插没问题。调试前先放电、确认断电插卡时均匀用力别刮伤金手指。还有一个散热问题很多PCIe卡带了主动散热风扇调试时风扇供电来自主板的12V如果风扇堵转或者电流过大会影响整条电源轨导致板卡复位。这种问题看起来像软件故障实际是电源余量不足。板上要预留好风扇接口的滤波电容电源选型阶段就把风扇电流算进去。画板子这件事细节决定成败。PCIe设计里的每一条规则背后都是链路预算、回流路径和电磁兼容的问题。把基本盘做对剩下的就可以交给协议本身的纠错机制去兜底。
返回列表