深入理解AMBA总线协议(AXI总结篇)

AXI总线已经是AMBA总线中最常见,使用最频繁的总线,并且没有之一。

可以说AXI总线已经成为了片上总线中最重要的协议,本篇文章打算花一些篇幅,帮大家总结一下AXI总线的学习重点、学习难点,以帮助大家更好更快的掌握AXI总线。

一、什么是总线(Bus)

1.1、什么是片上总线

要理解AXI总线,首先要理解什么是总线。大家刚接触总线的时候千万不要纠结于具体的概念,可以简单的理解成几根线按照规定的方式通信即可。

对于芯片设计而言,可以简单的理解,总线就是一组通信规范,允许系统中不同组件之间进行传输。

AMBA总线,包括AXI属于片上总线(On-chip Bus),它用于芯片内部中各个模块之间的通信。

总线可以简单的分为设备之间的总线和片上总线。其中设备之间的总线有时候也可以叫做传输接口,比如最常见的UART串口,硬盘的PCIE、SATA接口。显示器的HDMI接口,电脑的USB、Type-C接口等。这些传输接口往往更注重设备的电气特性、稳定性。这是另外一套大的话题,后面可以单独开个专题讲一些常见的传输接口。

而另外一种总线就是我们今天要聊的话题,片上总线。所谓片上总线。顾名思义,就是同一个芯片上(一般指SoC系统),各个模块(IP核)之间的数据通信方式。比如大家都设计好了自己的模块,要集成在一个芯片上。如果都能满足类似的通信方式或者接口,那集成起来就非常的方便,其实片上总线的规范制定也是考虑到可扩展性。一般片上总线要满足以下的标准:

对频率和数据吞吐量有较高的要求

扩展性强,能够很方便扩展更多模块

常见的片上总线有Wishbone(部分MIPS芯片使用)、Avalon(Altera芯片会使用)、Tilelink(UCB用在其RISC-V项目中)、AMBA(绝大多数SoC会使用)。

1.2、总线中常见的名词和组件

接下来我们谈谈总线中常见的组件。以下说的这些概念和机制对任何常见的片上总线都是成立的。

首先是Master和Slave。前面已经说到了,总线是用来进行数据传输用的,那么既然是数据传输,必然有发起方和接收方。一般我们称之为Master和Slave。

在这里插入图片描述

对于命令而言,是由Master发给Slave,而数据可以是双向传输的。比如可以是Master写给Slave,也可以是Slave返回数据给Master,甚至还可以是两者都有。Master和Slave的区分关键在于命令(这次传输)是谁发起的。

除了Master和Slave,总线中一般还包括哪些组件呢?比如有多个Slave的时候,那么自然要确定你的命令是发给哪个Slave的,这个时候我们就需要地址译码器。而当Slave返回数据的时候,Master需要知道是哪个Slave回的数据,因此还需要MUX选择器。
在这里插入图片描述

如果我们有多个Master的时候,就需要仲裁器来选择到底是哪个Master可以发起某次通信,上述的这一套仲裁译码等机制,可以组合在一起,构成片上互联(Interconnect)。所谓的互联,可以理解为把所有模块的通信集成在一起。基于互联系统可以完成Master对Slave的访问而不用在乎互联的内部实现细节(对于IP设计者而言)。

1.3、什么是AMBA总线

AMBA全称Advanced Microcontroller Bus Architecture。即高级微控制总线架构。首先高级是针对那个年代而言的,其实也没有多高级。然后是Microcontroller,微控制器,可以知道它最初是用在微控制器上,实际上就是ARM自己的处理器上。然后Bus Architecture,即总线架构。

AMBA协议是一个公开标准的片上芯片互联协议。(AMBA没有版权费,大家都可以使用,协议都是公开的)

提供接口标准使IP可以服用(IP reuse,加速设计和集成)

移动领域和物联网领域使用最广泛的片上总线,没有之一(桌面领域我不清楚)

然后我们看一下AMBA的发展历史,对于大家来说,学习APB、AHB和AXI就行。我相信如果大家已经学习到ACE和CHI了,也不用看我这篇文章了。而最最重要的就是AXI。

在这里插入图片描述

二、AXI总线的学习路线

大家有了总线的基本概念以后,便可以开始学习AXI总线,以下是我推荐的AXI总线的学习路线。

