防止Systemverilog文本替换宏中的参数替换

时间:2014-10-27 18:43:45

标签: system-verilog

`define CONNECT(i) \
  some_mod inst1 (.i(i));

module test ();
 logic a;
 `CONNECT(a)
endmodule

在CONNECT宏中,如何防止在“some_mod inst1(.i(i));”的“.i”部分中为“i”换入“a”?我正在寻找这样的扩展版本:

module test ();
 logic a;
 some_mod inst1 (.i(a));
endmodule

而不是以下错误的版本

module test ();
 logic a;
 some_mod inst1 (.a(a));
endmodule

我知道我可以将some_mod的端口名称设置为“i”之外的其他名称,或者将宏参数名称从“i”更改为其他名称。我只是想知道我想要做什么是可行的。

3 个答案:

答案 0 :(得分:4)

由于您已经知道some_mod模块的所有端口名称,因此您只需为宏选择一个唯一的字符串。假设some_mod没有名为SIG的端口:

`define CONNECT(SIG) \
  some_mod inst1 (.i(SIG));

更新:回答新问题:不,在提到IEEE Std 1800-2012后,选择性地避免某些替换是不可行的。

更新2:正如斯坦已经证明的那样,有一个棘手的解决方案;因为它不是直截了当的,所以应该进行大量评论。

答案 1 :(得分:2)

您需要标记您不想替换的位置。虽然我不确定这比简单地替换参数名称(即工具的答案)更好,但是可以这样做 - 使用默认宏参数的一点创造力。假设您想要标记所有不应该用下划线替换'i'的地方,那么您将执行以下操作:

`define CONNECT(i, _i=i) \
  some_mod inst1 (._i(i))

由于Verilog预处理器只通过宏,它将用传入的值替换所有'i'实例,然后将所有'_i'实例更改为'i'。

答案 2 :(得分:0)

您可以在宏中的单词内的任何位置放置双反引号 (``),这在宏替换方面将单词一分为二,但 `` 本身在进一步编译之前被删除。

因此,如果您想要防止替换的内容超过一个字母的长度,您可以在某处插入一个 ``(并确保任何一半都不会被替换)。

对于单个字母的单词,这是行不通的。类似于 Stan's answer(但我希望更直观和更好的支持)你可以 `define i i 然后在你的宏中使用 `i(用 `i 污染全局宏命名空间宏...).