深入理解AMBA总线——AXI原子访问机制和AXI响应

本文主要讲解AXI协议的原子访问机制,包括Atomic信号(如AXI3和AXI4的原子操作差异)和Atomic Access(Locked access和Exclusive access),还介绍了Exclusive access的流程及实例。此外,阐述了AXI的响应信号RREASP和BRESP,以及四种响应情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇文章给大家讲解AXI协议的原子访问机制。

1:Atomic访问机制

1.1 Atomic信号 

众所周知,操作系统的很多机制需要底层硬件的支持,如并发,虚拟化等,随着多处理器的流行,arm也自然而然的要做其总线上加入和并发相关的信号,以满足对并发,并行等机制的支持。

首先我们看一下AXI中和原子访问相关的信号,AXI协议中使用的是Axlock信号来实现原子相关的操作,考虑这样的一个场景,先让处理器1某个地址的数据做相应的运算,再让树立起2写同样的地址,我们当然不希望一半的时间是处理器1的访问,一半的时间是处理器2的访问,这样处理器1可能拿到处理器2更新后的值,也有可能拿到更新以前的值,最后的结果变成了Non_deterministicon,会带来一些列的问题,最好的方法就是处理器1读的时候,你处理器2就不要去写,读完了你再去操作,或者就用一个监控机制,来确保处理器2的操作不会对处理器1的运算结果产生影响。

AXI3和AXI4的原子操作不太一样,如下图中所示,下面分别对二者进行介绍。

对于AXI3而言,将原子操作分为了Exlusive和Locked两种

当为’b10的时候,即Locked访问的时候,如果Master1正在访问某个slave,此时其他的Master也想访问该slave的时候,那对不起,已经锁住了,不允许发起访问,相应的interconnect也必须支持这一机制,仲裁器此时不允许别的Master访问相应的slave

当为 ’b01的时候,即Exlusive访问的时候,这种时候不会将整个访问的路径都给阻塞住,而是用一个flag标志,比如当Master1访问该slave的时候,会有个Monitor记录下这个地址,当其他的Master要访问这个地址的时候,就知道不允许访问,它可能会一直的loop,也有可能进入ODLE模式,当Master1访问结束以后,通过终端唤醒它,再去进行相应的访问,这种模式就不会将整个总线阻塞住。

听上去Exlusive对总线性能影响更小,正是因为如此,AXI4只有Exclusive的方式,舍弃掉了Locked访问的模式。

上面的描述可能还不够Makesense,下面通过具体的实例给大家进一步解释。

1.2 Atomic Access

首先我们看一下Locked access,这种访问机制只在AXI3中使用,如下图中所示,如果Master0正在用Locked访问slave的话,其他所有的Master访问slave的路径都会被阻塞住,图中只给了两个Master的例子,更多的Master也是一样的,这种机制,很自然的就可以知道,非常慢,它对总线的性能影响是很大的,因为其他Master可以访问的是这个Slave的别的Region,根本不会产生竞争问题,但是也被阻塞住了,设计的不好甚至会导致一个Master独占某个Slave,其他的Master的访问都被pending住了。

对于ARM处理器而言,可以通过SWP指令(用在早期的Legacy Arm Processors,比如RAM7这种指令在新的ARM处理器中已经不再使用了,应该是在ARMv6以后就移除了)发出这种访存操作,当然也可以自己设计Master,自定义某种情况,用这种Locked Access,实际上已经不怎么使用了,因为对总线性能影响太大。

 

接下来我们看一下Exclusive access整个流程是怎么样的:

Master对某个地址发起exclusive read;

过了一会儿,Master尝试对同样的地址进行exclusive write来完成整个exclusive operation;

如果在读写之间没有别的Master往这个地址写数据,则上述的exclusive write成功,否则失败;

整个流程和risc_v的LR/SC指令也非常的像,可以说是非常的amazing,整个特点是我在一篇论文中看到的,论文题目为ATUNsModular and Scalable Support for Atomic Operations in a Shared Memory Multiprocessor,想学习具体微架构设计的可以看看这篇论文。

