【发布时间】:2020-03-31 09:46:59
【问题描述】:
我想在 Verilog 中创建一个数组,其大小基于多个参数。 我在 ModelSim 中尝试了这段代码,但出现以下错误:
参数值必须是常数。
localparam a = 250;
localparam b = 480;
localparam m = a * 100 / (b * 2);
localparam s = $bits(2 * m);
【问题讨论】:
标签: verilog
我想在 Verilog 中创建一个数组,其大小基于多个参数。 我在 ModelSim 中尝试了这段代码,但出现以下错误:
参数值必须是常数。
localparam a = 250;
localparam b = 480;
localparam m = a * 100 / (b * 2);
localparam s = $bits(2 * m);
【问题讨论】:
标签: verilog
要计算在 verilog 中保存值所需的位数,您可以使用 $clog2 函数。类似下面的内容将提供2 * m 的位数。唯一需要注意的是当 m == 0 时。您至少需要一位来保存0。
localparam s = m == 0 ? 1 : $clog2(2 * m);
【讨论】:
当您使用用于运行示例的命令提供complete runnable examples 时,它会有所帮助。
module top;
localparam a = 250;
localparam b = 480;
localparam m = a * 100 / (b * 2);
localparam s = $bits(2 * m);
endmodule
vlog file.v
$bits 未在 Verilog 中定义,因此编译器认为这是用户定义的运行时函数。如果将文件扩展名更改为 .sv,则不会出现该错误。
【讨论】: