AMBA AXI 协议中的 AxCACHE 信号定义了事务在系统中的内存属性,直接影响到缓存行为、一致性、排序以及对内存的访问方式。
AxCACHE 中的 x 代表通道,即 ARCACHE (读通道)和 AWCACHE (写通道),其宽度为 4 位。这 4 个位分别控制不同的属性。
核心概念与作用
AxCACHE 信号的主要作用是告诉互联(Interconnect) 和最终的目标从机(如内存控制器或外设) 如何处理这个事务。它回答了以下几个关键问题:
这个事务是否可以被缓存? 如何保证该事务与系统中其他主设备(如其他CPU核心、DMA)的缓存数据一致? 这个事务对于系统性能优化有何提示?(如预取) 这个写事务是立即生效,还是可以稍后生效?
AxCACHE 的值决定了事务的内存类型,通常对应于 ARM 体系结构中的 Memory Types(如 Normal 或 Device)及其子属性。
信号位详细定义
axi各个版本或者通道的定义顺序稍有区别,请注意甄别。
Bit[3] Other Allocate 其他分配提示 1表示建议其他观察者(如其他CPU的缓存)可以为此事务分配缓存行。这是一个提示,非强制。 0表示不建议其他观察者为此事务分配缓存行。
Bit[2] Inner Allocate 内部分配提示 1表示建议当前域(如本CPU集群)的缓存可以为此事务分配缓存行。这是一个提示,非强制。 0表示不建议当前域缓存为此事务分配缓存行。
Bit[1] Modifiable 可修改 1表示表示事务的某些特性(如大小、突发长度)在传输过程中可以被互联组件修改以实现更高效的传输。通常与可缓存内存关联。 0表示事务必须严格按照主设备发出的样子执行,不能被修改。通常与不可缓存的设备内存关联。
Bit[0] Bufferable 可缓冲 1表示对于写事务:允许中间节点(如互联、缓冲器)在向最终目标确认之前,就提前向主设备回复写完成(BVALID)。这提升了写性能,但牺牲了立即可见性。 对于读事务:通常忽略。 0表示对于写事务:主设备只有在写数据真正到达最终目标并生效后,才能收到写完成响应。这保证了写的严格顺序和即时可见性,但性能较低。
常用组合与内存类型映射
在实践中,AxCACHE 的取值组合通常映射到特定的内存类型。以下是最重要和最常见的组合:
0x0 0000 Device-nGnRnE 强排序设备内存。 - 不可缓冲:写操作必须直达设备,主设备需等待设备响应。 - 不可修改:事务属性严格保持。 - 不可分配:不预取。 用于关键控制寄存器,任何读写都必须按程序顺序且立即生效。
0x1 0001 Device-nGnRE 设备内存(弱一点)。 与 0x0 唯一区别是 可缓冲。允许对设备写操作进行缓冲,提升对非关键设备寄存器的写效率。
0x2 0010 Normal Non-cacheable 普通内存,不可缓存。 - 不可修改(意味着突发等特性固定)。 - 不可缓冲(或根据系统定义,有时也视为可缓冲)。 这是 WC(Write-Combining)内存 或 强一致性非缓存内存 的常见设置。用于共享内存区域,软件不希望它被缓存,但允许某些写优化。
0x3 0011 Normal Non-cacheable, Bufferable 普通内存,不可缓存但可缓冲。 一个常见的“安全”设置,用于大多数外设的帧缓冲区或共享数据结构。系统可以合并对它的写操作以提升性能,但数据不会被CPU缓存。
0xB 1011 Write-Through, No-Allocate 写通式缓存,不预取。 - 可修改/可缓存:数据可以被缓存。 - 可缓冲:写操作可以先确认。 - 不分配:读未命中时,不将其拉入缓存。 用于频繁读取但很少写入的只读数据,或共享内存(不希望污染CPU缓存)。
0xF 1111 Write-Back, Read/Write-Allocate 写回式缓存,读写均预取。 - 可修改/可缓存:数据可以被缓存。 - 可缓冲:写操作可以先确认。 - 内外部分配:建议缓存积极预取。 这是对普通、私有、可缓存内存(如CPU的代码、堆栈、堆)的典型配置。性能最优,但需要硬件维护缓存一致性。
关键概念深度解析
1. Modifiable vs Bufferable (可修改 vs 可缓冲)
可修改:关注的是事务在传输路径上的形态是否可以改变。例如,一个4次突发的写事务,如果AxCACHE[1]=1,互联可能会将其拆分成两个2次突发,或者与其他事务合并,以更好地利用总线带宽或匹配从机特性。
可缓冲:关注的是写事务完成确认的时机。AxCACHE[0]=1意味着在从机实际处理写数据之前,一个中间的缓冲区就可以向主机回复“写完成”,主机可以继续执行后续指令,从而隐藏写延迟。
2. Allocate Hints (分配提示位 [3:2])
这两位的设置是对缓存控制器的建议,而非命令。缓存控制器可以忽略它们。 Inner 指本一致性域内(如一个CPU芯片内的所有核心),Other 指其他一致性域。 设置为 1 意味着“如果读未命中,可以考虑把这个地址的数据预取到缓存中”。这对于顺序访问的内存(如数组遍历)非常有益。
3.与缓存策略的关系
AxCACHE 定义了内存属性,而具体的缓存策略(Write-Through, Write-Back)是由系统硬件(如CPU的MMU页表属性、内存控制器配置)和 AxCACHE 共同决定的。AxCACHE 提供了总线层面的“允许做什么”的信息。
Write-Through:写操作同时更新缓存和主存。一致性简单,但总线流量大。通常对应 Modifiable=1, Bufferable=1。
Write-Back:写操作只更新缓存,被替换的旧缓存行才写回主存。性能高,但需要复杂的一致性协议(如ACE或CHI)。通常对应 Modifiable=1, Bufferable=1, Allocate hints=1。
系统级影响与设计注意事项
一致性(Coherency): 对于标记为可缓存(Modifiable=1)的 Normal 内存,如果多个主设备(如CPU和DMA)都可能访问它,必须使用支持一致性(如ACE或ACE-Lite)的接口和互联,或者由软件负责管理缓存(清空、无效化)。 对于 Device 类型(Modifiable=0)的内存,系统不保证缓存一致性,访问总是直达设备。
排序(Ordering): Device 类型(Modifiable=0)的内存访问通常是强排序的,即事务在总线上的完成顺序必须与发出顺序一致。 Normal 类型(Modifiable=1)的内存访问,为了性能,允许一定程度的重排序,除非使用屏障(Barrier)指令。
性能优化: 正确设置 AxCACHE 对系统性能至关重要。将频繁访问的代码/数据区域配置为 Write-Back, Allocate(如 0xF)可以最大化缓存利用率和性能。 对于只写一次、然后大量读取的DMA缓冲区,可以配置为 Write-Through, No-Allocate(如 0xB),避免无用的缓存分配。
调试: 错误的 AxCACHE 设置是许多隐蔽错误的根源。例如: 对设备寄存器使用可缓存属性 → 导致读写被缓存,无法与设备正确交互。 对共享内存使用写回缓存但无一致性协议 → 导致各CPU核心看到的数据不一致。
总结
AxCACHE 信号是AXI主设备向系统声明其访问意图的关键控制字。它不是一个孤立的设置,而是连接软件内存映射、硬件缓存架构和总线传输优化的桥梁。
简单记忆:
[1] Modifiable=0:“别动我的请求!” → 设备内存,严格操作。
[1] Modifiable=1:“请优化我的请求。” → 普通内存,可缓存。
[0] Bufferable=0:“写完了必须告诉我。” → 写严格。
[0] Bufferable=1:“写完了可以先应我一声。” → 写优化。
[3:2] Allocate:“这个数据以后可能用,可以提前备着。” → 预取提示。
在设计驱动或配置内存区域时,必须根据目标内存的物理特性(是DDR还是寄存器)和访问模式(共享与否、读写比例),谨慎选择 AxCACHE 的值。
221