繁体   English   中英

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

[英]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所在的位置。 编译器:

  1. 读取您提供的文件。
  2. 当遇到包含时,它将读取该文件。
  3. 该文件完成后,它将继续原始文件。

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

在您的例子中,你可以使用从东西my_definesmy_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM