原子访问
本章介绍了 AXI 协议如何实现排他访问和锁定访问机制。 它包含以下部分:
- 原子访问
- 排他访问
- 锁定访问
6.1 原子访问
为了实现原子访问权限,ARLOCK[1:0] 或 AWLOCK[1:0] 信号提供排他访问和锁定访问。 表 6-1 显示了 ARLOCK[1:0] 和 AWLOCK[1:0] 信号的编码。
6.2 排他访问
排他访问机制能够实现信号量类型的操作,而无需在操作期间将总线保持锁定到特定的Master。 排他性访问的优点是信号量类型的操作不会影响关键的总线访问延迟或最大可实现的带宽。
ARLOCK[1:0] 或 AWLOCK[1:0] 信号选择排他访问,RRESP[1:0] 或 BRESP[1:0] 信号表示排他访问成功或失败。
Slave必须有额外的逻辑来支持排他访问。 AXI 协议提供了一种故障安全机制,以指示Master何时尝试对不支持它的Slave进行排他访问。
6.2.1 排他访问过程
-
Master从地址位置执行排他读取。
-
稍后,Master尝试通过对同一地址位置执行排他写入来完成排他操作。
-
Master的排他写访问信号如下:
- 如果在读取和写入访问之间没有其他Master写入该位置,则成功。
- 如果另一个Master在读写访问之间写入该位置,则失败。 在这种情况下,地址位置不会更新。
注意:
Master可能无法完成排他操作的写入部分。 排他访问监控硬件必须仅监控每个事务 ID 的一个地址。 因此,如果Master未完成排他操作的写入部分,则后续排他读取会更改正在监视的排他地址。
6.2.2 master 视角的排他访问
Master通过执行排他读取来启动排他操作。 这通常会从Slave返回 EXOKAY 响应,表明Slave记录了要监视的地址。
注意:
如果Master尝试从不支持排他访问的Slave进行排他读取,则Slave将返回 OKAY 响应而不是 EXOKAY 响应。 Master可以将此视为指示不支持排他访问的错误条件。 建议Master不要执行此排他操作的写部分。
在排他读取后的某个时间,Master尝试对同一位置进行排他写入。 如果自排他读取后位置没有改变,则排他写入操作成功。 Slave返回 EXOKAY 响应,排他写入更新内存位置。(排他读取后,接着进行同一个地址的排他写,肯定能成功)
如果自排他读取后地址位置发生了变化,则排他写入尝试失败,Slave返回 OKAY 响应而不是 EXOKAY 响应。 排他写入尝试不会更新内存位置。(排他读取后,接着进行不同的地址的排他写,会失败)
Master可能无法完成排他操作的写入部分。 如果发生这种情况,Slave将继续监视地址的排他性,直到另一个排他读取启动新的排他访问。
在读部分完成之前,Master不得开始排他访问的写部分。(排他写的优先级小)
6.2.3 Slave角度的排他访问
不支持排他访问的Slave可以忽略 ARLOCK[1:0] 和 AWLOCK[1:0] 信号。它必须为正常和排他访问提供 OKAY 响应。
支持排他访问的Slave必须具有监视器硬件。建议这样的Slave为每个可以访问它的排他Master ID 设置一个监控单元。单端口Slave可以在Slave外部有一个标准的排他访问监视器,但多端口Slave可能需要内部监视。
排他访问监视器记录任何排他读操作的地址和 ARID 值。然后它会监视该位置,直到对该位置进行写入,或者直到另一个具有相同 ARID 值的排他读取将监视器重置为不同的地址。
当使用给定的 AWID 值发生排他写入时,监视器会检查该地址是否正在被监视以获取排他性。如果是,则这意味着该位置没有发生写入,并且排他写入继续进行,完成排他访问。Slave向Master返回 EXOKAY 响应。
如果在排他写入时不再监视地址,这意味着以下情况之一:
- 位置自排他读取后已更新
- 监视器已重置到另一个位置
在这两种情况下,排他写入都不能更新地址位置,Slave必须返回 OKAY 响应而不是 EXOKAY 响应。
6.2.4 排他访问限制
以下限制适用于排他访问:
- 具有给定ID 的排他写入的大小和长度必须与具有相同ID 的前一个排他读取的大小和长度相同。
- 排他访问的地址必须与事务中的总字节数对齐。
- 排他读取和排他写入的地址必须相同。
- 排他访问读取部分的ARID 字段必须与写入部分的AWID 匹配。
- 排他访问的读和写部分的控制信号必须相同。
- 在排他访问突发中传输的字节数必须是2 的幂,即1、2、4、8、16、32、64 或128 个字节。
- 可在排他突发中传输的最大字节数为 128。
- ARCACHE[3:0] 或AWCACHE[3:0] 信号的值必须保证监控排他访问的Slave看到事务。例如,由Slave监视的排他访问不能具有指示事务可缓存的 ARCACHE[3:0] 或 AWCACHE[3:0] 值。
不遵守这些限制会导致不可预测的行为。
在排他操作期间要监视的最小字节数由事务的长度和大小定义。 可以监控更大数量的字节,最多 128 个,这是排他访问的最大值。 然而,这可能导致排他访问实际上成功但由于相邻字节被更新而被指示为失败的情况。
6.2.5 不支持排他访问的Slave
响应信号 BRESP[1:0] 和 RRESP[1:0] 包括成功正常访问的 OKAY 响应和成功排他访问的 EXOKAY 响应。 这意味着不支持排他访问的Slave可以提供 OKAY 响应以指示排他访问失败。
注意:
对不支持排他访问的Slave的排他写入总是更新内存位置。
只有当排他写入成功时,对支持排他访问的Slave的排他写入才会更新内存位置。
6.3 锁定访问
当事务的 ARLOCK[1:0] 或 AWLOCK[1:0] 信号表明它是锁定传输时,互连必须确保只有该Master被允许访问Slave区域,直到来自同一Master的解锁传输完成。互连内的仲裁器用于强制执行此限制。
当Master启动读或写事务的锁定序列时,它必须确保没有其他未完成的事务等待完成。
任何将 ARLOCK[1:0] 或 AWLOCK[1:0] 设置为指示锁定序列的事务都会强制互连锁定之后的事务。因此,锁定序列必须始终以未将 ARLOCK[1:0] 或 AWLOCK[1:0] 设置为指示锁定访问的最终事务完成。此最终事务包含在锁定序列中并有效地移除锁定。(锁定的事务会强制将它之后的事务也锁定,所以如果想要移除锁定,需要把最后一个事务的 ARLOCK[1:0] 或 AWLOCK[1:0] 设置为未锁定。)
当完成一个锁定序列时,Master必须确保在发出最终解锁事务之前所有先前的锁定事务都已完成。然后,它必须确保在开始任何进一步的事务之前,最终的解锁事务已经完全完成。
Master必须确保锁定序列中的所有事务都具有相同的 ARID 或 AWID 值。
注意:
锁定访问要求互连防止在锁定序列进行时发生任何其他事务,因此会对互连性能产生影响。 建议锁定访问仅用于支持传统设备。
以下限制是推荐的,但不是强制性的:
- 将所有锁定的事务序列保持在同一个 4KB 地址区域内
- 将锁定的事务序列限制为两个事务
任何其他事务,因此会对互连性能产生影响。 建议锁定访问仅用于支持传统设备。
以下限制是推荐的,但不是强制性的:
- 将所有锁定的事务序列保持在同一个 4KB 地址区域内
- 将锁定的事务序列限制为两个事务