axi总线
参考文章链接:
AMBA总线3-AXI 咸鱼IC
深入理解AMBA总线(十五)AXI-stream - 知乎
基本概述
AMBA3版本推出了AXI协议,它支持高性能、高频率的系统设计,其主要特点如下所示:
- 分离的地址/控制和数据阶段
- 通过字节选通方式支持非对齐的数据传输
- 使用基于突发的事务,只需其实地址发出。(Burst不得跨4KB边界,防止跨越Slave边界)
- 单独的读写数据通道,这可以提供低成本的直接内存访问(DMA)
- 支持发布多个超前地址(outstanding)
- 支持完成乱序事务(out-of-oder)
- 易于添加register stage达成时序收敛
- AXI协议包括涵盖低功耗操作的可选扩展信号
AXI协议是基于突发的,并定义了五个独立的事务通道。地址通道携带着控制信息,用于描述传输数据的性质。五个独立通道都由一组信息信号、以及提供双向握手机制的VALID和READY信号组成。
- Master使用VALID信号来显示信道上的addr、data或ctrl信息何时可用
- Slave使用READY信号来显示它何时可以接受信息
- 读数据通道和写数据通道还包括LAST信号,以指示事务中最后数据项的传输


五个通道的特点如下所示:

一个典型的系统由许多Master和Slave组成,通过某种形式的互连连接在一起,如下图所示

Register slices
每个AXI通道只在一个方向上传输信息,并且该体系结构不需要通道之间有任何固定的关系。这意味着Register slices几乎可以在任何通道的任何点插入,代价是额外的延迟周期。
注意:Register slice的使用会造成:
- 在延迟和最大操作频率之间需要做权衡
- 处理器和高性能内存之间的直接、快速连接,但对于性能不太关键的外设,其较长路径使用简单的Register slices来隔离
术语说明
- AXI总线上所需操作的完整集合构成了AXI Transaction(事务)
- Transaction(事务):一个AXI主机发起一个AXI Transaction(事务)来与一个AXI从机通信。通常事务需要在多个通道上的主机和从机之间交换信息。所需的信息交换的完整集合形成了Transaction(事务)
- 任何所需的有效载荷数据都作为AXI Burst(突发)传输
- Burst(突发):在AXI事务中,有效负载数据在单个Burst(突发)中传输,该Burst(突发)可以包含多个Beats(拍),或者单独的数据传输。
- 一个突发可以包含多个数据传输,或称为AXI Beats(拍)
- Beats(拍):AXI Burst(突发)中的单个数据的传输
AXI信号列表

AXI握手机制
握手过程
所有五个事务通道,都使用相同的VALID/READY握手过程来传输地址、数据和控制信息。这种双向流控制机制意味着Master和Slave都可以控制信息的移动速率。传输只发生在VALID和READY信号都是1的时候
- 源端产生VALID=1信号:表示地址、数据或控制信息可用
- 终端生成READY=1信号:表示可以接受该信息
(1)VALID等READY
源端拉高VALID后必须保持住,直到终端拉高READY,在T3时刻完成握手

(2)READY等VALID
终端拉高READY后可以取消拉高,不必一直保持到完成握手

(3)VALID和READY同时拉高

握手依赖
握手依赖包括不同通道之间的依赖关系、以及同一通道中不同信号之间的依赖关系。首先记住一点:VALID和READY之间没有依赖关系,谁先谁后都可以,但是源端拉高VALID后必须保持住,直到终端拉高READY
下面给出握手依赖关系,单箭头指向表示不依赖,双箭头指向的信号必须依赖前者
(1)AXI读事务
- 必须先有读地址,再有读数据
- 从机发送突发传输中的最后一拍读传输时,必须拉高RLAST

(2)AXI3写事务
- 可以先有写数据,再有写地址
- 必须先有写数据,再有写响应
- 主机发送突发传输中的最后一拍写传输时,必须拉高WLAST
如果先有写数据,再有写地址,那么必须先对这些无主的数据进行缓存

(3)AXI4写事务
- 可以先有写数据,再有写地址。
- 必须先有写地址和写数据,再有写响应。(与AXI3不同)
- 主机发送突发传输中的最后一拍写传输时,必须拉高WLAST

