`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
更改为其他名称。我只是想知道我想做的事情是否可行。
由于您已经知道
some_mod
模块的所有端口名称,因此您只需为宏选择一个唯一的字符串即可。假设 some_mod
没有名为 SIG
的端口:
`define CONNECT(SIG) \
some_mod inst1 (.i(SIG));
更新:回答新问题:不,参考IEEE Std 1800-2012后,选择性地避免某些替换是不可行的。
更新 2:正如斯坦所证明的,有一个棘手的解决方案;因为它并不简单,所以应该大量注释。
您需要标记不想替换的位置。虽然我不确定这比简单地替换参数名称(即工具的答案)更好,但可以通过使用默认宏参数发挥一点创造力来做到这一点。假设您想要标记所有不应将“i”替换为下划线的位置,那么您将执行以下操作:
`define CONNECT(i, _i=i) \
some_mod inst1 (._i(i))
由于 Verilog 预处理器仅执行一次宏,因此它将用您传入的值替换所有“i”实例,然后将所有“_i”实例更改为“i”。
您可以在宏中的单词内的任何位置放置双反引号 (
``
),这会根据宏替换将单词分成两部分,但 ``
本身会在进一步编译之前被删除。
因此,如果您想要阻止替换的内容超过一个字母长,您可以在某处插入
``
(并确保两半都不会被替换)。
对于单个字母的单词,这是行不通的。类似于 Stan 的答案(但我希望更直观和更好的支持),您可以
`define i i
,然后在宏中使用 `i
(使用 `i
宏污染全局宏命名空间...)。