2.1、第一阶段:带着问题去看源文档

学习AXI总线之前,首先我们要知道为什么会出现AXI总线,即它设计之初是为了解决什么问题的,没有AXI总线会怎么样?

AXI总线是ARM公司在其第三代AMBA中推出的,称之为AXI3.0,有时候也可以叫做AXI1.0。其设计的目的是针对高性能、高时钟频率的系统设计,用于在这些场景替代AHB协议的。针对这一特点,我们可以思考一下,为什么AXI的性能就高了?为什么AXI可以跑到较高的时钟频率?

带着这一问题去看协议,就可以明白AXI提高性能最主要的因素是因为,AXI是读写通道分离的,其作为全双工的协议,自然比AHB这样的半双工协议快,此外AXI是基于握手机制的,并且通道之间的握手没有1T cycle delay的要求。因此这么多复杂的东西不需要一个时钟周期就全部算完,可以插入寄存器逻辑,自然可以提高主频。

类似的点还有很多,我帮大家总结了一下,大家可以先带着这些问题去思考,然后去看AXI协议,知道这些信号设计的目的是什么,即使协议看不太明白,也不至于不清楚为什么要有这个东西。这种感觉就像之前学数学课,即使你看不太明白推导,但也不至于完全不清楚为什么要有这个东西。

如何提升主频以及保证数据安全?->AXI的握手机制

数据不是顺序回来的怎么办、想多发几个命令出去怎么办?->AXI的Out of Order、Outstanding、ID机制

现代多核处理器中的数据一致性如何保证?->AXI的原子访问机制和Response相关信号

非对齐访问如何实现?->AXI支持非对齐访问

现代处理器中往往有Cache和Buffer,AXI怎么支持?->AXI的Cache信号

现代处理器往往有特权访问、安全访问等机制,AXI如何支持?->AXI的PROT信号

大家带着这些问题,然后去看文档,边看边思考。理解AXI为什么要设计这些信号,先不用在意实现细节,具体哪些比特代表啥,先知道有这么一回事就行。并且边看边补充一些计算机组成原理和操作系统相关的知识,这是第一阶段。

2.2、第二阶段:自己动手设计简单的AXI IP模块

在完成第一阶段以后,基本都会对AXI协议有个初步的了解,但毕竟纸上得来终觉浅,绝知此事要躬行。完成AXI协议的了解以后,应该自己动手去设计具有AXI接口的Master和Slave。

不一定要特别复杂。这里建议可以从最简单的AXI-lite开始,设计一个AXI-lite的从机,然后可以通过AXI-lite给它配置相应的寄存器。配置寄存器这一部分可以在TB里面完成。

然后可以设计一个相对复杂点的AXI-full的Slave,比如AXI2RAM模块,该模块可以支持突发乃至Outstanding,甚至可以支持乱序,完成该模块以后工作中再遇到AXI-Slave设计,至少心里不会虚,并且面试基本可以应付大部分问题了。

最后可以再设计一个AXI Master,从主机和从机两个不同的维度深刻理解AXI协议的通信机制,这个主机同样的也可以支持Outstanding乃至乱序。这里建议设计一个AXI DMA,非常的锻炼人。

上述的这些模块设计可以去网上如github找些开源的AXI IP,参考别人的设计理念,然后再自己动手做,毕竟能一次自己做出来,基本上是不可能的。

2.3、第三阶段:学习AXI接口验证以及AXI互联IP

首先说AXI接口验证,其实工作中大家写完了AXI的IP,并不知道是否符合AXI的通信要求,很多公司可能会用VIP,能给各种AXI的激励,然后大家根据自己IP的结果判断设计的是否合理。大家可以想一想这个VIP到底是怎么设计的,如果让你来设计,你会怎么做。

然后是AXI互联IP,前面已经说过什么是互联了,由于总线互联非常复杂并且非常重要。实际上大多数公司会采用买总线互联IP的方式。大家可以自己动手设计一个简单的互联IP,让自己设计的Master和Slave挂在上面,然后看能否建立通信,如果没问题的话,可以进一步的学习如何使用第三方IP,比如典型的NIC400。

三、一些AXI面试常问的问题

