casex と casez
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 56/90。
値の中の特定のビットだけに注目し、他のビットは無視したい場合があります。例えば、プライオリティエンコーダでは、他のビットの状態に関わらず、最初の 1 ビットを見つけ出す必要があります。
通常の case 文では、ドントケア・ビットのあらゆる可能な組み合わせを列挙する必要がありますが、これはビット幅の広いバスでは不可能です。
<strong>casez</strong> と <strong>casex</strong> は、?、z、または x を使用して特定のビットを「ドンケア」としてマークできるようにすることで、この問題を解決します。
Casez vs Casex vs 通常の Case
| ステートメント | Don't-Care ビット | 最適な用途 |
|---|---|---|
case | なし | 完全一致 |
casez | z または ? | プライオリティ・エンコーダ(推奨) |
casex | x、z、または ? | 非推奨(バグを隠す可能性があるため) |
<strong>casez</strong>はzまたは?であるビットを無視します(推奨)<strong>casex</strong>はxビットも無視します — これはシミュレーションエラーを隠してしまう可能性があります
常に <strong>casez</strong> を使用し、<strong>casex</strong> は使用しないでください。casex が最初に作成されましたが、エンジニアはそれが 危険 であることに気づきました。なぜなら、x の値(多くの場合、未初期化のレジスタやシミュレーションエラーを示します)を無視してしまうからです。casez は、より安全な代替手段として導入されました。
例
casez (data)
4'b???1: out = 0; // Bit0は1である必要があり、他は問いません
4'b??1?: out = 1; // Bit1は1である必要があり、他は問いません
4'b?1??: out = 2; // Bit2は1である必要があり、他は問いません
4'b1???: out = 3; // Bit3は1である必要があり、他は問いません
endcase? は「don't care」を意味します — そのビットは 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- Default →
out = 4'b0000
チートシート
casez は、? または z を使用したドントケア(don't-care)ビットによるパターンマッチングを可能にします。これは、特定のビットのみが重要となるプライオリティエンコーダなどで便利です。
| ステートメント | ドントケアビット | 備考 |
|---|---|---|
case | なし | 完全一致 |
casez | z または ? | 推奨 |
casex | x, z, または ? | 非推奨 — バグを隠蔽する可能性がある |
常に casex よりも casez を優先してください。casex は x 値を無視するため、初期化されていないレジスタやシミュレーションエラーを隠してしまう可能性があります。
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
default: out = 0;
endcase? は「ドントケア」を意味し、そのビットは 0、1、または何であっても構いません。
自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。