我想制作一个所有模块都可以看到的全局常量。我尝试了不同的方法来在顶层模块中声明一个变量。但是其他模块不识别它。
在我的顶级模块中,我有以下内容:
`define MODELSIM 0
Run Code Online (Sandbox Code Playgroud)
当我在Xilinx时,我将MODELSIM设置为0。当我在Modelsim时,我将它设置为1。
在其他文件中的其他模块中,我将有以下内容:
if(MODELSIM)
Run Code Online (Sandbox Code Playgroud)
因此,根据我是在 Modelsim 还是 Xilinx 中,会发生不同的事情。
有几件事需要注意。首先解决简单的问题,在 verilog 中对预处理器宏的引用必须以反引号作为前缀,即:
if (`MODELSIM)
Run Code Online (Sandbox Code Playgroud)
verilog 标准指定 tick-defines 具有全局范围,这意味着如果您MODELSIM在编译的第一个文件中定义,则该定义将适用于所有后续文件。但是,我相信 Modelsim 会在单独的编译单元中编译每个文件,因此最安全的做法是在每个 verilog 文件中创建一个mydesign.vh包含宏定义的标头`include。`define在源文本级别工作。a`define和特定模块之间没有关联,也无法`define按范围访问 a 。
一些风格说明:
如果您试图区分仿真和综合,则为此使用SYNTHESIS宏是标准做法。许多综合工具会自动定义它。在使事情以综合为条件时要明智。由于它有意使您的模拟与您的合成结果不同,因此这是一种让您自己动手的简单方法。
对于简单的标志,最好使用 1/undef 而不是 1/0 的值。如果您以后编写`ifdef MACRO.