一 ,AXI简介
介绍AXI之前,要知道ARM AMBA(Advance Microcontroller Bus Architecture),这是ARM在1996年提出的一个微控制器的片上总线协议,大家熟悉的AHB或APB等总线协议都是AMBA的一部分,而AXI在AMBA 3.0版本成为该协议的一部分,目前Xilinx的7系列FPGA中用的是AMBA 4.0版本中的AXI协议,所以你会看到Vivado中带AXI接口的IP介绍都是AXI4打头。它们的关系如下图所示:
AXI4总线有四种类型:AXI4、AXI4-Lite和AXI4-Stream。
AXI4用于高性能内存映射(Memory-Mapped)型的通信上。
AXI4-Lite用于简单低吞吐量的内存映射型通信上(比如简单的寄存器读写)。
AXI4-Stream用于高速的数据流传输,无需地址管理。
二 ,AXI 读写通道
AXI引入了通道,即Channel这个概念,AXI 总线共有 5 个独立的通道,
其中 2 条用于读取传输事务
- 读地址
- 读数据
另 3 条用于写入传输事务
- 写地址
- 写数据
- 写响应
首先,5个通道都具有的同一类信号:VALID、READY。这两个信号用来实现AXIt协议的握手机制(handshake)。在读写数据两条数据通道中,传输突发传输(Burst Transaction))中的最后一个数据,必须要给出LAST信号,来标识这是此次突发传输中的最后一个数据。
在共同的定义之外,各个通道有自己的定义。
读、写地址通道(Read and write address channels)
读、写事务分别具有各自的独立通道,写入本次事务所需的地址和控制信息。
读数据通道(Read data channel)
读数据通道上包括从机发送给主机的读数据,以及从机对于本次读传输操作的回复。总线数据位宽可以是8,16,64,128,256,512或者是1024 bit。
写数据通道(Write data channel)
写数据通道上包括主机发送给从机的写数据。总线数据位宽可以是8,16,64,128,256,512或者是1024 bit。写数据通道还具有STROBE信号,该信号以数据的字节为单位进行选取,可实现数据的掩码功能。
写响应通道(Write response channel)
写响应通道用于从机将写操作响应回复给主机。所有写传输操作都需要以写回复通道上接收写响应作为完成信号。
AXI 读取传输事务
AXI 读传输事务需要在 2 条读取信道上发生多次传输。
首先,地址读通道 (Address Read Channel) 从主设备 (Master) 发送到从设备 (Slave),以便设置地址和部分控制信号。
然后,此地址的数据通过读数据通道 (Read data channel) 从从设备发送到主设备。
请注意,根据下图所示,每个地址中可发生多次数据传输。此类型的传输事务称为突发 (burst),AXI4是支持突发传输的,而AXI-Lite是不支持突发传输的。
AXI 写入传输事务
AXI 写入传输事务需要在 3 条读取信道上存在多次传输。
首先,写地址通道 (Address Write Channel) 从主设备发送到从设备,以便设置地址和部分控制信号。
然后,此地址的数据通过写数据通道 (Write data channel) 从主设备发射到从设备。
最后,写入响应通过写响应通道 (Write Response Channel) 从从设备发送到主设备,以指示传输是否成功。
写响应通道 (Write Response Channel) 上可能的响应值包括:
- OKAY (0b00):正常访问成功。表示已成功完成正常访问
- EXOKAY (0b01):专属访问成功。
- SLVERR (0b10):从设备错误。已成功访问从设备,但从设备希望向发端主设备返回错误条件(例如,数据读取无效)。
- DECERR (0b11):解码器错误。通常由互连组件生成,用于指示传输事务地址处没有任何从设备
注:读取传输事务同样包含响应值,但此响应通过读响应通道 (Read Response Channel) 来发射
2.1 AXI特性
支持Outstanding操作:所谓的Outstanding,即“在路上”,以读为例,AHB读回了数据才可以发起下一次读请求,但是AXI允许读数据返回之前,又发起一次新的读请求,最大允许多少次读请求在路上,由Outstanding Num决定。
独立的读、写通道:上面提到AXI有 5 个独立的通道,我们还可以更粗略的分为读写两个通道,其中读通道由读地址通道加读数据通道组成;写通道由写地址通道加写数据通道加写响应通道组成AXI总线支持同时读写,
写地址和写数据之间的关系较为灵活:前面我们学习的AHB协议的写数据必须位于写地址的下一拍,设计起来其实存在很多的限制。而AXI采用的是握手机制,并且写地址和写数据并没有明确的要求哪个在前哪个在后,非常的灵活,用起来非常的爽。(具体什么是握手机制后面再讲)
支持非对齐传输:当我们谈论对齐传输的时候,一般指的是字对齐,即32bit对齐。对于具体的某一bit的地址,比如0x00,它只能存8bit的数据,想要存32bit的数据需要用到0x00~0x03这4个地址。之前学的AHB协议只允许访问0x00、0x04、0x08之类的地址。而AXI是允许访问0x01之类的地址的,也就是允许非对齐访问
支持乱序传输:乱序传输的核心是ID号。以读操作举例说明,AXI的读顺序涉及到的信号为ARID和RID,ARID来自主设备,RID来自从设备。对于主设备而言, 同一个ARID序号需要按照发射顺序返回读取的值,即同一个ID应该要求保序。而不同的ARID序号可以以任意顺序返回值,即不同ID可以乱序。比如我发了一个ARID为1的请求,又发了一个ARID为2的读请求。是可以先返回ARID为2的读请求所要的读数据的,相应的RID应该也为2,用来说明对应关系。
对于写操作而言,AXI写顺序涉及到的信号为AWID和BID(WID在AXI4中移除),也是同一ID必须保序,不同ID可以乱序。比如我发起了AWID为1的写请求,又发起了AWID为2的写请求,BID为2是可以先回来的,说明AWID为2的写请求已经写完成了,这个是允许的。具体的实例后面再讲解,这一部分也是AXI设计中相对较为复杂的点,实际上很多SoC实现的是阉割版的AXI协议,不支持乱序传输。是否需要支持该feature还是取决于具体应用场景。
Burst操作只需要提供首地址:每次传输数据,不需要像AHB一样,每次传输都给相应的地址,只需要在第一次传输的时候给出首地址即可。
2.2 信号描述
全局信号
ACLK:全局时钟信号,所有的传输操作都发生在ACLK的上升沿
ARESETn:低电平有效的同步复位信号(可以是异步复位,但必须同步释放在时钟上升沿,即异步复位同步释放)
写地址通道信号
只对不可或缺的信号说明
该通道的信号均用AW作为前缀(address write) :
AWADDR:写地址,给出一次写突发传输的写地址。主机到从机;.
AWLEN︰写传输的突发长度。主机到从机;
AWSIZE:写突发大小,给出每次突发传输的字节数。主机到从机;
AWBURST:突发类型。主机到从机;
AWVALID:有效信号,表明此通道的地址控制信号有效。主机到从机;。
AWREADY:表明"从"可以接收地址和对应的控制信号。从机到主机.
写数据信号
该通道的信号均用W作为前缀(write) :
WDATA:写数据,主机到从机;
WSTRB: WSTRB[n:0]对应于对应的写字节,WSTRB[n]对应WDATA[8n+7:8n]。WVALID为低时,WSTRB可以为任意值,WVALID为高时,WSTRB为高的字节线必须指示有效的数据。主机到从机;
WLAST:表明此次传输是最后一个突发传输。主机到从机;
WVALID:写有效,表明此次写有效。主机到从机;
WREADY:表明从机可以接收写数据。从机到主机。
写响应信号
该通道的信号均用B作为前缀
BRESP :写响应,表明写传输的状态。从机到主机;
BVALID :写响应有效。从机到主机;
BREADY:表明主机能够接收写响应。主机到从机。
读地址信号
该通道的信号均用AR作为前缀(address read) :
ARADDR:读地址,给出一次读突发传输的读地址。主机到从机;
ARLEN:传输的突发长度。主机到从机;
ARSIZE:读突发大小,给出每次突发传输的字节数。主机到从机;
ARBURST:突发类型。主机到从机;
ARVALID:有效信号,表明此通道的地址控制信号有效。主机到从机;
ARREADY:表明"从"可以接收地址和对应的控制信号。从机到主机。
读数据信号
该通道的信号均用R作为前缀(read) :
RDATA:读到的数据。从机到主机;
RRESP:读响应,表明读传输的状态。从机到主机;
RLAST:表明此次传输是最后一个突发传输。从机到主机;
RVALID:读有效信号。从机到主机;
RREADY:表明"主机"可以接收从机发送的数据。主机到从机.
三、AXI握手机制
3.1、握手机制和信号列表
握手这个机制,听名字就知道需要双方的参与,ARM官方是这么说的:作为一种双向流控机制,VALID/READY 机制可以使发送接收双方都有能力控制传输速率。在握手机制中,有SOURCE端和DESTINATION端,即源端和目的端。
源端通过VALID信号来标志信息是有效的,目的端使用READY信号来标志有能力接收更多的信息。VALID一旦拉高,在完成握手之前是不允许改变的!握手成功代表这个通道的通信完成。
发送方置高VALID信号表示发送方已经将数据,地址或者控制信息已经就绪,并保持于消息总线上
接收方置高READY 信号表示接收方已经做好接收的准备
3.2、握手过程
在AXI协议中,因为有五个通道,与之对应的双向握手信号合计十个。这些信号的握手标志了传输的进行。顺着握手,我们可以引申出三种情况。
- VALID信号先于READY信号改变:如下图所示,在T1~T2这个时段Master已经拉高了VALID,拉高了VALID代表它已经准备好给Slave数据了,但是Slave因为各种各样的原因,此时并没有准备好接收数据。那怎么办?那就只能等啊,一直到T3时刻的上升沿,同时采样到VALID和READY都为高,说明握手成功,Master成功把数据传输给了Slave,然后二者需要同时拉低。
这种情况下,Master的VALID是不允许中途拉低的,这是协议硬性规定的,一旦拉高,就必须等待握手成功才允许拉低。此外VALID是不可以依赖于READY的,不能说READY拉高VALID再拉高,体现在具体的设计中实际上是不能允许将READY作为逻辑输入,生成VALID信号。要不然有可能造成死锁的状况(组合逻辑、FIFO、打拍都不允许,简而言之就是VALID的生成信号不能包含READY)。因为实际上READY是可以依赖于VALID的,如果VALID再依赖于READY,那么如果VALID不拉高,READY也不拉高,那么VALID也不拉高,那么.....
- VALID和READY同时拉高:这种情况非常的棒,直接采样完成通信,二者再同时拉低即可。
READY先于VALID拉高:这种情况也很常见,比如Slave的READY信号是默认拉高的,代表随时可以准备采样,如下图的T2时刻,VALID还没有拉高,则没有进行采样,T3时刻均为高,完成握手,数据发生传输。那么READY拉高以后可以中间拉低吗?实际上也是可以的,协议没有规定不允许,但这种情况很少见。
3.3、通道关系
各个通道之间基本是独立的,以下3种联系除外:
写回复必须在其所属传输的最后一个写数据完成后.
读数据必须在接收到读地址信号后产生
通道间的握手需要满足通道间的握手依赖性(handshake dependencies)
通道握手信号的依赖关系(Dependencies between channel handshake signals)
为了防止死锁(deadlock)情况的产生(如VALID信号等READY信号,而READY信号又在等VALID信号,这样就永远都没法握手),握手信号需满足以下规则:
发送方的VALID信号不能依赖READY信号来置位
接收方READY信号可以检测到VALID置位后再置位
以下是上述原则具体到各种情况的具体分析。
图中单箭头表示其指向的信号可以在箭头起始信号置位之前或之后置位或同时置位((无依赖);
图中的双头箭头表示:其指向的信号必须在箭头起始信号置位之后置位(指向信号依赖起始信号)
1 读事务依赖性
主机的ARVALID信号禁止等待从机的ARREADY信号置位后才置位,防止死锁
从机的 ARREADY信号可以先于主机、后于主机或同时于主机的ARVALID信号置位(如单头箭头所示),无依赖性·
从机的RVALID信号必须等待ARVALID和ARREADY信号均置位后置位(如两个双头箭头所示),具有依赖性。
从机的RVALID信号禁止等待主机的RREADY信号置位后才置位,防止死锁
主机的 RREADY信号可以先于从机、从于主机或同时于从机的RVALID置位前置位(如单头箭头所示),无依赖性
2 写事物依赖性
根据上节的分析内容,很容易对上图进行分析。这里只说下图中+号的含义:BVALID信号必须等待WVALID和WREADY信号均置位后置位,同时还依赖WLAST信号的置位。这是因为BVALID信号是写响应有效信号,而我们知道一次写数据的数据使用WLAST信号来表征最后一个数据,也就是说WLAST在被置位之前,一次突发传输是没有结束的。
3 写响应事务依赖性
类似上图,就不再说明
四、AXI突发传输
1.1、AXI突发传输时序图
AXI总线是基于突发传输的,并且AXI的突发是只需要给一次地址信号即可,这样就免去了地址计算的逻辑。对于只存在给一个地址给一个数这样的传输场景,不建议使用AXI总线,APB即可。
写突发
读突发
4.2、AXI突发传输信号
看完了AXI的突发读和突发写时序图,我们进一步学习突发传输相关的信号,细心的读者可能发现了,上面的控制信号只给了地址信号,写数据大小,突发长度都没有体现,实际上面只是简化版本的,忽略了控制信号细节,以下为大家梳理一下,跟突发相关的控制信号总共是有以下三个信号。
突发长度(burst length)
指一次突发传输的数据长度。读事务ARLEN[7:O];写事务AWLEN[7:0]。协议中的AxLen 信号从零开始表示,实际的长度值为AxLen +1。即Burst_Length = AxLEN[7:0]+1
突发传输须遵守以下规则:
WRAP传输类型(一次突发传输类型,后面会说)的突发长度只能是2,4,8,16。
在一次突发传输中,地址不能跨越一个4KB分区
突发传输不能在完成所有数据传输前提前结束(early termination)
AWLEN和ARLEN两个信号指定了每一笔突发传输有多少笔,对于AXI3,支持1~16笔transfer,分别对应000~111,对于AXI4,支持1~256笔transfer,分别对应00000000~11111111。
值得注意的是,对于写而言,该信号很多时候没什么用,因为WLAST才是真正的最后一笔写传输的标志,有些设计AWLEN甚至就是默认值,主机那边控制好WLAST即可,这种方法也可以,但不建议,WLAST按理说要和AWLEN对应好!
突发数据大小(burst size)
指传输中的数据位宽,具体地,是每周期传输数据的字节数量,在协议中使用AXSIZE信号控制。突发传输宽度信号AXSIZE位宽为3bit,表示为:传输宽度=2^AXSIZE
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不同的块
写选取(Write strobes)
WSTRB信号中的单个bit置起,表示对应位置上的字节有效,对应关系为: WSTRB[n]对应WDATA[8n+7:8n],也就是:当WSTRB[n]为1时,WDATA[8n+7:8n]有效。WSTRB信号比特位宽等于数据通道位宽的字节数量,比如32bit位宽的数据通道,对应wSTRB信号位宽为4bit。
这个信号是用来实现掩码功能的,对于我们的一般应用,直接一直将其拉高,表示当前传输数据全部有效即可。
读、写响应(Read and write response)
响应值包括:
OKAY (0b00):正常访问成功。表示已成功完成正常访问.
EXOKAY (0b01):专属访问成功。
SLVERR(0b10):从设备错误。已成功访问从设备,但从设备希望向发端主设备返回错误条件(例如
数据读取无效)。
DECERR(0b11):解码器错误。通常由互连组件生成,用于指示传输事务地址处没有任何从设备
4.3 AXI其它的一些控制信号
这些控制信号不是必用的,取决于实际应用的场景,AXI提供这些信号作为额外的功能支持。
4.3.1、保护功能支持
分别是AWPROT和ARPORT,该信号为3bit,因此也提供了三种类型的访存保护(其实就是附带一些额外的信息,用来避免非法的transaction操作)。
AXPROT[0]用来区分是普通访存还是特权访存,如下图所示,比如操作系统这一块地址,普通的访存当然是不被允许的,一般是拥有较高的权限,才允许进行访存,体现在硬件上实际就是Normal access还是Privileged Access,这个时候就得借助该信号。
AXPROT[1]用来区分是Secure还是Non-Secure,如下图所示,Secure Region一般是内存中特别机密的信息,同理这也需要处理器的支持,只有Secure的程序才允许访问Secure Region。
AXPROT[2]用来区分是Instruction还是Data,这个用于区分CPU是取指令还是取数据,实际上用的很少,很多时候可能取得是指令,但是标明的是Data.
还有许多其他信号,后面有时间在介绍