[英]When are `include directives not needed in Verilog and SystemVerilog?
假设我有一个传递给编译器的顶级文件,该文件具有:
`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_defines.sv”具有“包括”防护,则在所有其他文件中包括“ my_defines.sv”是安全且更好的。 “ my_defines.sv”顶部的“ include”保护如下所示:
`ifndef MY_DEFINES_SV
`define MY_DEFINES_SV
// put your own defines here ...
`endif
诸如此类的include
指令类似于将文件复制并粘贴到include
所在的位置。 编译器:
结果是编译器看到一个大的平面文件。
在您的例子中,你可以使用从东西my_defines
在my_component
,因为它出现较早。
这样做的问题在于,最终您将最终陷入冲突。 可能有两个事物相互引用(首先包含),两个事物使用相同的名称(冲突定义),或者多个事物具有相同的include语句(同一事物的多个定义)。
包解决了这些问题。 一旦事情变得更加复杂,请研究一下。
它取决于源文件的编译顺序。 因为您是专门指define
全局的宏,所以要求在使用宏之前先编译宏定义。 就您而言,您不需要在“ my_component.sv”中包括“ my_defines.sv”,因为“ my_defines.sv”已经在顶级文件中进行了编译。
宏定义仅在文件之间保留,而仅保留在翻译单元的末尾。 模拟器必须支持将源文件分配给翻译单元的两种不同方法,并且很难获得包含完整定义的`include文件'才能在两种方法中正确编译。
最好将参数或const变量用于常量。 由于参数和常量遵循常规的作用域规则,因此您可以安全地将它们包含在需要它们的每个文件/范围中。 然后,将代码分解为翻译单元并不重要,它将始终进行编译。 我认为在浏览代码时更容易找到定义,因为`include可能在同一个文件中,而不是在其他一些不相关的文件中。
您必须在my_component.sv中包含`include“ my_defines.sv ...
最佳做法是将所有包含都添加到一个pkg中,并将该pkg添加到每个文件中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.