一、简介
1、AXI 简介
AXI,全称Advanced Extensible Interface,高级可扩展接口,是ARM在AMBA3中推出的核心成员,是现代SOC中实现高带宽、低延迟设备互联的标准接口。
AXI的核心设计理念是通道分离、地址/数据解耦、高效握手,能满足从简单寄存器配置到高速DDR存储的各类通信需求,其主要特点如下所示:
- 分离的地址/控制和数据阶段
- 通过字节选通方式支持非对齐的数据传输
- 使用Burst传输,只需发出起始地址
- 单独的读写数据通道,这可以提供低成本的直接内存访问(DMA)
- 支持发布多个超前地址(outstanding)
- 支持完成乱序事务(out-of-order)
- 易于添加register stage来达到时序收敛
- AXI协议包含实现功耗操作的可选扩展信号
2、AXI 版本
AXI3:在AMBA3中正式推出,定义了读写5个独立的通道,支持突发长度1~16拍,支持事务ID,支持out-of-order乱序完成,性能够用,但是突发长度受限,不适合超高速外设。
AXI4:是目前最主流、最常用的版本,分为3个子集:
- AXI4(Full),突发长度扩展到1~256拍,支持更大的带宽,更高效的存储器访问,主要用在高性能通路上,如DDR,GPU,PCIe,DMA等;
- AXI4-Lite,是一个轻量简化的版本,不支持突发,只能单次读写,接口信号最少,逻辑也最简单,一般用在寄存器配置,UART,I2C等低速外设上;
- AXI4-Stream,没有地址,纯数据流,只负责传输数据,可以无限突发,用于视频、图像、DSP等高速串行数据的传输。
AXI5:在AXI4的基础上增加了安全特性(TrustZone、权限控制、隔离)、QoS优先级,更强的原子操作,更严格的时序和物理层设计,主要面向车规芯片、高端手机SOC、服务器、AI芯片等。
3、AXI 通道
AXI基于Burst传输,定义了五个独立的事务通道:
- 读地址通道
- 读数据通道
- 写地址通道
- 写数据通道
- 写响应通道
五个通道的图示如下:
+--------+ +--------+
| Master | | Slave |
| | | |
| | 写地址通道 (AW) ---------------> | |
| | | |
| | 写数据通道 (W) ---------------> | |
| | | |
| | 写响应通道 (B) <--------------- | |
| | | |
| | 读地址通道 (AR) ---------------> | |
| | | |
| | 读数据通道 (R) <--------------- | |
+--------+ +--------+SystemVerilog读/写地址通道携带着控制信息,用于描述传输数据的属性;读数据通道将数据从从机传输到主机;写数据通道将数据从主机传输到从机;并且在写事务中,从机通过写响应通道向主机指示传输完成。五个通道的特点如下所示:
| 通道 | 特点 |
| 读/写地址通道 | 读/写事务都有自己的地址通道,地址通道携带传输事务所需的所有地址和控制信息 |
| 读数据通道 | 读数据通道既携带读数据,也携带Slave端到Master端的读响应信息,包括: 读数据总线:可以是8、16、32、64、128、256、512或1024位宽 读响应信号:表示读事务的完成状态 |
| 写数据通道 | 写数据通道将写数据Master端传输到Slave端,包括: 写数据总线:可以是8、16、32、64、128、256、512或1024位宽 字节选通信号:每8个数据位对应一个字节通道选通信号,指示数据的哪些字节是有效的 写数据通道的数据信息被认为是缓冲(buffered)了的,“主”无需等待“从”对上次写传输的确认即可发起一次新的写传输。 |
| 写响应通道 | Slave使用写响应通道来响应写事务,所有写事务都需要写响应通道上返回完成信号 对每个突发,完成信号只产生一次,而不是对事务中的每个数据传输都返回一个完成信号 |
4、AXI 信号
AXI各版本的信号总结如下表:
| 通道 | 来源 | AXI3 | AXI4 | AXI5 | 解释 |
| Global | Global | ACLK | * 全局时钟信号,所有信号都在全局时钟的上升沿被采样 | ||
| Global | ARESETn | * 全局时钟信号,所有信号都在全局时钟的上升沿被采样 | |||
| Write addr | Master | AWID[3:0] | * 写地址ID | ||
| Master | AWADDR[31:0] | * 写地址,写地址通道在写突发事务中给出第一次传输的地址 | |||
| Master | AWLEN[3:0] | AWLEN[7:0] | * 突发长度,即写事务中数据传输的确切数量。此信息确定与该地址相关的数据传输的数量 * 突发长度AWLEN+1 * AXI3:所有类型支持1~16的突发长度 * AXI4/5:INCR类型支持1~256的突发长度、其他类型还是只支持1~16的突发长度 | ||
| Master | AWSIZE[2:0] | * 突发大小,即在突发中每次数据传输的byte数 000:1、001:2 、010:4、011:8、100:16、101:32、110:64、111:128 | |||
| Master | AWBURST[1:0] | *突发类型,加上突发大小,即可计算突发内每个传输的地址 00:FIXED、01:INCR、10:WRAP、11:Reserved | |||
| Master | AWLOCK[1:0] | AWLOCK | * 锁定类型,提供关于传输的原子特性的附加信息 * AXI3:00:normal、01:Exclusive、10:Locked、11:Reserved * AXI4/5:0:normal、1:Exclusive | ||
| Master | AWCACHE[3:0] | * 内存类型,指示事务的bufferable、cacheable、write-through、write-back和allocate属性 | |||
| Master | AWPROT[2:0] | * 保护类型,指示事务的特权和安全级别,以及该事务是数据访问还是指令访问 * AWPROT[0]:0-Unprivileged、1-Privileged * AWPROT[1]:0-Secure、1-Non-Secure * AWPROT[2]:0-Data、1-Instruction | |||
| Master | AWVALID | * Master发出,表示Master发出的写地址/控制信息是有效的 * 地址/控制信息需要保持稳定,直到AWREADY信号变为1 | |||
| Slave | AWREADY | *Slave发出,表示Slave已经准备好接受一个地址和相关的控制信号 | |||
| Master | / | AWQOS[3:0] | * 服务质量,每个写事务发送的QoS标识符,即优先级 | ||
| Master | / | AWREGION | * 区域标识符,允许Slave的单个物理接口用于多个逻辑接口 | ||
| Master | / | AWUSER | * 用户信号,可选的写地址通道中的用户自定义信号 | ||
| Write data | Master | WID[3:0] | / | * 写数据ID | |
| Master | WDATA[$:0] | * 写数据,宽度为8*2^n,最高可配置为1024 | |||
| Master | WSTRB[$:0] | * 写选通,指示内存中要更新的字节通道 * 写数据总线的每8位有1个写选通,因此WSTRB[n]对应于WDATA[8n+:8] | |||
| Master | WLAST | * 写突发中的最后一次传输 | |||
| Master | WVALID | * Master发出,表示Master发出的写数据/选通是有效的 | |||
| Slave | WREADY | * Slave发出,表示Slave可以接受写数据 | |||
| Master | / | WUSER | * 用户信号,可选的写数据通道中的用户自定义信号 | ||
| Write response | Slave | BID[3:0] | * 写响应ID | ||
| Slave | BRESP[1:0] | * 写响应,指示写传输的状态: 00:OKAY、01:EXOKAY、10:SLVERR、11:DECERR | |||
| Slave | BVALID | * Slave发出,表示Slave发出的写响应是有效的 | |||
| Master | BREADY | * Master发出,表示Master可以接受写响应 | |||
| Slave | BUSER | * 用户信号,可选的写响应通道中的用户自定义信号 | |||
| Read addr | Master | ARID[3:0] | * 读地址ID | ||
| Master | ARADDR[31:0] | * 读地址,读地址总线在读突发事务中给出第一次传输的地址 | |||
| Master | ARLEN[3:0] | ARLEN7:0] | * 突发长度,即读事务中数据传输的确切数量。此信息确定与该地址相关的数据传输的数量 * 突发长度ARLEN+1 * AXI3:所有类型支持1~16 * AXI4/5:INCR类型支持1~128、其他类型还是只支持1~16 | ||
| Master | ARSIZE[2:0] | * 突发大小,即在突发中每次数据传输的byte数 000:1、001:2 、010:4、011:8、100:16、101:32、110:64、111:128 | |||
| Master | ARBURST[1:0] | *突发类型,加上突发大小,即可计算突发内每个传输的地址 00:FIXED、01:INCR、10:WRAP、11:Reserved | |||
| Master | ARLOCK[1:0] | ARLOCK | * 锁定类型,提供关于传输的原子特性的附加信息 * AXI3:00:normal、01:Exclusive、10:Locked、11:Reserved * AXI4/5:0:normal、1:Exclusive | ||
| Master | ARCACHE[3:0] | * 内存类型,指示事务的bufferable、cacheable、write-through、write-back和allocate属性 | |||
| Master | ARPROT[2:0] | * 保护类型,指示事务的特权和安全级别,以及该事务是数据访问还是指令访问 * ARPROT[0]:0-Unprivileged、1-Privileged * ARPROT[1]:0-Secure、1-Non-Secure * ARPROT[2]:0-Data、1-Instruction | |||
| Master | ARVALID | * Master发出,表示Master发出的读地址/控制信息是有效的 * 地址/控制信息需要保持稳定,直到ARREADY信号变为1 | |||
| Slave | ARREADY | * Slave发出,表示Slave已经准备好接受一个地址和相关的控制信号 | |||
| Master | / | ARQOS[3:0] | * 服务质量,每个读事务发送的QoS标识符,即优先级 | ||
| Master | / | ARREGION | * 区域标识符,允许Slave的单个物理接口用于多个逻辑接口 | ||
| Master | / | ARUSER | * 用户信号,可选的写地址通道中的用户自定义信号 | ||
| Read data | Slave | RID[3:0] | * 读数据ID | ||
| Slave | RDATA[$:0] | * 读数据,宽度为8*2^n,最高可配置为1024 | |||
| Slave | RRESP[1:0] | * 读响应,指示读传输的状态: 00:OKAY、01:EXOKAY、10:SLVERR、11:DECERR | |||
| Slave | RLAST | * 读突发中的最后一次传输 | |||
| Slave | RVALID | * Slave发出,表示Slave发出的读数据是有效的 | |||
| Master | RREADY | * Master发出,表示Master可以接受读数据和响应信息 | |||
| Slave | / | RUSER | * 用户信号,可选的读响应通道中的用户自定义信号 | ||
| Low Power | CLK_CtrI | CSYSREQ | / | * 0:时钟控制器发出请求,表示外设需要进入低功耗状态 * 1:时钟控制器发出请求,表示外设需要退出低功耗状态 | |
| Devi ce | CSYSACK | / | * 0:外设响应时钟控制器发出的CSYSREQ=0的请求,即同意进入低功耗状态 * 1:外设响应时钟控制器发出的CSYSREQ=1的请求,即同意推出低功耗状态 | ||
| Device | CACTIVE | / | * 时钟活跃指示信号,表明外设需要时钟 * 0:外设不再需要时钟,系统时钟控制器可以禁用时钟,但不是必须这样做 * 1:外设需要启用时钟,系统时钟控制器必须立即启用时钟 | ||
| Master | / | AWAKEUP | * Master发出,为1表示读写请求通道上可能有活动 | ||
5、AXI 架构
一个典型的AXI系统由许多Master和Slave组成,通过某种形式的互联连接在一起,如下图所示:

