【问题标题】:When to use `include in SystemVerilog何时在 SystemVerilog 中使用 `include
【发布时间】:2021-04-16 09:17:53
【问题描述】:

我想知道 `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 system-verilog hdl


    【解决方案1】:

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

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

    方法 #1 假定一定的编译顺序(从前到后)。但是,编译设计元素(模块、原语等)的顺序并不重要。编译器总是可以定位在实例化它的代码之前或之后编译的模块。

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

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

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

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

    【讨论】:

    • 所以最好只包含参数和包,而对于模块我应该使用#1,对吧?
    • 本题属于你所在公司使用的代码指南。在我看来,最好将所有(非模块)参数放在包中,并在文件列表的前面编译所有包,不要包含它们。但同样,这取决于您的公司规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2019-03-19
    • 1970-01-01
    相关资源
    最近更新 更多