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)。数据从上层往下走,层层封装;从下层往上走,层层解包。
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 小结:记住这三件事
今天的内容,你只要记住三件事:
- PCIe分三层:事务层打包、数据链路层保可靠、物理层传信号。
- 速率每代翻倍,但实际带宽要打折扣,别被理论值忽悠了。
- 链路训练和信号完整性是硬件调试的难点,我在这上面栽过跟头,你也得多留个心眼。
好了,PCIe的基础就讲到这里。下一节咱们聊聊更具体的东西——TLP的格式和DMA传输的实现。到时候我会拿一个实际项目的代码出来分析。
公众号:蓝海资料掘金营,微信deep3321