6、术语说明
- Transaction(事务):AXI总线上所需的信息交换的完整集合构成了AXI Transaction。一个主机发起一个Transaction来与一个从机通信。通常事务需要在多个通道上的主机和从机之间交换信息。
- Burst(突发):任何传输所需的有效载荷数据都作为AXI Burst传输。在AXI事务中,有效负载数据在单个Burst中传输,该Burst可以包含多个Beats(拍),或者单独的数据传输。
- Beats(拍):一个 Burst 可以包含多个数据传输,或称为AXI Beats(拍),一拍也就是AXI Burst中的单个数据的传输。
二、AXI 握手机制
AXI的所有五个事务通道,都使用相同的 “VALID/READY”握手过程来传输地址、数据和控制信息。这种双向流控机制意味着Master和Slave都可以控制信息的移动速率。
- 源端产生VALID=1信号:表示地址、数据或控制信息可用;
- 目的端生成READY=1信号:表示可以接受该信息;
- 传输只发生在VALID和READY信号都是1的时候。
1、握手过程
AXI的握手过程有如下三种:
1)VALID先来,READY后来

- T1时刻之后,目的端先将READY拉高,表明其可以接收信息,此时源端的地址、数据和控制信息还未有效;
- T2时刻之后,源端将VALID拉高,表明信息有效;
- T3时刻,VALID与READY同时为高,握手成功,完成传输;
- 这种情况下,对源端来说传输在单个周期内完成。
2)READY先来,VALID后来

