AXI4简介
起初SoC片上总线处于发展阶段,不像微机总线那样成熟,目前还没有统一的标准,因此各大厂商和组织纷纷推出自己的标准,以便在未来的SoC片上总线标准中占有一席之地。ARM公司就在1995年推出了自己的总线——AMBA(Advanced Microcontroller Bus Architecture,高级微处理器总线架构)。它独立于处理器和制造工艺技术,增强了各种应用中的外设和系统宏单元的可重用性,非常适合于现代大规模集成电路设计自动化的要求。
AXI 表示 Advanced Extensible Interface(高级可扩展接口),包含在AMBA标准中。AXI4 接口 (AMBA 4.0) 分 3 种类型:
- AXI4 (AXI4-Full):主要面向高性能地址映射通信的需求,是面向地址映射的接口,允许最大256轮的数据突发传输。
- AXI4-Lite:一个轻量级的地址映射单次传输接口,占用很少的逻辑单元。适用于吞吐量较小的地址映射通信总线。
- AXI4-Stream:用于高速流传输数据,去掉了地址项,允许无限制的数据突发传输规模。
这里需要首先介绍一下存储映射(Meamory Map):如果一个协议是存储映射的,那么主机所发出的会话(无论读或写)就会标明一个地址。这个地址对应于系统存储空间中的一个地址,表明是针对该存储空间的读写操作。
AXI4 协议支持突发传输,主要用于处理器访问存储器等需要指定地址的高速数据传输场景。AXI-Lite为外设提供单个数据传输,主要用于访问一些低速外设中的寄存器。而 AXI-Stream 接口则像 FIFO 一样,数据传输时不需要地址,在主从设备之间直接连续读写数据,主要用于如视频、高速 AD、PCIe、DMA 接口等需要高速数据传输的场合。
协议的制定是要建立在总线构成之上的。AXI总线协议的两端可以分为分为主(master)、从(slave)两端,是多主多从的拓扑结构,其拓扑结构如下图所示,他们之间一般需要通过一个AXI Interconnect相连接。作用是提供将一个或多个AXI主设备连接到一个或多个AXI从设备的一种交换机制。
主设备和从设备需要按照约定好的数据传输方式来发送和接收数据。AXI 协议就是描述了主设备和从设备之间的数据传输方式。在该协议中,主设备和从设备之间通过握手信号建立连接。所谓的握手呢就是在通信过程中,主从之间会进行协调,只有等接收方准备好之后,才能开始数据传输,这种机制我们称之为“握手”。
AXI Interconnect的主要作用是:当存在多个主机以及从机器时,AXI Interconnect负责将它们联系并管理起来。由于AXI支持乱序发送,乱序发送需要主机的ID信号支撑,而不同的主机发送的ID可能相同,而AXI Interconnect解决了这一问题,他会对不同主机的ID信号进行处理让ID变得唯一。
AXI协议将读地址通道,读数据通道,写地址通道,写数据通道,写响应通道分开,各自通道都有自己的握手协议。每个通道互不干扰却又彼此依赖。
AXI总线优点
AMBA AXI 协议支持支持高性能、高频率系统设计。
- 适合高带宽低延时设计
- 无需复杂的桥就能实现高频操作
- 能满足大部分器件的接口要求
- 适合高初始延时的存储控制器
- 提供互联架构的灵活性与独立性
- 向下兼容已有的AHB和APB接口特性
- 分离的地址/控制、数据相位
- 使用字节选通,支持非对齐的数据传输
- 基于 burst 传输,只需传输首地址
- 读写数据通道分离,能提供低功耗 DMA
- 支持多种寻址方式
- 支持乱序传输
- 易于添加寄存器级来进行时序收敛
-
通道
AXI 协议定义了 5 条通道:其中 2 条用于读取传输事务(transaction):
- 读地址(AR):read address
- 读数据 (R):read data
另 3 条用于写入传输事务(transaction):
- 写地址(AW):write address
- 写数据(W):write data
- 写响应(R):write response
很多人会有疑问,既然有写响应通道,为什么没有读响应通道呢?原因其实也很简单,因为读数据通道本身就具备了读响应功能。其实就是用读数据通道来传输读响应信号。
读传输事务
当AXI4总线进行读传输事务时,首先会由主设备通过读地址通道向从设备发送地址和部分控制信号,然后该地址的数据通过读数据通道由从设备发送给主设备。
每个地址可多次发生数据传输,此类型的传输事务称为突发。需要注意的是AXI4-Lite是不支持突发的。
-
写传输事务
当AXI4总线进行写传输事务时,首先由主设备通过写地址通道向从设备发送写地址信号,方便从设备设置地址和部分控制限号,然后主设备再通过写数据通道向从设备发送此地址要写入的数据信号,最后由从设备向主设备通过写响应通道发送写响应信号,以指示数据写入是否成功。
写响应通道 (Write Response Channel) 上可能的响应值包括:
- OKAY (0b00):正常访问成功。表示已成功完成正常访问
- EXOKAY (0b01):专属访问成功。
- SLVERR (0b10):从设备错误。已成功访问从设备,但从设备希望向发端主设备返回错误条件(例如,数据读取无效)。
- DECERR (0b11):解码器错误。通常由互连组件生成,用于指示传输事务地址处没有任何从设备
-
通道定义
5个通道都具有的同一类信号:VALID、READY。这两个信号用来实现AXI协议的握手机制(handshake)。在读写数据两条数据通道中,传输突发传输(Burst Transaction)中的最后一个数据,必须要给出 LAST 信号,来标识这是此次突发传输中的最后一个数据。在共同的定义之外,各个通道有自己的定义。
读写地址通道
读、写事务分别向读、写通道写入本次事务的地址和部分控制信号。
读数据通道
从机通过读数据通道向主机发送当前地址的数据以及本次传输的响应。总线数据位宽可以是8,16,32,64,128,512或1024bit。
写数据通道
主机通过写数据通道向从机发送当前地址将要写入的数据。总线数据位宽可以是8,16,32,64,128,512或1024bit。写数据通道还具有STROBE 信号,该信号以数据的字节为单位进行选取,可实现数据的掩码功能。也就是不写入我们不想写入的数据,关于数据掩码的话DDR3部分有比较详细的介绍。
写响应通道
写响应通道用于从机将写操作响应回复给主机。所有写传输操作都需要以写回复通道上接收写响应作为完成信号。
信号
全局信号
ACLK:全局时钟信号,所有的传输操作都发生在 ACLK 的上升沿。
ARESETn:低电平有效的同步复位信号(可以是异步复位,但必须同步释放在时钟上升沿,即异步复位同步释放)。
写地址通道信号
写地址通道包含的所有信号如下表所示:
信号 | 方向 | 含义 |
AWID | O | 写地址ID,用于对应写地址与写应答。 |
AWADDR | O | 写地址,突发写的首地址。 |
AWLEN | O | 写突发传输长度,单位字节。 |
AWSIZE | O | 一次写数据的字节数。 |
AWBURST | O | 写突发传输类型,一般取值2’d1。 |
AWLOCK | O | 锁类型,只为了兼容AXI3协议,取值为0。 |
AWCACHE | O | 写突发传输的数据存储方式(针对从机怎样存数据)。 |
AWPROT | O | 写突发的优先级和保护类型,一般取值3’d0。 |
AWQOS | O | 服务质量,一般取值4’d0。 |
AWREGION | O | 区域标识符,允许从机上的单个物理接口用于多个逻辑接口,一般不使用。 |
AWUSER | O | 用户自定义信号。 |
AWVALID | O | 写地址有效指示信号,高电平有效。 |
AWREADY | I | 写地址应答信号,高电平有效。 |
这里只给出常用信号的讲解:
- AWADDR:写地址,给出一次写突发传输的写地址。主机到从机;
- AWLEN :写传输的突发长度。主机到从机;
- AWSIZE:写突发大小,给出每次突发传输的字节数。主机到从机;
- AWBURST:突发类型。主机到从机;
- AWVALID:有效信号,表明此通道的地址控制信号有效。主机到从机;
- AWREADY:表明"从"可以接收地址和对应的控制信号。从机到主机。
注意AW开头的信号都是写地址通道的信号。
写数据通道
信号 | I/O | 含义 |
WID | O | 写ID,只在AXI3协议中支持。 |
WDATA | O | 写数据,数据位宽与AWSIZE信号设置一致。 |
WSTRB | O | 写数据掩码,低电平有效。 |
WLAST | O | 指示一次写突发传输的最后写入的一个数据。 |
WUSER | O | 写数据通道用户自定义信号。 |
WVALID | O | 写数据有效指示信号,高电平有效。 |
WREADY | I | 写数据应答信号,高电平有效。 |
注意W开头的信号都是写数据通道的信号。
写响应通道
信号 | I/O | 含义 |
BID | I | 写响应ID,必须与AWID的数值匹配。 |
BRESP | I | 写响应,为0表示从机正确接收写入数据。 |
BUSER | I | 写响应通道用户自定义数据。 |
BVALID | I | 写通道数据有效指示信号,高电平有效。 |
BREADY | O | 写通道数据应答信号,高电平有效。 |
B开头的都是写响应信号,至于为什么是B开头呢?官方的解释是B stands for buffered, because the response from the subordinate happens after all writes have completed.
读数据通道
信号 | I/O | 含义 |
RID | I | 读ID,必须与ARID保持一致。 |
RDATA | I | 读数据,数据位宽与AWSIZE信号设置一致。 |
RRESP | I | 读应答信号,为0表示读数据正常。 |
RLAST | I | 指示一次读突发传输的最后写入的一个数据。 |
RUSER | I | 读数据通道用户自定义信号。 |
RVALID | I | 读数据有效指示信号,高电平有效。 |
RREADY | O | 读数据应答信号,高电平有效。 |
R开头的都是读数据通道信号。
读地址通道
信号 | 方向 | 含义 |
ARID | O | 读地址ID,与读数据的ID对应。 |
ARADDR | O | 读地址,突发读的首地址。 |
ARLEN | O | 读突发传输长度,单位字节。 |
ARSIZE | O | 一次读数据的字节数。 |
ARBURST | O | 读突发传输类型,一般取值2’d1。 |
ARLOCK | O | 锁类型,只为了兼容AXI3协议,取值为0。 |
ARCACHE | O | 读突发传输的数据存储方式(针对从机怎样存数据)。 |
ARPROT | O | 读突发的优先级和保护类型,一般取值3’d0。 |
ARQOS | O | 服务质量,一般取值4’d0。 |
ARREGION | O | 区域标识符,允许从机上的单个物理接口用于多个逻辑接口,一般不使用。 |
ARUSER | O | 用户自定义信号。 |
ARVALID | O | 读地址有效指示信号,高电平有效。 |
ARREADY | I | 读地址应答信号,高电平有效 |
以下是读地址通道中比较重要的几个信号,AW开头的都是读地址通道信号。
- ARADDR:读地址,给出一次读突发传输的读地址。主机到从机;
- ARLEN:传输的突发长度。主机到从机;
- ARSIZE:读突发大小,给出每次突发传输的字节数。主机到从机;
- ARBURST:突发类型。主机到从机;
- ARVALID:有效信号,表明此通道的地址控制信号有效。主机到从机;
- ARREADY:表明"从"可以接收地址和对应的控制信号。从机到主机。
-
握手机制
AXI 总线共有 5 个独立的通道,分别为写地址、写数据、写回应、读地址、读数据通道。5 条通道相互独立,有一些细小的差别,但共同使用一套握手机制:VALID/READY 机制,来实现信息的传递。
在握手机制中,通信双方分别扮演发送方(Source)和接收方(Destination),两者的操作(技能)并不相同。
- 发送方置高 VALID 信号表示发送方已经将数据,地址或者控制信息已经就绪,并保持于消息总线上
- 接收方置高 READY 信号表示接收方已经做好接收的准备
当双方的 VALID/READY 信号同时为高,在时钟 ACLK 上升沿,完成一次数据传输。所有数据传输完毕后,双方同时置低自己的信号。所谓的双向流控机制,指的是发送方通过置起 VALID 信号控制发送的时机与速度,接收方也可以通过 READY 信号的置起与否控制接收速度。发送方拥有传输的主动权,但接收方在不具备接收能力时,也能够置低信号停止传输,反压发送方。
三种握手情况
情况1:VALID信号先到达,READY信号后到达(主机先于从机做好了发送数据的准备)
主机先拉高TVALID信号--表明当前主机可以传送数据给从机,而TVALID一旦被拉高,则只能在从机进行响应传输了数据后才能拉低。从机在接收到主机发送的准备好的信号后,会对自身的情况做判断,判断自己是否具备了接收数据的准备,这也给了从机对数据流进行反压的能力,保证从机的接收处理能力不会瘫痪。一旦从机可以接收数据,便拉高TREADY信号,表明自己可以接收数据。此时TVALID && TREADY为高,在时钟的上升沿进行数据传输。
情况2:READY信号先到达,VALID 信号后到达(主机后于从机做好了发送数据的准备)
从机拉高TREADY信号,表明自己可以接收数据。主机会对自身的情况做判断,判断自己是否具备了发送数据的准备,一旦主机可以发送数据便拉高TVALID信号,此时TVALID && TREADY为高,在时钟的上升沿进行数据传输。
情况3:VALID、READY信号同时到达(主机、从机同时做好了传输数据的准备)
主机拉高TVALID信号的同时从机拉高TREADY信号,分别表明自己可以发送/接收数据,在时钟的上升沿进行数据传输。
各个通道之间基本是独立的,以下3种联系除外:
- 写回复必须在其所属传输的最后一个写数据完成后
- 读数据必须在接收到读地址信号后产生
- 通道间的握手需要满足通道间的握手依赖性(handshake dependencies)
为了防止死锁(deadlock)情况的产生(如VALID信号等READY信号,而READY信号又在等VALID信号,这样就永远都没法握手),握手信号需满足以下规则:
- 发送方的VALID信号不能依赖READY信号来置位
- 接收方 READY 信号可以检测到 VALID 置位后再置位
以下是上述原则具体到各种情况的具体分析。图中单箭头表示其指向的信号可以在箭头起始信号置位之前或之后置位或同时置位(无依赖);图中的双头箭头表示:其指向的信号必须在箭头起始信号置位之后置位(指向信号依赖起始信号)。
读事务的依赖性:
- 主机的 ARVALID 信号禁止等待从机的 ARREADY 信号置位后才置位,防止死锁。
- 从机的 ARREADY 信号可以先于主机、后于主机或同时于主机的 ARVALID 信号置位(如单头箭头所示),无依赖性。
- 从机的 RVALID 信号必须等待 ARVALID 和 ARREADY 信号均置位后置位(如两个双头箭头所示),具有依赖性。
- 从机的 RVALID 信号禁止等待主机的 RREADY 信号置位后才置位,防止死锁。
- 主机的 RREADY 信号可以先于从机、从于主机或同时于从机的 RVALID 置位前置位(如单头箭头所示),无依赖性。
写事务的依赖性:
写事务的依赖性与读事务的依赖性分析方法大同小异,图中+号的含义:BVALID信号必须等待 WVALID 和WREADY 信号均置位后置位,同时还依赖WLAST信号的置位。这是因为BVALID信号是写响应有效信号,而我们知道一次写数据的数据使用WLAST信号来表征最后一个数据,也就是说WLAST在被置位之前,一次突发传输是没有结束的。
传输事务结构
突发传输
突发写时序
突发读时序
突发长度
指一次突发传输的数据长度。读事务ARLEN[7:0];写事务AWLEN[7:0]。协议中的 AxLen 信号从零开始表示,实际的长度值为 AxLen + 1。即Burst_Length = AxLEN[7:0] + 1
突发传输须遵守以下规则:
- WRAP传输类型(一次突发传输类型,后面会说)的突发长度只能是2,4,8,16。
- 在一次突发传输中,地址不能跨越一个 4KB 分区(协议中之所以规定一个burst不能跨越4K边界是为了避免一笔burst交易访问两个slave。每个slave的地址空间是4K/1K对齐的,4K对齐最大原因是系统中定义一个page大小是4K,而所谓的4K边界是指低12bit为0的地址)。
-
突发传输不能在完成所有数据传输前提前结束(early termination)。突发传输宽度
指传输中的数据位宽,具体地,是每周期传输数据的字节数量,在协议中使用AXSIZE信号控制。突发传输宽度信号AXSIZE位宽为 3bit,表示为:传输宽度= 2 ^ AXSIZE。比如,AXSIZE为111,则传输宽度为2的7次方也就是128。
突发传输类型
共有 3 种,分别为 FIXED,INCR 以及 WRAP:
FIXED:每次传输事务的地址均为同一地址。该类型适合对同一地址进行反复操作,例如写入或者读出FIFO,其操作地址就是固定的。
INCR:增量突发,后续数据的地址在初始地址的基础上进行递增,递增幅度与传输宽度相同。适合对于 RAM 等通过地址映射(mapped memory)的存储介质进行读写操作,最为常用。
WRAP:与增量突发类似,不过其地址增长到最高地址后会跳转到边界地址,再重新递增。适合对cache的访问。
写选取掩码
WSTRB 信号中的单个 bit 拉高,表示对应位置上的字节有效,对应关系为:WSTRB[n] 对应 WDATA[8n+7:8n],也就是:当WSTRB[n]为1时,WDATA[8n+7:8n]有效。WSTRB 信号比特位宽等于数据通道位宽的字节数量,比如 32bit 位宽的数据通道,对应 WSTRB 信号位宽为 4bit。
读、写响应
前文已经详细描述,故此处不再赘述。
Outstanding(超前传输)
AXI支持Outstanding超前传输,这便是AXI总线能够实现高性能传输的原因之一。Outstanding传输是指Master发出命令后,不必等待数据全写完或者全读回就可以发起下一笔命令。Outstanding深度是指Master发出的正在进行的命令数量,显然这需要Master和Slave准备更大的buffer来保存这些命令信息。
下图可以看出,A地址发出后,没有等数据A1~A3传输完成,便发出了B地址请求,这种操作就叫做outstanding,如果只能等当前数据传输完成才能发送下一笔传输地址,则outstanding能力为1。总线Master的行为如下(AHB总线就没有outstanding能力):
读操作:读地址命令 -> 等待读数据返回 -> 读地址命令 -> 等待读数据返回 -> 。。。。。
写操作:写地址命令->写数据->等待写响应返回->写地址命令->写数据->等待写响应返回。。。。。(如果支持out-of-order,对于AXI3,写命令和写数据不一定有先后顺序且ID顺序不一定相同,AXI4因为已经没有WID信号,所以写数据的顺序要和写地址的顺序一样)
而如果outstanding能力为N>1的话,则:
读操作:可以连续发N个读地址命令,这期间如果读数据没有返回,则需要等待读数据返回,如果有读数据返回,则返回了几个,那么仍然可以接着发几个。也就是说,“在路上” 的读命令(或者读数据)最多可以是N。多说一点,可以看出,如果数据返回得比较慢,那么IP需要等待,效率就会比较低,因此,为了提高效率,有必要提高outstanding能力,以弥补”路上“(总线)引入的延时。但是也不能无限制地发,否则有可能会引起总线拥塞,把其他IP给堵住。
写操作:可以连续发出N组写地址(写数据)命令,这期间如果写响应没有返回,则必须等待写响应返回才能接着发写地址(写数据)命令,如果有写响应返回,则返回了几个,那么仍然可以接着发几组。也就是说,“在路上” 的写响应最多可以是N。
Out-of-order(乱序传输)
AXI拥有事务ID,因此支持Out-of-order乱序传输,Out-of-order传输是指后发送的命令对应的响应可以先回来,注意必须是不同ID之间,相同ID之间不能乱序传输数据。
Out of order的意思是如果A的slave反应比较慢,或者正在忙别的事情,或者通往地址所在空间的delay过大,这时master可以不用等待A的slave的传输完成,直接发起针对B地址的slave访问。
下图中,地址的顺序为A、B,而数据顺序则是B、A,这个操作就是out of order。这个操作可以更灵活的运用不同访问之间的等待延迟,进一步提高总线效率。
乱序传输存在读数据重排序深度的问题,读数据重排序深度是指Slave中可以重排序的暂挂地址的数量。按顺序处理所有事务的Slave的读数据重排序深度为1。读数据重排序深度是一个静态值,必须由Slave的设计者指定。没有一种机制可以让Master确定Slave的读数据重排序深度。(所以发的太多会造成反压)。
Interleaving(交织传输)
AXI拥有事务ID,因此支持Interleaving交织传输,Interleaving传输是指不同命令的数据之间可以插队重排,注意必须是不同ID之间,相同ID之间不能交错传输数据。对于支持写数据交错的Slave,它接收每个事务的第一个数据项的顺序必须与它接收事务地址的顺序相同。
-
AXI和AXIS的区别
AXIS为AXI Stream的缩写
1、axi主要负责控制层面,axis主要负责数据层面。
2、axi的工作模式:
axi总线分为五个通道:
读地址通道,包含ARVALID, ARADDR, ARREADY信号;
写地址通道,包含AWVALID,AWADDR, AWREADY信号;
读数据通道,包含RVALID, RDATA, RREADY, RRESP信号;
写数据通道,包含WVALID, WDATA,WSTRB, WREADY信号;
写应答通道,包含BVALID, BRESP, BREADY信号;
系统通道,包含:ACLK,ARESETN信号;
其中ACLK为axi总线时钟,ARESETN是axi总线复位信号,低电平有效;读写数据与读写地址类信号宽度都为32bit;READY与VALID是对应的通道握手信号;WSTRB信号为1的bit对应WDATA有效数据字节,WSTRB宽度是32bit/8=4bit;BRESP与RRESP分别为写回应信号,读回应信号,宽度都为2bit,‘h0代表成功,其他为错误。
详解AXI4-Full接口(1)--什么是AXI4-Full接口?-CSDN博客
AXI4(AXI-full)总线详细介绍_ML__LM-GitCode 开源社区 (csdn.net)
AXI-FULL协议详解_axi full-CSDN博客