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;
endcaseselが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の比較
| Case | If-Else | |
|---|---|---|
| 最適な用途 | 1つの変数に対する複数の値 | 複雑な条件 |
| 読みやすさ | 非常に明快 | 複雑になりがち |
| 例 | マルチプレクサ、デコーダ | コンパレータ、範囲チェック |
チャレンジ
case文を完成させる
やること:
このマルチプレクサが動作するように、不足している case 文を追加してください。
仕組み:
select = 2'b00のとき、result = in0select = 2'b01のとき、result = in1select = 2'b10のとき、result = in2select = 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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