1. 排序模型的定义
AXI4协议支持一种基于AXI ID事务标识符使用的排序模型。原则是对于具有相同ID的事务:
- 针对任何单个外围设备的事务,必须按照它们被发出的顺序到达外围设备,无论事务的地址是什么。
- 使用相同或重叠地址的内存事务必须按照它们被发出的顺序到达内存。
注意
- 在具有多个master的AXI系统中,用于排序模型的AXI ID包括基础设施ID(用来唯一标识系统中每个master的一种标识符),这些ID能够唯一地识别每个master。这意味着排序模型独立地适用于系统中的每个master。
AXI排序模型还要求,在同一方向上具有相同ID的所有事务必须按照它们被发出的顺序提供它们的响应。
因为读地址通道和写地址通道是独立的,如果需要在具有相同ID的不同方向的两个事务之间建立排序关系,那么master必须等待接收到第一个事务的响应后再发出第二个事务。
如果master在未收到相反方向上早期事务响应之前发出一个方向上的事务,那么这两个事务之间没有排序保证。
注意
- 在需要保证排序并需要对早期事务做出响应的地方,master必须确保它已经从系统的适当点接收到了响应。来自中间AXI组件的响应不能保证与下游于中间缓冲区的组件的排序。
2. master排序
一个在相同方向(读或写)发出多个事务且具有相同ID的master,对这些事务的排序有以下保证:
- 对所有事务的响应顺序必须与发出顺序相同。
- 对于发往设备内存的事务,到达slave的顺序必须与发出顺序相同。
- 对于普通内存,发往具有相同或重叠地址的事务到达slave的顺序,必须与发出顺序相同。这也适用于可缓存内存,也就是适用于所有AxCACHE[3:1]不是0b000的有效的事务。
两个事务访问相同或重叠地址的定义是,两个事务至少访问了单个副本原子地址范围内的一个字节。
3. 互连排序
为了满足排序模型的要求,互连必须确保:
- 保持发往设备内存的、具有相同ID的、相同方向的事务的顺序。
- 保持发往相同或重叠地址的、具有相同ID的、相同方向的事务的顺序。
- 保持具有相同ID的写响应的顺序。
- 保持具有相同ID的读响应的顺序。
- 对与事务相关联的AXI ID值进行任何操作时,必须确保维护原始ID值的排序要求。
- 任何在事务到达最终目的地址之前就给出事务响应的组件,必须确保在事务到达其最终目的地址之前,维护本节所述的排序要求。
4. slave排序
为了满足排序模型的要求,slave必须确保:
-
任何已经发出响应的写事务必须被任何后续的写或读事务看到,不管事务ID是什么。
-
任何发往设备内存的写事务必须被相同ID的任何后续写事务看到,即使响应尚未发出。
-
任何发往普通内存的写事务必须被相同ID的任何后续有相同或重叠地址的写事务看到,即使响应尚未给出。这也适用于发往可缓存内存的事务。也就是说,它适用于所有AWCACHE[3:1]不是0b000的有效的写事务。
-
对于具有相同ID的多个写事务的响应,必须按照事务到达的顺序发出。
-
对于具有不同ID的多个写事务的响应,可以以任何顺序发出。
-
任何已经发出响应的读事务必须被任何后续的写或读事务看到,不管事务ID是什么。
-
任何发往设备内存的读事务必须被相同ID的任何后续读事务看到,即使响应尚未发出。
-
对于具有相同ID的多个读事务的响应,必须按照事务到达的顺序发出。
-
对于具有不同ID的多个读事务的响应,可以以任何顺序发出。
5. 最终目的地址前的响应
任何在事务到达最终目的地址之前发出事务响应的中间组件,必须确保来自任何上游master的任何事务都能看到该事务。
注意 在本节的上下文中,上游master是指通过该组件的slave端口访问该中间组件的任何设备。 要求如下:
- 对于所有内存类型的访问,任何针对相同或重叠地址的后续事务都必须看到中间组件发出响应的事务。
- 对于设备内存的访问,中间组件还必须保持与它发出响应的事务相同ID和相同slave的任何后续事务的顺序。
只有当AxCACHE属性表明允许这样做时,才能对事务给出中间响应。
AXI协议要求对设备内存访问的排序保证是针对普通内存访问保证的超集。这确保了任何被标记为普通的事务都可以转换为设备事务,而不会移除其原始的保证。为了满足这一要求,对相同或重叠地址的设备内存访问的行为必须与普通内存访问的行为相同,而不考虑ID值。 表格A6-1显示了对于所有内存类型、事务ID和访问相同或重叠地址的组合,何时需要排序。
内存类型 | 相同ID | 重叠地址 | 需要排序 |
---|---|---|---|
设备 | 是 | 是 | 是 |
否 | 是 | ||
否 | 是 | 是 | |
否 | 否 | ||
普通 | 是 | 是 | 是 |
否 | 否 | ||
否 | 是 | 是 | |
否 | 否 |
在表格A6-1中,普通内存的条目也适用于对可缓存内存的事务。也就是说,它们适用于所有AxCACHE[3:1]不是0b000的有效的事务。
6. 有序写观察
为了提高与支持不同排序模型的接口协议的兼容性,定义了一个可以为单个接口设置为True或False的“Ordered_Write_Observation”属性。
如果将“Ordered_Write_Observation”属性设置为True,则定义该接口具有此属性。
不支持“Ordered_Write_Observation”属性的接口,默认值为False。
支持“Ordered_Write_Observation”属性的接口可以支持带有改进性能的“生产者/消费者”排序模型。
如果两个具有相同ID的写事务被系统中所有其他组件以与事务发出相同顺序看到,则可以声明接口提供Ordered_Write_Observation。
如果接口没有Ordered_Write_Observation属性,那么只有当写入具有相同ID到同一外设的一系列写事务的观察顺序才得到保证。要在没有Ordered_Write_Observation的情况下支持“生产者/消费者”排序模型,必须在向不同外设发出后续事务之前,先完成对一个外设的早期写事务并提供BRESP响应。