转换Verilog中的线值以进行进一步处理

时间:2011-09-22 07:55:57

标签: verilog hdl

我是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.

如何解决此问题?

2 个答案:

答案 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引入了“索引部分选择”。索引部分选择指定基本索引和宽度。宽度必须是常量,但基本索引不需要是常量。索引部分选择的语法为destvec[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。