如何效仿采用Verilog宏$显示?(How to emulate $display using V

2019-08-01 10:09发布

我想创建多个参数就像$显示宏。

我的代码看起来是这样,但它不工作。

               `define format_macro(A) \
                      $write("%s", $sformatf(A)); \

这是我怎么叫format_macro。

               `format_macro("variable = %d", variable)

我怎样才能做到这一点?

Answer 1:

我想创建多个参数就像$显示宏。

你不能。 Verilog和SystemVerilog的不支持复杂的宏 。

这里是一个解决办法,如果你的目标是要利用这个格式化字符串或输出,并且要避免键入$sformat过的地方所有。 您可以定义宏有一个参数 ,并结合这样的说法$sformat 。 有这样做的条件是,必须使用宏时包裹在括号中的参数。

注意()的为$sformatf不是宏的一部分:

`define format_macro(A) \
        $write("%s", $sformatf A ); \

然后,你可以这样做:

  `format_macro(("a = %d", a))
  `format_macro(("a = %d, b = %d", a, b))

顺便说一句,有一个优秀的截屏在这里展示了如何自定义消息在UVM。 在书中,作者显示了这个宏技术,与如果你使用UVM其它的一些技巧一起。



Answer 2:

你是路过2个参数宏, "variable = %d"variable ,宏只获得1个输入定义。 阅读的问题可能不是你想要多个参数,但数量可变的。

对于静态列表要么宏设置格式的文字:

`define say(n) $display("cowsay : %s", n);

initial begin
  `say("Moo")
end
=>cowsay : moo

或者先建立一个字符串,并通过作为一个参数。

`define say(n) $display("%s", n);

string msg;

initial begin 
  $sformat(msg, "variable is : %d", 3);
  `say(msg)
end
=>variable is :           3


Answer 3:

现在的SystemVerilog支持可选的宏观参数,它允许您创建一个聪明的杂牌像这样: http://ionipti.blogspot.com/2012/08/systemverilog-variable-argument-display.html

这使您可以修改宏中的消息格式(前面加上“ERROR”,或者也许文件和行号,或任何你喜欢的人),你不能用包装所有的参数到括号的上面的方法做。



文章来源: How to emulate $display using Verilog Macros?