4

$displayのように複数のパラメータを持つマクロを作成したいと思います。

私のコードはこのように見えますが、機能しません。

               `define format_macro(A) \
                      $write("%s", $sformatf(A)); \

これが私がformat_macroと呼んだ方法です。

               `format_macro("variable = %d", variable)

これどうやってするの?

4

3 に答える 3

10

$displayのように複数のパラメータを持つマクロを作成したいと思います。

できません。VerilogおよびSystemVerilogは、可変個引数マクロをサポートしていません。

これを文字列または出力のフォーマットに使用することが目標であり、あちこちに入力する必要がないようにする場合の回避策は次のとおりです$sformat単一の引数を持つようにマクロを定義し、その引数を。と組み合わせることができます$sformat。これを行う際の注意点は、マクロを使用するときに引数を括弧で囲む必要があることです。

()の'$sformatfはマクロの一部ではないことに注意してください。

`define format_macro(A) \
        $write("%s", $sformatf A ); \

次に、これを行うことができます:

  `format_macro(("a = %d", a))
  `format_macro(("a = %d, b = %d", a, b))

ところで、 UVMでメッセージングをカスタマイズする方法を示す優れたスクリーンキャストがここにあります。その中で、作成者は、UVMを使用している場合のその他の優れたヒントとともに、このマクロ手法を示しています。

于 2012-10-12T14:28:01.953 に答える
2

マクロに2つの引数を渡していますが、マクロに"variable = %d"variable1つの入力しか定義されていません。質問を読むと、必要なのは複数の引数ではなく、可変数である可能性があります。

静的リストの場合は、テキストをフォーマットするためのマクロ設定があります。

`define say(n) $display("cowsay : %s", n);

initial begin
  `say("Moo")
end
=>cowsay : moo

または、最初に文字列を作成し、単一の引数として渡します。

`define say(n) $display("%s", n);

string msg;

initial begin 
  $sformat(msg, "variable is : %d", 3);
  `say(msg)
end
=>variable is :           3
于 2012-10-12T09:46:15.707 に答える
2

SystemVerilogは、オプションのマクロパラメータをサポートするようになりました。これにより、次のような巧妙なクラッジを作成できます。http: //ionipti.blogspot.com/2012/08/systemverilog-variable-argument-display.html

これにより、マクロ内のメッセージ形式を変更できます(「ERROR」を付加するか、ファイルと行番号など、好きなものを追加します)。これは、すべてのパラメーターを括弧で囲む上記のアプローチでは実行できません。

于 2013-11-09T23:12:00.800 に答える