【问题标题】:what is the advantage to use macro instead of functionn to display messages? [closed]使用宏而不是函数来显示消息有什么好处? [关闭]
【发布时间】:2019-03-26 17:21:22
【问题描述】:

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

这是我拥有的宏之一:

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

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

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

提前致谢

【问题讨论】:

    标签: function macros system-verilog


    【解决方案1】:

    verilog 中的宏只是文本替换机制,类似于 c/c++ 宏。因此,宏可以在代码的任何部分“实例化”,只要其内容在那里合法。

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

    宏有几个缺点:

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

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

    3. 一些调试工具在调试宏定义中的代码时遇到问题。

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

    您可以在范围(模块、包...)内定义函数,将其有效地封装到名称空间中。

    但是,

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

    2. 您不能对函数参数进行任何文本替换技巧,并且在许多情况下需要编写更多代码来实例化函数。

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

    【讨论】:

      【解决方案2】:

      在 Verilog 中,除了宏空间之外,没有用于放置定义的全局空间。所以这就是人们使用的。自从 SystemVerilog 引入了全局package 空间后,就没有优势了。

      【讨论】:

        猜你喜欢
        • 2021-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-30
        相关资源
        最近更新 更多