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 が予期しない値(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 になります。
ケースごとの複数ステートメント
複数のステートメントを使用する場合は、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値は一意である必要があります | 重複する値は許可されません |
| 値はビット幅と一致する必要があります | 2'b01であり、1'b1ではありません |
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
チートシート
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 を含めてください。 これがないと、一致しない値(例:X、Z)によって出力が以前の値を保持してしまい、意図しないラッチが生成されます。
主なルール:
- すべての 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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。