此外上面的机制肯定是需要额外的逻辑进行支持的,一般是在interconnect或者slave上增加Monitor来实现,接下来我们看一下具体的例子是怎么实现的(以下所有的访问都是exclusive访问)

首先看第一个例子

  • Master0首先读0xA000这个地址,没有问题,Monitor会记录下这个地址以及对应的Master ID号。返回ExOKAY,读回来的值为0x1;
  • Master1读0xB000这个地址,Monitor同样记录下这个地址以及对应的Master ID,返回ExOKAY,读回来的值为0x2;
  • Master0去写0xA000这个地址,这个地址之前已经读过了返回ExOKAY,并且中间没有别的Master写过,所以没问题,写下0x3,返回ExOKAY;
  • Master1去写0xB000这个地址,这个地址之前已经读过了返回ExOKAY,并且中间没有别的Master写过,所以没问题,写下0x4,返回ExOKAY;

 我们看第二个例子

  • Master0首先读0xA000这个地址,没有问题,Monitor会记录下这个地址以及对应的Master ID号。返回ExOKAY,读回来的值为0x1;
  • Master1读0xA000这个地址,Monitor同样记录下这个地址以及对应的Master ID,返回ExOKAY,读回来的值为0x1;
  • Master0去写0xA000这个地址,这个地址之前已经读过了返回ExOKAY,并且中间没有别的Master写过,所以没问题,写下0x3,返回ExOKAY;
  • Master1去写0xA000这个地址,这个地址之前已经读过了返回ExOKAY,但是中间有别的Master写过,所以Exclusive write失败,返回OKAY;(对于Exclusive access操作而言,如果Slave返回的是OKAY而不是ExOKAY则代表Exclusive Failure)

 上述机制,其具体的位架构实现取决于应用场景,一般是用一个MAP即表格进行记录,表象从32-1024不等,本人之前参与设计过一款原子操作单元,大致就是i使用上述的机制实现的,这种模块一般是位于interconnect内部,BOOM处理器也有类似的模块,留意一下s2_sc_fail的条件。

跳转中...

MAP机制:表项内部如何进行赋值,可以用状态机实现相应的逻辑。一开始是Open状态,当需要Load Exclusive的时候,进入Exclusive模式,相应的地址和ID存到表格中,如果同样的Master后续的Store Exclusive成功的话或者清空的话,则跳回到Open状态,代表完成了一次Exclusive Operation,相应的表项也可以清空。如果别的Master对同样的地址进行Store Exclusive的话,则会查表发现还占着,因此Fail,写不进去。

再说一遍,上述只是一种实现机制,只要你能满足协议的要求,你的微架构想怎么设计都可以,取决于你自己的个人习惯。

2:AXI 的响应信号

AXI的响应信号有两种,分别是RREASP和BRESP,其中RRESP实际上是对应READ burst的每次transfer(beat),而BRESP对应的是整个Write burst,即一个完整的transaction全部完成以后才会回BRESP,什么是transfer,什么是burst和transation,我之前已经讲过了,大家可以回过头看一下,这里默认大家清楚这些概念。

响应总共有四种情况:

00代表OKAY,普通的访问如果是OKAY的话则代表问成功,如果是Exclusive访问的话,返回OKAY则代表失败;

01代表EXOKAY:代表Exclsive访问成功;

10代表SLVERR:即Slave ERROR,Slave指定的ERROR,代表访问Slave成功了,但是Slave要求返回Error,比如写了不该写的地方;

11代表DECERR:即Decode ERROR,用来代表访问了禁止区域,比如跨了4K了,或者不准读写的地方,或者访问到了Default Slave;

NOTE:实际上10和11没有绝对的界限,比如同意种错误,访问禁止区域,你回复SLVERR或者DECERR实际上都可以的,不一定要完全符合ARM官方的文档描述;

 

<think>好的,我需要回答用户关于AXI单拷贝原子性(Single Copy Atomicity)的概念实现的问题。首先,我需要回忆一下用户提供的引用内容,看看有哪些相关信息可以利用。 根据引用[1],单拷贝原子性大小是AXI4协议中的一个术语,定义了一个事务原子性更新的最小字节数。协议要求大于这个大小的事务必须以该大小的块来更新内存。这说明单拷贝原子性涉及事务的最小原子更新单元。 引用[4]提到AXI协议支持独占式访问锁定访问,通过AxLOCK信号选择,这两种方式保证写操作的串行化,满足一致性。这可能与原子操作的实现机制有关。 引用[2][3]指出AXI5增加了原子操作的支持,通过硬件实现不可分割的内存访问,提升性能可靠性。这说明原子性在AXI中的实现可能涉及硬件层面的支持,比如原子事务的不可分割性。 接下来,我需要将这些信息整合成一个清晰的概念解释。首先定义单拷贝原子性,然后说明其实现方式,包括单拷贝原子性大小、独占访问、硬件支持等方面。 用户的问题还提到了实现,所以需要详细说明AXI协议中的具体机制,如独占访问(Exclusive Access)锁定访问(Locked Access),以及这些机制如何确保原子性。此外,可能需要解释单拷贝原子性大小如何影响事务的处理,比如分割成块更新。 要注意引用对应的内容,比如引用[1]关于单拷贝原子性大小的定义,引用[4]关于独占锁定访问的作用,引用[3]关于硬件实现原子操作的优势。 同时,用户可能对为什么需要单拷贝原子性以及它如何影响系统设计感兴趣,因此需要补充应用场景重要性,比如多核系统中的数据一致性。 最后,生成相关问题,帮助用户进一步深入理解。问题可以涉及单拷贝原子性与其他原子操作的区别、实现中的挑战、不同版本AXI的差异等。 需要确保回答中的数学表达式符合格式要求,如果有的话。虽然当前主题可能不涉及太多数学公式,但如果有涉及位宽或地址对齐的内容,可能需要用行内公式表示,例如地址对齐要求如$2^n$字节对齐。 检查是否有遗漏的关键点,比如单拷贝原子性在AXI4AXI5中的差异,根据引用[2],AXI5增加了原子事务的支持,这可能扩展了单拷贝原子性的应用或实现方式。 总结回答结构:概念定义、实现机制(包括硬件支持、协议特性)、重要性及应用,最后相关问题。确保各部分引用正确的文献,并在末尾添加引用标识。</think>### AXI单拷贝原子性概念与实现 #### 1. **基本概念** **单拷贝原子性(Single Copy Atomicity)** 是AXI协议中确保内存操作原子性的核心机制。它定义了一个事务能**原子性更新内存的最小数据单元**(即单拷贝原子性大小)。例如,若单拷贝原子性大小为4字节,则对4字节以内的内存访问(如32位整型)能保证操作的不可分割性,而更大数据块会被拆分为多个原子性块处理[^1]。 #### 2. **实现机制** AXI协议通过以下方式实现单拷贝原子性: - **单拷贝原子性大小** 协议要求事务若超过该大小,必须以该大小的块分割后进行更新。例如,单拷贝原子性为4字节时,一个8字节写操作会被分为两个4字节的原子性操作完成。 - **独占访问(Exclusive Access)** 通过`AxLOCK`信号选择独占模式,实现“读-改-写”原子操作。具体流程: 1. **独占读**:标记目标地址状态。 2. **独占写**:仅当目标地址未被修改时,写操作成功,否则失败[^4]。 ```verilog // 示例:AXI4 独占读事务的 AxLOCK 信号配置 AxLOCK = 2'b01; // 表示独占访问 ``` - **硬件级原子操作支持(AXI5新增)** AXI5引入了显式的原子事务(如原子加、交换),通过硬件直接保证操作的不可分割性,避免软件锁的开销[^2][^3]。 #### 3. **重要性及应用场景** - **多核/多主设备系统**:防止多个处理器同时修改同一数据导致的不一致。 - **同步原语实现**:如自旋锁、信号量依赖原子性操作。 - **实时系统**:确保关键操作(如中断状态更新)的原子性[^3][^4]。 #### 4. **与其他原子操作的区别** - **软件原子操作**:依赖锁或CAS(Compare-and-Swap)指令,存在上下文切换开销。 - **硬件原子操作**(AXI5):直接由总线协议保证,延迟更低、可靠性更高[^3]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值