【问题标题】:Verilog - Compile time calculationsVerilog - 编译时间计算
【发布时间】:2015-05-09 21:10:35
【问题描述】:

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

【问题讨论】:

  • 这可能是您的合成器的限制。如果我没记错的话,整数除法通常会向下取整。您也可以尝试parameter X_BLOCK = int'(640 / WIDTH);parameter int X_BLOCK = $floor(640 / WIDTH); 获得$floor 等效项

标签: parameters system-verilog synthesis


【解决方案1】:

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

在 SystemVerilog 中,按照@Greg 的建议为参数提供显式数据类型总是一个好主意。

【讨论】:

  • 显式数据类型确实可以解决问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多