特殊値 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 ZVerilogで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信号は必ず初期化する
チャレンジ
X と Z を含む正しい値を書いて、コードを完成させましょう。
やること:
aに、ビット 1 が不定(その他は 0)の 4 ビット値を設定するcに、すべてのビットが不定(4 ビット)の値を設定する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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