Jump to content

    
Sign in to follow this  
dde29

System Verilog - Ширина регистра как результат вычисления функции

Recommended Posts

Здравствуйте, форумчане. У меня на редкость нелепая проблема:

Я, что называется, "на бильярдном столе яму с г*вном нашел и в ней утонул" (с) Жмурки.

Короче, решил я параметризировать один свой модуль, а именно, автоматическое вычисление ширины регистра от максимального значения счетчика.

Вот мой код:

module WidthParamProblem ( inclk, led );

/// PARAMETERS ///

parameter int counter = 8;

/// FUNCTIONS ///

function automatic int clogb2 (input int number);
    int calc;
    begin
      for (int i = 0; 2**i < number; i++) calc = i + 1;
        clogb2 = (number == 0) ? 0 : (number == 1) ? 1 : calc;
    end
endfunction

/// PORTS ///

input inclk;
output logic [clogb2(counter):0] led = '0;

/// BODY ///

always_ff @ (posedge inclk)
	led <= led + 1'b1;

endmodule

В итоге модуль не компилируется, как бы я не приседал ромбиком...

Квартус выдает следующую ошибку:

Error (10140): Verilog HDL error at WidthParamProblem.sv(20): range index is not constant

Понятно, что он имеет в виду, типа чтобы размер регистра должен быть константой - ну это понятно.

Но разве - у меня не константа?? Да, она вычисляется по функции, но это же значение вычисляется в самом начале компиляции и не меняется в дальнейшем...

Подскажите, как можно исправить данную проблему и починить, данный параметризируемый модуль...

Спасибо!

В догонку: в симуляторе все работает на ура...

Share this post


Link to post
Share on other sites

Приветствую!

 

Проблема в том что в вашей  функции  clogb2 возможна ситуация когда calc НЕ вычисляется -  например  если number <=0 .  Соответственно Qu на  такое считает что  функция   неконстантна. 
Для синтеза в константных функциях важно чтобы  все ветки вычислялись  или  переменные имели  дефолтные значения.

Ну  и если у вас SystemVerilog  то  почему бы  не использовать встроенный  $clog2();

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
1 hour ago, RobFPGA said:

Приветствую!

 

Проблема в том что в вашей  функции  clogb2 возможна ситуация когда calc НЕ вычисляется -  например  если number <=0 .  Соответственно Qu на  такое считает что  функция   неконстантна. 
Для синтеза в константных функциях важно чтобы  все ветки вычислялись  или  переменные имели  дефолтные значения.

Ну  и если у вас SystemVerilog  то  почему бы  не использовать встроенный  $clog2();

 

Удачи! Rob.

Спасибо! Попробую модифицировать функцию с проверкой на <0... А про встроенный $clog2() не знал... я на СВ недавно пересел...

Error (10174): Verilog HDL Unsupported Feature error at WidthParamProblem.sv(21): system function "$clog2" is not supported for synthesis

Может потому что у меня Ква 9.0 ? ))))) Я сторонник того - если работает - нафиг что-то менять и куда-то перелазить)

Share this post


Link to post
Share on other sites

 

 

В общем, ситуация следующая:

В древнем, как гамно мамонта, Ква9.0 не работает ни системная функция $clog2() ни функция.

Скомпилировал в 15.1 - удачен и первый и второй вариант!

Спасибо за советы! :clapping:

Share this post


Link to post
Share on other sites
2 hours ago, dde29 said:

В древнем, как гамно мамонта, Ква9.0 не работает ни системная функция $clog2() ни функция.

в 9.0 работает функция из стандарта 2001 года. там в самом тексте есть этот логарифм) а в ква 9.0 только появилась поддержка System Verilog 3.1a, когда он не был еще иееешным)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this