1. はじめに
Verilogはハードウェア記述言語(HDL)の一つであり、デジタル回路の設計に広く用いられています。その中でも、case
文は 条件分岐を効率的に記述する ための重要な構文です。特に 状態遷移(ステートマシン)や多路選択器(マルチプレクサ) の設計に頻繁に使用されます。
本記事では、Verilogのcase
文の基本から応用、使用時の注意点までを詳しく解説します。初心者でも理解しやすいように具体的なコード例を交えながら説明 していくので、ぜひ最後までご覧ください。
2. Verilogのcase
文の基本構文
case
文とは?
Verilogのcase
文は、与えられた条件(セレクタ)に基づいて異なる処理を実行するための構文 です。C言語のswitch-case
文と同様の働きをしますが、いくつかの特徴的な違いがあります。
基本構文は以下のようになります。
case (式)
条件1: 文1;
条件2: 文2;
条件3: 文3;
default: 文4; // どの条件にも一致しない場合
endcase
case
文の基本的な使い方
以下の例では、2ビットの入力sel
に応じて異なる信号をout
に割り当てるシンプルなcase
文を示しています。
module case_example(input [1:0] sel, output reg [3:0] out);
always @(*) begin
case (sel)
2'b00: out = 4'b0001;
2'b01: out = 4'b0010;
2'b10: out = 4'b0100;
2'b11: out = 4'b1000;
default: out = 4'b0000; // 万が一のためのデフォルト値
endcase
end
endmodule
このコードでは、sel
の値に応じてout
が異なる値を取るように設計されています。default
文を追加することで、想定外の入力が来た場合でも適切な動作が保証される ようになっています。
case
vs casex
vs casez
の違い
Verilogには、case
文の拡張として casex
と casez
というバリエーションがあります。これらはワイルドカードのように動作し、特定のビットを無視することができます。
文法 | 特徴 |
---|---|
case | 完全一致を求める(デフォルトの動作) |
casex | X (未定義値)やZ (高インピーダンス)を無視する |
casez | Z のみを無視する |
例えば、casex
の使用例を示します。
casez (sel)
2'b1?: out = 4'b1111; // 最上位ビットが1ならマッチ
2'b01: out = 4'b0001;
default: out = 4'b0000;
endcase
ここで1?
は、最上位ビットが1であれば下位ビットに関わらずマッチすることを意味します。

3. case
文の具体的な使用例
基本的な条件分岐
次の例では、8ビット入力opcode
の値に応じて異なる処理を行う簡単なCPUのデコーダを示します。
module decoder(input [7:0] opcode, output reg [3:0] control_signal);
always @(*) begin
case (opcode)
8'h00: control_signal = 4'b0001; // NOP
8'h01: control_signal = 4'b0010; // ADD
8'h02: control_signal = 4'b0100; // SUB
default: control_signal = 4'b0000; // 未定義命令
endcase
end
endmodule
ステートマシンでの利用
case
文は 状態遷移(FSM:Finite State Machine) の実装にもよく用いられます。
typedef enum reg [1:0] {IDLE, RUN, STOP} state_t;
state_t current_state, next_state;
always @(posedge clk) begin
if (reset)
current_state <= IDLE;
else
current_state <= next_state;
end
always @(*) begin
case (current_state)
IDLE: next_state = RUN;
RUN: next_state = STOP;
STOP: next_state = IDLE;
default: next_state = IDLE;
endcase
end
このコードは3状態のFSMを実装しています。状態管理が必要な回路では、case
文を用いることで分かりやすく記述できます。
4. case
文を使用する際の注意点
Verilogのcase
文を使用する際には、以下のポイントに注意する必要があります。
1. default
ケースを必ず記述する
case
文では 全ての可能な入力を網羅するように記述することが重要 です。特に、FPGAやASICで合成するときに、default
がないと 意図しないラッチが生成される可能性 があります。
2. casex
や casez
の使用には注意
casex
やcasez
を使うと、不要な信号がマッチしてしまう可能性 があります。そのため、これらを使う場合は 意図した動作になるかどうか十分にシミュレーション することが重要です。
casez (sel)
2'b1?: out = 4'b1111; // 最上位ビットが1ならマッチ
2'b01: out = 4'b0001;
default: out = 4'b0000;
endcase
このようなコードでは、予期しないマッチングが発生しないかを十分に確認する必要があります。
3. case
文を乱用しない
小規模な条件分岐であればif-else
の方が 直感的に理解しやすい ことがあります。case
文を使用する際は、複数の選択肢がある場合にのみ適用 するとよいでしょう。
5. まとめ
本記事では、Verilogのcase
文について以下の点を解説しました。
✅ case
文の基本構文と動作
✅ case
vs casex
vs casez
の違い
✅ case
文の具体的な使用例(条件分岐・ステートマシンなど)
✅ case
文を使う際の注意点
Verilogで回路設計を行う際に、case
文を適切に使うことで コードの可読性が向上し、設計ミスを防ぐ ことができます。今後の設計にぜひ活用してください!
次に学ぶべきVerilogの重要な概念
Verilog case
文を理解したら、次は 「always文」や「組み合わせ回路と順序回路」 について学ぶと、さらに理解が深まります!