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)