- T1时刻之后,目的端先将READY拉高,表明其可以接收信息,此时源端的地址、数据和控制信息还未有效;
- T2时刻之后,源端将VALID拉高,表明信息有效;
- T3时刻,VALID与READY同时为高,握手成功,完成传输;
- 这种情况下,对源端来说传输在单个周期内完成。
3)VALID和READY同时来

图中,源端和目的端恰好都在时T1时刻之后表明可以进行地址、数据或控制信息的传输。
在这种情况下,传输发生在能够识别到VALID与READY同时为高的那个时钟上升沿,也就是T2时刻。
1. VALID信号一旦被拉高,就必须保持有效,直到READY拉高完成握手;
2. 在VALID未拉高之前,READY可以拉高后再拉低,可以随便跳,但是一旦VALID拉高,READY就必须拉高,配合VALID完成握手。
2、 握手依赖
握手依赖包括不同通道之间的依赖关系、以及同一通道中不同信号之间的依赖关系。下面给出握手依赖关系,单箭头表示信号间不依赖,双箭头表示后者必须依赖前者。
1)AXI读事务

- 读地址通道的ARVALID和ARREADY之间没有依赖关系,谁先谁后都可以;
- 读数据通道的RVALID和RREADY之间没有依赖关系,谁先谁后都可以;
- 从机必须等待主机发出的ARVALID和ARREADY同时有效,才能拉高RVALID,也就是要先等读地址传输完,再给出读数据。
2)AXI3写事务

