1

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

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

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

my_variable = `CONSTANT_FROM_MY_DEFINES;

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

4

5 回答 5

2

如果您的“my_defines.sv”有一个“include”保护,那么在所有其他文件中包含“my_defines.sv”是安全且更好的。“my_defines.sv”顶部的“include”守卫将如下所示:

`ifndef MY_DEFINES_SV
`define MY_DEFINES_SV
// put your own defines here ...
`endif
于 2014-10-01T01:45:43.867 回答
1

include像这样的指令就像将该文件复制并粘贴到该文件所在的include位置。编译器:

  1. 读取你给它的文件。
  2. 当它遇到一个包含时,它会读取该文件。
  3. 完成该文件后,它将继续原始文件。

结果是编译器看到一个大的平面文件。

在您的示例中,您可以使用 in 中的内容my_definesmy_component因为它出现得更早。

做很多这样的问题是最终你会遇到冲突。也许两个事物相互引用(首先包含),两个事物使用相同的名称(冲突定义),或者多个事物具有相同的包含语句(同一事物的多个定义)。

包解决了这些问题。一旦事情开始变得更加复杂,就去调查它们。

于 2012-09-24T09:34:46.660 回答
0

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

于 2012-09-18T14:39:18.980 回答
0

宏定义仅在文件间保留,但仅保留到翻译单元的末尾。模拟器必须支持两种不同的将源文件分配给翻译单元的方法,并且很难让 `include 文件充满`defines 以在两种方法中正确编译。

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

于 2012-10-10T21:53:54.653 回答
0

您必须在 my_component.sv 中包含 `include "my_defines.sv ...

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

于 2012-10-11T13:15:37.743 回答