2. PCIe 分层架构:事务层、数据链路层、物理层的职责与交互
PCI Express 采用典型的分层架构设计,将复杂的通信协议划分为三个独立的逻辑层:事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)。这种分层设计使得每一层专注于特定的功能,层与层之间通过明确定义的接口进行交互,从而降低了协议实现的复杂度,并提高了设计的灵活性和可复用性。
核心设计思想: 分层架构的核心在于“关注点分离”。上层(事务层)关注数据的内容和语义,中间层(数据链路层)关注传输的可靠性和完整性,下层(物理层)关注信号的电气特性和比特传输。这种隔离使得任一层的演进或优化不会影响其他层。
2.1 事务层(Transaction Layer)
事务层位于 PCIe 分层架构的最顶层,直接与设备核心层(Device Core)交互。它是整个协议栈中语义最丰富的层次,负责处理所有与“事务”相关的操作,例如内存读写、I/O 读写、配置读写以及消息传递。
2.1.1 核心职责
- TLP 的组装与解析: 将来自设备核心的请求(如读/写)封装成标准的事务层包(Transaction Layer Packet, TLP),或从接收到的 TLP 中解析出数据并交付给核心层。
- 事务排序与管理: 根据事务类型(Posted/Non-Posted/Completion)和流量类别(Traffic Class, TC),管理多个事务在虚拟通道(Virtual Channel, VC)中的顺序,确保协议一致性并避免死锁。
- 流量控制(Flow Control): 通过信用量(Credit)机制,管理发送端与接收端之间的缓冲区状态,防止接收端被数据淹没。
- 地址空间转换: 支持 Memory、I/O、Configuration 和 Message 四种地址空间,并完成地址映射。
2.1.2 TLP 结构
一个标准的 TLP 由以下几部分组成:
| 字段 | 长度(Bytes) | 描述 |
|---|---|---|
| 起始帧(Start) | 1 | 帧定界符,标识 TLP 开始 |
| TLP 前缀(Optional) | 4/8 | 用于扩展 TLP 功能,如 TLP Processing Hints (TPH) |
| TLP 头(Header) | 12/16/20 | 包含事务类型、长度、地址、Tag、TC 等关键信息 |
| 数据负载(Data Payload) | 0 ~ 4096 | 可选字段,携带实际读写数据 |
| ECRC(End-to-End CRC) | 4 | 端到端循环冗余校验,可选字段 |
| 结束帧(End) | 1 | 帧定界符,标识 TLP 结束 |
关键概念:Posted vs. Non-Posted 事务
- Posted 事务: 发送端发出后无需等待 Completion(完成包),如 Memory Write。具有最高优先级,但无可靠性反馈。
- Non-Posted 事务: 发送端发出后必须等待接收端返回 Completion,如 Memory Read。具有可靠性保证,但延迟较大。
2.2 数据链路层(Data Link Layer)
数据链路层位于事务层和物理层之间,扮演着“可靠传输保障者”的角色。它不关心 TLP 的具体语义,而是专注于确保 TLP 在链路上的无差错、有序传输。
2.2.1 核心职责
- DLLP 交换: 生成并解析数据链路层包(Data Link Layer Packet, DLLP),用于链路管理功能,如 ACK/NAK、电源管理、流控更新等。
- CRC 校验与重传(ACK/NAK 协议): 为每个 TLP 附加 LCRC(Link CRC)。接收端通过 ACK(确认)或 NAK(否认)DLLP 通知发送端传输状态,发送端根据 NAK 触发重传。
- TLP 序列化与去序列化: 为每个发送的 TLP 分配唯一的序列号(Sequence Number),并在接收端按序列号重组数据流,保证顺序交付。
- 链路初始化与电源管理: 参与链路训练状态机(LTSSM)的部分状态,如链路初始化、L0s/L1 等低功耗状态的进入与退出。
2.2.2 ACK/NAK 协议流程
- 发送端为每个 TLP 分配序列号(Seq#),并保存副本在重传缓冲区(Replay Buffer)中。
- 接收端收到 TLP 后,校验 LCRC。如果校验通过,发送 ACK DLLP(包含期望的下一个序列号);如果校验失败,发送 NAK DLLP。
- 发送端收到 ACK 后,从重传缓冲区中移除已确认的 TLP;收到 NAK 或超时未收到 ACK,则从重传缓冲区中取出所有未确认的 TLP 进行重传。
2.3 物理层(Physical Layer)
物理层是 PCIe 协议栈的最底层,直接与物理链路(差分信号对)打交道。它负责将来自数据链路层的数据流转换为适合在高速串行链路上传输的比特流,并处理链路训练、时钟恢复、电气特性等底层细节。
2.3.1 核心职责
- 编码与解码: 对数据进行编码(如 Gen1/Gen2 使用 8b/10b 编码,Gen3+ 使用 128b/130b 编码),以提供足够的时钟恢复边沿和直流平衡。
- 串行化与解串行化: 将并行数据转换为高速串行比特流发送,或将接收到的串行比特流转换为并行数据。
- 链路训练与状态机(LTSSM): 负责链路的初始化、速度协商、宽度协商、链路复位和电源状态转换。这是 PCIe 协议中最复杂的部分之一。
- 有序集(Ordered Sets)管理: 生成并解析用于链路训练和管理的特殊序列,如 TS1/TS2(训练序列)、SKP(时钟补偿)、FTS(快速训练序列)等。
- 电气子块(Electrical Sub-block): 处理差分信号驱动、接收均衡、去加重、阻抗匹配等模拟电路特性。
2.3.2 物理层子层划分
物理层内部进一步划分为两个子层:
| 子层 | 功能 | 关键组件 |
|---|---|---|
| 逻辑子层(Logical Sub-block) | 处理数字逻辑功能,包括编码/解码、有序集生成/解析、弹性缓冲区、链路训练状态机逻辑 | 8b/10b 编解码器、弹性缓冲、LTSSM 控制器 |
| 电气子层(Electrical Sub-block) | 处理模拟和高速信号功能,包括差分驱动器、接收器、PLL、时钟数据恢复(CDR)、阻抗校准 | SerDes、PLL、CDR、TX/RX 均衡器 |
2.4 层间交互与数据流
一个完整的数据包从设备核心发出到最终在链路上传输,需要经过以下严格的层间交互流程:
- 事务层处理: 设备核心发起一个内存读请求。事务层将其封装为一个 Memory Read TLP,包含请求头(地址、长度、Tag 等),并分配流量类别(TC)。
- 数据链路层处理: 事务层将 TLP 下发给数据链路层。数据链路层为其分配序列号(Seq#),计算并附加 LCRC,然后将整个包(序列号 + TLP + LCRC)封装成数据链路层可识别的格式。
- 物理层处理: 数据链路层将封装好的数据下发给物理层。物理层的逻辑子层对数据进行编码(如 8b/10b),并插入必要的有序集(如 SKP 用于时钟补偿)。然后,电气子层将并行数据串行化,通过差分对发送出去。
- 接收端反向处理: 接收端物理层进行解串、解码,数据链路层校验 LCRC 并发送 ACK/NAK,事务层解析 TLP 头并将数据交付给设备核心。
重要提示: 层间交互是严格顺序的,不允许跨层直接通信。例如,事务层不能直接控制物理层的链路训练状态。所有跨层操作都必须通过标准接口(如 Transaction Layer to Data Link Layer Interface, Data Link Layer to Physical Layer Interface)进行。这种严格的层级隔离是 PCIe 协议稳定性和兼容性的基石。
2.5 分层架构总结
| 层次 | 主要数据单元 | 核心协议/机制 | 关注点 |
|---|---|---|---|
| 事务层 | TLP | 事务排序、流量控制(Credit)、地址空间 | 数据的内容与语义 |
| 数据链路层 | DLLP | ACK/NAK、LCRC、序列号、重传 | 传输的可靠性与顺序 |
| 物理层 | 有序集 / 比特流 | 编码(8b/10b, 128b/130b)、LTSSM、SerDes | 信号的电气与物理特性 |
理解 PCIe 的分层架构是掌握后续 LTSSM 状态机和链路训练流程的基础。每一层都为上层提供了清晰的抽象,使得复杂的链路训练过程可以在物理层内部有序进行,而上层则无需关心底层信号的细节。