Перейти к содержанию
    

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

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

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

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

Вот мой код:

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

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

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

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

Спасибо!

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 ? ))))) Я сторонник того - если работает - нафиг что-то менять и куда-то перелазить)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

 

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, dde29 said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...