最近移知对AMBA课程进行全面升级,打磨了《AMBA进阶之AXI总线实战》课程。本人非常有幸受邀移知教育参加它们的课程体验官活动,有幸成为了AMBA-AXI课程的首席体验官。该课程基本符合我推荐的AXI学习路线。并且给大家解决了AXI学习中会碰到的疑难问题。

课程系统全面解读AXI总线协议,帮助学习者快速定位到具体实际问题,解决面试和实际项目中常见难题,如outstanding机制、握手机制原则、out of order机制,死锁问题等。

在协议的理解基础上,提供Masrter和Slave的设计案例模块,通过循序渐进的方式,理解RTL源代码,掌握AXI接口的视线。

在这里插入图片描述
在这里插入图片描述

目前秋招已经开始了,关注我的很多都是学生朋友,大家学习AXI的目的可能也是为了吊打面试官,找到满意的工作。下面给大家分享一些我之前参加面试以及我面试别人,常问的一些AXI相关的问题。

AXI和AHB的区别在哪里,为什么AXI相比AHB有明显的性能优势?

AXI3和AXI4的区别在哪里?

Exclusive访问是什么?它的实现机制是什么?相比于Lock Access的优势是什么?

AXI的outstanding数量如何计算?

Burst中的WRAP类型,如何计算上下界地址?

AXI哪些情况可能出现死锁,如何避免此问题?

AXI Stream中如何进行反压?

AXI中各个Channel之间的依赖关系是什么?

如何计算AXI最大传输带宽?

Interleave和乱序的区别是什么?

AXI的Out of Order应该怎么去实现?

如果大家能把上述的问题都答出来,那恭喜大家,AXI已经掌握的很好了。去参加面试这部分的内容不会成为你的障碍了。如果仍然有不会的,那还需要继续学习。

大家加油,祝大家早日掌握AMBA总线!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/60806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WevSocket(java基于注解实现)

一、概述 本文基于spring-boot-starter-websocket简单的完成收发信息功能,使用注解形式进行实现。 二、相关配置 spring:2.0.2,jdk:1.8.202,maven:3.3.9 因为spring和maven有版本匹配的要求,请大家注意自己的版本是否匹配 三…

IDEA使用Docker插件

修改Docker配置 1.执行命令vim /usr/lib/systemd/system/docker.service,在ExecStart配置的后面追加 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:…

如何将电子画册生成二维码,扫码查看产品图册?

随着移动互联网的发展,二维码已经成为了人们生活中不可或缺的一部分。无论是支付宝、微信支付的扫码支付,还是商家的促销活动、产品包装上的二维码,都展示了二维码的广泛应用。 电子画册也果不其然,它也可以生成二维码&#xff0c…

数据通信——传输层TCP(可靠传输原理的ARQ)

引言 上一篇讲述了停止等待协议的工作流程,在最后提到了ARQ自动请求重传机制。接下来,我们就接着上一篇的篇幅,讲一下ARQ这个机制 还是这个图来镇楼 ARQ是什么? 发送端对出错的数据帧进行重传是自动进行的,因而这种…

leetcode316. 去除重复字母(单调栈 - java)

去除重复字母 题目描述单调栈代码演示进阶优化 上期经典 题目描述 难度 - 中等 leetcode316. 去除重复字母 给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对…

完美解决xinput1_3.dll丢失问题,修复xinput1_3.dll文件

在电脑游戏中经常遇到xinput1_3.dll丢失的问题,这个问题是因为系统缺少该文件而引起的。而且,这个问题很容易导致游戏无法正常运行,给玩家带来很大的烦恼。在本文中,我们将详细介绍如何修复这个问题,给大家详细的说明多…

前端js后端nginx+php+workerman实现websocket通信

workerman是纯PHP开发的开源PHP 应用容器,可以通过composer安装,目前因为要用到客户端与服务器实时通信,故使用了workerman中的websocket模块功能 服务器端: 1.建一个目录,创建start.php文件,文件名随意 …

人人必学的微信群变现打造课,让你的私域营销快人一步

标题:私域营销进阶之微信群变现课,助你快速实现营销目标 引言: 随着互联网的发展,私域营销成为了许多企业和个人推广和销售的重要方式。在私域营销中,微信群作为一个具有密集社交关系和高度互动性的平台,成…

【Golang】go条件编译

