摘要
本文详细介绍了AXI3和AXI4协议的读写过程,对比了它们之间的区别,列出了和协议相关的所有信号并加以说明。
关键词:AXI3
;AXI4
;读通道
;写通道
;握手机制
前言
本文基于ARM官方文档《AMBA AXI and ACE Protocol Specification》
因为AXI3和AXI4协议大部分相同,小部分不同,在官方文档中也是一起介绍的,所以本文将一起说明AXI3和AXI4,在两个协议不同的地方,会突出显示。
AMBA AXI 协议支持高性能高频率系统间主从元件间的通讯。AXI协议特征如下:
-
适合高带宽、低时延设计 -
无用复杂即可提供高频操作< -
可满足多种组件的接口要求 -
适用于初始访问时延较高的内存控制器 -
提供了实施互连架构的灵活性 -
向后兼容AHB和APB接口
AXI协议的主要特征如下:
-
地址/控制阶段 与 数据阶段分离 -
使用字节选通脉冲支持未对齐的数据传输 -
使用基于突发的事务,仅发布起始地址 -
独立的读写数据通道,可提供低成本的直接存储器访问(DMA) -
支持发布多个未完成的地址 -
支持无序事务完成 -
允许轻松添加寄存器级,以提供定时关闭
一. AXI架构
AXI有五个独立的通道:
-
写地址通道 Write address AW -
写数据通道 Write data W -
写响应通道 Write response B -
读地址通道 Read address AR -
读数据通道 Read data R
写/读地址通道包含控制信息。
写操作过程:
-
主机发送写地址/控制信号 -
主机发送要写入的数据 -
丛机发送写响应信号
读操作过程:
-
主机发送读地址/控制 -
丛机发送读数据
二. 各通道信号
2.1 全局信号
信号 | 源 | 描述 |
---|---|---|
ACLK | 时钟源 | 全局时钟信号,所有输入信号均在ACLK上升沿采样,所有输出信号的更改只能在ACLK上升沿之后。主从接口上的所有输入和输出信号间不允许有组合路径 |
ARESETn | 复位源 | 全局复位信号,为异步复位同步置位信号,即ARESETn在任意时刻变为低电平可立刻生效,但置位为1时只能在ACLK的下一个上升沿生效 |
协议规定,在ARESETn低电平有效时
-
主机必须驱动ARVALID,AWVALID 和 WVALID为低电平 -
丛机必须驱动RVALID 和 RVALID为低电平 -
其它信号能被驱动为任意值
ARESETn置位为1后,VALID最快能在ARESETn置位后的下一个ACLK时钟上升沿置高,如下图:
2.2 写地址通道信号
信号 | 源 | 必需/可选 | 位宽 | 默认值 | 描述 |
---|---|---|---|---|---|
AWID | 主 | 可选 | 可变,协议未定义位宽, Xilinx使用0, 1, 2, … 32,一般为4 | 全0 | 写地址识别ID |
AWADDR | 主 | 必需 | 可变,协议未定义位宽, Xilinx使用12, 13, … 64,一般为32/64 | – | 要写入数据的内存地址 |
AWLEN | 主 | 可选 | 8(AXI4是8位) 4(AXI3是4位) |
8’h00 4’h0 |
数据是按份传输的,此信号表示接下来要写入的数据份数即数据量, 实际传输数据量 = AWLEN + 1 |
AWSIZE | 主 | 可选 | 3 | 数据总线宽度 | 表示每份数据占几个字节,如3‘b000对应1字节,3’b001对应2字节,… ,3‘b111对应2^7=128字节 n对应2^n直接 |
AWBURST | 主 | 可选 | 2 | 2‘b01, INCR | 突发类型,指示在写事务中每次传输之间地址如何变化 |
AWLOCK | 主 | 可选 | 1(AXI4是1位) 2(AXI3是2位) |
1’b0 2’b00 |
0表示Normal access, 定义主机访问丛机的是否是独占的 |
AWCACHE | 主 | 可选 | 4 | 4’b0000 | 指示不同的内存类型 |
AWPROT | 主 | 必须 | 3 | 3’b000 | 写事务的保护属性:特权,安全级别和访问类型 提供用于禁止非法传输事务的访问权限信号 |
AWQOS | 主 | 可选 | 4 | 4’b0000 | 服务质量标识符,在AXI3中未实现 AXI4中未指定AxQOS的确切用途,但建议用做读/写优先级指示符,QOS值越大优先级越高 |
AWREGION | 主 | 可选 | 4 | 4’b0000 | 写入事务的区域指示器,在AXI3中未实现 |
AWUSER | 主 | 可选 | 可变,协议未定义位宽,xilinx使用0, 1, 2, … 1024 | 全0 | AXI4一般不建议使用用户字段 在AXI3中未实现 |
AWVALID | 主 | 必须 | 1 | – | valid |
AWREADY | 从 | 必须 | 1 | – | ready |
2.2.1 xID
xID包括AWID、WID(仅在AXI3中实现)、BID、ARID、RID。
当AXI Master连接到AXI Interconnect IP或是AXI SmartConnect IP时,Connect IP会将一个附加位加到该主机侧的ARID,AWID和WID上。这有两个效果:
-
主机不必知道其他主机使用哪些ID值,因为Connect IP通过将主机号附加到原始标识符上,使每个主机使用的ID值唯一
-
从接口上的ID标识符比主接口上的ID标识符宽
对于写响应,Connect IP使用BID的附加位来确定写响应所针对的主端口。在将BID值传递到正确的主端口之前,互连模块会删除BID的附加位。
对于读取数据,Connect IP使用RID的附加位来确定读取数据的目标主机端口。在将RID值传递到正确的主端口之前,互连模块会删除RID的附加位。
所以,当Master连接了Connect IP后(几乎是必连的,主从AXI接口间都必须加Connect IP),Master不需要关心其它Master的ID值,即使多个使用相同ID值的Master通过Connect IP连到Slave也不会造成错乱,因为Connect IP会使用附加位来唯一标识每个Master的ID。
2.2.2 AxBURST
值 | 名 | 描述 |
---|---|---|
2’b00 | FIXED | 在固定突发中, 1. 每次传输的地址都相同。 2. 有每份数据的有效字节通道是固定的,但与已声明WSTRB的实际字节可能不同。 此突发类型用于重复访问同一位置,例如在加载或清空FIFO时。 |
2‘b01 | INCR | 递增。在递增突发中,突发中每次传输的地址都是前一次传输的地址的增量。增量值取决于传输的大小。例如,对于对齐的起始地址,突发大小为4字节的每次传输的地址为前一个地址加4。此突发类型用于访问常规顺序存储器 |
2’b10 | WRAP | 包装,包装突发与增量突发类似,不同之处在于,如果达到地址上限,地址会绕到一个较低的地址。 以下限制适用于包装突发: • 起始地址必须与每次传输的大小对齐。 • 突发长度必须为2、4、8或16,即AWLEN必须为1、3、7或者15 |
2’b11 | 保留 | – |
2.2.3 AxSIZE
AWSIZE不能超过整数据传输路径中任意一条总线的宽度。如果AWSIZE对应的数据宽度比AXI数据总线宽度小,则称这样的传输是窄传输,显然,窄传输需要约定数据总线的哪些位是有效数据位。
当主机产生比其数据总线窄的传输时,AWBURST的值将确定传输使用的字节通道:
-
在增加或包装突发时,在突发传输中每份数据使用不同的字节通道。 -
在固定的脉冲串中,每份数据使用相同的字节通道。
下图展示了窄传输中8位数据在32位总线中INCR传输的过程,可以看到实际数据的位序和在数据总线中所处的位序始终是一样的,即字节不变序。8位为1字节,低字节在总线的低位,高字节在总线的高位。
2.2.4 AxLOCK
AxLOCK | Access type |
---|---|
1‘b0 | Normal access 正常访问 |
1’b1 | Exclusive access 独占访问 |
AXI3定义的AxLOCK[1:0],比AXI4定义的多了一个Locked access锁定访问, 如下表。AXI3只推荐用于旧设备之中。
AxLOCK(AXI3) | Access type2 |
---|---|
2‘b00 | Normal access 正常访问 |
2’b01 | Exclusive access 独占访问 |
2’b10 | Locked access 锁定访问 |
2’b11 | 保留 |
2.2.5 AxCACHE
AxCAHCE表明访问的内存类型,AXI3与AXI4不同的编码不同,括号()内是AXI3编码。
2.2.6 AxPORT
AxPORT共3位,每一位的值代表不同的意义。一般可设置为3‘b000,表示非特权且安全的数据访问。
AxPROT | 值 | 功能 | 描述 |
---|---|---|---|
[0] | 0 | Unprivileged access 非特权访问 | AXI主站可能支持多个级别的操作特权,并将这种特权概念扩展到内存访问。 AxPROT [0]将访问标识为非特权或特权 |
[0] | 1 | Privileged access 特权访问 | – |
[1] | 0 | Secure access 安全访问 | AXI主站可能支持安全和非安全操作状态,并将这种安全性概念扩展到内存访问。 AxPROT [1]将访问标识为安全或不安全。 AxPROT [1]可以视为定义了两个地址空间,一个安全地址空间和一个非安全地址空间。该信号可被视为附加地址位。安全和非安全地址空间之间的任何别名都必须正确处理。 |
[1] | 1 | Non-secure access 非安全访问 | – |
[2] | 0 | Data access 数据访问 | 该位指示事务是指令访问还是数据访问。 AXI协议将此指示定义为提示。并非在所有情况下都是准确的,例如,当事务包含指令和数据项的混合时。本规范建议主机将AxPROT [2]设置为LOW,以指示数据访问,除非已知该访问是指令访问。 |
[2] | 1 | Instruction access 指令访问 | – |
2.3 写数据通道信号
信号 | 源 | 必需/可选 | 位宽 | 默认值 | 描述 |
---|---|---|---|---|---|
WID | 主 | 可选 | 可变,协议未定义位宽 | – | 写数据识别ID, 仅在AXI3中实现, 通过AWID,WID与BID一致来对应地址和数据,故AXI3可支持乱序传输,而AXI4去除了WID信号,故AXI4只能顺序传输,数据紧跟地址,或者地址紧跟数据。 |
WDATA | 主 | 必需 | 与AWSIZE指定的数据位宽保持一致 = 2^AWSIZE * 8 | – | 要写入的数据 |
WSTRB | 主 | 可选 | 数据总线位宽 / 8 = 2^AWSIZE | 全0 | 写选通,指示哪些字节通道保存有效数据 WSTRB为高表示数据总线的哪一/几字节是有效数据, 具体的WSTRB [n]为高对应于WDATA [(8n+7:8n]这一字节的数据有效 |
WLAST | 主 | 必需 | 1 | – | 指示写事务中的最后一次数据传输 WLAST置1表明此时刻的数据是最后一份数据 |
WUSER | 主 | 可选 | 可变,协议未定义位宽,xilinx使用0, 1, 2, … 1024 | – | 一般不建议使用用户字段 在AXI3中未实现 |
WVALID | 主 | 必需 | 1 | – | valid |
WREADY | 从 | 必需 | 1 | – | ready |
2.4 写响应通道信号
信号 | 源 | 必需/可选 | 位宽 | 默认值 | 描述 |
---|---|---|---|---|---|
BID | 从 | 可选 | 可变,协议未定义位宽 | – | 写响应ID,与AWID保持一致 |
BRESP | 从 | 必需 | 2 | 2‘b00 | 写响应,指示写事务状态 |
BUSER | 从 | 可选 | 可变,协议未定义位宽,xilinx使用0, 1, 2, … 1024 | 全0 | 一般不建议使用用户字段 在AXI3中未实现 |
BVALID | 从 | 必需 | 1 | – | valid |
BREADY | 主 | 必需 | 1 | – | ready |
2.4.1 BRESP 与 RRESP
写响应和读响应功能是一样的,都是指示写/读交易是否成功,
BRESP[1:0] RRESP[1:0] |
Response | 描述 |
---|---|---|
2’b00 | OKAY | 下面三种情况,丛机将回应OKAY: 1. 正常访问成功 2. 独占访问失败 3. AxLOCK为1表明独占访问,但丛机不支持独占访问 |
2’b01 | EXOKAY | 独占访问成功 |
2’b10 | SLVERR | 丛机反映错误,协议建议此信号只用于出现错误的情况而不用于正常情况 例如以下情况: 1. FIFO或缓存区溢出 2. 不支持的AxSIZE,数据位宽大于总线位宽 3. 对只读区域发出写请求 4. 丛机响应超时 5. 尝试访问被禁用的或低功耗模式下的功能 |
2’b11 | DECERR | DECERR指示互连模块无法成功解码从属访问。 如果互连无法成功解码从属访问,则它必须返回DECERR响应。规范建议互连将访问路由到默认从站,并且默认从站返回DECERR响应。 即使发生了错误情况,AXI协议也要求完成事务的所有数据传输。任何提供DECERR响应的组件都必须满足此要求。 |
注意:AXI协议要求无论是否出现错误,主从机都必须把一次写/读交易走完。对于写交易,是在最后数据全部传输完成后才通过写应答知道传输是否有错误,所以无论错误与否,写交易总是能走完;而对于读交易,读应答位于每份读数据的后面,所以可能第一份数据传到主机,主机就知道交易错误了,但是下面的数据主机要继续读完,丛机也要继续发完。
2.5 读地址通道信号
信号 | 源 | 必需/可选 | 位宽 | 默认值 | 描述 |
---|---|---|---|---|---|
ARID | 主 | 可选 | 可变,协议未定义位宽, Xilinx使用0, 1, 2, … 32,一般为4 | 全0 | 写地址识别ID |
ARADDR | 主 | 必需 | 可变,协议未定义位宽, Xilinx使用12, 13, … 64,一般为32/64 | – | 读数据地址,同AWADDR |
ARLEN | 主 | 可选 | 8(AXI4是8位) 4(AXI3是4位) |
8’h00 4‘h0 |
实际传输数据量 = ARLEN + 1,同AWLEN |
ARSIZE | 主 | 可选 | 3 | 数据总线宽度 | 表示每份数据占几个字节,同AWSIZE |
ARBURST | 主 | 可选 | 2 | 2‘b01, INCR | 突发类型,指示在写事务中每次传输之间地址如何变化, 同AWBURST |
ARLOCK | 主 | 可选 | 1(AXI4是1位) 2(AXI3是2位) |
1’b0, 2’b00 |
见 2.2.4 AxLock |
ARCACHE | 主 | 可选 | 4 | 4’b0000 | 指示不同的内存类型,同AWCHACE |
ARPROT | 主 | 必须 | 3 | – | 写事务的保护属性:特权,安全级别和访问类型 提供用于禁止非法传输事务的访问权限信号,同AWPROT |
ARQOS | 主 | 可选 | 4 | 4’b0000 | 服务质量标识符,AXI4中未指定AxQOS的确切用途,但建议用做读/写优先级指示符,QOS值越大优先级越高,同AWQOS 在AXI3中未实现 |
ARREGION | 主 | 可选 | 4 | 4’b0000 | 写入事务的区域指示器,同AWREGION 在AXI3中未实现 |
ARUSER | 主 | 可选 | 可变,协议未定义位宽,xilinx使用0, 1, 2, … 1024 | 全0 | 一般不建议使用用户字段,同AWUSER 在AXI3中未实现 |
ARVALID | 主 | 必须 | 1 | – | valid |
ARREADY | 丛 | 必须 | 1 | – | ready |
2.6 读数据通道信号
信号 | 源 | 必需/可选 | 位宽 | 默认值 | 描述 |
---|---|---|---|---|---|
RID | 从 | 可选 | 可变,协议未定义位宽 | – | 写数据识别ID, 与ARID保持一致用来对应地址和数据 |
RDATA | 从 | 必需 | 可变,协议未定义位宽, Xilinx使用12, 13, … 64,一般为32/64 | – | 读数据 |
RRESP | 从 | 可选 | 2 | 2’b00 | 读响应,指示读事务状态,同BRESP |
RLAST | 从 | 必需 | 1 | – | 指示读事务中的最后一次数据传输 RLAST置1表明此时刻的数据是最后一份数据,同WLAST |
RUSER | 从 | 可选 | 可变,协议未定义位宽,xilinx使用0, 1, 2, … 1024 | 全0 | 一般不建议使用用户字段 在AXI3中未实现 |
RVALID | 从 | 必需 | 1 | – | valid |
RREADY | 主 | 必需 | 1 | – | ready |
三. AXI协议其它关键点
3.1 通道间的时序关系
AXI协议规定各通道间需要保证以下三种关系:
-
写回复必须在最后一个写数据完成后 -
读数据必须在接收到读地址信号后产生 -
通道间的握手需要满足通道间的依存关系
除了这三种联系外,协议未定义通道间的任何其它关系。这意味着写数据可在写地址之前位于数据总线上,或者写数据与写地址也可出现在相同的周期中,等等这些情况都是合乎协议的。
前两种联系很好理解,接下来我们讨论第三种情况:通道间的握手信号依赖。
3.2 VALID与READY的握手机制
AXI协议的五个通道都通过VALID和READY进行握手。VALID由数据发送端驱动,VALID置1表示发送数据有效,接收端可以接收了;READY由数据接收端驱动,READY置1表示接收端已准备好接收数据。数据总在VALID与READY同时为高的时钟信号的上升沿完成传输,同时为高持续一个时钟周期,数据就传输一次。
为避免出现死锁的情况,VALID与READY需要满足以下条件:
-
发送信息的AXI接口的VALID信号不得依赖于接收该信息的AXI接口的READY信号。 -
接收信息的AXI接口应该可以等待,直到检测到VALID信号后再声明其对应的READY信号。当然接收端也可以不等待VALID有效,而根据自身情况置高READY。
可见,READY信号的置高是灵活的,可以在检测到VALID有效后再置高,也可以在自身准备好接收信息后置高而不依赖于VALID信号。即READY允许依赖VALID。VALID则不允许依赖READY。
握手信号之间的先后顺序:
-
在读交易时,RVALID必须在ARVALID与ARREADY有效后才置高,也就是说必须在读地址确定后,才能发送要读的数据。 -
在写交易中,BVALID必须在AWVALID与AWREADY,WVALID与WREADY都有效后才置高,也就是说必须在写地址和写数据都确定后,才能发送写响应。
如果本文对你有所帮助,欢迎点赞、转发、收藏、评论让更多人看到,赞赏支持就更好了。
如果对文章内容有疑问,请务必清楚描述问题,留言评论或私信告知我,我看到会回复。
徐晓康的博客持续分享高质量硬件、FPGA与嵌入式知识,软件,工具等内容,欢迎大家关注。