CasexとCasez
CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 56/90。
値の中の特定のビットだけが重要で、ほかのビットは無視してよい場合があります。たとえば、優先エンコーダーでは、ほかのビットに関係なく、最初の1ビットを見つけます。
通常のcase文では、ドントケアビットの考えられるすべての組み合わせを列挙する必要がありますが、幅の広いバスでは不可能です。
casezとcasexを使うと、?、z、またはxを使って特定のビットを「無視してよい」と指定できるため、この問題を解決できます。
Casez と Casex と通常の Case
| 文 | 任意のビット | 最適な用途 |
|---|---|---|
case | なし | 完全一致 |
casez | z または ? | 優先エンコーダー(推奨) |
casex | x、z、または ? | 避ける(バグを隠す) |
casezはzまたは?のビットを無視します(推奨)casexはxのビットも無視するため、シミュレーションエラーが隠れる可能性があります
必ずcasezを使い、casexは使わないでください。casexは、xの値(未初期化のレジスタやシミュレーションエラーを示すことが多い)を無視するため、危険です。casezはxを don't-care として扱わないため、より安全な代替手段です。
例
casez (data)
4'b???1: out = 0; // Bit0 must be 1, others don't matter
4'b??1?: out = 1; // Bit1 must be 1, others don't matter
4'b?1??: out = 2; // Bit2 must be 1, others don't matter
4'b1???: out = 3; // Bit3 must be 1, others don't matter
endcase? は「どちらでもよい」という意味です。そのビットは 0、1、または何でもかまいません。
チャレンジ
すること:
このデコーダーが動作するように、不足しているcasez文を追加してください。
仕組み:
input = 4'b???1→out = 4'b0001input = 4'b??1?→out = 4'b0010input = 4'b?1??→out = 4'b0100input = 4'b1???→out = 4'b1000- デフォルト →
out = 4'b0000
自分で試してみよう
module decoder (
input [3:0] in,
output reg [3:0] out
);
always @(*) begin
// TODO: casez文を追加する
// in = 4'b???1 -> out = 4'b0001
// in = 4'b??1? -> out = 4'b0010
// in = 4'b?1?? -> out = 4'b0100
// in = 4'b1??? -> out = 4'b1000
// default -> out = 4'b0000
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