我有一个像这样的宏:
`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()这样的东西使它成为一个基于信号名称的唯一数字?
答案 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]) );