Systemverilog:有没有办法在宏实例化模块时使信号唯一?

Systemverilog: Is there a way to make signal unique in macro instantiating a module?

我有这样一个宏:

`define BOB_STAGE(_BUS_IN, _BUS_OUT) \
   bob_module auto_``_BUS_OUT``_bob_module ( .bus_in(_BUS_IN), .bus_out(_BUS_OUT) );

(注意 _BUS_OUT 成为实例名称的一部分以创建唯一实例。)

所以这些被广泛使用,并将连接的信号输入到 1 个信号输出中,但输出信号被索引。

使用示例:

`BOB_STAGE( {A,B,C,D}, OUT[1] );

问题是 concat {} 和 index [] 都扰乱了模块实例名称中的自动分配。

我想在不为信号名称添加另一个输入并且在宏外部没有临时信号的情况下解决这个问题。

有什么方法可以将带有索引的输出信号名称转换为唯一的字符串...例如使用 $sformatf 然后用下划线替换索引括号?

或者是否有其他方法可以统一信号名称但保持其合法性?像 atoi() 这样的东西让它成为一个基于信号名称的唯一数字?

您可以在宏中再添加一个参数来解决问题。

您的宏可能如下所示:

`define BOB_STAGE(_BUS_IN, _BUS_OUT, _NO) \
   bob_module auto_``_BUS_OUT``_``_NO``_bob_module ( .bus_in(_BUS_IN), .bus_out(_BUS_OUT[_NO]) );

现在您的宏用法将如下所示:

`BOB_STAGE( {A,B,C,D}, OUT, 1 );

您可以转义名称以允许在标识符中使用符号

`define BOB_STAGE(_BUS_IN, _BUS_OUT) \
   bob_module \auto_``_BUS_OUT``_bob_module ( .bus_in(_BUS_IN), .bus_out(_BUS_OUT) );

`BOB_STAGE( {A,B,C,D}, OUT[1] );

会变成

bob_module \auto_OUT[1]_bob_module ( .bus_in(_BUS_IN), .bus_out(_BUS_OUT) );

这确实是您在 SystemVerilog 中创建标识符的极限。