zl程序教程

您现在的位置是:首页 >  工具

当前栏目

AXI 总线协议学习笔记(4)

笔记学习协议 总线 AXI
2023-09-14 09:13:05 时间



引言

前面两篇博文从简单介绍的角度说明了 AXI协议规范。

AXI 总线协议学习笔记(2)

AXI 总线协议学习笔记(3)

从本篇开始,详细翻译并学习AXI协议的官方发布规范。

AXI总线协议,是一个处于不断发展和完善的协议,截至2023年4月6日,其各版本的迭代信息如下:

最新版本为 2023年3月1日更新的AXI5协议。由于本篇博文不是一次性完成的,时间跨度比较大,所以在更新的过程中一直会保持 AXI4 版本的AXI协议,避免造成混乱。对于最新版的 AXI5协议,可以自行去 ARM 官网download ,此处给出友情链接:AXI5 SPEC

本文翻译的版本为2021年发布的 H.c 版本。




文档中的时序图说明:

AXI指:Advanced eXtensible Interface,高级可扩展接口。

Part A ——AMBA AXI 协议规范

A1:介绍

A1.1 关于 AXI 协议

AMBA AXI协议支持管理器和从属器组件之间的高性能,高频率通信。

AXI协议特点:

  1. 适合高带宽低延迟设计。
  2. 不用复杂的桥接就可以支持高频操作。
  3. 该协议满足各种组件的接口要求。
  4. 它适用于具有高初始访问延迟的存储器控制器。
  5. 提供了互连架构实现的灵活性。
  6. 它向后兼容AHB和APB接口。

AXI协议的关键特性是:

  1. 单独的地址/控制和数据阶段。
  2. 支持使用字节选通进行未对齐的数据传输。
  3. 使用仅发出起始地址的基于突发的事务。
  4. 独立的读写数据通道,可以提供低成本的直接内存访问(DMA)。
  5. 支持发出多个未完成的地址。
  6. 支持无序事务完成。
  7. 允许轻松添加寄存器级以提供时序收敛。

A1.2 AXI架构

AXI协议基于突发,定义了五个独立的事务通道:

  1. 读地址通道,该通道的信号名以AR开头;
  2. 读数据通道,该通道的信号名以R开头;
  3. 写地址通道,该通道的信号名以AW开头;
  4. 写数据通道,该通道的信号名以W开头;
  5. 写响应通道,该通道的信号名以B开头;

地址信道携带描述要传输的数据的性质的控制信息。数据通过以下任一方式在管理器和从属器组件之间传输:

  1. 管理者通过写数据通道向从属者传输数据。在一次写事务中,从属者通过写响应通道告知管理者数据传输完成。
  2. 管理者通过读数据通道向从属者拿取数据。

AXI协议:

  1. 允许在实际数据传输之前发布地址信息。
  2. 支持多个未完成事务。
  3. 支持事务无序完成。

下图所示,写通道架构:

读通道架构:

 A1.2.1 通道定义

每个通道都包括一组信息信号,VALIDREADY 信号提供了双向握手机制。

源端利用 VALID 信号表征此通道上地址、数据或控制信息何时有效。目的端利用 READY 信号表征何时准备好接收源端信息。读写数据通道均包含一个 LAST 信号,来表征传输事务中传输的最后一个数据。

读写地址通道

读写事务均包含自己的地址通道。对应的地址通道会传输一次事务中需要的地址和控制信息。

读数据通道

读数据通道同时携带读取的数据和读响应信息,由下属侧传至管理器侧。

包含:

  1. 数据总线信号,位宽可为,8,16,32,64,128,256,512,或1024;
  2. 一个读响应信号,表征读事务完成的状态。

写数据通道

写数据通道用于传输从管理器侧发往从属器侧的写数据。

包括:

  1. 数据总线信号,位宽可为,8,16,32,64,128,256,512,或1024;
  2. 每八个数据位的字节通道选通信号,指示有效数据的字节。

写入数据通道信息始终被视为缓冲,因此管理器可以执行写入事务,而无需从属确认先前的写入事务。

写响应通道

下属使用写响应通道来响应写事务。所有写入事务都需要写响应信道上的完成信令。仅对完整事务发出完成信号,而不是对事务中的每个数据传输发出完成信号。

A1.2.2 接口和互联

一个典型的系统由多个管理器和从属设备组成,这些设备通过某种形式的互连连接在一起,如图所示。

AXI协议为以下接口提供了单一接口定义:

  1. 管理器和互联器
  2. 从属器和互联器
  3. 管理器和从属器

上述的接口定义支持多种不同的互联实现。

设备之间的互连等同于另一个具有对称的管理器和从属端口的设备,真正的管理器设备和从属设备可以连接这些端口。

典型的系统拓扑结构

绝大部分系统使用如下3种的互联拓扑结构:

  1. 共享地址数据总线
  2. 共享地址总线和多条数据总线
  3. 多层,具有多个地址和数据总线