- 写地址通道的AWVALID和AWREADY之间没有依赖关系,谁先谁后都可以;
- 写数据通道的WVALID和WREADY之间没有依赖关系,谁先谁后都可以;
- 写响应通道的BVALID和BREADY之间没有依赖关系,谁先谁后都可以;
- 写地址通道的握手信号和写数据通道的握手信号之间没有依赖关系,谁先谁后都可以;
- 从机必须等待主机发出的WVALID和WREADY同时有效,才能拉高BVALID,也就是要先等写数据传输完,才能给出写响应;
- 从机还必须等待WLAST拉高之后,才能拉高BVALID。
3)AXI4写事务

- 写地址通道的AWVALID和AWREADY之间没有依赖关系,谁先谁后都可以;
- 写数据通道的WVALID和WREADY之间没有依赖关系,谁先谁后都可以;
- 写响应通道的BVALID和BREADY之间没有依赖关系,谁先谁后都可以;
- 写地址通道的握手信号和写数据通道的握手信号之间没有依赖关系,谁先谁后都可以;
- 从机必须等待写地址通道和写数据通道的握手信号都同时有效,才能拉高BVALID,也就是要等写地址和写数据都传输完,才能给出写响应;(与AXI3不同)
- 从机还必须等待WLAST拉高之后,才能拉高BVALID。
3、版本兼容问题
如果某个AXI3从机在接收地址之前就接收完所有写数据并返回写响应,那么该从机不符合AXI4规范。将旧版本的AXI3从机迁移到AXI4时,需要增加一层封装添(Wrapper),以确保从机只有在正确接收地址之后,才返回写响应。
2丶所有AXI3主机都符合AXI4的写响应要求。
三、AXI 传输特性
AXI 传输基于Burst,主机通过驱动第一个字节的地址来开始每个Burst,后续的地址由从机来计算得出。传输特性如下:
1、突发长度 AxLEN
1) 突发长度即读写事务中数据传输的确切数量,由以下信号指定,spec中统一使用AxLEN来表示:
- ARLEN[7:0]:读传输突发长度
- AWLEN[7:0]:写传输突发长度
2) 突发长度的计算公式是:突发长度=AxLEN+1。AXI3和AXI4/5的突发长度最大值略有不同,如下所示:
- AXI3:所有突发类型都支持1~16的突发长度;
- AXI4/5:INCR突发类型支持1~256的突发长度,其他类型还是只支持1~16的突发长度。
3)AXI有以下规则来管理突发的使用:
- 对于WRAP类型突发,突发长度必须为2、4、8或16;
- 突发不能跨越4KB地址边界;(page大小为4K,4KB 边界即addr[11:0]=0的地址)
- 不支持提前终止突发。
1丶没有任何组件可以提前终止突发,然而为了减少写突发中的数据传输数量,Master可以通过取消所有WSTRB来禁用进一步的写。这种情况下Master必须在突发中完成剩余的传输(但是写的数据无效)。在读突发中,Master可以丢弃读取的数据,但它也必须完成突发中的所有传输。
2丶丢弃不需要的读数据可能导致访问读敏感设备(如FIFO)时丢失数据。当访问这样的设备时,Master必须使用与所需数据传输的大小完全匹配的突发长度。
4) 在AXI4/5中,具有INCR突发类型和长度大于16的事务可以转换为多个较小的突发,即使事务属性表明该事务是不可修改的。(请参阅关于CACHE内存属性的更改。)这种情况下,生成的突发必须保留与原始交易相同的事务特征,但是注意这些事务的突发长度被减少了,突发地址也被适当地调整了。为了实现AXI3兼容性或者保证QoS性能,需要能够将较长的突发分解为多个较短的突发。
3、突发类型 AxBURST
AXI的突发类型由信号AxBURST[1:0]来表示:
- b00:FIXED,定址突发
- b01:INCR,递增突发
- b10:WRAP,回环突发
- b11:Reserved,不支持
1)FIXED
- 地址在每次传输中都是相同的;
- 有效的字节通道对于突发中的所有节拍(beat)都是恒定的。然而在这些字节通道中,对于突发中的每一拍,断言了WSTRB的实际字节可能是不同的;
- 这种突发类型用于重复访问同一位置,例如在加载或清空FIFO时。
2)INCR
- 突发中每次传输的地址都是前一次传输地址的增量;
- 增量值取决于传输的大小。例如在一个大小为4Byte的突发中,每个传输的地址是前一个地址加4;
- 这种突发类型用于访问普通顺序内存。
3)WRAP
- WRAP突发类似于INCR突发,不同之处在于如果达到了地址上限,地址就会回环到较小的地址;
- 起始地址必须与2^AxSIZE(单拍字节数)对齐;
- 突发的长度必须为2、4、8或16次传输;
- 这种突发类型用于cache line访问。
- 例:AxADDR=0x04,AxSIZE=2(4B/拍),AxLEN=3(4拍),则访问为:0x04 → 0x08 → 0x0C → 0x00(第4拍回绕)。
4、传输响应 xRESP
| xRESP[1:0] | 响应 | 描述 |
| 00 | OKAY | 可以表示以下情况: * 正常访问成功 * 独占访问失败 * 对不支持独占访问的Slave进行了独占访问 |
| 01 | EXOKAY | 独占访问成功 |
| 10 | SLVERR | 表示一个不成功的传输事务。可能是如下情况: * FIF0或buffer溢出或欠运行状态 * 尝试不支持的传输大小 * 试图对只读位置进行写访问 * Slave的超时条件 * 试图访问已禁用或已关闭的功能 |
| 11 | DECERR | 表示互连不能成功解码S1ave访问,即事务地址上没有Slave。 * 建议互连路由出到一个Default Slave,由它返回DECERR响应 * AXI协议要求即使发生错误情况,给出DECERR响应的组件也要完成满足事务的所有数据传输 |
1)对于读事务
- Slave可以在一次突发中对不同拍的传输发出不同的响应信号。例如在16次读传输的突发事务中,Slave可能会为其中15次传输返回OKAY响应,并为其中1次传输返回SLVERR响应。
2)对于写事务
- Slave为整个突发事务发出单个响应信号,而不是为突发事务中的每拍数据传输发出响应。
协议规定即使报告了错误,也必须执行所需数量的数据传输。例如Slave要求了8个读传输,但Slave有错误情况,也必须执行8个数据传输,每个都有一个错误响应。如果Slave给出一个错误响应,不会取消突发的剩余部分。
5、保护类型 AxPROT
AXI提供如下的保护类型,可用于防止非法访问:
| 信号 | 值 | 类型 |
| AxPROT [0] | 0 | 非特权访问 |
| 1 | 特权访问 | |
| AxPROT[1] | 0 | 安全访问 |
| 1 | 非安全访问 | |
| AxPROT[2] | 0 | 数据访问 |
| 1 | 指令访问 |
1)Master可能支持多个级别的操作特权,并将这个特权概念扩展到内存访问。有些处理器支持多级特权,请参阅所选处理器的文档以确定到AXI特权级别的映射。AXI能提供的唯一区别是特权访问和非特权访问。
2)Master可能支持安全和非安全操作状态,并将这种安全概念扩展到内存访问。AxPROT[1]是为了在断言该事务时将其标识为非安全,这与ARM安全扩展实现中的其他信号一致。
3)AxPROT[2]指示该事务是指令访问还是数据访问。这种指示并非都准确,例如当一个事务包含指令和数据项的混合时。建议Master设置AxPROT[2]为0以指示数据访问,除非该访问是明确已知的指令访问。
6、原子访问 AxLOCK
AxLOCK信号涉及到原子访问的相关特性,AxLOCK代表的事务类型有Exclusive独占访问和Locked锁定访问。AXI4/5不再支持锁定访问,因为大多数组件不需要锁定事务,且这对互连复杂性和QoS都有影响。
1)AXI3原子访问
信号AxLOCK[1:0]
- b00:Normal access,正常访问
- b01:Exclusive access,独占访问
- b10:Locked access,锁定访问
- b11:Reserved,不支持
2)AXI4/5原子访问
信号AxLOCK
- b0:Normal access,正常访问
- b1:Exclusive access,独占访问
3)版本问题
AXI3的锁定事务转换到AXI4时,按照以下方式进行转换:
AxLOCK[1:0] = 2’b10转换为普通事务,即AxLOCK= 1’b0。
1丶建议任何执行这种转换的组件(通常是互连),要包含一个可选的机制来检测和标记这种转换已经发生;
2丶如果执行这种转换,任何不能正确操作的组件都不能在AXI4/5环境中使用;
3丶对于许多使用锁定事务的遗留情况,例如执行SwP指令,可能需要对软件进行更改,以防止使用任何强制锁定事务的指令。