深入理解AMBA总线(十二)AXI突发传输和AXI控制信号

简介: 深入理解AMBA总线(十二)AXI突发传输和AXI控制信号

本篇文章给大家讲解AXI协议的读写时序以及AXI的一些控制信号。

1、AXI突发传输

1.1、AXI突发传输时序图

AXI总线是基于突发传输的,并且AXI的突发是只需要给一次地址信号即可,这样就免去了地址计算的逻辑。对于只存在给一个地址给一个数这样的传输场景,不建议使用AXI总线,APB即可。

以读突发传输为例,可以看到在T2的时刻AR通道握手成功,成功传输了地址信息。然后Slave就可以根据该地址信息返回相应的读数据,每次RVALID和RREADY握手成功的时候,返回了一个数据,称之为一次transfer,握手一次返回一次数,当返回最后一笔数据的时候,相应的RLAST也需要拉高,来表示最后一笔数据已经给出,整个Transaction到此结束。

之前已经说过,AXI支持Outstanding,在Master给出一个地址以后,可以紧接着再给出一个地址。即使第一个地址的数据还没有返回,这种情况的波形如下图所示:

我们再看一下突发写操作,同样的Master给出写地址,握手成功,然后给出写数据,当给出最后一个写数据的时候,WLAST拉高,然后B通道返回BRESP和BVALID,握手成功代表写transaction结束,通信完成。有一点需要注意,AXI3中给出了WLAST即可返回BVALID,但是AXI4中规定了,必须写地址通道握手成功了,也给了WLAST才允许返回BVALID,显然下面这个图满足了AXI4这个要求。这个实际上还是比较能够理解的,因为作为Slave,即便你已经收到了所有的数据,如果你没有收到相应的地址,你是不知道写往何处的,这个时候给出BVALID当然是不太合乎逻辑的。(此外虽然没有硬性规定写数据必须在写地址通道之后,但我建议还是最好这样设计,这样更符合直觉,和读也更加相对称)

1.2、AXI突发传输信号

看完了AXI的突发读和突发写时序图,我们进一步学习突发传输相关的信号,细心的读者可能发现了,上面的控制信号只给了地址信号,写数据大小,突发长度都没有体现,实际上面只是简化版本的,忽略了控制信号细节,以下为大家梳理一下,跟突发相关的控制信号总共是有以下三个信号。

首先是突发长度,AWLEN和ARLEN两个信号指定了每一笔突发传输有多少笔,对于AXI3,支持1~16笔transfer,分别对应000~111,对于AXI4,支持1~256笔transfer,分别对应00000000~11111111。

值得注意的是,对于写而言,该信号很多时候没什么用,因为WLAST才是真正的最后一笔写传输的标志,有些设计AWLEN甚至就是默认值,主机那边控制好WLAST即可,这种方法也可以,但不建议,WLAST按理说要和AWLEN对应好!

然后是突发数据大小,AWSIZE和ARSIZE两个信号,该信号用来标志传输的数据位宽哪些bit是有效的,一般是从低位开始算,比如ARSIZE为'b001的时候,则代表transfer的size为2Bytes。对应ARDATA[15:0]是有效的。

最后讲一下突发传输类型,AWBURST和ARBURST两个信号,AXI中一共支持三种类型,比AHB更简洁。

第一种类型为FIXED类型,顾名思义,地址固定,这个时候可能是普通的传输,即Burst length为1。也有可能是重复访问相同的地址,比如加载或者清空FIFO的情况。

第二种类型为INCR类型,这种情况下地址是递增的,支持非对齐访问。增加的地址大小和AxSIZE相关。

第三种类型为WRAP类型,这种情况地址也是递增的,但是增加到某个地址以后会回过头去访问,也就是回环,前面我已经讲过了。这种情况实际上是用来写Cacheline的,用在critical word first的模式下,因此它实际上是必须要对齐访问的,因为cacheline典型情况是64或者32byte,但CPU最着急写或者读的是其中的某个word,这种情况下就需要用到WRAP类型,因此它的Length一般也严格限制在2、4、8、16。对应着cacheline不同的块。

2、AXI其它的一些控制信号

这些控制信号不是必用的,取决于实际应用的场景,AXI提供这些信号作为额外的功能支持。

2.1、保护功能支持

分别是AWPROTARPORT,该信号为3bit,因此也提供了三种类型的访存保护(其实就是附带一些额外的信息,用来避免非法的transaction操作)。

AXPROT[0]用来区分是普通访存还是特权访存,如下图所示,比如操作系统这一块地址,普通的访存当然是不被允许的,一般是拥有较高的权限,才允许进行访存,体现在硬件上实际就是Normal access还是Privileged Access,这个时候就得借助该信号。

AXPROT[1]用来区分是Secure还是Non-Secure,如下图所示,Secure Region一般是内存中特别机密的信息,同理这也需要处理器的支持,只有Secure的程序才允许访问Secure Region。

AXPROT[2]用来区分是Instruction还是Data,这个用于区分CPU是取指令还是取数据,实际上用的很少,很多时候可能取得是指令,但是标明的是Data,ARM的官方手册也有这么一句话:This indication is provided as a hint and is not accurate in all cases. For example, where a transaction contains a mix of instruction and data items. It is recommended that, by default, an access is marked as a data access unless it is specifically known to be an instruction access。

因此对于该比特,大家选择性的使用即可,一般是用不到的。常用的就上面的[0]和[1]bit。

最后关于保护信号做一个总结,如下所示:

image.png

2.2、Cache支持

对于现代的SoC而言,Cache可以存在于SoC的很多地方,比如有以下场景:

  • 挨着处理器核(L2 Cache)
  • 在Interconnect内部
  • 靠近Memory控制器(L3 Cache)

正是因为系统中有了这些Cache,相应的也需要Cache相关的信号,来帮助我们存放数据到想要的位置或者从想要的位置取数据。(看懂这小节需要基本的Cache相关的知识,如果没有请去看计算机组成与设计第五章或同样类型的参考资料)

AXI对于Cache支持使用了AWCache和ARCache这两个信号,分别都是4bit,每个比特的含义如下所示。

AXCACHE[0]用来区分是Bufferable还是Non-bufferable,Bufferable即这笔Transaction是否可以存在于Buffer中,比如我要往某个地址写个数据,我是否必须真正的写在了那个地址,然后收到了response才算传输结束,还是写到Buffer中,收到了Response就算结束。

对于写外设操作而言,一般是不允许Bufferable的,因为你没有写入外设的寄存器,外设没有按照你的预期产生工作状态的改变,你就认为传输结束了,是不符合预期的。只有写一些数据的时候,比如计算的中间结果,这个时候对你写在哪里不太敏感,是允许Bufferable的。一般该信号只用在写上,因为读的时候该Buffer可能已经被覆盖掉了,不是想要的值了,当然也不绝对,看你的设计和替换方式是怎样了。

AXCACHE[1]用来区分是Cacheable还是Non-Cacheable,在AXI4中更改为Modifiable,这个Modifiable实际上更加好理解官方手册的说法是该比特用于决定实际的传输事务和你原本的传输事务必须是否相等,这么听起来可能有点抽象,以下是具体的实例。

以写为例子,比如你第一次是往地址0写,第二次是往地址1写,如果是Cacheable的,系统检查这两个地址的内存属性又是一样的,那么它就可以把你的写Merge到一起。

以读为例子,也就是可以进行指令预取(读一片指令),也可以进行多个transaction合并(比如连续几个连续的DDR空间),该比特需要和AXCACHE的[2][3]bit一起使用。

值得注意的是,这个是否可以Modifiable实际上也决定了是否允许写入Cache,如果不准Modify,那么就意味着你要么写入Buffer要么写入真正的目的地址,这样自然不涉及Cache了,因此该比特如果为低,代表你的访存操作和Cache没有关系。

AXCACHE[2]和[3]用来分别表示读分配和写分配,所谓的分配指的是我们什么情况下应该为数据分配cache line。cache分配策略分为读和写两种情况。当AXCACHE[2]为高的时候,代表需要读分配。如果读分配为高的话,AXCACHE[1]必须为高,因为你都不准Cacheable了,那自然不存在分配了。写分配也是同理。

读分配的含义是,如果是一次读传输,发生了miss,那么应该在cache中给它分配相关的Cacheline,这个过程叫做Cacheline fill,如下图所示。

当写Cache Miss的时候,才会考虑写分配策略。当我们不支持写分配的情况下,写指令只会更新主存数据,然后就结束了。当支持写分配的时候,我们首先从主存中加载数据到cache line中(相当于先做个读分配动作),然后会更新cache line中的数据,如下图所示,当出现写Cache Miss的时候,会先从主存加载数据到Cacheline,然后将要写的那一部分更新到Cacheline相应的位置(图中先Cacheline fill,然后写那个蓝色长方形的灰色格子)。

以下是该4bit可能的编码组合:

AXI还有很多信号,下篇文章再讲吧。对于这篇文章有不懂的可以问我,谢谢大家。

欢迎和我一起学习AMBA总线,完整的专栏在这里:

https://www.zhihu.com/column/c_1663245806869291008

目录
相关文章
ZYNQ-AXI总线的信号接口要求以及时序关系
ZYNQ-AXI总线的信号接口要求以及时序关系
571 0
ZYNQ-AXI总线的信号接口要求以及时序关系
|
存储 网络性能优化 vr&ar
深入理解AMBA总线(十七)AXI是如何提高性能的
深入理解AMBA总线(十七)AXI是如何提高性能的
1983 1
|
安全 物联网 数据安全/隐私保护
深入理解AMBA总线协议(AXI总结篇)
深入理解AMBA总线协议(AXI总结篇)
1536 1
|
芯片
深入理解AMBA总线(一)APB总线入门(上)
深入理解AMBA总线(一)APB总线入门
1068 0
|
SoC
深入理解AMBA总线(十六)AXI设计的关键问题(二)
深入理解AMBA总线(十六)AXI设计的关键问题(二)
819 0
深入理解AMBA总线(十六)AXI设计的关键问题(二)
|
网络性能优化
深入理解AMBA总线(十九)AXI4新增信号以及AXI4-lite
深入理解AMBA总线(十九)AXI4新增信号以及AXI4-lite
711 0
|
存储
深入理解AMBA总线(六)AHB-lite Slave响应和其它控制信号
深入理解AMBA总线(六)AHB-lite Slave响应和其它控制信号
797 0
|
vr&ar 内存技术
深入理解AMBA总线(十八)一个简单的AXI2SRAM设计
深入理解AMBA总线(十八)一个简单的AXI2SRAM设计
595 0
|
缓存 SoC
深入理解AMBA总线(八)AHB2APB同步桥设计
深入理解AMBA总线(八)AHB2APB同步桥设计
739 0
|
监控 Scala 虚拟化
深入理解AMBA总线(十三)AXI原子访问机制和AXI响应
深入理解AMBA总线(十三)AXI原子访问机制和AXI响应
703 0