Verilog:位片矢量两次

时间:2017-12-14 12:58:12

标签: verilog system-verilog

假设我们有一个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规范中找到明确的规则,禁止这样做。

2 个答案:

答案 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];