Menu
Coddy logo textTech

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なし完全一致
casezz または ?プライオリティ・エンコーダ(推奨)
casexxz、または ?非推奨(バグを隠す可能性があるため)
  • <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、または何でもかまいません。

challenge icon

チャレンジ

作業内容:

不足している casez 文を追加して、このデコーダを動作させてください。

動作の仕組み:

  • input = 4'b???1out = 4'b0001
  • input = 4'b??1?out = 4'b0010
  • input = 4'b?1??out = 4'b0100
  • input = 4'b1???out = 4'b1000
  • Default → out = 4'b0000

チートシート

casez は、? または z を使用したドントケア(don't-care)ビットによるパターンマッチングを可能にします。これは、特定のビットのみが重要となるプライオリティエンコーダなどで便利です。

ステートメントドントケアビット備考
caseなし完全一致
casezz または ?推奨
casexx, z, または ?非推奨 — バグを隠蔽する可能性がある

常に casex よりも casez を優先してください。casexx 値を無視するため、初期化されていないレジスタやシミュレーションエラーを隠してしまう可能性があります。

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

? は「ドントケア」を意味し、そのビットは 01、または何であっても構いません。

自分で試してみよう

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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン