Menu
CoddyTech

特殊値 X と Z

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

X と Z は、シミュレーション中のハードウェアの状態に関する情報を示す特別な値です。

X(不明):デバッグ用

X は、設計に問題があることを示すためにシミュレーション中に表示されます。

Xが表示された場合、次のような意味であることがよくあります。

  • 未初期化レジスタ:値を設定する前に使用してしまっています
  • 複数のドライバー:異なる2つのものが同時に同じワイヤーを制御しようとしています
  • タイミング違反:信号が不適切なタイミングで変化し、不安定な状態が生じています

Xは実際のハードウェアには存在しません。これは設計に問題があることを知らせてくれるシミュレーションツールで、実際のチップを作る前に問題を修正できます。

Xがなければ、ランダムな0や1が表示されても、問題があることに気づかないかもしれません。Xによってバグが見えるようになります。

よくある原因:

reg a;           // 初期状態では X(不定)
wire b;
assign b = a;    // a が X なので b も X になる

Z(高インピーダンス)

Zは高インピーダンスまたは切断状態を表します。

  • 信号は、何にも駆動されていないときZになります
  • Zは「このワイヤは切断されている」という意味です
  • 三状態バッファや共有バスに使用されます

よくある原因:

wire c;          // 初期状態は Z(未接続)
assign c = 1'bZ; // Explicitly set to Z

VerilogでXとZを書く

XとZの値は、0や1と同じように代入できます。

reg [3:0] data;

data = 4'b10X0;    // Bit 1 is unknown (0-indexed from the right)
data = 4'b01Z1;    // ビット1は高インピーダンス
data = 4'bXXXX;    // All bits unknown
data = 4'bZZZZ;    // すべてのビットは高インピーダンス

波形におけるXとZ

シミュレーションの波形では:

  • Xは赤い線または「X」として表示されます
  • Zは中央の線または「Z」として表示されます

これらは、信号が不明または切断されている場所を示すことで、設計のデバッグに役立ちます。

重要な注意事項

  • Xは論理演算を通じて伝播します(X AND 0 = 0、ただしX AND 1 = X)
  • Zは通常、三状態バスに使用されます
  • 論理合成では、XとZが異なる扱いを受ける場合があります
  • シミュレーションでXが発生しないよう、reg信号は必ず初期化する
challenge icon

チャレンジ

X と Z を含む正しい値を書いて、コードを完成させましょう。

やること:

  1. a に、ビット 1 が不定(その他は 0)の 4 ビット値を設定する
  2. c に、すべてのビットが不定(4 ビット)の値を設定する
  3. d に、すべてのビットがハイインピーダンス(4 ビット)の値を設定する

自分で試してみよう

module xz_challenge;
  wire [3:0] a, c, d;
  
  assign a = 4'b______;   // Bit 1 is X (others 0)
  assign c = 4'b______;   // すべてのビットがX
  assign d = 4'b______;   // All bits Z
  
  initial begin
    $display("a = %b", a);
    $display("c = %b", c);
    $display("d = %b", d);
    $finish;
  end
  
endmodule
quiz icon腕試し

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

基礎のすべてのレッスン

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