Macros 在系统Verilog中以字符串形式传递不同数量的宏参数
我有一个现有的代码,它使用一些宏定义来显示来自测试用例的消息。我想改变这些宏的实现,但是,由于这些宏在已经存在的测试用例中被广泛使用,我希望在不必修改宏的使用方式的情况下重新实现它们的功能 目前,宏的定义如下:Macros 在系统Verilog中以字符串形式传递不同数量的宏参数,macros,arguments,system-verilog,test-bench,Macros,Arguments,System Verilog,Test Bench,我有一个现有的代码,它使用一些宏定义来显示来自测试用例的消息。我想改变这些宏的实现,但是,由于这些宏在已经存在的测试用例中被广泛使用,我希望在不必修改宏的使用方式的情况下重新实现它们的功能 目前,宏的定义如下: `define My_Info $write("INFO:"); $display `define My_Error $write("ERROR:"); $display 在测试用例中,这些宏的示例调用包括: `My
`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);
当前,$display
,显示制动器中的消息
我想做的是定义宏,使宏调用的brakets中的这些消息可以作为字符串参数传递给函数(例如,函数my_msg(msg)
,其中msg
是字符串,my_msg
是格式化此字符串并将其返回到日志文件的函数)。
我的问题是,因为在测试用例中,宏调用具有不同数量的参数,如上面的示例所示,我不确定如何以通用的方式定义宏
目前,我的解决方案是定义宏,如:
`define My_Info(string=" ", var1= , var2= , var3= , var4= ) my_msg($sformat(s,var1, var2, var3, var4)
但这依赖于有限数量的参数(在本例中为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