如何使用Verilog宏模拟$ display?

e19*_*001 4 verilog system-verilog

我想创建一个具有多个参数的宏,就像$ display一样.

我的代码看起来像这样,但它不起作用.

               `define format_macro(A) \
                      $write("%s", $sformatf(A)); \
Run Code Online (Sandbox Code Playgroud)

这就是我所谓的format_macro.

               `format_macro("variable = %d", variable)
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

dwi*_*kle 10

我想创建一个具有多个参数的宏,就像$ display一样.

你不能.Verilog和SystemVerilog不支持可变参数宏.

如果您的目标是使用它来格式化字符串或输出,并且您希望避免必须$sformat在整个地方键入,这是一种解决方法.您可以将宏定义为具有单个参数,并将该参数与$sformat.这样做的警告是,在使用宏时必须将参数包装在括号中.

注意()'s for $sformatf不是宏的一部分:

`define format_macro(A) \
        $write("%s", $sformatf A ); \
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

  `format_macro(("a = %d", a))
  `format_macro(("a = %d, b = %d", a, b))
Run Code Online (Sandbox Code Playgroud)

顺便说一下,这里有一个很棒的截屏视频,展示了如何在UVM中自定义消息.在其中,作者展示了这种宏观技术,以及一些其他很好的技巧,如果你正在使用UVM.