4

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

4

1 回答 1

2

我没有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

*/

根据下面的评论,我的原始代码使用了强制转换运算符,但显然yosys还不支持它。这是我的原话:

localparam bitperiod = int'($floor(clkspd/baudrate-0.5));
于 2017-01-03T16:20:20.220 回答