【芯片设计】AXI协议中那些“先不管”信号——AxCACHE

87 阅读11分钟

AXI协议中的AxCACHE信号是一个4位宽的信号,用于指示缓存行为和内存的属性,从而帮助控制缓存的行为和优化内存访问。

CACHE信号的位定义

CACHE信号由4位组成,分别是:

  1. C0 (Bufferable):指示传输是否可以被缓冲(bufferable)。
  2. C1 (Modifiable):指示传输是否可以被修改(modifiable)。
  3. C2 (Read-Allocate):指示是否可以为读取分配缓存行。
  4. C3 (Write-Allocate):指示是否可以为写入分配缓存行。
含义
C0Bufferable
C1Modifiable
C2Read-Allocate
C3Write-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

使用场景总结

  1. 直接访问外设:0000完全非缓存模式,确保数据直接写入设备。
  2. 频繁访问的数据:1111完全缓存模式,通过缓存提高访问速度。
  3. 初始化和配置数据:0011不可缓冲但可读写分配模式,适合读取频繁但写入不多的数据。
  4. 只读缓存数据:0110可修改并可读分配模式,适合读取频繁且不需要写入的数据。
  5. 缓冲写入操作:1001可缓冲但仅写分配模式,适合需要缓冲的写入操作。
  6. 短期数据缓存: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中有不同的编码。

image.png

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

写回读写分配内存类型所需行为与写回无分配内存相同。但在此情况下,分配提示是出于性能原因:

  • 建议分配读事务。
  • 建议分配写事务。

内存属性更改问题

特定内存区域的属性可以从一种类型更改为另一种不兼容的类型。例如,属性可以从写直达可缓存更改为普通非缓存。这种更改需要一个适当的过程来执行更改。通常,执行以下过程:

  1. 所有管理器停止访问该区域。
  2. 一个管理器执行所需的任何缓存维护操作。
  3. 所有管理器重新启动访问内存区域,使用新的属性。

遗留问题

由于AXI3和AXI4总线协议中关于AxCACHE的标志有变化,因此在文档中补充说明:Arm认为大多数实现的AXI3互连支持所需的AXI4行为。此规范强烈建议任何新的AXI3设计实现AXI4的要求。对于AxCACHE位名称和内存类型名称,AXI4需要使用新术语,AXI3组件可以使用AXI3或AXI4的名称。