前一阵帮一位朋友复盘一块 PCIe 3.0 的 SSD 转接板,症状很典型:插上去能枚举,但用着用着突然掉盘,系统日志里报 Lost Link,跑分忽高忽低,链路经常自己降速到 Gen2 甚至 Gen1。一开始怀疑电源纹波,换了三路 LDO,没效果;又怀疑固件,刷了几个版本还是老样子。最后拿着 TDR 顺着链路一段一段量下去,才发现问题出在最容易被忽视的走线等长上面——一根差分对内部的 P/N 长度差做到了 20mil 左右。把这两个网络修到 5mil 以内之后,Gen3 稳了,再没掉过链子。
这篇文章就围绕这个让我印象深刻的 5mil 展开:PCIe 3.0 设计里,差分对走线长度差为什么是 5mil,超了会怎样,怎么在 layout 阶段就控制住,以及链路已经出问题的时候该怎么排查。不管你是刚上手高速板的新人,还是已经被链路训练折磨过几次的老兵,这篇应该都能帮你少走几条弯路。
1. PCIe 3.0 为什么对走线匹配这么敏感
1.1 从 8GT/s 说起:一个 UI 只有 125ps
PCIe 每一代速率翻倍,但真正让人头疼的不是带宽,而是时序预算越来越薄。Gen1 跑 2.5GT/s,Gen2 跑 5GT/s,到了 Gen3 就是 8GT/s,一个 UI(单位间隔,Unit Interval)只有 1/8GHz = 125ps。作为对比,Gen1 的 UI 是 400ps,Gen2 是 200ps。
125ps 是个什么概念?信号在普通 FR4 板材的带状线里,传播速度大概在 6mil/ps 左右,也就是说一个 UI 对应的物理长度大约只有 750mil(约 19mm)。板子上随便多绕几厘米,在时域上就可能吃掉大几十 ps 的预算。
| 参数 | Gen1 | Gen2 | Gen3 |
|---|---|---|---|
| 线速率 | 2.5GT/s | 5GT/s | 8GT/s |
| UI | 400ps | 200ps | 125ps |
| 编码 | 8b/10b | 8b/10b | 128b/130b |
| 有效带宽/ lane | 2Gbps | 4Gbps | 7.877Gbps |
| 板级对内长度差推荐 | 通常十几 mil | 通常 5~10mil | 5mil 以内 |
从 2.5GT/s 到 8GT/s,速率提升不是线性感觉,而是压缩了接收端眼图的水平容限。Gen3 设计里,jitter、ISI、串扰、电源噪声每一项都在抢那 125ps 里面的预算。而且链路是双向的,TX 和 RX 都有各自的眼图要求,任何一端的裕量被吃掉,整条链路都会变得不稳定。
走线长度差属于确定性、可修正的误差,不像随机抖动那样不可控,所以设计规范才会把它抓得这么严。你很难通过换一颗更好的电源芯片来弥补 20mil 的 P/N 失配,但重新绕几段线,成本几乎为零。
1.2 128b/130b 编码:没有 8b/10b 的“兜底”之后
Gen1/Gen2 用的是 8b/10b 编码,把 8bit 数据变成 10bit 符号。这个编码最大的好处是保证足够的跳变密度,接收端能靠频繁的 0/1 转换恢复时钟。代价是 20% 的带宽开销。
Gen3 为了提升有效带宽,改成了 128b/130b 编码,开销只有约 1.5%,但对接收端 CDR(时钟数据恢复)的要求明显提高。130bit 里只有 2bit 的同步头,数据部分经过加扰处理,即使跳变密度整体可控,CDR 在长串相同电平的情况下也必须牢牢锁定相位。
8b/10b 相当于给时钟恢复配了一根“拐杖”,128b/130b 把这根拐杖拿掉了。此时如果信号路径上还有明显的确定性相位误差,接收端的采样点就会进一步偏离理想位置。收发双方的均衡技术(TX 侧 FFE,RX 侧 CTLE/DFE)能补偿频率相关的损耗,但补偿不了 P 和 N 到达时间不一致造成的“相对时间错误”。简单说,编码变了之后,系统对相位上的确定性误差更敏感,P/N 之间的失配会直接压到眼图裕量上。
1.3 5mil 到底是谁规定的
很多新人最困惑的就是:规范里到底哪一页写了 5mil?老实说,PCIe Base Spec 并没有单独画一条“差分对内长度差必须小于等于 5mil”的命令。它是一个由芯片厂商在板级设计指南里,把 PCIe 规范中的总 skew 预算折算成物理长度后给出的工程推荐值。Intel 以及各主控厂商的 layout guide 里,基本都能找到类似“within pair length mismatch < 5mil”的说法,这是业界经过大量量产项目收敛出来的实用约束。
换句话说,5mil 不是一个“抄上去就能过”的银弹,而是高速差分对内 P/N 失配必须压在这个量级,否则链路整体裕量会明显恶化。PCIe 3.0 卡 5mil;等做到 PCIe 4.0/5.0,速率更高,业界推荐值往往收缩到 3mil 甚至更小。所以理解 5mil 背后的物理逻辑,比死记这个数重要得多。
还要注意一个细节:5mil 通常指的是同一对差分线内部 P/N 的匹配(within-pair skew),不是 lane 与 lane 之间的总长度差。对间匹配一般会放宽到 10~20mil 这个量级,具体看芯片手册。这两个约束混为一谈,是很多新手设计里最常犯的错误。
2. 差分对长度差的物理账:5mil 意味着多少时间
2.1 差分信号全靠在“对称”两个字上
差分信号接收端看的是 P 和 N 的差值。理想情况下 P 和 N 幅度相同、相位相反、同时到达,差模分量完整,共模分量为零。一旦 P 和 N 走线长度不同,两条边到达接收端的时刻就有先有后,交叉点偏移,一部分差模信号就会转成共模噪声。
共模噪声的危害有两个走向:一是降低接收端差模检测的有效幅度,让眼图边缘变模糊,严重时直接导致误码;二是形成共模电流,在参考层、连接器、线缆上产生辐射,造成 EMI 问题。PCIe 3.0 设备通常装在机箱内部,EMI 表现太差,过认证的时候会让你非常痛苦。
差分对的“对称性”是它的生命线。很多人画完板子只看 DRC 有没有错,不看差分对内是否真的对称,这是不对的。P/N 失配到一定程度,差模转共模的比例会明显上升,而规范里对共模回波损耗、共模辐射都有隐性要求,最终都会在眼图测试和 EMI 测试里暴露出来。
2.2 用 6mil/ps 做估算,5mil 大约是 0.85ps
工程上常把 FR4 带状线里的信号速度近似为 6mil/ps。如果 PCB 上两个网络长度差为 5mil,引入的时间差大概是 5/6 ≈ 0.83ps,考虑板材差异我习惯按 0.85ps 去预算。
补一个重要的边界条件:这个 6mil/ps 是针对内层带状线的近似值。表层微带线因为等效介电常数较低,速度会略微快一些,大约在 6.3~6.5mil/ps 左右。如果 P 走内层、N 走表层,即使物理长度完全相等,到达时间也可能差出好几个 ps。这就是为什么我一直建议:能不走混合层就别走混合层,差分对内部尽量在同一层完成。
看到 0.85ps,很多人的第一反应是“这么小,根本不值得在意”。如果把标尺换成 Gen3 的 125ps UI,0.85ps 只占大约 0.7%,看起来确实不大。问题在于板级设计里,还有过孔、连接器、封装、参考层不连续等一连串因素,每个都往里加 ps 级别的确定性偏差,而且这些偏差大多不是随机抵消,而是按同一方向叠加。等链路跑到接收端时,0.85ps 早就不是唯一的一笔开销。
PCIe 3.0 规范对接收端眼宽、眼高的要求很苛刻,TP2/TP3/TP4 各个测试点都有明确限值。你每减少 0.85ps 的确定性偏差,就是在给整个链路多留一份余量。很多项目做到最后发现眼图刚好擦着规范线通过,差的就是这几个 ps。
2.3 0.85ps 不算大,为什么还要卡 5mil
这里要掰开说三点。
第一,5mil 不是让你只满足于时延差小,而是给你留出“额外缓冲”。生产环节中,板材介电常数会有批次波动,蚀刻线宽有误差,阻焊层厚度也会变化,这些都会让实际时延和设计值产生偏移。设计时卡 5mil,实际交货可能变成 7mi;如果你设计时就允许 15mil,生产后可能到了 20mil。链路训练时 Gen3 失败的原因往往不是单一问题,而是多项误差累积后的结果。
第二,P/N 失配不只是时延问题。失配带来的差模转共模,会以干扰的形式叠加到信号上。这种干扰很难通过 DFE 完全消除,因为 DFE 跟踪的是主抽头附近的码间特征,对共模干扰的抑制有限。换句话说,你不能指望接收端把 P/N 失配“修”回来,必须在信源端就控制好。
第三,5mil 是“低成本约束”。在常规 PCB 工艺下,把 P/N 差做到 5mil 以内并不难,也不需要额外堆叠层数或昂贵板材。既然容易做到,为什么不留足安全边界?很多 PCIe 链路问题是“压死骆驼的最后一根稻草”,P/N 失配往往就是那根稻草。所以行业里不是没有讨论过“5mil 是否过于严格”,但至今没有哪家主流芯片厂商敢把 Gen3 的推荐值放到 10mil 以上,原因很简单:风险完全不值得。
3. 真正落地:把差分对长度差控制在 5mil 以内
3.1 设计规则怎么设:以传播时延为目标,而非绝对长度
在 Cadence Allegro 里,推荐用 Electrical Constraint Set 里的 Differential Pair 规则,不要只靠几何长度约束。因为 P 和 N 可能在不同层走过不同过孔,单纯按 mil 等长会忽略过孔和层间速度差异。正确做法是:
- 在叠层里确认差分阻抗目标,PCIe 3.0 一般要求 85Ω 差分阻抗,公差通常 ±10%,具体以主控芯片手册为准;
- 在 Electric Constraint Set 中新建 Differential Pair 规则,把 Skew 容差设为 5mil;
- 把同一组需要对齐的差分对加入 Match Group,以较长者为基准,统一做长度匹配;
- 如果工具支持,把单位切成时间(ps),这样可以把封装内部的 length delay 也一起算进去,处理方式会更接近真实链路。
注意:如果芯片的封装引脚存在较大的内部延迟差异,有些 datasheet 或 IBIS 模型会给出 Package Pin Delay。支持该功能的设计工具可以做“封装时延补偿”,也就是等长规则不只盯着板上的铜皮长度,还把芯片内部的延迟差折算进去。做 PCIe 3.0 时我建议至少看一眼主控厂商有没有提供这个参数,有的话尽量用上。
在 PADS 或 Altium Designer 里,思路也一样:先定义差分对,再设置匹配长度容差,最后在交互式布线中调谐。工具叫什么名字不重要,重要的是把“对内长度差 5mil”这条规则真正落到约束管理器里,而不是靠人工肉眼一根根去数。
3.2 蛇形绕线的三条铁律:间距、振幅、圈数
当 P 比 N 长(或反过来),通常的做法是把短的一条用蛇形绕线补长。听上去简单,但绕线本身如果处理不好,会引入新的问题。
第一,间距。蛇形走线的相邻线边之间,间距至少要 3 倍线宽,推荐 20mil 以上。绕线区域很自然地会让两条相邻导线靠得非常近,太密会变成一段容性耦合区,导致该段差分阻抗下降。我之前见过一块板子,总长度差确实卡在 4mil,但绕线区域间距只有 6mil,TDR 打下去,差分阻抗在蛇形段直接跌到 70Ω。阻抗一低,反射和损耗同时变差,链路照样不稳。
第二,振幅。单个绕线单元的振幅(弯出去的高度)不能太小,一般不小于走线间距的 3~5 倍,经验上取 100~200mil 比较常见。振幅太小,每个绕线单元能补的长度有限,绕线圈数必然增加,新增的耦合长度也随之增大。用大振幅、少圈数的方式,绕线效率更高,电磁特性也更干净。
第三,圈数。能用一个大的绕线单元解决,就不要拆成十几个小单元。绕线区域最好放在走线的中段,不要贴着连接器、过孔或接收端附近放。因为绕线本身是一个几何突变,放在靠近阻抗不连续的位置,会和连接器的反射叠加,让问题更复杂。
3.3 换层、过孔与连接器:容易漏算的 skew 来源
5mil 的长度匹配只是差分对内部问题的一部分。过孔本身就是一个会引入时延偏差的地方。P 和 N 各走各的过孔,如果过孔位置不对称、stub 长度不同、孔与孔之间的回流地孔距离不一致,两个过孔贡献的时延差可能会有 1~3ps 甚至更多。这个量级已经和 5mil 本身相当了。
因此,换层时注意三点:
- 差分对内 P/N 尽量在同一个位置换层,过孔要成对、对称;
- 紧邻过孔加回流地孔,让参考平面在换层处连续;
- 如果走线从表层进入内层,注意控制连接器引脚或金手指处的 stub,必要时用背钻。
连接器本身也会带来 skew。PCIe CEM 连接器引脚长度存在微小的物理差,通常这部分由连接器厂商保证,但你在 layout 时如果让差分对内某个网络绕线经过连接器两侧不对称,也会叠加额外误差。所以在做绕线时,要把连接器和过孔这些“非走线长度”统一折算进总预算。
3.4 自查清单:出带前十分钟该看的点
发板前,拿着设计文件花十分钟过一遍下面几点,能避免大量低级问题:
- 所有差分对都设置了 85Ω 差分阻抗,且参考平面连续,没有跨分割;
- 对内长度差 ≤ 5mil,跑的是 Match Group/length tolerance 的约束报告,不是肉眼数出来的;
- 蛇形绕线区域间距 ≥ 20mil(或 ≥ 3 倍线宽),绕线不贴着连接器、过孔、接收端;
- 换层处有回流地孔,过孔对称,stub 长度尽量短;
- 同一 lane 的 TX 和 RX 差分对之间,以及同一方向所有 lane 之间的总长度差,也控制在芯片手册允许的范围内。
这个清单是我自己做高速板时固定要走的流程,花不了多少时间,但经常能抓到一些“工具没报错、实际有风险”的隐患。尤其是绕线间距,DRC 默认通常不检查蛇形绕线内部的耦合间距,必须靠规则设置或者人工确认。
4. 实测与排查:当 5mil 没有卡住时会发生什么
4.1 典型症状:降速、重训练、误码
PCIe 3.0 的链路协商过程是从 Gen1 开始,逐级尝试 Gen2、Gen3。如果 Gen3 训练失败,链路会 fallback 到 5GT/s 甚至 2.5GT/s。表现就是系统日志里出现链路降到 Gen2 或 Gen1 的记录,或者速率协商成功但工作一段时间后周期性重训练,读盘中途掉盘,SMART 报 CRC 错误。
这些症状跟电源纹波、固件问题可能看上去一样,甚至和散热也有点像,很容易误判。但一个重要的差异是:P/N 失配导致的问题通常和速率强相关。如果你把设备强制锁定在 Gen2/Gen1 时一切正常,一上 Gen3 就出问题,那大概率是高频信号完整性裕量不足,而不是电源或者固件的锅。
4.2 用 TDR 和示波器找到失配点
排查时,TDR 是最直接的工具。把 TDR 连到连接器或者专门预留的测试点,看差分阻抗曲线,失配往往表现为某一段阻抗异常,P 和 N 的单端曲线不重合。不过 TDR 对几百 mil 长走线内的小幅失配不一定看得清,更可靠的组合是:
- 用差分探头在接收端测 P、N 波形,观察交叉点是否在共模电平附近对称。如果交叉点系统性偏移,说明 P/N 到达时间不一致;
- 用 VNA 测 SDD21,如果高频段相位出现明显非线性,也说明对内失配;
- 工程上更实用的是“二分法”:把链路分成几段,在测试点位置用过渡连接器或者探针台一段一段排除。
示波器带宽这里多说一句,PCIe 3.0 的基波是 4GHz,但测试上升沿需要至少 12GHz 带宽的示波器和探头才可靠。如果手头只有 6GHz 的设备,看到的现象可能不够真实,容易产生误判。差分探头也尽量选带宽不低于示波器的型号。
4.3 几个常见案例与修正经验
| 现象 | 可能原因 | 修正方向 |
|---|---|---|
| Gen3 训练失败,稳定在 Gen2 | 对内长度差 20mil,P/N 交叉点偏移 | 重新绕线,把长度差压到 5mil 以内 |
| 链路能协商到 Gen3,但高负载 CRC 增长 | 蛇形绕线间距过密,局部阻抗跌到 70Ω | 加大绕线间距到 ≥20mil,减少圈数 |
| 换层后链路不稳定,随温度变化明显 | 换层处没有回流地孔,P/N 过孔不对称 | 补地孔,对称放置过孔,必要时背钻 |
| Gen3 能协商,但眼图余量很小 | 差分对内 P/N 跨层走线,表层/内层速度不同 | 尽量改用同一层走线,或按延迟做等长 |
这几个案例是我在实际项目里见过最多的。问题不一定每次都能一眼定位,但按“设计规则回查 → 局部阻抗检查 → 时延测量”的顺序,大多数都能找到根因。特别提醒一下温度问题:FR4 的介电常数会随温度变化,P/N 失配本身一旦接近临界值,温度漂移就能把它推到悬崖边上。这解释了为什么有些板子在实验室 25 度环境下没问题,一到设备运行温度就掉链子。
5. 说了这么多,我自己的几点体会
5mil 不是一个需要背下来的神奇数字。对我而言,它更像“工程态度”的体现:在 PCB 设计阶段花很少的成本,就能给链路留出一份确定的余量。与其事后拿着示波器抓头发,不如在布线阶段就把差分对的对称性做扎实。
还有一点想提醒大家:规则是死的,板子是活的。就算工具报告长度差只有 0.1mil,也一定要去检查绕线区域的间距、参考平面、过孔回流。等长不是目的,信号完整性才是。把这层逻辑想清楚了,PCIe 3.0 的 5mil 只是起点,后面做 Gen4、Gen5,同样的思路照样适用,只是数字会变成 3mil、2mil 甚至更小。
最后说一个我自己坚持了很多年的习惯:每次画完高速板,都会把差分对规则导成一份带截图的检查表,发板前自己和同事各自核对一遍。几个 mil 的差距,往往就是链路稳不稳的分水岭。希望这篇内容能帮大家少走几条弯路,也欢迎在下面分享你们遇到过的最离谱的 PCIe 走线问题。