Verilog 全局变量的使用

Verilog Global Variable Usage

我正在尝试构建一个从定义文件导入全局定义的 Verilog 文件,这样我就可以在一个地方跟踪我的所有 FPGA 端点。在 my_defines 文件中,我有一个变量列表,如下所示:

`定义 PipeA 8'hA1

我使用 `include "my_defines.v"

将此文件导入主文件 top_module

当我在 top_module 文件中实例化变量时,我注意到您必须使用 `PipeA 作为变量名称而不是 PipeA。如果我已经导入了这个,为什么还需要 `?

`includeimport 有很大区别。 import 是只有 SystemVerilog 允许的。 `define 的使用是预处理步骤中的文本替换,无需理解任何 Verilog 语法。 `PipeA 调用文本替换宏,它不是变量名。就 Verilog 而言,没有全局命名空间。

SystemVerilog 有一个 package 你可以定义它是一个可以导入模块(或另一个包)的命名空间。

`include 是一种 verilog 语法,它指示编译器在编译时包含其他文件的内容。它与C中的#include非常相似。

`define定义了一个命名的文本替换(宏),类似于C.

中的#define

因此, `define PipeA 8'hA1 定义了名为 PipeA 的宏,并将 8'h1 作为上下文。要在程序中使用它,您需要遵循 verilog 规则并使用 '`' 语法,如下所示: `PipeA.

一个例子

   assign myVar[7:0] = `PipeA;

预处理器会将 `PipeA 替换为其定义中的文本:

   assign myVar[7:0] = 8'h1;

上面的结果会被verilog解析

宏定义被认为是全局的。定义解释发生在任何 verilog 分析之前,并且与范围规则正交。因此,无论您在何处定义宏,在范围内还是范围外,它仍然会在 compilation unit.

内的任何地方定义

此外,标准Verilog 没有任何导入的概念。 System verilog有,但是跟上面没有关系