Menu
CoddyTech

Case文

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

case文を使うと、1つの式の値に基づいてさまざまな処理から選択できます。同じ変数をさまざまな値と比較する場合、複数のif-else文を使うよりも簡潔に記述できます。

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

構文:

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

組み合わせ回路のcase文には、常にdefaultを含めることを強く推奨します。defaultがない場合、selがどのcase項目にも列挙されていない値を取ると、outには値が代入されず、以前の値が保持されます。0と1のビットだけで構成されるselの値に対応する分岐がないと、合成では純粋な組み合わせ論理ではなく、意図しないメモリ(ラッチ)が生成されます。シミュレーションでは、selがXまたはZの場合もoutは変化しませんが、ラッチは生成されません。

簡単な例

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

selが00の場合、outにはaが入ります。selが01の場合、outにはbが入ります。selが10の場合、outにはcが入ります。

それ以外の場合、out は 0 になります。

1つのcaseに複数の文を記述する

複数の文にはbeginとendを使います:

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

重要なルール

ルール説明
caseの値は一意である必要があります重複がある場合、最初に一致した分岐だけが実行されます
値はビット幅と一致させる必要があります1'b1ではなく2'b01と記述します(短い値はゼロで埋められます)
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

自分で試してみよう

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オンラインコンパイラ