PCIe 总线概述与一致性测试目标

大家好,欢迎来到这门课。

咱们直接从核心说起。PCIe 是什么?说白了,它就是计算机里连接 CPU 和各种外设的高速公路。你用的显卡、固态硬盘、网卡,几乎全靠它来跟 CPU 聊天。

我刚入行那会儿,还是 PCI 和 PCI-X 的天下,并行总线,信号多,干扰大。后来 PCIe 一出来,整个格局都变了。串行、差分、点对点,一个 Lane 里只有一对发送和一对接收,结构简单多了,但速度却翻着跟头往上涨。

1.1 从并行到串行:PCIe 为何成为主流

做个对比你就明白了。传统的 PCI 总线是共享式的,所有设备挂在同一条线上,谁想说话得先申请仲裁。频率一高,信号就容易串扰,跑不快。

PCIe 完全换了个思路:每个设备跟主机之间,有一条独立的专用通道。这条通道叫做 Link,Link 里面可以包含 1、2、4、8、16 甚至 32 条 Lane。每条 Lane 是两根差分对,一共四根线。

这种架构的好处很明显:

  • 可扩展性:设备需要多少带宽,就分配几条 Lane。x1 给网卡,x16 给显卡,灵活得很。
  • 信号完整性:差分信号抗干扰能力强,速率可以提得很高。
  • 点对点通信:没有总线仲裁,延迟低,效率高。

我在调试一个 FPGA 板卡时遇到过这种情况:PCIe Link 老是训练不到 x8,只能跑到 x4。查了半天,发现是其中一对差分线的等长没做好。差分走线要求等长,而且组内等长比组间等长严格得多。这个坑,很多人容易忽略。

1.2 一致性测试的目标:为什么要测?

你设计了一个 PCIe 设备,焊好板子,上电,系统认出来了,是不是就完事了?不行。

一致性测试(Compliance Test)的目的,就是确保你的设备能跟任何合规的主机或设备正常通信。它不代表你的系统在真实场景下一定跑得稳,但它是一张入场券。

简单说,有三大目标:

  1. 电气特性达标:发送端的眼图、抖动、电压摆幅,都得在规范规定范围内。否则,接收端可能误码。
  2. 协议行为正确:链路训练、状态机跳转、TLP 包格式、流控制,每一步都得按规范来。我见过一个项目,因为链路训练时 TS1 序列里的 Reserved 位没处理好,导致下游设备握手失败。
  3. 互操作性保证:这是最终目的。你的卡插到不同主板、不同 BIOS、不同操作系统下,都能正常工作。

1.3 一致性测试的核心知识体系

我把 PCIe 一致性测试需要关注的内容,梳理成一张图,方便你从整体上把握。

PCIe 一致性测试知识体系 PCIe 一致性测试标准 电气层测试 协议层测试 互操作性测试 眼图 & 抖动 电压摆幅 & 上升时间 链路训练状态机 TLP/DLLP 格式 多平台兼容 OS & Driver 验证 测试顺序建议 先通过电气层测试 → 再跑协议层测试 → 最后做多平台互操作验证 电气层不通过,协议层测试结果无意义

1.4 测试的层次与思路

一致性测试并不是把所有项目跑一遍那么简单。你需要理解测试的层次结构。

我习惯把它分成三个层面:

  • 物理层(PHY):这是最基本的。信号有没有反射?眼图张开够不够大?抖动有没有超标?这些都得用示波器来抓。
  • 数据链路层(Data Link Layer):ACK/NAK 机制、重传、流控制。这里的重点是看链路是否稳定,有没有大量的重传。
  • 事务层(Transaction Layer):TLP 包的格式、地址路由、完成(Completion)的匹配。这部分通常用协议分析仪来抓包。
测试层面 主要关注点 常用仪器
物理层(电气) 眼图、抖动、电压、上升/下降时间 实时示波器(采样率 >= 50 GSa/s)
数据链路层 ACK/NAK、CRC、重传、流控制 PCIe 协议分析仪
事务层 TLP 格式、寻址、完成超时 PCIe 协议分析仪 + 训练器

一点个人经验

刚开始做 PCIe 测试,别一上来就拿着示波器满板子乱点。先看 Link 能不能稳定建起来。如果 Link 都训练不到预期速度,那后面测什么都没用。

我曾经有个项目,Gen3 的卡在 Gen3 主板上只能协商到 Gen2。查了两天,最后发现是参考时钟的展频(SSC)没关。有些主板默认关掉 SSC,但你的卡如果只在 SSC 模式下做了匹配,就会降速。这种问题,板上是看不出来的。

1.5 测试的准备工作

动手之前,有几件事情必须确认好:

  1. 确定被测设备的 Lane 数和速率:是 x1、x4、x8 还是 x16?Gen1、Gen2、Gen3 还是 Gen4/5?不同速率,测试要求不同。
  2. 准备标准的测试夹具:PCI-SIG 规定了固定的测试点(比如 CBB、CEM)。自己飞线测出来的眼图,跟用夹具测出来的不一样,也拿不到认证。
  3. 校准仪器:示波器的探头、电缆、夹具的损耗,都要做去嵌入(De-embedding)。否则你测到的抖动里,有一半是探头贡献的。

⚠️ 注意:测试环境的隐性成本

PCIe 一致性测试对环境很敏感。温度、电源噪声、接地质量,都会影响结果。

在我调试一个 Gen4 项目时,同一个设备,在实验室 A 测眼图是合规的,拿到实验室 B 就不行。后来发现,实验室 B 的电源有高频纹波。所以说,先确认测试环境干净了,再来怀疑你的设计。

好了,这一章作为开场,我们把 PCIe 的大致面貌和一致性测试的价值讲清楚了。后面我们会展开每一个测试项,从低速的 Gen1 开始,一步一步往上走。测试不难,难的是你知道在什么时候该测什么,以及怎么正确解读结果。