数字集成电路设计-16-关于AXI协议

引言

AXI协议有可能是我们平时电路设计时经常遇到的一个协议,也是一个不错的协议,本小节我们就来熟悉一下。

乍一看,AXI协议的信号众多,眼花缭乱,容易发蒙。但其实其基本思想很简单。只要掌握以下几点:

1,valid/ready协议

axi协议是典型的基于valid/ready协议的总线协议。
valid/ready协议的优势就是master和slave的相对独立性比较好。
对于一次传输,作为master的发起方不用检查salve是否准备好,就可以将传输内容放到总线上;
同样对于接收方的slave来说,只要可以接收新的数据,就可以将ready信号放到总线上,也不用等待master发起传输。
valid/ready协议可以有效的将master和slave解耦合,也可以有效地减少‘传输握手’的开销。
这和一般的‘request/ack’串行协议不同。比如,AHB,APB,wishbone等片内总线协议。
由于valid/ready协议有上述优势,所以在实际的数字设计时被普遍采用,不仅用于片内总线,各个模块之间的数据交换,也可以采用valid/ready协议。
关于valid/ready协议,有一篇论文可以参考:
EECS150: Interfaces: “FIFO” (a.k.a. Ready/Valid)UC Berkeley College of Engineering
Department of Electrical Engineering and Computer Science

2,乱序

AXI协议是支持乱序传输的协议,也就是说master连续发起了两次传输,对于slave的应答顺序和master的发起顺序可以是不同的。AXI是如何实现乱序传输的呢?有两点非常重要,就是ID和并行。关于ID,我们需要引起足够的重视,在AXI协议的SPEC里面的信号列表里把他放在了第一个,可见这个ID的重要程度。可以这么说,没有ID这个信号,就不能实现乱序。此外,在实际应用中,ID还可以承担除了‘乱序’这一重要任务外,其它重要的任务。比如可以把来自不同CPU的信息放在ID里面等等。。。。。。当然也可以把所有额外的信息放到USER信号来承担,但考虑兼容性,放到ID里面会好一些。

3,并行

关于并行,‘通道分离’是并行能实现的潜在基础。

通道分离,很容易理解,指的是AXI将不仅将读写操作分开了,而且将读写操作用到的信息分成了不同的通道。

写操作分成了3个通道,读操作分成了2个操作。

说到这里,有一点需要提醒一下:从哲学角度来说,读操作和写操作是对称的,是对等的,一写一读,一去一回,没有读哪来写,没有写何必读,就好像太极图里面的一黑一白,多么的和谐与对称。为什么AXI协议里写操作有3个通道,读操作却只有2个通道,这是明目张胆的对读操作的歧视啊!这是为什么呢?

我认为可以从两个角度来解释?

首先,可能和一致性相关。resp通道的一个重要的责任就是解除一致性(WAW,WAR,RAW),试想如果把读操作的rdata和rresp拆分成两个独立的通道,又有什么奇葩的情景下中会出现后面的写操作还没有得到读操作返回的数据就可以解除一致性呢?!!也就是说即使应读操作的强烈要求,将其也分成3个独立的通道,也不会出现rdata和rresp异步的情况,既然拆分出来的两个通道都是同步的,那么就没有必要拆分了。

其次,可能和哲学有关,读写看似平等,实际上却存在不平等,比如有WAW依赖,却没有RAR依赖,世界本来就是不平等的,你读操作何必一定要和写操作处处平等,把你和写操作拆分开就已经是高看你了,实在不爽的话,就把读写放到一起,就变成了低速,高耦合度,串行,不能乱序的协议啦,比如AHB,APB或者wishbone。

合则串行,分则并行,是合是分,合则慢,分则快,自己选吧。

当然也不是说‘合’就一无是处,‘合’会大大降低信号的数量。

是追求传输速度还是追求信号线数目少,自己选吧。

4,依赖

说完并行,再说依赖。并行和依赖也是一对矛盾。

从大的角度来看,对于读/写,大多数情况下可以认为是并行的,但是读写的地址存在冲突时,读/写又存在依赖。

从小的角度来看,单纯对于写操作,AW、W、B三个通道从形式上看是独立的并行的,但是三个通道在逻辑上又存在一定的依赖。

比如,master的W通道的写数据允不允许比AW通道的写地址先发到总线呢?允许可以,不允许也可以。

