【ARM AMBA AXI 入门 11 - AXI 总线 AWCACHE 和 ARCACHE 介绍】
ARM AMBA AXI总线协议定义了AXI传输事务属性,用于控制存储从机和外设从机对传输事务的处理。AXI协议中的信号包括ARACHE和AWACHE,分别用于指示传输事务的处理方式。Slave type分为存储从机和外设从机,存储从机需支持所有事务属性信号,而外设从机需完成传输事务,具体支持方式由实现定义。系统级缓存通过缓存控制器提高访问速度,读写事务根据AxCACHE信号决定数据来源。AxCACHE信号由4个比特组成,分别表示缓存状态、传输属性修改、分配方式等。Memory types分为四种访问方式:Device访问、Normal Non-cacheable访问、Write-through访问和Write-back访问,分别对应不同的缓存策略和事务处理方式。
ARM AMBA AXI 总线 文章专栏导读
链接
ARM AMBA AXI 总线 文章专栏导读
ARM AMBA AXI总线文章专栏
文章目录
-
- 1.1 AXI 传输事务属性
-
- 1.1.1 slave type
- 1.1.2 系统级缓存
-
1.2 Memory Attributes
-
1.2.1 Capable of being buffered, with AxCACHE entry 0
-
1.2.2 Capable of modification, with AxCACHE entry 1
-
1.2.3 Engages in cache allocation
-
1.3 Memory types
-
该平台提供丰富多样的学习资源,涵盖多个学科领域,为用户提供全方位的知识服务。平台内容经过严格审核,确保信息的准确性和权威性。用户可以自由浏览和学习感兴趣的内容,获取所需的知识和技能提升。平台内容更新及时,涵盖最新的研究成果和教学方法,为用户提供持续的学习体验。
1.1 AXI 传输事务属性
AXI 协议规范性地规定了信号表示读写传输事务的类型,具体包括 ARCACHE 和 AWCACHE,统称为 AxCACHE。
当 Master 发出一个请求时,可以通过 AWCACHE/ARCACHE 信号向下级系统(组件)通知当前传输事务的处理方式。这些信号用于指定请求的内存属性。
它们可以控制以下行为:
通知系统中其他组件(如NI-700和CI-700)处理该笔交易的处理流程;
告知系统级的缓存和缓冲区处理该笔交易的处理方式。
1.1.1 slave type
AXI 协议中存在两类从机:
- 存储从机(Memory Slave);
- 与外设从机(Peripheral Slave)。
在我们的协议标准中,事务属性的传递旨在为目标设备提供必要的初始化信息,而这些目标设备必须具备所有相关的事务属性信号。
对于外设从机,协议中所包含的属性信号有哪些?其规定中只有一个要求:外设从机必须完成整个传输事务,即使其不支持某些事务属性信号。
外设从机对属性信号的支持以及相应的访问方式(method of access)由具体实现定义(IMPLEMENTATION DEFINED)。通常,设计者会将支持的方式记录在该从机的规格书里。从机也会对所支持的访问方式进行正确响应。
在极端情况下,设备接收到来自外部的访问请求,该请求不被支持,导致系统崩溃。然而,为了避免整个系统出现死锁,必须确保在完成数据传输操作后才允许系统崩溃。
该规定不支持复生机制,且持续正确的操作并非必要。
1.1.2 系统级缓存
AXI 协议缓存相关机制是针对处理器的系统级缓存的一种实现。
即为系统级缓存(System-Level Cache)与处理器内部缓存的区别。系统级缓存显著提升了整个系统访问外部存储的速度。当系统级缓存处于处理器核与外部存储之间时,可以被视为处理器核外部的 L2 缓存,如图所示,系统级缓存处于处理器核与外部存储之间,类似于处理器核的 L2 缓存结构。

AXI 总线接口将处理器核、系统缓存以及外部存储控制器互联。L1 缓存设置在处理器核内部。当处理器访问外部存储中的数据,且 L1 缓存中不存在对应数据时,向外部缓存发起传输事务。在系统缓存中处理该传输事务时,若该事务命中缓存表项,可以直接获取结果,从而省去访问外部存储所带来的缺失成本。
1.2 Memory Attributes
AxCACHE 信号共有 4 比特,每个比特代表不同的含义。

