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

2023-11-03

本篇文章给大家讲解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官方的文档描述;

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解AMBA总线——AXI原子访问机制和AXI响应 的相关文章

  • 华为OD机试 - 计算礼品发放的最小分组数目(Java)

    题目描述 又到了一年的末尾 项目组让小明负责新年晚会的小礼品发放工作 为使得参加晚会的同事所获得的小礼品价值相对平衡 需要把小礼品根据价格进行分组 但每组最多只能包括两件小礼品 并且每个分组的价格总和不能超过一个价格上限 为了保证发放小礼品
  • vue 和 js 获取 dom节点下的某个元素,然后设置样式

    vue获取dom节点下的类名 然后修改样式 div div class a 提到岁月 你们总说它是长河 流得头也不回 div div class a 少不更事的年纪 我也用过老成口气 念过孔夫子的 逝者如斯乎 不舍昼夜 div div cl
  • 手写数字识别——算法

    识别方法一 基于结构模式 脱机识别 例子 基于基元和七段式数字的手写数字识别 日常生活中经常可以看到用七段式数字表示数字 如电子手表的数字显示等 它用火柴棍拼图的方式能够简单有效的表示出0 9 10个阿拉伯数字 例子 基于三次样条和整体特征
  • css img自适应盒子尺寸

    首先保证图片可以填满 然后纵向居中 img cantainer position relative width 260px height 150px overflow hidden img position absolute top 50
  • 最详细的Java入门完整教程,学Java先收藏了!

    从 1995 年第一个版本发布到现在 Java 语言已经在跌宕起伏中走过了 26 年 最新的 Java 版本也已经迭代到 Java 16 java是有一个庞大的生态系统 它的覆盖范围非常广 而且已经连续十几年位居开发语言的榜首 所以java
  • 浅度学习模块化与解耦

    目录 1 为什么要模块化 2 模块设计原则 3 模块化开发的的优缺点 4 解耦与通信 4 1 公共模块的下层 4 2 面向接口调用 4 3 面向协议的调用 在开篇之前引用一句话 一派是说app开发并不需要什么狗P架构 第二派说我们有自己NB
  • 圈圈教你玩转USB第三版 光盘资料

    下载官网 http service buaapress com cn mzs file detail id 2199 key b2fec916cc9fa216abe6fc836e3f7e35
  • Swift中的‘open‘关键字是什么?

    本文翻译自 What is the open keyword in Swift The ObjectiveC swift file from the standard library contains the following few l
  • C语言基础代码(1)

    C语言是计算机及其相关专业学生必修的语言 我在大一下学期就已经学习了 前段时间 我又将谭浩强编写的C程序设计 也就是我C语言学习的课本看了一遍 温故而知新 受益良多 于是就萌发了一个想法 想将C语言学习当中一些基础的代码做一个总结归纳 在总

