PCIe 总线概述:从 Gen1 到 Gen6 的演进之路
做信号完整性这些年,PCIe 总线是我打交道最多的串行总线之一。说实话,每次版本迭代,对我们硬件工程师来说都是一次新的挑战——速率越来越高,裕量越来越小。这一章我们先搭个基础框架,把 PCIe 的版本演进、拓扑结构和带宽对比理清楚,后面的 S 参数分析和均衡优化才好落地。
1.1 版本演进:Gen1 到 Gen6 都改了啥
PCIe 从 2003 年推出至今,差不多每三年一代。我个人习惯按编码方式和数据速率来记这几个版本,因为这两个参数直接决定了通道设计的难度。先看总览表:
| 版本 | 编码方式 | 数据速率 (GT/s) | 单 Lane 带宽 (GB/s) | x16 总带宽 (GB/s) | 推出年份 | 关键特性 |
|---|---|---|---|---|---|---|
| Gen1 (1.0a) | 8b/10b | 2.5 | 0.25 | 4 | 2003 | 第一代串行替代方案 |
| Gen2 (2.0) | 8b/10b | 5 | 0.5 | 8 | 2007 | 速率翻倍,协议改进 |
| Gen3 (3.0) | 128b/130b | 8 | 0.985 | 15.75 | 2010 | 编码效率提升,协议层重设计 |
| Gen4 (4.0) | 128b/130b | 16 | 1.969 | 31.5 | 2017 | 速率翻倍,通道损耗容限提升 |
| Gen5 (5.0) | 128b/130b | 32 | 3.938 | 63 | 2019 | 引入 Equalization Phase 3,高阶均衡 |
| Gen6 (6.0) | PAM4 (1b/1b) | 64 | 7.563 | 121 | 2022 | NRZ→PAM4,FEC,更低延迟 |
注意 Gen3 是个分水岭。为什么?编码从 8b/10b 换成了 128b/130b,开销从 20% 降到了 1.5% 左右。我在项目中遇到过不少工程师还在用 8b/10b 的思维去估算 Gen3 带宽,结果算出来总比实际高一大截——其实是忘了有效带宽的计算公式。
// 有效带宽计算公式(单 Lane)
有效带宽 (GB/s) = 数据速率 (GT/s) × 编码效率(去掉开销后)
// 举例:Gen3 x16
= 8 GT/s × (128/130) × 16 lane
≈ 8 × 0.9846 × 16
≈ 126 Gb/s → 15.75 GB/s
核心指标:数据速率(GT/s)≠ 有效带宽(GB/s)。编码效率决定了开销有多大,Gen1/Gen2 的 8b/10b 只有 80% 的效率,Gen3 之后提升到了 98.5% 以上。
到了 Gen6,转而使用 PAM4 调制。这是个很大的跳跃。NRZ 只有 0 和 1 两个电平,PAM4 有 4 个。你想想看,一个符号周期就能传 2 比特,等效速率自然就上去了。但代价是信噪比要求更高——通道损耗稍微大一点,眼图就闭上了。我在调试 Gen6 预研项目时,最深的一个感受是:以前 NRZ 的均衡方法几乎要全部重来。
1.2 拓扑结构:点对点 vs 共享总线
PCIe 最大的变化之一,就是从 PCI/PCI-X 的共享并行总线改成了点对点串行架构。说白了,每个设备都有自己的专用通道,不用再去抢总线使用权了。
典型的 PCIe 拓扑包含以下几个角色:
- Root Complex (RC):系统的起点,通常是 CPU 或 SoC 内部集成的 PCIe 控制器。RC 负责与 CPU 内存子系统交互,生成配置和 IO 事务。
- Switch:相当于一个多端口的转发器,用来扩展更多的 Endpoint。Switch 内部有多个逻辑桥(Virtual PCI-to-PCI Bridge),负责事务层路由。
- Endpoint (EP):功能设备,比如 GPU、NVMe SSD、网卡。EP 可以是单功能或多功能设备。
- PCIe Bridge:用于连接不同的总线域,比如将 PCIe 转成传统的 PCI 总线。
个人经验:我曾经踩过一个坑——在拓扑中只有一个 Endpoint 时,没用 Switch,直接用 RC 直连 EP 就完事了。后来增加第二个 EP 时才发现 RC 的 Lane 不够分,得重新改版。如果你在产品规划阶段就预留了多设备扩展的可能性,建议一开始就考虑使用 Switch。
拓扑的层级关系决定了链路训练的顺序。RC 先检测下游是否有设备,然后逐级往下扫描。每个 Port 只能连一个下游设备(不管那是 Switch 还是 Endpoint),不能再像 PCI 那样挂一堆设备在一个总线上。这种点对点结构虽然布线增加了,但是信号质量好管控——一条链路上只有一对 Tx/Rx,串扰和反射都容易分析。
从图上能看出,Switch 是拓扑的枢纽。每个 Endpoint 都是从 RC 或者 Switch 的下行端口引出来的。需要注意的是,Switch 内部实现实际上是多个虚拟桥的组合,这在后面的链路训练和均衡协商中会影响 RX 检测的顺序。嗯,这里要注意:如果你设计的链路中有多级 Switch,均衡协商的延迟会增加,有些较老的主板在 Gen5 下的多级拓扑容易把训练时间拉得很长。
1.3 数据速率与带宽:不同版本差了多少
再来看数据速率和带宽的对比。这点很关键——很多时候大家只看 GT/s 的数字,觉得 Gen6 比 Gen3 快了 8 倍,但实际上有效带宽差距并没有那么大。为什么?因为编码效率、链路宽度和开销项都在变。
举个实际例子,Gen3 x4 和 Gen2 x8 哪个带宽高?
- Gen3 x4:8 GT/s × (128/130) × 4 ≈ 31.5 Gb/s → 3.94 GB/s
- Gen2 x8:5 GT/s × (8/10) × 8 ≈ 32 Gb/s → 4 GB/s
几乎不相上下。我曾经在项目中遇到客户坚持要用 Gen2 x16 来保证带宽,其实 Gen3 x8 就能达到同样的效果,而且还能省 PCB 面积和控制器引脚。你想想看,有时候版本升级带来的不仅仅是速度提升,还有布线资源的节约。
关键提醒:GT/s 是指每秒传输的符号数(Giga Transfers per second),不等于 Gb/s。对于 NRZ(Gen1~Gen5),1 Transfer = 1 bit;对于 PAM4(Gen6),1 Transfer = 2 bits。以 Gen6 的 64 GT/s PAM4 为例,等效数据速率是 128 Gb/s。这一点在做链路预算时千万别搞混。
下表整理了不同版本在各 Lane 数下的有效带宽,方便你快速估算:
| 版本 | x1 有效带宽 | x4 有效带宽 | x8 有效带宽 | x16 有效带宽 | 典型应用场景 |
|---|---|---|---|---|---|
| Gen1 | 0.25 GB/s | 1 GB/s | 2 GB/s | 4 GB/s | 低速 I/O、传统外设 |
| Gen2 | 0.5 GB/s | 2 GB/s | 4 GB/s | 8 GB/s | 千兆网卡、SATA 控制器 |
| Gen3 | 0.985 GB/s | 3.94 GB/s | 7.88 GB/s | 15.75 GB/s | 中端 GPU、NVMe SSD |
| Gen4 | 1.969 GB/s | 7.88 GB/s | 15.75 GB/s | 31.5 GB/s | 高端 GPU、数据中心 SSD |
| Gen5 | 3.938 GB/s | 15.75 GB/s | 31.5 GB/s | 63 GB/s | AI 加速器、高速网络 |
| Gen6 | 7.563 GB/s | 30.25 GB/s | 60.5 GB/s | 121 GB/s | 超算互连、下一代数据中心 |
从 Gen5 到 Gen6,单 Lane 带宽直接翻倍——但这是在变成 PAM4 和增加 FEC(前向纠错)之后做到的。FEC 虽然在协议层解决了部分误码问题,但也引入了额外的延迟。对于延迟敏感的应用(比如存储控制器),你得在系统设计阶段做好权衡。
最后说一句,我个人的建议:在做系统级带宽规划时,不要只看 x16 的理论峰值,要留出 20~30% 的余量给协议开销(TLP/DLLP 头、ACK/NAK、流量控制等),尤其是 Gen5 以上的高频设计,通道损耗和串扰很容易把实际吞吐拉低。这部分我们后面在均衡优化章节会详细展开。