2016-02-05 39 views
0

我有这样一个宏:Systemverilog:有没有一种方法可以使信号在宏实例化模块中独一无二?

`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 {}和索引[]弄乱在模块实例名称自动分配。

我想解决这个问题,而不需要为信号名称添加另外的输入,并且在宏的外部没有临时信号。

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

或者是否有其他方法来统一信号名称,但保持合法?像atoi()这样的东西,使其成为基于信号名称的唯一编号?

回答

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中创建标识符所能做的限制。

+0

林不知道你的意思是'逃过名字' – user5888527

+1

请参阅部分_5.6.1转义标识符1800-2012的LRM –

+0

这适用于RTL。谢谢。 (不确定实现工具会喜欢它,但这是另一场战斗) – user5888527

0

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

您的宏可能会是这样:

`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); 
+0

谢谢,但我说我想要一个解决方案,而不添加一个参数。 – user5888527

+0

@ user5888527:我相信,没有其他选择,因为宏只能替代文本,与传递的参数完全相同。 –

+0

我不相信。应该有一些方法来处理就地字符串操作。我对verilog的非合成器一侧不熟悉。 – user5888527

相关问题