遗留问题
上面写道,接受所有写数据并在接受地址之前提供写响应的AXI3 Slave与AXI4不兼容。将一个AXI3遗留Slave转换为AXI4需要添加一个Wrapper,以确保在Slave接受了适当的地址之后才提供返回的写响应。强烈建议任何新的AXI3 Slave实现都包含这个额外的依赖项。
任何AXI3 Master都符合AXI4写响应要求
AXI信号说明
- AXI协议基于Burst,Master 通过驱动第一个字节的地址来开始每个burst
- AXI协议的Burst不能跨越4KB边界
AxLEN
AxLEN表示突发长度,即读写事务中数据传输的确切数量,此信息确定与该地址相关的数据传输的数量。突发长度的计算公式是:突发长度=AxLEN+1。AXI3和AXI4/5的突发长度最大值略有不同,如下所示:
-
AXI3:所有突发类型都支持1~16的突发长度
-
AXI4/5:INCR突发类型支持
1~256的突发长度,其他类型还是只支持1~16的突发长度
AXI有以下规则来管理突发的使用: -
对于WRAP类型突发,突发长度必须为2、4、8或16
-
突发不能跨越4KB地址边界。(page大小为4K,4KB 边界即addr[11:0]=0的地址)
-
不支持提前终止突发
- 注意:没有任何组件可以提前终止突发,然而为了减少写突发中的数据传输数量,Master可以通过取消所有WSTRB来禁用进一步的写。这种情况下Master必须在突发中完成剩余的传输(但是写的数据无效)。在读突发中,Master可以丢弃读取的数据,但它也必须完成突发中的所有传输。
- 注意丢弃不需要的读数据可能导致访问读敏感设备(如FIFO)时丢失数据。当访问这样的设备时,Master必须使用与所需数据传输的大小完全匹配的突发长度。
在AXI4/5中,具有INCR突发类型和长度大于16的事务可以转换为多个较小的突发,即使事务属性表明该事务是不可修改的。(请参阅关于CACHE内存属性的更改。)这种情况下,生成的突发必须保留与原始交易相同的事务特征,但是注意这些事务的突发长度被减少了,突发地址也被适当地调整了。
注意: 为了实现AXI3兼容性或者保证QoS性能,需要能够将较长的突发分解为多个较短的突发。
AxSIZE
AxSIZE表示突发大小,即在突发中每次数据传输的byte数
-
- **注意:**丢弃不需要的读数据可能导致访问读敏感设备(如FIFO)时丢失数据。当访问这样的设备时,Master必须使用与所需数据传输的大小完全匹配的突发长度。
[!note]
在AXI4/5中,具有INCR突发类型和长度大于16的事务可以转换为多个较小的突发,即使事务属性表明该事务是不可修改的。(请参阅关于CACHE内存属性的更改。)这种情况下,生成的突发必须保留与原始交易相同的事务特征,但是注意这些事务的突发长度被减少了,突发地址也被适当地调整了。
**注意:**为了实现AXI3兼容性或者保证QoS性能,需要能够将较长的突发分解为多个较短的突发。
AxSIZE
AxSIZE表示突发大小,即在突发中每次数据传输的byte数。

如果AXI总线大于突发大小,AXI接口必须从传输地址中确定:每次传输使用数据总线的哪个字节通道。(参见后面《AXI读写结构》。)AxSIZE表示的数据宽度不能超过数据总线宽度。
AxBURST
AXI协议定义了3种突发类型

- FIXED
- 该地址在每次传输中都是相同的
- 有效的字节通道对于突发中的所有节拍(beat)都是恒定的。然而在这些字节通道中,对于突发中的每个节拍,断言了WSTRB的实际字节可能是不同的
这种突发类型用于重复访问同一位置,例如在加载或清空FIFO时
-
INCR
- 突发中每次传输的地址都是前一次传输地址的增量
- 增量值取决于传输的大小。例如在一个大小为4Byte的突发中,每个传输的地址是前一个地址加4
-
WRAP
- 起始地址必须与每次传输的大小一致。
- 突发的长度必须为2、4、8或16次传输
WRAP突发类似于INCR突发,不同之处在于如果达到了地址上限,地址就会回卷到较小的地址。以下限制适用于WRAP突发
这种突发类型用于缓存线路访问
xRESP
-
对于读事务,Slave可以在一次突发中对不同拍的传输发出不同的响应信号
- 例如在16次读传输的突发事务中,Slave可能会为其中15次传输返回OKAY响应,并为其中1次传输返回SLVERR响应
-
对于写事务,Slave为整个突发事务中发出单个响应信号,而不是为突发事务中的每个数据传输

