Verilog - 编译时计算

Verilog - Compile time calculations

我需要在编译时为视频驱动程序做一些计算。实例化模块时,会定义 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呢?

主要问题是 $floor 是一个 returns 值具有 real 类型的函数。由于您没有为参数明确提供数据类型,因此它们使用默认初始化的类型或它们覆盖的任何表达式的类型隐式定义。因此,当您在设计中的表达式中引用这些参数时,它们将变为 real 表达式。

在 SystemVerilog 中,按照@Greg 的建议为您的参数提供明确的数据类型始终是个好主意。