
1. 为什么PCIE值得每一个硬件工程师死磕做硬件这行十几年如果让我挑一个“绕不过去又最容易翻车”的接口PCIE绝对排得上前三。你去看招聘网站上那些硬件岗位的JD但凡涉及到服务器、存储、工控、AI加速卡、交换机、甚至高端消费类主板PCIE几乎是必选项。但真正能把PCIE从协议层到物理层再到PCB落地讲清楚的人说实话并不多。大部分人停留在“知道有这么个东西”“照着参考设计抄一抄”的阶段一旦信号跑不起来、链路训练失败、误码率超标就抓瞎了。这篇文章我想聊的就是把PCIE这个东西从基础原理一路拆到硬件设计实战。核心关键词就几个PCIE协议、差分信号、信号完整性、PCB设计、链路训练。适合谁看刚入行一两年、做过一些低速接口但没怎么碰过PCIE的硬件工程师正在做PCIE转网口、PCIE Switch、或者PCIE加速卡这类项目的朋友还有就是那些被“PCIE枚举过程”“LTSSM阶段”“XDMA”这些词搞得头大、想找个系统梳理的人。我先说一个真实的场景。之前有个朋友做一块PCIE转千兆网口的板子用的方案是PCIE转PCI再转网口原理图检查了三遍没问题PCB也照着参考设计走的结果板子回来插上电脑系统根本不认设备。他以为是驱动问题折腾了两天最后发现是PCIE差分对的走线长度偏差太大导致链路训练在Polling阶段就挂了。这种问题你不懂PCIE的底层机制根本无从下手。所以这篇文章不会只给你讲“PCIE是什么”我会把协议分层、枚举过程、LTSSM状态机、差分信号完整性、PCB叠层与走线规则、甚至金手指尺寸和连接器选型这些全部串起来讲。你看完之后至少能做到拿到一个PCIE相关的项目知道从哪里下手知道哪些地方容易出问题知道怎么去排查。2. PCIE协议核心机制拆解从枚举到LTSSM2.1 PCIE的分层结构与数据流转逻辑PCIE协议本质上是一个分层协议跟网络协议栈的思路很像。它分为三层事务层Transaction Layer、数据链路层Data Link Layer、物理层Physical Layer。每一层各司其职层层封装和解封装。事务层负责什么它处理的是TLPTransaction Layer Packet也就是事务层包。CPU要读一个设备的配置空间或者要往内存里写数据最终都会变成TLP在链路上传输。TLP的类型很多常见的有Memory Read、Memory Write、Configuration Read、Configuration Write、Completion等等。你如果抓过PCIE的协议分析仪数据会看到满屏的TLP刚开始看会很晕但理解了类型之后就有规律了。数据链路层在TLP的基础上加了一个Sequence Number和LCRCLink CRC保证传输的可靠性。如果接收端发现LCRC校验失败会通过NAK机制要求重传。这一层还负责DLLPData Link Layer Packet的传输比如Ack/Nak、电源管理相关的消息。物理层是最底层的负责把数据串化成差分信号发出去。PCIE的物理层用的是差分信号每个Lane由一对发送差分线和一对接收差分线组成。Gen1的速率是2.5GT/sGen2是5GT/sGen3是8GT/sGen4是16GT/sGen5是32GT/s。注意这里说的是GT/sGiga Transfers per second不是Gbps因为PCIE用的是8b/10b编码Gen1/Gen2或者128b/130b编码Gen3及以上实际有效带宽要打个折扣。我画个简单的类比帮你理解事务层就像你写的一封信数据链路层是信封上的挂号条和防拆封条物理层就是邮递员骑的摩托车。信的内容、信封的格式、摩托车的速度三者缺一不可。2.2 PCIE枚举过程系统是怎么“发现”你的设备的PCIE枚举是很多新手最困惑的地方。板子插上去系统怎么就知道有个设备地址怎么分配的BAR空间是怎么回事整个过程大致是这样的系统上电后RCRoot Complex会从Bus 0、Device 0、Function 0开始扫描。每个PCIE设备都有一个配置空间前64字节是标准配置头里面有Vendor ID、Device ID、Class Code、BARBase Address Register等关键信息。RC通过配置读写TLP去读取这些信息如果读到的Vendor ID不是0xFFFF就说明这个位置有设备。枚举的核心目的是分配总线号和地址空间。RC会遍历整个拓扑给每个桥设备分配一个Bus号范围给每个设备的BAR分配一段内存或IO地址。你如果做过PCIE转网口的项目就会发现网口芯片的BAR空间需要映射到系统内存里驱动才能通过读写这段内存来控制网口芯片。这里有个坑BAR空间的大小和类型必须和设备的实际需求匹配。如果BAR设置得太小驱动访问越界就会出问题如果设置得太大系统资源不够枚举可能失败。我见过有人做PCIE Switch的时候下游设备的BAR空间没算对导致系统只能识别到部分设备。还有一个常见问题是枚举顺序。PCIE枚举是从上到下、从外到内的。如果拓扑里有SwitchRC会先枚举Switch本身然后通过Switch的下游端口继续枚举。如果Switch的配置有问题下游设备可能完全枚举不到。2.3 LTSSM状态机链路训练到底在训练什么LTSSMLink Training and Status State Machine是PCIE物理层最核心的状态机。链路训练的过程就是LTSSM在各个状态之间跳转的过程。你如果抓过LTSSM的日志会看到Detect、Polling、Configuration、Recovery、L0这些状态。Detect阶段检测对端是否存在。发送端会发送Receiver Detection序列通过测量差分线上的阻抗变化来判断对端是否有接收器。如果检测不到就停在Detect状态。Polling阶段双方交换TS1和TS2有序集协商链路宽度和速率。这个阶段会确定用几个Lane、跑什么速率。如果双方能力不匹配比如一边只支持Gen1 x1另一边支持Gen3 x4最终会协商到双方都支持的最低配置。Configuration阶段这个阶段最复杂包括Lane Numbering、Lane Reversal、Polarity Inversion等子阶段。Lane Numbering是给每个Lane分配编号Lane Reversal是处理走线反转的情况Polarity Inversion是处理差分对正负接反的情况。PCIE协议允许差分对正负接反物理层会自动纠正这个设计很贴心。Recovery阶段当链路出现错误或者需要改变速率时会进入Recovery。比如从Gen1切换到Gen3就要经过Recovery。L0阶段正常工作状态。TLP和DLLP在这个状态下传输。我实际调试中遇到最多的问题就是卡在Polling或者Configuration阶段。原因通常是差分信号质量太差、参考时钟不稳定、或者走线长度偏差太大。有一次我用了一颗国产的PCIE转网口芯片参考设计上用的是100MHz差分时钟我为了省成本换了一颗普通的晶振结果链路训练死活过不去。后来换回差分时钟一次就过了。这个教训告诉我PCIE的参考时钟绝对不能省。3. 差分信号与信号完整性PCIE物理层的命门3.1 差分信号为什么是PCIE的必然选择PCIE用差分信号不是随便选的。差分信号的核心优势有三个抗共模干扰、抑制EMI、提高信号完整性。差分信号传输的是两条线上电压的差值。如果外界有共模干扰两条线会同时受到相同的影响差值不变接收端就能正确恢复数据。单端信号就没这个能力干扰直接叠加在信号上很容易误判。PCIE的差分信号幅度典型值是800mV到1200mV差分阻抗要求是100欧姆±10%。这个100欧姆不是随便定的它和PCB的叠层、线宽、线间距都有关系。你如果用过阻抗计算工具会发现要同时满足100欧姆差分阻抗和50欧姆单端阻抗叠层设计需要仔细调整。差分对的走线有几个硬性要求等长、等距、参考平面完整。等长是为了保证两条线上的信号同时到达否则差分信号会退化成共模信号产生EMI。等距是为了保证差分阻抗一致。参考平面完整是为了保证回流路径连续否则阻抗会突变引起反射。我见过最离谱的一个案例有人把PCIE差分对走在PCB边缘参考平面被挖空了一大块结果信号质量惨不忍睹眼图几乎闭合。后来重新布线把参考平面补全眼图立刻打开。所以你在做PCIE布线的时候一定要确保差分对下面有完整的GND平面。3.2 信号完整性仿真ADS和HyperLynx怎么选信号完整性仿真在PCIE设计中不是可选项是必选项。尤其是Gen3及以上速率到了8GT/s甚至16GT/s不仿真基本等于赌博。常用的仿真工具有Keysight ADS、Mentor HyperLynx、Cadence Sigrity等。ADS功能最强大但学习曲线也最陡。HyperLynx上手快适合做快速的预布局仿真。Sigrity和Cadence的PCB工具集成得好适合做后仿真。我个人的习惯是前期用HyperLynx做拓扑探索和阻抗扫描后期用ADS做详细的通道仿真。拓扑探索的目的是确定走线长度、过孔数量、连接器选型这些参数。通道仿真的目的是看眼图、浴盆曲线、误码率。仿真的时候有几个关键参数必须设置对IBIS模型、传输线模型、过孔模型、连接器模型。IBIS模型从芯片厂商官网下载传输线模型根据PCB叠层计算过孔模型可以用3D电磁仿真提取连接器模型通常厂商会提供S参数。我踩过的一个坑是仿真的时候用的是理想电源结果实际板子上电源噪声很大导致眼图恶化。后来在仿真里加入了电源噪声模型结果和实测就吻合了。所以仿真不能只仿信号电源完整性也要考虑。3.3 PCB叠层设计与阻抗控制实战PCIE的PCB叠层设计核心目标是控制阻抗、减少损耗、保证参考平面完整。以常见的4层板为例叠层通常是Top信号、GND、Power、Bottom信号。这种叠层做Gen1/Gen2还可以做Gen3就有点勉强了。因为4层板的介质厚度通常比较大走线的损耗会比较高。如果要做Gen3及以上建议至少6层板Top信号、GND、Inner1信号、Inner2信号、Power、Bottom信号。这样可以让PCIE差分对走在Inner层参考平面更完整损耗也更小。阻抗控制方面100欧姆差分阻抗的计算公式大致是Zdiff ≈ 2 × Z0 × (1 - k)其中Z0是单端阻抗k是耦合系数。实际计算需要用阻抗计算工具比如Polar SI9000或者嘉立创的阻抗计算器。我通常会把线宽设在4mil到6mil之间线间距设在6mil到8mil之间具体数值根据叠层调整。这里有个经验差分对的线间距不要太小。线间距太小耦合太强差分阻抗会偏低而且加工难度大。一般建议线间距至少是线宽的两倍。另外差分对之间的间距也要注意通常建议至少是差分对内部间距的5倍以上减少串扰。过孔的处理也很关键。PCIE差分对换层的时候过孔会引入阻抗不连续。为了减少影响可以在过孔旁边加GND过孔提供回流路径。如果速率很高还可以考虑背钻把过孔的stub去掉。4. PCIE硬件设计实战从原理图到PCB落地4.1 PCIE转网口电路设计要点PCIE转网口是一个很典型的PCIE应用场景。常见的方案有PCIE转PCI再转网口、PCIE直接转网口比如Realtek RTL8111、Intel I210等、PCIE Switch加网口PHY。以PCIE直接转网口为例硬件设计要点包括PCIE接口部分、网口PHY部分、电源部分、时钟部分。PCIE接口部分差分对的走线要严格按照100欧姆差分阻抗设计长度偏差控制在5mil以内。参考时钟通常用100MHz差分时钟如果网口芯片支持也可以用25MHz晶振内部倍频。但根据我的经验能用差分时钟就用差分时钟稳定性更好。网口PHY部分MDI差分对的阻抗通常是100欧姆和PCIE类似。但网口的差分对通常需要加共模扼流圈和ESD保护器件。共模扼流圈的位置要尽量靠近连接器ESD器件的寄生电容要小否则会影响信号质量。电源部分PCIE接口的3.3V和12V电源要加足够的滤波电容。网口PHY通常需要1.0V、1.8V、3.3V等多路电源要确保电源噪声足够低。我见过一个案例网口跑千兆的时候丢包严重最后发现是PHY的1.0V电源纹波太大换了LDO之后问题解决。时钟部分PCIE的参考时钟抖动要求很严格Gen3要求RMS抖动小于1ps。如果时钟质量不好链路训练可能失败或者链路不稳定。建议使用专用的时钟发生器芯片不要用普通的晶振。4.2 PCIE Switch流向与配置实战PCIE Switch的流向配置是很多项目的难点。Switch的上游端口连RC下游端口连设备。数据从RC到设备或者从设备到RC都要经过Switch的转发。Switch的配置包括端口配置、BAR空间分配、路由表配置。端口配置决定每个端口是上游还是下游以及链路宽度和速率。BAR空间分配决定每个下游设备能用的地址范围。路由表配置决定TLP怎么转发。我做过一个项目用PCIE Switch扩展出4个下游端口分别接SSD、网口、USB控制器和FPGA。调试的时候发现SSD能识别但网口识别不了。查了半天发现是Switch的下游端口BAR空间分配有问题网口的BAR空间和SSD的BAR空间重叠了。后来重新分配BAR空间问题解决。Switch的配置通常通过EEPROM或者I2C接口加载。有些Switch芯片支持引脚配置但灵活性差。建议用EEPROM把配置写进去上电自动加载。配置工具通常芯片厂商会提供比如Microchip的Switch芯片有专门的配置软件。还有一个常见问题是Switch的散热。PCIE Switch芯片功耗通常不小尤其是多端口的Switch。如果散热不好芯片温度过高可能导致链路不稳定甚至掉线。建议在Switch芯片上加散热片PCB上多打过孔帮助散热。4.3 金手指尺寸与连接器选型避坑PCIE金手指的尺寸是有标准的。标准PCIE x1金手指长度是25mmx4是39mmx8是56mmx16是89mm。金手指的厚度通常是1.5mm镀金厚度通常是0.76um。连接器选型的时候要注意阻抗匹配、插拔寿命、安装方式。PCIE连接器的差分阻抗要求是100欧姆选型的时候要看厂商的规格书。插拔寿命通常要求至少50次工业级应用要求更高。安装方式有直插和贴片两种直插的机械强度更好贴片的适合自动化生产。我踩过的一个坑是用了便宜的PCIE连接器结果插拔几次之后接触不良链路训练时好时坏。后来换了品牌连接器问题解决。所以连接器不要省选大厂的比如TE、Molex、Amphenol。金手指的PCB设计也有讲究。金手指区域的铜箔要加厚通常用1oz或2oz铜。金手指的倒角要符合标准否则插不进去。金手指下面的参考平面要完整否则阻抗不连续。5. 常见问题与排查技巧实录5.1 链路训练失败排查速查表现象可能原因排查方法解决方案卡在Detect对端未上电、参考时钟缺失测量对端电源、测量参考时钟检查电源时序、更换时钟源卡在Polling差分信号质量差、极性接反测量差分信号眼图、检查极性优化走线、允许极性反转卡在ConfigurationLane映射错误、走线长度偏差大检查Lane编号、测量走线长度调整Lane映射、重新布线链路降速信号完整性差、参考时钟抖动大测量眼图、测量时钟抖动优化叠层、更换时钟芯片链路不稳定电源噪声大、散热不良测量电源纹波、测量芯片温度增加滤波、改善散热这个表是我根据实际调试经验整理的基本上覆盖了80%的链路训练问题。你如果遇到链路训练失败可以按这个表逐项排查。5.2 信号完整性问题的独家避坑技巧技巧一差分对走线不要跨分割。这是最基本的但也是最容易犯的。跨分割会导致阻抗突变信号反射严重。如果实在避不开可以在跨分割处加缝合电容但效果有限。技巧二过孔不要打在差分对的焊盘上。焊盘上的过孔会导致阻抗不连续而且加工的时候容易出问题。建议在焊盘旁边打孔然后用短线连接到焊盘。技巧三参考时钟走线要包地。参考时钟是敏感信号容易被干扰。走线的时候两边加GND过孔形成屏蔽。如果空间允许可以在时钟线上下层也铺GND。技巧四PCIE差分对的测试点要慎重。有些人在差分对上加测试点方便调试。但测试点会引入寄生电容影响信号质量。如果一定要加测试点的寄生电容要小于0.5pF而且测试点要尽量小。技巧五电源滤波电容要靠近芯片引脚。PCIE芯片的电源引脚通常有多个每个引脚都要加滤波电容。电容要尽量靠近引脚走线要短而粗。我见过有人把电容放在芯片背面结果电源噪声还是很大因为过孔的寄生电感太大了。5.3 枚举失败的典型场景与解决方法枚举失败是PCIE调试中最常见的问题之一。典型场景包括设备完全不识别、设备识别但驱动加载失败、设备识别但BAR空间分配错误。设备完全不识别通常是物理层的问题。检查电源、时钟、差分信号、连接器。如果物理层没问题可能是配置空间的问题。检查Vendor ID和Device ID是否正确检查配置空间的读写是否正常。设备识别但驱动加载失败通常是BAR空间或者中断的问题。检查BAR空间的大小和类型是否和驱动匹配检查中断引脚是否配置正确。设备识别但BAR空间分配错误通常是枚举顺序或者Switch配置的问题。检查Switch的配置确保下游设备的BAR空间不重叠。我遇到过一个很诡异的问题设备在Windows下能识别在Linux下识别不了。后来发现是Linux的枚举顺序和Windows不一样Switch的配置需要调整。所以做PCIE项目最好在多个操作系统下测试。6. 从XDMA到实战PCIE高阶应用与经验总结6.1 XDMA在FPGA与PCIE通信中的实战应用XDMA是Xilinx提供的一个IP核用于FPGA和PCIE之间的高速数据传输。它支持DMA读写可以绕过CPU直接访问内存适合高带宽、低延迟的应用场景。XDMA的配置包括BAR空间配置、DMA通道配置、中断配置。BAR空间通常需要配置一个大的BAR用于DMA传输一个小的BAR用于寄存器访问。DMA通道可以配置为H2CHost to Card和C2HCard to Host分别用于主机到卡和卡到主机的数据传输。我做过一个项目用XDMA实现FPGA和主机的数据采集。主机通过XDMA把数据写到FPGA的DDR里FPGA处理完再通过XDMA写回主机。调试的时候发现DMA传输不稳定偶尔会丢数据。后来发现是DMA描述符的地址对齐问题改成4KB对齐之后问题解决。XDMA的驱动通常用Xilinx提供的官方驱动但有时候需要根据实际需求修改。比如中断处理、DMA通道的优先级等。修改驱动的时候要注意不要破坏原有的DMA机制。6.2 PCIE 6.0与未来趋势的硬件设计挑战PCIE 6.0的速率到了64GT/s用了PAM4编码。PAM4和NRZ不一样NRZ是两电平PAM4是四电平。四电平意味着信噪比要求更高信号完整性挑战更大。PCIE 6.0的硬件设计挑战包括通道损耗、串扰、参考时钟抖动、连接器带宽。通道损耗在64GT/s下非常严重需要用到更好的PCB材料比如Megtron 6或者更高级的材料。串扰也更严重差分对之间的间距要更大。参考时钟的抖动要求更严格可能需要用到更高级的时钟芯片。连接器的带宽也要跟上普通的PCIE连接器可能不支持64GT/s。虽然PCIE 6.0现在还用得不多但做硬件设计要有前瞻性。如果你现在做的是Gen3或Gen4的项目可以提前了解一下Gen5和Gen6的设计要求为以后做准备。6.3 个人经验PCIE硬件设计的几个关键原则做了这么多年PCIE硬件设计我总结了几条原则分享给你。原则一参考设计是底线不是上限。芯片厂商的参考设计通常能保证基本功能但不一定是最优的。你要根据实际需求优化比如走线长度、叠层设计、电源滤波等。原则二仿真和实测要结合。仿真能帮你快速筛选方案但仿真不能完全替代实测。仿真模型和实际PCB总有差异实测才能发现真正的问题。原则三调试工具要齐全。PCIE调试需要用到协议分析仪、示波器、误码仪等。协议分析仪能帮你看TLP和DLLP示波器能帮你看信号质量误码仪能帮你测误码率。这些工具虽然贵但能帮你省很多时间。原则四多和芯片厂商的FAE沟通。芯片厂商的FAE通常有丰富的调试经验遇到问题可以找他们帮忙。有时候他们的一句话能帮你省几天的时间。原则五文档要写清楚。PCIE设计涉及的东西很多原理图、PCB、仿真报告、调试记录都要写清楚。不然过几个月再回头看自己都忘了当时怎么设计的。最后再分享一个小技巧PCIE差分对的走线如果空间允许尽量走直线。直线走线的阻抗最稳定信号质量最好。如果一定要拐弯用圆弧或者45度角不要用90度角。90度角会导致阻抗突变信号反射严重。这个技巧虽然简单但很实用。