注意: 协议规定即使报告了错误,也必须执行所需数量的数据传输。例如Slave要求了8个读传输,但Slave有错误情况,也必须执行8个数据传输,每个都有一个错误响应。如果Slave给出一个错误响应,不会取消突发的剩余部分。
AxCACHE
AXI3内存属性

AxCACHE[0]表示的是事务是否可以被缓存,以AXI2AHB为例,如果可以缓存,那么Bridge可以提前做出相应,让AXI进行下一次事务的传输,而数据再慢慢写入AHB设备即可
AxCACHE[1]表示的是事务是否允许分配缓存行,为1的时候允许系统进行优化,例如可以进行写合并,可以将多个写操作合并成一个更大的写事务;对于读,对读出的数据会进行缓存,这时候单个读取的值在缓存中已经有了,这时候就可以用于多个事务,对于预期位置,这是因为在读取一个地址的时候,会先缓存多个连续地址的数据,可以从缓存中获得数据,这时候就是预取
AxCACHE[2]为1的时候建议对事务就行读分配,注意这一个bit拉高的前提是AxCACHE[1]为高
AxCACHE[3]为1的时候建议对事务就行写分配,注意这一个bit拉高的前提是AxCACHE[1]为高
AXI4/5内存属性
AXI4/5内存属性进行了以下更改:
- AxCACHE[1]位被改名为Modifiable位。(改名是为更好地描述所需的功能,实际的功能没有改变)
- 排序需求是为Non-modifiable事务定义的
- Read-allocate和Write-allocate的含义被更新


AxPROT
AXI提供访问权限的信号,可用于防止非法交易

AxLOCK
AxLOCK信号涉及到原子访问的相关特性,AxLOCK代表的事务类型有Exclusive独占访问和Locked锁定访问。AXI4/5不再支持锁定访问,因为大多数组件不需要锁定事务,且这对互联复杂性和QoS都有影响。
(1)AXI3原子访问

(2)AXI4/5原子访问

AXI顺序模型
事务ID
AXI协议包括AXI ID事务标识符。Master可以使用它们来标识必须按顺序返回的单独事务。具有给定ID值的所有事务必须保持有序,但是对于具有不同ID值的事务的排序没有限制。这意味着单个物理端口可以通过充当多个逻辑端口来支持乱序事务,每个逻辑端口按顺序处理其事务。通过使用ID,Master可以发出事务,而不必等待先前的事务完成。这可以提高系统性能,因为它支持并行处理事务。
5个事务通道都有自己的事务ID,如下表所示:

Master可以使用AWID和ARID事务ID来指示其排序需求。传输排序规则如下:
- 来自不同Master的事务没有排列限制,它们可以以任何顺序完成
- 来自同一Master但具有不同ID值的事务没有排序限制,它们可以以任何顺序完成
- 具有相同ARID值的读事务序列的数据传输,Slave必须按照Master发出地址的顺序返回
- 具有相同AWID值的写事务序列的数据传输,Slave必须按照Maste发出地址的顺序完成
- 在使用AWID和ARID的公共值的读写事务之间没有排序限制
- AXI互联可以扩展事务ID值
AXI互联通过扩展事务ID值,可以不担心多Master发出相同ID值,因为互联可以附加ID上去,使得每个Master使用的ID值是唯一的,也因此造成Slave的ID比Master更宽。RID和BID返回给Master时,互联将移除掉附加ID
Outstanding超前传输
AHB和AXI都支持突发传输,但AXI还支持Outstanding超前传输,这便是AXI总线能够实现高性能传输的原因之一。Outstanding传输是指Master发出命令后,不必等待数据全写完或者全读回就可以发起下一笔命令。Outstanding深度是指Master发出的正在进行的命令数量,显然这需要Master和Slave准备更大的buffer来保存这些命令信息

Out-of-order乱序传输
AXI拥有事务ID,因此支持Out-of-order乱序传输,Out-of-order传输是指后发送的命令对应的响应可以先回来,注意必须是不同ID之间,相同ID之间不能乱序传输数据

