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

问题描述 投票:0回答:3
`define CONNECT(i) \
  some_mod inst1 (.i(i));

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

在 CONNECT 宏中,如何防止

a
被替换为
i
的“.i”部分中的
some_mod inst1 (.i(i));
?我正在寻找这样的扩展版本:

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

而不是下面的版本是错误的

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

我知道我可以将

some_mod
的端口名称设为
i
以外的名称,或者将宏参数名称从
i
更改为其他名称。我只是想知道我想做的事情是否可行。

verilog system-verilog
3个回答
4
投票

由于您已经知道

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

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

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

更新 2:正如斯坦所证明的,有一个棘手的解决方案;因为它并不简单,所以应该大量注释。


2
投票

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

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

由于 Verilog 预处理器仅执行一次宏,因此它将用您传入的值替换所有“i”实例,然后将所有“_i”实例更改为“i”。


0
投票

您可以在宏中的单词内的任何位置放置双反引号 (

``
),这会根据宏替换将单词分成两部分,但
``
本身会在进一步编译之前被删除。

因此,如果您想要阻止替换的内容超过一个字母长,您可以在某处插入

``
(并确保两半都不会被替换)。

对于单个字母的单词,这是行不通的。类似于 Stan 的答案(但我希望更直观和更好的支持),您可以

`define i i
,然后在宏中使用
`i
(使用
`i
宏污染全局宏命名空间...)。

© www.soinside.com 2019 - 2024. All rights reserved.