AXI学习记录(4)------AXI传输属性介绍
文章目录
前言
上一篇文章AXI数据传输结构介绍中介绍了数据传输结构相关内容,接下来看看传输属性相关内容,主要描述了Caches,Buffers和memory controller如何处理事务。
1 事务类型
Slave分为Memory Slave和Peripheral Slave(外设),使用AR/WCACHE两个信号来指定事务属性,这两个信号的作用如下:
- 事务如何在系统中进行。
- 系统级缓存(System-Level Cache)如何处理事务。
- AXI使用AxCACHE来替换AR/WCACHE。
2 AXI Memory属性介绍
2.1 AXI3 Memory属性相关信号
在AXI3中,AxCACHE[3:0]指定事务的Bufferable,Cacheable和Allocate的属性。
那么,这些属性表示什么意思,或者说有什么作用?
- AxCACHE[0], Bufferable (B) bit
该bit为1时,可以延迟事务到达最终目的地的时间。 - AxCACHE[1], Cacheable (C) bit
该bit为1时,Cache enable。 - AxCACHE[2], Read-Allocate (RA) bit
该bit必须C为1时才有效,当该bit为1时,建议将事务分配为读操作,不是强制。 - AxCACHE[3], Write-Allocate (WA) bit
该bit必须C为1时才有效,当该bit为1时,建议将事务分配为写操作,不是强制。
2.2 AXI4 Memory属性相关信号
在AXI4中,AxCACHE[1]改成了Modifiable bit,基本功能还是一样的。当该bit为1时,表示可以修改事务的特征,为0时表示无法修改事务特征。
AXI4中附加:在AXI4中,对同一Slave使用相同ID的所有设备事务必须按照彼此的顺序进行排序(什么叫彼此的顺序?),建议在AXI3中也这样做。
2.2.1 AxCACHE[1]信号描述
Non-modifiable,AxCACHE[1]=0,在不可修改事务中,下面这些信号不能更改。
Modifiable,AxCACHE[1]=1,在每个传输事务中,下面这4个信号可以修改:
- The transfer address, AxADDR.;
- The burst size, AxSIZE.;
- The burst length, AxLEN;
- The burst type, AxBURST。
下面两个信号不能修改:
- The lock type, AxLOCK;
- The protection type, AxPROT。
2.2.2 AxCACHE[3:2]信号描述
在AXI4中,AxCACHE[3:2] (即Read_Allocate和Write_Allocate两个信号)与AXI3相比略有区别。
在读事务中,对于Write_Allocate bit的定义如下:
- AXI3中,由于有写事务,该bit可能已经在Cache中预先定义了。
- AXI4中,由于另一个Master的操作,该bit可能已经在Cache中预先定义了。这里就是AXI4中多出来的处理方式。
在写事务中,对于Read_Allocate bit的定义如下:
- AXI3中,由于有读事务,该bit可能已经在Cache中预先定义了。
- AXI4中,由于另一个Master的操作,该bit可能已经在Cache中预先定义了。这里就是AXI4中多出来的处理方式。
注意:当AxCACHE[3:2]=0‘b00时,不需要去查看Cache;当其不为0‘b00时,必须从Cache中查找事务。
2.2.3 Memory Type
下图中展示了AXI4的AxCACHE[3:0]属性,可以看出和前面AXI3(下图括号中的值是AXI3的)中还是有一些区别,主要就是在Read/Write-Allocate这里。
下面将指定每种Memory Type的行为:
Device Non-bufferable:
- 写响应必须从最终目的地获取;
- 读数据必须从最终目的地获取;
- 事务不可更改;
- 读操作不能预先读取,写操作不能合并;
- 从同一ID到同一Slave的不可更改(AxCACHE[1] = 0)读写事务,必须保持顺序。
Device Bufferable:
- 写响应可以从某个中间节点获取;
- 写事务必须及时出现在最终目的地(怎么才叫及时?);
- 读数据必须从最终目的地获取;
- 事务不可更改;
- 读操作不能预先读取,写操作不能合并;
- 从同一ID到同一Slave的不可更改(AxCACHE[1] = 0)读写事务,必须保持顺序。
Device Non-bufferable和Device Bufferable这两种Memory Type都是不可更改的,两者的区别在于写响应的获取位置在哪,而读事务则没有区别。
Normal Non-cacheable Non-bufferable:
- 写响应必须从最终目的地获取;
- 读数据必须从最终目的地获取;
- 事务可更改;
- 写操作能合并;
- 从同一ID到重叠地址(什么是重叠地址?)的读写事务,必须保持顺序。
Normal Non-cacheable Bufferable:
- 写响应可以从某个中间节点获取;
- 写事务必须及时出现在最终目的地(怎么才叫及时?Spec中还专门说没有机制来确定写事务何时出现在最终目的地,那该如何确定?);
- 读数据必须从最终目的地 or 正在到最终目的地的写事务中(如果使用该种方式,必须是最新的写事务,不能缓存数据供后续读取)获取;
- 事务可更改;
- 写操作能合并;
- 从同一ID到重叠地址的读写事务,必须保持顺序。
对于从正在到最终目的地的写事务中读取数据的操作,该数据与同时到达最终目的地的读写事务无法区分,故不能用来当做"写事务必须及时出现在最终目的地"。
Write-Through No-Allocate:
- 写响应可以从某个中间节点获取;
- 写事务必须及时出现在最终目的地;
- 读数据可以从中间缓存获取;
- 事务可更改;
- 写操作能合并;
- 读写事务需要缓存查找;
- 同一ID到重叠地址的读写事务,必须保持顺序;
- 建议内存系统不分配这些事务,避免影响性能(为什么只有这里说了会影响性能,上面那些不会吗?)。
Write-Through Read-Allocate:
- 满足Write-Through No-Allocate的要求;
- 建议分配读事务,不分配写事务。
Write-Through Write-Allocate:
- 满足Write-Through No-Allocate的要求;
- 建议分配写事务,不分配读事务。
Write-Through Read and Write-Allocate:
- 满足Write-Through No-Allocate的要求;
- 建议分配写事务,建议分配读事务。(那到达分配哪个?)
Write-Back No-Allocate:
- 写响应可以从某个中间节点获取;
- 写事务不必及时出现在最终目的地;
- 读数据可以从中间缓存获取;
- 事务可更改;
- 可以预先读取;
- 写操作可合并;
- 读写事务需要缓存查找;
- 同一ID到重叠地址的读写事务,必须保持顺序;
- 建议内存系统不分配这些事务,避免影响性能。
Write-Back Read-Allocate:
- 满足Write-Back No-Allocate的要求;
- 建议分配读事务,不分配写事务。
Write-Back Write-Allocate:
- 满足Write-Back No-Allocate的要求;
- 建议分配写事务,不分配读事务。
Write-Back Read and Write-Allocate:
- 满足Write-Back No-Allocate的要求;
- 建议分配读事务,建议分配写事务。
2.2.4 不匹配的Memory属性
对于访问同一块内存区域的不同代理,可以使用不匹配Memory属性,需要遵守下面的规则:
- 访问同一内存区域的所有Masters,必须在任何层次结构级别上对该内存区域有一致的可缓存性。
对于不可缓存的Memory区域:所有Master都使用AxCACHE[3:2]=0‘b00的事务访问该区域。
对于可缓存的Memory区域:Master根据不同的Memory Type设置AxCACHE[3:2]。 - 不同的Master可以使用不同的分配指示;
- 如果一个地址是Normal不可缓存的,那么任何Master都可以使用设备内存事务访问它;
- 如果寻址区域具有Bufferable属性,则任何Master都可以使用不允许缓冲行为的事务访问该区域。
例如:要求从最终目的地址回复的事件不允许可缓存行为。
2.3 事务缓冲(Buffering)
为什么有事务缓冲,目的就是允许中间节点生成相应,系统可以优化操作延迟和带宽。需要保证:
- 数据最终一致性:缓冲的写操作按照正确的顺序提交到最终Memory/device。
- 非缓存(no-cacheable)写操作的及时性(必须保证写操作在最终目的地及时可见),防止访问冲突。
3 访问权限
AXI中提供访问权限信号(AxPROT[2:0],其中ARPROT[2:0]用来控制读事务权限,AWPROT[2:0]用来控制写事务权限)来阻止非法传输(哪些行为称为非法传输?)。下图展示了AxPROT[2:0]的属性:
注意:该位所标示的只是建议,并不能在所有情况下精确表示。例如:一个混合了指令和数据的事物,默认情况下,推荐将访问标记为一个数据访问,除非明确知道该事物是一个指令访问。
总结
本文简单介绍了AXI事务属性,重点就是通过控制AxACHE[3:0]和AxPROT[2:0]这两个信号,来控制缓存行为和访问权限,确保系统组件正确处理事务。