1. 事务类型和属性
从设备被分类为以下两种之一:
内存从设备
- 内存从设备需要正确处理所有事务类型。
外设从设备
- 外围从设备具有自定义的访问方法。通常,这在该设备的datasheet中定义,该datasheet描述了从设备正确处理的事务类型。
- 任何不属于自定义访问方法的对外围从设备的访问必须按照协议完成。然而,一旦进行了这样的访问,外围从设备就不需要继续正确操作。只要求它继续以符合协议的方式完成进一步的事务。
注意
为了防止系统死锁,需要符合所有事务类型的完成,但是不要求外围从设备继续正确操作。 由于外围从设备只需要对定义的访问方法正确工作,因此它的接口信号集可以大大减少。
AXI 协议定义了一组事务属性,支持内存和外围从设备。ARCACHE 和 AWCACHE 信号指定事务属性,它们控制:
- 事务如何前进通过系统
- 任何系统级高速缓存如何处理该事务
在本规范中,术语 AxCACHE 统一指代 ARCACHE 和 AWCACHE 信号。
2. AXI3 内存属性信号
在 AXI3 中,AxCACHE[3:0] 信号指定了事务的可缓冲(Bufferable)、可缓存(Cacheable)和分配(Allocate)属性。
下表显示了 AxCACHE[3:0] 的编码和事务属性的对应关系。
AxCACHE | 值 | 事务属性 |
---|---|---|
[0] | 0 | 非可缓冲 |
[0] | 1 | 可缓冲 |
[1] | 0 | 非可缓存 |
[1] | 1 | 可缓存 |
[2] | 0 | 无读分配 |
[2] | 1 | 读分配 |
[3] | 0 | 无写分配 |
[3] | 1 | 写分配 |
2.1 AxCACHE[0],Bufferable (B) bit (可缓冲(B)位)
当此位被断言时,互连或任何组件可以延迟事务到达其最终目的地的时间,延迟周期数可以是任意的。
注意 通常,可缓冲属性仅与写操作相关。
2.2 AxCACHE[1],Cacheable (C) bit 可缓存(C)位
当此位被取消断言时,禁止分配事务。
当此位被断言时:
- 允许分配事务。RA 和 WA 提供额外的提示信息。
- 事务在最终目的地的特性不需要与原始事务的特性匹配。
- 对于写操作,这意味着可以将多个不同的写操作合并在一起。
- 对于读操作,这意味着可以预取一个位置的内容,或者从单次获取的值可以用于多个读事务。
2.3 AxCACHE[2],读分配(RA)位
当此位被断言时,建议但不是强制进行读分配事务。 如果 C 位被取消断言,则不能断言 RA 位。
2.4 AxCACHE[3],写分配(WA)位
当此位被断言时,建议但不是强制进行写分配事务。 如果 C 位被取消断言,则不能断言 WA 位。
3. AXI4对内存属性信号的更改
AXI4 相较于AXI3, 内存属性信号做出了以下更改:
- AxCACHE[1] 位被重命名为可修改(Modifiable)位。
- 为不可修改(Non-modifiable)事务定义了排序要求。
- 更新了读分配(Read-allocate)和写分配(Write-allocate)的含义。
3.1 AxCACHE[1],可修改(Modifiable)
在 AXI4 中,AxCACHE[1] 位是可修改(Modifiable)位。当设置为高电平时,可修改表示事务的特性可以被修改。当可修改设置为低电平时,事务是不可修改的。
注意 AxCACHE[1] 位从可缓存(Cacheable)位重命名为可修改(Modifiable)位,以更好地描述所需的功能。实际功能没有改变。 以下各节描述了不可修改和可修改事务的属性。
3.1.1 不可修改事务
通过将 AxCACHE[1] 设置为低电平,指示一个不可修改事务。
不可修改事务不得分割成多个事务,也不得与其他事务合并。
在不可修改事务中,下表中显示的参数不得更改。
参数 | 信号 |
---|---|
传输地址 | AxADDR(因此 AxREGION) |
突发大小 | AxSIZE |
突发长度 | AxLEN |
突发类型 | AxBURST |
锁类型 | AxLOCK |
保护类型 | AxPROT |
只有AxCACHE 属性能被修改以将事务从可缓冲(Bufferable)转换为不可缓冲(Non-bufferable)。不允许对 AxCACHE 进行其他更改。
事务 ID 和 Qos 值可以被修改。
具有大于 16 的突发长度的不可修改事务可以被分割为多个事务。产生的每个事务必须满足本小节给出的要求,除了:
- 突发长度减少;
- 生成的突发的地址适当调整。
一个被标记为独占访问的不可修改事务(由断言的 AxLOCK 指示),如果访问的总字节数保持不变,允许修改事务大小 AxSIZE 和事务长度 AxLEN。
3.1.2 可修改事务
通过断言 AxCACHE[1] 来指示一个可修改事务。 可修改事务可以通过以下方式进行修改:
- 一个事务可以被分割成多个事务。
- 多个事务可以合并成一个事务。
- 读事务可以获取比要求更多的数据。
- 写事务可以访问比要求更大的地址范围,使用 WSTRB 信号确保只有适当的位置被更新。
- 在每个生成的事务中,以下信号可以被修改
- 传输地址,AxADDR
- 突发大小,AxSIZE
- 突发长度,AxLEN
- 突发类型,AxBURST
- 以下信号不得更改:
- 锁类型,AxLOCK。
- 保护类型,AxPROT。
内存属性 AxCACHE 可以被修改,但任何修改都必须确保其他组件对事务的可见性不被降低,即不通过阻止事务传播到所需点,或通过改变需要在缓存中查找事务的需求。对内存属性的任何修改必须对同一地址范围的所有事务保持一致。
事务 ID 和 QoS 值可以被修改。
不允许进行以下事务修改:
- 导致访问与原始事务不同的 4KB 地址空间。
- 导致对单一副本原子性大小的区域的单次访问被执行为多次访问。
3.2 不可修改事务的排序要求
AXI4 要求对于满足以下所有条件的任何事务集合,必须保持它们的排序:
- 这些事务是不可修改的。
- 这些事务使用相同的 AXI ID。
- 这些事务针对同一从设备。
必须保持排序,无论事务的地址如何,只要这些事务是针对同一从设备。
这个排序要求不保证发往不同从设备的事务之间的相对排序。 由于不同物理从设备之间的地址映射边界是实现定义的,如果不知道从设备之间的边界,那么就必须保持同一路径上具有相同 AXI ID 的所有不可修改事务的排序。
这个排序要求适用于所有不可修改事务之间,包括不可缓冲和可缓冲事务之间。
当 AXI 路径中的中间组件发出事务响应时,该组件负责确保正确的排序。
3.3 读分配(Read-allocate)和写分配(Write-allocate)含义的更新
在 AXI4 中,读分配和写分配位的含义已经更新,以便一个位表示事务是否发生了分配,另一个位表示是否由于另一个事务本可以进行分配。
对于读事务,写分配(Write-allocate)位被重新定义为表示:
- 由于写事务,该位置之前可能已经在缓存中分配(根据 AXI3 的定义)。
- 由于另一个主设备的动作,该位置之前可能已经在缓存中分配(AXI4 新增定义)。
对于写事务,读分配(Read-allocate)位被重新定义为表示:
- 由于读事务,该位置之前可能已经在缓存中分配(根据 AXI3 的定义)。
- 由于另一个主设备的动作,该位置之前可能已经在缓存中分配(AXI4 新增定义)。
这些变化意味着:
- 如果 AxCACHE[3:2] 的值不是 0b00,则必须在缓存中查找事务。
- 如果 AxCACHE[3:2] 的值是 0b00,则不需要在缓存中查找事务。
注意 AxCACHE 定义的更改意味着,对于同一位置的读事务和写事务,这些信号可能会有所不同
表 A4-3 显示了 AXI4 中 AWCACHE 信号的位分配
信号 | AXI4 定义 | 描述 |
---|---|---|
AWCACHE[3] | 分配(Allocate) | 当此位被断言时,事务必须在缓存中查找,因为它可能已经被先前分配。如果 AWCACHE[2] 也被断言,则事务也必须在缓存中查找。当取消断言时,如果 AWCACHE[2] 也被取消断言,则事务不需要在缓存中查找,事务必须传播到最终目的地。当断言时,出于性能原因,建议此事务在缓存中分配。 |
AWCACHE[2] | 其他分配(Other Allocate) | 当此位被断言时,事务必须在缓存中查找,因为它可能已经被另一个事务先前分配在缓存中,无论是读事务还是来自另一个主设备的事务。如果 AWCACHE[3] 也被断言,则事务也必须在缓存中查找。当取消断言时,如果 AWCACHE[3] 也被取消断言,则事务不需要在缓存中查找,事务必须传播到最终目的地。 |
AWCACHE[1] | 可修改(Modifiable) | 当断言时,可以修改事务的特性,并且可以合并写入。当取消断言时,必须不修改事务的特性。 |
AWCACHE[0] | 可缓冲(Bufferable) | 当取消断言时,如果 AWCACHE[3:2] 都取消断言,则写响应必须来自最终目的地。当断言时,如果 AWCACHE[3:2] 都取消断言,则写响应可以从中间点给出,但写事务必须及时在最终目的地可见。当取消断言时,如果 AWCACHE[3:2] 中的任何一个被断言,则写响应可以从中间点给出,但写事务必须及时在最终目的地可见。当断言时,如果 AWCACHE[3:2] 中的任何一个被断言,则写响应可以从中间点给出。写事务不需要在最终目的地可见。 |
表格 A4-4 ARCACHE 位分配
信号 | AXI4 位定义 | 描述 |
---|---|---|
ARCACHE[3] | 其他分配 | 当断言(即设置为1)时,必须在缓存中查找该事务,因为它可能已经被其他事务分配到缓存中,无论是写事务还是来自另一个主设备的事务。如果ARCACHE[2]也被断言,也必须在缓存中查找该事务。 当取消断言(即设置为0)时,如果ARCACHE[2]也被取消断言,则该事务不需要在缓存中查找。 |
ARCACHE[2] | 分配 | 当断言时,必须在缓存中查找该事务,因为它可能已经被分配。如果ARCACHE[3]也被断言,也必须在缓存中查找该事务。 当取消断言时,如果ARCACHE[3]也被取消断言,则该事务不需要在缓存中查找。 当断言时,出于性能原因,建议将该事务分配到缓存中。 |
ARCACHE[1] | 可修改 | 当断言时,可以修改事务的特性,并且可以获取比所需更多的读取数据。当取消断言时,不得修改事务的特性。 |
ARCACHE[0] | 可缓冲 | 当ARCACHE[3:1]被取消断言时,该位没有效果。 当ARCACHE[3:2]被取消断言且ARCACHE[1]被断言时:
|