【博文精选】AMBA学习笔记——AXI Stream详解
AXI Stream一般被翻译为AXI流协议,是AXI总线的一种演化版本。AXI4流协议作为一个标准接口,用于连接进行数据交换的组件。接口可以用来连接一个单一的主机,主机向接收数据的单一从 机发送数据。协议也可用于连接若干个主机和从机的组件。协议支持共用一组信号线的多个数据流,允许构建一个通用互联 (generic interconnect),可以执行 upsizing 、 downsizing 以及路由操作。相比于AHB/APB,AXI流协议提出了数据包、数据帧以及传输操作(Transfer)等概念,这也是其被称为流(Stream)的原因。
关于AXI Stream的基本概念解释如下:
传输(Transfer) 通过 AXI4 流接口进行的一个单一数据传输。一个单一数据传输由 TVALID TREADY 握手定
义。
包(Packet) 通过 AXI4 流接口被一起传输的一组字节。包类似于 AXI4 的突发。一个包可以由一个单一传
输或多个传输组成。基础组件可以使用包来更有效地处理 packet sized 组中的一个流。
帧(Frame) 一个 AXI4 流中最高级别的字节编组。一个帧包含整数个数的包。一帧可以包含很大数量的
字节数,例如,一个完整的视频帧缓存。
数据流(Data Stream) 从一个源设备到一个目标设备传输的数据。一个数据流可以是: 一系列独立字节传输 组合在包中的一系列字节传输。
数据流的主要形式
字节流
一个字节流是若干个数据和空字节的传输。在每个TVALID TREADY 握手期间,可以传输任何数量的数据字节。空字节不具有任何意义,可以被插入流中,或者从流中移除。下图展示了字节流的两个例子。图中,每一竖列代表在一个单一传输中的字节,在这个例子中使用了一个 4 byte 宽的数据总线。列的时间序为从左到右。因为空字节不传输信息,也不出现在流中,所以图中的两个例子传输的信息是相同的。
连续对齐的流
一个连续对齐的流是一个包含若干个数据字节的传输,这个传输中的每个包中都没有位置字节或空字节。下图图展示了一个连续对齐流的例子。
连续非对齐的流
一个连续非对齐的流是一个包含若干个数据字节的传输,这个传输中,每个包的第一个数据字节和最后一个数据字节之间没有位置字节。下图展示了连续非对齐流的两个例子。需要注意的是,一个连续非对齐的流可以在包的开始、结尾或开始和结尾处有任意数量的相邻位置字节。
稀疏的流(Sparse Stream)
一个稀疏的流是一个包含若干个数据字节及位置字节的传输。所有的数据及位置字节都必须被保持并从源设备传送到目标设备。下图展示了一个稀疏流的例子。一个稀疏流可以包含任何数据字节和位置字节的混合,但一般情况下多数字节为数据字节。一个稀疏流并不意味着只有少数字节是数据字节。
AXI Stream信号列表
如下表所示,其中n表示以 byte 为单位表示的数据总线的宽度;l表示TID 宽度,推荐最大为 8 bits,d表示DEST 宽度,推荐最大为 4 bits;u表示TUSER 宽度,推荐的 bit 数为以 byte 为单位表示的接口宽度的整数倍。
TVALID & TREADY握手机制
TVALID 和 TREADY 的握手决定了信息合适通过接口传输。一个双向的流控制机制允许主机和从机都可以控制通过接口传送的数据和控制信息的传输速率。为了使传输能够发生, TVALID 和 TREADY 信号都必须被断言。TVALID 和TREADY 都可以第一个被断言,或者两个信号在同一个 ACLK 周期内同时被断言。
在断言TVALID 之前,主机不能等待 TREADY 被断言 也就是要先断言 TVALID ,再断言 TREADY 。一旦 TVALID 被断言,其必须保持断言直到握手发生。
从机可以在断言TREADY 之前等待 TVALID 被断言。如果从机断言了TREADY ,允许在 TVALID 被断言之前从机取消断言 TREADY 。
下面给出几个例子:
TVALID先于 TREADY 的握手
下图中,主机发出了数据和控制信息并断言了 TVALID 信号为高。一旦主机断言了 TVALID ,主机发出的数据或控制信息必须保持不变,直到从机驱动 TREADY 信号为高表示可以接收数据和控制信息。在这种情况下,一旦从机断言 TREADY 为高,传输就会发生。箭头标示出了传输发生的位置。
TREADY先于 TVALID 的握手
下图中,从机在数据和控制信息有效之前驱动 TREADY 为高。这表示目标设备可以在一个 ACLK 周期内接收数据和控制信息。在这种情况下,一旦主机断言 TVALID 为高,则传输就会发生。箭头标示出了传输发生的位置。
TVALID 和 TREADY 同时发生的握手
下中,主机断言 TVALID 为高,从机在同一 ACLK 周期内也断言 TREADY 为高。在这种情况下,如图中箭头标注,传输在同一周期内发生。
数据包的边界
包是通过接口传输的一组字节。通过处理组合成包的传输,可以使得基础组件更有效率。AXI4 流包类似于 AXI4突发。在一个包传输过程中需要考虑的信号有TID 、TDEST 以及 TLAST 。关于 TID 和 TDEST 的更多信息请参 考源设备和目标设备信号 。
TLAST 的使用如下:
当取消断言时, TLAST 表示接下来可以进行另一个传输,因此当前传输可以被延迟,以进行扩展、缩小或合并操作
当被断言时, TLAST 可以被一个目标设备用来表示包的边界
当被断言时, TLAST 表示在一个共享链路上进行仲裁改变的有效点
需要注意的是,不要求仲裁只发生在一个TLAST 边界,但是 TLAST 可用来通过将传输保持在相同的包中来潜在提高效率。
TLAST可用于在源设备和目标设备之间传送信息。包的数量,以及 TLAST 断言的数量必须在主机和从机之间被
保持。协议中没有明确给出一个包边界的开始信号。一个包的开始由以下决定:
Reset 之后发 生的第一个 TID 和 TDEST 信号对
前一个传输结束之后的第一个传输,该传输具有唯一的一组 TID 和 TDEST 值
一个包中的所有字节都是来自相同的源设备,被发送到相同的目标设备,并且具有相同的TID 和 TDEST 值。
合并属于不同包的传输是不允许的。这个要求表示,两个具有相同TID 和 TDEST 值的传输,如果前一个传输断
言了 TLAST ,那么这两个传输也不能被合并。参见 合并考虑 。
绝对不允许合并两个具有不同TID 和 TDEST 值的传输。
一个传输,其TLAST 可以被断言但却不包含数据或位置字节。这可以用于:
当没有更多的数据或位置字节要传输时,表示 一个包的结束
推进传输任何被保留在中间缓存区的数据
在终点完成一个操作,该终点即一个包的结尾、期待一个 TLAST 的位置
一个已经断言了TLAST ,但没有任何数据或位置字节的传输,可以和前一个具有相同 TID 和 TDEST 值、但却没有断言 TLAST 的传输合并。参见合并考虑。由于不支持重新排序,因此,发送一个零数据字节的传输可以有效推进主机和从机之间的所有传输。
时钟、复位以及用户信号
每个组件都使用一个单一的时钟信号ACLK 。所有输入信号都在 ACLK 的上升沿上采样。所有输出信号必须在 ACLK 上升沿之后发生改变。
协议包含一个单一的低有效的复位信号ARESETn 。复位信号可以被异步断言,但取消断言必须是在 ACLK 上
升沿之后、同步的。在复位期间,TVALID必须被驱动为低。必须被驱动为低。所有其他信号可以被驱动为任何值。
一个主机接口必须只能在一个ARESETn被断言为高的上升沿之后、在被断言为高的上升沿之后、在ACLK的一个上升沿来开始驱动的一个上升沿来开始驱动TVALID。下图展示了展示了reset之后之后TVALID可以被驱动为高的第一个点。可以被驱动为高的第一个点。
典型的一个流接口的使用要求某些用户边带信号。边带信号可以被用于数据字节、传输、包、或者基于帧的信息。
有几种用户信号的使用,例如:
标记位置或者特殊数据项类型
提供辅助信息,这种辅助信息必须伴随数据。比如,奇偶性,控制信号,及 flags
识别一个包的段
其他内容
关于数据合并、组包及宽度转换;字节限定符详细解释;用户信号详细规范;可选信号,默认信号基本要求;协议兼容性等内容请参考本文附件的AXI Stream原文。
附件:
AXI4-Stream英文Spec:
AXI4-Stream中文Spec: