如果未设置某个宏,则阻止systemverilog编译
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果未设置某个宏,则阻止systemverilog编译相关的知识,希望对你有一定的参考价值。
我正在编写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
根据建议,将以下信息添加到问题中:
代码位于模块中,但不在initial或always语句中。我希望找到一个解决方案,允许我终止编译,即详细说明hdl。我正在为FPGA实现进行设计,我需要确保没有设置其中一个宏,此代码的其他用户无法进入设计流程的综合阶段。
$fatal
是一个运行时系统调用,而不是工具中提到的编译时死亡。除非你有编译错误,否则我认为你不能停止编译。在您的示例代码中,您通过隐藏部分代码来接近您想要的内容,但编译不会终止,并且您不会打印正确的消息。
我不知道有任何标准的Verilog / SystemVerilog构造用于在编译期间打印自定义消息。例如GCC,has #error
for this purpose。但是,一些综合工具,如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
这将生成以下详细信息:
$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
$fatal
也是IEEE Std 1800-2009第20.10节中增加的一项精心设计任务。请参阅IEEE Std 1800-2012§20.11详细说明系统任务。它可以在生成块中使用。如果模拟器是* 09 +投诉,则以下情况应该有效。
...
`else
//inferred generate block
if (0) $fatal(1,"MACRO_0 or MACRO_1 must be set for compilation");
`endif
我在edaplaygrond上试了一下,但看起来ModelSim10.1d不支持它。同时,和其他人一样,您可以执行以下操作:
...
`else
CAUSE_ELAB_ERR fatal("MACRO_0 or MACRO_1 must be set for compilation");
`endif
使用initial
会在时间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
至少在VCS $ fatal中是运行时的系统任务,而不是elab / compile
错误 - [SE]语法错误以下verilog源有语法错误:使用精化系统任务需要选项-assert svaext“bla.sv”,10:token is';' $ fatal(“必须为编译设置MACRO_0或MACRO_1”); ^
添加正确的开关允许它在编译时间内完成。我不知道你正在使用的FGPA编译,但也许它有类似的开关
我知道这是一个旧线程,但自从提出这个问题以来,对精化系统任务的支持已经有了很大改进。原始代码现在应该按照预期在大多数工具上工作(例如Cadence Xcelium,Synopsys VCS和Mentor Questasim)。
还可以注意到,模块参数可能更好地解决了问题:
if (!(PARAM_0 || PARAM_1))
$fatal(1,"your error message");
以上是关于如果未设置某个宏,则阻止systemverilog编译的主要内容,如果未能解决你的问题,请参考以下文章
Excel 保存文件出现 您试图打开的文件类型(Excel 2007和更高版本的启用宏的工作簿和模板)被信任中心的文件阻止设置阻止
如何定义 coverpoint system verilog