我想在模块内声明一个名为 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。预先感谢。
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 中不可用。