Menu
CoddyTech

CasexとCasez

CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 56/90。

値の中の特定のビットだけが重要で、ほかのビットは無視してよい場合があります。たとえば、優先エンコーダーでは、ほかのビットに関係なく、最初の1ビットを見つけます。

通常のcase文では、ドントケアビットの考えられるすべての組み合わせを列挙する必要がありますが、幅の広いバスでは不可能です。

casezとcasexを使うと、?、z、またはxを使って特定のビットを「無視してよい」と指定できるため、この問題を解決できます。

Casez と Casex と通常の Case

文任意のビット最適な用途
caseなし完全一致
casezz または ?優先エンコーダー(推奨)
casexx、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、または何でもかまいません。

challenge icon

チャレンジ

すること:

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

仕組み:

  • input = 4'b???1 → out = 4'b0001
  • input = 4'b??1? → out = 4'b0010
  • input = 4'b?1?? → out = 4'b0100
  • input = 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
quiz icon腕試し

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

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