是否有可能在verilog中增加/初始化'generate'中的变量?

时间:2011-04-13 08:45:08

标签: parameters verilog increment

我对generate有疑问,我的代码是:

parameter m=1;

generate 
 for(i=0; i<m; i=i+1) :loopstart
 begin
  statements;
 end
endgenerate

在此循环内, m应为2 ^ 0,2 ^ 1,2 ^ 2,依此类推。以来 不支持取幂,我想初始化m然后 在每次迭代时将它乘以2。

我有几个问题:

是否可以以某种方式在生成中使用m << 1(因为它与...相同) 乘以2)?如果我这样做,就会导致错误。

我提到了Samir Palnitkar的书,该书说始终声明在一个生成中起作用,所以我尝试了:

always @(m)
 m <= m*2; // (or m << 1)

这不起作用。我意识到无法完成,因为m是参数而不是变量。

如果我认为是正确的,则无法使用genvar,因为genvar无法初始化。

有替代方案吗?

2 个答案:

答案 0 :(得分:1)

这个问题似乎已经创建,因为不支持指数。他们是:

2**0 => 1
2**1 => 2
2**2 => 4

NB:

always @(m)
 m <= m*2; // (or m << 1)

由于某些原因,这是错误的

  1. 不要在组合块中使用<=
  2. 在上面的表达式中,m定义了自己并重新触发循环。
  3. 我还会避免命名灵敏度列表,并使用always @*来避免不完整敏感列表中的硬件模拟不匹配。

    参数和localparams用于定义常量,如果它们不是常量,则使用其他类似逻辑或整数类型的东西。

    logic [31:0] m = 0;
    logic [31:0] power_two_m;
    always @* begin
      power_two_m = 2**m;
      power_two_m = 1 << m;
    end
    

答案 1 :(得分:0)

相反i++使用i=i+1

而且......忘了C.