VHDLのIf-elseとCaseステートメントの違い


11

RTLでVHDLコードのさまざまなコンストラクトがどのように合成されるかを理解したいと思います。

  • 合成ツールによってRTL回路にコードがどのように推論されるかという点で、VHDLのプロセスのIf-Elseコンストラクトと Caseステートメントコンストラクトの違いを教えてください。
  • 複数のネストされたif-elseの場合と、プロセス内でif-elseコンストラクトとケース文を混合する場合を検討してください。
  • また、どの構成を使用するのですか?

PS:「vhdlで処理中の複数のifステートメント」という関連する質問を見たことがありますが、それでも私の質問には答えられません。


物理的なゲートの設定方法についてはコメントできませんが、x86アセンブリを出力するほとんどのコンパイラでは、if-elseは通常、条件付きジャンプ(jg、jl、jz、jnzなど)を持つ単一のチェックとして存在します。一方、switchはケースを番号順に整理し、反復dec/ jz命令を実行します。これははるかに効率的です。おそらく同様の最適化がここで適用されます。
多項式

@Polynomial If-elseとcaseの動作は、典型的な線形プログラミングと比較してハードウェア言語で大きく異なります。HDLステートメントは「即座に」実行されるため、オペコードの最適化はあまり重要ではありません。
W5VO

回答:


10

合成ツールによってRTL回路にコードがどのように推論されるかという点で、VHDLのプロセスのIf-ElseコンストラクトとCaseステートメントコンストラクトの違いを教えてください。

if-elsif-elseコンストラクトは、ネットワークのルーティングの優先度を推測します:

回路図

この回路のシミュレーションCircuitLabを使用して作成された回路

これは

if bool_expr_1 then
    sig <= val_expr_1;
elsif bool_expr_2 then
    sig <= val_expr_2;
elsif bool_expr_3 then
    sig <= val_expr_3;
else
    sig <= val_expr_4;
end if;

caseコンストラクトは、他の一方で、大きな老いたマルチプレクサを推論します:

ここに画像の説明を入力してください

これは

case case_expr is
  when c0 =>
    sig <= val_expr_0;
  when c1 =>
    sig <= val_expr_1;
  when c2 =>
    sig <= val_expr_2;
      ...
  when others =>
    sig <= val_expr_N;
end case;

明らかに、これらは1つの値式のみを含む非常に単純化されたデザインであり、1つの出力になります。

複数のネストされたif-elseの場合と、プロセス内でif-elseコンストラクトとケース文を混合する場合を検討してください。

上記により、どのようにネスト/ミックスされるかを確認できます。

また、どの構成を使用するのですか?

以来if-else推論優先順位は、複数の入力条件が発生する可能性があるときに使用されるべきです。case入力が相互に排他的である場合、一方を使用するのが適切です。


case statmentは単一の入力条件に対してのみ機能し、if-elseは複数の入力条件に対して機能することを理解しています。ただし、どちらの構成も基本的にmuxesを生成します(clkがない場合)。論理合成が、単一入力if-elseをmuxのチェーンではなく単一の大きなmuxに最適化する可能性はありませんか?また、優先ルーティングネットワークとは...これは1つの大きなmuxではなく、単にmuxのチェーンではありませんか?
ヌラバ

さらに、クロックに敏感なプロセスがある場合、if-elseはレジスタ、ラッチなどのシーケンシャル要素を生成できます。caseステートメントはシーケンシャルロジックも生成できますか?
ヌラバ

はい、優先ルーティングネットワークはまさに​​それです-マルチプレクサのチェーン。if-elseただし、構造の性質は、その連鎖が生じる場所です。2番目の条件をテストするには、最初の条件失敗する必要あります。これは、caseコンストラクトの場合ではありません。これが、if-elseステートメントを単一の大きなマルチプレクサとして合成できなかった理由です。
アンジェロスタブロー

1
そして、もちろん、caseステートメントはシーケンシャルロジックも生成できます。グラスゴー大学の一連の講義スライドである「Real World VHDL」を見つけました。これは参考になるかもしれません。
アンジェロスタブロー

これは良いリファレンスです。
ヌラバ

4

、この古いブログの記事、著者が書いたとVHDLコードの2つの機能的に同等のバージョンを合成しました。1つはif-elseを使用し、もう1つはケースを使用します。結果:

このコードを合成し、正確な結果を得ました。RTL回路図でさえ、両方のプログラムでまったく同じでした。

そして彼の結論:

これは、「case」ステートメントと「if ... elsif ... else」ステートメントの両方が同等に効率的であることを示しています。出力は多数の条件に依存しますが、条件の数が非常に少ない場合(2または3)、「if..elseif..else」を使用できます。

また、考えられるすべての言語のスタックオーバーフローに関するこの主題に関する多数の投稿があります。結論は一般的に同じであり、パフォーマンス面で違いはありません。場合によっては、多数のケースがある場合、コンパイラーは、パフォーマンスがわずかに向上するルックアップテーブルを作成するのに十分賢い場合があります。

VHDLシンセサイザーでも同様のことができる場合があります。ただし、多数のオプションがある場合は読みやすくなるため、caseステートメントを使用したい場合(caseを意図した場合)には依然として多数のケースが必要になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.