如何从预处理器宏创建字符串

时间:2013-03-12 22:03:09

标签: macros verilog system-verilog

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

示例:

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

3 个答案:

答案 0 :(得分:21)

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

答案 1 :(得分:1)

我认为这就是你要找的东西。

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

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

答案 2 :(得分:0)

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

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