Ripan Deuri

1. 引言

PCI Express(PCIe)采用分层架构设计,以分离数据包生成、可靠性保障和物理传输等职责。在这些层中,事务层(Transaction Layer)发挥着核心作用,它将软件级操作转换为结构化的数据包,通过 PCIe 结构进行传输。

本文将结构化地讲解事务层,重点介绍其职责、事务类型以及事务层数据包(TLP)的详细结构。

2. PCIe 各层

  • 事务层(TL):生成事务层数据包(TLP)
  • 数据链路层(DLL):确保 TLP 在链路上的可靠传输
  • 物理层(PHY):处理电信号和比特级传输

3. 事务层的作用

以下职责由事务层负责:

  • 通过内存地址或基于 ID 的路由确定目标
  • 将读/写/配置请求转换为事务层数据包(TLP)

4. PCIe 事务类型

PCIe 定义了多种事务类型:

内存事务

  • 内存读
  • 内存写

配置事务

  • 用于设备枚举
  • 访问配置空间

消息事务

  • 中断(MSI/MSI-X)
  • 电源管理
  • 错误信令

完成事务

  • 对请求的响应(例如,返回读请求的数据)

5. 事务层数据包(TLP)结构

TLP 是 PCIe 通信的基本单元。

+---------------------------------+
| TLP Header (3DW / 4DW)          |
+---------------------------------+
| Data Payload (optional)         |
+---------------------------------+
| Digest (optional)               |
+---------------------------------+

Enter fullscreen mode Exit fullscreen mode

5.1 TLP 头部

TLP 头部定义了数据包的类型、意图和路由信息。

DW0 — 格式与控制

31           24 23     20 19     16 15                0
+--------------+---------+---------+------------------+
| Fmt + Type   |  TC     | Attr    | Length           |
+--------------+---------+---------+------------------+

Enter fullscreen mode Exit fullscreen mode

DW0 关键字段:

  • Fmt(格式):3 位。指示头部大小(3DW 或 4DW)以及是否存在数据负载。

    • 000 = 3-DW 头部,无数据(如 32 位内存读)
    • 001 = 4-DW 头部,无数据(如 64 位内存读)
    • 010 = 3-DW 头部,含数据(如 32 位内存写)
    • 011 = 4-DW 头部,含数据(如 64 位内存写)
  • Type:5 位。与 Fmt 结合定义 TLP 类型:

    • 00000 = 内存读请求(MRd)
    • 00001 = 内存读请求锁定(MRdLk)
    • 00000 且 Fmt 为 010 = 内存写(MWr)
    • 00100 = 配置读 Type 0(CfgRd0)
    • 00101 = 配置写 Type 0(CfgWr0)
    • 01010 = 完成(Cpl)
    • 01010 且 Fmt 为 010 = 带数据的完成(CplD)
    • 10000 = 消息请求(Msg)
  • TC(流量类别):3 位。表示优先级(0–7)。大多数流量使用 TC0。

  • Length:10 位。指定数据负载中的 DWORD 数量(1–1024)。值为 0 表示 1024 个 DWORD。

DW1 — 请求标识

31              16 15        8 7         4 3         0
+------------------+----------+-----------+-----------+
| Requester ID     | Tag      | Last BE   | First BE  |
+------------------+----------+-----------+-----------+

Enter fullscreen mode Exit fullscreen mode

DW1 关键字段:

  • Requester ID:16 位。使用总线/设备/功能(BDF)标识源设备。
Bus Number (8 bits) | Device Number (5 bits) | Function Number (3 bits)

Enter fullscreen mode Exit fullscreen mode

  • Tag:8 位。由请求者分配的唯一标识符。
    用于将完成 TLP 与对应请求匹配。

  • Last Byte Enable(Last BE):4 位。指示负载最后一个 DWORD 中的有效字节。
    适用于非对齐或部分传输。

  • First Byte Enable(First BE):4 位。指示负载第一个 DWORD 中的有效字节。

示例(部分写入):

从 DWORD 内的偏移处写入 6 字节:

DWORD N:
+----+----+----+----+
| B3 | B2 | B1 | B0 |
+----+----+----+----+
  ✔    ✔    ✔    ✘     → First BE = 1110

DWORD N+1:
+----+----+----+----+
| B3 | B2 | B1 | B0 |
+----+----+----+----+
  ✘    ✔    ✔    ✔     → Last BE = 0111

Enter fullscreen mode Exit fullscreen mode

DW2/DW3 — 地址

  • 包含内存事务的目标地址
  • DW2:地址的低 32 位
  • DW3:高 32 位(仅用于 64 位寻址)