verilog - Yosys 中计算的 verilog 参数

标签 verilog yosys

我目前正在通过使用 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/

相关文章:

yosys - 脚本参数

yosys - 修改 iCE40 比特流以加载新的 block RAM 内容

verilog - 使用 Yosys 进行网表验证

yosys - 定位新设备需要什么?

verilog - 参数警告 : truncated value with size 32 to match size of target

verilog - #`DEL 在 Verilog 中意味着什么?

if-statement - Verilog 中的 If else 条件优先级

vhdl - 从VHDL转换为Verilog,具体案例