本文来自自学过程中所记的笔记,可能有不少错漏与胡言乱语,仅供参考,建议主要以ARM官方文件进行参考。原参考文档官网可下载,为了方便各位,我也上传了,需要的自取;
链接:https://pan.baidu.com/s/1voHyFmkpGqABcKH8OSF_Ng
提取码:izix
信号类型:
- 信号的宽度有以下几类:
n:数据总线的宽度(按byte);
i:8-bits;
d:4-bits;
u:线宽的整数倍(按byte);
握手:
TVALID与TREADY握手决定了数据传输的时间。双向传输的机制允许主机或从机都可以控制传输的速率与信息。要建立传输,TVALID与TREADY都必须被声明,双方都可以先进行声明,也可以在同一个ACLK周期内同时声明;
如果主机要进行数据传输,其不可以等待TREADY出现后再声明TVALID,当声明了TVALID后这个声明必须在TREADY的声明出现之前保持;
从机可以在等待TVALID出现之后再声明TREADY; 同时,从机也可以先声明TREADY并等待TVALID;
以下是几个例子,箭头指示的时间节点发生信息传递:
信息传输:
-
数据在数据流中的位置:
在一波数据流中,低阶总线传递的数据应该较早出发;
当所有数据被完全打包好(没有空包),给定Byte在数据流中的位置如下:
- n表示为第n byte;
- t表示为第t次传输;
- 数据总线宽度为w bytes;
- INT(x)代表对x向下取整;
- b代表byte的位置;
t = L N T ( n / w ) t = LNT(n/w) t=LNT(n/w);
b = n − t ∗ w b = n-t*w b=n−t∗w;
-
数据型(Byte types)详解:
Data byte: Data byte必须从信源被传输至目标地;data byte的数量,相关的TDATA数据值,数据流中数据位的相对位置都应在传输过程中保持不变;
Position byte: Position byte必须从信源被传输至目标地;Position byte的数量与数据流中数据位的相对位置都应在传输过程中保持不变;
Null byte: 不包含任何数据,也没有任何限制;
在连接传输过程中,链接不被允许对Data Byte与Position Byte的相对位置与数量进行调整。但链接传输过程中可以对空字节进行增减,以匹配更宽或更窄的总线。需要注意的是,主从机都无需支持空字节,所以在到达需要处理的位置之前,所有空字节都需要被删除;
-
数据合并、打包与宽度转换
在设计时,数据总线被希望可以适应不同宽度的接口。这样不同接口设计的总线可以被连接,多个设备也可以接入统一接口;
对多数应用来说,接口应该是2^N个字节的宽度,但对于协议来说,只需为整数Byte宽度即可;
所有增大与缩小操作,都需要保留所有声明过TKEEP数据的byte;如果增大或减小操作后没有足够的宽度进行输出,可以增加额外的无TKEEP声明的位数;
合并考虑: 合并指两个来自不同传输的两组数据合并为一个传输;在一个传输中存在可以被移除的空指针时,合并就有条件发生; 合并的规则如下:
a: 只有具有相匹配的TID与TDEST标识符的传输可以被合并;
b: 如果现在的传输被标注为TLAST,则其不能与后一次传输合并。也因此如果一个传输被标注为TLAST,便意味着其后没有可以合并的传输,也意味着其不应被延迟传输;
c: 必须保持位置与数据byte的正确位置;
d: 必须保持TLAST, TSTRB与TUSER的正确关系;
部分合并是被允许的;
打包考虑:打包是从数据流中删除空字节的过程,往往出现在放大、缩小与合并等操作中; 空字节无需被全部移除,所以打包前后都可能出现空字节;
缩小考虑: 缩小用于适配更窄的端口,这个过程通常伴随着单个输入/输出变为多个输入/输出;这个比例一般是2/1,但也不一定; 缩减的规则如下:
a: 输入输出顺序匹配;
b: TSTRB必须使用与data相似的方法缩小,以确保位置关系不会出现错误;
c: TLAST必须在缩减后也最后传输;
d: 输出传输的所有TID与TDEST都必须与输入的相匹配;
e: TUEST必须与相同字节匹配;
#只含空字节,没有TKEEP与TLAST字节的数据流可以被阻断;
放大考虑: 一般用于单转多。如果包含合并,放大过程将是一个很复杂的过程,因为上游难以随时确定下游数据是否来自一个paket;放大的规则如下:
a: 输入输出顺序匹配;
b: TSTRB必须使用与data相似的方法放大,以确保位置关系不会出现错误;
c: TLAST必须被保留;
d: 输出传输的所有TID与TDEST都必须与输入的相匹配;
e: TUEST必须与相同字节匹配;
字节限制符:
在AXI-4 Stream中有两个字节限制符:
TKEEP: 一个用于显示该字节是否一定要被传输至目的地的限制符;
TSTRB: 一个用于展示相关字节是位置字节还是数据字节的限制符;
每一个字节限制符都与一个byte相关:
TKEEP[x](TSTRB[x])与TDATA[(8x+7):8x]相关;
TKEEP限定: TKEEP被约束为0时表示其为一个空字节,反之则表示其一定要被传输至目的地。一个TKEEP全部为0的传输是合法的。除非TLAST位被约束为1,否则阻断一个全部TKEEP为0的传输是合法的; 主从机都无需支持空字节,所以在到达需要处理的位置之前,所有空字节都需要被删除;
TSTRB限定: 当TSTRB被约束为1时,代表这是一个有意义的数据字节,反之则为一个无意义的位置字节。位置字节被用于在传输中确定正确的相对位置,在信息流需要在目的地位置进行部分更新时常用。由于与位置相关的数据是无效的,所以TSTRB为LOW的时候,TADTA上的数据不被传输;
Packet边界:
Packet的解释上面已经给过了,在将信号打包时,需要考虑的信号有: TID, TDEST, TLAST; TLAST的用法如下:
a: 当其未被声明时,表示后面还会有后续传输跟进,因此为了完成增大、缩小或合并的延迟是可接受的;
b: 当其被声明时,目标地点可以将其作为packet的边界;
c: 当其被声明时,其可以作为共享链路上进行仲裁改变的有效依据;
在用于传输时,Packet的数量与TLAST的数量必须在主服务器与从服务器上保留;
虽然有结尾包,但packet的开始边界并未被定义一般判断一个包开始传输的依据有:
- 复位后第一次出现TID与TDSET;
- 一个包结束后收到的第一个有TID与TDSET的包;
所有有相同来源与目标地址的包都具有完全相同的TID与TDSET值;
两个不同的数据包不能合并,故如果早一步的传输收到了TLAST,哪怕具有完全相同的TID与TDSET值,也不能将两个字节合并传输; 若TID与TDSET不同,则不能将两个字节合并;
传输可以声明TLAST,但不包含任何数据\位置位,以用于:
- 当没有多余的数据需要传输时,结束包的传输;
- 遍历在缓存区中存储的数据;
- 完成一个在等待TLAST的操作;
不包含任何数据\位置位的TLAST声明,可以与只包含任何数据\位置位的字节结合;
信源与目的地信号:
信源与目的地信号有以下几种:
TID: 对流进行标记,用于区分通过一个数据接口的多个数据流;
TDEST: 为数据流提供大致的路由信息;
具有相同的TID与TDEST的数据来自同一个流,只有来自同一个数据流的数据才能被合并;
在非TLAST边界处,不同数据流的交叉是可以被允许的;
新的TID可以被生成,用于将一个数据流分成两个;
新的TDEST可以被生成,用于为数据流指明路由信息;
任何对TID和TDEST的操作都不能用于将两个数据流合成一个;
一个常见的模型是一个链接基于数据流的TID为其分配TDEST;
时钟和复位:
Clock: 每个组件都是用一个单独的时钟信号ACLK,所有输入的采样都必须在时钟的上升沿,所有输出的变化都必须在时钟的上升沿之后;
Reset: 异步复位,同步释放,active-LOW;
在复位阶段,TVALID必须被驱动为LOW,而其他信号可以随意变化;
在ARESETn解除后的第一个时钟上升沿,TVALID可以被驱动为HIGH;
用户信号:
用户使用边带接口传输一些byte,packet或给予fream的信息是一种常见的用法。用户信号有多种用法,如:
- 标记特殊数据项的位置与类型;
- 提供必须与数据伴随的辅助信息,如:奇偶校验、标志位;
- 识别数据包的段;
用户信号的传输以字节为单位;
按照建议,信号TUSER的位数应当与TDATA信号的Byte数成整数倍关系,每个字节所对应的用户信号必须从相邻的TUSER链路打包发送; 用户信号的定义如下:
- 假设每个数据Byte对应m位User Signal;
- 数据线的宽度为n Bytes;
- User Bits的总宽度就应为 m*n
- 如果User Bits的数量小于这个值,则会将其与前几位byte的总线相对应,后面的总线的User Bits会被默认为0(非协议内容,来源互联网);
如果对应的TKEEP位为0,则TUSER位的内容也无需传输。如果对应的空字节被删除,则其TUSER位也必须删除。当空字节被插入时,对应数量的TUSER也必须被插入,后插入的TUSER应被统一置为0;
TUSER也可以直接针对整个传输进行定义,而不是只能对单个字节。当整个传输都使用相同的某项配置时,只声明该配置一次明显好于在每次传输上都进行声明;
TUSER可以被用于对整个传输进行定义,但传输机制会基于传输机制划分TRUST信息。可信的基于传输的TUSER信息只有在满足以下条件时才成立:
- 连接的输入与输出接口必须相互匹配;
- 连接处的任何数据宽度转化都不涉及拆包;
当传输经过复杂的互联时,TUSER信号有时会经过支持不同TRUST宽度的互联部分。此时便需要填充(Padding)与修剪(Trimming)TUSER信息;
修剪和填充时,是在每一bit的前一位上进行增减。要进行填充时,填入的位数必须为0;示例如下:
按单BIT操作的PADDING
按单BIT操作的TRIMMING
按双BIT操作的PADDING
按双BIT操作的TRIMMING
设置TUSER的宽度:
对于有多个主从接口参与的互联,TUSER宽度的定义为:
MIN(MAX[主机每byte对应的TUSER的最小bit数],MAXP[从机每byte对应的TUSER的最小bit数]);
任何主从机发送的数据所对应的TUSER宽度都不能小于这个值;
TUSER的使用遵循以下守则:
- 主机的TUSER接口比链接接口窄,则必须增加置零的TUSER位来匹配链接;
- 主机的TUSER接口宽于最宽的链接接口,则必须修建接口以匹配链接;
- 在互联中任何比下游窄的TUSER接口,都必须补零进行连接;
- 在互联中任何比下游最宽的接口宽的TUSER接口,都必须进行修建以匹配链接;
- 在到达从机端时,如果从机接口比链接中的窄,则必须进行修剪;
- 在到达从机端时,如果从机接口比链接中的宽,则必须置零加宽;
如果在互联中附带了通信的主从机各自的信息,则对TUSER传输还可以进行进一步的优化;