2016-12-15 13 views
0

私は、次のマクロがあります引用マクロリテラル文字列引数

`define check(CONDITION) \ 
    begin \ 
    if (!(CONDITION)) \ 
     $display("'%s' failed.", `"CONDITION`"); \ 
    end 

そして、次の拡張:

module test; 
    initial begin 
    `check(0) 
    `check(1 == 0) 
    end 
endmodule 

彼らは、次の印刷:

'0' failed. 
'1 == 0' failed. 

私が持っている場合をしかし、文字列を条件とすると、マクロ展開は正しく機能しません。私が望む何

`check("foo" == "bar") 

が、しかし、印刷された以下のしていることです:具体的には、以下の行を追加するとコンパイルエラーにつながるマクロ本体を書くための方法はあり

'"foo" == "bar"' failed. 

ことこれを許可するだろうか?私は2つのマクロを持つ解決法を避けたいと思います.1つは文字列が条件の中で許されないもの、もう1つは明示的に文字列です。

答えて

1

これは、SystemVerilogの1つのマクロでは実行できません。これが動作するには、PERLのqq()演算子のようなものが必要です。

+0

私は言語そのものを使ってそのような演算子を作ることはできません。 VPIを使ってシステム関数の引数を解析し、それを文字列として返すという考えはありますか?ソースコードのイントロスペクションを含む、イントロスペクションにはかなり強力な機能がいくつかあることがわかりました。 –

+0

VPIでこれを行うのはかなり複雑です。そしてそれは、ツールが必要とされるすべてのVPIルーチンを実装していると仮定しています。 –

+0

確かに、それは素晴らしい運動のために作るかもしれません。うまくいけば私のツールはどちらも失望しないだろう。 –

関連する問題