Использование $ ceil для определения параметра в SystemVerilog в Quartus Prime - PullRequest
0 голосов
/ 17 сентября 2018

Попытка сделать это

parameter integer PRECHARGE_CLOCKS = $ceil(PRECHARGE_NS / CLOCK_PERIOD_NS);

И затем использовать значение в сравнении

if(InitPrechargeCounter < PRECHARGE_CLOCKS - 1)

Но получение этой ошибки

Error (10174): Verilog HDL Unsupported Feature error at Ram.sv(23): system function "$ceil" is not supported for synthesis

Есть ли способвокруг этого, так что я получаю значение, вычисленное во время компиляции?
Использование какой-либо другой языковой конструкции вместо parameter?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Я закончил работать над этим с помощью следующего макроса, он создает 2 дополнительных параметра для округления, но это лучшее решение, которое я нашел до сих пор.Это не ограничивается целочисленными аргументами и работает с действительными числами.Я проверил это с Quartus и Modelsim

`define Ceil(ParamName, Expression) \
 parameter ParamName``_F = Expression;\
 parameter integer ParamName``_R = ParamName``_F;\
 parameter integer ParamName = (ParamName``_R == ParamName``_F || ParamName``_R > ParamName``_F) ? ParamName``_R : (ParamName``_R + 1);

И затем вместо

 parameter integer AUTOREFRESH_CLOCKS = $ceil(UTOREFRESH_NS/CLOCK_PERIOD_NS);

Вы бы вызвали макрос

`Ceil(AUTOREFRESH_CLOCKS, UTOREFRESH_NS/CLOCK_PERIOD_NS)

И это не обасинтезируется в Quartus и работает в Modelsim

0 голосов
/ 17 сентября 2018

Попробуйте это:

целочисленное значение параметра PRECHARGE_CLOCKS = ((PRECHARGE_NS + CLOCK_PERIOD_NS -1) / CLOCK_PERIOD_NS);

Он должен округляться как то, что делает $ ceil.

...