乱序传输存在读数据重排序深度的问题,读数据重排序深度是指Slave中可以重排序的暂挂地址的数量。按顺序处理所有事务的Slave的读数据重排序深度为1。读数据重排序深度是一个静态值,必须由Slave的设计者指定
没有一种机制可以让Master确定Slave的读数据重排序深度。(所以发的太多会造成反压)
对于读乱序传输更详细的解释:
// Master同时请求:
读1: DDR内存(慢,100周期)
读2: SRAM(快,10周期)
读3: 缓存(更快,2周期)// 如果顺序执行:
读1完成 → 读2完成 → 读3完成(总112周期)// 如果乱序返回:
读3完成(2周期)→ 读2完成(10周期)→ 读1完成(100周期)
// 总时间≈100周期,因为慢的决定了总时间
对于读数据重排序深度的理解
深度=1的时候必须是顺序返回,深度>1支持乱序的slave,如深度为3则最大支持3个乱序
Interleaving交错传输
AXI拥有事务ID,因此支持Interleaving交错传输,Interleaving传输是指不同命令的数据之间可以插队重排,注意必须是不同ID之间,相同ID之间不能交错传输数据。
注意:对于支持写数据交错的Slave,它接收每个事务的第一个数据项的顺序必须与它接收事务地址的顺序相同

与读数据重排序深度类似的,有写数据交错深度,写数据交错深度是指一个Slave可以接收交错数据的地址数
交织的情况一般在于一个数据如果速率比较慢,需要多个周期,一个速率比较快,只需要较少的周期,就可以使用交织
AXI4/5取消了WID
AXI4/5协议中没有了WID,不再支持写交织,事务的所有写数据必须在写数据通道上的传输中连续提供(不得交织)
遗留问题
AXI4/5中取消了WID,为支持协议的兼容性,有以下建议:
- 任何支持写交错的AXI3 Master,都必须支持将写交错深度设置为1,以兼容不支持写交错的Slave
- 任何AXI3 Slave都可以接受非交错的写数据,因此对AXI3 Slave不存在遗留问题
AXI读写结构
WSTRB写选通
写选通信号WSTRB允许在写数据总线上进行稀疏数据传输。每个写选通信号对应写数据总线上的一个字节。当写选通断言时,表示写数据总线上对应的字节通道中包含将被更新到memory的有效信息。写数据总线上每 8 位具有一个写选通位,因此 WSTRB[n]对应WDATA[(8n)+7 : (8n)]。下图展示了一个 64bit 数据总线上的这种关系。

Master必须确保只有包含有效数据的字节通道,其对应的写选通信号才会被拉高。当WVALID为0时,WSTRB可以取任何值,尽管建议它们要么被驱动为0,要么保持在之前的值。
窄带传输
当Master发起一个传输,其数据宽度小于数据总线宽度时,由地址和控制信息决定传输使用哪些字节通道,在INCR或WRAP突发中,突发的每拍(beat)使用不同的字节通道WSTRB。在FIXED突发中,每拍使用相同的字节通道
(1)案例1:32bit总线传8bit数据
下图表示这笔传输的突发有5个传输,传输的起始地址为0,每次传输8位,在32位总线上进行,突发类型为INCR。

(2)案例2:64bit总线传32bit数据
下图表示这笔传输的突发有3次传输,起始地址为4,每次传输为32位,在64位总线上进行

字节不变性
为了在单个内存空间中访问混合端序(mixed-endian)的数据结构,AXI协议使用字节不变的端序模式。字节不变端序意思是:一个传输到给定地址的字节,会在相同的数据总线信号线上,向相同的地址位置传送一个数据的8-bits。
更简单的例子,比如32bit的总线,规定了 bus[7:0] 对应addr[1:0]=0 ; bus[15:8] 对应addr[1:0]=1; bus[23:16] 对应addr[1:0]=2; bus[31:24] 对应addr[1:0]=3,之后无论是大端还是小端,都必须根据地址在对应的总线bit填入/去除对应的byte数据
- 只有一种传输宽度的组件必须将其字节通道连接到数据总线中合适的字节通道上
- 支持多种传输宽度的组件可以具有更复杂的接口来转换非“字节不变性”的接口
- 大部分小端模式的组件可以直接连接到一个“字节不变性”接口上
- 仅支持大端传输的组件则要有一个用于“字节不变性”操作的转换功能
AXI低功耗信号
AXI低功耗接口
在工作中,我们习惯把AXI的低功耗接口信号称之为C-channel信号
- 对于具有上下电顺序的外设,时钟控制器发出请求后才会进入低功耗状态,协议提供了请求/确认握手信号
- 对于没有上下电的外设,CACTIVE是所需唯一的时钟控制信号

