AMBA CHI Architecture Spec 解读 — B2 Transactions
AMBA CHI Architecture Spec 解读 — B2 Transactions
B2 Transactions 是 CHI Spec 中最长的章节(139页),定义了 CHI 协议的核心通信单元——事务(Transaction)。理解了 B2,就理解了 CHI 的”词汇表”和”语法”。
一、章节结构总览
B2 分为 10 个子节:
| 节 | 标题 | 核心内容 |
|---|---|---|
| B2.1 | Channels overview | 4条物理通道(REQ/WDAT/SRSP/CRSP/RDAT/SNP) |
| B22 | Channel fields | REQ/RSP/SNP/DAT 各通道的字段定义 |
| B2.3 | Transaction structure | 8大类事务的完整消息流图 ⭐ |
| B2.4 | Transaction identifier fields | 16种标识符字段详解 |
| B2.5 | Transaction identifier field flows | 各种事务中标识符如何在节点间传递 |
| B2.6 | Multi-request | 多请求合并机制(DMT/DCT/DWT) |
| B2.7 | Ordering | 事务排序模型 ⭐ |
| B2.8 | Address, Control, and Data | 地址空间、内存属性 |
| B2.9 | Data transfer | 数据传输、字节使能、Limited Data Elision |
| B2.10 | Request Retry | 重试机制和 Credit 返回 |
二、CHI 的通道模型
2.1 四条物理通道
CHI 不像 AXI 那样用”地址/读/写”通道,而是用面向消息的通道:
| 通道 | 方向(RN视角) | 用途 |
|---|---|---|
| REQ | 发送 | 请求通道(读、写、原子、DVM 等) |
| WDAT | 发送 | 写数据通道(写数据、原子数据、snoop 转发数据) |
| SRSP | 发送 | Snoop 响应 + 完成确认 |
| CRSP | 接收 | 完成响应(来自 Completer) |
| RDAT | 接收 | 读数据通道(读数据、原子数据) |
| SNP | 接收 | Snoop 请求通道 |
关键差异:CHI 用 单条 REQ 通道 承载所有类型请求(AXI 需要分开读地址/写地址通道),通过 Opcode 区分。
2.2 通道字段 — REQ 通道示例
REQ 通道上的关键字段(共 ~65 个):
| 分类 | 字段 | 位宽 | 说明 |
|---|---|---|---|
| 标识 | TgtID, SrcID, TxnID | 实现定义 | 路由和事务标识 |
| 地址 | Addr | 48-52 bit | 物理地址 |
| 属性 | MemAttr | 3 bit | 内存类型(Device/Normal/Cacheable/Allocate) |
| 操作 | Opcode | 7 bit | 事务类型编码(共68种) |
| 控制 | Order, Excl, AllowRetry, SnoopMe | 1-2 bit | 排序/独占/重试/自侦听 |
| 高级 | MPAM, MECID, TagOp, PBHA, VMIDExt | 实现定义 | RME/MTE/MPAM 等扩展 |
三、事务结构(B2.3 — 核心)
3.1 基本原则
所有事务可以抽象为:
1 | 发起方 → 中间节点(可选)→ 目标方 → 响应 → 返回数据 |
3.2 Allocating Read 事务流
以 ReadClean 为例,读事务有以下可能路径:
路径 1:Home 直接返回数据(最快)
1 | Requester → REQ: ReadClean → Home → RDAT: CompData → Requester |
路径 2:Home 从内存读取
1 | Requester → REQ: ReadClean → Home |
路径 3:带 Forwarding Snoop(缓存到缓存转发)
1 | Requester → REQ: ReadClean → Home |
路径3是 CHI 的性能关键——Snoopee直接把数据发给Requester(DCT),Home只发完成信号。这比 ACE 中所有数据必须经过 Home 快得多。
3.3 读事务的 6 种完成选项
| 编号 | 模式 | 描述 |
|---|---|---|
| 1 | CompData from Home | Home 直接返回数据+完成 |
| 2 | RespSepData / DataSepResp | 响应和数据分开返回 |
| 3 | CompData from Subordinate | 子节点直接返回数据 |
| 4 | Resp from Home, Data from Sub | Home 发响应,子节点发数据 |
| 5 | Forwarding snoop | Snoopee 转发数据(DCT/DMT) |
| 6 | Comp only (MakeReadUnique) | 仅完成,无数据返回 |
3.4 写事务(B2.3.2)
CHI 的写事务分为 6 个子类型:
| 写类型 | 用途 | 数据源 |
|---|---|---|
| Immediate Write (WriteNoSnp/WriteUnique) | 立即写 | 请求时带数据 |
| Write Zero | 清零优化 | 无数据(Home自己填零) |
| CopyBack Write | 缓存回写 | 请求后发数据 |
| Combined Immediate Write + CMO | 写+缓存维护合并 | 请求时带数据 |
| Combined Immediate Write + Persist CMO | 写+持久化合并 | 请求时带数据 |
| Combined CopyBack Write + CMO | 回写+缓存维护合并 | 请求后发数据 |
3.5 原子事务(B2.3.3)
支持 64 种原子操作,4 大类:
| 类型 | 语义 | 数据返回 |
|---|---|---|
| AtomicStore | 读-改-写(不返回旧值) | 无 |
| AtomicLoad | 读-改-写(返回旧值) | 有 |
| AtomicSwap | 原子交换 | 有 |
| AtomicCompare | 条件交换(比较-交换) | 有 |
原子事务可以在 Home 或 Subordinate 端执行。
3.6 Stash 事务(B2.3.4)
缓存注入——一个节点把数据直接推送到另一个节点的缓存:
1 | 加速器 → REQ: StashOnceShared + StashNID → Home |
3.7 Dataless 事务(B2.3.5)
| 操作 | 效果 |
|---|---|
| CleanInvalid | 缓存行置为 Invalid,无需写回 |
| CleanShared | 脏缓存写回并变为 Shared |
| CleanUnique | 共享缓存变为 Unique(不写回) |
| MakeInvalid | 使所有副本失效 |
| MakeUnique | 获取唯一所有权 |
| Evict | 逐出缓存行 |
3.8 DVM 事务(B2.3.7)
分布式虚拟内存事务用于 TLB/BP/Cache 维护,支持按 VMID/ASID/IPA/VA 精确无效化。
3.9 Home Initiated 事务(B2.3.9)
Home 主动向 Subordinate 发起的事务:Read/Write/Zero/Dataless/Atomic/Snoop/DVM,用于响应上行请求。
四、标识符系统(B2.4)
CHI 定义了丰富的标识符字段:
| 标识符 | 用途 |
|---|---|
| TgtID / SrcID | 节点级路由 |
| TxnID | 每个节点独立的事务 ID |
| DBID | Home 分配的数据缓冲 ID(DCT 的关键) |
| ReturnTxnID | 数据/响应直接返回发起者 |
| FwdTxnID | Snoop 转发数据的 ID |
| HomeNID / ReturnNID / FwdNID | 各阶段节点 ID |
| LPID / StashLPID | 逻辑处理器标识 |
| PGroupID | 持久化组 ID |
| TagGroupID | MTE 标签组 ID |
| CacheLineID | MultiReq 中区分缓存行 |
DMT 流中的 ID 传递示例
1 | Requester(SrcID=A,TxnID=1) Home Snoopee(SrcID=S) |
五、Multi-Request 机制(B2.6)
CHI H 版新特性,允许一个事务跨越多个缓存行:
| 模式 | 描述 | 适用场景 |
|---|---|---|
| DMT | 数据从 Subordinate 直接到 Requester | 大块读 |
| DCT | 数据从 Snoopee 直接到 Requester | 缓存转发 |
| DWT | 写数据直接到 Subordinate | 大块写 |
关键字段:MultiReq、NumReq(1~8)、CacheLineID
六、排序模型(B2.7)
| Order 字段 | 含义 |
|---|---|
| 00 | 无需排序(Non-ordered) |
| 01 | 请求排序(Request ordering) |
| 10 | 预留 |
| 11 | 端到端排序(End-to-end ordering) |
Completion Acknowledgment(CompAck):Requester 收到 Comp 后额外发送 CompAck,确保资源释放。
Streaming Ordered Write(CHI H 优化):允许写请求在收到 CompAck 之前发出下一个请求,最大化写带宽。
七、地址与控制(B2.8)
7.1 物理地址空间(PAS)
支持 RME 的 4 种 PAS:
| PAS | 含义 |
|---|---|
| 00 | Non-secure |
| 01 | Secure |
| 10 | Realm(RME 新增) |
| 11 | Root(EL3 专属) |
7.2 CopyAtHome (CAH)
CHI H 新特性——允许 Home 持有脏数据副本,减少内存访问:
1 | Requester → WriteBack(CAH=1) → Home(保留副本,不写回内存) |
八、数据传输(B2.9)
8.1 数据包化
| 数据宽度 | 一个缓存行所需 flit 数 |
|---|---|
| 128-bit | 4 |
| 256-bit | 2 |
| 512-bit | 1 |
8.2 Limited Data Elision(LDE)
CHI H 的带宽优化:写零或全相同数据只需发一个 flit + 重复次数:
1 | 传统:WriteBack 64B = 4个flit |
九、重试机制(B2.10)
当 Home 资源不足时(如 DBID 用完):
1 | Requester → REQ → Home |
十、总结
B2 是 CHI 协议的 “词汇表”,定义了 CHI 的一切通信单元。B2+B4+B5 的关系:
1 | B2(事务结构:有什么消息)→ B4(协议规则:消息怎么交互) |
下一站建议:理解了 B2 后,直接进入 B4 Coherence Protocol(CHI 最核心也最难的章节),那里定义了缓存状态机和 snoop 协议规则。