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

例:

`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时试图重用它们,因此我没有两次定义相同的路径。我的测试台将同时使用分层路径和字符串路径。

最佳答案

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

关于macros - 如何从预处理器宏创建字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15373113/

10-14 18:19
查看更多