AXI低功耗时钟控制
(1)时钟控制器发起退出低功耗状态
- 进入时,时钟控制器拉低CSYSREQ,外设执行下电序列,顺序拉低CACTIVE和CSYSACK
- 退出时,时钟控制器拉高CSYSREQ,外设执行上电序列,顺序拉高CACTIVE和CSYSACK

时钟控制器拉低CSYSREQ信号请求进入低功耗状态,但是外设通过保持CACTIVE信号为高来拒绝请求:

(2)外设发起退出低功耗状态
- 进入时:外设拉低CACTIVE,然后时钟控制器拉低CSYSREQ,最后外设拉低CSYSACK
- 退出时:外设拉高CACTIVE,然后时钟控制器拉高CSYSREQ,最后外设拉高CSYSACK

外设拉低CACTIVE信号请求进入低功耗状态,但是时钟控制器通过保持CSYSREQ信号为高来拒绝请求:

低功耗域的组合外设
系统时钟控制器可以将多个不同的外设组合到同一个低功耗时钟域中。然后如果遵循以下规则,它可以像处理单个外设一样处理时钟域:
- 时钟域CACTIVE信号是时钟域内所有外设CACTIVE信号的或,这意味着所有外设都指示可以禁用时钟时,系统时钟控制器才能禁用时钟
- 系统时钟控制器需要使用单个CSYSREQ信号,该信号被路由到所有时钟域的外设
- 产生时钟域CSYSACK信号的过程如下
- CSYSACK的下降沿发生在域中最后一个外设的CSYSACK信号的下降沿上
- CSYSACK的上升沿发生在域中最后一个外设的CSYSACK信号的上升沿上
如果路径上有多个不同时钟域,时钟的唤醒跟随数据顺序,得一层层向下传递,那么会造成时钟开启的时间大于数据到来的时间,从而造成数据的delay,这时可以用上游的时钟唤醒信号,直接唤醒下游时钟。
AXI5的低功耗信号
AXI5中取消了上面说的C-channel信号,但是存在AWAKEUP唤醒信号,感觉比较像是可以用作低功耗设计的信号。AWAKEUP信号用于指示有与接口相关的活动,由Master发出,在事务开始时拉高,表示有一个事务要处理。其属性用于指示组件是否支持唤醒信号:
- True:支持唤醒信号。
- False:不支持唤醒信号。
如果未声明Wakeup_Signals,则认为它为False。信号可以路由到时钟控制器或类似的使电源和时钟连接的组件。唤醒信号必须是无故障的,并且直接从寄存器生成。它们与与之相关的接口是同步的,但适用于跨时钟域到控制器。必须拉高唤醒信号以保证可以接受事务,但是一旦事务正在进行中,则唤醒信号的断言或撤销是实现定义的。协议建议(但不要求)在不需要进一步事务时解除唤醒信号。
AXI4新增信号
前面信号中,AXI3和AXI4的不同之处已经列出,AXI4新增了一些扩展信号,并且延续到了AXI5
AxQOS
QoS接口信号扩展了AXI4信号集,以支持两个4位QoS标识符:
- AWQOS:一个4位的QoS标识符,在每个写事务的写地址通道上发送。
- ARQOS:一个4位的QoS标识符,在每个读事务的读地址通道上发送。
协议没有指定QoS标识符的确切用法,建议使用AxQOS作为关联的写或读事务的优先级指示器。值越高表示事务的优先级越高。缺省值为0b0000,表示该接口不参与任何QoS方案。
注意: 也可以使用QoS标识符的其他解释。
AxREGION
可选的,可以扩展AXI接口信号集以支持两个4位区域标识符:
- ARREGION:区域标识符,在每个读事务的读地址通道上发送
- AWREGION:区域标识符,在每次写事务的写地址通道上发送
4位区域标识符可用于唯一标识多达16个不同的区域。区域标识符可以提供高阶地址位的解码区域标识符必须在任何4Kbyte地址空间内保持不变。区域标识符的使用,意味着Slave上的单物理接口可以提供多个逻辑接口,每个逻辑接口在系统地址映射中具有不同的位置,意味Slave不必支持不同逻辑接口之间的地址解码
协议期望互连在为具有多个逻辑接口的单个Slave执行地址解码功能时产生AxREGION信号。如果Slave在系统地址映射中只有一个物理接口,则互连必须使用默认的AxREGION值
区域标识符有许多使用模型,包括但不限于以下:
- 外设可以在地址映射中的不同位置拥有其Master数据路径和控制寄存器,并且可以通过单个接口访问,而不需要Slave执行地址解码。
- 一个slave可以在不同的内存区域表现出不同的行为。例如Slave可能在一个区域提供读写访问,但在另一个区域提供只读访问。
Slave必须确保正确的协议信号和正确的事务排序得到维护。Slave必须确保它以正确的顺序向具有相同AXI ID的不同区域的两个事务提供响应。Slave还必须确保为AxREGION的任何值发送正确的协议信号。如果Slave实现的区域少于16个,那么Slave必须确保在任何试图访问不支持的区域时都有正确的协议信号。如何实现是由实现定义的,例如Slave可以通过以下方式确保:
- 为访问不受支持区域的任何事务提供错误响应。
- 跨所有不支持的区域对支持的区域进行混叠,以确保为所有访问提供符合协议的响应。
AxREGION信号仅提供现有地址空间的地址解码,可由slave使用,以消除对地址解码功能的需要。信号不创建新的独立地址空间。AxREGION必须只出现在地址解码功能下游的接口上。
AXI-Lite
AXI4-Lite
AXI4-Lite操作的关键功能是:
- 突发长度固定为1。(不支持突发)
- AXI4-Lite的数据位宽固定为32位或64位。
- 不支持Non-modifiable和Non-bufferable。
- 不支持Exclusive传输。
简化了这么多,AXI4-Lite的信号列表就只剩下这些了:

