【问题标题】:Using $ceil to define a parameter in SystemVerilog in Quartus Prime在 Quartus Prime 的 SystemVerilog 中使用 $ceil 定义参数
【发布时间】:2018-09-17 16:48:31
【问题描述】:

尝试这样做

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?

【问题讨论】:

  • 这看起来像是一个工具问题。你试过最新版本吗?这是一个完全合法的verilog,可以与其他编译器一起使用。
  • Quartus Prime 18.0。我不是 Verilog 专家,但据我了解,应该有一种方法可以在编译时进行参数计算,并且不应该受到可合成内容的限制。但事实就是这样。
  • 是的,参数应该在细化时解决。这个函数的一个问题是它返回real 值,这是不可合成的。您可以尝试使用$rtoi($ceil(...))

标签: system-verilog quartus ceil


【解决方案1】:

试试这个:

参数整数 PRECHARGE_CLOCKS = ((PRECHARGE_NS + CLOCK_PERIOD_NS -1) / CLOCK_PERIOD_NS);

它应该像 $ceil 所做的那样四舍五入。

【讨论】:

  • 对此有一个警告,它仅在 PRECHARGE_NS 和 CLOCK_PERIOD_NS 都是整数时才有效,如果它们不是整数,那么就我所见,Modelsim 会应用常规舍入规则,例如(66+10-1)/10 根据需要变为 8 而不是 7
【解决方案2】:

我最终使用以下宏解决了这个问题,这会创建 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 中工作

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多