假设我有一个顶级文件,我传递给我的编译器:
`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"
吗?也许这个要求是编译器特定的?
答案 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
所在的点。编译器:
结果是编译器看到一个大的平面文件。
在您的示例中,您可以使用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添加到每个文件中。