1

我是 Verilog 的新手。

我已经编写了将线值转换为整数的代码:

wire [31:0] w1;
integer k;
always @ (w1) k = w1;

来源:在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.

我该如何解决这个问题?

4

2 回答 2

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 个 0 和 64 个 1 组成的向量,将该向量移动一个可变的量,然后使用该向量的一部分作为限定掩码来控制哪些位从 传输srcdest

一个对您的示例没有帮助但值得注意的相关概念:Verilog-2001 引入了“索引部分选择”。索引部分选择指定基本索引和宽度。宽度需要是恒定的,但基本索引不需要是恒定的。索引部分选择的语法是vec[base+:width]or vec[base-:width]

于 2011-10-30T23:52:32.817 回答
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。

于 2012-11-27T00:47:48.437 回答