问题描述
是否可以根据参数值在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
构造将相同名称的模块编译为两个不同的库,然后选择要使用的库想从中提取定义。
对于任何一种情况下的可合成代码,您都需要将所有公共信号通过端口传递到这些模块。如果代码不可合成,则可以直接使用向上引用,而无需定义端口