在大多数系统中,地址信道带宽要求明显小于数据信道带宽要求。这样的系统可以通过使用具有多个数据总线的共享地址总线来实现并行数据传输,从而在系统性能和互连复杂性之间实现良好的平衡。

A1.2.3 寄存器切片

每个AXI信道仅在一个方向上传输信息,并且该架构不需要信道之间的任何固定关系。这些特性意味着可以在任何通道的几乎任何点插入寄存器片,而代价是额外的延迟周期。

注意

  1. 延迟周期和最大操作频率之间的权衡。
  2. 处理器和高性能内存之间的直接、快速连接,但使用简单的寄存器片来隔离到性能不太关键的外围设备的较长路径。

A1.3 术语

A1.3.1 AXI组件和拓扑结构

组件:具有至少一个AMBA接口的独特功能单元。组件可用作管理器、从属、外围和互连组件。

管理器组件:启动事务的组件。单个组件可能同时充当管理器组件和从属组件。例如,直接内存访问(DMA)组件在启动事务以移动数据时可以是管理器组件,在被编程时可以是从属组件。

从属器组件:一种接收事务并对其作出响应的组件。单个组件可以同时充当从属组件和管理器组件。例如,直接内存访问(DMA)组件在被编程时可以是从属组件,在启动事务以移动数据时可以是管理器组件。包括:存储器从属器件以及外设从属器件。

存储器从属器件:

内存从属组件或内存从属组件是具有以下属性的从属组件:

  • 从内存从属存储器读取字节将返回写入该字节位置的最后一个值。
  • 对从属存储器中字节位置的写入会将该位置的值更新为通过后续读取获得的新值。
  • 多次读取一个位置对任何其他字节位置都没有副作用。
  • 读取或写入一个字节位置对任何其他字节位置都没有副作用。

外设从属器件:

外围从属组件也称为外围从属组件。本规范建议外围从属设备具有通常在组件数据表中描述的“实施定义”访问方法。任何未定义为允许的访问都可能导致外围从属设备失败,但必须以协议正确的方式完成,以防止系统死锁。该协议不要求外围设备继续正确操作。
在本说明书中的描述上下文中,外围从属设备与外围设备、外围组件、外围设备和设备同义。

互联组件:具有多个AMBA接口的组件,将一个或多个管理器组件连接到一个或更多从属组件

互连组件可用于组合在一起:

  • 一组管理器,使其显示为单个管理器界面。
  • 一组从属项,使其显示为单个从属项界面。

A1.3.2 AXI 事务和存储器类型

当AXI管理器启动AXI操作时,以AXI从属器为通信目标:

  • AXI总线上所需的一整套操作构成AXI事务(事务指:AXI管理器启动AXI事务以与AXI从属服务器通信。通常,交易需要在经理和下属之间通过多个渠道交换信息。所需的一整套信息交换构成AXI事务。)。
  • 任何所需的有效载荷数据都作为AXI突发传输(Burst指:在AXI事务中,有效载荷数据在单个突发中传输,该突发可以包括多个节拍或单个数据传输。)
  • 突发可以包括多个数据传输或AXI Beats(AXI Beats指:AXI突发内的单个数据传输。)

A1.3.3 缓存和缓存操作

本规范没有定义任何缓存参考工作中定义的标准缓存术语。
然而,缓存和缓存行的词汇表条目阐明了这些术语在本文档中的使用方式。

缓存:缓存管理器中的任何缓存、缓冲区或其他存储结构,可以保存特定地址位置。

缓存线:高速缓存中的基本存储单位。它的大小总是2的幂。缓存线必须与缓存线的大小对齐。缓存行的大小相当于一致性颗粒。

A2:信号描述

A2.1 全局信号

AXI3或者AXI4协议中的全局信号

信号名称:ACLK

源:时钟源

说明:全局时钟信号,同步信号在该全局时钟的上升边沿采样。

信号名称:ARESETn

源:复位源

说明:全局复位信号,低电平复位有效。

A2.2 写地址通道信号

除专门说明外,所有信号适用于AXI3和AXI4协议。

信号名称:AWID

源:管理器

说明:写事务的标识标记。

信号名称:AWADDR

源:管理器

说明:写入事务中第一次传输的地址。

信号名称:AWLEN

源:管理器

说明:突发写入长度,写入事务中数据传输的确切数量。该信息确定与地址相关联的数据传输次数。

信号名称:AWSIZE

源:管理器

说明:表示写事务中,所传输的每个数据所占的字节数。

信号名称:AWBURST

源:管理器

说明:突发类型。指定一次传输事务中,每次数据传输的地址变化规律。

信号名称:AWLOCK

源:管理器

说明:提供有关写事务原子特性。此信号在AXI第3、4代之间有变化。

信号名称:AWCACHE

源:管理器

说明:指示写入事务如何在系统中进行。

信号名称:AWPROT

源:管理器

