目录
《IHI0022H_amba_axi_protocol_spec》
AXI总线 详细整理
AMBA3.0协议——AXI(Advanced eXtensible Interface)总线介绍
AXI_01 《AXI总线系列文章》由来
AXI3与AXI4区别及互联
1. 功能介绍
AMBA中最重要的片内总线,适用于高性能、高带宽、高工作频率、低延迟系统,也是基于多主多从的架构与事务传输。
AXI的特性包括:
● 单通道体系,即控制通道与数据通道相互分离,可分别独立控制和优化。并且各通道传输方向单一,减少延迟。
● 支持字节选通、非对齐数据访问
● 只给出第一地址,亦可完成burst传输
● 基于传输ID实现乱序传输
● 允许电平同步
2. 架构
2.1. 单主单从
先讲一个master、一个slave之间是如何通信的。
AXI将master与slave之间的控制信息和数据信息划分为五个通道进行传输,这五个通道之间是时序独立,这五个通道分别表示:读控制通道AR、读数据通道R、写控制通道AW、写数据通道W、写反馈通道B
每个通道由好几个信号组成
AXI的通道分解架构与APB、AHB不同,APB要求控制信息与数据信息时序对齐,AHB要求控制信息与数据信息差1拍构成流水。
如下图
这五个通道都是基于valid & ready握手信号实现控制信息or数据信息的交互
其实就是标准握手协议中的写时序,只有当valid与ready同时为高时才判定写成功。
此处AXI则是每个通道在valid与ready同时为高时才判定传输成功。
通道 | 握手 | 备注 |
---|---|---|
写控制通道AW | Master 向 Slave 传输,valid & ready握手 | |
写数据通道W | Master 向 Slave 传输,valid & ready握手 | 具备写数据选通功能。且写数据可通过FIFO缓存,无需等到写反馈到来才发起新一轮写 |
读控制通道AR | Master 向 Slave 传输,valid & ready握手 | |
读数据通道R | Slave 向 Master 传输,valid & ready握手 | 含有读数据,也含有读响应表明读传输的完成情况 |
写反馈通道B | Slave 向 Master 传输,valid & ready握手 | 需对每个写事务作响应 |
2.2. 多主多从
AXI也可实现多主多从的结构,类似于Bus Matrix
如下图,Interconnect同时具备AXI master接口与AXI slave接口
实际上大多数系统的控制通道带宽显著小于数据通道带宽,因而对于多主多从系统,通过共享控制通道、独立数据通道实现系统性能和interconnect复杂性的平衡。
3. 信号描述
全局信号
Signal | Source | Width(bits) | Description |
---|---|---|---|
ACLK | 外部 | 1 | |
ARESTn | 外部 | 1 | 低电平复位 |
3.1. AW
Signal | Source | Width(bits) | Description |
---|---|---|---|
AWID | Master | AWID_WIDTH | 写事务ID |
AWADDR | Master | AWADDR_WIDTH | burst写事务第一个WDATA的地址 |
AWLEN | Master | 8 | 该数值+1就表示此次写事务的WDATA个数 |
AWSIZE | Master | 3 | WDATA中有效byte大小 |
AWBURST | Master | 2 | burst传输类型 |
AWLOCK | Master | 2 | 写事务的原子特性 |
AWCACHE | Master | 4 | 写事务在系统中运行的要求 |
AWPROT | Master | 3 | 写事务的保护属性:特权、安全级别、访问类型 |
AWQOS | Master | 4 | 写事务的服务质量标识符 |
AWREGION | Master | 4 | 写事务的区域指示符 |
AWUSER | Master | USER_REQ_WIDTH | 自定义 |
AWVALID | Master | 1 | AW所有控制信息有效 |
AWREADY | Slave | 1 | AW所有控制信息准备接收 |
Parameter | Units | Description |
---|---|---|
AWID_WIDTH | bit | AXI AW通道的AWID位宽 |
AWADDR_WIDTH | bit | AXI AW通道的AWADDR位宽 |
USER_REQ_WIDTH | bit | AXI AW通道的AWUSER和AR通道的ARUSER位宽 |
3.2. W
Signal | Source | Width(bits) | Description |
---|---|---|---|
WID | Master | AWID_WIDTH | 写事务ID,注意该信号AXI3具备,AXI4不具备 |
WDATA | Master | WDATA_WIDTH | 写数据 |
WSTRB | Master | WDATA_WIDTH/8 | 写选通 |
WLAST | Master | 1 | 写事务中的最后一个写数据 |
WUSER | Master | USER_REQ_WIDTH | 自定义 |
WVALID | Master | 1 | W通道所有数据信息有效 |
WREADY | Slave | 1 | W通道所有数据信息准备接收 |
Parameter | Units | Description |
---|---|---|
WID_WIDTH | bit | AXI W通道的WID位宽 |
WDATA_WIDTH | bit | AXI W通道的WDATA位宽 |
USER_REQ_WIDTH | bit | AXI W通道的WUSER位宽 |
3.3. AR
Signal | Source | Width(bits) | Description |
---|---|---|---|
ARID | Master | ARID_WIDTH | 读事务ID |
ARADDR | Master | ARADDR_WIDTH | burst读事务第一个读传输地址 |
ARLEN | Master | 8 | 该数值+1就表示此次读事务的RDATA个数 |
ARSIZE | Master | 3 | RDATA中有效byte大小 |
ARBURST | Master | 2 | burst传输类型 |
ARLOCK | Master | 2 | 读事务的原子特性 |
ARCACHE | Master | 4 | 读事务在系统中运行的要求 |
ARPROT | Master | 3 | 读事务的保护属性:特权、安全级别、访问类型 |
ARQOS | Master | 4 | 读事务的服务质量标识符 |
ARREGION | Master | 4 | 读事务的区域指示符 |
ARUSER | Master | USER_REQ_WIDTH | 自定义 |
ARVALID | Master | 1 | AR通道所有控制信息有效 |
ARREADY | Slave | 1 | AR通道所有控制信息准备接收 |
Parameter | Units | Description |
---|---|---|
ARID_WIDTH | bit | AXI AR通道的ARID位宽 |
ARADDR_WIDTH | bit | AXI AR通道的ARADDR位宽 |
USER_REQ_WIDTH | bit | AXI AR通道的ARUSER位宽 |
3.4. R
Signal | Source | Width(bits) | Description |
---|---|---|---|
RID | Slave | RID_WIDTH | 读事务ID |
RDATA | Slave | RDATA_WIDTH | 读数据 |
RRESP | Slave | 2 | 读反馈,表明读传输的状态 |
RLAST | Slave | 1 | 读事务中的最后一个读数据 |
RUSER | Slave | USER_REQ_WIDTH | 自定义 |
RVALID | Slave | 1 | R通道所有数据信息有效 |
RREADY | Master | 1 | R通道所有数据信息准备接收 |
Parameter | Units | Description |
---|---|---|
RID_WIDTH | bit | AXI R通道的RID位宽 |
RDATA_WIDTH | bit | AXI R通道的RDATA位宽 |
USER_REQ_WIDTH | bit | AXI R通道的RUSER位宽 |
3.5. B
Signal | Source | Width(bits) | Description |
---|---|---|---|
BID | Slave | BID_WIDTH | 写事务ID |
BRESP | Slave | 2 | 写响应 |
BUSER | Slave | USER_REQ_WIDTH | 自定义 |
BVALID | Slave | 1 | B通道所有写反馈信息有效 |
BREADY | Master | 1 | B通道所有写反馈信息准备接收 |
Parameter | Units | Description |
---|---|---|
WID_WIDTH | bit | AXI B通道的BID位宽 |
USER_REQ_WIDTH | bit | AXI B通道的BUSER位宽 |
4. 逻辑设计
4.1. 单通道传输
前面提到过对于每个通道而言,都是基于valid & ready实现握手,即valid拉高表示传输有效,必须等到ready也为高时才能拉低,表示完成传输
那么各通道之间是如何协同实现读写握手呢?见下
4.2. 多通道outstanding传输
outstanding意思是未完成的、未解决的。此处意思是读写握手中,上一次握手还未完成就可以发送下一次握手的信息,这样依旧能保证正确的读写。这是AXI的一大特点,能够提高工作效率。
例如先发写数据再发写地址、先发很多个写数据再发其对应的写地址。
以写为例,APB中pwdata和paddr是时序对齐的,而且必须完成一次握手才能进行下一次。AHB的读写握手也是必须完成之后再来下一次,所以他俩都不是outstanding。而AXI的AW通道和W通道的控制信号可以一次性发送多个。
outstanding传输的实现机制是基于burst传输中的ID号。核心思想如下
● 多个控制信息burst通过ID相互区分,多个数据信息burst通过ID相互区分
● 每个控制信息burst在时间上的先后顺序,必须与相应的数据信息burst在时间上的先后顺序一致
● 相同的控制信息ID与数据信息ID相匹配,以实现一次访问
以写为例,先在AW通道发送3包写控制信息,AWID分别为0、1、2,然后在W通道发送3包写数据信息。即使写控制和写数据时序上不是对齐的,AXI slave依然可以根据AWID正确地将数据写入地址中。同理,AXI slave在B通道作写反馈时BID为0、1、2且BRESP都是OKAY,AXI master也能够根据BID认为这3次写成功了。
当写访问次数过多时,可能AXI master在AW通道发送了3包awaddr不同的写控制信息,且AWID都是10,然后在W通道也发送了3包wdata不同的写数据信息,WID也都是10。那么axi master必须保证这3包ID相同的写控制和写数据在时间上先后顺序必须是相互对应的。
● 乱序传输(AXI3特有):不同ID的多个控制信息burst在时间上的先后顺序可任意。不同ID的多个数据信息burst在时间上的先后顺序可任意,如下图
如果要实现乱序传输,显然必须根据ID号缓存不同的控制信息,这样一个FIFO就无法解决问题了,必须是带有特定地址信息的RAM存储控制信息,这样的话就占用角度的资源,所以AXI4就砍掉了这个功能。
其实outstanding传输的本质就是如此,下面针对不同情景分别详细阐述。
AR 与 R 通道协同
完成burst读操作,需要满足以下条件:
● 接受读控制信息之后才能读反馈,即在ARVALID与ARREADY同时为高之后,RVALID才能拉高
● AXI Slave要反馈的RID必须与AXI Slave收到的ARID匹配。相同的ARID要在时间上与相同的RID相匹配
● interconnect中,为每个AXI Master的ARID添加额外的位,以表明该包数据来自于哪个AXI Master,如下图
就是你必须确定Slave收到了读控制信息,才能返回读数据
协议原文如下
Single-headed arrows point to signals that can be asserted before or after the signal at the start of the arrow.
Double-headed arrows point to signals that must be asserted only after assertion of the signal at the start of the arrow.
AW、W 与 B 通道协同
完成burst写操作,必须满足以下条件:
● 必须收到写控制信息和写数据信息,才能完成写反馈,即在AWVALID与AWREADY同时为高、以及WVALID与WREADY同时为高之后,BVALID才能拉高
● AXI Master AW通道的写控制信息发送顺序要与W通道的写数据信息发送顺序一致,AWID顺序要与BID顺序一致
● interconnect中,为每个AXI Master的AWID、WID添加额外的位,以表明该包数据来自于哪个AXI Master
AXI4没有WID所以不支持乱序传输
Single-headed arrows point to signals that can be asserted before or after the signal at the start of the arrow.
Double-headed arrows point to signals that must be asserted only after assertion of the signal at the start of the arrow.
4.3. 传输配置
下面对各传输信号的功能作介绍
AWADDR 与 ARADDR
表示burst传输第一个byte的地址,且Master只需提供第一个byte的地址。后续地址需要Slave来计算。
并且一次burst传输地址变化不可超过4KB,即’h8000
AWLEN[7:0] 与 ARLEN[7:0]
加1之后就分别表示burst写数据长度和burst读数据长度,同时规定了
● INCR类burst传输,AxLEN可为8’d0~8’d255
● WRAP类burst传输,burst长度只能为2、4、8、16之一,因此AxLEN取值必须为8’d1、8’d3、8’d7、8’d15 之一
● 一次burst传输地址变化不可超过4KB,即’h8000
AWSIZE[2:0] 与 ARSIZE[2:0]
这个与AHB中的HSIZE含义相同,表示burst传输中各数据有效byte数目
满足公式Number_Bytes = 2 ^ AxSIZE;
AxSIZE[2:0] | Transfer Data Size = 2^(AxSIZE) byte | Description |
---|---|---|
3'b000 | 8 bits = 1 Byte | 数据传输有效大小为1 Byte |
3'b001 | 16 bits = 2 Byte | 数据传输有效大小为1 Half Word |
3'b010 | 32 bits = 4 Byte | 数据传输有效大小为1 Word |
3'b011 | 64 bits = 8 Byte | 数据传输有效大小为1 DoubleWord |
3'b100 | 128 bits = 16 Byte | 数据传输有效大小为4 Word |
3'b101 | 256 bits = 32 Byte | 数据传输有效大小为8 Word |
3'b110 | 512 bits = 64 Byte | 数据传输有效大小为16 Word |
3'b111 | 1024 bits = 128 Byte | 数据传输有效大小为32 Word |
AWBURST[1:0] 与 ARBURST[1:0]
表示burst传输的类型,包括三种
HBRUST[1:0] | Type | Description |
---|---|---|
2'b00 | FIXED | 一次burst传输中地址和数据都不改变(写burst各数据的WSTRB可各不相同) |
2'b01 | INCR | 递增burst传输。AxADDR为起始地址,1<<AxSIZE(Byte)为地址递增公差,AxLEN+1为burst传输的数据个数 |
2'b10 | WRAP | 回环burst传输,AxADDR以1<<AxSIZE(Byte)公差回环递增AxLEN+1次 |
2'b11 | 保留 |
INCR模式的burst传输好说,地址是以AxSIZE(Byte)不断递增,每次burst传输是传AxLEN+1个数据,于是就递增AxLEN+1次。
但是WRAP是回环模式,意思是burst读写地址必须在一个离散范围的内递增,若到达了该范围最大值,读写地址就返回到该范围的最小值。
而这个最小值就叫作回环边界,Wrap Boundary,而这个范围的最大值就是下一个回环边界。
那么这个回环边界怎么算呢?
W r a p B o u n d a r y = i n t ( A x A D D R ( A x L E N + 1 ) ⋅ 2 A x S I Z E [ 2 : 0 ] ) ⋅ ( A x L E N + 1 ) ⋅ 2 A x S I Z E [ 2 : 0 ] Wrap Boundary = int(\frac{AxADDR}{(AxLEN+1)·2^{AxSIZE[2:0]}})·(AxLEN+1)·2^{AxSIZE[2:0]} WrapBoundary=int((AxLEN+1)⋅2AxSIZE[2:0]AxADDR)⋅(AxLEN+1)⋅2AxSIZE[2:0]
上述回环不等式的意思就是burst读写地址在 [ ′ h 0 , ′ h 8000 ] ['h0,'h8000] [′h0,′h8000]内按照公差 2 A x S I Z E [ 2 : 0 ] 2^{AxSIZE[2:0]} 2AxSIZE[2:0] byte构成的等差数列中,每(AxLEN+1)个地址构成一个回环。
所以说回环边界一定是 ( A x L E N + 1 ) ⋅ 2 A x S I Z E [ 2 : 0 ] {(AxLEN+1)·2^{AxSIZE[2:0]}} (AxLEN+1)⋅2AxSIZE[2:0]的整数倍。那么对于任意一个读写地址,它所在的回环边界一定是起始地址AxADDR除以 ( A x L E N + 1 ) ⋅ 2 A x S I Z E [ 2 : 0 ] {(AxLEN+1)·2^{AxSIZE[2:0]}} (AxLEN+1)⋅2AxSIZE[2:0]的商部分乘以 ( A x L E N + 1 ) ⋅ 2 A x S I Z E [ 2 : 0 ] {(AxLEN+1)·2^{AxSIZE[2:0]}} (AxLEN+1)⋅2AxSIZE[2:0]
如下图,红框表示回环的范围
RRESP[1:0] 与 BRESP[1:0]
分别表示读响应和写响应,注意BRESP用于对一个burst的整个数据包传输做出响应,RRESP可用于对一个burst中的某一个data传输做出响应
个人认为这样的协定可以更改,让二者均表示一次burst的整个传输是否出现错误
原文如下:
For a write transaction, a single response is signaled for the entire burst, and not for each data transfer within the burst.
In a read transaction, the slave can signal different responses for different transfers in a burst. For example, in a burst of 16 read transfers the slave might return an OKAY response for 15 of the transfers and a SLVERR response for one of the transfers.
含义如下
RRESP[1:0] 与 BRESP[1:0] | Type | Description |
---|---|---|
2'b00 | OKAY | 访问成功 |
2'b01 | EXOKAY | 独占访问成功 |
2'b10 | SLVERR | 传输失败 |
2'b11 | DECERR | 表示interconnect无法解码出AXI MASTER的片选信号。AXI协议建议设定一个default axi slave,用于反馈DECERR信号 |
4.4.单次burst不可跨越4KB边界
由于内存一个page为4KB,因此AXI4规定单次burst传输不可跨越4KB边界,例如32’h0000_1000、32’h0000_2000这些就是4KB边界