假设我们有一个128位的注册表:
reg [127:0] line;
我们首先从中选择一个32位字,然后从这个字中选择字节,全部使用切片:
word = line[(127-32*byte_addr[3:2])-:32];
byte = word[7:0];
工作正常。但是,如果我不想将两个运算符组合在一起,那么它似乎是不允许的。
mybyte = line[(127-32*byte_addr[3:2])-:32][7:0]; //all the hell breaks loose
不幸的是,我无法在SV 3.1a规范中找到明确的规则,禁止这样做。
答案 0 :(得分:1)
1800-2012 LRM说(7.4.6)
表达式可以选择打包数组的一部分,也可以选择任何整数类型, 假设编号为0。
部分选择是指 选择一个或多个单维的连续位 打包阵列。
没有提及部分选择的部分选择,这是你想要做的。
你可以让line
多维吗?像
reg [3:0][7:0] line [3:0];
这会使索引变得微不足道。
答案 1 :(得分:1)
请删除您的SystemVerilog 3.1a规范并获取free copy of the 1800-2012 LRM
第11.4.12节中描述的连接运算符可以满足您的需求。
mybyte = {line[(127-32*byte_addr[3:2])-:32]}[7:0];