在 System Verilog 中将不同数量的宏参数作为字符串传递

问题描述

我有一个现有的代码,它使用一些宏定义来显示来自我的测试用例的消息。我想更改这些宏的实现,但是,由于这些宏广泛用于现有的测试用例中,我希望重新实现它们的功能,而不必修改宏的使用方式。

目前宏定义如下:

`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显示刹车中的消息。

我想要做的是定义宏,使宏调用中的这些消息可以作为字符串参数传递给函数(例如函数 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