目录
综述
本文参考分析整理总结了AMBA AXI and ACE Protocol Specification文档的AXI总线协议规范部分,错误之处欢迎指出。
AMBA AXI协议支持高性能高频的系统设计,该协议拥有以下优点:
- 适合高带宽和低延迟的设计
- 不需要复杂的桥即可提供高频操作
- 可以满足多种组件的接口需求
- 适合高初始访问延迟的存储器控制器
- 提供互联架构实现的灵活性
- 向后兼容AHB与APB接口
同时,该协议还拥有以下特点:
- 分离的地址/控制和数据阶段
- 通过使用字节选通信号的方式支持非对齐数据传输
- 使用突发传输时只需要传输起始地址
- 允许地址信息提前于实际数据传输发送
- 分离的读写数据通道,这可以提供低损耗的DMA
- 支持发出多个未完成的地址
- 支持乱序传输完成
- 允许简单添加寄存器阶段以提供时序收敛
AXI协议同时包含了低功耗操作所需的信号扩展,也包含了AXI4-Lite协议,该协议是AXI4的子集,有着更简单的控制寄存器接口和组件。
AXI通道简述
综述
AXI协议基于突发传输,定义了下列独立事务(一个事务可能包含多次传输)通道:
- 读地址
- 读数据
- 写地址
- 写数据
- 写响应
地址通道携带描述被传输数据性质的控制信息,数据在主设备和从设备间通过以下方式传输:
- 写数据通道从主设备传输数据到从设备,在写传输时,从设备使用写响应通道通知主设备传输完成。
- 读数据通道从从设备传输数据到主设备。
写数据的过程如下图所示:
读数据的过程如下图所示:
每一个通道都拥有自己的VALID与READY信号用于实现握手,其中VALID信号表示通道的地址、数据或控制信息已经可用,而READY信号则表示接收方已准备好接收信息,其中,读数据和写数据通道还拥有LAST信号,该信号用于指示当前传输是否为当前事务中的最后一次传输。
读地址与写地址通道
读事务与写事务都拥有其自己的地址通道,对应的地址通道会携带一次事务所需的全部地址和控制信息。
读数据通道
读数据通道携带从设备传送给主设备的数据和响应信息,该通道包括两部分:
- 位宽可为8、16、32、64、128、256、512、1024bit的数据总线。
- 表示读事务完成状态的读响应信号。
写数据通道
写数据通道携带主设备传送给从设备的数据,该通道包括两部分:
- 位宽可为8、16、32、64、128、256、512、1024bit的数据总线。
- 为每一个8bit数据准备的字节选通信号,用于指示数据的哪几个字节是有效的。
写数据通道总是被buffer的,因此主设备可以在未收到前一次写事务的从设备响应消息时再次执行写操作。
写响应通道
从设备使用写响应通道回应写事务,全部的写事务都需要写响应通道的完成信号,并且完成信号仅在一个写事务彻底完成时才产生,而并不会在每次数据传输时都产生。
AXI互联结构
一个典型的AXI系统结构如下:
AXI协议为以下接口提供了单一的接口定义:
- 在主设备和互联器(Interconnect)之间
- 在从设备和互联器之间
- 在主设备和从设备之间
该接口定义支持不同的互联器实现,设备之间的互联器等效于另一个拥有对称主端口和从端口的设备,真正的主设备和从设备可以连接到对应的端口。
大多数的系统使用如下三种互联拓扑之一:
- 共享的地址和数据总线
- 共享的地址总线以及多条数据总线
- 多层,具有多个地址和数据总线
在大多数的系统中,地址通道带宽需求远小于数据通道带宽需求。使用共享总线以及多条数据总线的拓扑结构实现并行数据传输时,可以在系统效率和互联复杂性间取得平衡。
AXI中使用寄存器切片
每一个AXI通道都只能单项传输信息,并且架构并没有要求各个通道间具有固定的时序依赖要求。因此,寄存器切片可以插入到任何通道的任何位置,不过这会带来额外的延迟(Latency)。
以下两点是可能的:
- 在延迟和最大操作频率之间取得平衡。
- 在处理器和高性能存储器之间实现直接而又快速的链接,但同时又使用寄存器切片隔离性能不敏感外设的长路径。
AXI术语
AXI组件与拓扑
下列术语描述了AXI组件:
- 组件(Component)
- 主组件(Master component)
- 从组件(Slave component),从组件包含存储器子组件和外设子组件
- 互联组件
对于特定的AXI传输,上游(Upstream)与下游(Downstream)指代AXI拓扑中AXI组件的相对位置。
AXI传输与存储器类型
当AXI主设备发起AXI操作时,对于AXI从设备:
- AXI总线上所需的完整操作集形成AXI事务(Transaction)。
- 任何传输的有效数据都作为一次AXI突发传输(Burst)。
- 一次突发传输可以包含多次数据传输,一次数据传输称为一拍(Beat)。
AXI信号描述
下列信号被用于AXI3和AXI4。
公共信号
信号名 | 来源 | 描述 |
---|---|---|
ACLK | 时钟源 | 公共时钟信号 |
ARESETn | 复位源 | 公共复位信号,低有效 |
所有信号都在公共时钟的上升沿被采样。
写地址通道信号
信号名 | 来源 | 描述 |
---|---|---|
AWID | 主设备 | 写地址ID,该信号用于标识写地址组 |
AWADDR | 主设备 | 写地址,写突发操作中第一次数据传输的地址 |
AWLEN | 主设备 | 突发长度,这个字段标识每次突发传输的传输次数 |
AWSIZE | 主设备 | 突发大小,这个字段表示每次突发传输的大小 |
AWBURST | 主设备 | 突发类型,包括突发类型和突发大小信息,该字段决定了每次突发传输时地址的计算方法 |
AWLOCK | 主设备 | 锁定类型,提供关于传输时原子特性的额外信息 |
AWCACHE | 主设备 | 存储器类型 |
AWPROT | 主设备 | 保护类型 |
AWQOS | 主设备 | 服务质量,即每次写传输的QoS标识符,仅AXI4支持 |
AWREGION | 主设备 | 区域标识符,允许一个从设备的单个物理接口用作多个逻辑接口,仅AXI4支持 |
AWUSER | 主设备 | 用户定义信号,可选 |
AWVALID | 主设备 | 主设备给出的地址和相关控制信号有效 |
AWREADY | 从设备 | 从设备已准备好接收地址和相关的控制信号 |
写数据通道信号
信号名 | 来源 | 描述 |
---|---|---|
WID | 主设备 | 写数据ID,该信号用于标识写数据传输,仅AXI3支持 |
WDATA | 主设备 | 写出的数据 |
WSTRB | 主设备 | 数据的字节选通,数据中每8bit对应这里的1bit |
WLAST | 主设备 | 该信号用于标识当前传输是否为突发传输中的最后一次传输 |
WUSER | 主设备 | 用户定义信号,可选 |
WVALID | 主设备 | 主设备给出的数据和字节选通信号有效 |
WREADY | 从设备 | 从设备已准备好接收数据选通信号 |
写响应通道信号
信号名 | 来源 | 描述 |
---|---|---|
BID | 从设备 | 写响应ID,该信号用于标识写响应传输 |
BRESP | 从设备 | 写响应,该信号表示写传输的状态 |
BUSER | 从设备 | 用户定义信号,可选 |
BVALID | 从设备 | 从设备给出的写响应信号有效 |
BREADY | 主设备 | 主设备已准备好接收写响应信号 |
读地址通道信号
信号名 | 来源 | 描述 |
---|---|---|
ARID | 主设备 | 读地址ID,该信号用于标识读地址组 |
ARADDR | 主设备 | 读地址,读突发操作中第一次数据传输的地址 |
ARLEN | 主设备 | 突发长度,这个字段标识每次突发传输的传输次数 |
ARSIZE | 主设备 | 突发大小,这个字段表示每次突发传输的大小 |
ARBURST | 主设备 | 突发类型,包括突发类型和突发大小信息,该字段决定了每次突发传输时地址的计算方法 |
ARLOCK | 主设备 | 锁定类型,提供关于传输时原子特性的额外信息 |
ARCACHE | 主设备 | 存储器类型 |
ARPROT | 主设备 | 保护类型 |
ARQOS | 主设备 | 服务质量,即每次读传输的QoS标识符,仅AXI4支持 |
ARREGION | 主设备 | 区域标识符,允许一个从设备的单个物理接口用作多个逻辑接口,仅AXI4支持 |
ARUSER | 主设备 | 用户定义信号,可选 |
ARVALID | 主设备 | 主设备给出的地址和相关控制信号有效 |
ARREADY | 从设备 | 从设备已准备好接收地址和相关的控制信号 |
读数据通道信号
信号名 | 来源 | 描述 |
---|---|---|
RID | 从设备 | 读数据ID,该信号用于标识读数据传输 |
RDATA | 从设备 | 读出的数据 |
RRESP | 从设备 | 读响应,这信号表示读传输的状态 |
RLAST | 从设备 | 该信号用于标识当前传输是否为突发传输中的最后一次传输 |
RUSER | 从设备 | 用户定义信号,可选 |
RVALID | 从设备 | 从设备给出的数据和响应信息有效 |
RREADY | 主设备 | 主设备已准备好接收读取的数据和响应信息 |
低功耗接口信号
信号名 | 来源 | 描述 |
---|---|---|
CSYSREQ | 时钟控制器 | 系统退出低功耗状态请求,外设的系统时钟控制器通过该信号发出请求用于离开低功耗状态 |
CSYSACK | 外设 | 退出低功耗状态响应,外设响应系统低功耗状态退出请求时使用的信号 |
CACTIVE | 外设 | 时钟激活,该信号表示外设需要时钟信号 |
单接口需求
这一部分描述了单个主设备和单个从设备之间的基本AXI协议事务需求。
时钟
每个AXI组件都需要一个时钟信号ACLK,全部的信号都在ACLK的上升沿被采样,一切输出信号都必须在ACLK的上升沿之后发生改变。
在主从接口之间的输入输出信号间不能有组合路径。
复位
AXI协议使用低有效复位信号ARESETn,该信号是可以异步拉低,但必须在ACLK的上升沿同步释放。
在复位期间,下列信号需要遵循特定的要求:
- 主接口必须拉低ARVALID、AWVALID与WVALID信号。
- 从接口必须拉低RVALID与BVALID信号。
- 其它信号则可以为任意值。
在ARESETn被释放后的下一个时钟上升沿,主设备可以拉高ARVALID、AWVALID与WVALID信号,如下图所示:
基本读写事务
握手过程
五个事务通道都使用VALID/READY作为握手信号,传输地址、数据和控制信息,使用这种握手方式,主从双方都可以对传输速度进行控制。源端产生VALID信号意味着其地址、数据或控制信息有效,目的端产生READY信号意味着它可以接收信息,只有当双方的VALID与READY信号都为高时传输才会开始。
在主从接口之间的输入输出信号间不能有组合路径。
在下图中,源端在T1之后给出地址、数据或控制信息,并令VALID有效,在T2之后,目的端检测到VALID有效并给出READY有效信息,在T3阶段传输会发生,因此在T3阶段及之前,源端不能释放或改变需要传输的信息。
源端必须在令VALID信号有效之后再等待READY信号有效,一旦VALID有效,源端必须等待握手发生,即在保持VALID不变的情况下,等待目的端的READY信号有效。
在下图中,目的端首先在T1阶段之后令READY信号有效,源端在T2阶段之后给出地址、数据或控制信息,并令VALID有效,然后在T3阶段开始传输,在这种情况下,传输只消耗了一个时钟周期,而在上面那种情况下,则消耗了两个时钟周期。
目的端可以在自身READY信号无效的情况下,等待源端的VALID信号有效,这一条规则和上一条规则必须同时遵守,否则可能造成死锁等待,同时,在VALID有效前,即使READY已经有效,也可以再次令READY无效。
在下图中,两端的VALID/READY信号同时有效,则传输立刻在下一个时钟周期开始:
通道信号需求
每个通道都有自己的握手信号对:
- 写地址通道:AWVALID/AWREADY。
- 写数据通道:WVALID/WREADY。
- 写响应通道:BVALID/BREADY。
- 读地址通道:ARVALID/ARREADY。
- 读数据通道:RVALID/RREADY。
写地址通道:
主设备仅当输出有效的地址和控制信息时才能使能AWVALID信号,在从设备的AWREADY信号有效后的第一个时钟上升沿,主设备的AWVALID信号必须保持有效。
AWREADY信号的默认状态可以为高也可以为低电平,规范推荐默认状态为高电平。当该信号为高电平时,意味着从设备一定可以接受任何有效的地址。
注意:规范不推荐AWREADY信号默认为低电平是因为这会强制使传输周期拉长到至少两个时钟周期,一个周期用于使能AWVALID信号,另一个周期则用于使能AWREADY信号。
写数据通道:
在写突发过程中,主设备可以仅当它输出有效数据时才使能WVALID信号,同样的,该信号必须在从设备WREADY信号有效后的第一个时钟上升沿保持有效。
WREADY信号默认可以为高电平,但这意味着从设备总是可以在一个时钟周期内接收待写入的数据。
主设备在进行突发事务中的最后一次写传输时,必须令WLAST信号有效。
写响应通道:
从设备输出有效的写响应信号后才能驱动BVALID信号,该信号在BREADY信号有效后的第一个时钟上升沿保持有效。
BREADY信号默认可以为高电平,但此时主设备必须总能在一个时钟周期内接收写响应。
读地址通道:
主设备仅当输出有效的地址和控制信息时才能使能ARVALID信号,在从设备的AWREADY信号有效后的第一个时钟上升沿,主设备的ARVALID信号必须保持有效。
ARREADY信号的默认状态可以为高也可以为低电平,规范推荐默认状态为高电平。当该信号为高电平时,意味着从设备一定可以接受任何有效的地址。
注意:规范不推荐ARREADY信号默认为低电平是因为这会强制使传输周期拉长到至少两个时钟周期,一个周期用于使能ARVALID信号,另一个周期则用于使能ARREADY信号。
读数据通道:
从设备只有在输出有效读数据时才能使能RVALID信号,同时在主设备的RREADY信号有效后的第一个时钟上升沿必须保持有效。即使从设备只有一个读数据源,它也必须在收到数据请求时才令RVALID信号有效。
主接口使用RREADY信号表示它可以接收数据,RREADY信号默认可以为高电平,但此时主设备启动读事务时必须能立即接收数据。
从设备在进行突发传输事务中的最后一次传输时必须使能RLAST信号。
通道间的关系
AXI协议要求各个通道间必须保持如下关系:
- 写响应必须紧跟在其所属的写事务的最后一次写传输之后。
- 读数据必须紧跟着它的地址之后。
- 通道握手必须符合通道握手依赖关系。
除此之外,协议没有规定其它的任何关系,这意味着,在一个事务中,写数据信号可以提前于写地址信号,这种情况通常发生在写地址的通道的寄存器阶段要更多时, 同样,写数据可以和写地址信号同时出现。
注意:当互联器需要决定目标地址空间或从设备地址空间时,必须对地址和写数据重排,以确保写数据仅对其关联的从设备有效。
通道握手信号依赖关系
为了避免死锁,下列依赖规则必须遵守:
在任何事务中:
- 发送信息的AXI接口的VALID信号不能依赖于接收信息的AXI接口的READY信号。
- 接收信号的的AXI接口在其自身的READY信号有效前可以等待对方的VALID信号。
注意:VALID信号可以在READY信号之前有效,READY信号也可以在检测VALID信号之前有效,这些方式都会提升传输效率。
在下面的依赖图中:
- 单头箭头指向的信号可以在始端信号有效前或有效后有效。
- 双头箭头指向的信号只有在始端信号有效后才能有效。
读传输依赖
在读传输中:
- 主设备在使能ARVALID前不能等待从设备使能ARREADY。
- 从设备在使能自身的ARREADY前可以等待主设备使能ARVALID。
- 从设备可以在主设备使能ARVALID前使能ARREADY。
- 从设备在使能RVALID前必须等待ARVALID和ARREADY信号都使能。
- 从设备在使能RVALID后才能等待主设备使能RREADY。
- 主设备在使能RREADY前可以等待从设备使能RVALID。
- 主设备在从设备使能RVALID前可以使能RREADY。
总结就是:VALID信号发出方,必须首先使能VALID,才能等待READY信号;READY信号发出方,不必等待VALID有效,就可以发出READY信号,也可以等待VALID有效,再发出READY信号,同时,读数据通道的VALID信号不能保持常态有效。
依赖关系图如下:
写传输依赖:
- 主设备在使能AWVALID或WVALID后才能等待从设备使能AWREADY或WREADY。
- 从设备在使能AWREADY前可以等待AWVALID或WVALID有效。
- 从设备在AWVALID或WVALID有效前可以先使能AWREADY。
- 从设备可以在使能WREADY前等待AWVALID与WVALID有效。
- 从设备在AWVALID或WVALID有效前可以先使能WREADY。
- 从设备必须等待WVALID与WREADY都有效后才能使能BVALID。
- 从设备必须等待WLAST有效后才能使能BVALID,因为写响应必须发生在一次写事务中的最后一次数据传输后。
- 从设备必须在使能BVALID后才能等待主设备使能BREADY。
- 主设备可以在使能BREADY前等待BVALID。
- 主设备可以在BVALID有效前使能BREADY。
依赖关系图如下:
AXI4写响应依赖
注意:
- 该额外的依赖关系是AXI3所期望的,因为AXI3不希望任何组件在接收到有效的地址前接收写数据并提供写响应信号(由于AXI3允许写数据和写响应在写地址被接受前发出,因此AXI4从设备与AXI3从设备不完全兼容,而主设备则完全兼容,强烈推荐AXI3从设备按照更严格的AXI4写响应依赖图实现)。
- 通过发出写响应,从设备负责对写事务和所有后续事务进行冒险检查。
依赖关系如下:
- 主设备在使能AWVALID或WVALID后才能等待从设备使能AWREADY或WREADY。
- 从设备在使能AWREADY前可以等待AWVALID或WVALID有效。
- 从设备可以在使能WREADY前等待AWVALID与WVALID有效。
- 从设备在AWVALID或WVALID有效前可以先使能WREADY。
- 从设备等待AWVALID、AWREADY、WVALID、WREADY有效后才能使能BVALID。
- 从设备必须等待WLAST有效后才能使能BVALID,因为写响应必须发生在一次写事务中的最后一次数据传输后。
- 从设备必须在使能BVALID后才能等待主设备使能BREADY。
- 主设备可以在使能BREADY前等待BVALID。
- 主设备可以在BVALID有效前使能BREADY。
依赖关系图如下:
事务结构
地址结构
AXI协议是基于突发的,主设备向从设备传送事务的控制信息和第一个字节的地址,然后,从设备必须在此后的每次传输中计算数据地址。
突发传输不能跨越4KB地址边界。
注意:避免突发传输跨越两个从设备的边界,同时,必须使用从设备支持的地址增量。
突发长度:
突发长度由下列字段指定:
- 对于读传输,ARLEN[7:0]。
- 对于写传输:AWLEN[7:0]。
AXI3支持1~16的突发长度。
AXI4:
- 对于INCR突发类型,支持1~256的突发长度。
- 对于其它突发类型,支持1~16的突发长度。
AXI3中的突发长度定义如下:
突发长度 = AxLEN[3:0] + 1
AXI4中的突发长度定义如下:
突发长度 = AxLEN[7:0] + 1
在使用突发传输时,必须遵守如下规则:
- 对于回绕传输,突发长度必须为2、4、8或16。
- 突发传输不能跨越4KB地址边界。
- 突发传输不支持过早结束。
在AXI4中,突发类型为INCR且突发长度大于16的突发传输可以转换为多个长度更短的突发传输,即使突发属性表明事务是不可修改的。在这种情况下,生成的突发事务必须保持与原始事务相同的事务特征,唯一的例外是:
- 突发长度变小。
- 突发地址被适当调整。
注意:为了实现AXI3兼容性,将长突发传输转换为多个短突发传输是必要的,同时,这也可以减少长突发对QoS保证的影响。
突发大小:
该字段表示每次突发数据传输或每个节拍中中数据的字节数,由以下字段指定:
- 对于读传输,ARSIZE[2:0]。
- 对于写传输,AWSIZE[2:0]。
突发大小 = 2^AxSIZE
如果AXI的总线比突发大小宽,AXI接口每次传输就必须根据地址判断使用哪几条数据线,任何一次传输的大小都不能超过事务中任一代理的数据总线宽度。
突发类型:
AXI协议定义了三种突发类型:
- 固定(FIXED):在突发事务中,每次传输的地址一致,有效的字节线也是一致的,但是可以通过WSTRB信号控制实际有效的字节。这种方式通常用于对同一位置的重复访问,如读取或清空FIFO时。
- 递增(INCR):在一次递增突发事务中,每次传输,地址都会在之前的地址基础上递增,递增量为传输大小。
- 回绕(WRAP):这种类型和递增方式类似,但是,地址到达上界后,地址就会回绕到下界。
在回绕传输中,有几点需要注意:
- 起始地址必须对齐突发大小。
- 突发长度必须为2、4、8或16。
回绕突发方式的行为如下:
- 突发所使用的地址下界会对齐到传输数据的总量,这也被称为回绕边界。
- 在每次传输后,地址都会像递增突发方式一样递增,但是,一旦递增后的地址超过回绕边界,就会回到回绕边界的开始位置。
- 第一次传输的地址可以大于回绕边界的开始位置。
回绕突发方式通常用于Cache行的访问。
突发类型由如下字段指定:
- 对于读传输,ARBURST[1:0]。
- 对于写传输,AWBURST[1:0]。
字段取值如下:
AxBURST[1:0] | 突发类型 |
---|---|
00 | FIXED |
01 | INCR |
10 | WRAP |
11 | 保留 |
数据读写结构
写选通:
当WSTRB[i]为高电平时,对应的WDATA[(8i+7):8i]数据线有效,当WVALID为低电平时,写选通信号可以为任何值,不过标准推荐写选通信号全0或保持上一次的值。
狭窄传输(Narrow transfer):
当主设备产生一个数据宽度小于数据总线的传输时,地址和控制信号按照如何方式决定使用哪些字节线:
- 在递增或回绕突发模式中,每拍使用不同的字节线。
- 在固定突发模式中,每拍使用相同的字节线。
字节不变性(Byte invariance):
在访问单个存储器空间中的大小端混合数据时,AXI协议使用字节不变性大小端模式。为了能够完成访问支持混合字端顺序的单个数据存储空间,axi给了一个字节不变性机制
字节不变性大小端模式是指:
- 数据元素使用相同连续的内存字节,而不管数据的大小端如何。
- 大小端决定了存储器中的字节顺序,也就是说存储器中的第一个字节是数据元素的MSB还是LSB。
- 字节传输时,只需要将字节传输到地址给定的位置,而不需要考虑该字节是数据元素的哪一部分。
通常情况下,大多数小端组件可以直接连接到一个字节不变性接口,而只支持大端的组件则需要一个转换器。
非对齐传输:
AXI支持非对齐传输,对于任何数据宽度大于一个字节的突发传输而言,第一个字节的访问都可能是非对齐的。
一个主设备可以:
- 使用低位地址线发送一个非对齐的开始地址。
- 提供对齐的地址并使用字节选通信号线发送非对齐的开始地址。
注意:
- 低位地址线上的信息必须与字节选通信号提供的信息一致。
- 从设备不需要根据主设备传递的对齐信息执行任何特别的动作。
数据读写响应结构
AXI协议提供了读写事务中的响应信号:
- 对于读事务而言,从设备在读数据通道上发送响应信息,使用RRESP[1:0]信号。
- 对于写事务而言,从设备在写响应通道上发送响应信息,使用BRESP[1:0]信号。
响应共有四种类型:
- OKAY:一般访问成功。该信号表示一个一般访问成功,也表示一个独占访问失败。
- EXOKAY:独占访问成功。
- SLVERR:从设备错误。该信号表示向从设备的访问已成功,但从设备希望向原始主设备返回一个错误条件。
常见的从设备error的情况:
fifo或者缓冲器过流发送或者是缺流发送。
如果传输的burst size 不支持,比如传一个9位的,17位这种是不行的。
如果写操作,访问一个只读模块
从设备出现超时情况
访问了一个正在失效或者是不在正常工作负载状态的结构。
- DECERR:译码错误。通常由互联器生成,表示根据给定的事务地址找不到从设备。
RRESP与BRESP的取值如下:
RRESP/BRESP[1:0] | 响应 |
---|---|
00 | OKAY |
01 | EXOKAY |
10 | SLVERR |
11 | DECERR |
对于写事务而言,只有当整个突发事务结束时才会发出一个响应。
对于读事务而言,从设备可以针对突发事务中的每个传输发送不同的响应。
协议规定,指定数量的数据传输必须全部被执行,即使发生了错误。
下面详细介绍不同的响应所对应的可能的情况:
OKAY响应可能在下列情况出现时产生:
- 一个一般访问成功。
- 一个独占访问失败。
- 独占访问指定的从设备不支持独占访问。
EXOKAY响应可能在下列情况出现时产生:
- 一个独占访问成功。
对于SLVERR响应,为了简化系统监控和调试,规范推荐这种错误响应只用于错误条件,而不用于除了事件外的一般通知,SLVERR响应可能在下列情况出现时发生:
- FIFO或缓冲区已满或已空。
- 尝试不支持的传输大小。
- 尝试写一个只读位置。
- 从设备超时。
- 尝试访问已禁用或已掉电功能。
对于DECERR响应,只有当互联器不能找到对应的从设备时才会返回。规范推荐互联器此时路由到一个默认的从设备,并由该默认从设备返回DECERR响应。
AXI协议要求事务中的全部数据传输必须都被完成,即使发生了错误,因此任何给定DECERR响应的组件满足这个需求。
事务属性Transaction Attrabution
事务类型和属性
从设备可以分为以下两种类型:
- 存储器从设备:一个需要正确处理全部事务类型的存储器从设备。
- 外设从设备:一个外设从设备实现了定义的访问方法。通常,这被记载在组件的datasheet中。对于未定义的访问方法,外设从设备必须能够完成事务,但是规范并不要求从设备能够正确的完成所操作,它之要求从设备能够继续处理接下来的事务,这主要是为了避免系统发生死锁。
AXI协议定义了一整套支持存储器和外设从设备的事务属性,使用ARCACHE与AWCACHE信号来表示(后面使用AxCACHE指代这两个信号),这些信号控制事务通过系统进行的方式与系统级Cache处理事务的方式。
AXI3存储器属性信号
在AXI3中,AxCache[3:0]指定了事务的可Buffer(Bufferable)、可Cache(Cacheable)与分配(Allocate)属性:
AxCACHE | 值 | 事务属性 |
---|---|---|
[0] | 0/1 | 不可Buffer/可Buffer |
[1] | 0/1 | 不可Cache/可Cache |
[2] | 0/1 | 不可读分配/可读分配 |
[3] | 0/1 | 不可写分配/可写分配 |
可Buffer(B)是指,互联器或者其它任何组件是否可以让事务延迟任意个周期到达目的端,通常该属性仅与写请求相关。
可Cache(C)是指,传输分配是否被允许,以及原始事务特征是否一定匹配最终的事务特征,即多次写事务是否可以被合并(对于写事务)或某个位置的内容是否可以被预取(对于读事务)或某个读操作是否可以被分解为多个读事务(对于读事务)。
可读分配(RA)是指:是否推荐事务进行读分配,但不是强制的,当不可Cache时,该位必须为0。
可写分配(WA)是指:是否推荐事务进行写分配,但不是强制的,当不可Cache时,该位必须为0。
AXI4对存储器属性信号的变更
AXI4做出了如下变更:
- AxCACHE[1]为重命名为可修改(Modifiable)位。
- 对于不可修改事务,定义了传输顺序要求。
- 更新了读分配和写分配的含义。
AxCACHE[1],可修改
在AXI4中,AxCACHE[1]位为可修改位,当该位为高时,表示事务特征可修改,当改位为低时,表示事务特征不可修改。
注意:该位仅仅是被重命名,因为新的名字能更好地描述该位的用途,而实际功能并未改变。
不可修改事务:
一个不可事务传输不能分割为多个事务,也不能和其它事务合并,下表中的参数也不能被改变:
参数 | 信号 |
---|---|
传输地址 | AxADDR以及AxREGION |
突发大小 | AxSIZE |
突发长度 | AxLEN |
突发类型 | AxBURST |
锁定类型 | AxLOCK |
保护类型 | AxPROT |
而AxCache信号仅被允许由可Buffer修改为不可Buffer,不允许其它的修改。
事务ID和QoS可被修改。
一个突发长度超过16的不可修改事务可被分割为多个事务,产生的事务仍然必须满足上述要求,除了:
- 突发长度减小。
- 突发地址被适当地修改。
对于独占的不可修改传输,在保持总访问字节数不变的情况下,允许修改AxSIZE与AxLEN。
注意:
- 存在一些无法满足不可修改事务需求的情况,例如,传输降级到更狭窄的总线时,事务的传输大小AxSIZE必须修改。
- 一个组件可以包含自定义的机制来通知事务特征发生了修改,这有助于软件调试。
可修改事务:
在可修改事务中,下列特征可以被修改:
- 一个事务可以被分割为多个事务。
- 多个事务可以被合并为一个事务。
- 一个读事务可以进行预取操作。
- 一个写事务可以访问比所需更大的地址范围,使用WSTRB信号以确保只有合适的位置被更新。
- 在每个生成的事务中,下列信号可以被修改:传输地址、突发大小、突发长度、突发类型。
下列特征不可以被修改:
- 锁定类型,AxLOCK。
- 保护类型,AxPROT。
存储器属性AxCACHE可以被修改,但是任何修改都必须确保事务的可见性不会因为阻止事务传播到所需的点或更改在Cache中寻找事务的需求而减少。任何对于存储器属性的修改都必须与相同地址范围内的其它事务一致。
传输ID和QoS可被修改。
当修改的结果出现如下情况时是不允许的:
- 导致访问与原始事务不同的4KB地址空间。
- 导致针对单次拷贝原子大小的区域的单次访问变为多次访问操作。
不可修改事务的顺序要求
AXI4要求满足下列全部条件的任何事务集的顺序被保证:
- 事务是不可修改的。
- 事务使用了相同的AXI ID。
- 事务目标是相同的从设备。
无论事务的地址是什么,只要事务目标是同一个从设备,事务顺序都必须被保证。
注意:当读写通道上分别出现独立的事务时,如果一个事务在另一个事务的响应被收到后才发出,则顺序可以被保证,否则顺序不能被保证。
读分配与写分配的更新含义
在AXI4中,读分配位表示事务中是否会发生分配,写分配位表示是否可能由于另一个事务而进行了分配。
对于读事务,写分配位被重定义用来表示:
- 由于先前的写事务,该位置可能已经预先在Cache中分配(就像AXI3所定义的那样)。
- 由于先前另一个主设备的行为,该位置可能已经预先在Cache中分配(AXI4的附加定义)。
对于写事务,读分配位被重定义用来表示:
- 由于先前的读事务,该位置可能已经预先在Cache中分配(就像AXI3所定义的那样)。
- 由于先前另一个主设备的行为,该位置可能已经预先在Cache中分配(AXI4的附加定义)。
这样变更意味着:
- 如果AxCACHE[3:2]不等于00,事务必须在Cache中查找。
- 如果AxCACHE[3:2]等于00,事务不需要在Cache中查找。
新的AWCACHE定义如下:
名称 | AXI4定义 | 描述 |
---|---|---|
AWCACHE[3] | Allocate | 当该位有效时,事务必须首先在Cache中查找,因为它可能被预先分配,同样的,如果AWCACHE[2]有效,事务同样需要预先在Cache中查找。而如果这两位都为0,事务则不必查找Cache。 |
AWCACHE[2] | Other Allocate | 当该位有效时,事务必须首先在Cache中查找,因为它可能由于其它的事务,即读事务或来自另一个主设备的事务,在Cache中被预先分配。 |
AWCACHE[1] | Modifiable | 当该位有效时,事务的特征可以修改,写事务可以被合并 |
AWCACHE[0] | Bufferable | 当该位无效时,如果AWCACHE[3:2]为00,写响应必须来自最终目的端。 当该位有效时,若AWCACHE[3:2]为00,写响应可以来自中间点,但写事务必须及时被最终目的端看到。 当该位无效时,如果AWCACHE[3:2]不为00,写响应可以来自中间点,但写事务必须及时被最终目的端看到。 当该位有效时,如果AWCACHE[3:2]不为00,写响应可以来自中间点,同时写传输可以不必被最终目的端看到。 |
新的ARCACHE定义如下:
名称 | AXI4定义 | 描述 |
---|---|---|
ARCACHE[3] | Other Allocate | 当该位有效时,事务必须首先在Cache中查找,因为它可能由于其它的事务,即写事务或来自另一个主设备的事务,在Cache中被预先分配,同样的,如果ARCACHE[2]有效,事务同样需要预先在Cache中查找。 |
ARCACHE[2] | Allocate | 当该位有效时,事务必须首先在Cache中查找,因为它可能被预先分配。 |
ARCACHE[1] | Modifiable | 当该位有效时,事务的特征可以修改,写事务可以被合并。 |
ARCACHE[0] | Bufferable | 当ARCACHE[3:1]为000时该位无用。 当ARCACHE[3:2]为00且ARCACHE[1]为1时,若该位无效,则读取的数据必须来自最终目的端,否则可以来自一个指向该目的端正在处理的写事务。 当ARCACHE[3]有效或ARCACHE[2]有效时,该位可以用来区分写穿和写回存储器类型。 |
存储器类型
下列的表中给出了AxCACHE的编码含义,其中有的类型拥有两种编码,其中括号内的是AXI3所采用的编码,其它则为AXI4所采用的编码,这主要是为了让AXI4具有向下兼容能力:
ARCACHE[3:0] | AWCACHE[3:0] | 存储器类型 |
---|---|---|
0000 | 0000 | 不可Buffer设备 |
0001 | 0001 | 可Buffer设备 |
0010 | 0010 | 一般不可Cache不可Buffer存储器 |
0011 | 0011 | 一般不可Cache可Buffer存储器 |
1010 | 0110 | 写穿不可分配存储器 |
1110(0110) | 0110 | 写穿可读分配存储器 |
1010 | 1110(1010) | 写穿可写分配存储器 |
1110 | 1110 | 写穿可读写分配存储器 |
1011 | 0111 | 写回不可分配存储器 |
1111(0111) | 0111 | 写回可读分配存储器 |
1011 | 1111(1011) | 写回可写分配存储器 |
1111 | 1111 | 写回可读写分配存储器 |
不同的存储器属性
访问存储器相同区域的多个代理可以使用不同的内存属性,然而,为保证功能正确性,必须遵守如下几条规则:
- 所有访问存储器相同区域的主设备都必须拥有该区域的一致性可Cache视图,也就是说,要么这些主设备的AxCACHE[3:2]均为00,或均为非00。
- 不同的主设备可以使用不同的可分配暗示信号。
- 如果一个寻址区域是一般不可Cache的,任何主设备都可以使用设备存储器事务方式访问。
- 如果一个寻址区域是可Buffer的,任何主设备都可以使用不可Buffer的方式访问。
改变存储器属性
一个特定存储器区域的属性可以被改变,不过这需要一个合适的流程来执行,通常如下所示:
- 所有的主设备停止访问该区域。
- 某个主设备执行Cache维护操作。
- 所有的主设备使用新属性重启对该区域的访问。
访问权限
AXI提供了访问权限信号用以阻止非法事务:
- ARPROT[2:0]定义了读访问的访问权限。
- AWPROT[2:0]定义了写访问的访问权限。
其中,信号定义如下:
AxPROT | 值 | 功能 |
---|---|---|
[0] | 0/1 | 非特权访问/特权访问 |
[1] | 0/1 | 安全访问/不安全访问 |
[2] | 0/1 | 数据访问/指令访问 |
非特权与特权访问
一些处理器支持多种特权级,但是AXI仅支持两种特权级,具体的映射方法可以参照具体处理器的文档。
安全与非安全访问
该定义与ARM安全扩展中所定义的一致。
指令与数据
在AXI协议规范中,该位仅仅是一种暗示,例如,若某个事务包含指令和数据的混合项,则推荐将该位设置为0,表示当前进行的是数据访问而不是指令访问。
遗留问题
AXI4在处理一些AxCACHE存储器属性时引入了额外的要求。
在AXI4中,所有使用相同ID且目的从设备相同的设备事务都必须按序排列。
注意:
- 这并不是AXI3的要求,任何依赖该行为的AXI4组件都不能连接到不支持该特性的AXI3互联器上。
- ARM相信大多数的AXI3互联器都支持所需的AXI4行为。
该规范强烈推荐任何新的AXI3设计都应该实现AXI4的要求。
对于AxCACHE位名和存储器类型名,AX3组件可以使用AXI3或AXI4的名字。