特殊な値 X と Z
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 17/90。
XとZは、シミュレーション中のハードウェアの状態に関する情報を提供する特別な値です。
X (未知) — デバッグ用
Xは、設計の問題を示すためにシミュレーションに表示されます。
Xが表示される場合、多くは以下のことを意味します:
- 未初期化のレジスタ — 使用する前に値を設定し忘れています
- マルチドライバ(多重駆動) — 2つの異なる要素が同時に同じワイヤを制御しようとしています
- タイミングバイオレーション — 信号が不適切なタイミングで変化し、不安定な状態が発生しています
Xは実際のハードウェアには存在しません。これは、設計に問題があることを知らせるシミュレーションツールであり、実際のチップを製造する前に修正できるようにするためのものです。
Xがなければ、ランダムな0や1が表示されても、問題があることに気づかないかもしれません。Xはバグを可視化します。
一般的な原因:
reg a; // 最初は X (未知)
reg b;
assign b = a; // a が X なので b も X になるZ (ハイインピーダンス)
Zは、ハイインピーダンスまたは切断された状態を表します。
- 信号が何によっても駆動されていないとき、その信号はZになります
- Zは「このワイヤは切断されている」ということを意味します
- トライステートバッファや共有バスに使用されます
一般的な原因:
wire c; // 最初は Z (未接続)
assign c = 1'bZ; // 明示的に Z に設定VerilogでのXとZの記述
0や1と同じように、XやZの値を代入することができます:
reg [3:0] data;
data = 4'b10X0; // ビット1は不明(右から0始まりのインデックス)
data = 4'b01Z1; // ビット1はハイインピーダンス
data = 4'bXXXX; // すべてのビットが不明
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ビット)に設定してください
チートシート
X (不定) と Z (ハイインピーダンス) は、Verilogにおける特殊なシミュレーション値です。
X — 不定状態 (シミュレーションのみで、実際のハードウェアには存在しません):
- 初期化されていない
regは X として開始されます - 原因: 初期化されていないレジスタ、マルチドライブ(複数の出力が衝突)、タイミング違反など
- ロジックを通じて伝播します (X AND 1 = X ですが、X AND 0 = 0 となります)
- 波形では赤色の線として表示されます
Z — ハイインピーダンス / 切断状態:
- ドライブされていない
wireは Z として開始されます - トライステートバッファや共有バスに使用されます
- 波形では中央の線として表示されます
Verilogでの X と Z の記述方法:
reg [3:0] data;
data = 4'b10X0; // Bit 1 is unknown
data = 4'b01Z1; // Bit 1 is high-impedance
data = 4'bXXXX; // All bits unknown
data = 4'bZZZZ; // All bits high-impedance
assign c = 1'bZ; // Explicitly set wire to Z自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。