说明:写事务的保护属性,包括 权限、安全级别和访问类型。

信号名称:AWQOS

源:管理器

说明:写事务服务质量标识。AXI3中未实现。

信号名称:AWREGION

源:管理器

说明:写入事务的区域指示符。AXI3中未实现。

信号名称:AWUSER

源:管理器

说明:写入事务的用户自定义扩展。AXI3中未实现。

信号名称:AWVALID

源:管理器

说明:指示写事务通道信号的有效性。

信号名称:AWREADY

源:从属器

说明:指示从属器可以接收写地址通道的传输。

A2.3 写数据通道信号

信号名说明
WID管理器写数据传输的ID标签,仅在AXI3中实现
WDATA管理器写数据
WSTRB管理器写选通,一位负责一个字节
WLAST管理器表明写数据的最后一个数据
WUSER管理器写数据通道的用户自定义信号
WVALID管理器写数据通道有效信号
WREADY从属器写数据通道的可接收状态信号

A2.4 写响应通道信号

信号名说明
BID从属器写响应的ID标签
BRESP从属器写响应,表明写事务完成的状态
BUSER从属器写响应通道的用户自定义信号
BVALID从属器写响应通道有效信号
BREADY管理器写响应通道的可接收状态信号

A2.5 读地址通道信号

除专门说明外,所有信号适用于AXI3和AXI4协议。

信号名称:ARID

源:管理器

说明:读事务的标识标记。

信号名称:ARADDR

源:管理器

说明:读事务中第一次传输的地址。

信号名称:ARLEN

源:管理器

说明:突发写入长度,读事务中数据传输的确切数量。该信息确定与地址相关联的数据传输次数。

信号名称:ARSIZE

源:管理器

说明:表示读事务中,所传输的每个数据所占的字节数。

信号名称:ARBURST

源:管理器

说明:突发类型。指定一次传输事务中,每次数据传输的地址变化规律。

信号名称:ARLOCK

源:管理器

说明:提供有关读事务原子特性。此信号在AXI第3、4代之间有变化。

信号名称:ARCACHE

源:管理器

说明:指示读事务如何在系统中进行。

信号名称:ARPROT

源:管理器

说明:读事务的保护属性,包括 权限、安全级别和访问类型。

信号名称:ARQOS

源:管理器

说明:读事务服务质量标识。AXI3中未实现。

信号名称:ARREGION

源:管理器

说明:读事务的区域指示符。AXI3中未实现。

信号名称:ARUSER

源:管理器

说明:读事务的用户自定义扩展。AXI3中未实现。

信号名称:ARVALID

源:管理器

说明:指示读事务通道信号的有效性。

信号名称:ARREADY

源:从属器

说明:指示从属器可以接收读地址通道的传输。

A2.6 读数据通道信号

信号名说明
RID从属器读数据和读响应的ID标签
RDATA从属器读数据
RRESP从属器读响应,表征读的状态
RLAST从属器表明读数据的最后一个数据
RUSER从属器读数据通道的用户自定义信号
RVALID从属器读数据通道有效信号
RREADY管理器读数据通道的可接收状态信号

A3:信号接口要求

A3.1 时钟和复位

A3.1.1 时钟

每个AXI接口都只有一个时钟信号ACLK。所有的输入信号在ACLK的上升沿采样,所有的输出信号的变化发生在ACLK的上升沿之后。

在管理器和从属器接口上,输入和输出信号之间不能有组合路径。

A3.1.2 复位

AXI协议使用仅使用一个低电平有效的复位信号,ARESETn。该信号可以异步断言,但是复位撤离时必须与ACLK的上升边沿同步。

复位期间,需满足如下的接口信号要求:

  • 管理器接口必须将 ARVALID, AWVALID,  WVALID 信号拉低。
  • 从属器接口必须将 RVALID , BVALID 信号拉低。
  • 其他信号可以为任意值。

管理器在复位信号撤离后最早可以将 ARVALID, AWVALID, WVALID 信号拉高的时刻是复位信号ARESETn 为高电平后 ACLK 的第一个上升边沿。如下时序图:

A3.2 基本读写事务

A3.2.1 握手过程

AXI协议的5个通道全是用 VALID/READY 去完成数据、地址、控制信息传输过程的握手。这种双向流控制机制意味着管理器和从属器都可以控制信息在二者之间移动的速率。源端 产生VALID信号指示地址、数据、控制信息的有效性。目的端 产生READY信号指示其已准备好可以接受来自源端的信息。当且仅当VALID/READY信号均为高电平,成功握手时,才产生一次有效传输。在管理器和从属器接口上,输入和输出信号之间不能有组合路径。(一般都是直线连线)握手时序图,握手在T3时刻完成:

 源端 在目的端接收到有效信息之前,应在总线上一直保持将要传输的有用信息。

源端 在断言VALID信号之前,不允许一直等待 READY信号的断言。

当VALID信号断言时,其应一直保持该信号的有效性直到握手发生,握手时刻发生在READY / VALID信号均断言的第一个时钟上升沿。下图是目的端在源端断言VALID信号之前断言READY的时序图,握手在T3时刻完成:

目的端 在断言对应的READY信号之前,允许一直等待源端VALID信号断言。

如果READY信号断言,那么在VALID信号断言之前可以取消断言READY信号。下图的时序图中,在T2时刻完成握手。

A3.2.2 通道信号要求

每个通道都有各自的握手信号:

写地址通道

管理器给出有效的地址和控制信息时就可以将 AWVALID 信号断言,一旦断言 AWVALID 信号必须一直保持有效至 AWREADY 信号断言后的第一个时钟上升沿。

AWREADY 信号默认的状态可以是高电平也可以是低电平。协议规范建议的默认状态是高电平。当AWREADY 信号为高电平时,从属器必须有能力接受发给它的任何有效地址。

——注意——

协议规范之所以不推荐默认状态为低电平的原因在于,如果这样会迫使传输至少消耗2个时钟周期,一个周期断言AWVALID 一个周期断言 AWREADY。

写数据通道

在一次突发写入期间,管理器给出有效的写数据时就可以将 WVALID 信号断言,一旦断言 WVALID 信号必须一直保持有效至 WREADY 信号断言后的第一个时钟上升沿。

WREADY 信号默认的状态可以是高电平,唯有如此,从属器才可以在一个时钟周期接收写数据。

管理器必须在其写突发传输中给出最后一个写数据时断言 WLAST 信号。

协议规范建议将 WDATA 无效的字节通道置零。

写响应通道

从属器当且仅当其发出有效写响应时,断言 BVALID 信号。一旦断言 BVALID 信号必须一直保持有效至 BREADY 信号断言后的第一个时钟上升沿。

BREADY 信号默认的状态可以是高电平,唯有如此,管理器才可以在一个时钟周期接收写响应。

读地址通道

管理器给出有效的地址和控制信息时就可以将 ARVALID 信号断言,一旦断言 ARVALID 信号必须一直保持有效至 ARREADY 信号断言后的第一个时钟上升沿。

ARREADY 信号默认的状态可以是高电平也可以是低电平。协议规范建议的默认状态是高电平。当ARREADY 信号为高电平时,从属器必须有能力接受发给它的任何有效地址。

——注意——

协议规范之所以不推荐默认状态为低电平的原因在于,如果这样会迫使传输至少消耗2个时钟周期,一个周期断言ARVALID 一个周期断言 ARREADY。

读数据通道

从属器当且仅当其发出有效写响应时,断言 RVALID 信号。一旦断言 RVALID 信号必须一直保持有效至 RREADY 信号断言后的第一个时钟上升沿。尽管一个从属器只有一个数据读取的源端,但是同样必须断言 RVALID 信号以回应数据请求。

管理器通过断言 RREADY 信号去指示其可以接收数据。RREADY 信号的默认状态可以是高电平,但前提是管理器在启动读取事务时能够立即接受读取数据。

从属器必须在其读突发传输中给出最后一个写数据时断言 RLAST 信号。

协议规范建议将 RDATA 无效的字节通道置零。

A3.3 通道间的关系

AXI协议有如下的关系需要保持:

  • 写响应必须紧跟在写事务最后一个数据传输之后。
  • 读数据必须紧跟读取数据的地址之后。
  • 信道握手必须符合 信道握手信号之间的依赖关系 中定义的依赖关系。

该协议没有定义任何其他的通道间关系。

通道间的依赖关系缺失意味着,在一个事务中,写数据可以先于写地址出现。如果写地址通道比写数据通道包含更多级的寄存器,这种情况可能发生。类似地,写数据可能和地址在相同的时钟周期出现。

——注意——

当互连需要确定目标地址空间或从属空间时,它必须重新对齐写地址和数据。需要这种重新排列以确保写入数据仅对其目的地的从属方有效。

————————

当管理器发出写请求时,它必须能够提供该事务的所有写数据,而不依赖于该管理器的其他事务。

当管理器发出读取请求时,它必须能够接受该事务的所有读取数据,而不依赖该管理器的其他事务。

请注意,管理器可以依赖使用相同ID的事务按顺序返回的读取数据,因此管理器只需要足够的存储空间来存储来自具有不同ID的事务的读取数据。

A3.3.1 通道间握手信号的依赖关系

为了避免死锁状况,必须遵守握手信号之间存在的依赖性规则。

  • 发送信息的AXI接口的 VALID 信号必须不依赖于接收该信息的AXI接口的 READY 信号。
  • 正在接收信息的AXI接口可以等待直到它检测到 VALID 信号,然后才断言其相应的 READY 信号。

—— 注意 ——

在断言 READY 之前等待 VALID 被断言是可以接受的。在检测到相应的 VALID 之前断言READY也是可以接受的。这可以导致更有效的设计。

————————

