Yosys 中计算的 verilog 参数
Computed verilog parameter in Yosys
我目前正在学习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"?
我没有安装 yosys
,但是当我在另一个模拟器上 运行 你的代码时,我得到这个错误:
System function call $clog2 must have an integral argument.
这与 IEEE 标准 1800-2012 第 20.8.1 节 整数数学函数 一致,其中规定 $clog2
:
The argument can be an integer or an arbitrary sized vector value.
$floor
函数 returns 一个 real
结果类型,根据第 20.8.2 实数函数。只需将 $floor
输出转换为具有 $rtoi
的整数类型。以下代码 运行s 对我来说没有错误:
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 将代码合成到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"?
我没有安装 yosys
,但是当我在另一个模拟器上 运行 你的代码时,我得到这个错误:
System function call $clog2 must have an integral argument.
这与 IEEE 标准 1800-2012 第 20.8.1 节 整数数学函数 一致,其中规定 $clog2
:
The argument can be an integer or an arbitrary sized vector value.
$floor
函数 returns 一个 real
结果类型,根据第 20.8.2 实数函数。只需将 $floor
输出转换为具有 $rtoi
的整数类型。以下代码 运行s 对我来说没有错误:
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));