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