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

时间:2016-02-05 14:26:51

标签: string macros verilog system-verilog

我有一个像这样的宏:

`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()这样的东西使它成为一个基于信号名称的唯一数字?

2 个答案:

答案 0 :(得分: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中创建标识符所能做的限制。

答案 1 :(得分:0)

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

您的宏可能如下所示:

valgrind

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

`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]) );