Menu
Coddy logo textTech

case 文

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 55/90。

case 文を使用すると、単一の式の値に基づいて多くの異なるアクションの中から選択することができます。同じ変数を多くの異なる値と比較する場合、複数の if-else 文を使用するよりもすっきりとした代替手段となります。

case文は、式を一連の値と比較し、一致するブロックを実行します。これは多方向分岐のようなものです。

構文:

case (expression)
  value1: statement1;
  value2: statement2;
  default: default_statement;
endcase

組合せ回路の <strong>case</strong> 文には、常に <strong>default</strong> を含めることが強く推奨されます。default がないと、もし sel が予期しない値(XZ など)をとった場合、out は代入されず、以前の値をラッチします。これにより、純粋な組合せ回路ではなく、意図しないメモリ(ラッチ)が生成されます。

簡単な例

case (sel)
  2'b00: out = a;
  2'b01: out = b;
  2'b10: out = c;
  default: out = 0;
endcase

sel00 の場合、outa になります。sel01 の場合、outb になります。sel10 の場合、outc になります。

そうでなければ、out0 になります。

ケースごとの複数ステートメント

複数のステートメントを使用する場合は、beginendを使用します:

case (state)
  2'b00: begin
    out = a;
    flag = 1;
  end
  2'b01: begin
    out = b;
    flag = 0;
  end
  default: out = 0;
endcase

重要なルール

ルール説明
すべてのcase値は一意である必要があります重複する値は許可されません
値はビット幅と一致する必要があります2'b01であり、1'b1ではありません
defaultは任意ですが、推奨されますマッピングされていない値をキャッチします
defaultがない場合、マッピングされていない値はラッチを生成します組合せ回路において

Case と If-Else

 CaseIf-Else
最適な用途1つの変数、多数の値複雑な条件
可読性非常に明確煩雑になりやすい
マルチプレクサ、デコーダ比較器、範囲チェック
challenge icon

チャレンジ

Case文を完成させる

やるべきこと:

不足している case 文を追加して、このマルチプレクサを動作させてください。

仕組み:

  • select = 2'b00 のとき、result = in0
  • select = 2'b01 のとき、result = in1
  • select = 2'b10 のとき、result = in2
  • select = 2'b11 のとき、result = in3

チートシート

case 文は、単一の式に基づいて複数のアクションの中から選択します。これは、連鎖した if-else に代わる、よりクリーンな選択肢です。

case (expression)
  value1: statement1;
  value2: statement2;
  default: default_statement;
endcase

分岐ごとに複数のステートメントを使用する場合は、begin/end を使用します。

case (sel)
  2'b00: out = a;
  2'b01: begin
    out = b;
    flag = 1;
  end
  default: out = 0;
endcase

組合せ回路では、常に default を含めてください。 これがないと、一致しない値(例:XZ)によって出力が以前の値を保持してしまい、意図しないラッチが生成されます。

主なルール:

  • すべての case 値は一意である必要があります
  • 値は式のビット幅と一致している必要があります(例:1'b1 ではなく 2'b01
  • 1つの変数に対して多くの値を比較する場合は case を使用し、複雑な条件や範囲条件の場合は if-else を使用します

自分で試してみよう

module mux4 (
  input [1:0] select,
  input in0, in1, in2, in3,
  output reg result
);
  
  always @(*) begin
    // TODO: case文を追加
    // select=00 -> result = in0
    // select=01 -> result = in1
    // select=10 -> result = in2
    // select=11 -> result = in3
    // デフォルト -> result = 0
  end
  
endmodule
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン