dde29 0 14 января, 2021 Опубликовано 14 января, 2021 · Жалоба Здравствуйте, форумчане. У меня на редкость нелепая проблема: Я, что называется, "на бильярдном столе яму с г*вном нашел и в ней утонул" (с) Жмурки. Короче, решил я параметризировать один свой модуль, а именно, автоматическое вычисление ширины регистра от максимального значения счетчика. Вот мой код: 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 Понятно, что он имеет в виду, типа чтобы размер регистра должен быть константой - ну это понятно. Но разве - у меня не константа?? Да, она вычисляется по функции, но это же значение вычисляется в самом начале компиляции и не меняется в дальнейшем... Подскажите, как можно исправить данную проблему и починить, данный параметризируемый модуль... Спасибо! В догонку: в симуляторе все работает на ура... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 14 января, 2021 Опубликовано 14 января, 2021 · Жалоба Приветствую! Проблема в том что в вашей функции clogb2 возможна ситуация когда calc НЕ вычисляется - например если number <=0 . Соответственно Qu на такое считает что функция неконстантна. Для синтеза в константных функциях важно чтобы все ветки вычислялись или переменные имели дефолтные значения. Ну и если у вас SystemVerilog то почему бы не использовать встроенный $clog2(); Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 14 января, 2021 Опубликовано 14 января, 2021 · Жалоба 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 ? ))))) Я сторонник того - если работает - нафиг что-то менять и куда-то перелазить) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dde29 0 18 января, 2021 Опубликовано 18 января, 2021 · Жалоба В общем, ситуация следующая: В древнем, как гамно мамонта, Ква9.0 не работает ни системная функция $clog2() ни функция. Скомпилировал в 15.1 - удачен и первый и второй вариант! Спасибо за советы! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 18 января, 2021 Опубликовано 18 января, 2021 · Жалоба 2 hours ago, dde29 said: В древнем, как гамно мамонта, Ква9.0 не работает ни системная функция $clog2() ни функция. в 9.0 работает функция из стандарта 2001 года. там в самом тексте есть этот логарифм) а в ква 9.0 только появилась поддержка System Verilog 3.1a, когда он не был еще иееешным) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться