我想创建一个带有多个参数的宏,就像 $display 一样。
我的代码看起来像这样,但它不起作用。
`define format_macro(A) \
$write("%s", $sformatf(A)); \
这就是我调用 format_macro 的方式。
`format_macro("variable = %d", variable)
我怎样才能做到这一点?
我想创建一个带有多个参数的宏,就像 $display 一样。
我的代码看起来像这样,但它不起作用。
`define format_macro(A) \
$write("%s", $sformatf(A)); \
这就是我调用 format_macro 的方式。
`format_macro("variable = %d", variable)
我怎样才能做到这一点?
我想创建一个带有多个参数的宏,就像 $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 的其他一些不错的技巧。
您将 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
SystemVerilog 现在支持可选的宏参数,它允许您像这样创建一个巧妙的组合:http: //ionipti.blogspot.com/2012/08/systemverilog-variable-argument-display.html
这允许您修改宏中的消息格式(添加“错误”,或者可能是文件和行号,或者您喜欢的任何其他内容),而上述将所有参数包装到括号中的方法无法做到这一点。