【问题标题】:Verilog Include File ConditionallyVerilog 有条件地包含文件
【发布时间】:2020-12-29 13:36:39
【问题描述】:

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

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

【问题讨论】:

  • 这似乎是XY Problem 的经典案例。请解释这两个文件中的内容,以及 PARAM_A 如何获取其值。
  • 具有此代码的文件是用于实现 2 种不同设计的通用文件。这样做是为了避免重复,因为设计之间有很多共性。 PARAM_A 告诉我正在使用哪种设计。 file_afile_b 的实现在设计上也略有不同,它们包括变量、逻辑和其他设计的实例,基本上与任何其他模块一样。

标签: file include verilog system-verilog


【解决方案1】:

正如您所提到的,include 语句是在 generate 语句之前编译的。因此,在您的示例编译中将包含这两个文件。其余的将取决于包含文件本身的内容。

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

如果文件包含真实代码片段(例如,always 块、模块实例化),这些将遵循生成块的规则。在其他作品中将根据PARAM_A 的值有条件地实例化。因此,尽管这两个文件都包含在内,但您最终会得到代码部分的正确条件实例化。

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

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

【讨论】:

  • 我喜欢有条件地使用参数 case 包含两个文件的情况,但不幸的是,文件中定义的所有变量的范围都发生了变化,因此我必须使用分层名称来引用它们,包括 generate标签在外面使用它们。看来我可能不得不创建一个单独的模块而不是调用`include。
【解决方案2】:

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

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

【讨论】:

  • 好的,谢谢您的回答!我需要可综合的代码,所以我必须创建带有端口的模块。我试图重用遗留代码,它不是模块,而是 Verilog 代码。
猜你喜欢
  • 1970-01-01
  • 2012-03-15
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 2016-04-05
  • 1970-01-01
  • 2013-02-28
相关资源
最近更新 更多