PCIe 概述:从并行总线到高速串行时代
大家好,我是你们这趟 PCIe 链路握手之旅的向导。说实话,干了十几年芯片验证,摸过的总线协议少说也有七八种,但 PCIe 是最让我又爱又恨的一个。爱的是它性能强悍,恨的是它握手过程实在太讲究。
这一章,我们先不急着扎进代码和时序图。先聊清楚三个问题:PCIe 是怎么来的?它长什么样?又能用在哪儿?把这几个问题搞明白,后面学链路握手才不至于晕头转向。
1.1 发展史:为什么非要用 PCIe?
回想一下,二十多年前的计算机内部,还是 PCI 总线的天下。我在刚入行时接触的第一个项目就是 PCI 设备。那时候觉得 133MB/s 的带宽已经够快了。可没过几年,显卡、网卡、硬盘控制器一上来,PCI 总线立马就成了瓶颈。
为什么会这样?说白了,PCI 是并行共享总线。所有设备挂在同一条线上,抢来抢去。而且信号一多,频率一高,时序就乱成一锅粥。我记得有一次调试一个 66MHz 的 PCI 设备,光是解决信号反射问题就花了两周。
后来业界搞了个 PCI-X,频率提到 133MHz 甚至 266MHz。但这只是治标不治本。并行总线的天花板,很快就到了。这时候,Intel 牵头搞出了 PCIe,彻底换了个思路。
PCIe 的历史节点,我整理了一张表,你可以快速过一遍:
| 版本 | 发布年份 | 单通道速率 | 编码方式 | 我印象最深的变化 |
|---|---|---|---|---|
| PCIe 1.0 | 2003 | 2.5 GT/s | 8b/10b | 终于摆脱了并行的噩梦 |
| PCIe 2.0 | 2007 | 5.0 GT/s | 8b/10b | 速率翻倍,但编码没变 |
| PCIe 3.0 | 2010 | 8.0 GT/s | 128b/130b | 编码效率提升,这是我验证过最折腾的版本 |
| PCIe 4.0 | 2017 | 16 GT/s | 128b/130b | 信号完整性要求陡增 |
| PCIe 5.0 | 2019 | 32 GT/s | 128b/130b | 眼图几乎关闭,全靠均衡器撑着 |
1.2 架构概览:从物理层到事务层
PCIe 的架构,我习惯用分层模型来理解。它分三层:事务层、数据链路层、物理层。每一层只管自己的事,上层不关心下层怎么干活。这种设计,让你在调试时可以逐层隔离问题。
举个例子,我在项目中曾经碰到过链路能训练但传数据就出错的情况。按照分层排查,先看物理层——信号质量没问题;再看数据链路层——CRC 和重传机制也正常;最后锁定在事务层——原来是事务层包的序列号错了。你想想看,如果这三层跟意大利面一样搅在一起,查起来得多痛苦?
这张图展示了 PCIe 的标准分层模型。你注意看右侧的说明——LTSSM(链路训练和状态机) 就在物理层。我们的课程,核心就是讲清楚这个状态机是怎么一步步把链路拉起来的。
1.3 应用场景:从服务器到自动驾驶
PCIe 的应用场景,远比你想象的广。我做了十几个 PCIe 项目,涉及过下面这些领域:
- 服务器与数据中心:CPU 连接 NVMe SSD、GPU、网卡。这是 PCIe 的主战场。我记得有个数据中心项目,客户要求整机 PCIe 链路零误码运行 72 小时。那时候压力是真的大。
- 显卡与高性能计算:x16 甚至 x32 通道连接 GPU。带宽不够,AI 训练就得等。说白了,没有 PCIe,大模型训练根本跑不起来。
- 存储系统:NVMe 协议就是基于 PCIe 的。我做过一个 NVMe 控制器验证项目,链路训练阶段经常出问题,后来发现是参考时钟抖动太大。
- 嵌入式与工业:FPGA 加速卡、工控机、医疗影像设备。这些设备对确定性延迟要求极高。PCIe 的等时传输(Isochronous)在这里很关键。
- 汽车电子:自动驾驶域控制器。里面一颗芯片可能连了十几个 PCIe 设备。你想想看,那么多链路同时训练,资源冲突怎么办?
所以,我们这门课要讲的链路初始化握手协商,不是纸上谈兵。它直接决定了你的设备能不能上报给系统,能不能跑在全速状态。我见过太多工程师,一上来就调 DMA,链路还没稳妥呢就急着发数据,结果 debug 到崩溃。
1.4 本章小结
好了,这一章我们没有深入代码。但三个概念你得记住:
- PCIe 是为了消灭并行总线瓶颈而生的串行点对点总线。
- 它采用三层架构:事务层、数据链路层、物理层。链路训练发生在物理层。
- 它的应用覆盖服务器、存储、AI、汽车、工业,非常广泛。