有朋友提出希望讲一下AXI的原子访问(Atomic Accesses)。其实这部分我在前面特意没提及,一是个人感觉这块牵扯的基本概念太多,而且晦涩难懂,二是工作中真需要用到的机会也不多。今天简单介绍一下,有不对的地方请大家指教。
何为“原子性”?在这里,“原子性”指的是内存访问的一个特征,也称为原子访问,该内存访问操作要么执行完,要么不被执行,不存在执行一半被打断的可能。也就是该内存访问操作像原子一样不可切割。
为此,ARMv8-A(注意,不是AXI)中定义了两种原子性:单拷贝原子性(single-copy atomicity)和多拷贝原子性(multi-copy atomicity),此处不展开太多了,以后有机会单独写一篇与大家讨论。
AXI4中引入了一个概念,单拷贝原子大小(single-copy atomicity size)。这个术语定义事务原子更新的最小字节数。AXI4协议要求大于单拷贝原子大小的事务必须更新至少为单拷贝原子大小的内存块。
更复杂的系统需要支持更大的原子元素,特别是64bit,这样主机就可以使用基于这些更大原子元素的数据结构进行通信。系统中支持的单拷贝原子性大小非常重要,因为给定通信中涉及的所有组件都必须支持所需的原子元素大小。AXI4协议本身不需要特定的单拷贝原子大小,系统可以设计为支持不同的单拷贝原子大小。AXI的spec里面给了下图一个例子:图中的处理器,DSP,DRAM控制器,DMA,SRAM,互连和外设都是32bit的single-copy atomicity size;同时处理器,DSP,DRAM控制器和相关的互连部分也是64bit的single-copy atomicity size。
为了支持原子访问,AXI中定义了两种操作:排他访问(exclusive access),和锁定访问(locked access)。
排他访问机制可以提供信号量类型的操作,而不需要在操作期间保留总线给特定主机。也就是说信号量类型的操作不会影响总线访问延迟或最大可实现带宽。主机通过AxLOCK信号选择独占访问,RRESP和BRESP信号分别表示独占访问读写的成功或失败。从机需要额外的逻辑来支持独占访问。
排他访问的基本机制是:
主机对一个地址执行排他读取。
在稍后的某个时间,主机试图通过执行排他写入来完成独占操作到相同的地址,并且具有与用于排他读取的地址匹配的AWID。
此排他写入访问被标记为:
Ø 如果在排他读访问之后没有其他主机写入该位置,则标记为成功。在这种情况下,排他写入更新内存。
Ø 如果另一个主机在排他读取访问后已写入该位置,则标记为失败。在这种情况下,内存位置不会更新。
主机通过执行排他读取来启动排他操作。如果事务成功,从机返回EXOKAY响应,指示从机记录了要监视的地址以进行排他访问。如果主设备尝试从不支持排他访问的从设备进行排他读取,则从机将返回OKAY,不是EXOKAY。
不支持独占访问的从机可以忽略AxLOCK信号。但是必须能够对正常访问和排他访问返回OKAY响应。
与排他访问相对的是锁定访问。当主机使用AxLOCK信号来指示事务是锁定的事务时,互连必须确保只有该主机可以访问目标从属区域,直到来自同一主机的未锁定事务完成。互连中的仲裁器必须执行此限制。在主机启动读或写事务的锁定序列之前,它必须确保没有其他事务等待完成。任何带有AxLOCK的表示已锁定事务的事务都会强制互连锁定后续的事务。因此,锁定的序列必须由一个没有AxLOCK指示锁定事务终结。这就要求最后一个事务包含在锁定的序列中,并有效地移除锁定。完成锁定序列时,在发出最终解锁事务之前,主机必须确保所有先前锁定的事务都已完成。然后,它必须确保最终解锁事务在开始任何进一步的事务之前已经完成。主机必须确保锁定序列中的所有事务都具有相同的AxID值。
可以看出,锁定访问需要在一段时刻内独占互连,因此会极大影响互连的性能。在AXI4中已经取消对锁定访问的支持。
AXI3支持locked access,AxLOCK信号为2bit。
AXI4中考虑到大多数组件并不需要锁定的事务,而且锁定事务对于互连设计和QoS带来挑战,因此取消了对locked access的支持,AxLOCK信号为1bit。
原文地址:https://mp.weixin.qq.com/s/5c7fAuA4oRFX7a_3hqfoOQ