AXI之原子操作

原子,可以认为是物质组成的最小单位,当然,现在科学表明,比原子小的还有质子和中子 。但是这里我们还将原子作为最小单位来理解,那么原子就是不可分割的,因此原子操作就可以理解为不可分割的操作 。
AXI的原子操作包括和lock两种,不管是还是lock操作,在执行期间不可被其它操作打断,否则操作失败 。
1、操作
的应用场景主要是处理器需要对某个内存地址进行写操作时,假如写一个字节,而内存的数据位宽大于一个字节,比如32bit,这时处理器需要将内存地址对应的32bit数据先读出来,然后将要写入的一个字节数据进行更新后,再将更新后的32bit数据重新写入内存中去,该过程通常被业内称为读改写操作(RMW) 。如下图所示,CPU要将内存地址1的数据改为0x02,就需要先将地址0~3的数据都读回来,然后将更新后的数据重新写入内存 。

AXI之原子操作

文章插图
但是实际芯片中,在CPU将数据读回,并将更新数据写回内存期间,可能会有其它的也会访问内存,假如DSP将地址0的数据改成了0xff,那么内存中地址0应该保存的正确数据就应该是0xff,但是CPU由于操作延时,又将地址0的数据改成了0x0,这个时候DSP以为地址0里的数据是0xff,但实际上却是0x0,就无法保证数据的一致性 。
于是就引入了操作 。还是上边的例子,CPU要改写内存中数据,会先发一笔的读操作,此时内存作为slave,slave中会有一个记录这笔读操作的地址和ID,然后返回EXOK,表示其支持操作,否则返回OK,代表不支持操作,在此情况下CPU收到OK就知道内存不支持操作 。此处假如内存支持操作,则CPU收到EXOK后会继续发一笔写操作,将更新后的数据写回内存中 。在此过程中如果内存的地址0x0~0x3没有被别的访问过,则slave返回EXOK,代表此次操作(一次操作包含读和写)被正确执行;
【AXI之原子操作】假如在读和写之间,内存的这个地址被其它访问过,如DSP将内存地址0写成了0xff,则slave返回OK,且此笔写操作不会被执行(如果执行会出现上边提到的数据一致性问题) 。CPU收到OK的响应后就知道此次失败了,即写操作没写进去 。此时内存中数据内容如下图:
此时CPU可以选择再次发起一次操作,继续对内存进行改写 。如果操作成功,则内存中的数据应该为:
结合此应用,相信大家对于协议原文中关于操作的描述会有更深入的理解 。
2、lock操作
相对来说,lock操作比较简单,发出lock操作后,要保证在lock期间只有此能获得总线使用权,且lock操作的最后一笔要将拉低,以此解除lock状态,最后一笔操作结束后,其它的才可以获得总线使用权,说白了就是我发出lock操作后,其他人不能打断我 。
相比操作,lock操作会降低总线的利用率,而且影响QOS的使用,外加应用场景并不多,在AXI4中已经删除了lock操作 。