我需要在编译时为视频驱动程序做一些计算。实例化模块时,定义WIDTH和HEIGHT参数。然后我从这些中计算出一些值。
parameter X_BLOCK = $floor(640 / WIDTH);
parameter Y_BLOCK = $floor(480 / HEIGHT);
parameter BLOCK = X_BLOCK < Y_BLOCK ? X_BLOCK : Y_BLOCK;
parameter X_SPAN = WIDTH * BLOCK;
parameter Y_SPAN = HEIGHT * BLOCK;
parameter X_START = $floor((640 - X_SPAN) / 2);
parameter Y_START = $floor((480 - Y_SPAN) / 2);
parameter X_STOP = X_START + X_SPAN;
parameter Y_STOP = Y_START + Y_SPAN;
这些计算应该在编译时执行,但是我得到的错误是$ floor不可合成。我认为参数会在编译时计算出来,那为什么它会关心它是否能够合成$ floor?
答案 0 :(得分:1)
主要问题是$floor
是一个返回real
类型值的函数。由于您没有为参数显式提供数据类型,因此它们是使用默认初始化的类型或它们被覆盖的任何表达式的类型隐式定义的。因此,当您在设计中的表达式中引用这些参数时,它们将成为real
表达式。
在SystemVerilog中,为@Greg建议的参数提供显式数据类型总是一个好主意。