2017-01-03 4 views
3

Я изучаю Verilog на данный момент, используя Yosys для синтеза кода на доске разработки iCE40. Я застрял в использовании параметров в verilog. У меня есть следующий код:Вычисленный параметр verilog в Yosys

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 Std 1800-2012, раздел 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' по-прежнему отсутствовала, но теперь я добавил ее в commit [dfb461f] (https://github.com/cliffordwolf/yosys/commit/dfb461fe5213ec649f384f1e1dbd6d58d5763910). Возможно, вы хотите отредактировать свой ответ, чтобы использовать '$ rtoi' вместо if 'int'', поэтому он применим к Yosys. – CliffordVienna

+1

@CliffordVienna: Спасибо за предложение. Я обновил свой ответ, чтобы использовать '$ rtoi'. – toolic

+1

@toolic: Спасибо за отличный ответ. –