2015-09-16 103 views
0

我試圖在System Verilog中對宏進行串聯處理,以便我可以在字符串中使用它進行打印。如何從具有參數的預處理器宏創建字符串

我創建了一個字符串化宏:

`define STRINGIFY(x) `"x`" 

的建議在這裏: How to create a string from a pre-processor macro

不過,我試圖字符串化宏帶有參數。

考慮下面的代碼:

`define STRINGIFY(x) `"x`" 
`define HPATH(signal) top.chip.block.signal 
string hpath = `STRINGIFY(`HPATH(wire)); 
$display(hpath);      // Output: "`HPATH(wire)" 

我所要的輸出是 "top.chip.block.wire" 代替。

請注意,HPATH宏需要參數wire

這是示例代碼運行在這裏:http://www.edaplayground.com/x/CKB

編輯: 的問題是`字符串化宏停止宏觀內的擴張當宏內部有爭論。 例如:

`define STRINGIFY(x) `"x`" 
`define HPATH top.chip.block 
`define HPATH_SIGNAL(signal) top.chip.block.signal 

$display(`"`HPATH`"); // correctly outputs "top.chip.block" 
$display(`STRINGIFY(`HPATH)); // correctly outputs "top.chip.block" 
$display(`"`HPATH_SIGNAL(sig)`"); // correctly outputs "top.chip.block.sig" 
$display(`STRINGIFY(`HPATH_SIGNAL(sig))); // incorrectly outputs "`HPATH_SIGNAL(sig)" 

看來,`HPATH_SIGNAL(SIG)嵌套在`字符串化宏內部時沒有解決

的問題是,爲什麼在過去的擴大不是HPATH_SIGNAL(SIG)線?

這裏的示例代碼運行: http://www.edaplayground.com/x/RF2

回答

0

的`「覆蓋的普通詞彙意義」,並表示該擴展應包括引號,實際參數替換,嵌入式宏的擴展。這允許從宏參數構造字符串文字。

在宏文本中允許有``和`'的混合,但是「總是啓動一個字符串,並且必須有一個終止」。嵌入在這個字符串文字中的任何字符,包括「,the」將啓動一個字符串,其最後一個字符被「of」終止。

`define HPATH(signal) `"top.chip.block.signal`" 
`define W wire 
module a; 
    initial begin 
    string hpath = `HPATH(wire); 
    //string hpath = `HPATH(`W); 
    $display("%s",hpath); 
    end 
endmodule 

輸出:top.chip.block.wire

希望你能理解的` 「和」(或只是一個宏定義)

+0

嗯,我仍然想使用HPATH宏作爲分層路徑(不含引號)。自從我縮小這個問題之後,我會修改我的問題。 –

0

我不同意的情況下隨着你在EDA遊樂場上獲得的輸出。我正在使用ModelSim/Questa獲得所需的輸出。無論在哪裏宏參數文本正在通過外微距過後或之前擴大的(LRM的說:)的`」應該允許這是通過將擴大通過宏。

+0

是的,當使用VCS 2014和舊版本的Icarus Verilog模擬器運行時,問題出現在EDA遊樂場中。 –

0

這似乎是一個VCS問題。

當同一代碼在伊卡洛斯的Verilog 0.10.0裏維埃拉-PRO EDU 2015.06運行模擬器的輸出是正確的。

使用VCS 2014.12模擬器運行時出現此問題。