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 位寻址)
0 Comments
Log in to join the conversation.No comments yet. Be the first to share your thoughts.