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

System verilog 使用$ceil在Quartus Prime中的SystemVerilog中定义参数,system-verilog,quartus,ceil,System Verilog,Quartus,Ceil,试着这么做 parameter integer PRECHARGE_CLOCKS = $ceil(PRECHARGE_NS / CLOCK_PERIOD_NS); 然后在比较中使用该值 if(InitPrechargeCounter < PRECHARGE_CLOCKS - 1) 有没有办法在编译时计算出这个值? 使用一些不同的语言结构而不是参数?尝试以下方法: 参数整数预充电时间=((预充电时间+时钟周期-1)/时钟周期) 它应该像$ceil那样进行取整。我用下面的宏解决了这个问题,

试着这么做

parameter integer PRECHARGE_CLOCKS = $ceil(PRECHARGE_NS / CLOCK_PERIOD_NS);
然后在比较中使用该值

if(InitPrechargeCounter < PRECHARGE_CLOCKS - 1)
有没有办法在编译时计算出这个值?
使用一些不同的语言结构而不是
参数

尝试以下方法:

参数整数预充电时间=((预充电时间+时钟周期-1)/时钟周期)


它应该像$ceil那样进行取整。

我用下面的宏解决了这个问题,这为取整创建了两个额外的参数,但这是迄今为止我找到的最好的解决方案。 这不仅限于整数参数,而且适用于实数。 我已经用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中也不起作用,这需要注意,只有当预充电和时钟周期都是整数时,它才起作用,如果它们不是整数,那么你转换为整数Modelsim就我所见应用了规则的四舍五入规则,例如(66+10-1)/10变成8,而不是7。这看起来像是工具问题。你试过最新版本吗?这是一个完全合法的verilog,可以与其他编译器一起使用。我不是Verilog专家,但据我所知,应该有一种在编译时进行参数计算的方法,而不应受到可合成内容的限制。但事实就是这样。是的,参数应该在细化时解决。此函数的一个问题是,它返回的是不可合成的
real
值。您可以尝试使用
$rtoi($ceil(…)
`Ceil(AUTOREFRESH_CLOCKS, UTOREFRESH_NS/CLOCK_PERIOD_NS)