代码之家  ›  专栏  ›  技术社区  ›  axk

在Quartus Prime中使用$ceil在SystemVerilog中定义参数

  •  0
  • axk  · 技术社区  · 8 年前

    想这么做吗

    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 回复  |  直到 8 年前
        1
  •  1
  •   Enze Chi    8 年前

    试试这个:

    参数integer PRECHARGE\u CLOCKS=((预充电时间+时钟周期\u NS-1)/时钟周期\u NS);

    它应该像$ceil那样。

        2
  •  0
  •   axk    8 年前

    最后我用下面的宏来解决这个问题,它创建了两个额外的参数来进行取整,但这是迄今为止我找到的最好的解决方案。 我已经用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中都是不可综合的

    推荐文章