Yosys

时间:2017-01-03 12:28:25

标签: verilog 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"用给定的参数?

1 个答案:

答案 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));