AXI5-Lite
AXI5-Lite协议稍稍做了升级,AXI5-Lite的数据位宽不固定,且支持响应的重排序。它们的对比如下所示:

AXI-Stream
用于高速数据流传输,非存储映射接口
在这里我们首先解释一下**存储映射 (Memory Map)**这 一概念。如果一个协议是存储映射的,那么主机所发出的会话(无论读或写)就会标明一个地址。这个地址对应系统存储空间中的一个地址,标明是针对该存储空间的读写操作。这个非常好理解,前面我们讲解AXI协议的时候,都是针对某个地址进行读写,那它就是存储映射的。
AXI-Stream典型应用场景
AXI-Stream接口,其数据传输时不需要地址,在主从设备之间直接连续读写数据,主要用于如高速视频、高速 AD 、PCIe、DMA接口等需要高速数据传输的场合。我们通常把源端即数据发送的一方称为上游,另一方称为下游,下面是两个典型的应用实例

看一下一个结合了各种AXI协议的SoC系统,这是一个典型的图像采集处理显示的系统,很多FPGA开发板的教学文档,实际上都会有该项目。可以看到通过摄像头采集信息,其经过原始的处理以后会通过流数据(这里实际上可以有很多种流数据形式,我们以AXI-stream为例)的形式传输到Filter模块,这个Filter模块可能会进行图像的滤波,Crop等等操作。然后Transform模块可能又会进行插值操作,格式转换操作等等。但其输出往往还是AXI-stream,不能直接写到DDR,怎么办?

这个时候我们就需要一个DataMover模块,将Stream流数据转换为标准的AXI写请求,将数据搬运到指定的地址空间。再通过另外一个AXI DataMover将该地址空间的数据搬运出来,进行后处理,最后输出HDMI显示
AXI-Stream接口信号
AXI-Stream的接口信号,如下图所示,AXI-Stream是点对点的接口,包括Master一方和Slave一方。同样的,其也采用握手协议,这里握手成功则代表数据成功传输,相应的可以更新下一组数据。