此外,不同通道上的握手信号之间存在依赖性,AXI4定义了额外的写响应依赖性。以下小节定义了这些依赖关系:

  • 读事务依赖关系
  • AXI3写事务依赖关系
  • AXI4和AXI5写事务依赖关系

在依赖关系的图中:

  • 单箭头指向可以在 箭头开始处的信号 之前或者之后断言的信号
  • 双箭头指向只能在 箭头开始处信号 之后断言的信号

读事务依赖关系

下图所示是读事务握手信号的依赖关系:

  • 管理器在断言 ARVALID 信号之前禁止等待从属器断言 ARREADY 信号。
  • 从属器在断言 ARREADY 信号之前可以等待 ARVALID 信号的断言。
  • 从属器可以在 ARVALID 信号断言之前断言 ARREADY 信号。
  • 从属器必须等待 ARVALID 信号 和 ARREADY 信号均断言,才可以断言 RVALID 信号。
  • 从属器在断言 RVALID 信号之前禁止等待管理器断言 RREADY信号。
  • 管理器在断言 RREADY信号之前可以一直等待 RVALID 信号的断言。
  • 管理器可以在 RVALID 信号断言之前断言 RREADY。

AXI3写事务的依赖关系

下图所示是写事务握手信号的依赖关系:

  • 管理器在断言 AWVALID 信号或 WVALID 信号之前禁止等待从属器断言 AWREADY 信号或 WREADY 信号。
  • 从属器在断言 AWREADY 信号之前可以一直等待 AWVALID 信号 或 WVALID 信号。
  • 从属器可以在 AWVALID 信号或 WVALID 信号断言之前断言 AWREADY信号。
  • 从属器在断言 WREADY 信号之前一直等待 AWVALID 信号或 WVALID 信号。
  • 从属器可以在 AWVALID 信号或 WVALID 信号断言之前断言 WREADY 信号。
  • 从属器在断言 BVALID 信号之前,一定要等待 WVALID 信号和 WREADY 信号断言,完成握手。从属器在断言 BVALID 信号之前也必须等待 WLAST断言完成。这个等待是必须的,因为写响应 BRESP 必须在写事务最后一个数据传输完成后起作用。
  • 从属器在断言 BVALID 信号之前禁止等待管理器断言 BREADY 信号。
  • 管理器可以在断言 BREADY 信号之前一直等待 BVALID 信号的断言。
  • 管理器可以在 BVALID 信号断言之前断言 BREADY 信号。

—— 注意 ——

为避免死锁状况必须遵守上述的依赖规则。例如,管理器在驱动(断言)WVALID 信号之前禁止一直等待 AWREADY 信号的断言。当此时从属器在断言 AWREADY 信号之前一直等待 WVALID 信号,就会出现死锁状况,导致一直无法握手,无法通信。

——————————

AXI4和AXI5写事务的依赖关系

AXI4和AXI5定义了额外的从属器写响应的依赖关系。从属器在断言 BVALID 信号之前必须等待 AWVALID, AWREADY, WVALID, WREADY 信号断言。通过发出写响应,下属器负责针对所有后续事务对写事务进行风险检查。

———— 注意 ————

这种额外的依赖性反映了AXI3中的预期用途,因为在接受地址之前,任何组件都不会接受所有写入数据并提供写响应。

———————————

下图所示是AXI4和AXI5需要的所有从属器写响应握手信号的依赖关系。

  •  管理器在断言 AWVALID 或 WVALID 信号之前禁止等待从属器断言 AWREADY 或 WREADY 信号。
  • 从属器在断言 AWREADY 信号之前可以一直等待 AWVALID 或 WVALID 信号断言。
  • 从属器可以在 AWVALID 或 WVALID 信号断言之前断言 AWREADY 信号。
  • 从属器在断言 WREADY 信号之前可以一直等待 AWVALID 或 WVALID 信号断言。
  • 从属器可以在 AWVALID 或 WVALID 信号断言之前断言 WREADY 信号。
  • 从属器在断言 BVALID 信号之前必须等待 AWVALID, AWREADY, WVALID, WREADY 信号断言。从属器在断言 BVALID 信号之前也必须等待 WLAST 信号断言。之所以要有这样一个等待是因为写响应 BRESP 只能在一次写事务的最后一个数据做出响应信号。
  • 从属器在断言 BVALID 信号之前禁止等待管理器断言 BREADY 信号。
  • 管理器在断言 BREADY 信号之前可以一直等待 BVALID 信号断言。
  • 管理器可以在 BVALID 信号断言之前断言 BREADY 信号。

A3.3.2 遗留问题

上节所述AXI4和AXI5中额外的依赖关系意味着,接受所有写入数据并在接受地址之前提供写入响应的AXI3从属设备不符合(不兼容)AXI4或AXI5。将AXI3从属器升级至AXI4或者AXI5需要一个额外的封装,此封装可以确保从属器在接受到准确的地址之后返回写响应。

———— 注意 ————

