AXIS中TDATA的辅助信号(TUSER,TSTRB,TKEEP)

AXIS总线是一个流式总线,总线上没有addr的概念,数据随着时间先后,形成流式存储布局,
TDATA宽度以BYTE为基本单位,即8的倍数。每个字节宽度,视为一个byte lane。
对于N个byte lane的宽度的TDATA,多字节宽度的数据,在内部被流式化的时候,是按照逐个byte lane来串化存储的。可以理解为一个8bits的FIFO。
如果每个BYTE伴随有一个n位的TUSER时,可以理解为另有一个nbits的FIFO,在读取时,每取出一个TDATA 的8bits,就会同时取出一个TUSER的 nbits。
如果总线宽度有N个byte lane,但是TUSER只给出一个首个byte lane的nbits,那么内部处理时,会把其他的byte lane的TUSER的nbits,默认为拉低为常数0。
即使有N个byte lane宽度,AXIS始终只有一个bit的tlast。可以理解为另有一个1bit的FIFO,在逐byte lane串化存储时,同时存储tlast的状态。如果是最后一个byte lane,且此时tlast为高,则将1写入这个tlast fifo。
即,当tlast出现时,内部串化机会给本次传输的最后一个有效的byte lane, 打上last byte的标志。

如果需要对AXIS进行数据宽度转换,那么就需要TKEEP的帮助了。
例如,一个80bits的AXIS,upsize到640bits,内部串化机首先将80bits串化成byte,然后内部并化,即再逐个byte的取出,并逐个byte lane的放置到640bits的接口上,也就是说,前端接口需要8次传输,才能完成一次拼接展宽。
如果当tlast出现时,只进行了7次传输,但是此时的640bits接口,也必须打出tlast,那么可想而知,640bits的接口上,最高位段,会有80bits的dummy data。
后级的输入接口,只知道这一次的640bits是最后一个传输交易,并不知道哪些是有效数据,哪些是dummy data。
此时,TKEEP就可以提供辅助信息。
内部串化机进行串化时,发现某个byte lane对应的TKEEP为0,那么就丢弃这个byte,不存入FIFO。
另外,内部串化机会给最后一个TKEEP为1的有效byte lane,打上last byte的标志。

如果一个640bits的AXIS,downsize到128bits,内部串化机首先将640bits串化成byte,然后内部并化,即再逐个byte的取出,并逐个byte lane的放置到128bits的接口上,也就是说,后端接口需要5次传输,才能完成一次分段收窄。
由于TKEEP的辅助,有效字节被存储,无效字节被丢弃,在后端接口输出时,能够正确找到last byte的位置,为128bits接口正确输出tlast提供信息。

同样的,如果128bits接口,也可能在输出tlast时,TDATA上包含了dummy data,它在向后提供数据时,如果提供TKEEP辅助信号,则后级接口可以有效去除dummy data。
如果不提供TKEEP信号,则后级接口无法识别成dummy data,这种情形,通常是在存入DDR时使用,因为MM接口不在乎dummy data,自然也不使用TKEEP。

既然有了TKEEP,为什么还有TSTRB?TSTRB 这也是一个多比特信号。。也是说明总线上的数据是不是有效的。
TSTRB是配合TKEEP使用的,更进一步提供辅助信息,
在TKEEP为1的前提下,TSTRB为1,表示对应的数据有效,是个好数据。TSTRB为0时,表示这个是个占位数据,position data。在有的应用中,position data可能被作为sideband data来使用。

如果只是做位宽转换,那么只使用TKEEP就够了,不需要TSTRB。

猜你喜欢

转载自blog.csdn.net/weixin_42418557/article/details/120769881