14

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

例子:

`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 设置为设计中的块,作为字符串。我已经为分层路径定义了“定义”,并且在指定 hdl_paths 时尝试重用这些路径,因此我没有两次定义相同的路径。我的测试台将同时使用分层路径和字符串路径。

4

3 回答 3

25

不能在字符串文字中使用 `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

于 2013-03-13T03:38:18.877 回答
2

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

`define STRINGIFY(DEFINE) $sformatf("%0s", `"DEFINE`")
于 2018-06-25T20:56:45.337 回答
1

我想这就是你要找的。

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

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

于 2013-03-13T01:51:12.143 回答