AXI协议中的AxCACHE信号是一个4位宽的信号,用于指示缓存行为和内存的属性,从而帮助控制缓存的行为和优化内存访问。
CACHE信号的位定义
CACHE信号由4位组成,分别是:
- C0 (Bufferable):指示传输是否可以被缓冲(bufferable)。
- C1 (Modifiable):指示传输是否可以被修改(modifiable)。
- C2 (Read-Allocate):指示是否可以为读取分配缓存行。
- C3 (Write-Allocate):指示是否可以为写入分配缓存行。
位 | 含义 |
---|---|
C0 | Bufferable |
C1 | Modifiable |
C2 | Read-Allocate |
C3 | Write-Allocate |
各位的详细解释
C0 (Bufferable)
- 0:传输不可以被缓冲。数据必须直接写入目标地址。
- 1:传输可以被缓冲。数据可以先写入缓存,然后再写入目标地址。
C1 (Modifiable)
- 0:传输不可被修改。传输的数据必须直接传递,不进行修改。
- 1:传输可以被修改。数据可以在传输过程中被合并或重排序。
C2 (Read-Allocate)
- 0:不为读取操作分配缓存行。
- 1:为读取操作分配缓存行。如果读取的地址在缓存中不存在,则分配一个新的缓存行。
C3 (Write-Allocate)
- 0:不为写入操作分配缓存行。
- 1:为写入操作分配缓存行。如果写入的地址在缓存中不存在,则分配一个新的缓存行。
CACHE信号的常见组合及其含义
例1:全缓存行为(0b1111)
CACHE = 0b1111
Bufferable = 1
Modifiable = 1
Read-Allocate = 1
Write-Allocate = 1
- 传输可以被缓冲,数据可以被修改。
- 读取和写入操作都可以分配缓存行。
例2:非缓存行为(0b0000)
CACHE = 0b0000
Bufferable = 0
Modifiable = 0
Read-Allocate = 0
Write-Allocate = 0
- 传输不可以被缓冲,数据不可以被修改。
- 读取和写入操作都不分配缓存行。
例3:写入可缓存(0b0011)
CACHE = 0b0011
Bufferable = 0
Modifiable = 0
Read-Allocate = 1
Write-Allocate = 1
- 传输不可以被缓冲,数据不可以被修改。
- 读取和写入操作都可以分配缓存行。
使用场景
1. 0000 - 完全非缓存模式
- 含义:不可缓冲,不可修改,不读分配,不写分配。
- 使用场景:
- 直接访问外设:例如,直接访问内存映射的I/O设备时,数据必须直接写入设备,而不会被缓存。
- 访问不会重复使用的数据:例如,一次性配置寄存器或标志位。
CACHE = 0b0000
Bufferable = 0
Modifiable = 0
Read-Allocate = 0
Write-Allocate = 0
2. 1111 - 完全缓存模式
- 含义:可缓冲,可修改,读分配,写分配。
- 使用场景:
- 常规内存访问:适用于大多数普通内存访问,通过缓存机制提高性能。
- 频繁访问的数据:例如,常驻内存中的数据结构或缓存行。
CACHE = 0b1111
Bufferable = 1
Modifiable = 1
Read-Allocate = 1
Write-Allocate = 1
3. 0011 - 不可缓冲但可读写分配
- 含义:不可缓冲,不可修改,读分配,写分配。
- 使用场景:
- 只读数据的初始化:例如,从外部存储读取数据到内存。
- 读多写少的数据:例如,某些配置数据需要频繁读取但不经常修改。
CACHE = 0b0011
Bufferable = 0
Modifiable = 0
Read-Allocate = 1
Write-Allocate = 1
4. 0110 - 可修改并可读分配
- 含义:不可缓冲,可修改,读分配,不写分配。
- 使用场景:
- 只读缓存数据:适用于读取频繁但不需要写入缓存的数据,例如某些常量表。
- 不可变数据的缓存:例如,程序代码或不可变的数据结构。
CACHE = 0b0110
Bufferable = 0
Modifiable = 1
Read-Allocate = 1
Write-Allocate = 0
5. 1001 - 可缓冲但仅写分配
- 含义:可缓冲,不可修改,不读分配,写分配。
- 使用场景:
- 缓冲写入操作:适用于写入操作需要缓冲但读取不需要的场景,例如日志数据或临时数据。
- 数据流写入:例如,从传感器读取的数据直接写入内存。
CACHE = 0b1001
Bufferable = 1
Modifiable = 0
Read-Allocate = 0
Write-Allocate = 1
6. 1100 - 可缓冲并可修改但不分配
- 含义:可缓冲,可修改,不读分配,不写分配。
- 使用场景:
- 短期数据缓存:适用于需要暂时存储并可能被修改的数据,例如数据处理中间结果。
- 数据交换缓冲:例如,多处理器之间的共享数据缓冲。
CACHE = 0b1100
Bufferable = 1
Modifiable = 1
Read-Allocate = 0
Write-Allocate = 0
使用场景总结
- 直接访问外设:0000完全非缓存模式,确保数据直接写入设备。
- 频繁访问的数据:1111完全缓存模式,通过缓存提高访问速度。
- 初始化和配置数据:0011不可缓冲但可读写分配模式,适合读取频繁但写入不多的数据。
- 只读缓存数据:0110可修改并可读分配模式,适合读取频繁且不需要写入的数据。
- 缓冲写入操作:1001可缓冲但仅写分配模式,适合需要缓冲的写入操作。
- 短期数据缓存:1100可缓冲并可修改但不分配模式,适合需要暂时存储并可能被修改的数据。
具体示例
示例1:内存映射I/O设备
CACHE = 0b0000
Bufferable = 0
Modifiable = 0
Read-Allocate = 0
Write-Allocate = 0
适用于直接访问设备寄存器,例如写入配置寄存器。
示例2:常驻内存中的数据结构
CACHE = 0b1111
Bufferable = 1
Modifiable = 1
Read-Allocate = 1
Write-Allocate = 1
适用于频繁访问的数据结构,例如操作系统的内存管理结构。
示例3:程序代码
CACHE = 0b0110
Bufferable = 0
Modifiable = 1
Read-Allocate = 1
Write-Allocate = 0
适用于只读数据,例如程序代码或不可变的数据表。
协议补充
以下是AMBA5 AXI协议的规范关于事务属性和内存类型部分的一些介绍。
AXI4协议引入了新名称,用于由AxCACHE编码识别的内存类型。下表显示了AXI4 AxCACHE编码及其关联的内存类型,一些内存类型在AXI3中有不同的编码。
Device Non-bufferable
设备非缓冲型内存所需行为:
- 写响应必须从最终目的地获取。
- 读数据必须从最终目的地获取。
- 事务是不可修改的,见 A4-64 页上的不可修改事务。
- 读操作不得预取。写操作不得合并。
Device Bufferable
设备缓冲型内存所需行为:
- 写响应可以从中间点获取。
- 写事务必须及时在最终目的地可见,如 A4-74 页上的事务缓冲定义。
- 读数据必须从最终目的地获取。
- 事务是不可修改的,见 A4-64 页上的不可修改事务。
- 读操作不得预取。写操作不得合并。
注意:两种设备内存类型都是不可修改的。在此协议规范中,设备内存和不可修改内存这两个术语是可以互换的。对于读事务,设备非缓冲型和设备缓冲型内存类型所需的行为没有区别。
Normal Non-cacheable Non-bufferable
普通非缓存非缓冲型内存所需行为:
- 写响应必须从最终目的地获取。
- 读数据必须从最终目的地获取。
- 事务是可修改的,见 A4-65 页上的可修改事务。
- 写操作可以合并。
Normal Non-cacheable Bufferable
普通非缓存缓冲型内存所需行为:
-
写响应可以从中间点获取。
-
写事务必须及时在最终目的地可见,如 A4-74 页上的事务缓冲定义。没有机制确定写事务何时在其最终目的地可见。
-
读数据必须从以下来源获取:
- 最终目的地
- 向最终目的地进展的写事务
如果读数据是从写事务中获取的:
- 它必须从写事务的最新版本中获取。
- 数据不得被缓存以服务于后续的读操作。
-
事务是可修改的,见 A4-65 页上的可修改事务。
-
写操作可以合并。
注意:对于普通非缓存缓冲型读事务,数据可以从仍在向最终目的地进展的写事务中获取。此数据与同时到达最终目的地的读写事务无法区分。以这种方式返回的读数据并不表示写事务在最终目的地可见。
Write-Through No-Allocate
写直达无分配内存类型所需行为:
- 写响应可以从中间点获取。
- 写事务必须及时在最终目的地可见,如 A4-74 页上的事务缓冲定义。没有机制确定写事务何时在其最终目的地可见。
- 读数据可以从中间缓存副本中获取。
- 事务是可修改的,见 A4-65 页上的可修改事务。
- 读操作可以预取。
- 写操作可以合并。
- 读写事务都需要进行缓存查找。
- 无分配属性是一个分配提示,即出于性能原因,建议不分配这些事务。但是,不禁止分配读写事务。
Write-Through Read-Allocate
写直达读分配内存类型所需行为与写直达无分配内存相同。但在此情况下,分配提示是出于性能原因:
- 建议分配读事务。
- 不建议分配写事务。
Write-Through Write-Allocate
写直达写分配内存类型所需行为与写直达无分配内存相同。但在此情况下,分配提示是出于性能原因:
- 不建议分配读事务。
- 建议分配写事务。
Write-Through Read and Write-Allocate
写直达读写分配内存类型所需行为与写直达无分配内存相同。但在此情况下,分配提示是出于性能原因:
- 建议分配读事务。
- 建议分配写事务。
Write-Back No-Allocate
写回无分配内存类型所需行为:
- 写响应可以从中间点获取。
- 写事务不需要在最终目的地可见。
- 读数据可以从中间缓存副本中获取。
- 事务是可修改的,见 A4-65 页上的可修改事务。
- 读操作可以预取。
- 写操作可以合并。
- 读写事务都需要进行缓存查找。
- 无分配属性是一个分配提示,即出于性能原因,建议不分配这些事务。但是,不禁止分配读写事务。
Write-Back Read-Allocate
写回读分配内存类型所需行为与写回无分配内存相同。但在此情况下,分配提示是出于性能原因:
- 建议分配读事务。
- 不建议分配写事务。
Write-Back Write-Allocate
写回写分配内存类型所需行为与写回无分配内存相同。但在此情况下,分配提示是出于性能原因:
- 不建议分配读事务。
- 建议分配写事务。
Write-Back Read and Write-Allocate
写回读写分配内存类型所需行为与写回无分配内存相同。但在此情况下,分配提示是出于性能原因:
- 建议分配读事务。
- 建议分配写事务。
内存属性更改问题
特定内存区域的属性可以从一种类型更改为另一种不兼容的类型。例如,属性可以从写直达可缓存更改为普通非缓存。这种更改需要一个适当的过程来执行更改。通常,执行以下过程:
- 所有管理器停止访问该区域。
- 一个管理器执行所需的任何缓存维护操作。
- 所有管理器重新启动访问内存区域,使用新的属性。
遗留问题
由于AXI3和AXI4总线协议中关于AxCACHE的标志有变化,因此在文档中补充说明:Arm认为大多数实现的AXI3互连支持所需的AXI4行为。此规范强烈建议任何新的AXI3设计实现AXI4的要求。对于AxCACHE位名称和内存类型名称,AXI4需要使用新术语,AXI3组件可以使用AXI3或AXI4的名称。