我现在正在学习Verilog,使用Yosys将代码合成到iCE40开发板。我坚持使用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"用给定的参数?
答案 0 :(得分:2)
我没有安装yosys
,但是当我在另一台模拟器上运行您的代码时,我收到此错误:
系统函数调用$ clog2必须有一个整数参数。
这符合IEEE Std 1800-2012,第20.8.1节整数数学函数,其中陈述了$clog2
:
参数可以是整数或任意大小的矢量值。
$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));