随机推荐

  • 牛客专项练习之设计模式

    开头先一句水平有限 仅供参考 有错误可以提醒我改一下 感谢 1 如果需要一个语言解释执行 并且可以将语言中的句子表示为一个抽象语法树的时候 对效率要求不高的情况下 应该选择何种设计模式 题目中的解释二字就告知选项 解释器模式 给定语言 定义
  • Nginx额外篇之一些错误解决办法

    错误1 配置了Nginx 但是打开页面是乱码 解决办法如下 在你个人的sever端添加如下2行 default type text html 设置内容输出内容型为 html htm shtml 三种类型 charset utf 8 设置字符
  • java导出word,红色的单元格背景色显示为黑色

    之前有这个问题 当我用正版office看导出word文件的时候 单元格背景是红色 当我换wps看导出的文件的时候 单元格背景是黑色的 离谱 所以我当初为了省事直接和客户说 请使用正版office 狗头 然后今天闲着没事情 再看ftl模板的时
  • 001问

    偶然间 我的好朋友问起我这个问题 我还真没有好好思考过这个问题 我查了Go语言圣经 知名博客 以及Go中文文档 发现都没有阐述这个问题 后来找来找去也只有下面的解释 for的初始化语句不能是任何类型的语句 必须是 简单语句 短变量声明 就是
  • Th5.6:智能指针(unique_ptr)之详述1

    本小节学习的知识点分别是智能指针 unique ptr 之详述 常用操作 今天总结的知识分为以下2个大点 1 unique ptr概述 常用操作 1 1 常规初始化 unique ptr和new配合 1 2 make unique 函数 2
  • 转:idea中language level设置

    一 idea中项目的language level的含义 language level指的是编译项目代码所用的jdk版本 那么 从这个定义出发会有两个小问题 第一 如果project sdk是jdk8 那么language level应该是多
  • 在顺序表中插入元素_C语言 一看就懂

    一看就懂的数据结构带注释 数据结构 在顺序表中插入元素 C语言版 头文件和定义结构体 include
  • ECOLOGY 9.0 新增SAP批量选择功能并将数据填充到明细表

    需求来了 在明细表一的抬头处增加SAP多选功能 如下图 1 打开明细表一 2 打开集成按钮 3 右键后 点击批量编辑 4 点击明细表1后 继续点击多选浏览按钮配置SAP接口 5 配置SAP接口函数 6 字段配置完了后 勾选要显示的字段 不然
  • Qt 判断信号是否绑定了

    本文介绍Qt的信号是否被连接了和信号槽之间的参数是否一致的判断方法 1 判断信号是否正确连接 通过判断connect的返回值是否为true 1 bool ok connect this SIGNAL signal1 this SLOT sl
  • 如何选择云上业务的安全防护产品?

    古人云 没有绝对的安全 只有相对的安全 云计算作为业务的部署方式 已经逐渐被人们所接受 云模式也逐渐成为很多企业的重要选择 如何保证云上业务系统的安全 已经成为每一个上云企业必须要面对的问题 作为一个对安全技术不是那么专业的运维管理人员 如
  • 图片识别工具Tesseract介绍和python搭配使用

    Tesseract介绍和Python的搭配使用 一 Tesseract介绍 下载指南 1 了解Tesseract工具 2 下载地址 3 请注意 二 环境搭建 2 1 版本3 05安装 2 2 最新版本安装 2 3 环境搭建 2 4 举个栗子
  • Keil5 出现error: #28:expression must have a constant value的解决办法

    我们在进行编译的时候可能会出现下图的错误 出现这种错误的话 可能是以下两种问题情况 1 可能是在对变量应用的时候没有进行先声明后调用 这是编译器自身的问题 我们可以去Options for Target 选择C C 再勾选C99 Mode就
  • SQL 增、删、改、查基本语法

    create table student stid int primary key auto increment stname VARCHAR 20 stbirth DATE auto increment 1000 插入数据 insert
  • mysql下载地址

    点击下载
  • Java赛马程序

    编写一个多线程的控制程序 称为赛马程序 创建分别代表两匹马的两个线程 并将它们设置为高低不同的优先级 并以进度条的形式显示赛马过程 没几天Java要考试了 紧急学习一下再把之前参考 10条消息 Java多线程 进度条实现赛马实验 shall
  • 贪心算法:55.跳跃游戏(C++)

    class Solution public bool canJump vector
  • Ubuntu设置脚本、程序开机自启动

    Ubuntu设置脚本 程序开机自启动 方法1 修改 etc rc local 方法2 用update rc d命令添加开机执行脚本 方法3 使用 crontab 方法4 使用 systemd 服务 Centos 注 方法1 修改 etc r
  • 提交表单区别

    html按钮有两种
  • C++内存管理

    http blog csdn net zhanghefu article details 5003383 内存管理是C 最令人切齿痛恨的问题 也是C 最有争议的问题 C 高手从中获得了更好的性能 更大的自由 C 菜鸟的收获则是一遍一遍的检查
  • 深入理解AMBA总线——AXI原子访问机制和AXI响应

    本篇文章给大家讲解AXI协议的原子访问机制 1 Atomic访问机制 1 1 Atomic信号 众所周知 操作系统的很多机制需要底层硬件的支持 如并发 虚拟化等 随着多处理器的流行 arm也自然而然的要做其总线上加入和并发相关的信号 以满足