此规范强烈建议所有AXI3从属器的实现包含此额外的依赖关系。

————————————

任何AXI3管理器都符合AXI4和AXI5写响应要求。

A3.4 事物结构

A3.4.1 地址结构

AXI协议基于突发传输。管理器通过给从属器相应事务的控制信息和首字节地址来开始一次突发传输。随着突发传输的进行,从属器必须计算突发中后续传输的地址。

一次突发传输不能跨越4KB地址边界。

———— 注意 ————

这一禁令可防止一次突发传输越过两个下属器之间的边界。它还限制了下属必须支持的地址增量。

————————————

突发长度

突发长度通过以下字段声明:

  • ARLEN[7:0] ,读传输
  • AWLEN[7:0],写传输

此规范中,AxLEN 表示 ARLEN 或 AWLEN。

AXI3对一切突发类型支持1~16长度的突发传输。

AXI4对 INCR 突发类型的传输长度扩展至 1~256。其他类型的突发传输仍保持 1~16 的突发长度。

AXI3中定义突发长度为:Burst_Length = AxLEN[3:0] + 1

AXI3中定义突发长度为:Burst_Length = AxLEN[7:0] + 1

AXI使用如下规则管理突发的使用:

  • 对于 WRAP突发(wrapping burst,一种突发类型,下文会详述),突发长度必须为2、4、8或16。
  • 一次突发传输不能跨越4KB地址边界。
  • 不支持提前终止突发。

任何组件都不可以提前终止一次突发传输。但是,为减小一次写突发中传输的数据个数,管理器可以通过取消断言所有写选通信号来阻止后续数据写入。这种情况下,管理器仍必须完成后续的突发数据传输,尽管对于从属器来说没有任何用。在一次突发读中,管理器可以忽略读取的数据不使用,但是必须完成突发传输中所有数据的接收。

———— 注意 ————

忽略不需要的读数据可能在访问读敏感设备时导致数据丢失,例如FIFO。当访问这样一个设备时,管理器必须使用一个精确匹配所需数据长度的突发长度。

————————————

后文会定义在专用访问期间影响突发的其他规则。

在AXI4协议中,突发类型为 INCR 突发长度大于 16 的传输事务可以转化为多个更小的突发传输,尽管事物属性表明此事务不可修改。这种情况下,生成的突发必须保持与原始事务相同的事务特征,唯一的例外是:

  • 突发长度减小。
  • 生成的突发的地址被适当地调整。

———— 注意 ————

AXI3兼容性需要具备将较长的突发传输分解为多个较短的突发传输的能力。还可能需要这种能力来减少较长突发对QoS保障的影响。

————————————

突发规格

一次突发传输中所传输的每个数据或者每一拍所包含的最大字节个数通过如下字段声明:

  • ARSIZE[2:0],对读事务
  • AWSIZE[2:0],对写事务

此规范中,AxSIZE 表示 ARSIZE 或者 AWSIZE

下表所示是 AxSIZE 的编码表:

如果 AXI 总线比突发规格更宽,AXI 接口必须从传输地址判断哪些字节通道的数据总线在当前数据传输时可以使用。

任何传输的大小都不能超过事务中任一代理的数据总线宽度。

突发类型

AXI 协议规定了3种突发类型:

FIXED:

在固定的突发传输中:

  • 突发过程的每次传输地址都相同;
  • 对于突发中的所有节拍,有效的字节通道都是恒定的。然而,在这些字节通道中,断言WSTRB 的实际字节可能因突发中的每个节拍而不同;

此种突发类型用于对相同位置存储空间重复访问。比如写满/读空FIFO、

INCR:

INCR means Incrementing 。在递增突发模式下,突发过程种的每次传输地址都是对前一次传输地址的递增。递增值取决于传输规格(AxSIZE)。对于一个已对齐的起始地址,突发过程中的每次传输地址在前地址的基础上加4(AxSIZE = 4)。

这种突发类型用于访问正常的顺序存储器。比如 DDR。

WRAP:

环绕突发类似于递增突发,不同之处在于如果达到地址上限,地址会环绕到较低的地址。

环绕突发有如下的限制:

  • 起始地址必须和每次传输的规格(AxSIZE)对齐。
  • 每次突发传输的长度必须为2,4,8或16中的一种。

环绕突发传输的行为:

  • 突发传输的最低地址需要和传输的总字节数对齐,即等于 每次传输的数据规格(AxSIZE) * 传输次数(AxLEN)。这个地址又被定义为 环绕边界
  • 每次传输后,地址的递增和 INCR 突发模式相同。如果地址递增到 环绕边界 + 要传输的总字节数,即,2*环绕边界 ,那么地址将环绕取到 环绕边界
  • 突发中的第一次传输可以使用高于环绕边界的地址,但要遵守适用于环绕突发的限制。当第一个地址高于环绕边界时,则任何 WRAP 突发传输都将地址环绕。

此突发类型用于高速缓存线访问。

