当前位置:   article > 正文

AXI协议学习笔记~~

axi

AXI总线简介

​  AXI属于AMBA(The ARM Advanced Microcontroller Bus Architecture)家族的一员,AXI协议在AMBA3.0版本中开始出现,并在后续的AMBA4.0,AMBA5.0中持续更新,对应为 AXI3,AXI4,AXI5。

​   下面是AMBA家族发展简介图。
在这里插入图片描述

​   AXI,全名Advanced eXtensible Interface。AXI有以下优势,

  • ​   适合高带宽,低延迟应用,尤其为目前的高速存储外设设计,如DDR4

  • ​   可灵活扩展总线位宽以及拓扑连接

  • ​   标准化,通用总线,Xilinx在几乎所有自家的IP中支持甚至只支持AXI

​   axi的协议文档中提出它有如下特点:

  • ​   适用于高带宽和低延时的设计
  • ​   提供不带复杂桥的高频率操作
  • ​   满足多种组件的接口要求
  • ​   适用于具有高初始访问延迟的内存控制器
  • ​   提供了实现互连架构的灵活性
  • ​   向后兼容现有的AHB和APB接口。

​   axi协议的关键特点:

  • ​   单独的地址/控制 和 数据阶段

  • ​   使用字节控制来支持非对齐的数据传输

  • ​   使用只发出起始地址的突发burst传输

  • ​   单独的读写数据通道,可以提供低成本的直接内存访问(DMA,Direct Memory Access)

  • ​   支持发送多个outstanding addresses

  • ​   支持无序传输

  • ​ 允许方便地添加寄存器阶段,以提供定时关闭。
    ​   这里,先介绍两个概念。
    ​   outstanding —— 可以连续执行某个操作,而不用等待前面的操作完成的 执行次数,有点绕。举个例子,master 执行读操作的行为是:发送读地址 -> 等待数据返回 -> 发送读地址 -> 等待数据返回 -> …,这种outstanding就为1,它必须等待上一次的操作完成后,才可以执行下一次操作;如果outstanding能力为N>1的话,则读操作时,可以连续发N个读地址命令,在这期间如果读数据没有返回,则需要等待读数据返回,如果有读数据返回,则返回了几个,那么仍然可以接着发几个。也就是说,“在路上” 的读命令(或者读数据)最多可以是N。对于写操作,可以连续发出N组写地址(写数据)命令,这期间如果写响应没有返回,则必须等待写响应返回才能接着发写地址(写数据)命令,如果有写响应返回,则返回了几个,那么仍然可以接着发几组。也就是说,“在路上” 的写响应最多可以是N。(参考链接:https://aijishu.com/a/1060000000210706)
    ​   burst —— burst传输就是通过发送一次地址,来读写多个地址的数据,这样可以提高传输效率。burst传输需要指定burst len和burst size,burst len表示一次操作会执行的次数,burst size表示每次执行处理数据的宽度,如果是地址递增模式的话,递增的步长一般是burst size的大小。
    ​   burst传输有应用限制,不是所有传输类型都适合burst传输,一般busrt传输应用在下面三种场景:

  •   Flash应用类型
        只发送一次地址,之后地址自动累加,直到所有数据发送完成。

  •   Cache应用类型
        只发送一次地址,之后地址自动累加,累加到一定值后地址又自动回到初始地址。数据传输在一段地址范围内,循环传输。

  •   FIFO应用类型
        只发送一次地址,之后地址不变,所有数据都是传送到此地址。
    (参考链接:https://blog.csdn.net/phenixyf/article/details/106387066)

AXI拓扑结构

  AXI使用主从机制,由主机master发起请求,从机slave对请求进行响应。

  AXI支持一对一的连接,(参考链接:https://aijishu.com/a/1060000000108507)
在这里插入图片描述
​   也可以通过连接器IP支持一对多,多对一以及N对N连接,连接器相当于一个多路开关,通过轮询或者基于优先级的策略进行开关切换。
在这里插入图片描述

AXI接口

​   AXI定义了5个独立的通道:

  • ​   read address - 读地址通道,传输读操作的地址和控制信息

  • ​   read data - 读数据通道,传输slave发到master的读数据

  • ​   write address - 写地址通道,传输写操作的地址和控制信息

  • ​   write data - 写数据通道,传输master发到slave的写数据

  • ​   write response - 写响应通道,传输slave发回master的写响应
    在这里插入图片描述
    在这里插入图片描述

AXI握手机制

​   在具体讲每个信号之前,先讲一下AXI的握手机制,上面提出的5个channel中都有用到 VALID / READY 握手机制。

​   VALID / READY 握手机制是一种双向流控制机制,发送方和接收方都可以控制信息传输的速率。发送方拉高VALID表示地址、数据和控制信号已经准备好,接收方拉高READY表示已准备好接收数据,只有当VALID和READY都拉高的时候,传输才在进行,时序如下:
在这里插入图片描述

​   对VALID和READY的拉高拉低有如下约束:

  • ​   VALID拉高后,数据和VALID都需要一直保持,只到READY拉高才可以变化

  • ​   VALID拉高不依赖于READY

  • ​   READY可以等待VALID拉高后再拉高,或是不依赖于VALID拉高,建议是不依赖于VALID拉高,避免死锁

​   此外,读操作会涉及两个channel,写操作会涉及三个channel,每个操作涉及的握手信号还有一定依赖关系。

​   下图显示了读操作中握手信号的依赖关系。
在这里插入图片描述

  • ​   master拉高ARVALID不准和slave拉高ARREADY有依赖。

  • ​   slave可以等ARVALID拉高后再拉高ARREADY

  • ​   slave可以在ARVALID拉高前拉高ARREADY

  • ​   slave必须等ARVALID和ARREADY都拉高过后,再拉高RVALID,表示读数据准备好

  • ​   slave拉高RVALID不准和master拉高RREADY有依赖

  • ​   master可以等RVALID拉高后再拉高RREADY

  • ​   master可以在RVALID拉高前拉高RREADY

​   下图显示了写操作中握手信号的依赖关系
在这里插入图片描述

  • ​   master拉高AWVALID或WVALID不准和slave拉高AWREADY或WREADY有依赖
  • ​   slave可以等待AWVALID或WVALID或两者都拉高后再拉高AWREADY
  • ​   slave可以在AWVALID或WVALID或两者都拉高前拉高AWREADY
  • ​   slave可以等待AWVALID或WVALID或两者都拉高后再拉高WREADY
  • ​   slave可以在AWVALID或WVALID或两者都拉高前拉高WREADY
  • ​   slave必须等WVALID和WREADY都拉高后才能拉高BVALID
  • ​   slave必须等WLAST拉高后再拉高BVALID,因为写响应 BRESP只会在一次写操作的最后一次数据传输后被采样
  • ​   slave拉高BVALID不能和master拉高BREADY有依赖
  • ​   master可以等BVALID拉高后再拉高BREADY
  • ​   master可以在BVALID拉高之前拉高BREADY

​   axi4定义了一个额外的axi4 slave写响应依赖,它不期望在addr发出前,所有的slave都接收写数据,并且发出写响应。
在这里插入图片描述
​   slave必须等AWVALID,AWREADY,WVALID和WREADY都拉高后,才可以拉高BVALID,这样,就可以避免前面提到的问题。

​   规范强烈建议,后续任何新的axi3 slave都应该实现这个依赖。

global signals

在这里插入图片描述
​   所有的输入信号都在ACLK的上升沿采样,所有输出的信号都在ACLK上升沿后变化,所以不允许接口上的信号由组合逻辑产生,实际中有ACLK的同步信号产生的端口信号(这种应该也是与ACLK对齐的)。

​   ARESET低有效。ARESET可以异步拉低,但是必须同步于ACLK撤离,即在ACLK上升沿撤离。在ARESET拉低期间:

  • ​   master端口必须拉低 ARVALID、AWVALID 和 WVALID。

  • ​   slave端口必须拉低 RVALID 和 BVALID。

  • ​   其他的信号可以是任意值。

  ARESET拉高后,可以驱动以上信号为高的最早时间点是在ACLK上升沿检测到ARESET拉高,如下时序:
在这里插入图片描述

read address channel signals

在这里插入图片描述在这里插入图片描述
​   下面会详细说明下每个字段,写地址通道和读地址通道基本一样,所以这里把两个合到一起说明。

​   ARID —— 操作标识,master可以用这个来区别需要按序返回的多个操作。使用同一个ID的所有操作必须按顺序执行,不同ID的操作之间执行顺序没有约束。这意味着单个物理端口可以通过充当多个逻辑端口来支持无序事务,每个逻辑端口都可以按顺序处理其事务。

​   通过使用AXI ID,master可以发出新的操作,而无需等待早期的操作完成。这可以提高系统性能,因为它支持事务的并行处理。

​   slave需要返回BID或RID,对应从master发出的AWID和ARID。

​   master可以使用AWID和ARID来表达它的顺序需求,规则如下:

  • ​   来自不同master的操作没有顺序,可以按任何顺序执行。

  • ​   来自同一master的操作,ID不同,它们之间也没有顺序约束,可以按任何顺序执行。

  • ​   具有相同ARID的读操作的数据传输必须按master发地址的顺序返回。

  • ​   具有相同AWID的写操作的数据传输必须按master发地址的顺序传输。

  • ​   具有相同ID值的读写操作之间没有顺序约束。

  • ​   在master接口上,具有相同ARID值的读数据应该按master读地址的顺序返回,具有不同ARID值的读数据可以按任意顺序返回,而不管slave接收到读操作的顺序如何。具有不同ARID值的读数操作可以交错使用。

  • ​   interconnect必须确保master按照它发出读操作的顺序接收到使用相同ARID发到不同slave传回的读数据。

​   ARADDR —— 读地址,指定的读开始地址,AXI和地址相关的有非对齐传输。

​   AXI支持非对齐的传输,对于任何由大于一个字节的数据传输组成的burst,所访问的第一个字节可能与自然地址边界不对齐,比如,一个32-bit的数据包,4 个byte,要保证地址对齐的话,起始地址的最低两bit必须是2’b00,如果设置开始地址为0x1002,则是没有和自然的32-bit的地址边界对齐的。

​   master可以(其实下面这两句话不是很懂,对着原文翻译的,如果有知道的可以解答一下):

  • ​   使用低地址行来显示一个未对齐的起始地址,注意,低地址行上的信息必须和byte lane strobe上的信息一致。

  • ​   提供一个对齐的地址,并使用byte lane strobes来指示未对齐的开始地址。

​   下面是一些图片,显示对齐地址和未对齐传输的差异,其中灰色格子表示对应的byte lanes没有数据传输,原文里图片多一些,这里只截图其中一部分,感兴趣可以看原文。
在这里插入图片描述

在这里插入图片描述

​   ARLEN —— burst传输的长度,即发一次burst,连着读或写的次数。

​   AXI3针对所有burst类型,支持的burst length是1 ~ 16。

​   AXI4针对INCR burst传输支持的burst len扩展到1 ~ 256,其余的类型保持在1 ~ 16。

​   AXI3计算burst len的公式是:Burst_Length = AxLEN[3:0] + 1

​   AXI4计算burst len的公式是:Burst_Length = AxLEN[7:0] + 1,以适应扩展的burst len。

​   有如下针对burst的规则:

  • ​   针对wrapping bursts, burst len必须是2,4,8或16

  • ​   一个burst不能跨越4KB地址边界

  • ​   burst不支持提前终止

​   没有组件可以提前终止burst。但是,为了减少一个写传输burst中数据传输的个数,master可以拉低所有的写strobes来使写无效,此时,必须完成burst的传输。在一次读burst中,master可以丢弃读取的数据,但是必须完成burst中所有的传输。注意,当访问读敏感设备,如FIFO时,丢弃不需要的读数据可能导致数据丢失,因此,读此类设备时,master应确保所需的数据传输长度完全匹配突发的长度。

​   在AXI4中,INCR类型的长度大于16的burst可以转为多个更小的bursts,即使操作属性说操作是不可改的,此时,小的冲突和原始冲突在各方面应保持一致,除了:

  • ​   burst len
  • ​   调整后每个小burst的addr

​   将长冲突改为短冲突,一方面可以兼容AXI3,另一方面也可以减少长burst对QoS的影响。

​   ARSIZE —— 每次读的数据byte个数,对应写那个字段,就是每次写数据byte个数,配置值和byte个数的关系如下,
在这里插入图片描述

​   如果axi 总线比burst size更宽的话,axi接口应该在传输地址时指明总线上哪些byte用于数据传输(写数据通道有个WSTRB字段,后续到了再讲,读数据通道没有对应字段,它回读数据在bus上的位置可以参考上面读地址那里对齐和非对齐传输的图,比如,总线宽度是8个byte,从0x07开始读,ARSIZE为3,ARLEN为2,则第一次返回0x07的数据,并且位于总线的第7byte,第二次返回的就是0x080x0B,位于03byte,第三次返回0x0C0x0F,位于47byte。再举个例子,总线宽度为4byte,ARSIZE为0,ARLEN为0,从0x01开始读,返回0x01数据,位于第1byte),任何传输的大小都不能超过数据总线宽度。

​   ARBURST —— burst的类型,不同的类型在连续执行时addr的处理方式是不一样的,具体的addr 计算方法在原文A3.4.1 Address structure中有讲。

​   AXI协议定义了三种burst类型:

  • ​   FIXED——在一个fixed burst中,地址在每一次传输中都是一样的,这种burst类型用于重复访问相同的位置,例如在加载或清空FIFO时。

  • ​   INCR——递增类型。在一个增量burst中,每一次传输的地址是前一次传输地址的递增,递增的大小取决于传输size,比如,传输size为4字节的burst,每次传输的地址是前一个地址加4。这种burst类型用于访问常见的顺序内存。

  • ​   WRAP——wrap burst类似于增量burst,它是指定一个地址上限,当增加到地址上限时,又从低地址开始,类似于一个环。这种burst类型可见于高速缓存行访问。

​   wrap burst需要满足如下约束:

  • ​   起始地址必须和每次传输的size对齐

  • ​   burst的长度必须是2,4,8或16

​   一个wrap burst的行为如下:
在这里插入图片描述

​   字段配置值和类型的对应关系如下:
在这里插入图片描述

​   ARLOCK —— 表示当前的访问是独占访问、锁定访问还是一般访问。AXI4不再支持锁定访问,所以AxLOCK由两bit转为一bit,值和功能对应如下,
在这里插入图片描述
在这里插入图片描述

​   这一块儿没有怎么整理,可以看原文A7: Atomic Accesses或https://aijishu.com/a/1060000000210717(这个链接我感觉就是参照原文翻译了一下),通常都用得是Normal access。

​   ARCACHE —— memory 类型。嗯。。这块儿的内容有点多(原文A4.1 ~ A4.6),没看懂。。。有懂的同学欢迎讲一下~~

ARPORT —— 定义了传输的安全级别,配置值和功能对应如下,
在这里插入图片描述

  • ​   Unprivileged or privileged无特权或特权。一个axi master 可以支持多个级别的操作特权,并将此特权的概念扩展到内存访问。一些处理器支持多个处理特权级别,请参考所选文档,以确定到AXI特权级别的映射,AXI可以提供的唯一区别是在特权访问和非特权访问之间。

  • ​   Secure or Non-secure 安全或不安全。一个axi master支持安全和不安全的操作状态,并且扩展到内存访问。

  • ​   Instruction or data 指令或数据。这个bit表示当前操作是一次指令访问还是一次数据访问。AXI协议将此指示定义为一个提示。它并非在所有情况下都是准确的,例如,当一个事务包含指令和数据项的混合时。本规范建议主服务器设置AxPROT[2]LOW,以指示数据访问,除非该访问是指令访问。

​   ARQOS —— 一个4bit QoS(Quality of Service)信号,协议没有指定AxQOS的具体用法,建议将AxQOS做为对应写或读操作的优先级指示器,更大的值表示更高的优先级,当然也可以对AxQOS做其他解释。默认值4‘b0000表示这个字段没有参与任何QoS模式。

​   ARREGION —— 区域标识符。axi4 可以选择扩展支持4个bit的区域标识信号,这个标识符可以用来唯一标识多达16个不同的区域,可以提供更高地址位的解码。AxREGION必须在任何4Kb的地址空间内保持不变。

​   区域标识符的使用意味着slave上的单个物理接口可以提供多个逻辑映射,每个逻辑接口在系统地址映射中具有不同的位置,slave也不需要支持不同逻辑接口之间的地址译码。

​   ARUSER —— 用户信号。axi4可以选择性地在每组channel中增加一个用户自己用的信号。通常,本协议不建议使用用户信号,因为AXI协议没有定义这些信号的功能,如果两个组件以不兼容的方式使用相同的用户信号,这可能会导致互操作性问题。每个channel可以自行决定要不要有用户信号,用户信号的宽度也可以各不相同。

​   ARVALID —— 读地址、控制信号有效。ARVALID和ARREADY属于读地址通道的握手信号,参考上面对握手机制的说明。

​   ARREADY —— 准备好接收读地址、控制信号。

read data channel signals

在这里插入图片描述

​   跟前一个通道类似的信号就不单独列出来了,只说一下不一样的。

​   RDATA —— 读操作返回的数据。具体有效数据在RDATA中的位置参考前面ARSIZE中说明的。

​   RRESP —— 读操作响应。axi协议对读写传输都提供了响应信号,响应的值包括:

  • ​   OKAY。okay通常表示下面的意思:

  • ​   正常访问成功(大多数时候的意思)

  • ​   独占访问失败

  • ​   对不支持独占访问的设备进行独占访问

  • ​   EXOKAY。表示独占访问的读或写成功

  • ​   SLVERR。slave error,用于已经成功到达slave,但slave希望返回error的场景。为了简化系统监控和调试,规范建议这种错误响应只用于错误条件,而不用于发送正常的、预期的事件的信号,比如,

  • ​   FIFO或buffer 溢出或运行不足的状态

  • ​   尝试使用不受支持的传输大小

  • ​   写入访问尝试进入只读位置

  • ​   slave中的超时条件

  • ​   试图访问一个禁用或关闭的功能

  • ​   DECERR。译码错误,通常由一个连接组件返回,表示没有传输地址对应的slave。规范建议连接组件定义一个默认slave,由默认slave返回decerr 响应。AXI协议要求每次burst中的所有数据传输都必须完成,即使有error,所以,即使没有对应的slave,也要能完成传输,通过返回DECERR。

​   配置值和响应结果对应如下,
在这里插入图片描述

​   对于一次写burst,每次burst传输完返回一个response,而不是burst中每次传输返回一次。

​   对于一次读burst,slave可以针对burst中的每次传输都返回一次response,比如,在一个读16次的burst中,15次读slave返回OKAY,有一次读slave返回SLVERR。

​   协议规定burst中指定次数的传输必须执行完,即使有返回error,比如,发起了一个包含8次传输的读burst,但是slave端出错了,此时,slave必须返回8个数据,同时response都标识为error。

​   RLAST —— 表示当前读数据是一次读burst的最后一个读数据,在返回最后一个读数据时拉高,同理,写操作时,发一个写burst的最后一个数据的同时拉高对应的LAST。

write address channel signals

在这里插入图片描述在这里插入图片描述

write data channel signals

在这里插入图片描述

​   WSTRB —— 用来表示WDATA中哪些byte lane是有效的,当WSTRB[n:0]里信号拉高的时候,数据总线里对应lane的数据有效,总线中每8个bit对应WSTRB一个bit,比如WSTRB[n]对应WDATA[(8n)+7:(8n)]

​   当WVALID拉低的时候,WSTRB可以是任何值,虽然规范里推荐是拉低或保持为以前的值。

​   narrow transfers。当master要发送的数据大小比总线宽度小时,使用总线中的哪些bit来传输数据取决于地址和控制信息。

  • ​   在递增或wrap的bursts中,每次传输使用不同的byte lanes。

  • ​   在fixed bursts中,每次传输使用同一组byte lanes。

​   举两个例子,例子1:

​   burst有5次传输

​   开始地址是0

​   每次传输有8个bits

​   传输在一个32 bits的总线上进行(数据的位置跟前面说的对齐和未对齐传输一样,写入地址0的数据在第0byte,地址1在第1byte,地址2在第2byte,地址3在第3byte,地址4就又从0byte开始)

​   burst 类型是递增

在这里插入图片描述

​   例子2:

​   burst有3个传输

​   开始地址是4

​   每次传输32 bits

​   传输总线是64 bits位宽
在这里插入图片描述

​   大小端数据结构。内存中有两种数据存放模式,大端模式和小端模式。

​   大端模式:按0x0,0x1,0x2,0x3这种顺序写入数据时,从数据的高字节依次写入递增的地址。

​   小端模式:写入数据时,从数据的低字节依次写入递增的地址。

​   比如:要将数据0x0f0e0d0c 写入地址 0x0000,当采用大端时,0x0f 写入0x0000,0x0e写入0x0001,…,0x0c写入0x0003,当采用小端时,0x0c写入0x0000,…,0x0f写入0x0003。

​   为了能够使大小端模式在存储中共存,AXI 协议设计了一种字节定序(Byte-invariant)的大小端传输方案。对于存储中包括多个字节的数据结构(单字节自然不存在大小端问题)协议做了如下规定:(这块儿没有怎么看原文,参考链接:https://blog.csdn.net/qq_41849447/article/details/116314745,感觉自己写太懂,先记录在这儿~~TODO)

  • ​   无论数据按什么顺序存放,每个数据结构存储空间的分配方式是相同的

  • ​   该数据结构按照其大小端模式决定字节存储的地址顺序

  • ​   在传输过程中不考虑数据结构的大小端,按照字节原先存储的顺序,原样传输并存放至对端

​   以上是此次学习AXI4协议手册整理的内容,记录一下~~(整理到csdn的时候发现还有一组低功耗的信号没有说,等用到再加吧:)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/539251
推荐阅读
相关标签
  

闽ICP备14008679号