有条件的Verilog包含文件

问题描述

是否可以根据参数值在Verilog中包括文件?以下内容包括两个文件,因为直到编译时才评估参数,而预处理器宏则在编译之前评估。实现此目标的最佳方法是什么?

generate
  if (PARAM_A == 1) begin
    `include "file_a"
  end else begin
    `include "file_b"
  end
endgenerate

解决方法

如前所述,include语句在{em> generate语句之前被编译。因此,在您的示例中,编译将包括两个文件。其余的将取决于所包含文件本身的内容。

如果文件包含文本宏的定义,则两个文件中的所有此类定义都将包含在编译过程中,并且在包含之后可见。

如果文件包含真实代码的片段(例如,始终块,模块实例化),则这些片段将遵循generate块的规则。在其他作品中,将根据PARAM_A的值有条件地实例化。因此,尽管实际上两个文件都包含在内,但最终还是要对代码部分进行正确的条件实例化。

为了完全防止包含文件,您需要对文本宏使用ifdef/ifndef构造:

`ifdef MACRO_A
`include "file_a"
`else
`include "flie_b"
`endif
,

听起来您希望两个文件A和B在不同的模块实例之间进行选择。您可以使用generate-{if语句在两个实例之间进行选择,也可以使用config构造将相同名称的模块编译为两个不同的库,然后选择要使用的库想从中提取定义。

对于任何一种情况下的可合成代码,您都需要将所有公共信号通过端口传递到这些模块。如果代码不可合成,则可以直接使用向上引用,而无需定义端口

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...