突发类型声明:

  • ARBURST[1:0],对读事务
  •  AWBURST[1:0], 对写事务

此规范中,AxBURST 表示 ARBURST 或者 AWBURST

下表所示是 AxBURST 的编码:

突发地址

本节提供了确定突发内传输的地址和字节通道的方法。方程式使用以下变量:

变量名含义
Start_Address管理器发出的起始地址
Number_Bytes每次数据传输的最大字节数
Data_Bus_Bytes数据总线中字节通道数目
Aligned_Address起始地址的对齐版本
Burst_Length突发传输的数据长度
Address_N第N次传输对应的地址(N≥1)
Wrap_Boundary环绕突发模式下的最低地址
Lower_Byte_Lane传输的最低寻址字节的字节通道
Upper_Byte_Lane传输的最高寻址字节的字节通道
INT(x)对 x 四舍五入取整

下面的方程确定了突发传输中的地址:

Start_Address  = AxADDR

Number_Bytes = 2 ^ AxSIZE

Burst_Length   = AxLEN + 1

Aligned_Address = (INT(Start_Address / Number_Bytes)) × Number_Bytes

下面的方程确定了首次传输的地址:

Address_1 = Start_Address

对于INCR突发模式 和 地址未环绕的WRAP突发模式,此等式确定突发中第一次传输之后的任何传输的地址:

Address_N = Aligned_Address + (N – 1) × Number_Bytes

对于 WRAP 突发模式,Wrap_Boundary 变量定义了环绕边界:

Wrap_Boundary = (INT(Start_Address / (Number_Bytes × Burst_Length)))×                                                         (Number_Bytes × Burst_Length)

对于 WRAP 突发模式,如果 Address_N = Wrap_Boundary + (Number_Bytes × Burst_Length),那么:

  • 当前传输地址变为:Address_N = Wrap_Boundary
  • 后续任何传输:Address_N = Start_Address + ((N – 1) × Number_Bytes) –                                                                   (Number_Bytes × Burst_Length)

突发传输的首次传输中使用的字节通道:

Lower_Byte_Lane = Start_Address – (INT(Start_Address / Data_Bus_Bytes)) ×                                                      Data_Bus_Bytes

Upper_Byte_Lane = Aligned_Address + (Number_Bytes – 1) –

                                (INT(Start_Address /Data_Bus_Bytes)) × Data_Bus_Bytes

首次传输之后的所有传输,字节通道:

Lower_Byte_Lane = Address_N – (INT(Address_N / Data_Bus_Bytes)) × Data_Bus_Bytes Upper_Byte_Lane = Lower_Byte_Lane + Number_Bytes – 1

数据将在如下的字节段传输:

DATA( (8 × Upper_Byte_Lane) + 7   :   (8 × Lower_Byte_Lane) )

如果地址已对齐,字节选通信号已断言,事务容器描述了事务中可被访问的所有字节:

Container_Size = Number_Bytes x Burst_Length

对于 INCR 突发传输模式:

Container_Lower = Aligned_Address

Container_Upper = Aligned_Address + Container_Size

对于 WRAP 突发传输模式:

Container_Lower = Wrap_Boundary

Container_Upper = Wrap_Boundary + Container_Size

A3.4.2 传输的伪代码描述

// DataTransfer()
// ==============
DataTransfer(Start_Address, Number_Bytes, Burst_Length, Data_Bus_Bytes, Mode, IsWrite)
// Data_Bus_Bytes is the number of 8-bit byte lanes in the bus
// Mode is the AXI transfer mode
// IsWrite is TRUE for a write, and FALSE for a read
	assert Mode IN {FIXED, WRAP, INCR};
	addr = Start_Address; 				 	// Variable for current address
	Aligned_Address = (INT(addr/Number_Bytes) * Number_Bytes);
	aligned = (Aligned_Address == addr); 	// Check whether addr is aligned to nbytes
	dtsize = Number_Bytes * Burst_Length; 	// Maximum total data transaction size
	
	if mode == WRAP then
		Lower_Wrap_Boundary = (INT(addr/dtsize) * dtsize);
		// addr must be aligned for a wrapping burst
		Upper_Wrap_Boundary = Lower_Wrap_Boundary + dtsize;
	
	for n = 1 to Burst_Length
		Lower_Byte_Lane = addr - (INT(addr/Data_Bus_Bytes)) * Data_Bus_Bytes;
		if aligned then
			Upper_Byte_Lane = Lower_Byte_Lane + Number_Bytes - 1
		else
			Upper_Byte_Lane = Aligned_Address + Number_Bytes - 1
								- (INT(addr/Data_Bus_Bytes)) * Data_Bus_Bytes; 
	
	// Peform data transfer
	if IsWrite then
		dwrite(addr, low_byte, high_byte)
	else
		dread(addr, low_byte, high_byte);
	
	// Increment address if necessary
	if mode != FIXED then
		if aligned then
			ddr = addr + Number_Bytes;
			if mode == WRAP then
				// WRAP mode is always aligned
				if addr >= Upper_Wrap_Boundary then addr = Lower_Wrap_Boundary;
		else
			addr = Aligned_Address + Number_Bytes;
			aligned = TRUE; 			// All transfers after the first are aligned
