4

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

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

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

这就是我调用 format_macro 的方式。

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

我怎样才能做到这一点?

4

3 回答 3

10

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

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

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

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

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

然后你可以这样做:

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

顺便说一句,这里有一个出色的截屏视频,展示了如何在 UVM 中自定义消息传递。在其中,作者展示了这种宏技术,以及如果您使用 UVM 的其他一些不错的技巧。

于 2012-10-12T14:28:01.953 回答
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
于 2012-10-12T09:46:15.707 回答
2

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

这允许您修改宏中的消息格式(添加“错误”,或者可能是文件和行号,或者您喜欢的任何其他内容),而上述将所有参数包装到括号中的方法无法做到这一点。

于 2013-11-09T23:12:00.800 回答