1.2.1 Bufferable,AxCACHE[0]
当AxCACHE[0]设置为高值时,表示该传输事务在传输至目的地的过程中,可以被网络层(interconnect)或者任意的AXI接口缓存,延迟若干个时钟周期。CPU在写传输事务时需要将数据写入主存储,可以先缓存于缓存中,直到被替换时才真正写入主存储。
因此,CPU在完成写入缓存后即认为写操作已完成。写事务原先的目标地是主存储,例如外部 DDR,理论上,目标地 DDR 应该在数据真正写入后,向 CPU 发送写回确认信号,以确认写传输事务的完成。然而,当前的机制是,一旦数据写入缓存,CPU 即时发送写回确认信号,从而结束了本次写回确认过程。
当AxCACHE[0]被设置为低时,该特性不再被允许。哪些情况下缓存被禁止,当CPU通过DMA技术将数据传输至IO设备时,数据首先被写入DMA内存中预先分配的缓冲区。此时,CPU需要确定数据何时彻底进入缓冲区,以便确保数据存入后,再启动DMA传输。
我们进一步探讨这一情况,假设数据已经被缓存于中间组件中,如果相邻的缓存操作将要写入相邻的地址(即位于同一个 cache line 中),那么通过将不同数据进行聚合处理,可以减少写入次数,从而节省总线资源。这一操作与 AxCACHE[1] Modifiable 信号的机制密切相关。
1.2.2 Modifiable, AxCACHE[1]
当 AxCACHE[1] 置高时,表示传输过程中,该写传输事务的传输特性可以改变。
协议列举了一些传输事务改变的情形:
- 一个传输事务可以分解为多个更小的传输事务;
- 同样地,多个传输事务可以被聚合为一个整体,这与上一节所描述的现象一致;
- 在读传输事务中,系统可以预取相邻地址的读数据,以确保目的地址返回的数据量超过主机的需求;
- 对于写传输事务,系统允许访问比需求地址范围更大的区域,并通过WSTRB信号来防止更新无关的数据;
上述几种情况中,几项信号可以发生改变(Modify):
- 传输地址字段 AxADDR;
- 传输位宽字段 AxSIZE;传输长度字段 AxLEN;
- 传输类型字段 AxBURST;
此外,AxID参数、AxQOS参数等信号也是可以调整的,AxID参数的调整常见于interconnect的输出。
AxCACHE信号虽然可以进行修改,但也受到一些特定的限制。对于存储属性相关的信号进行修改时,必须确保不会降低传输事务对AXI组件的可见性,不能改变信号的传播路径,也不能影响事务对缓存的访问需求。此外,修改存储属性信号时需要考虑整个地址范围内的事务影响。
协议明确要求AxLOCK和AxPROT的信号不可更改。此外,在以下两种情况下,事务的信号不可更改:
如果修改后的事务地址超过了原地址的4K范围,这种修改将被视为无效操作。第二种情况与原子操作相关,具体信息可在手册中找到。
当AxCACHE[1]被设置为低值时,表明在传输过程中,该写传输事务的传输特性无法被改变。
在下图所示的场景中,某些信号是不可更改的。然而,ID 和 QoS 等信号仍然可以进行调整。例如,前者在多机通信场景中,通过 interconnect 连接后会发生变化,这与其存储属性无关。

AxCACHE 信号可以改变,但只能从 bufferable 修改为 non-bufferable。
1.2.3 cache-allocate
对于读写事务,AxCACHE中的高2比特位用于判断本次传输事务所访问地址中的数据是否存在缓存中,其中每个比特位分别用于判断是否存在缓存中的数据。
对于读事务 2 比特分别表示:
当前地址的数据可能已被前期访问所分派空间并存储在 cache 中。
当前地址的数据可被缓存至 cache 中,是因为其他主机事务导致空间被分配用于缓存,或者是本机的其他类型事务导致数据被缓存。(对于读事务而言,这相当于上一次的写事务,反之亦然)
若 2 比特值为 2'b00,则表示 CPU 指令该传输事务无需至缓存中查找,必须直接自主机存储系统读取或写入。
当 2 比特的值不同于 2'b00 时,可能已经在 cache 中存储了该地址缓存。因此,该传输事务必须首先检查 cache 中是否存在该地址缓存,若不存在则需访问主存储。
这里可能存在这种情况,尽管CPU按照指令顺序认为该数据已缓存,但由于指令出现乱序或数据未完全就绪等原因,实际存储情况可能与CPU记录的不一致,具体判断需由缓存控制器完成。
我们对读写事务中的AxCACHE[2]和AxCACHE[3]特性进行了详细分析,其中,写事务是关键环节。
当AWCACHE[3]置高时,表示本主机可能已缓存写事务的数据,应首先在缓存中查找对应项。当AWCACHE[3]置低而AWCACHE[2]置高时,该位置的数据可能因他机操作或本机读事务已缓存,仍需在缓存中查找。
在读事务中,字段的含义与写事务相对应,因此可以通过交换读写事务的顺序来实现功能。同时需要关注的是,相应位域的分配标志位交换位置。
1.3 Memory types
总体而言,AxCACHE[3:0]的主要功能在于为不同存储类型(Memory type)设计编码方式。在前文部分,我们仅对各个比特位的含义进行了说明。换句话说,根据传输事务的具体存储类型,可以执行相应的操作。

存储类型可划分为四种类型,我们依次探讨每一种情况。除去上表所述情况,AxCACHE剩余的可能数值均作为备用使用。
在访问 Device 时,AxCACHE[3:1]被设定为3’b000,传输事务在中间节点无法进行修改。具体而言,不能进行预读操作(Prefetch read)和汇聚写操作(Merge write)。这是因为,在访问非存储外设时,读写操作涉及寄存器值,预取数据并非必要。而将不同类型的写事务进行聚合可能导致预期之外的问题,例如相邻寄存器操作的顺序可能无法按照预期进行。
基于 AxCACHE[0] 决定 device 访问是否可以被中间节点缓存,影响 bufferable 性质。中间节点缓存对 device 访问的控制情况,以及 bufferable 性质的决定因素。
Normal访问定义为正常地访问存储介质,而不进行缓存查找,其中AxCACHE[3:1]被设置为001。在Normal非缓存访问中,中间组件能够对传输事务信息进行修改,并提供事务聚合的支持。
基于AxCACHE[0]的设置,可以控制是否可以将normal访问结果缓存到中间节点中,同时也决定了该访问是否具备bufferable性质。
Write-through访问策略
在Write-through访问策略中,缓存的写入操作采用直写方式,即在进行写入操作的同时,也会同步写入主存储中。在此时,AxCache[1:0]会被设置为2’b10,从而允许中间组件修改传输事务,实现写入事务的聚合与读取操作的预取。在此过程中,AxCache[0]会被置低,确保每个写入事务最终都能正确写入目标地址。
通过缓存机制,读取数据时可以利用缓存层存储的记录,每次读写操作均需进行缓存查找,以定位相应的表项信息。
基于 AxCache[3:2] 的不同,从图中可得共有 4 种情况,分别代表不同的分派提示类型。例如,No-allocate 建议不要为该事务分配缓存空间。Read-allocate 则建议将读事务分配缓存,但不建议为写事务分配缓存。然而,这些建议都是基于处理器从性能出发提出的,由缓存控制器根据情况决定执行。
Write-back访问策略即为缓存层的写回机制,其特点在于数据仅存于缓存中,而被替换的缓存单元则在后续操作中被写入到主存储器。该策略表明,当进行Write-back操作时,数据仅存于缓存中,而被替换的缓存单元则在后续操作中被写入到主存储器。
AxCache[1:0] = 2’b10,即中间组件可以修改传输事务,并且进行缓存。
与Write-through访问相比,区别在于写回策略中并不是每次写事务后都需要更新主缓存,因此无需将每个写事务传输至原本的目的地(即主存储)。