在握手的过程中,可能会发生数据反压,下面是有关数据反压的介绍
数据反压的介绍:后级用READY=0让前级等待,前级必须保持VALID和数据不变
不允许反压的场景:实时连续流(DSP、视频、ADC),因为物理上无法停顿,反压必丢数。解决方案是前级深FIFO(短时容忍)或设计保证永不反压+异常中断(你描述的情况)
AXI-Stream数据流
首先解释几个名词:
- Transfer:一次握手成功就是一次Transfer,代表一笔最小粒度的数据传输发生;
- Packet:一组信息传输成功,所谓的Packet可能包含一个Transfer也有可能是多个Transfers。这个概念类似于之前的一次Burst传输即Transaction;
- Frame:AXI-Stream中最高层次的一组数据,代表了多个Packet。用的很少,一般只在视频图像传输中使用,代表一帧图像,其他时候可以不管;
对信号进一步解释:
TKEEP
TKEEP:也是说明总线上的数据是不是有效的。每一个bit和DATA的每一个字节相对应,大家可能会疑惑了,这和TSTRB有什么区别呢?我们先来看几个名词解释:
- Data byte:代表这个字节的数据是需要传输且有效的;
- Position byte:代表这个字节的数据是需要传输的,实际上是无效的,只不过需要用来占位置,大家就理解成补0那种操作即可;
- Null byte:完全没用,可以丢弃;
然后我们再看一下,实际上TKEEP和TSTRB是要组合在一起使用的,其共有三种含义:

| TKEEP | TSTRB | DataType | Description |
|---|---|---|---|
| HIGH | HIGH | Databyte | 相关字节包含必须在源和目的之间传输的有效信息。 |
| HIGH | LOW | Position byte | 相关字节指示数据流中数据字节的相对位置,但不包含任何相关数据值。 |
| LOW | LOW | Null byte | 相关字节不包含信息,可以从数据流中移除。 |
| LOW | HIGH | Reserved | 禁止使用。 |
我们再看两个图加深下理解:
第一个是NULL Byte:可以看到Null Byte啥作用都没有,直接没用上,传完第0Byte,传了个Null Byte,再传了个第1Byte,下游是知道应该怎么处理这个DATA信息的

第二个是Position Byte:可以看到Position实际上是占据了这个位置的,相当于作为第二Byte来使用,虽然里面的数据是无效的。这种情况一般是传输队形要求固定,但每一组数据的某个Byte可以不看,就用以下的Position Byte

以下说明一下Position byte具体应用场景:
- Data Mark:比如在视频处理当中,可以使用Position Byte当做一帧的开头;
- Error Detection:每过多少比特插入一个Position Byte用于检测错误。如果不符合规律说明丢数之类的问题;
- Data Group:就比如上图中,一次传4个Byte的数据,但是有一组或者两组数据是无效的,这样就可以用Position Byte。让数据的Group是规律的,同时Slave也可以感知到某个数据是无效的。
我们看下面这样的一个例子,该例子对应于上面的Data Mark。我们有这样的一个图片,总共16个Pixel,一共是4行4列。我们希望发过去,Slave那边知道这是一次传输的开始,因为它那边可能也不知道这是无用数据还是真正要用的数据。
这种情况下我们就可以在起始加入一个Position Byte。这样Slave一看,就知道一帧图开始了。然后正常的收数据,当第五次Transfer的时候(W4),后面3个Byte都是可以丢弃的,即设置为Null Byte。就这样五次Transfer作为一次循环。相比原始图像而言,可能浪费了一个周期,但是某些应用场景下Slave就是需要感知一帧图像的开始,使用这种方式就非常的合适。

其他信号
TDATA:这个没什么好解释的,就是一次transfer传输的数据,一般强制要求为8的整数倍,以和其他信号相对应
TSTRB:所谓的Strobe就是闸门,其每一个bit和DATA的每一个字节相对应,用来表示DATA的数据是否有效
TLAST:由于AXI-Stream在传输之前,也不知道你要传输多少笔数据,因此需要TLAST这个信号作为标志,它用来表示一组数据即Packet的最后一笔Transfer,当TLAST拉高,则代表整个的传输结束了
TID信号:这个信号一般是用来当分组使用。本人之前使用该信号,是因为接收的数据是三路数据,类似于三相电路的机制,所以要分为0、1、2三组,通过TID进行区分,以方便后级的处理。大家也可以根据自己的应用场景,灵活的使用该信号。
TDEST为数据流提供路由信息,比如下面的例子,通过TDEST信号,就可以知道是发到哪个Slave。实际上该信号用的很少很少,因为AXI-stream基本上是点对点的,很少有Interconnect的说法

TUSER其实跟TID差不多,实际上都是附带一些额外想传输的信息而已,该信号更加的灵活,用户可以附带自己想要传输的额外信息
