在AXI总线协议中,缓存被定义为任何存储结构,包括缓存、缓冲区或其他中间存储元素。系统可以在不同节点设置缓存,形成多级缓存架构。典型拓扑结构包含三种关键组件:
缓存一致性通过三种机制实现:
关键设计原则:在AXI协议中,缓存行(Cache Line)是最小管理单元,定义为连续字节地址的内存块,首地址必须与缓存行大小对齐。标准缓存行大小通常为64字节,这是与AMBA CHI兼容的强制要求。
AXI协议定义了三种地址域类型,每种域有不同的缓存行为要求:
| 域类型 | 可见性要求 | 一致性机制 | 典型应用场景 |
|---|---|---|---|
| 系统域 | 对所有管理者可见 | 强制非缓存 | 设备类型内存访问 |
| 非共享域 | 仅对单一管理者可见 | 软件维护(CMO操作) | 私有数据缓存 |
| 共享域 | 对所有标记为共享的管理者可见 | 硬件嗅探+自动维护 | 多核共享内存区域 |
域支持通过Shareable_Transactions属性控制:
Shareable_Transactions=True时,接口包含AxDOMAIN信号:
重要约束条件:
I/O一致性管理器通过以下流程与完全一致性域交互:
读请求处理:
写请求处理:
mermaid复制graph TD
A[I/O Coherent Manager] -->|AXI| B(Coherent Interconnect)
B -->|CHI| C[Fully Coherent Agent]
B -->|CHI| D[Fully Coherent Agent]
B -->|CHI| E[System Cache]
B -->|AXI| F[Memory]
Shareable_Cache_Support=False:I/O一致性接口必须禁用共享缓存支持BROADCASTSHAREABLE信号:复位时可全局关闭共享事务
支持共享缓存行的组件需维护四种状态:
状态转换规则:
| 操作码 | 功能描述 | 使用约束 |
|---|---|---|
| ReadClean | 读取预期分配在上游缓存的共享Clean数据 | Shareable_Cache_Support=True |
| ReadShared | 读取可能为Dirty的共享数据 | 返回OKAYDIRTY响应 |
| WriteNoSnoopFull | 非共享全行写入 | WriteNoSnoopFull_Transaction=True |
| WriteUniqueFull | 共享全行写入(I/O一致性场景) | Shareable_Transactions=True |
| WriteBackFull | 共享Dirty行逐出 | 允许系统缓存分配为Shareable Dirty |
| WriteEvictFull | 共享Clean行逐出 | 禁止更新内存 |
预取(Prefetch)事务特点:
PREFETCHED响应(0b100)标识命中预取数据实现建议:
缓存驻留(Cache Stashing)操作码:
| 操作码 | 数据携带 | 目标指定 | 共享性 |
|---|---|---|---|
| WriteUniquePtlStash | 部分行 | 可选(NID+LPID) | 仅共享域 |
| WriteUniqueFullStash | 全行 | 可选(NID+LPID) | 仅共享域 |
| StashOnceShared | 无 | 可选(NID+LPID) | 共享/非共享域 |
| StashOnceUnique | 无 | 可选(NID+LPID) | 共享/非共享域 |
信号配置:
STASHNID_Present控制节点ID信号STASHLPID_Present控制逻辑处理器ID信号共享域配置:
预取策略:
c复制// 典型预取启发式算法
if (access_pattern == STRIDE) {
prefetch(base + stride * PREFETCH_DISTANCE);
} else if (access_pattern == POINTER_CHASING) {
prefetch(current->next);
}
缓存驻留应用:
一致性丢失:
性能下降:
死锁风险:
缓存划分:
数据同步:
assembly复制; 生产者核
STR x0, [x1] ; 写入共享数据
DC CIVAC, x1 ; 执行缓存清理
; 消费者核
LDAR x2, [x1] ; 获取共享数据
DMA优化:
GPU协作: