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 眼图几乎关闭,全靠均衡器撑着
一个小经验:很多人只看速率,但其实编码效率也很关键。8b/10b 有 20% 的开销,而 128b/130b 只有不到 1.6% 的开销。同频率下,3.0 比 2.0 有效带宽翻了一倍还多。

1.2 架构概览:从物理层到事务层

PCIe 的架构,我习惯用分层模型来理解。它分三层:事务层、数据链路层、物理层。每一层只管自己的事,上层不关心下层怎么干活。这种设计,让你在调试时可以逐层隔离问题。

举个例子,我在项目中曾经碰到过链路能训练但传数据就出错的情况。按照分层排查,先看物理层——信号质量没问题;再看数据链路层——CRC 和重传机制也正常;最后锁定在事务层——原来是事务层包的序列号错了。你想想看,如果这三层跟意大利面一样搅在一起,查起来得多痛苦?

PCIe 分层架构与核心逻辑 PCIe 架构分层模型与数据流 事务层 (Transaction Layer) 生成/解析 TLP(事务层包) 处理内存、IO、配置、消息请求 数据链路层 (Data Link Layer) 添加/检查序列号、CRC、ACK/NAK 重传 管理 DLLP(数据链路层包) 物理层 (Physical Layer) 负责链路训练、数据加扰、串并转换 处理 LTSSM 状态机(链路训练关键) 发起请求 完成响应 核 心 层 次 | | | 本 课 重 点 ← 链路 训练 链路的初始化与训练(LTSSM)发生在物理层,但影响整个栈

这张图展示了 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 设备。你想想看,那么多链路同时训练,资源冲突怎么办?
避坑指南:我曾经在一个嵌入式项目里,把 PCIe 当普通串口一样对待——上电就以为能直接通信。结果链路状态卡在 Detect 阶段半天不动。后来才意识到,PCIe 的链路初始化有一套严格的握手流程。不按流程来,它就是不认你。

所以,我们这门课要讲的链路初始化握手协商,不是纸上谈兵。它直接决定了你的设备能不能上报给系统,能不能跑在全速状态。我见过太多工程师,一上来就调 DMA,链路还没稳妥呢就急着发数据,结果 debug 到崩溃。

1.4 本章小结

好了,这一章我们没有深入代码。但三个概念你得记住:

  1. PCIe 是为了消灭并行总线瓶颈而生的串行点对点总线。
  2. 它采用三层架构:事务层、数据链路层、物理层。链路训练发生在物理层。
  3. 它的应用覆盖服务器、存储、AI、汽车、工业,非常广泛。