如果未设置某个宏,则阻止systemverilog编译

mil*_*man 5 macros verilog compilation hdl system-verilog

我正在编写systemverilog模块,我需要确保设置某个宏以允许继续编译.

我已经尝试了下面的内容,但它只是给出语法错误"意外的SYSTEM_IDENTIFIER"$致命.

我知道技术上会停止编译,但有人知道更优雅的解决方案吗?

*更正,如果`else分支中的语法不正确,则没有一个分支将成功编译.

`ifdef MACRO_0
// Some code
`elsif MACRO_1
// Some other code
`else
$fatal("MACRO_0 or MACRO_1 must be set for compilation");
`endif
Run Code Online (Sandbox Code Playgroud)

根据建议,将以下信息添加到问题中:

代码位于模块中,但不在initial或always语句中.我希望找到一个解决方案,允许我终止编译,即详细说明hdl.我正在为FPGA实现进行设计,我需要确保没有设置其中一个宏,此代码的其他用户无法进入设计流程的综合阶段.

Ari*_*Ari 5

$fatal是一个运行时系统调用,而不是工具提到的编译时致命.除非你有编译错误,否则我认为你不能停止编译.在您的示例代码中,您通过隐藏部分代码来接近您想要的内容,但编译不会终止,并且您不会打印正确的消息.

我不知道在编译期间打印自定义消息的任何标准Verilog/SystemVerilog构造.例如,GCC 就是#error为了这个目的.但是,某些综合工具(如Synopsis Design Compiler)会$display精化时打印消息输出.在$display仍然需要内部always块.如果在未定义MACRO0和MACRO1时也故意发出精化错误,则可以终止合成.

例如,在下文中,虚拟模块被实例化而不定义其主体:

`ifdef MACRO_0
// Some code
`elsif MACRO_1
// Some other code
`else
 logic a;
 always $display("MACRO_0 or MACRO_1 must be set for compilation");
 DEFINE_MACRO0_OR_MACRO1 dummy (.in(a));
`endif
Run Code Online (Sandbox Code Playgroud)

这将生成以下详细信息:

$display output: MACRO_0 or MACRO_1 must be set for compilation
...
Information: Building the design 'DEFINE_MACRO0_OR_MACRO1'. (HDL-193)
Warning: Cannot find the design 'DEFINE_MACRO0_OR_MACRO1' in the library 'WORK'. (LBR-1)
Warning: Unable to resolve reference 'DEFINE_MACRO0_OR_MACRO1' in 'TEST'. (LINK-5)
0
Run Code Online (Sandbox Code Playgroud)

  • $fatal 是 IEEE Std 1800-2009 添加的细化任务。显然这还不支持。 (2认同)