Macros 如果某些宏不是';t集

Macros 如果某些宏不是';t集,macros,compilation,verilog,system-verilog,hdl,Macros,Compilation,Verilog,System Verilog,Hdl,我正在编写systemverilog模块,我需要确保设置了某个宏以允许编译继续进行 我尝试了下面的方法,但它只给出了语法错误“意外的系统标识符”$fatal 我知道从技术上讲,这会停止编译,但是有人知道更优雅的解决方案吗 *更正,如果`else分支中的语法不正确,则所有分支都不会成功编译 `ifdef MACRO_0 // Some code `elsif MACRO_1 // Some other code `else $fatal("MACRO_0 or MACRO_1 must be se

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

我尝试了下面的方法,但它只给出了语法错误“意外的系统标识符”$fatal

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

*更正,如果`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
根据建议,在问题中添加以下信息:


代码位于模块中,但不在初始或always语句中。我希望找到一个解决方案,使我能够终止编译,即hdl的精化。我正在设计FPGA实现,我需要确保此代码的其他用户在未设置这些宏之一的情况下无法达到设计流的合成阶段。

使用
初始值
在时间0处终止模拟。它不会终止编译

module tb;

`ifdef MACRO_0
// Some code
`elsif MACRO_1
// Some other code
`else
initial $fatal(1, "MACRO_0 or MACRO_1 must be set for compilation");
`endif

endmodule

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

我不知道有任何标准的Verilog/SystemVerilog结构用于在编译时打印自定义消息。例如,GCC。但是,一些合成工具,如Synopsis Design Compiler,会在精化期间打印
$display
消息的输出。
$display
仍然需要位于
始终
块中。如果在未定义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
这将生成以下细化消息:

$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

至少在VCS中,$fatal是运行时的系统任务,而不是elab/compile

错误-[SE]语法错误 以下verilog源有语法错误: 使用精化系统任务需要选项-assert svaext “bla.sv”,10:标记为“;” $fatal(“必须为编译设置宏0或宏1”)
^


添加适当的开关可以让它在编译时通过。我不知道您正在使用的FGPA编译,但可能它有类似的开关

$fatal
也是IEEE Std 1800-2009第20.10节中添加的细化任务。参见§20.11详细说明系统任务。它可以在生成块内使用。如果模拟器是*09+投诉,则以下操作应起作用

...
`else
//inferred generate block
if (0) $fatal(1,"MACRO_0 or MACRO_1 must be set for compilation");
`endif
我试过了,但ModelSim10.1d似乎不支持它。同时,正如其他人所建议的,您可以执行以下操作:

...
`else
CAUSE_ELAB_ERR fatal("MACRO_0 or MACRO_1 must be set for compilation");
`endif

我知道这是一个老话题,但自从提出这个问题以来,对精化系统任务的支持已经有了很大的改进。原始代码现在应该可以在大多数工具上正常工作(例如Cadence Xcelium、Synopsys VCS和Mentor Questasim)

还可以注意到,通过模块参数可能可以更好地解决该问题:

if (!(PARAM_0 || PARAM_1))
  $fatal(1,"your error message");

要回答您的问题,代码位于模块中,但不在初始或always语句中。我希望找到一个解决方案,使我能够终止编译,即hdl的精化。我正在设计FPGA实现,我需要确保此代码的其他用户在没有设置这些宏的情况下无法达到设计流的合成阶段。您应该使用这些信息更新您的问题。非常有趣且非常有用,特别是因为它们分为$info、$warning、$error和$fatal。可惜它们还不受支持。$fatal是IEEE Std 1800-2009添加的细化任务。显然,这还没有得到支持。