特殊な値 X と Z
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 17/90。
XとZは、シミュレーション中のハードウェアの状態に関する情報を提供する特別な値です。
X (Unknown) — デバッグ用
Xは、設計上の問題を示すためにシミュレーションで表示されます。
X が表示される場合、通常は次のような意味になります:
- 未初期化のレジスタ — 使用する前に値を設定するのを忘れています
- マルチドライバ(複数の駆動源) — 2つの異なる要素が同じワイヤを同時に制御しようとしています
- タイミング違反 — 信号が誤ったタイミングで変化し、不安定な状態が発生しています
X は実際のハードウェアには存在しません。これは設計に問題があることを通知するシミュレーションツールであり、実際のチップを製造する前に問題を修正できるようにするためのものです。
X がないと、ランダムな 0 や 1 が表示されても問題があることに気付かない可能性があります。X はバグを可視化します。
よくある原因:
reg a; // 初期状態は X(不明)
reg b;
assign b = a; // a が X のため b は X になるZ (ハイインピーダンス)
Z はハイインピーダンス (high-impedance) または切断状態 (disconnected) を表します。
- 信号が何によっても駆動されていないとき、その信号は Z となります
- Z は「このワイヤが切断されている」ことを意味します
- トライステートバッファや共有バスに使用されます
よくある原因:
wire c; // 初期状態は Z(未接続)
assign c = 1'bZ; // Explicitly set to ZVerilogにおけるXとZの記述
0や1と同じように、XやZの値を`assign`することができます:
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に bit 1 が unknown (others 0) である 4-bit の値を設定しますcに all bits unknown (4 bits) を設定しますdに all bits high impedance (4 bits) を設定します
自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。