return; 

A3.4.3  常规事务

传输事务的突发类型,规格,长度有很多的可选项。然而,有些接口和事务类型可能只需要其中的子集。如果从属组件连接至一个仅使用传输选项子集的管理器,那么就可以简化译码逻辑。

定义了Regular(常规)属性,以识别符合以下条件的事务:

  • AxLEN 为1,2,4,8,16
  • AxSIZE 和数据总线位宽一样,如果 AxLEN大于1
  • AxBURST 是 INCR 或 WRAP ,非 FIXED
  • AxADDR 对于 INCR 模式对齐事务容器
  • AxADDR 对于 WRAP 模式对齐AxSIZE

常规事务属性

Regular_Transactions_Only 属性用于定义管理器是否只发起常规类型事务,从属器是否仅支持常规类型事务。

TRUE    仅支持常规类型事务

FALSE  所有合法的组合(AxBURST, AxSIZE, AxLEN)都支持。

默认情况下,该属性为 FALSE

如下的接口中,该属性可以为真:

• AXI5

• ACE5

• ACE5-Lite

• ACE5-LiteDVM

互操作性

下表给出了适用于连接具有不同属性值的管理器和下属组件的指南:

A3.4.4 数据读写结构

本节描述了AXI读写数据总线上不同大小的传输,以及接口如何执行端序和未对齐的混合传输。它包含以下部分:

  • 写选通
  • 窄传输
  • 字节不变性
  • 未对齐传输

写选通

WSTRB[n:0] 信号中的某一bit 拉高,表示数据总线中对应的字节通道数据有效。1位负责1字节的有效指示。即 WSTRB[n] 对应于 WDATA[(8n)+7: (8n)] 

管理器在发送数据时,必须要将有效数据字节对应的写选通信号拉高。

当 WVALID 信号拉低时,写选通信号可以为任意值,尽管此规范建议将写选通信号均拉低或者保持前值。

窄传输

当管理器生成的传输比其数据总线窄时,地址和控制信息决定了传输使用的字节通道:

  • 在递增或者环绕突发模式下,传输的每一节拍使用不同的字节通道;
  • 在固定突发模式下,每节拍的传输使用相同的字节通道;

上图所示的示例:

  • 包含5个传输节拍;
  • 起始地址 0;
  • 每个传输8位宽;
  • 在32位宽的总线上传输;
  • 突发类型 INCR。

上图所示的示例:

  • 包含3个传输节拍;
  • 起始地址 4;
  • 每个传输32位宽;
  • 在64位宽的总线上传输。

字节不变性

为访问单一内存空间的混合字节序的数据结构,AIX协议使用字节不变字节序机制。

字节不变字节序机制中,数据结构中任何多字节单元:

  • 单元使用内存中相同连续的字节,与数据的字节序无关;
  • 字节序决定了内存中字节存放的顺序,即,内存中存放的第一个字节是MSB还是LSB;
  • 任何到地址的字节传输都会将同一数据总线上的8位数据传递到同一地址位置,而与它所组成的任何较大数据元素的字节序无关。

对于字节不变性,此处附上本人的见解:

数据在读写时,以起始地址为0,数据位宽为64为例,进行说明;每个内存单元存放1个字节,那么地址0存放第1字节,地址1存放第2字节,以此类推,也即是说,每个字节都有一个与之对应的地址空间进行存储。之所以叫字节不变性,就是因为它在读写时将数据拆分为了单个字节进行操作,而字节就是存储器存储的单位。所以就不存在什么大小端的冲突。因为数据读写有一一对应的地址。

简单来说,你可以认为这是一个“广义”上的小端模式,毕竟低字节是存放在低地址的

只有一个传输宽度的组件的字节通道必须连接到数据总线的适当字节通道。支持多个传输宽度的组件可能需要一个更复杂的接口来转换一个不是自然字节不变的接口。

大多数小端序组件可以直接连接到字节不变接口。只支持大端序传输的组件需要一个用于字节不变操作的转换函数。

此例分别演示了数据  0x0A0B0C0D 在寄存器和存储器中的存放情况。

  • 数据的MSB 0x0A 存储在寄存器的MSB
  • 数据的MSB存放在存储器的最低地址
  • 其他字节则按字节顺序依次存放

此例则是小端模式下,数据存放的情况。

以上两例,字节不变性确保大端序和小端序结构可以在单个内存空间中共存而不会损坏。

下图给出一个需要字节不变访问的数据结构示例:

上例中,数据头的字段使用小端序,负载数据使用大端序。

参考说明

【1】AMBA® AXI and ACE Protocol Specification.


未完结,持续更~