2016-02-05 70 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

相關問題