如何在Verilog/SystemVerilog中声明全局可变大小和可变值的参数/局部参数一维数组?

问题描述 投票:0回答:1

我想在模块内声明一个名为 WEIGHT 的参数数组。然而,数组的大小及其值取决于称为 NFFT 的模块的参数。这是我想要做的事情的代码片段:

module mymod#(parameter NFFT = 16)(
...
);

genvar i;

generate
  if(NFFT == 16)
    localparam [$clog2(NFFT) : 0] WEIGHT [0 : $clog2(NFFT)-2] = '{4, 16, 4};
  else if(NFFT == 32)
    localparam [$clog2(NFFT) : 0] WEIGHT [0 : $clog2(NFFT)-2] = '{4, 8, 32, 4};
endgenerate 

generate
  for(i = 1; i <= $clog2(NFFT); i = i + 1) begin
    ...
    anothermod #(
      .STAGE_WEIGHT ( WEIGHTS[i] )
      ) U0_anothermod(
      ...
      )
  end
endgenerate

endmodule 

但是,此代码的问题在于,这样一来,WEIGHT 的范围就仅局限于第一个生成块。因此,当在第二个生成块中使用时,模拟器会给出错误,指出 WEIGHT 是未定义的变量。有解决这个问题的方法吗?我愿意接受任何建议,无论是 Verilog 还是 SystemVerilog。预先感谢。

verilog system-verilog
1个回答
0
投票

localparam 的范围仅限于声明它的块。在您的情况下, localparam WEIGHT 在生成块内声明,因此它的范围仅限于该块。当您尝试在第二个生成块中使用它时,模拟器会给出错误,因为 WEIGHT 未在该范围内定义。

您可以将WEIGHT声明为模块的参数,然后使用生成块根据NFFT的值为其赋值。

示例;

module mymod#(parameter NFFT = 16, parameter [$clog2(NFFT)-1:0] WEIGHT [0 : $clog2(NFFT)-2])(
...
);

genvar i;

generate
 if(NFFT == 16)
   WEIGHT = '{4, 16, 4};
 else if(NFFT == 32)
   WEIGHT = '{4, 8, 32, 4};
endgenerate 

generate
 for(i = 1; i <= $clog2(NFFT); i = i + 1) begin
   ...
   anothermod #(
     .STAGE_WEIGHT ( WEIGHT[i] )
     ) U0_anothermod(
     ...
     )
 end
endgenerate

endmodule 

上面的代码,WEIGHT被声明为模块的参数,因此它可以在模块内的所有块中访问。生成块根据NFFT的值将值分配给WEIGHT。然后,在第二个生成块中,您可以像常规数组一样使用WEIGHT

*这假设 WEIGHT 的大小对于 NFFT 的所有值都相同。如果 WEIGHT 的大小可能根据 NFFT 的不同而变化,您可能需要使用更复杂的方法,例如动态数组或关联数组,它们在 SystemVerilog 中可用,但在普通 Verilog 中不可用。

© www.soinside.com 2019 - 2024. All rights reserved.