我目前正在通过使用 Yosys 将代码合成到 iCE40 开发板来学习 Verilog。我一直坚持在 verilog 中使用参数。我有以下代码:
module tst;
parameter clkspd=12000000;
parameter baudrate=115200;
localparam bitperiod=$floor(clkspd/baudrate-0.5);
localparam bittmrwidth=$clog2(bitperiod);
//localparam bittmrwidth=$clog2(103);
initial begin
$display("Hello World!");
$display("width=%d",bittmrwidth);
end
endmodule
当我编译代码时:
yosys -p 'synth_ice40 -top tst -blif tst.blif' tst.v
我收到一个错误:
ERROR: Failed to evaluate system function `\$clog2' with non-constant value at tst.v:5.
但是,如果我使用注释掉的行,一切都会按预期进行。
如何使用给定的参数计算“bittmrwidth”?
最佳答案
我没有 yosys
已安装,但是当我在另一个模拟器上运行您的代码时,出现此错误:
System function call $clog2 must have an integral argument.
这与 IEEE Std 1800-2012,第 20.8.1 节整数数学函数一致,其中说明
$clog2
:The argument can be an integer or an arbitrary sized vector value.
$floor
函数返回 real
结果类型,根据第 20.8.2 节实数数学函数。只需投 $floor
输出到整数类型 $rtoi
.以下代码对我来说运行没有错误:module tst;
parameter clkspd=12000000;
parameter baudrate=115200;
localparam bitperiod = $rtoi($floor(clkspd/baudrate-0.5));
localparam bittmrwidth=$clog2(bitperiod);
initial begin
$display("Hello World!");
$display("width=%d",bittmrwidth);
end
endmodule
/*
Output:
Hello World!
width= 7
*/
我的原始代码使用了强制转换运算符,但显然
yosys
根据下面的评论,尚不支持它。这是我的原话:localparam bitperiod = int'($floor(clkspd/baudrate-0.5));
关于verilog - Yosys 中计算的 verilog 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41443578/