第1章 PCIe 概述:基本概念、版本演进与速率归纳
做高速串行总线这行十几年了,每次新项目拿来,第一件事就是看 PCIe 链路能不能正常协商。很多人觉得链路均衡啊、训练状态啊才是深水区,但说实话,如果连 PCIe 的基本概念和版本速率都搞不清,后面排查故障你会一头雾水。这一章我们就从根上捋一遍——什么是 PCIe,它经历了哪些版本,每个版本能跑多快。嗯,我会加一些自己踩过的坑,帮你少走弯路。
1.1 PCIe 是什么?为什么它不是 PCI 的简单升级?
PCIe 的全称是 Peripheral Component Interconnect Express,翻译过来就是“快捷外设互联”。我是觉得这名字挺直白的——快,而且是串行。
老一点的工程师应该记得 PCI 总线,那是并行架构,共享一条 32 位或 64 位的总线。所有设备挤在同一条线上,谁用谁申请,带宽大家一起分。我记得当年做 PCI 网卡,速率稍微上去一点,信号干扰就来了,调试起来真是头疼。
PCIe 彻底换了个思路:用差分信号(一对发送线、一对接收线)组成一个 Lane,每个 Lane 都是全双工、点对点的串行通道。这意味着什么?说白了,每个设备都有自己的专属通道,不用跟别人抢。多通道还可以捆绑成 x1、x4、x8、x16,带宽直接翻倍。
1.2 核心概念:Lane、Link 与拓扑结构
要调试 PCIe 链路均衡,三个词你必须烂熟于心:Lane、Link、拓扑。
- Lane:最基本的物理通道,由一对发送差分对(TX+ / TX-)和一对接收差分对(RX+ / RX-)组成。每个 Lane 都是独立的双向链路。
- Link:把多个 Lane 捆绑到一起形成的逻辑链路。比如 x16 就是 16 个 Lane 同时工作。注意,Lane 的数量必须在链路训练时协商一致,两边必须对等。
- 拓扑:典型的 PCIe 系统是一个树形结构。最上面是 Root Complex(根复合体,通常集成在 CPU 或芯片组里),下面接 Switch(交换器),再往下挂 Endpoint(端点设备,比如显卡、NVMe SSD)。
我曾经遇到过一个故障:一块 FPGA 加速卡在 x16 插槽上只能协商到 x2。排查了半天,发现是 FPGA 那边的物理 Lane 映射焊错了,把第 0 个 Lane 接到了第 3 个 Lane 上。所以,搞清楚拓扑里的 Lane 编号映射,是排故障的第一步。
1.3 PCIe 版本演进:从 1.0 到 6.0
PCIe 基本上每三四年更新一代,速率翻倍,编码方式也跟着变。我按时间线帮你理一理:
- PCIe 1.0(2003):2.5 GT/s,每条 Lane 有效带宽 ~250 MB/s(8b/10b 编码,开销 20%)。那时候大家刚从 PCI 转过来,觉得这速度已经起飞了。
- PCIe 2.0(2007):5 GT/s,有效带宽翻倍到 ~500 MB/s。编码还是 8b/10b。我记得当时显卡开始用 x16 2.0,游戏画面流畅很多。
- PCIe 3.0(2010):8 GT/s,有效带宽 ~985 MB/s。编码换成 128b/130b,开销从 20% 降到 1.5%。这是一个里程碑——速率没翻倍(从 5 到 8),但有效吞吐接近翻倍。很多老设备到现在还在用 3.0。
- PCIe 4.0(2017):16 GT/s,有效带宽 ~1.97 GB/s。编码延续 128b/130b。我替客户排查过一块 4.0 的 SSD 只在 3.0 下跑,结果是主板插槽的均衡参数没调好。
- PCIe 5.0(2019):32 GT/s,有效带宽 ~3.94 GB/s。目前高端 CPU 和显卡已经标配 5.0。不过说实话,链路均衡的难度也上了一个台阶。
- PCIe 6.0(2022):64 GT/s,但这次编码变成了 PAM4 信令(1b/1b 调制),有效带宽 ~7.56 GB/s。纠错机制也加入了 FLR(Forward Error Correction)。嗯,这个版本还在普及初期,但调试工具已经跟不上了。
1.4 速率归纳总结:一张表看清所有版本
下面这张表我常用来做快速参考。你调试时看到 `lspci` 输出里的 `Speed 8GT/s` 就要知道这是 3.0;看到 `16GT/s` 是 4.0。别搞混。
| 版本 | 单 Lane 速率 (GT/s) | x16 总带宽 (GB/s) (双向) |
编码方式 | 引入年份 |
|---|---|---|---|---|
| PCIe 1.0 | 2.5 | 8 | 8b/10b | 2003 |
| PCIe 2.0 | 5.0 | 16 | 8b/10b | 2007 |
| PCIe 3.0 | 8.0 | 31.5 | 128b/130b | 2010 |
| PCIe 4.0 | 16.0 | 63 | 128b/130b | 2017 |
| PCIe 5.0 | 32.0 | 126 | 128b/130b | 2019 |
| PCIe 6.0 | 64.0 | 252 | PAM4 + FLR | 2022 |
下面这张 SVG 图把版本演进画得更直观。我习惯把它贴在工位上,每次看着它就能想起哪个版本应该用什么均衡策略。
1.5 一个实用小技巧:快速查看当前链路状态
不管你是做板卡调试还是系统集成,lspci 都是最趁手的工具。我个人习惯加三个 -v 来获取最详细的信息。
lspci -vvv -s 01:00.0 | grep -iE "Width|Speed"
输出可能像这样:
LnkCap: Port #0, Speed 16GT/s, Width x4, ASPM L1, Exit Latency L1 <8us
LnkSta: Speed 16GT/s (ok), Width x4 (ok)
里面的 Speed 16GT/s 就是 4.0 的速率。如果显示 Speed 8GT/s 但设备是 4.0 的,那就说明链路降级了。我遇到过好几次,原因是插槽金手指氧化,导致均衡训练失败,自动回退到 3.0。拿橡皮擦擦一擦就好了——你看,有时候故障排查就是这么朴实无华。
Width 和 Speed 都标了 (downgraded),那就先别急着换设备。先检查一下供电是否足够,再量一下参考时钟的抖动。很多降级问题其实是时钟源不干净导致的。