2017-01-03 103 views
3

我正在学习Verilog,使用Yosys将代码合成到iCE40开发板。我坚持在verilog中使用参数。我有以下代码:Yosys中的计算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

我没有安装yosys,但是当我在另一个模拟器上运行你的代码,我得到这个错误:

System function call $clog2 must have an integral argument.

这是符合IEEE标准1800年至二零一二年一致,部分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)); 
+3

这。但是,Yosys不支持很多SystemVerilog(IEEE Std 1800),仅支持Verilog(IEEE Std 1364)。 '$ rtoi'和'$ itor'的支持仍然缺失,但是我现在将它添加到提交[dfb461f](https://github.com/cliffordwolf/yosys/commit/dfb461fe5213ec649f384f1e1dbd6d58d5763910)。也许你想编辑你的答案使用'$ rtoi'而不是'int'',所以它适用于Yosys。 – CliffordVienna

+1

@CliffordVienna:谢谢你的建议。我更新了我的答案以使用'$ rtoi'。 – toolic

+1

@toolic:谢谢你的出色答案。 –