问题描述
我有一个现有的代码,它使用一些宏定义来显示来自我的测试用例的消息。我想更改这些宏的实现,但是,由于这些宏广泛用于现有的测试用例中,我希望重新实现它们的功能,而不必修改宏的使用方式。
目前宏定义如下:
`define My_Info $write("INFO:"); $display
`define My_Error $write("ERROR:"); $display
`My_Info("This is an info message with arguments %0d,%0d,and %0d",var1,var2,var3);
`My_Info("My_ID",$psprintf("ID : %s",var4));
`My_Error("Failed to open file: %s ",fname);
我想要做的是定义宏,使宏调用中的这些消息可以作为字符串参数传递给函数(例如函数 my_msg(msg)
其中 {{1 }} 是一个字符串,msg
是一个函数,用于格式化该字符串并将其返回到日志文件。
我的问题是,因为在测试用例中,宏调用具有不同数量的参数,如上例所示,我不确定如何以通用方式定义宏。
目前我的解决方案是定义如下宏:
my_msg
但这依赖于有限数量的参数(在本例中为 5)。
有没有更优雅的方法?
解决方法
您可以通过需要一组额外的 () 来解决缺少不同数量的宏参数的问题。
module top;
`define my_error(msg) begin $error({"My ID:",$sformatf msg}); end
int a,b;
initial begin
`my_error( ("hello") )
`my_error( ("A = %0d B = %0d",a,b) )
end
endmodule