ARTICLE DETAIL

资讯详情

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

PCIe PCB设计核心要点:层叠、阻抗、差分走线与调试备忘

PCIe PCB设计核心要点:层叠、阻抗、差分走线与调试备忘 一直做高速数字设计的朋友只要碰过PCIe基本都有过同一段经历原理图怎么连都行一到PCB阶段就开始睡不着。PCIe这根“高速总线”说难不难说简单也真不简单尤其是从协议到PCB落地的这一段中间隔着阻抗、损耗、串扰、电源噪声、时钟抖动一大堆问题。正好最近在整理项目备忘翻到之前记录的PCIe及PCB设计要求这里头有不少是我自己踩坑踩出来的经验也有从datasheet和参考设计里扒出来的硬货。今天一次性整理成文算是一份给同行和刚入坑硬件工程师的备忘录。这篇内容不局限于某一个PCIe版本而是把从Gen1到Gen4/Gen5都适用的通用设计要求讲清楚重点覆盖PCIe系统结构、枚举过程、PCB层叠、差分走线、阻抗控制、电源去耦、时钟与弹性缓存、连接器和挡板、M.2和Mini PCIe的区别、以及调试阶段的常见问题。适合正在做FPGA PCIe、网卡、SSD、服务器主板或嵌入式高速板卡的朋友尤其是画板画到头秃、上板又点不亮的那种时刻这篇备忘可能比你先疯掉之前看到更值。1. PCIe接口与系统架构要点很多人一上来就画图结果连PCIe链路是怎么建立的、系统里都有哪些角色都没搞明白后面上板点不亮就只能干瞪眼。PCIe系统结构其实是相当清晰的搞懂它很多设计问题会自己消失。1.1 PCIe系统结构速览PCIe采用的是树状拓扑CPU侧一般集成一个Root Complex根复合体也就是整个PCIe层次结构的根节点。RC下面挂着各种Endpoint端点设备、Switch交换芯片和Bridge桥接设备。你可以把它理解成一座城市的交通枢纽RC是总站Switch是大型换乘站Endpoint是各种目的地它们之间通过PCIe链路Lane连接。实际项目中FPGA做主控的时候往往自己当RC去接下面的设备而像NVMe SSD、网卡、显卡这类设备则是标准的Endpoint。设计的时候必须搞清楚角色定位因为RC和Endpoint在配置空间、中断机制、地址映射上的处理方式差异很大。比如RC要负责配置整个总线树上的设备而Endpoint只需要被动响应配置请求。链路宽度方面PCIe支持x1、x2、x4、x8、x16等配置设计时要根据带宽需求预留充分的Lane数。以Gen3为例每个Lane单向速率8GT/sx4就是32GT/s换算成有效带宽大约是3.94GB/s考虑到编码开销。很多犯过的低级错误就是功能上只需要x1带宽却把PCIE金手指画成了x16结果层叠、间距、等长全部跟着变成地狱难度纯属给自己加戏。1.2 PCIe枚举过程与链路协商PCIe上电后的链路协商和枚举过程是排查“为啥设备识别不到”的核心背景知识。链路协商Link Training本质上是物理层的握手过程包括波特率协商、极性反转、Lane反转、均衡参数协商等。这个过程中发送端会发送训练序列TS1/TS2接收端检测到后回复双方逐级提升速率直到稳定在各自支持的速率档位。真正点不亮的时候我常规操作是先抓到链路训练状态机卡在哪一步。比如如果物理层L0没进入说明训练序列都没对齐大概率是差分对接错、极性反了或者焊桥连锡了。如果L0正常进入但枚举不过那就得往配置空间、地址映射、中断路由方向查。枚举过程是RC通过配置事务为每个设备分配总线号、设备号和功能号BDF然后读取设备的配置空间来标识设备类型和厂商ID再分配BAR基地址寄存器空间。实际调试时很多人忽略了一个细节如果PCB上把PCIe的PERST#复位信号做成了RC和Endpoint直连且RC先释放Endpoint后释放那么Endpoint可能已经处于复位状态而错过初始训练窗口表现为时好时坏。稳妥的做法是给PERST#加RC延时释放电路或者由RC用GPIO控制复位时序。2. PCB层叠设计与材料选型PCB层叠决定了高速信号的传输环境。PCIe对阻抗、损耗、串扰都非常敏感层叠设计是整块板子的地基。Chip厂商参考设计里的层叠不要无脑抄因为参考板的板材、层厚、铜箔粗糙度和你的工艺可能完全不同抄了等于没抄。2.1 层叠结构的选择思路PCIe高速信号的参考平面必须完整而且尽量做到“一个信号层挨着一个完整的GND层”。这句话听起来像废话但很多板子翻车就翻在这里为了让走线顺把PCIe信号走在两个电源层之间结果参考平面从GND变成了电源阻抗稳定性和回流路径全乱套。常用的层叠设计思路六层板优先考虑L1信号/元件面L2GNDL3信号走关键高速线L4电源L5GNDL6信号/元件面这样的结构能保证每层信号都有紧邻的完整参考平面回流路径最短。八层板或十层板则预留更多信号层和隔离层。核心原则就一条关键高速信号层必须紧贴完整地平面中间不要隔绝缘层太厚减小层间介质厚度H能让阻抗控制更容易。至于层叠厚度常见1.6mm板厚做8层各层厚度分配需要工程师精确计算。这里有个容易忽略的点板厂提供的PP半固化片和Core的介质厚度、介电常数都有公差设计时阻抗计算不要卡死在理论值留出加工公差余量才稳。2.2 板材与铜厚的考量普通FR4在PCIe Gen1/Gen22.5GT/s和5GT/s时代基本够用但到了Gen38GT/s以及Gen416GT/s、Gen532GT/s介质损耗的影响已经不容忽视。FR4的Dk介电常数大约4.2-4.5Df损耗因子大约0.015-0.02在10GHz以上的高频段损耗明显。工程上需要根据走线长度和信号速率评估链路预算。这条链路预算的概念类似快递运输发送端发出的信号幅度是固定的走线、连接器、过孔都是损耗源链路越长、速率越高到接收端眼图睁开越小。Gen3跑8GT/s时FR4上6英寸以上的走线就需要仔细做插损评估最好是直接用MegaTron6、RO4350B这类低损耗板材或者至少对关键链路使用低Df的层叠方案。铜箔方面常规HTE铜箔高温延伸铜箔在追求更低损耗时会被HVLP超低粗糙度铜箔替代。原因很直接铜箔粗糙度越大导体损耗越大尤其在高频段趋肤效应让电流集中在铜箔表面粗糙表面等于变相延长了电流路径插损自然变差。很多Gen4/Gen5设计失败案例最后排查到板厂用了标准粗糙度铜箔才知道问题出在“底层建筑”上。我自己测量过几块板子同一叠层设计HVLP铜箔比标准铜箔在16GHz时的插损可以改善2-3dB以上这对PCIe Gen4链路余量来说相当可观。2.3 阻抗控制与计算PCIe差分阻抗要求在85Ω有的是100Ω取决于规范版本和实际应用标准PCIe规范中为85Ω差分。这句话看起来简单但真正计算的时候线宽、线距、介质厚度、铜厚、阻焊厚度每个参数都影响最终的阻抗。关键计算公式隐含在微带线和带状线模型中微带线信号层在外层阻抗受阻焊层影响较大带状线信号层在内层阻抗由上下介质厚度和线宽决定受外界干扰小我见过不少工程师拿着SI9000算出阻抗后直接交付生产结果实测偏差5-7Ω。原因基本都是介质厚度取值用了板厂的名义值而不是实际半固化片压合后的厚度。我的建议是画板前先把叠层图和阻抗需求发给板厂让板厂按自己的工艺参数给出推荐线宽线距这比自己闷头算靠谱得多。可以把板厂的阻抗线算作“板厂支持的一部分”别不好意思问这是省事不是麻烦。3. PCIe差分对布线规则到了布线阶段规则的重要性开始凸显。PCIe高速信号本质上走的是差分对一对TX、一对RX布线时需要同时关注对内等长、对间等长、阻抗连续、参考平面完整性、过孔换层等N个维度。这里我挑几个最容易出现问题的地方重点展开。3.1 差分对走线与阻抗控制PCIe差分对的典型走线结构是线宽按目标阻抗算出常见100Ω差分时约4-5mil线宽线距7-8mil线距保持恒定。需要重点强调的是差分阻抗是靠线间距S和到参考平面的介质厚度H共同决定的不要只顾着线宽。线距一旦变化S变化导致耦合变化阻抗跟着飘反射系数变大眼图质量直接下降。我走线时的习惯差分对内P/N两线务必平行等距避免出现一处靠近、一处远离的蛇形过孔处P/N对要打对称过孔且过孔周围挖掉非功能焊盘non-functional pad这样可以减少过孔寄生电容对阻抗的影响。很多人只注意了走线段的阻抗漏了过孔段最后TDR测出来过孔位置有个明显下凹原因就在这里。PCIe走线还要远离其他高速信号或时钟信号线保持至少3W间距W为线宽重要链路做到5W以上。层间分隔上如果PCIe走线上下层有其他平行走线尽量走成垂直方向减少层间串扰。3.2 等长设计与计算PCIe差分对内等长一般要求P和N长度差控制在5mil以内Gen3以上建议3mil以内更稳。对间等长方面TX/RX各Lane之间也要求等长容差通常在几十mil级别具体看规范或芯片手册。那问题来了这个等长差到底会产生什么影响对内不等长会造成差分信号的共模分量增大正负信号无法完全抵消产生共模噪声EMI变差。对间不等长则会影响数据总线对齐尤其是当PCIe还带上Sideband信号、参考时钟时时序预算会变得紧张。等长计算的一个实际做法先在布线工具里对目标信号网络添加Match Group设置目标等长容差比如TX差分对目标长度设为3000mil容差±5mil。布线完成后运行等长优化蛇形线长度补差最好加在不拥挤的区域同时保证蛇形线的Pitch至少为线距的3-4倍否则蛇形线自身就成为阻抗不连续点等于给自己挖坑。3.3 PCIe的发送差分对间需不需要等长借着上面继续说一个高频问题PCIe的发送差分对之间即不同Lane之间到底需不需要等长很多新手会在这个问题上纠结。答案是需要但这和“对内等长”的目的不完全一样。Lane间等长主要影响的是接收端的数据对齐。PCIe协议里有弹性缓存Elastic Buffer机制可以容忍一定程度的Lane间偏移Lane-to-Lane Skew但容差是有限的。比如Gen3规范里不同Lane之间的最大偏移容差大概在几十纳秒到几个UI之间超过这个值接收端就无法正确对齐数据了。普通走线长度的偏差几英寸以内问题不大但如果你有一组信号绕了远路另一组贴着走长度差超过几英寸就可能引发对齐问题。工程上习惯做法是保证同组Lane的等长比如x4的四个LaneTX侧四对全部等长到一个目标值RX侧同理。不求绝对相等但至少控制在50mil以内给自己留足余量。4. 电源设计、时钟与信号完整性PCIe的电源设计往往比信号布线更让人头疼。高速数字电路对电源噪声极其敏感尤其是PLL和时钟恢复电路的电源稍微有点纹波眼图就变差。这里我把电源和时钟两端单独拉出来说。4.1 电源去耦与噪声控制PCIe的电源轨常见的有0.9V、1.8V、3.3V等不同电压轨的用途不同对噪声的容忍度也不同。最容易出问题的是给PHY、SerDes供电的模拟电源比如PCIE_AVDD、VDD_1A等这些电源轨对纹波要求很高通常需要小于10mV甚至更低。去耦网络的设计不仅仅是“多放几个电容”而是要考虑电容的自谐振频率。常用的去耦策略是在负载附近布置多级电容组合大容量10uF~100uF负责低频储能小容量0.01uF~0.1uF负责高频去耦。摆放时小电容要尽量靠近电源引脚过孔尽量直连。特别要提的是电源层分割很多PCB设计者喜欢在电源层切一块区域给模拟电源用。但分割会产生跨分割信号问题——如果高速信号走过电源层分割缝隙回流路径被切断信号完整性必然恶化。正确做法是尽量用完整电源平面给模拟电源供电然后通过磁珠或LC滤波器在芯片附近做局部隔离。这样既能保证噪声隔离又不破坏回流路径。4.2 时钟频偏与弹性缓存PCIe的参考时钟通常为100MHz规范要求频偏在±300ppm以内甚至更严格如Gen3要求±100ppm。这里有一个很多人没想通的点PCIe并没有强制收发两端使用同一时钟源因为协议里已经设计了时钟补偿机制。真正解决跨时钟域问题的核心是接收端的弹性缓存Elastic BufferEB。弹性缓存的工作机制其实很“生活化”。假设发送端按自己的时钟把数据写入一个缓冲区接收端按自己的时钟从缓冲区读数据。如果两端时钟频率完全一致读写指针相对位置保持不变如果存在微小频偏接收端的读写速率就会有差异缓冲区就会逐渐满或空。为了避免溢出弹性缓存会定期对字符进行插入或删除操作通过调整SKP符号Skip字符来吸收频偏。链路两端参考时钟如果来自同一个PLL可以配置为非展频模式如果用独立时钟源则需要考虑内部时钟补偿机制。实际设计中我见过不少人忽略了SKP符号对等长和FIFO设计的影响结果在调试中遇到莫名其妙的CRC Error。这类问题在写驱动的朋友那里尤其常见——FPGA里实现了PCIe硬核但接收路径的FIFO深度不够一旦时钟源频偏大缓冲区就溢出。解决方向确认参考时钟的ppm是否符合规范检查是否需要配置时钟展频SSCSpread Spectrum Clocking在驱动或逻辑里增加足够深度的FIFO以及溢出处理逻辑。5. 连接器、封装与结构设计要点PCIe除了芯片到芯片的板内连接更多场合是板对板互联比如PCIE插槽、M.2接口、Mini PCIe接口等。连接器选型和结构设计直接影响高速性能和机械兼容性。5.1 PCIe连接器与挡板尺寸标准PCIe卡Add-in CardAIC用的是PCIe金手指插槽。金手指的引脚间距是1.0mmx1、x4、x8、x16只是在金手指长度上做文章。金手指位置的开槽、卡扣位置、高度等都必须符合PCIe CEM规范否则插不进标准的PCIe插槽或者装上后跟机箱冲突。挡板尺寸这里单独提醒一下PCIe半高挡板Low Profile Bracket的尺寸很多人画错过。典型的半高挡板高度约为79.2mm宽度为12mm标准全高挡板高度约120mm。安装孔位和开孔位置也有标准要求如果自己画板打样做挡板务必先找到对应的机械图纸别拿卡尺量了个大概就开孔装不进机箱的板卡连调试机会都没有。5.2 Mini PCIe和M.2接口的区别这两个接口经常让新手犯迷糊虽然长得都不大但设计思路完全不同。Mini PCIe是较早的接口外形上类似Mini Card150Pin接口较宽内部走PCIe x1也支持USB 2.0和SATA部分信号取决于PIN定义。它采用标准52Pin edge connector其实完整是54Pin机械尺寸固定。典型应用是早期的笔记本无线网卡、3G/4G模块。M.2接口原NGFF是完全不同的形态它的连接器是一个窄长的插槽宽度有12mm、16mm、22mm、30mm等长度常见2242、2260、2280前两位是宽度22mm后两位是长度。M.2并不只走PCIe信号根据Key定义不同可以走SATA、USB、PCIe等多种协议组合。比如M.2 Key B常用于SATA/PCIe x2Key M常用于PCIe x4NVMe SSD常见Key A/E常用于Wi-Fi/蓝牙模块。设计上的一个重要区别Mini PCIe的PCIe x1信号有固定的Pin定义而且在卡的边缘做金手指时PCB的沉板深度、倒角都要遵循Mini PCIe规范M.2则依靠连接器进行信号传输需要严格按照Key的引脚顺序设计连接器的封装同时注意M.2连接器的料号选型不同Key和卡宽使用的连接器不一样。再补充一点现在很多新项目直接舍弃了Mini PCIe改用M.2因为M.2更薄、更高密度且支持NVMe等更高带宽协议。但如果是老产品维护或者做兼容性要求高的设备还得两者都考虑清楚。5.3 过孔、反焊盘和背钻PCIe高速信号换层时必然用到过孔。过孔对阻抗的影响是高速链路设计的重头戏。常规过孔在信号经过时会产生一个寄生电容和寄生电感阻抗发生突变反射随之产生。到了Gen3及更高版本普通过孔已经不能随便用了需要采取以下措施反焊盘Anti-pad扩大到足够尺寸减小过孔与平面间的寄生电容过孔内径尽量小增加过孔的长径比控制必要时做背钻Backdrill把未使用的过孔段钻掉消除Stub效应在嘉立创EDA、AD、Cadence Allegro等工具里都可以设置过孔的反焊盘和背钻参数。实际项目中8层以上PCB做Gen4设计背钻几乎成了标配。如果设计工具不直接支持背钻参数设置至少要在制造说明文件里把背钻的钻深和区域写清楚并跟板厂确认可行性否则高速信号会以多余的过孔残桩为代价眼图闭合是迟早的事。6. 常见问题与设计检查清单最后这部分我把实际调试中遇到的典型问题汇总一下也附上一份设计自查清单。每个问题背后都是血与泪的教训。6.1 常见设计问题与排查问题现象可能原因排查思路设备识别不到链路训练失败差分对极性接反、Lane接错、参考时钟异常检查原理图极性测量100MHz时钟用集成逻辑分析仪抓训练序列能识别但吞吐量上不去PCIe Link训练在Gen1/Gen2未到目标速率检查链路协商返回的速率确认两端能力寄存器是否开启Gen3/Gen4不定时出现CRC Error或Link Down时钟频偏过大、电源噪声过大、走线干扰检查参考时钟ppm测量电源纹波观察接收端眼图某几对Lane不工作过孔残桩过长、阻抗突变、相邻层串扰TDR测阻抗检查过孔背钻调整走线层或换层位置高温下误码率升高电源热漂移、板材介质损耗随温升变差检查板材Df温变特性做高低温测试评估链路余量这里重点说说“能识别但吞吐量上不去”的坑。有一次遇到一个项目PCIe能跑起来但只锁定在Gen2Gen3上不去。眼图测试看起来还行最后排查下来是TX端的预加重Pre-emphasis和接收端均衡Equalization系数没有通过链路训练的协商阶段。原因是PCIe Gen3引入了接收端均衡技术如果发送端没有开启预加重或均衡参数配置不对接收端眼图余量不足就会协商降速。这个问题的解决要在驱动或BIOS/固件层面调整均衡系数而不仅仅是PCB问题。6.2 设计自查清单每条经验都是从实际项目里提炼出来的建议画板前逐项打勾差分对极性确认TX_P接RX_PTX_N接RX_N别在原理图阶段就反了阻抗设计确认差分阻抗85Ω并按阻抗要求反推线宽线距跟板厂确认叠层差分对内等长P/N差控制在3-5mil以内Lane间等长同组Lane长度差尽量控制在50mil以内走线参考平面确认高速信号层下方是完整GND没有被分割过孔处理反焊盘足够、必要时背钻、打孔尽量对称电源去耦关键电源引脚附近有0.1uF和0.01uF高频电容时钟电路100MHz参考时钟走线用包地处理远离其他高速信号复位时序PERST#延时释放避免上电同时段竞争挡板尺寸半高挡板按规范开孔先核对机械图再打样还有一个容易被忽略的点PCIe参考时钟的走线如果必须穿过电源分割区请务必在下方加一条GND桥梁走线保证回流路径不绕圈。这种细节往往是高倍示波器下才能卡到的噪声来源。6.3 调试阶段的测试手段最后说点调试方法。如果有条件PCIe调试最推荐用协议分析仪能直接抓包看到Training Sequence、LTSSM状态迁移和包层错误。但协议分析仪价格不菲很多工程师手头只有示波器那就退而求其次利用示波器测量高频信号眼图。眼图测量时注意不能直接在PCIe差分对末端测因为探头和引线本身就会影响信号质量。尽量使用差分探头并在测试点设计时预留TDR测试焊盘和高频SMA连接器位置。另外眼图测量时需要触发到特定码型可以用示波器的串行数据触发功能或者利用PCIe的Training Sequence作为触发源。如果你用的是FPGA平台Xilinx和AlteraIntel的PCIe硬核IP都提供了Link Training状态机和错误计数器的寄存器写个小程序把状态寄存器读出来比用示波器一点一点抓波形的效率高得多。这也是FPGA做PCIe调试比ASIC方便的优势之一。
返回列表