何时在Verilog和SystemVerilog中不需要包含指令?
假设我有一个传递给编译器的顶级文件,该文件具有:何时在Verilog和SystemVerilog中不需要包含指令?,verilog,system-verilog,Verilog,System Verilog,假设我有一个传递给编译器的顶级文件,该文件具有: `include "my_defines.sv" `include "my_component.sv" 在“my_component.sv”文件中,我使用了“my_defines.sv”中的一些定义,如下所示: my_variable = `CONSTANT_FROM_MY_DEFINES; `ifndef MY_DEFINES_SV `define MY_DEFINES_SV // put your own defines here ...
`include "my_defines.sv"
`include "my_component.sv"
在“my_component.sv”文件中,我使用了“my_defines.sv”中的一些定义,如下所示:
my_variable = `CONSTANT_FROM_MY_DEFINES;
`ifndef MY_DEFINES_SV
`define MY_DEFINES_SV
// put your own defines here ...
`endif
问题是:我是否需要在“my_component.sv”中包含“my_defines.sv”?也许这个要求是特定于编译器的?它取决于源文件的编译顺序。由于您特别指的是全局的
define
宏,因此需要在使用宏之前编译宏定义。在您的情况下,您不需要在“my_component.sv”中包含“my_defines.sv”,因为“my_defines.sv”已经在您的顶部文件中编译。include
类似的指令类似于将该文件复制并粘贴到包含的位置。编译器:
读取您提供给它的文件
当遇到include时,它将读取该文件
完成该文件后,它将继续原始文件
结果是编译器看到一个大平面文件
在您的示例中,您可以使用myu组件
中的myu定义
中的内容,因为它出现得更早
这样做的问题是,最终你会遇到冲突。可能两个事物相互引用(include优先),两个事物使用相同的名称(冲突定义),或者多个事物具有相同的include语句(同一事物的多个定义)
软件包解决了这些问题。一旦事情开始变得更复杂,请仔细研究它们。宏定义只会在文件中保留,但只会保留到翻译单元的末尾。模拟器必须支持两种不同的方法将源文件分配给翻译单元,并且很难在这两种方法中正确编译“include files full”defines
最好对常量使用参数或常量变量。因为参数和常量遵循正常的作用域规则,所以您可以安全地将它们包含在每个需要它们的文件/作用域中。然后,不管代码如何分解为翻译单元,它总是编译的。我认为在浏览代码时更容易找到定义,因为“include”可能在同一个文件中,而不是在其他不相关的文件中关闭。您必须在“my_component.sv”中包含“include”my_defines.sv
最佳做法是在一个pkg中添加所有include,并将该pkg添加到每个文件。如果您的“my_defines.sv”有一个“include”保护,那么在所有其他文件中包含“my_defines.sv”是安全的,并且更好。位于“my_defines.sv”顶部的“include”保护如下所示:
my_variable = `CONSTANT_FROM_MY_DEFINES;
`ifndef MY_DEFINES_SV
`define MY_DEFINES_SV
// put your own defines here ...
`endif
它将确保编译时没有“重定义”错误。