Verilog 中的全局常量

neu*_*cer 1 verilog

我想制作一个所有模块都可以看到的全局常量。我尝试了不同的方法来在顶层模块中声明一个变量。但是其他模块不识别它。

在我的顶级模块中,我有以下内容:

`define MODELSIM 0
Run Code Online (Sandbox Code Playgroud)

当我在Xilinx时,我将MODELSIM设置为0。当我在Modelsim时,我将它设置为1。

在其他文件中的其他模块中,我将有以下内容:

  if(MODELSIM)
Run Code Online (Sandbox Code Playgroud)

因此,根据我是在 Modelsim 还是 Xilinx 中,会发生不同的事情。

And*_*ndy 5

有几件事需要注意。首先解决简单的问题,在 verilog 中对预处理器宏的引用必须以反引号作为前缀,即:

if (`MODELSIM)
Run Code Online (Sandbox Code Playgroud)

verilog 标准指定 tick-defines 具有全局范围,这意味着如果您MODELSIM在编译的第一个文件中定义,则该定义将适用于所有后续文件。但是,我相信 Modelsim 会在单独的编译单元中编译每个文件,因此最安全的做法是在每个 verilog 文件中创建一个mydesign.vh包含宏定义的标头`include`define在源文本级别工作。a`define和特定模块之间没有关联,也无法`define按范围访问 a 。

一些风格说明:

  1. 如果您试图区分仿真和综合,则为此使用SYNTHESIS宏是标准做法。许多综合工具会自动定义它。在使事情以综合为条件时要明智。由于它有意使您的模拟与您的合成结果不同,因此这是一种让您自己动手的简单方法。

  2. 对于简单的标志,最好使用 1/undef 而不是 1/0 的值。如果您以后编写`ifdef MACRO.