我是Verilog的新手。
我编写了将线值转换为整数的代码:
wire [31:0] w1;
integer k;
always @ (w1) k = w1;
来源:converting a wire value to an integer in verilog
现在,对于下一部分,我得到一个错误!
wire [63:0] w2; // Suppose it contains some value
wire [63:0] w3;
assign w3[k-1:0] = w2[k-1:0]; // ERROR in this line
ERROR : k is not a constant.
如何解决此问题?
答案 0 :(得分:1)
Verilog要求部件选择(类似[msb:lsb]
的代码来选择矢量的一部分)是常量。要访问可变大小的位组需要更复杂的东西。这是一种方法:
wire [63:0] src;
wire [6:0] k;
wire [127:0] mask = { { 64 { 1'b0 } }, { 64 { 1'b1 } } } << k;
wire [63:0] dest;
assign dest = mask[127:64] & src;
这里的技术是构造一个64个零的向量,然后是64个向量,将该向量移动一个可变量,然后使用向量的一部分作为限定掩码来控制从{{1}传输哪些位到src
。
一个相关的概念在你的例子中没有帮助,但值得注意:Verilog-2001引入了“索引部分选择”。索引部分选择指定基本索引和宽度。宽度必须是常量,但基本索引不需要是常量。索引部分选择的语法为dest
或vec[base+:width]
。
答案 1 :(得分:0)
Verilog 2001中的部件选择操作符可能对您想要实现的目标有用。
基本上,verilog允许起始索引是可变的,但需要赋值的宽度是常量。 “+:”运算符表示从索引值向上计数,反之亦然“ - :”。
你可以这样做, 赋值w3 [k-1 - :8] = w2 [k-1 - :8]; //向下复制8位
在下面的文档中搜索“+:”。 http://www.sutherland-hdl.com/papers/2001-Wescon-tutorial_using_Verilog-2001_part1.pdf
谨慎,通常可变部分选择被认为是不好的verilog。