使用宏而不是函数来显示消息有什么好处?

what is the advantage to use macro instead of functionn to display messages?

我目前正在 systemverilog 中进行一些验证,我的团队目前正在使用一些宏来在抄本中显示消息。

这是我拥有的宏之一:

`define MSG_ERR(TEXT) begin $write("** Error: %9.3f%2s %16s ", `GET_TIME, `GET_UNITS, c_MODULE); $error($sformatf TEXT); end

所以基本上就是调用一些系统函数。

我的问题是:使用宏而不是函数有什么好处吗?

提前致谢

在 Verilog 中,除了宏 space 外,没有全局 space 来放置定义。所以这就是人们使用的。自从SystemVerilog引入了globalpackagespace,就不再有优势了

verilog 中的宏只是文本替换机制,类似于 c/c++ 宏。因此,宏可以 "instantiated" 出现在代码的任何部分,前提是它的内容在那里是合法的。

此外,与 c/c++ 一样,verilog 宏具有一些合并和字符串化其参数、构建变量名、字符串等的功能。

宏有一些缺点:

  1. 它们不能限定范围。所有宏都存在于全局(编译单元)范围内,受编译顺序影响

  2. 绝对没有编译器检查可用的宏定义(参数除外)。有时很难找出与宏相关的编译信息,尤其是嵌套宏。

  3. 一些调试工具无法调试宏定义中的代码。

另一方面,函数为您提供了对内容的更多控制,并允许编译器更好地进行检查。调试工具也会很开心。

您可以在一个范围(模块、包...)中定义一个函数,有效地将它封装到一个名称中 space。

但是,

  1. 只能在可以使用的地方使用该功能。

  2. 你不能用函数参数做任何文本替换技巧,在很多情况下需要编写更多代码来实例化一个函数。

我的建议是尽量使用函数(或任务)。在某些情况下,您可以使用模块。仅在无法使用 function/task/module 或您遵循某种基于宏的方法时才使用宏。