交叉编译只是为了能在一个平台上编译出其他平台可运行的程序,Go 作为一个跨平台的语言,它提供的类库势必也是跨平台的,比如说程序的系统调用相关的功能,能根据所处环境选择对应的源码进行编译。让编译器只对满足条件的代码进行编译…

ERROR: Failed building wheel for PyECLib

ERROR: Failed building wheel for PyECLib 具体原因 error: liberasurecode.so.1: cannot open shared object file: No such file or directory 解决方案 安装 liberasurecodehttps://opendev.org/openstack/liberasurecode Install dependencies Debian/Ubuntu hosts: …

uniapp的 picker 日期时间选择器

效果图&#xff1a; dateTimePicker.js function withData(param){return param < 10 ? 0 param : param; } function getLoopArray(start,end){var start start || 0;var end end || 1;var array [];for (var i start; i < end; i) {array.push(withData(i))…

说说构建流批一体准实时数仓

分析&回答 基于 Hive 的离线数仓往往是企业大数据生产系统中不可缺少的一环。Hive 数仓有很高的成熟度和稳定性&#xff0c;但由于它是离线的&#xff0c;延时很大。在一些对延时要求比较高的场景&#xff0c;需要另外搭建基于 Flink 的实时数仓&#xff0c;将链路延时降低…

jmeter传参base64卡顿如何解决

部分接口需要传图片base64格式参数&#xff0c;但是输入转为base64格式的图片参数&#xff0c;jmeter直接卡死&#xff0c;甚至电脑也卡死&#xff0c;此时&#xff0c;只需要去掉文件头描述&#xff1a;data:image/jpeg;base64, 即可

[Linux]进程

文章目录 1. 进程控制1.1 进程概述1.1.1 并行和并发1.1.2 PCB1.1.4 进程状态1.1.5 进程命令 1.2 进程创建1.2.1 函数1.2.2 fork() 剖析 1.3 父子进程1.3.1 进程执行位置1.3.2 循环创建子进程1.3.3 终端显示问题1.3.4 进程数数 1.4 execl和execlp函数1.4.1 execl()1.4.2 execlp(…

测试理论与方法----测试流程的第二个环节:测试计划

二、软件测试分类与测试计划 1、软件测试的分类(理解掌握) 根绝需求规格说明书&#xff0c;在设计阶段会产出的两个文档&#xff1a; 概要设计(HLD)&#xff1a;设计软件的结构&#xff0c;包含软件的组成&#xff0c;模块之间的层次关系&#xff0c;模块与模块之间的调用关系…

小程序密码显示与隐藏的实现

默认密码隐藏起来&#xff08;显示为点&#xff09;&#xff0c;后面的图标是闭眼&#xff1b;用户点击图标后&#xff0c;图标变成睁眼&#xff0c;同时把密码明文显示出来&#xff1b;如此循环 Page({data: {passwordType: true, // 切换是否密码框show_pass: false // 是否…

镜之Json Compare Diff

前言 “镜” 寓意是凡事都有两面性,Json 对比也不例外! 因公司业务功能当中有一个履历的功能,它有多个版本的 JSON 数据需要对比出每个版本的不同差异节点并且将差异放置在一个新的 JSON 当中原有结构不能变动,差异节点使用数组对象的形式存储,前端点击标红即可显示多个版本的节…

Ubuntu20.04如何更换国内源-阿里云源

1.备份源文件 cp /etc/apt/sources.list /etc/apt/sources.list.bak 2.打开源文件&#xff0c;注释默认的源 vim /etc/apt/sources.list ## 注释原本内容 # deb http://mirrors.ivolces.com/ubuntu/ focal main restricted universe multiverse # deb-src http://mirrors.ivolc…

pandas由入门到精通-数据清洗-分类数据

pandas-02-数据清洗&预处理 E. 分类数据1. 适用情况2. Categorical 扩展数据类型2.1 通过astype将一个Series转化为Categorical类2.2 通过pd.Categorical 生成Categorical类2.3 通过pd.Categorical.from_codes 将标签列表和整数列表转化为Categorical类2.4 Categorical类的…

Django(7)-项目实战-发布会管理

登录功能 模板页面 sign/templates/index.html <!DOCTYPE html> <html> <head><title>Login Page</title> </head> <body><h1>发布会管理</h1><form action"/login/" method"post"><la…