我想创建多个参数就像$显示宏。
我的代码看起来是这样,但它不工作。
`define format_macro(A) \
$write("%s", $sformatf(A)); \
这是我怎么叫format_macro。
`format_macro("variable = %d", variable)
我怎样才能做到这一点?
我想创建多个参数就像$显示宏。
我的代码看起来是这样,但它不工作。
`define format_macro(A) \
$write("%s", $sformatf(A)); \
这是我怎么叫format_macro。
`format_macro("variable = %d", variable)
我怎样才能做到这一点?
我想创建多个参数就像$显示宏。
你不能。 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其它的一些技巧一起。
你是路过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
这使您可以修改宏中的消息格式(前面加上“ERROR”,或者也许文件和行号,或任何你喜欢的人),你不能用包装所有的参数到括号的上面的方法做。