ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

PCIE硬件设计实战:从协议原理到信号完整性、枚举调试与PCB布局

PCIE硬件设计实战:从协议原理到信号完整性、枚举调试与PCB布局 1. 从一根“金手指”说起PCIE接口到底是个什么东西我第一次真正把PCIE当回事是拆一台旧服务器的时候。当时想给一块阵列卡换个插槽结果发现主板上那几条长短不一的插槽插错了根本点不亮插对了还得看CPU给多少条通道。那时候我才意识到PCIE这东西远不是“插上去就能用”那么简单它背后是一整套高速串行通信的体系从物理层的差分信号到协议层的枚举过程再到PCB上的走线规则每一环都能单独拎出来讲上半天。PCIE全称PCI Express是目前绝大多数计算机和嵌入式设备里最主流的板级高速互联总线。你平时用的显卡、固态硬盘、网卡、采集卡几乎都是通过它挂在系统上的。它解决的问题很直接在芯片与芯片、板卡与主板之间提供一条带宽足够高、延迟足够低、还能热插拔的数据通道。和早年那种并行总线不同PCIE用的是高速差分信号做串行传输一条lane由一对发送差分线和一对接收差分线组成全双工收发互不干扰。这篇文章适合谁看如果你正在做硬件设计尤其是涉及PCIE接口的板卡、转接卡、交换机或者嵌入式主板那这里面的内容基本都能直接用上。如果你只是对PCIE好奇想搞明白为什么显卡插槽有长有短、为什么走线要那么讲究也能从原理层面得到答案。我会从协议基础讲到硬件设计实战重点放在信号完整性、PCB布局布线、枚举流程这些真正会踩坑的地方尽量把“为什么这么做”讲透而不是只丢一堆结论。2. PCIE协议与体系结构先搞懂它在干什么2.1 分层结构事务层、数据链路层、物理层PCIE协议是分层的这一点和网络协议栈很像但它的层次更贴近硬件。从高到低大致分三层事务层、数据链路层、物理层。每一层各司其职层层封装最终变成差分线上的一串比特流。事务层是最上面一层负责生成和解析TLP也就是事务层包。你发起的读写请求、配置访问、消息中断都是在这一层被组织成TLP的。TLP里包含了请求类型、地址、数据长度、目标设备等信息。事务层还管着流量控制和事务排序保证请求不会把接收端撑爆。数据链路层夹在中间主要干两件事一是给TLP加上序列号和CRC校验生成DLLP二是做ACK/NAK重传机制。如果接收端发现包错了会发NAK让发送端重发保证链路上传输的数据是可靠的。这一层还负责链路初始化时的状态机管理。物理层是最底层直接跟差分信号打交道。它把数据链路层下来的包做8b/10b或者128b/130b编码然后串行化通过发送差分对发出去。接收端做时钟恢复、均衡、解码再往上送。物理层还负责LTSSM链路训练状态机这个后面会单独讲。提示很多人调PCIE调不通第一反应是去查协议其实大部分问题出在物理层——参考时钟、差分对极性、走线阻抗、AC耦合电容这些才是高频翻车点。2.2 拓扑结构根复合体、交换机和端点PCIE的拓扑是一棵树。树根叫根复合体通常集成在CPU或芯片组里它负责发起配置空间访问把整个PCIE树枚举出来。根复合体下面可以挂端点设备也可以挂交换机。端点就是实际干活的设备比如网卡、NVMe盘、显卡。每个端点都有自己独立的配置空间里面有厂商ID、设备ID、BAR寄存器等。系统启动时根复合体会遍历整棵树给每个设备分配总线号、设备号、功能号并配置BAR地址空间这个过程就叫枚举。交换机的作用是扩展端口。一个交换机有一个上行端口连到根复合体或上级交换机多个下行端口可以挂更多端点。交换机内部会根据TLP里的地址或总线号做路由转发。PCIE Switch在服务器和存储领域用得很多比如你要接几十块NVMe盘靠CPU直出的通道肯定不够就得靠Switch来扇出。这里有个容易混淆的点PCIE的“通道”和“lane”不是一回事。通道通常指逻辑上的链路lane是物理上的差分对数量。一条链路可以是x1、x2、x4、x8、x16数字就是lane的数量。lane越多理论带宽越高但协商的时候是从低往高试的最终能跑几lane取决于两端能力和链路质量。2.3 配置空间与BAR设备怎么被系统认出来每个PCIE功能都有4KB的配置空间前256字节是标准头部后面是能力结构。标准头部里有几个关键字段Vendor ID、Device ID、Class Code、Header Type还有六个BAR。BARBase Address Register是设备向系统申请地址空间的窗口。设备通过BAR告诉系统“我需要一段内存或者IO空间大小是多少。”系统枚举时读取BAR判断需要多大空间然后写回一个基地址。之后CPU访问这段地址就会被路由到对应设备。BAR的探测有个经典技巧先往BAR写全1再读回来看哪些位是硬的、哪些位是可变的就能算出空间大小。这个操作在写驱动或者调试枚举问题时经常用到。如果你自己设计PCIE板卡BAR的大小和类型一定要想清楚申请太大浪费地址空间申请太小又不够用。注意BAR空间必须按大小对齐。比如你要申请16KB的内存空间基地址的低14位必须是0。如果硬件设计时BAR实现有误枚举阶段就会分配失败设备直接不出现。3. 物理层与信号完整性差分信号不是随便拉两根线3.1 差分信号的本质为什么抗干扰靠的是“对称”PCIE物理层用的是差分信号。一条lane的发送方向有一对线D和D-接收方向也有一对。差分信号传输的不是单根线对地的电压而是两根线之间的电压差。接收端只看差值不看单根线的绝对电平。这样做的好处很直接如果外界有共模干扰同时耦合到D和D-上两根线一起抬高或降低差值不变接收端就“看不见”这个干扰。前提是两根线要足够对称——走线等长、阻抗一致、参考平面完整。一旦对称性被破坏共模干扰就会转化成差模噪声眼图直接闭合。PCIE的差分阻抗要求通常是85欧姆有些标准里是100欧姆具体看版本和介质。这个阻抗不是随便定的它要和PCB板材、线宽、线距、介质厚度匹配。你算阻抗的时候不能只看线宽还要看参考平面的距离和介电常数。常见做法是用叠层工具先定好目标阻抗再反推线宽线距。3.2 信号完整性三大杀手反射、串扰、损耗调PCIE链路绕不开信号完整性。高速信号在PCB上跑主要受三个问题影响反射、串扰、损耗。反射来自阻抗不连续。走线宽度突变、过孔、连接器、AC耦合电容都会造成阻抗变化信号到了这些地方就会反射回去和原信号叠加导致过冲、下冲、振铃。PCIE对反射很敏感尤其是Gen3以上眼图余量本来就小一个过孔没处理好就可能误码。串扰是相邻走线之间的电磁耦合。PCIE的lane之间、发送对和接收对之间如果靠得太近就会互相干扰。降低串扰的办法无非是拉开间距、加地线隔离、减少并行长度。差分对内部两根线之间也会有串扰但因为是差分影响相对小关键是两根线要挨得够近且等长。损耗包括导体损耗和介质损耗。频率越高趋肤效应越明显电流集中在导体表面等效电阻增大介质损耗则和板材的损耗因子有关。PCIE Gen4、Gen5对板材要求很高普通FR4在Gen4下损耗就已经很可观了Gen5往往要用低损耗板材。如果你做的是长距离背板或者转接卡损耗预算一定要提前算。3.3 眼图与均衡链路能不能跑起来看这个眼图是判断高速信号质量最直观的工具。把一串比特流按时钟周期叠加起来就形成眼图。眼睛张得越开说明信号质量越好采样余量越大。PCIE规范里对不同速率、不同通道有明确的眼图模板要求测试时要把眼图套进模板里看。但实际链路里信号经过PCB、连接器、线缆之后眼图往往会闭合。这时候就要靠均衡技术来“打开”眼睛。发送端有去加重预先把高频分量加强补偿后面的损耗接收端有CTLE和DFECTLE做连续时间线性均衡DFE做判决反馈均衡。Gen3以后这些均衡基本是标配链路训练时会自动协商。LTSSM也就是链路训练状态机是物理层最核心的机制。它从Detect开始检测接收端有没有终端匹配然后Polling交换训练序列接着Configuration协商lane数量和速率最后到L0链路正式工作。如果中间任何一步失败链路就上不去或者降速运行。实操心得调LTSSM问题时一定要能抓到状态跳转日志。很多平台有对应的调试寄存器或者工具能看到当前卡在哪个状态。如果一直停在Polling多半是参考时钟或者差分对极性有问题如果卡在Configuration往往是lane映射或者速率协商不匹配。4. 硬件设计实战从原理图到PCB的完整链路4.1 原理图设计AC耦合、参考时钟、复位与电源PCIE硬件设计从原理图开始。发送端通常要串AC耦合电容一般是0.1uF靠近发送端放置。这个电容的作用是隔直流因为发送端和接收端的共模电平可能不一样直接连会出问题。电容的封装和位置很讲究要选高频特性好的0402或0201比较常见放置时要保证电容两端的走线尽量短且对称。参考时钟是另一个关键点。PCIE要求100MHz的差分参考时钟抖动要足够低。时钟源可以来自主板也可以由板卡自己产生。如果板卡自己产生要注意和根复合体的时钟域关系。有些设计用时钟缓冲器扇出多路这时候要关注缓冲器带来的附加抖动。复位信号PERST#是根复合体发给端点的低有效。板卡上要有合适的上拉和滤波保证复位释放的时机符合规范。电源方面PCIE插槽提供3.3V和12V板卡要根据自己的功耗需求设计电源树。如果是大功率板卡还要考虑插槽的供电能力必要时外接供电。4.2 PCB叠层与阻抗设计先定规则再走线PCB设计第一步不是走线是定叠层。叠层决定了阻抗、损耗、参考平面和布线空间。做PCIE板卡通常至少四层推荐六层以上。一个典型的六层叠层可以是顶层信号、内层地、内层信号、内层电源、底层信号、底层地。具体要看信号密度和电源需求。差分阻抗的目标值要先定好然后让板厂按这个阻抗调整线宽线距。你不能自己画完再让板厂“尽量匹配”那样偏差会很大。正确做法是先和板厂确认叠层和阻抗模型拿到推荐的线宽线距再按这个规则去画。PCIE的差分对通常要求85欧姆或100欧姆单端信号一般是50欧姆。走线时差分对要严格等长长度偏差一般控制在5mil以内。对内两根线的间距要保持恒定不要忽宽忽窄。换层时尽量成对换过孔要对称放置必要时加伴随地过孔。参考平面要完整差分对下面不要有跨分割否则回流路径断了阻抗突变信号质量直接崩。4.3 布局布线要点长度匹配、过孔、连接器布局阶段PCIE连接器和主要器件的位置要先定。连接器尽量靠近芯片减少走线长度。AC耦合电容要靠近发送端且两端的走线要对称。参考时钟源要远离高速信号避免被干扰。布线时发送对和接收对要分开不要交叉。lane与lane之间要保持足够间距通常建议3倍线宽以上。如果空间紧张至少也要保证2倍线宽并在中间加地线。过孔是阻抗不连续的主要来源能少用就少用。必须用过孔时要保证过孔短、焊盘小、有伴随地孔。长度匹配是PCIE布线的重头戏。同一lane的差分对内要等长不同lane之间也要做一定的长度匹配尤其是x4、x8、x16这种多lane链路。规范里对lane间偏斜有要求具体数值看速率等级。Gen3一般要求lane间偏斜在几个ps以内换算成走线长度就是几十mil。实际设计时我会把同一组的所有lane放在一起走方便做等长。注意PCIE金手指的尺寸和厚度有标准画封装时一定要按规范来。金手指的斜边、倒角、镀金厚度都会影响插拔寿命和接触电阻。如果自己画封装建议直接找连接器厂商的官方库不要凭感觉画。4.4 电源完整性与去耦高速信号的隐形支撑电源完整性经常被忽视但PCIE链路不稳很多时候是电源噪声导致的。高速收发器的电源对噪声很敏感尤其是PLL和SerDes的供电。去耦电容要按频段配置大电容滤低频小电容滤高频0402和0201的小电容要尽量靠近电源引脚。电源平面和地平面要尽量完整避免被信号线割裂。如果必须分割要保证高速信号不跨分割。去耦电容的回路要短过孔要就近打不要绕远路。对于多电源域的芯片要按手册要求做电源时序控制避免上电顺序不对导致闩锁或初始化失败。5. 枚举与调试设备不识别怎么一步步查5.1 枚举流程从复位到BAR分配PCIE枚举是系统启动时自动完成的。根复合体先复位整个总线然后从总线0开始扫描。它读取每个设备的配置空间判断有没有设备、是什么类型、需要多少地址空间。对于交换机它会继续往下扫描下级总线。枚举的核心是配置读写。根复合体通过配置事务访问设备的配置空间读取Vendor ID。如果读到0xFFFF说明这个位置没有设备。读到有效ID后继续读Header Type和BAR计算地址需求然后分配总线号和地址范围。BAR分配时系统会先往BAR写全1读回掩码算出空间大小和对齐要求然后在可用地址空间里找一块合适的位置写回去。所有BAR分配完后使能设备的Memory Space和IO Space设备就正式上线了。5.2 常见枚举失败原因与排查顺序设备不识别排查要有顺序不要东一榔头西一棒子。我一般按下面的顺序来排查项可能问题检查方法参考时钟无时钟、频率偏差、抖动大示波器测时钟差分对看频率和幅度复位信号PERST#未释放或时序不对测复位引脚确认释放时间和规范一致电源电压不足、上电时序错测各路电源确认时序和纹波差分对极性TX/RX接反查原理图和PCB确认极性AC耦合电容容值错、虚焊、位置不对目检和万用表测通断LTSSM状态卡在某个状态读调试寄存器或抓状态日志配置空间BAR实现错误读配置空间看BAR掩码是否正确链路速率协商失败降速读链路状态寄存器看当前速率和宽度这个表是我自己调板子时总结的基本覆盖了八成以上的枚举问题。实际排查时先看最基础的时钟和电源再看信号最后看协议。很多问题其实出在焊接或者物料上不要一上来就怀疑协议。5.3 用工具抓链路状态LTSSM日志怎么看调PCIE光靠猜不行得有工具。不同平台有不同的调试手段。有些芯片有专门的PCIE调试寄存器可以读出当前LTSSM状态、链路速率、lane数量。有些平台支持通过JTAG或者调试接口抓取状态跳转日志。看LTSSM日志重点看状态跳转的顺序和停留时间。正常流程是Detect到Polling到Configuration到L0。如果反复在Detect和Polling之间跳说明物理连接有问题可能是终端匹配不对或者差分对断线。如果到了Configuration但上不去L0多半是lane映射或者速率协商问题。还有一种情况是链路能到L0但速率只有Gen1。这通常是信号质量问题高速下眼图闭合协商失败后自动降到低速。这时候要回头看PCB走线、连接器、线缆用眼图或者TDR定位阻抗不连续点。实操心得我习惯在板卡上留几个测试点专门测参考时钟和复位。调试阶段用示波器直接看比读寄存器快得多。另外如果条件允许准备一块已知良好的同型号板卡做对比能快速判断是设计问题还是个体问题。6. 典型应用场景与设计取舍6.1 PCIE转网口RTL8852BE这类方案的硬件要点PCIE转网口是很常见的应用比如RTL8852BE这种WiFi 6网卡就是通过PCIE接口挂在系统上。这类方案的设计要点在于PCIE部分要保证信号完整性射频部分要做好屏蔽和匹配两者之间的电源和地要隔离好避免射频噪声串到PCIE上。实际做的时候PCIE走线要按高速规则来射频部分要按射频规则来。天线馈线要控阻抗通常50欧姆单端。PCIE和射频的电源要分开必要时加磁珠或者LDO隔离。如果网卡支持蓝牙还要注意蓝牙和WiFi的共存问题天线布局要合理。6.2 PCIE Switch扩展多设备扇出时的注意事项PCIE Switch用于扩展端口比如服务器里接多块NVMe盘。用Switch的时候要注意上行端口和下行端口的带宽分配。如果上行只有x8下行挂了四块x4的盘总带宽是超配的实际性能取决于访问模式。Switch的配置通常通过EEPROM或者I2C加载枚举时Switch会先被识别然后系统继续扫描下级设备。设计时要保证Switch的参考时钟、复位、配置接口都正确。另外Switch的散热也要考虑尤其是高带宽型号功耗不小。6.3 嵌入式MCU没有PCIE怎么办桥接方案的选择有些MCU没有原生PCIE接口但项目又需要接PCIE设备。这时候可以用桥接芯片比如PCIE转USB、PCIE转以太网、PCIE转SATA等。选择桥接方案时要看带宽需求、驱动支持、成本。如果只是低速外设USB桥接就够了。如果要接NVMe盘可能需要专门的PCIE转M.2桥接芯片。桥接方案的好处是MCU不用处理复杂的PCIE协议坏处是多了个中间环节延迟和带宽都会受影响。设计时要仔细看桥接芯片的数据手册确认它的PCIE端口配置和MCU接口的匹配。7. 我踩过的坑与几条实用建议调PCIE这些年踩过的坑不少挑几个有代表性的说说。第一个坑是AC耦合电容放错位置。有一次板子回来链路死活上不去查了半天发现电容放在了接收端。规范要求放在发送端放反了会导致共模电平不匹配链路训练失败。后来改板把电容挪到发送端问题解决。第二个坑是差分对极性接反。TX和RX在原理图上很容易搞混尤其是连接器定义不标准的时候。接反了链路肯定不通但有些芯片支持极性反转可以在配置里改。不过最好还是在设计阶段就确认好不要依赖软件补救。第三个坑是参考时钟抖动太大。用了一个便宜的时钟缓冲器抖动指标不达标Gen3下误码率很高。换了低抖动型号后稳定。参考时钟这东西省不得。几条建议第一PCIE设计一定要提前和板厂沟通叠层和阻抗不要自己闷头画。第二调试阶段多留测试点尤其是时钟、复位、电源。第三准备一块已知良好的参考板对比排查能省很多时间。第四不要忽视电源完整性很多链路问题根源在电源。第五文档和规范要常翻PCIE规范虽然厚但关键参数都在里面遇到问题先查规范再动手。最后分享一个小技巧如果你怀疑是信号完整性问题可以先降速测试。把链路强制降到Gen1如果Gen1能稳Gen3不稳那基本就是信号质量问题重点查走线、连接器、线缆。如果Gen1都不稳那问题可能在更基础的地方比如时钟、电源、复位。这个降速法能快速缩小排查范围我每次调新板子都会先用。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进