Verilog:“...不是常数”
Verilog: "... is not a constant"
我创建了三根这样的电线:
wire [11:0] magnitude;
wire [3:0] bitsEnd;
wire [3:0] leadingBits;
所有这些都是assign
使用组合逻辑编写的一些表达式。以下代码工作正常:
assign leadingBits[3] = magnitude[bitsEnd + 3];
assign leadingBits[2] = magnitude[bitsEnd + 2];
assign leadingBits[1] = magnitude[bitsEnd + 1];
assign leadingBits[0] = magnitude[bitsEnd + 0];
然而,下面的(看似等价的)代码给出了错误bitsEnd is not a constant
:
assign leadingBits[3:0] = magnitude[bitsEnd + 3:bitsEnd];
我可以不使用 shorthand 做这个作业吗?为什么在第二种情况下会出现此错误,而在第一种情况下不会出现?
在 Verilog 中,您不能使用变量(即 bitsEnd
)作为范围的结束。您可以使用 +:
/-:
operator 来解决您的问题:
assign leadingBits = magnitude[bitsEnd+3 -: 4];
在第一种情况下,您只计算单个索引(不是范围)。这就是编译器没有抱怨的原因。
我创建了三根这样的电线:
wire [11:0] magnitude;
wire [3:0] bitsEnd;
wire [3:0] leadingBits;
所有这些都是assign
使用组合逻辑编写的一些表达式。以下代码工作正常:
assign leadingBits[3] = magnitude[bitsEnd + 3];
assign leadingBits[2] = magnitude[bitsEnd + 2];
assign leadingBits[1] = magnitude[bitsEnd + 1];
assign leadingBits[0] = magnitude[bitsEnd + 0];
然而,下面的(看似等价的)代码给出了错误bitsEnd is not a constant
:
assign leadingBits[3:0] = magnitude[bitsEnd + 3:bitsEnd];
我可以不使用 shorthand 做这个作业吗?为什么在第二种情况下会出现此错误,而在第一种情况下不会出现?
在 Verilog 中,您不能使用变量(即 bitsEnd
)作为范围的结束。您可以使用 +:
/-:
operator 来解决您的问题:
assign leadingBits = magnitude[bitsEnd+3 -: 4];
在第一种情况下,您只计算单个索引(不是范围)。这就是编译器没有抱怨的原因。