什么时候在 SystemVerilog 中使用`include

When to use `include in SystemVerilog

我想知道 `include 预处理器指令的用途是什么以及何时使用它。例如,我使用的是 Xilinx 的 Vivado,我试过这个:

module A (          //This is the top module 
    input  logic x, y,
    output logic z
    );
    
    B B1 (.a(x),
          .b(y),
          .c(z)
          );
endmodule

我在另一个文件中写了这个

module B(
    input  logic a, b,
    output logic c
        );
        
        assign c = a & b;
endmodule

该软件没有警告我任何事情,它合成正确。所以现在我有点困惑,我也看到有人在他们的顶级模块中包含每个文件,其他人只包含他们的参数和包。

为了让 verilog 编译您的模型,您需要通过以下两种方式之一提供包含相关代码的所有文件:

  1. 命令行文件列表
  2. 使用`include

方法#1 采用特定的编译顺序(从前到后)。然而,设计元素(模块、原语……)的编译顺序并不重要。编译器始终可以找到在实例化它的代码之前或之后编译的模块。

某些verilog 元素需要特定的编译顺序。在经典的 verilog 中,这些是宏定义 (`define)。 System verilog 在全局范围内添加包和定义。如果您的文件包含这些元素,则必须在使用它们的代码之前列出它们。

另一种情况,主要与前系统 verilog 世界相关,是使用 `include 在模块范围内插入公共参数定义。这样语句就会出现在模块内部。在系统 verilog 中,这可以替换为包和导入语句。

对于顺序相关的编译元素,您可以将它们放在编译列表中使用它们的代码之前。然而,有时该命令可能难以执行。 `包括在这种情况下的帮助。他们允许您保证编译顺序并将相关文件组合在一起。

Verilog 允许您`包含任何代码,它只是不关心。但是,根据我的经验,`include 包含设计元素(模块)的代码可能会导致代码管理问题,并且在某些情况下可能会导致编译问题。