【问题标题】:How to create a string from a pre-processor macro如何从预处理器宏创建字符串
【发布时间】:2013-03-12 22:03:08
【问题描述】:

我有一个预处理器宏,它表示我的设计中的分层路径。

例子:

`define HPATH top.chip.block

我需要构造一个包含`HPATH 值的字符串,所以在我的示例中,字符串应该等于top.chip.block

有没有办法构造这样的字符串?

以下尝试均无效:

string hpath;
hpath = "`HPATH";     // Results in hpath = "`HPATH"
hpath = \"``HPATH\";  // Doesn't compile
hpath = `HPATH;       // Doesn't compile

我希望hpath 等同于执行此分配hpath = "top.chip.block",但使用`HPATH 而不是再次指定路径。

我无法使用%m,因为我需要在顶级 UVM 环境中使用字符串,而不是在模块中。

更多背景知识:我想这样做的原因是因为我在 UVM 类库中使用了后门寄存器访问。后门 API 需要将 hdl_path 设置为设计中的块,作为字符串。我已经为分层路径定义了`defines,并在指定 hdl_paths 时尝试重用这些路径,因此我没有两次定义相同的路径。我的测试台将同时使用分层路径和字符串路径。

【问题讨论】:

    标签: macros verilog system-verilog


    【解决方案1】:

    不能在字符串文字中使用 `define 宏。根据 SystemVerilog LRM:

    宏替换和参数替换不应发生在字符串文字中。

    但是,可以通过使用带有参数的宏并使用 ``"` 在宏中包含引号来构造字符串文字。

    再次,来自 LRM:

    一个 `" 覆盖了 " 的通常词汇含义,并表示扩展应包括引号 标记、实际参数的替换和嵌入式宏的扩展。这允许字符串文字 从宏参数构造。

    所以这行得通:

    `define STRINGIFY(x) `"x`"
    `define HPATH top.chip.block
    string hpath = `STRINGIFY(`HPATH);
    $display(hpath);                       // Output: "top.chip.block"
    

    示例代码可以在这里运行:http://www.edaplayground.com/s/4/879

    【讨论】:

      【解决方案2】:

      我知道这是一个旧线程,但我想我会分享我们的解决方案。使用 $sformatf 可以在需要时添加其他信息。

      `define STRINGIFY(DEFINE) $sformatf("%0s", `"DEFINE`")
      

      【讨论】:

        【解决方案3】:

        我想这就是你要找的。​​p>

        `define HPATH `"top.chip.block`"
        string hpath = `HPATH;
        

        正如 toolic 所指出的,转义序列 %m 将在 $display 语句中使用时为您提供当前层次结构,因此这可能是一个更好的选择。

        【讨论】:

        • 不完全是 - 我仍然需要在其他一些上下文中使用 `HPATH 作为分层引用,因此简单地将宏定义为字符串是行不通的。
        猜你喜欢
        • 1970-01-01
        • 2019-06-21
        • 2017-09-18
        • 2019-08-12
        • 1970-01-01
        • 1970-01-01
        • 2012-07-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多