目前,我正在通过使用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.但是,如果我使用注释行,一切都如预期的那样工作。
如何用给定的参数计算“位宽度”?
发布于 2017-01-03 16:20:20
我没有安装yosys,但是当我在另一个模拟器上运行您的代码时,会得到以下错误:
系统函数调用$clog2必须有一个完整的参数。
这与IEEE Std 1800-2012的第20.8.1节整数数学函数是一致的,该节为$clog2规定了
参数可以是整数,也可以是任意大小的向量值。
根据第20.8.2节的实数函数,$floor函数返回一个real结果类型。只需将$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
*/根据下面的评论,我的原始代码使用了一个cast操作符,但是显然yosys还不支持它。这是我最初的台词:
localparam bitperiod = int'($floor(clkspd/baudrate-0.5));https://stackoverflow.com/questions/41443578
复制相似问题