先理解一下什么是Single-copy atomicity size:
"Single-copy atomicity size"(单副本原子性大小)是一个概念,它定义了事务必须原子性地更新的最小数据块的大小,以字节为单位。原子性意味着在事务执行期间,数据的任何更改要么全部完成,要么完全不做,从而保证了数据的一致性和完整性。
这里的“单副本”指的是在一次事务中,数据的更新操作是作为一个整体进行的,对于其他观察者(系统中的其他主设备)而言,这个更新是不可见的,直到整个事务完成。这样做的目的是为了避免在多主设备系统中出现数据不一致的情况。
具体来说,单副本原子性大小的意义包括:
-
事务块大小:它规定了在执行写事务时,必须以不小于指定单副本原子性大小的块来更新内存。
-
数据一致性:确保在任何给定时间,系统内的数据项要么保持原样,要么被完整地更新为新值,不会出现中间状态。
-
系统要求:系统中所有参与通信的组件都必须支持所需的单副本原子性大小。例如,如果一个系统要求支持64位的原子操作,那么所有相关的主设备、从设备和互连都必须能够处理至少64位的原子事务。
-
设计灵活性:AXI4协议不强制要求特定的单副本原子性大小,允许系统设计者根据具体的应用需求来确定合适的大小。
-
通信组:不同的系统组件组可以有不同的单副本原子性大小,以适应它们之间的通信需求。
例如,如果单副本原子性大小设置为32位,则任何大于32位的事务必须以32位的倍数来更新内存,确保32位的数据项(如一个整数或浮点数)要么完全不被更改,要么被完整地更新。
1. 单副本原子性大小
AXI4协议引入了单副本原子性大小的概念。这个术语定义了一个事务原子性更新的最小字节数。AXI4协议要求大于单副本原子性大小的事务必须至少以单副本原子性大小的块来更新内存。
注意
- 原子性并不定义数据更新的确切瞬间。必须确保的是,没有任何master能够观察到原子数据的部分更新形式。例如,在许多系统中,如链表这样的数据结构由32位原子元素组成。对这些元素之一的原子更新要求整个32位值同时更新。对于任何master来说,观察到一次只更新16位,然后在后来的某个时间点更新另外16位,是不可接受的。
更复杂的系统需要支持更大的原子元素,特别是64位原子元素,以便master可以使用基于这些更大原子元素的数据结构进行通信。
系统中支持的单副本原子性大小很重要,因为参与给定通信的所有组件都必须支持所需的原子元素大小。如果两个master通过互连和单个slave进行通信,那么所有参与的组件都必须确保事务以所需的大小原子性地处理。
AXI4协议不要求特定的单副本原子性大小,系统可以设计成支持不同的单副本原子性大小。不同的组件组可以在组内通信时有不同的单副本原子性大小。在AXI4中,术语“单副本原子组”(single-copy atomic group)描述了可以以特定原子性进行通信的组件组。例如,图A7-1显示了一个系统,其中:
- 处理器、数字信号处理器(DSP)、DRAM控制器、DMA控制器、外设、SRAM内存和相关的互连,构成了一个32位单副本原子组。
- 处理器、DSP、DRAM控制器和相关的互连,也构成了一个64位单副本原子组。
一个事务的原子性保证永远不会大于其起始地址的对齐边界。例如,在一个64位单副本原子组中,如果没有对齐到8字节边界的突发传输,那么它没有任何64位单副本原子性保证。
与事务相关联的byte strobes不影响单副本原子性大小。
1.1 多副本写原子性
为了指定系统提供多副本原子性,定义了一个名为Multi_Copy_Atomicity的属性。
如果将Multi_Copy_Atomicity属性设置为True,则定义系统具有此属性。
不支持Multi_Copy_Atomicity属性的系统,默认值为False。
如果满足以下条件,系统被定义为具有多副本原子性:
- 所有组件观察到对同一位置的写入是按相同顺序的。
- 除了发起者之外,任何组件都能观察到对某个位置的写入,该写入对所有组件都是可观察的。
多副本原子性可以通过以下方式确保:
- 使用单个串行化点(Point of Serialization, POS),对于给定的地址,确保对同一位置的所有访问都是有序的。这必须确保在该位置的新值对任何组件可见之前,该位置的所有一致性缓存副本都被使无效。
- 避免使用位于任何组件上游的转发缓冲区。这防止了某个位置的缓冲写入在对所有组件都可见之前,就对某些组件变得可见。
注意
如果使用ARM v8架构处理器,系统必须具有Multi_Copy_Atomicity属性。这是支持带有获取(Acquire)的加载(Load)和带有释放(Release)的存储(Store)指令所必需的。带有释放的存储指令要求该存储操作是多副本原子性的。