如果不允许,W通道的ID信号是否可以去掉不用呢?答案是可以去掉,只要保证去掉之后WDATA发到总线上的顺序和AW通道的数据发到总线上的顺序一致就可以,而这个保证很容易做到。

slave的B通道上的valid允不允许比AW和W通道上的valid早发出去呢?

很显然是不允许的,试想,slave还没有接收完数据就告诉master你接收完了,不出错才怪。

当然,什么事情都不是绝对的,如果在AXI标准协议的基础上再对master和slave增加一些约束,slave的Bvalid也是允许比AW和W两个通道的valid早发出去的,这就是ARM A9中使用的对于写操作的奇葩的‘Early resp’。

5,barrier传输

其实,标准的AXI4里面并没有barrier传输,在ACE协议里面才有,ACE是针对多核系统的一致性总线协议。

但是有时候,单核的系统中对barrier传输的需求也是很迫切的(比如CPU需要和DMA设备同步时),但是有不想全面支持ACE协议,怎么办呢?

可以单纯引入ACE中的‘bar’信号。

对于barrier。需要搞清楚两点即可:

第一,什么是barrier之前的操作,什么是barrier之后的操作;

barrier之前的操作是指,各自通道(AW/AR)上的barrier信号有效之前所发出的操作。barrier之后的操作是指,各自通道上resp(bresp/rresp)返回之后所发出的操作。这里需要注意的是,有一些操作是在‘barrier信号发出之后,resp信号回来之前’发出去的,他们既不属于barrier之前的操作,也不属于barrier之后的操作,属于什么呢?他们就是所谓的‘outstanding 操作’。

第二,memory barrier和synchronization barrier的区别是什么。

关于memory barrier和synchronization barrier,我的理解是:

memory barrier的要求是,以barrier这条命令的resp信号回来为界线(不考虑outstanding的话),保证它后面发的命令能看到前面发的命令的结果即可。
system barrier的要求是,以barrier这条命令的resp信号回来为界线,要保证它前面发出的命令要彻底完成,即不能只被cache下来。
举两个可能的使用场景:
memory barrier:
一个物理CPU(可以多个逻辑核)上面跑了两个线程,其中一个线程(A)更新一个数组,更新完成之后需要告诉另外一个线程(B),线程B读更新之后数组的值。
对于这种场景,线程A更新完数组之后,发一个memory barrier命令就能保证线程B能读到更新后的值。
system barrier:
一个物理CPU(可以多个逻辑核)上面在跑一个线程,这个线程更新一个数组,更新完之后需要告诉VPU,VPU读更新之后的数组的值。
对于这种场景,CPU上面的那个线程更新完数组之后,发一个system barrier命令才能保证VPU读到更新后的值。如果只发一个memory barrier命令,最新的值可能被缓存在L1/L2 cache中,导致VPU读到旧值。

6,小结

总之,AXI是一个很不错的协议,但是在使用过程中要有自己的想法,可以适当做一些变通。

毕竟,协议是ARM定的,但电路是你自己设计的。鞋子合不合脚,只有你知道的最清楚。

7,附录 AXI4 Vs ACE

时间: 2024-11-09 04:34:00

数字集成电路设计-16-关于AXI协议的相关文章

数字集成电路设计-19-pipeline的写法

