乍一看,AMBA AXI exclusive 很容易理解,当时随着你深入研究或者经过项目的实践,你会发现这其中还是有很多惊喜的。尤其是从验证的角度来看,这里面涉及到不同场景的组合都是验证中的挑战。
当多个master试图在系统中访问共享内存时,exclusive 访问起着关键作用。系统设计需要确保exclusive 访问成功时,该地址空间中的数据不会被其他master覆盖。简单来说,exclusive 访问是对相同地址读取然后进行写入的一个操作序列。
硬件上exclusive 访问机制就是为了支持软件上semaphore 类型操作,同时又不希望某个master锁定住总线。简而言之,exclusive 访问机制就是为了在不影响关键的总线访问性能(延迟和带宽)的前提下支持semaphore 类型操作,(semaphore 类型操作是什么,暂不深究了,毕竟硬件就是为软件服务的,人家要了,那就给呗)。
exclusive 访问序列必须始终从exclusive 读取操作开始,然后假设读取返回一个成功的EXOKAY响应,然后master可以用exclusive写操作完成exclusive 访问序列。成功的exclusive 访问将收到一个EXOKAY响应,其他所有情况(包括失败的exclusive 访问),都将收到OKAY响应。至于为什么是OKAY,而不是ERROR,大家可以思考下哈?
Exclusive 访问序列中的Exclusive 读写之间的延迟是不固定的,并且master可能无法完成Exclusive 操作的写部分,这会增加Exclusive 访问的验证空间。
在exclusive 访问期间,如果没有其他master对该地址写入数据,则exclusive 访问成功;如果另一个master在期间对该地址写入数据,则exclusive 访问失败。在这种情况下,exclusive 访问中的写也不会更新该地址对应的数据。
上述是exclusive 访问在系统上的行为,那么从设计的角度,slave是如何支持这一特性的呢?假设在一个系统中有2个AXI Master 共享一个支持Exclusive 访问的AXI slave(S1)的相同内存。AXI Master1(M1)对地址16h1000至16h100F启动exclusive 读取事务。Slave S1将开始监视M1给出的ARID的这些地址,直到该位置发生写入操作,或者直到另一个具有相同ARID值的exclusive 读取操作,此时需要将监视的地址重置更新为不同地址。
如果master M2在M1完成其exclusive 写之前写入同一地址,slave 将在M1的exclusive 写事务期间给出exclusive 访问失败的指示,并且不允许M1更新该内存地址的数据。
在上述场景中,slave S1为M1保留一些内存资源。当M1尝试写入该内存位置时,slave S1只有在其他master不写入该内存资源时才允许Exclusive 写入该内存资源,否则数据不会写入该内存资源。通过这种方式,我们可以避免AXI Exclusive 访问的共享内存的内存覆盖问题。
如下是一些关于AXI Exclusive 访问的corner case:
1、Exclusive 读之后跟正常读写操作。
2、master发起Exclusive读,但是不发起Exclusive 写。
3、连续对相同地址相同ARID发起Exclusive读,此时slave的监视器会重置更新监视地址。
4、有两个Exclusive读取来监视同一地址区域。
5、对不支持Exclusive 访问的slave发起Exclusive 访问操作。
END
作者:验证哥布林
原文链接:https://mp.weixin.qq.com/s/4w0VL1e3b2f9k16y2SKFcQ
微信公众号:
推荐阅读
更多IC设计技术干货请关注IC设计技术专栏。