1

コンストラクトdo <blah> while (0)はシステム Verilog で合成可能ですか?

この構文を使用して保護したい複雑なマクロがいくつかあるため、質問します。

例えば

`define my_macro(arg1) \
    do \
         my_reg <= arg1; \
         valid <= 1; \
    while (0)

または、私が使用できる同様の Verilog コンストラクトがあります。Verilog は、より多くのツールで使用されるため、優先されます。

4

4 に答える 4

2

for、while、do...while、repeat などの SystemVerilog のループ コンストラクトは、最新のロジック シンセサイザーで合成できますが、これは、条件式を展開して、エラボレーション (またはコンパイル時) 中に計算できる場合に限られます。ツールはコンパイラのループ展開技術を採用しているだけなので、ツールにとっては問題ありません。このように、ループの終了条件を決定するために、コンパイル時に条件式を計算する必要があります (実行時に動的に変更することはできません)。

場合によっては、ループに終了条件がある場合でも、ループの展開がしきい値 (1k や 10k など) を超えないようにツールに制限を設けて、ループの展開とループ本体の展開に多くの時間を費やさないようにすることがあります (ツールにはわかりません)。制限、終了条件の試行とテストを続けるだけです)

次の例では、ループを合成できます。

for (i=0; i < 10; i=i+1)
for (i=0; i < WIDTH; i=i+1)  // if WIDTH is a constant, or a parameter

for (i=0; i < 10; i=i+1) begin
  ...
  if (i > 5) break;          // `continue' and `break' are also supported if the loop
                             // follows the synthesizable rules.
  ...
end
于 2012-11-05T13:23:02.377 に答える
0

これに対するコメントで私が言ったことを拡張したいだけです:

開始と終了の何が問題になっていますか? – ポール S 昨日

@PaulS: それから my_macro(1); end まで展開します。末尾のセミコロンは構文エラーです。そして、私のマクロを呼び出した人は、それが単一のステートメントか複数のステートメントかをどのようにして知るのでしょうか? (または、変更される可能性さえあります...) – 昨日のデイブ

UVM ライブラリでは、次のイディオムが広く使用されています。

`define uvm_info(ID,MSG,VERBOSITY) \
   begin \
     if (uvm_report_enabled(VERBOSITY,UVM_INFO,ID)) \
       uvm_report_info (ID, MSG, VERBOSITY, `uvm_file, `uvm_line); \
   end

マクロの末尾にセミコロンを付けたので、IES が構文エラーを報告したことは一度もありません。確かに、構文エラーであるかどうかは仕様でわかりませんが、null ステートメントとして解釈されると思います。

いずれにせよ、 ifmy_macroが単一のステートメントである場合は、その;. 次に、単一ステートメント マクロと複数ステートメント マクロが同じように機能します。

于 2012-11-09T13:21:59.297 に答える
0

いいえ、そうではありません....より良い使用開始....終了

于 2012-11-23T05:46:24.027 に答える