引言 之前,我们介绍了数字设计中一些基本组合逻辑的写法(http://blog.csdn.net/rill_zhen/article/details/39586191)以及状态机的写法(http://blog.csdn.net/rill_zhen/article/details/39585367),本小节我们通过一个小实验来熟悉一下pipeline的写法. 在多数的资料和教课书中提到pipeline时,大多只是解释概念,很少介绍其具体RTL实现的,给人一种高达上的感觉.有的资料中会提到具体写法,

数字集成电路设计-12-状态机的四种写法

引言 在实际的数字电路设计中,状态机是最常用的逻辑,而且往往是全部逻辑的核心部分,所以状态机的质量,会在比较大的程度上影响整个电路的质量. 本小节我们通过一个简单的例子(三进制脉动计数器)来说明一下状态机的4中写法. 1,模块功能 由于我们的目的在于说明状态机的写作方式,所以其逻辑越简单有利于理解.就是一个简单的脉动计数器,每个三个使能信号输出一个标示信号. 2,一段式 状态机的写法,一般有四种,即一段式,两段式,三段式,四段式.对于一段式的写法,整个状态机的状态转移.转移条件.对应状态的输出都

数字集成电路设计经验技巧分享

废话不多说,直接贴出电路及电路设计经验技巧大合集84个资料的文件列表,太多了,只显示一部分吧,有需要的朋友可以到闯客网技术论坛下载,同时可以加入我们的技术交流裙:613377058,无偿共享,在线解答各种技术问题.资料链接:https://bbs.usoftchina.com/thread-206874-1-1.html 文件列表:BUCKBOOST电路原理分析.docxCAN总线接口电路设计注意事项.docxDC-DC升压电路.docxFPGACPLD数字电路设计经验分享.docxMIC电路工

数字集成电路设计-20-multi-cycle

引言 前面我们介绍了流水线的写法(http://blog.csdn.net/rill_zhen/article/details/45980039),流水线是数字设计中很常用的一种设计方法,可以提高运行频率,提高吞吐量. 如果组合逻辑延迟较大,一个时钟周期完成不了时,除了插入寄存器将组合逻辑拆分成流水线外,还可以采用multi-cycle的方式. multi-cycle的工作机制很简单,从给定输入之后,等待多个周期之后,再去采样输出结果. 本小节我们将通过一个小实验来说明multi-cycle的具

数字集成电路设计-13-常用模块集锦

引言 C语言,C++语言等软件编程语言吸引我们的一个很重要的原因是他们都能提供非常丰富的函数库供我们使用,大大提高coding的效率. 但是像verilogHDL等HDL语言这方面做的比较弱,尤其是可综合的语法,基本没有通用的模块库供我们使用,所以编码效率会比较低.如果我们把平时经常使用的一些模块积累起来,慢慢的标准化,这样以后我们再设计新的电路时,就会方便很多,今天就是开始. 1,判断两个信号是否相等 function Fcompare; input valid_a,valid_b; inpu

数字集成电路设计-18-UVM

引言 UVM(Universal Verification Methodology)可以理解为形而上的东西,可以理解为是基于System verilog的一个库,提供一些API调用. 其实没必要把UVM抬的那么高,上升到形而上的层次.因为在实际的IC验证时,对某个复杂DUT的验证时,一般都会拆分成那几个模块. 要对DUT测试,肯定需要先产生测试用例,就是UVM中的sequencer和sequence概念. 产生测试用例之后,肯定需要把测试用例送到DUT端口上,作为激励,就是UVM中的driver

国家明确规划重点软件和集成电路设计领域

关于印发国家规划布局内重点软件和集成电路设计领域的通知 发改高技[2016]1056号 各省.自治区.直辖市及计划单列市发展改革委.工业和信息化主管部门.财政厅(局).国家税务局.地方税务局: 为贯彻落实<国务院关于印发进一步鼓励软件产业和集成电路产业发展若干政策的通知>(国发[2011]4号),按照财政部.国家税务总局.发展改革委.工业和信息化部<关于软件和集成电路产业企业所得税优惠政策有关问题的通知>(财税[2016] 49号)要求,现就国家规划布局内重点软件和集成电路设计领域

集成电路设计流程分工

推荐一下本人的原创博客专栏:SoC嵌入式软件架构设计 谢谢! 正规的集成电路设计公司在进行片上系统(SoC)设计时都有明确的岗位分工,甚至会以部门的形式来区分各部分的职责,而且很多时候集成电路设计公司还会提供整体解决方案,包括芯片.软件和硬件,生产商直接按这个方案买其他的电阻电容等元器件即可生产.测试和销售.整体解决方案分工如下: 1.  市场:负责产品规格调研.产品规划.产品经理负责项目立项. 2.  System design系统设计:制定产品规格,系统设计,模块级的FPGA验证. 3.  

Tanner Tools v16 Win64 1CD集成电路设计环境

Tanner Tools Pro是一套以布局为主的软体(L-Edit, L-Edit/DRC, L-Edit/Extract),配合电路图的绘图输入软体(S-Edit) 与电路层次的模拟软体(T-Spice ),构成了一套IC设计系统. Tanner Tools Pro工具,它可提供完整的集成电路设计环境,帮助初学者进入VLSI设计领域.  Tanner Tools Pro工具非常 适合初学者学习,它从电路图设计.电路分析仿真到电路布局环境一应俱全.本书针对VLSI设计实习课程设计多个实验,读