编程自学网编程自学网编程自学网

Yosys中的计算verilog参数

问题描述:

我正在通过使用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 ,但是当我在另一个模拟器上运行你的代码时,我收到此错误:

系统函数调用$ 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操作符,但显然yosys还不支持它,根据下面的评论。 这是我原来的路线:

localparam bitperiod = int'($floor(clkspd/baudrate-0.5));


未经允许不得转载:编程自学网 » Yosys中的计算verilog参数