PCIe 从入门到精通之六:PCIe 数据包 packet 的神奇之旅
0. 引言
PCIe 是硬件工程师跨不过去的坎。我刚开始工作就接触 PCIe,工作中遇到的所有产品都有 PCIe 总线。在此想把自己学习 PCIe 的一些经历和感悟,以及踩过的坑分享在这里。
所有 PCIe 主题的文章都会收录在《深入浅出聊 PCIe》合集里,每篇文章涵盖一个 PCIe 的主题,预计会有几十篇文章,我会尽量用通俗的语言和大家介绍 PCIe 设备内部的奥妙。
在上一篇文章《PCIe 从入门到精通之五:PCIe 分层结构》中,我们介绍了 PCIe 分为四层(应用层、事务层、数据链路层和物理层)。在这一篇文章中我们继续介绍 PCIe 数据包 packet 如何在各层之间传输。
需要下载 PCIe 学习资料标准的朋友(pdf 格式),请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。
1. PCIe 数据包 packet 的种类
数据包(packet)是 PCIe 总线传输数据的最小单元。最原始要传输的数据我们称之为 data payload。
想象一下总公司(Root Complex)要派员工(Data Payload)到下属的分公司(Endpoint)出差:
- 员工一开始是一丝不挂的
- 在事务层我们给他穿上了内衣(Header 和 ECRC)→ 称为 TLP(Transaction Layer Packet)
- 在数据链路层我们给他穿上了秋衣(Sequence Number 和 LCRC)→ 称为 DLLP(Data Link Layer Packet)
- 在物理层我们给他穿上了外套(两个 Framing)
这样武装整齐,员工(Data Payload)就可以出门乘坐 Root Complex 和 Endpoint 之间的高铁了。
最后在物理层打包好的数据包(packet),在每个 Lane 上加扰码,经 8/10 或 128/130 编码或 Flit 编码,最后通过物理传输介质传输给接收方。
接收方执行逆操作:
- 在物理层:脱去外套(两个 Framing)
- 在数据链路层:脱去秋衣(校验序列号 Sequence Number 和 LCRC)
- 在事务层:脱去内衣(Header 和 ECRC)
- 最后,员工(Data Payload)恢复到原生态的一丝不挂,接收端获得原始的数据
总结:数据传输时在不同的层会被打包封装,就像穿衣服一样,分别生成 TLP 和 DLLP。数据接收时在不同的层会被解包,就像脱衣服一样,分别恢复成 DLLP 和 TLP。
2. PCIe 数据包 packet 传输流程
数据包流向总结:
发送端:
- 在事务层被封装成 TLP
- 传递给数据链路层,数据链路层在 TLP 上添加序列号 Sequence Number 和 LCRC
- 物理层将这些数据包(TLP 或 DLLP)进行编码、串行化并转换为电信号,通过 PCIe 链路发送出去
接收端(逆向过程):
| 层次 | 处理内容 |
|---|---|
| 物理层 | 接收到电信号,进行解码、解串行化,并检查物理层错误 |
| 数据链路层 | 去除物理层添加的信息,检查 LCRC 和序列号。若错误或序列号异常,发送 NAK 请求重传;若正确,发送 ACK,去除序列号和 LCRC,将 TLP 传递给事务层 |
| 事务层 | 解析 TLP 头和数据负载,进行 ECRC 校验(如果存在),并将数据或消息传递给设备核心(Device Core)进行处理 |
整个过程就是一个员工起床穿衣(从 Transmitter 出发,encoding)、员工乘坐高铁(信号在 PCIe lanes 上传输)、员工到达目的地脱衣验明正身(到达 Receiver,decoding)的过程。
3. PCIe 数据包 packet 在 Switch 中的传输流程
PCIe 交换机通常包含一个上游端口(Upstream Port)和多个下游端口(Downstream Ports),每个 Switch 的每个 Port 也需要实现 PCIe 的这三层功能。
Switch 是“大区域的分总公司”、是交通枢纽,员工(Data Payload)出差到达 Switch 是要入住酒店睡觉的:
- 睡觉嘛,外套(两个 Framing)是一定会脱掉的
- 天高皇帝远,妈妈叮嘱一定要穿的秋衣(校验序列号 Sequence Number 和 LCRC)也是要趁此机会脱掉的
- 出差公司报销一切花费,room service 和大保健等也要安排上,这样内衣(Header 和 ECRC)最后也脱掉了
最后,员工(Data Payload)到达 Switch 内部后也恢复到了原生态的一丝不挂。
第二天起床,员工(Data Payload)在 Switch 的 RXEQ(CTLE、DFE、AGC)和 TXEQ(Preshoot、Boost、Deemphasis)的加持下,满血复活(信号品质恢复),穿上新衣服,精神抖擞地前往下一站(Endpoint)。
总结:如果把上面所提到的数据包发送和接收过程称之为穿衣脱衣的过程,那么从 Root Complex 传输的数据包到达 Switch 的 Upstream Port 时,Upstream Port 会对数据包执行一次脱衣过程,脱完衣服的数据包会被传到对应的下游端口,下一个端口又执行一次穿衣过程,穿完衣服以后的数据包会发往下一站。
PCIe 交换机还负责错误检测和报告。如果检测到链路层错误(如 LCRC 错误),数据链路层会请求重传。事务层也会进行端到端的数据完整性校验(ECRC,如果启用)。
4. 错误处理机制(LCRC 和 ECRC)
4.1 LCRC
PCIe LCRC(Link Cyclic Redundancy Check,链路循环冗余校验)是 PCIe 数据链路层(Data Link Layer)的关键组成部分,用于确保在两个直接相连的 PCIe 设备之间传输的数据包(TLP 和 DLLP)的完整性。LCRC 是一种强大的错误检测机制,它能够检测传输过程中发生的绝大多数比特错误。
LCRC 工作流程:
| 步骤 | 说明 |
|---|---|
| 重新计算 LCRC | 接收端的数据链路层使用与发送端相同的 CRC-32 算法,对接收到的数据包(除了 LCRC 本身)进行重新计算,生成一个新的 32 位 LCRC 值 |
| 比较验证 | 接收端将自己计算出的 LCRC 值与接收到的数据包中附加的 LCRC 值进行比较 |
| 匹配 | 如果两个 LCRC 值完全匹配,数据包完整。接收端向发送端发送 ACK(Acknowledgement)DLLP,表示成功接收 |
| 不匹配 | 如果两个 LCRC 值不匹配,表明数据包在传输过程中发生错误。接收端丢弃该数据包,并向发送端发送 NAK(Negative Acknowledgement)DLLP,表示接收失败 |
4.2 ECRC
PCIe ECRC(End-to-End Cyclic Redundancy Check,端到端循环冗余校验)是 PCIe 协议中一种可选但非常重要的错误检测机制,它工作在事务层(Transaction Layer)。与链路层的 LCRC 不同,ECRC 旨在提供从源设备到目的设备整个传输路径上的数据完整性保护,包括经过 PCIe 交换机等中间设备。
ECRC 的启用与条件:
- ECRC 是可选的
- 是否启用 ECRC 由 PCIe 设备的配置空间中的相关位控制(例如,在 PCIe Capability 结构中的 Device Control 寄存器)
ECRC 工作流程:
| 步骤 | 说明 |
|---|---|
| 检查 ECRC 标志 | 接收端的事务层首先检查 TLP 头部中的 ECRC 标志位,以确定该 TLP 是否包含 ECRC |
| 重新计算 ECRC | 如果 TLP 包含 ECRC,接收端的事务层使用与发送端相同的 CRC-32 算法,对接收到的 TLP(TLP 前缀、TLP 头部和数据负载)进行重新计算,生成一个新的 32 位 ECRC 值 |
| 比较验证 | 接收端将自己计算出的 ECRC 值与接收到的 TLP 中附加的 ECRC 值进行比较 |
| 匹配 | 如果两个 ECRC 值完全匹配,TLP 在整个传输路径中没有发生错误,事务层继续处理该 TLP |
| 不匹配 | 如果两个 ECRC 值不匹配,TLP 在传输过程中发生了错误。接收端报告一个不可纠正的错误(Uncorrectable Error) |
重要说明:与 LCRC 不同,ECRC 错误不会触发数据链路层的自动重传(ACK/NAK)。这是因为 ECRC 是端到端的,错误可能发生在链路层的范围之外(例如在交换机内部)。
当检测到 ECRC 错误时,通常会触发一个错误报告机制,将错误信息上报给系统软件(如操作系统)。这可能导致系统级别的错误处理,例如驱动程序重试操作、系统日志记录,甚至系统崩溃(取决于错误的严重性和系统配置)。ECRC 错误通常被视为更严重的错误,因为它表明数据在整个路径上受到了损坏,而不仅仅是单个链路上的瞬时问题。
4.3 ECRC 与 LCRC 的区别总结
| 特性 | ECRC(End-to-End CRC) | LCRC(Link CRC) |
|---|---|---|
| 工作层 | 事务层(Transaction Layer) | 数据链路层(Data Link Layer) |
| 保护范围 | 从源设备到目的设备整个传输路径 | 两个直接相连的 PCIe 设备之间的链路 |
| 检测对象 | TLP 前缀、头部和数据负载 | TLP/DLLP 的头部、数据负载、序列号 |
| 错误处理 | 报告不可纠正错误,不触发自动重传 | 触发 ACK/NAK 重传机制,纠正错误 |
| 强制性 | 可选 | 强制性 |
| 目的 | 端到端数据完整性 | 链路可靠性 |
5. 总结
本文介绍了两种数据包:TLP 和 DLLP,以及它们在各层中的“穿衣”和“脱衣”过程,并详细对比了 LCRC 和 ECRC 的不同。
6. 抛砖引玉
PCI 设备都有 256 Byte 的配置空间 configuration space。那么:
- PCIe 设备有配置空间吗?
- PCIe 设备有配置空间有多大?
敬请关注下一篇:
《PCIe 从入门到精通之七:PCIe 设备的配置空间简介》
7. 参考文献
- PCI Express® Base Specification Revision 5.0 Version 1.0
- PCI Express® Base Specification Revision 6.4
- PCI Express® Base Specification Revision 7.0
PCIe从入门到精通





