1)传输时如果需要支持地址非对齐,s2mm侧:
地址非对齐时的命令设定
assign s_axis_s2mm_cmd_tdata[22:0] = length;
assign s_axis_s2mm_cmd_tdata[23] = 1; //type: 1-enable INCR 0- enable FIXED;
assign s_axis_s2mm_cmd_tdata[29:24] = 6'b0;
assign s_axis_s2mm_cmd_tdata[31:30] = 2'b00;
assign s_axis_s2mm_cmd_tdata[63:32] = addr;
assign s_axis_s2mm_cmd_tdata[67:64] = tag;
assign s_axis_s2mm_cmd_tdata[71:68] = 0;
简单总结:s2mm方向,流接口方向是地址无关的,数据总是从低位开始有效,字节总数决定传几拍。Tkeep在tlast位置指示非C-width对齐时,低位开始哪些字节有效。
Axi总线上:axi总线都会从axi-s总线的0地址取数据,然后放到axi的低位地址指示的byte lane上面。
比如写地址0x5, 1个字节,会从axi-s的0-lane上取数据,放到axi的byte5上,axi-s的tkeep是0x1,axi上的tkeep是0x20.
Axi总线上的数据对齐是根据命令中的saddr产生的,tkeep根据地址和传输长度决定。
2)mm2s方向:
地址非对齐时的命令设定
assign s_axis_s2mm_cmd_tdata[22:0] = length;
assign s_axis_s2mm_cmd_tdata[23] = 1; //type: 1-enable INCR 0- enable FIXED;
assign s_axis_s2mm_cmd_tdata[29:24] = DSA(地址低位);
assign s_axis_s2mm_cmd_tdata[31:30] = 2'b11;
// EOF为了在axi-s产生tlast
assign s_axis_s2mm_cmd_tdata[63:32] = addr;
assign s_axis_s2mm_cmd_tdata[67:64] = tag;
assign s_axis_s2mm_cmd_tdata[71:68] = 0;
简要说明:
AXI侧:
非对齐时,AXI侧根据DSA和DRR设定,在特定byte-lane数据对齐到AXI-S侧的byte0-lane上。
DRR设定是为了告诉AXI进行非对齐处理,DSA提供了有效数据在byte lane上的位置。
EOF为了在axi-s产生tlast,将读的最后一个数据放在axi-s总线上。
总结:流接口方向上的传输是跟地址无关的,所以有效数据总是从byte0开始的。
Axi接口上是地址相关的,s2mm方向,saddr同步了地址信息,以及数据在总线上的对齐位置。Mm2s方向,DRR/DSA同步了地址信息,以及从axi总线上哪个位置开始取数据放到axi-s。 EOF用于产生tlast信号。