4. PCIe接口基础:PCIe物理层、数据链路层、事务层概述、PCIe Gen3/Gen4/Gen5速率对比

各位同学,今天我们聊聊PCIe。说实话,做存储加速器,PCIe是绕不开的坎。你想想看,数据要从CPU搬到加速器,再从加速器搬回内存,走的就是这条高速公路。我这些年调试过的PCIe问题,少说也有几十个了,从链路训练失败到带宽跑不满,什么坑都踩过。今天咱们就把PCIe的三层架构和速率演进讲清楚。

4.1 PCIe的分层架构:三层各司其职

PCIe的设计思路,说白了就是“分层解耦”。它把通信协议拆成了三层:事务层、数据链路层、物理层。每一层只管自己的事,上层不用管下层怎么实现。我在项目中经常跟软件工程师说:你只管发TLP(事务层包),至于这个包怎么变成电信号传过去,那是硬件的事。

核心要点:PCIe的三层架构——事务层(Transaction Layer)、数据链路层(Data Link Layer)、物理层(Physical Layer)。数据从上层往下走,层层封装;从下层往上走,层层解包。

事务层(Transaction Layer) 生成TLP(事务层包):Memory Read/Write、Completion、Message 数据链路层(Data Link Layer) 添加序列号、CRC校验、ACK/NAK重传机制 物理层(Physical Layer) 8b/10b编码(Gen1/Gen2)或128b/130b编码(Gen3+)、串行化/解串行 数据流向

4.2 事务层:你的数据在这里打包

事务层在最上面,它负责生成和解析TLP。什么是TLP?就是事务层包(Transaction Layer Packet)。你发一个DMA读请求,事务层就给你打包成一个Memory Read TLP,然后往下扔。

我个人习惯把TLP分成三类:

  • Memory TLP:最常用,读写DDR、BAR空间都靠它。我遇到过一个问题:某个FPGA加速卡,读BAR0总是返回全F,查了半天发现是地址对齐没做好。
  • Completion TLP:读请求的回应。你发一个读,对方必须回一个Completion,把数据带回来。
  • Message TLP:用于中断、错误通知等。MSI中断就是通过Message TLP实现的。

避坑指南:我曾经在一个项目中,事务层配置错了Max Payload Size(MPS),默认是128字节,但我的DMA引擎一次发512字节。结果TLP被拆成4个,性能直接腰斩。记住:MPS要跟对端协商一致。

4.3 数据链路层:保证数据不出错

数据链路层在中间,它干的事说白了就是“加校验、管重传”。事务层把TLP丢下来,数据链路层给它加上序列号和CRC,然后才交给物理层。

为什么需要这层?因为物理层传数据可能出错。你想想看,信号在PCB走线上跑,串扰、抖动、衰减,什么妖蛾子都可能发生。数据链路层用ACK/NAK机制保证可靠传输:发出去的包如果没收到ACK,就重传。

嗯,这里要注意:数据链路层只保证链路级的可靠,不保证端到端的可靠。端到端可靠是软件的事。

4.4 物理层:真正的信号传输

物理层在最底下,负责把数据变成电信号,通过差分对传出去。PCIe用差分信号,一对线叫一个Lane。x1就是1对发送+1对接收,x16就是16对。

物理层还负责链路训练。每次上电,PCIe设备之间要“握手”:先检测对端是否存在,然后协商速率和宽度。我调试过最头疼的一个问题:某块板卡插上去,链路只能跑到Gen2,死活上不了Gen3。最后发现是PCB走线太长,信号质量不行。

重要提醒:物理层的编码方式在Gen3发生了重大变化。Gen1/Gen2用8b/10b编码,效率只有80%。Gen3开始用128b/130b编码,效率提升到98.5%。这也是Gen3能翻倍的原因之一。

4.5 PCIe Gen3/Gen4/Gen5速率对比

好了,咱们来看看这几代PCIe的速率。很多同学只看单条Lane的速率,其实还要考虑编码开销。

参数 PCIe Gen3 PCIe Gen4 PCIe Gen5
单Lane速率(GT/s) 8.0 16.0 32.0
编码方式 128b/130b 128b/130b 128b/130b
单Lane有效带宽(GB/s) ~0.985 ~1.969 ~3.938
x16有效带宽(GB/s) ~15.75 ~31.5 ~63.0
引入年份 2010 2017 2019

从表格能看出来,每一代速率翻倍。但实际项目中,你很难跑满理论带宽。为什么?因为还有协议开销、TLP头开销、DDR访问延迟等等。我记得有个项目,用Gen4 x16的NVMe SSD,实测顺序读只能到28GB/s,离理论31.5GB/s差了一截。

实战经验:做存储加速器,我建议优先考虑Gen4。Gen3现在有点老了,Gen5虽然快但信号完整性要求极高,PCB设计成本上去了。Gen4是当前性价比最好的选择。当然,如果你做的是高端计算卡,那Gen5是必须的。

4.6 小结:记住这三件事

今天的内容,你只要记住三件事:

  1. PCIe分三层:事务层打包、数据链路层保可靠、物理层传信号。
  2. 速率每代翻倍,但实际带宽要打折扣,别被理论值忽悠了。
  3. 链路训练和信号完整性是硬件调试的难点,我在这上面栽过跟头,你也得多留个心眼。

好了,PCIe的基础就讲到这里。下一节咱们聊聊更具体的东西——TLP的格式和DMA传输的实现。到时候我会拿一个实际项目的代码出来分析。


公众号:蓝海资料掘金营,微信deep3321