Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时在Verilog和SystemVerilog中不需要包含指令?_Verilog_System Verilog - Fatal编程技术网

何时在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
    

    它将确保编译时没有“重定义”错误。