Menu
Coddy logo textTech

Case Statement

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

case statementを使うと、1つのexpressionの値に基づいて、さまざまなアクションの中から選択できます。同じ変数をさまざまな値と比較する場合、複数のif-else statementを使うよりもすっきりした方法です。

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

構文:

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 の場合、out には a が代入されます。sel01 の場合、out には b が代入されます。sel10 の場合、out には c が代入されます。

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

1つの case あたりの複数のステートメント

複数のステートメントには 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 ステートメントを Add します。

仕組み:

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

自分で試してみよう

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
    // default -> result = 0
  end
  
endmodule
quiz icon腕試し

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

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