首页 / 资讯中心 / 文章详情

PCIe硬件设计实战:引脚定义、差分对与时钟供电关键点解析

PCIe硬件设计实战:引脚定义、差分对与时钟供电关键点解析 ★ FEATURED ARTICLE
做PCIe也有七八年了从板卡设计调试到系统级信号测试都摸过一遍。每次有新人接手PCIe相关的硬件设计我一般都会扔给他们一句话先把金手指上的引脚搞清楚搞清楚差分对、时钟和供电这三类引脚你基本就能看懂PCIe一半的硬件设计。这话听着有点绝对但实际干下来确实是这样。很多后期要命的信号完整性问题和枚举不稳定现象源头都能追溯到一开始对这些引脚的理解不够透彻。这篇东西我想从引脚定义出发把PCIe接口背后最重要的信号细节拆开讲一遍。不会只停留在“这个引脚叫什么名字”的层面更多会聊到引脚背后的信号原理、设计约束、以及调试中的真实经验。篇幅比较长适合正在做PCIe板卡设计的工程师也适合刚接触PCIe协议想入门的同学。1. 从引脚看PCIe信号分类与金手指布局1.1 三类核心引脚差分信号、时钟、供电PCIe的金手指边缘连接器引脚数量看起来多密密麻麻一大排但按照功能划分其实非常清晰主要就是三大类收发数据用的差分信号对、给链路提供参考基准的时钟引脚以及给设备供电的电源引脚。搞清楚这个分类整块PCB的设计思路就立住了。以我们最常见的PCIe x1插槽为例金手指上左侧有一根长的供电针和几个短针中间是收发差分对再往右是参考时钟的差分输入。标准PCIe CEM规范里x1插槽是18个引脚位x16插槽则是82个引脚位多出来的部分主要是复用了更多组收发差分对和附加的供电/地引脚。这里要特别说一个容易看错的地方PCIe把引脚分为“长针”和“短针”这个设计是有讲究的。长针比如供电和地先接触短针比如PERST#复位信号后接触这样做的目的是保证设备在上电和复位时序上有明确的先后关系。实际调试中如果发现板卡上电后设备没有被正确复位十有八九和这个针脚长度的物理时序有关这在只读原理图的时候很容易被忽略。1.2 金手指尺寸与层叠设计的联动考量很多人以为金手指尺寸只是机械结构问题跟电气性能没什么关系其实这是个大坑。PCIe金手指的镀金厚度、倒角角度、引脚间距都会直接影响高频信号的回流路径和接触阻抗。标准PCIe金手指的引脚间距是0.8mm金手指区域需要做挖空处理避免内层参考平面和插槽内的其他金属接触短路。实际PCB设计时金手指下方两侧的第一层和第二层通常要铺地铜并打在靠近引脚的过孔上让高速信号回流路径尽量短。我还遇到过金手指焊盘阻抗测出来总是不稳定来回调整线宽也没用的案例。最后查了半天发现是金手指焊盘区域没有按按CEM规范要求做倒角处理生产出来的板卡插入PCIe插槽时接触面积不一致导致回波损耗超标。这类问题在原理图上看不出来必须结合规范原文和机械加工参数才能发现。1.3 PCIe 6.0 CEM的变化趋势PCIe 6.0的CEM规范出来后引脚定义上最明显的变化是供电要求更高了。为了支撑PCIe 6.0时代更高的功耗尤其显卡这类设备新的CEM规范在供电引脚和辅助供电接口上做了重新规划。同时由于速率达到64GT/s信号完整性余量的要求进一步收紧。不过PCIe 6.0向下兼容引脚总体布局逻辑没有翻天覆地的变化依然是差分对、时钟、供电这三类。对做设计和测试的人来说了解版本演进的方向更重要的意义在于设计时应向前看比如预留的参考时钟引脚能不能支持新版本SRIS架构供电能力是否冗余这些考虑在引脚选型和板卡布局阶段就要做否则卡到了高速率阶段再改结构代价会非常大。2. 差分对PCIe信号传输的物理根基2.1 为什么选差分而不是单端PCIe的数据线从物理层开始就是一对对差分线每一对分别承载发送TX和接收RX信号。差分信号的本质是“用两根线上的电压差来表示逻辑电平”而不是单根线对地电平。举个实际例子帮助理解如果发送端逻辑“1”在差分线上表现为P线电压高于N线电压100mV那么接收端只需要判断这两根线之间的压差就可以恢复数据。外部的共模干扰如果同时叠加在两根线上比如电源噪声耦合压差基本不变数据照样能正确接收。这就是差分信号抗干扰能力强的根源。PCIe之所以全部采用差分对还有一个重要原因是串扰控制。板卡上的信号线密度很高如果采用单端信号相邻信号线之间的串扰会非常明显。而差分对内部的两根线紧耦合对外辐射呈相反极性相互抵消所以即便PCIe链路跑在高频依然能保持比较干净的电磁环境。2.2 收发差分对与链路宽度PCIe的物理链路是由多对差分收发通道组成的。x1链路有1组TX差分对和1组RX差分对x4有4组x16则有16组。每一组TX/RX差分对都是独立的物理通道链路训练时会协商实际可用的通道数量。在板卡原理图上PCIe接口通常会有类似PETp0/PETn0、PERp0/PERn0这样的命名PET对应发送TransmitPER对应接收Receivep/n代表差分对中的正负两极。看到这种命名就能直接对应到金手指上的引脚位置。这里有个非常重要的细节PCIe端到端连接中发送端的TX对端一定要接接收端的RX而不是TX接TX。这看起来像废话但在做PCIe Switch转接板或者连接器转接设计时很容易因为线序整理疏忽导致接反。接反的直接表现是链路训练失败设备完全识别不到。2.3 差分对Layout的关键参数与避坑差分对LayoutPCIe对阻抗的要求非常明确单端阻抗85Ω差分阻抗100Ω。等等听起来矛盾这里单端阻抗85Ω指的是差分对中每根线对参考平面的特性阻抗而差分阻抗是两根线组合后的差模阻抗。实际设计时通常直接控制差分阻抗100Ω但底层单线阻抗也要满足85Ω左右的约束两者是相互关联的。差分对的布线核心就是等长和紧耦合。等长是为了保证正负信号到达接收端的时延一致否则会产生共模分量并恶化眼图。紧耦合则能增强对外部干扰的抑制能力。一般PCIe Gen3及以上速率TX/RX差分对对内长度差控制在5mil以内比较稳差分对之间的长度差要求宽松一些但最好也控制在几十mil量级。避坑点很多人做信号等长只关注了差分对走线本身忘了过孔和连接器焊盘的时延。一个过孔的寄生时延相当于几十mil走线连接器金手指的引脚长度也不容忽视。我处理过一个Gen4链路余量不足的案子就是差分对走线等长做得非常好但一边多了两个过孔导致接收端采样点偏移。后来在蛇形线里补偿了这部分时延余量立刻好了起来。2.4 AC耦合电容的选型与放置PCIe规范要求发送端的差分信号必须串接AC耦合电容。这个电容的作用是隔离发送端和接收端的直流偏置保证两端可以工作在各自合适的共模电压水平上。这也是为什么PCIe链路本身没有复杂的电平转换电路却可以跨芯片、跨板卡稳定工作的原因之一。电容的封装和位置都有讲究。常用的是0402封装容值一般为0.1uF左右或者220nF。规范建议电容放置在发送端附近并要求在电容焊盘处做阻抗补偿。如果电容放置位置离发送端太远信号经过长走线后再电容反射反射系数会明显增大。替换电容时也要注意不是所有电容都适合高速链路。X5R/X7R介质是基本要求C0G会更好但容值选择受限于封装尺寸。有些低成本方案用了Y5V电容温度特性差链路余量会随温度漂移这种问题最坑。3. 时钟系统参考时钟架构与信号约束3.1 共同时钟架构与SRIS/数据时钟恢复PCIe链路的时钟架构直接决定了接收端怎么恢复数据。先说经典的共同时钟架构Common Clock主机和设备共用同一个100MHz参考时钟源发送端和接收端的PLL都锁定在这个参考时钟上两边频率一致数据恢复相对简单。但现代系统里越来越多设备开始采用SRIS架构。SRIS的全称是Separate Reference Clock with Independent Spread简单理解就是设备不再依赖主机提供的参考时钟而是使用自己独立的参考时钟源。这种架构允许两端参考时钟有各自的扩频特性但接收端必须通过数据时钟恢复CDR电路来跟踪发送端的频率。这样做的优势是布线上不必把100MHz时钟长距离引到每一个设备对系统布局更友好尤其是多个PCIe Switch级联的场景。代价是CDR电路的追踪压力和抖动容忍要求更高了。做硬件设计时选参考时钟架构直接影响PLL配置方式链路训练时双方也会交换参考时钟相关的参数确保双方在期望的架构下工作。3.2 100MHz参考时钟的关键参数PCIe参考时钟是100MHz的差分时钟通常采用HCSL电平标准也可以使用LVDS或者Low-Power HCSL。引脚命名一般是REFCLKP/REFCLKN或者CLKREQ#这种带使能功能的引脚。这一点非常重要参考时钟信号最关键的参数不是频率准不准而是抖动。规范里对参考时钟的周期抖动、累计误差和相位噪声都有明确限制。很多人测量时钟时只看频率偏差这是不够的。频率偏差大导致的往往是链路根本训练不上而抖动超标则表现为链路能训练但偶尔降速或者偶发报错排查起来更隐晦。我在实际调试中碰过一种情况示波器测100MHz参考时钟波形很干净频率也准但设备的PCIe链路就是只能跑到Gen1。最后检查发现时钟源在1.5MHz到10MHz频段的相位噪声超标导致参考时钟的边沿抖动偏大发送端PLL净化不了这部分噪声。换了一颗低相噪的振荡器问题立刻解决了。3.3 无毛刺时钟切换与跨时钟域处理做PCIe板卡调试有时会用到时钟MUX在多个参考时钟源之间切换。这时候最怕的就是切换时输出端出现毛刺或者短脉冲因为PCIe接收端的时钟恢复一旦失锁链路就会重新训练造成数据中断。无毛刺时钟切换Glitch-Free Clock Switching电路的基本思路是在时钟处于低电平时禁止输出等原时钟输出到低电平后切换到新时钟的低电平区间再恢复输出。这样切换过程不会产生超短脉冲。很多专用时钟buffer芯片内置了这个功能但如果你用FPGA做时钟切换逻辑就一定要把这个时序做对不然大概率会出现偶发链路断开。跨时钟域处理CDC在PCIe中的体现主要是各个逻辑模块工作在不同时钟域比如某些设计里PCIe硬核使用100MHz参考时钟衍生出的125MHz应用时钟而业务逻辑使用其他时钟。跨时钟域的信号必须通过同步器、异步FIFO或者握手协议来处理。我见过不少问题是把跨时钟域信号直接当普通信号用了偶发数据错误很难复现查询周期非常长。3.4 时钟抖动、频偏与漂移的区别调试时钟信号时三个概念容易被混在一起抖动Jitter、频偏Frequency Offset、漂移Wander。抖动是边沿位置的短期偏差属于快变化直接影响接收端能否准确采样频偏是平均频率相对标称值的偏差属于缓慢变化PCIe规范里要求参考时钟频偏在±300ppm以内漂移是长期相位变化通常和温度、老化相关对PCIe链路的影响相对小但连续长时间高负载运行下也可能体现。在测试时抖动使用示波器或者相位噪声分析仪测量频偏使用频率计或频谱分析仪测中心频率。如果你看到一个链路口偶发误码优先查抖动如果链路始终训练不上优先查频偏。把排查方向搞对能省下很多无用功。4. 供电引脚与电源完整性一切信号的基础4.1 插槽供电与辅助供电引脚PCIe金手指上的供电引脚最常见的就是12V和3.3V两组电源还有一些地引脚GND。标准CEM规范里12V由插槽直接提供3.3V通常用于辅助逻辑电路比如时钟buffer、电平转换芯片、EEPROM这类小电流器件。对于功耗较大的设备比如显卡单靠金手指的12V供电可能不够于是有了外接辅助供电接口常见的就是6Pin/8Pin的电源接口。金手指供电和辅助供电在板卡上通常是做二极管合路或者直接并接但并接时必须注意过流保护和电源品质。供电引脚上的电流不是均匀分布的越靠近末端插槽远端的短针电流通路越长压降也越大。高功耗设备设计中需要加大电源平面的铜厚度或者使用多个过孔阵列来降低通路阻抗。很多显卡在满载时出现电压不足导致掉驱动的毛病排查到最后发现是金手指到核心电源之间的PCB压降过大。4.2 电源轨的需求与去耦设计PCIe设备内部通常需要多路电源轨除了输入的12V和3.3V还要通过DC-DC转换出核心电压、IO电压、模拟电压等。每一个电压轨的纹波和瞬态响应直接影响到PCIe高速收发器的信号质量。这里要特别强调去耦电容的放置。很多初学者喜欢把去耦电容集中摆在电源入口处觉得这样滤波效果好。其实高频去耦更讲究的是电容与负载芯片电源引脚之间的回路面积要小也就是常说的“就近摆放”。一个100nF电容放在距离芯片电源引脚3cm开外对GHz级别的噪声基本等于没放因为过孔和走线寄生电感已经把去耦效果抵消掉了。做PCIe板卡时我习惯在每个高速收发器电源引脚旁边放一个100nF高频去耦再配合几颗10uF/22uF的体电容按照电源树逐级规划。测试纹波时不要只测静态纹波还要用大电流瞬态负载测试很多电源问题只在负载突变时暴露。4.3 上电时序与复位配合PCIe设备对上电时序有明确要求先供电源再释放复位。具体而言12V和3.3V稳定后PERST#必须保持有效状态一段时间然后才能拉高释放。这个时间的保证是为了让电源轨完全稳定、时钟稳定、以及设备内部完成初始化。如果上电时序颠倒比如复位信号先释放但电源还没稳设备可能会进入不确定状态表现为系统检测不到设备或者设备出现在但枚举失败。还有一种情况是设备支持热插拔热插拔瞬间电源接触抖动复位时序没做好就会引发系统挂死。实际调试时可以用示波器同时抓取电源、参考时钟和PERST#的信号观察它们的时序关系。我之前调过一块转接板问题表现为插入主机后偶尔识别不到设备抓取时序后发现PERST#释放时间比规范要求的100ms短了一截。修正RC延时参数后问题彻底消失。5. 链路训练与枚举信号质量最直接的验证5.1 LTSSM状态机与Configuration阶段PCIe物理层有一个叫LTSSM的状态机全称Link Training and Status State Machine。链路从复位后开始依次经过Detect、Polling、Configuration、L0等状态最终进入正常工作状态。整个过程俗称“链路训练”。Detect阶段是检测对端是否存在Polling阶段是双方通过发送特定码型来同步Configuration阶段则协商链路的宽度和速率。热词里有人提到“Configuration阶段和子阶段报文流转图”确实这个阶段信息量大且最容易出问题。Configuration阶段里链路两端会通过TS1/TS2训练序列互相交换能力信息包括链路宽度、方向切换、以及是否支持更高的速率等级。如果链路宽度协商失败常见现象是设备按x16连接但只能训练到x8或者x1。这个问题很多不是配置错误而是物理信号质量问题比如某一路差分对断线或阻抗异常导致训练序列收不到。枚举过程的日志里通常会给出当前实际链路宽度用这个信息反推是很有价值的排查手段。5.2 枚举失败常见的信号原因与排查系统枚举失败在逻辑层面表现为设备没有出现在总线上但在硬件层面常见原因主要有以下几类第一类是参考时钟问题比如时钟没有起振、频偏超标、或者时钟buffer工作异常。排查方法是用示波器或者频率计直接测量主板上的100MHz时钟确认波形和频率。第二类是差分对连接异常包括TX/RX接反、通道断线、AC耦合电容虚焊等。排查时要先从金手指引脚测量到发送端/接收端的连通性再到链路训练时的眼图。另外还有一个细节AC耦合电容的X7R电容容值如果老化下降也会导致低频分量被衰减表现为链路极不稳定。第三类是供电问题比如某一路电源电压低于芯片阈值导致收发器部分不工作。测量时需要注意不要只看空载电压要在系统枚举过程中用示波器看电压跌落情况。第四类就是复位时序问题前面已经提过。这类问题有一个特点冷启动时偶发重启后大概率恢复正常因为时序余量只在特定温度或电压下紧张。5.3 常用测试工具与实测手段日常调试PCIe信号我常用的工具主要就是这几类示波器、协议分析仪、以及系统层面的lspciLinux下或设备管理器Windows下。示波器用来测参考时钟波形、复位时序、以及电源纹波协议分析仪用来抓链路训练过程中的TS序列和LTSSM状态跳转定位协商失败原因非常有效系统工具则用来快速判断链路训练结果比如在Linux下用lspci -vvv看LnkCap/LnkSta、当前速率和宽度用lspci -xxx还能直接读配置空间。如果你在调试PCIe链路速度上不去的问题可以尝试先用系统工具把链路强制在Gen1或者Gen2然后逐级提升速度看哪一步开始失败。这种二分定位法在确认信号余量问题的时候非常实用。5.4 常见问题速查表现象可能原因排查方向设备完全识别不到PERST#没有正常释放抓取复位信号时序识别后速度只能Gen1参考时钟抖动超标测时钟相位噪声链路宽度不满部分差分通道断线/阻抗异常检查金手指到芯片全部差分对高负载下偶发断开电源跌落/去耦不足测瞬态电压跌落冷启动不识别重启正常上电时序余量不足调整复位延时长时间运行后降速温度变化导致信号余量劣化测温升后眼图6. 几个容易忽略的实用经验最后一节不写太多理论就分享几个实操经验。第一个是关于AC耦合电容位置的灵活性。虽然规范建议靠近发送端但如果你做的是两块板卡对接的转接板实际上也可以靠近接收端甚至在连接器的两侧各放一个电容。这种情况下两个电容等效串联容值需要相应选大一倍。这个做法在空间布局受限时很实用但要注意不能让链路中出现过多额外的容性负载。第二个是关于PCIe Switch的引脚规划。做多端口PCIe Switch设计时每个端口都有独立的差分对、时钟引脚和供电引脚很容易出现引脚混淆。我的习惯是先画一张端口和引脚映射表然后按映射表来做原理图避免用鼠标在一堆同名信号里翻找。这个笨办法帮我省下了很多查线的痛苦时间。第三个是关于信号回流。几乎所有的差分对设计指南都会强调参考平面连续性但实践中最容易出错的是连接器附近的地平面分割。有些人为了把数字地和模拟地在连接器区域分开反而把高速信号的返回路径切断了。实际调试中碰到眼图变差的问题不妨先看一下高速信号底下有没有完整的地平面有时候比改线宽更有效。第四个经验是关于用示波器测量100MHz参考时钟的。很多人直接把示波器探头接在时钟线上结果波形乱七八糟。原因是普通探头负载电容大还会引入接地引线电感。正确方式是使用差分探头或者用高阻有源探头配合短地线来测试。实在没有差分探头时也可以临时用近场探头观察能量分布但精度有限只能做辅助判断。做PCIe这个方向最大的体会就是很多问题表面上是软件配置问题本质上是硬件信号问题。链路训练不上、偶发断链、速率协商失败这些症状反复出现时回头看引脚定义和信号质量往往能找到根因。这篇内容主要围绕差分对、时钟和供电引脚三个切入点展开知识和经验都是实际项目里踩过坑换来的。如果正在做PCIe相关设计的人能少走几步弯路这篇文章就没白写。
阅读完成 · 觉得有帮助?
咨询建站