`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”更改为其他名称。我只是想知道我想要做什么是可行的。
答案 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
污染全局宏命名空间宏...).