2017-01-03 101 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:謝謝你的出色答案。 –