什么时候在Verilog和SystemVerilog中不需要`include指令?

时间:2012-09-18 14:31:59

标签: verilog system-verilog

假设我有一个顶级文件,我传递给我的编译器:

`include "my_defines.sv"
`include "my_component.sv"

在“my_component.sv”文件中,我使用了“my_defines.sv”中的一些定义,如下所示:

my_variable = `CONSTANT_FROM_MY_DEFINES;

问题如下:我需要在“my_component.sv”中设置`include "my_defines.sv"吗?也许这个要求是编译器特定的?

5 个答案:

答案 0 :(得分:2)

如果你的" my_defines.sv"有一个"包括"保护,然后包括" my_defines.sv"是安全的。在所有其他文件中。 "包括"守护在" my_defines.sv"的顶部会是这样的:

`ifndef MY_DEFINES_SV
`define MY_DEFINES_SV
// put your own defines here ...
`endif

答案 1 :(得分:1)

像这样的

include指令就像将文件复制并粘贴到include所在的点。编译器:

  1. 读取您提供的文件。
  2. 当遇到包含时,它会读取该文件。
  3. 当它完成该文件时,它会继续原始文件。
  4. 结果是编译器看到一个大的平面文件。

    在您的示例中,您可以使用my_defines中的my_component中的内容,因为它出现在之前。

    做很多事情的问题是最终你最终会遇到冲突。也许两件事互相引用(包括第一件),两件事使用相同的名称(冲突定义),或者多件事具有相同的include语句(同一件事的多个定义)。

    包解决了这些问题。一旦事情开始变得复杂一些,请研究它们。

答案 2 :(得分:0)

这取决于编译源文件的顺序。因为您具体指的是全局的define宏,所以需要在使用宏之前编译宏定义。在您的情况下,您不需要在“my_component.sv”中包含“my_defines.sv”,因为“my_defines.sv”已经在您的顶层文件中编译。

答案 3 :(得分:0)

宏定义仅在文件中保留,但仅限于翻译单元的末尾。模拟器必须支持两种不同的方法将源文件分配给翻译单元,并且很难得到“包含文件”的定义,以便在两种方法中正确编译。

最好使用参数或const变量来表示常量。由于参数和常量遵循正常的作用域规则,因此您可以将它们安全地包含在需要它们的每个文件/作用域中。然后,如何将代码分解为翻译单元并不重要,它总是编译。我认为在浏览代码时更容易找到定义,因为`include可能在同一个文件中,而不是在其他一些不相关的文件中关闭。

答案 4 :(得分:0)

你必须在my_component.sv中包含`include“my_defines.sv ...

最佳做法是在一个pkg中添加所有include并将该pkg添加到每个文件中。