AXI总线掩码(WSTRB)操作
掩码这个概念在以太网中也有运用,掩码通常用于子网和IP地址的管理。子网掩码是32位的二进制数,连续的1表示网络部分,连续的0表示主机部分。根据IP地址和子网掩码,可以计算网络地址和广播地址。如,对于IP地址192.168.1.1和子网掩码255.255.255.0,网络地址是192.168.1.0,广播地址是192.168.1.255。
可以见得,掩码是用于区分两类数据的一种操作符。
在AMBA中,AXI总线的掩码(WSTRB)主要用于选择性地屏蔽或允许某些数据位的写入。比如有一个寄存器多种功能,每一位都代表了不同数据量的使能开关,如果想只修改某一位而不修改其他变量,就可以使用掩码。通过掩码,可以指定哪些字节可以被写入,而哪些字节保持不变。在处理特定数据时非常有用。
在AXI4中,掩码通常是一个字节掩码,表示每个字节的写入权限。例如,对于32位数据总线,WSTRB信号有4位,每一位对应一个字节。如果某一位为1,则表示相应的字节是有效的;如果为0,则表示该字节无效。
4'b1111:允许写入所有字节
4'b1010:允许写入32-24位,15-8位
具体可以阅读文档
以下给出一个具体例子,假设我们有一个32位的数据寄存器,地址为0x1000,我们希望通过AXI总线将数据0xABCD1234写入该寄存器,但只想更新高16位,保持低16位不变。
axi_data = 32'hABCD1234;
axi_wstrb = 4'b1100; // 只允许高16位写入
写入前,地址0x1000的值将为0x11223344。
写入后,地址0x1000的值将变为0xABCD3344。
此外,PCIe也有类似的掩码操作,TLP封包使用3DW时,由于对齐需要,每次发送64bit数据,此时需要屏蔽第三个数据,也是使用掩码,将TKEEP置零来达成这个操作(TKEEP和WSTRB都是DATA的辅助信号位)
既然有了TKEEP,为什么还有TSTRB?TSTRB 这也是一个多比特信号。。也是说明总线上的数据是不是有效的。TSTRB是配合TKEEP使用的,更进一步提供辅助信息,在TKEEP为1的前提下,TSTRB为1,表示对应的数据有效,是个好数据。TSTRB为0时,表示这个是个占位数据,position data。在有的应用中,position data可能被作为sideband data来使用。