2013-03-12 72 views
12

我有一个预处理器宏,它代表了我的设计中的分层路径。如何从预处理器宏创建一个字符串

实施例:

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

+0

有什么打算,一旦你拥有了它与字符串呢? '%m'说明符会帮助你吗? – toolic 2013-03-12 23:35:24

+0

@toolic - 我更新了一些更详细的问题。我需要将路径作为字符串(用于UVM后门寄存器访问)以及作为分层路径(用于某些其他功能)。 '%m'不会帮助,因为我需要模块外的作用域中的路径。 – dwikle 2013-03-13 03:00:05

回答

18

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

我想这就是你要找的。

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

由于toolic指出,在$显示语句中使用时,这样可能是一个更好的选择,转义序列%M会给你当前的层次结构。

+0

不完全 - 在某些其他上下文中,我仍然需要使用'\'HPATH'作为层次引用,因此将宏定义为字符串将不起作用。 – dwikle 2013-03-13 03:01:40