AXI4-Full 接口
注:axi4-full 源码文件见附件!
简介
AXI4-Full 是 AMBA AXI (Advanced eXtensible Interface) 协议的完整版本,它是一种高性能、可扩展的接口协议,用于嵌入式系统中的片上总线。AXI4-Full 设计用于连接多个主设备(如处理器核心)和从设备(如内存控制器和外设接口),以实现高效的数据传输和系统控制。以下是 AXI4-Full 的一些关键特性和组成部分:
- 通道(Channels):
- 读地址通道(Read Address Channel):用于传输读事务的地址和控制信息。
- 读数据通道(Read Data Channel):用于从从设备向主设备传输数据。
- 写地址通道(Write Address Channel):用于传输写事务的地址和控制信息。
- 写数据通道(Write Data Channel):用于从主设备向从设备传输数据。
- 写响应通道(Write Response Channel):用于从从设备向主设备传输写事务的响应。
- 信号(Signals):
- 包括用于控制数据流的信号,如VALID/READY握手信号、地址信号、数据信号、响应信号等。
- 支持突发传输(Burst Transfers),允许在一个事务中传输多个数据项。
- 突发传输(Burst Transfers):
- 支持固定(FIXED)、增量(INCR)、包装(WRAP)和 reserved 突发类型。
- 允许高效的数据传输,减少了主设备和从设备之间的握手次数。
- 事务属性(Transaction Attributes):
- 通过ARCACHE和AWCACHE信号控制事务的缓存行为。
- 支持不同的内存类型和事务类型,如内存事务、外设事务等。
- 质量服务(Quality of Service, QoS):
- 通过AWQOS和ARQOS信号支持事务的优先级控制。
- 用户定义信号(User Signals):
- 提供了用户定义的信号,以支持特定的应用需求。
- 支持乱序和流水线处理:
- 允许在不同的通道上并行处理多个事务,提高了系统的吞吐量。
- 支持多主设备和多从设备:
- 可以连接多个主设备和从设备,支持复杂的系统拓扑结构。
- 低功耗特性:
- 包括低功耗接口信号,如CSYSREQ和CSYSACK,用于控制设备的电源状态。
- 互操作性(Interoperability):
- 设计了与旧版本AXI协议的兼容性,允许不同版本的AXI设备在同一系统中工作。
AXI4-Full 协议适用于需要高性能和复杂内存管理的系统,如高性能处理器、图形处理器、网络处理器等。它的设计目标是在保证高性能的同时,提供足够的灵活性和可扩展性,以适应不同的系统需求。
信号
AXI4-Full 是一种高性能的片上总线接口,它支持高带宽和低延迟的设计需求。AXI4-Full 协议定义了一系列独立的事务通道,包括读地址、读数据、写地址、写数据和写响应通道。以下是 AXI4-Full 协议中的主要信号及其功能:
全局信号(Global Signals)
-
ACLK: 全局时钟信号,所有 AXI 组件使用单一的时钟信号。
-
ARESETn: 全局复位信号,低电平有效。
复位期间,除 ARVALID、AWVALID、WVALID、RVALID、BVALID 必须为低电平,其他信号可以为任何值
写地址通道信号(Write Address Channel Signals)
-
AWID[3:0]: 写地址 ID,用于标识写地址事务。
-
AWADDR[31:0]: 写地址,指定写事务的起始地址。
-
AWLEN[7:0]: 突发长度,指定突发事务中的传输数量。
- 实际突发长度 = AxLEN + 1
- AXI3 只支持 1-16 突发长度
- AXI4 INCR 突发类型支持 1-256 突发长度,其他突发类型只支持 1-16 突发长度
- AXI4 WRAPPING 突发类型只支持 2/4/6/8/16 突发长度
- 突发不能跨 4KB 地址边界
-
AWSIZE[2:0]: 突发大小,指定每个突发传输的大小,每次传输的字节数为2^AxSIZE。
-
AWBURST[1:0]: 突发类型,指定突发事务的类型(固定、增量或包裹)。
- FIXED突发类型(2’b00):每次突发起始地址都一样,适用于对某个固定地址进行多次数据更新的情况,例如读写一个FIFO时,读写地址就是固定的。
- INCR突发类型(2’b01):每次突发起始地址会自动加上 AxSIZE 大小,适合对于RAM等通过地址映射的存储介质进行读写操作。
- WRAP突发类型(2’b10):地址超过设定边界会自动回卷,适合对cache的访问,因为它可以有效地处理数据的对齐和缓存行的填充。
-
AWLOCK: 锁定类型,提供事务的原子性信息,AxLOCK信号是AXI4协议中实现原子操作和同步机制的关键信号,它确保了在多主总线环境中数据的一致性和同步操作的原子性。
- AXI3 AxLOCK 为 2bit
- 0b00:Normal access
- 0b01:Exclusive access,独占访问允许多个主设备同时访问同一从设备,但不允许它们访问相同的内存范围。
- 0b10:Locked access,锁定访问会阻止其他任何主设备访问目标从设备,直到发起锁定访问的主设备完成其事务。
- AXI4 AxLOCK 为 1bit
- 0b0:Normal access
- 0b1:Exclusive access
- AXI3 AxLOCK 为 2bit
-
AWCACHE[3:0]: 缓存类型,指示事务如何通过系统。
-
AxCACHE[0]:可缓冲位(Bufferable bit),用于指示事务是否可以被缓存或缓冲。
当该位为高(1)时,意味着互连体或任何组件可以延迟事务到达其最终目的地,延迟的周期可以是任意的。这通常仅与写入有关。如果该位为低(0),则不支持这种特性。
-
AxCACHE[1]:可修改位(Modifiable bit),用于指示事务是否可以修改其特性。
当该位为高(1)时,表示事务的特性可以被修改,例如,单个事务可以被分解为多个事务,或者多个事务可以被合并为一个事务。当该位为低(0)时,表示事务是不可修改的(Non-modifiable),不能被分割或合并,且以下参数不能被改变:传输地址(AxADDR)、突发大小(AxSIZE)、突发长度(AxLEN)、突发类型(AxBURST)、锁定类型(AxLOCK)和保护类型(AxPROT)。
-
AxCACHE[3:2]:读分配(RA)和写分配(WA)位,用于控制读和写事务的分配行为。
这些位提供了关于事务访问地址的数据是否可能已经在缓存中的信息。这些信号影响缓存的行为,例如,是否需要在缓存中查找数据,或者是否需要将数据写入缓存。
-
-
AWPROT[2:0]: 保护类型,指示事务的特权和安全级别。
- AxPROT[0] (Privilege):标识访问是普通(Unprivileged)还是特权(Privileged)。
- 1表示特权访问,通常用于操作系统或需要更高权限的操作。
- 0表示普通访问,通常用于普通的数据处理。
- AxPROT[1] (Security):标识访问是安全(Secure)还是非安全(Non-secure)。
- 1表示非安全事务,可能用于一般的数据处理。
- 0表示安全事务,通常用于处理敏感或保密的数据。
- AxPROT[2] (Instruction/Data):指示事务是指令访问还是数据访问。
- 1表示指令访问,通常用于处理器获取执行的指令。
- 0表示数据访问,用于数据的读取和写入操作。
- AxPROT[0] (Privilege):标识访问是普通(Unprivileged)还是特权(Privileged)。
-
AWQOS[3:0]: AxQOS(Quality of Service,服务质量)信号是用来指示每个读写事务的相对优先级的可选信号,通常情况下,数值越大表示事务的优先级越高。
-
AWREGION[3:0]: 区域标识符,允许单个物理接口在从设备上用作多个逻辑接口。
-
AWUSER(up to 16 bits): 用户定义信号,在写地址通道中使用。
-
AWVALID: 写地址有效,表示通道上有有效的写地址和控制信息。
-
AWREADY: 写地址准备就绪,表示从设备已准备好接受地址和相关控制信号。
写数据通道信号(Write Data Channel Signals)
- WID[3:0]: 写数据 ID 标签(AXI3 特有)。用于支持乱序(out-of-order)写事务。WID信号允许多个写事务同时进行,这些事务可以被乱序处理和完成。每个写数据突发(burst)都会与一个唯一的WID相关联,以确保数据的完整性和顺序,每个事务都有唯一的 WID,BID,ARID,RID与之对应。
- WDATA (32, 64, 128, 256, 512, or 1024 bits): 写数据。
- WSTRB (4, 8, 16, 32, 64, 128, or 256 bits): 写使能信号,指示哪些字节是有效的。
- WLAST: 写最后一个信号,表示突发事务中的最后一个传输。
- WUSER (up to 16 bits): 用户定义信号,在写数据通道中使用。
- WVALID: 写数据有效,表示有有效的写数据和使能信号。
- WREADY: 写数据准备就绪,表示从设备可以接受写数据。
写响应通道信号(Write Response Channel Signals)
- BID[3:0]: 响应 ID 标签,用于标识写响应,说明同 WID
- BRESP[1:0]: 写响应,指示写事务的状态。
- OKAY(00):表示写事务正常完成。如果事务是独占访问但失败了,也会返回OKAY。OKAY是用于大多数事务的响应,表示正常访问已经成功。这个响应还可以表示独占访问失败,即当多个主机可以访问一个从机,但这些主机不能访问相同的内存范围时,如果独占访问失败,也会返回OKAY。
- EXOKAY(01):表示独占访问事务成功完成。独占访问是一种特殊的事务类型,其中总线不会被其他事务抢占。EXOKAY响应表明读或写部分的独占访问已经成功。
- SLVERR(10)(Slave Error):表示从设备在接收到事务后,由于某些原因(如FIFO溢出、不支持的传输大小、写入操作试图访问只读位置等)无法完成该事务。这表示事务的失败。
- DECERR(11)(Decode Error):通常由互联组件发出,表示没有找到与事务地址匹配的从设备。这通常意味着地址解码过程中出现了错误,例如,试图访问一个不存在的从设备
- BUSER(up to 16 bits): 用户定义信号,在写响应通道中使用。
- BVALID: 写响应有效,表示通道上有有效的写响应。
- BREADY: 写响应准备就绪,表示主设备可以接受写响应。
读地址通道信号(Read Address Channel Signals)
- ARID[3:0]: 读地址 ID,用于标识读地址事务,说明同 WID
- ARADDR[31:0]: 读地址,指定读事务的起始地址。
- ARLEN[7:0]: 突发长度,指定突发事务中的传输数量,说明同 AWLEN
- ARSIZE[2:0]: 突发大小,指定每个突发传输的大小,说明同 AWSIZE
- ARBURST[1:0]: 突发类型,指定突发事务的类型,说明同 AWBURST
- ARLOCK[1:0]: 锁定类型,提供事务的原子性信息,说明同 AWLOCK
- ARCACHE[3:0]: 缓存类型,指示事务如何通过系统,说明同 AWBURST
- ARPROT[2:0]: 保护类型,指示事务的特权和安全级别,说明同 AWPROT
- ARQOS[3:0]: AxQOS(Quality of Service,服务质量)信号是用来指示每个读写事务的相对优先级的可选信号,通常情况下,数值越大表示事务的优先级越高。
- ARREGION[3:0]: 区域标识符,允许单个物理接口在从设备上用作多个逻辑接口。
- ARUSER(up to 16 bits): 用户定义信号,在读取地址通道中使用。
- ARVALID: 读地址有效,表示通道上有有效的读地址和控制信息。
- ARREADY: 读地址准备就绪,表示从设备已准备好接受地址和相关控制信号。
读数据通道信号(Read Data Channel Signals)
- RID[3:0]: 读数据 ID 标签,用于标识读数据事务,说明同 WID
- RDATA (32, 64, 128, 256, 512, or 1024 bits): 读数据。
- RRESP[1:0]: 读响应,指示读事务的状态,说明同 BRESP
- RLAST: 读最后一个信号,表示突发事务中的最后一个传输。
- RUSER(up to 16 bits): 用户定义信号,在读取数据通道中使用。
- RVALID: 读数据有效,表示通道上有有效的读数据。
- RREADY: 读数据准备就绪,表示主设备可以接受读数据。
低功耗接口信号(Low-Power Interface Signals)
- CSYSREQ: 系统退出低功耗状态请求信号。
- CSYSACK: 系统进入低功耗状态确认信号。
- CACTIVE: 外设时钟激活信号。
- 信号定义:
CSYSREQ
是一个单向信号,从系统时钟控制器发出,外设接收。它用于请求外设进入低功耗状态(当信号为低电平时)或请求外设退出低功耗状态(当信号为高电平时)。 - 操作模式:在正常操作期间,
CSYSREQ
信号通常保持高电平,表示外设处于正常工作状态。当系统时钟控制器需要外设进入低功耗状态时,它会将CSYSREQ
信号驱动为低电平。外设在识别到这个请求后,可以执行掉电功能,并取消激活CACTIVE
信号,以表明它可以移除时钟。 - 确认信号:外设使用
CSYSACK
信号来确认对CSYSREQ
信号的请求。当外设准备进入低功耗状态时,它会将CSYSACK
信号驱动为低电平。当系统时钟控制器请求外设退出低功耗状态时,外设在完成上电序列后,会将CSYSACK
信号驱动为高电平,以确认它已经退出低功耗状态。 - 时钟有效信号:
CACTIVE
信号表明外设需要它的时钟信号。在低功耗状态期间,CACTIVE
和CSYSREQ
信号均为低电平。驱动这两个信号之一为高电平会启动退出低功耗状态的序列。 - 请求与确认握手:
CSYSREQ
和CSYSACK
之间的握手是AXI协议的要求。外设可以接受或拒绝系统时钟控制器提出的进入低功耗状态的请求。当外设通过将CSYSACK
置为低电平来确认请求时,CACTIVE
信号的电平表示接受或拒绝该请求。 - 低功耗状态的退出:系统时钟控制器或外设都可以请求退出低功耗状态并恢复时钟。根据定义,
CACTIVE
和CSYSREQ
在低功率状态期间均为低电平,驱动这两个信号之一为高电平会启动退出序列。
总结来说,CSYSREQ
信号是AXI4-FULL协议中用于控制外设时钟状态的重要信号,它与CSYSACK
和CACTIVE
信号一起工作,以支持外设的低功耗操作。
握手机制
3种握手情形
数据在 TVALID 和 TREADY 同时有效时进行传输,常见几种握手情况如下所示;
- TVALID 先于 TREADY 有效
-
TREADY 先于 TVALID 有效
-
TVALID 和 TREADY 同时有效(Slave 判断到 TVALID 有效,立即置位 TREADY)
握手信号及默认状态
各通道的握手信号如下表所示:
- AWREADY 默认状态可以为高电平或者为低电平,建议默认为高电平,若默认为低电平,则每次传输至少需要两个周期(1拉高AWVALID, 2 拉高 AWREADY),有效带宽降低。但前提是 Slave 端可以立即接受地址数据
- WREADY 同理建议默认为高电平,但前提是 Slave 端可以立即接受写数据
- BREADY 同理建议默认为高电平,但前提是 Master 端可以立即接受写响应数据
- ARREADY 同理建议默认为高电平,但前提是 Slave 端可以立即接受读地址数据
- RREADY 同理建议默认为高电平,但前提是 Master 端可以立即接受读数据
信号间关系
AXI 协议要求:
-
写响应数据必须跟在最后一个写数据后面
-
读数据必须根据相应读地址后面
-
写数据可以先于写地址进行传输
-
写数据可以和写地址同时出现
-
VALID 信号不能等 READY 信号置位才有效
-
READY 信号可以先于 VALID 信号有效或者等 VALID 信号有效后才有效
下图注释:
- 单箭头表示箭头指向的信号可以先于或后于箭头起始的信号有效
- 双箭头表示箭头指向的信号必须后于箭头起始的信号有效
读信号
- Master 的 ARVALID 不能等待 ARREADY 置位后才拉高
- Slave 的 ARREADY 可以先于或者等待 ARVALID 置位后才拉高
- Slave 的 RVALID 必须等待 ARVALID 和 ARREADY 均置位后才能拉高
- Slave 的 RVALID 不能等待 RREADY 置位后才拉高
- Master 的 RREADY 可以先于或者等待 RVALID 置位后才拉高
写信号
- Master 的 AWVALID 或 WVALID 不能等待 AWREADY 或 WVALID 置位后才拉高
- Slave 的 AWREADY 或 WREADY 可以先于或者等待 AWVALID 或 WVALID 置位后才拉高
- Slave 的 BVALID 必须等待 AWVALID、AWREADY、WVALID、WREADY 、WLAST 都置位后才能拉高
- Slave 的 BVALID 不能等待 BREADY 置位后才拉高
- Master 的 BREADY 可以先于或者等待 BVALID 置位后才拉高
Note:AXI3 的写响应与 AXI4 的写响应条件不同,将 AXI3 转换为 AXI4 需要修改代码,确保 Slave 在接收适当地址前不提供写响应。
Xilinx 官方源码生成