Menu
CoddyTech

特殊值 X 和 Z

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 17 课,共 90 课。

X 和 Z 是特殊值,在仿真过程中为我们提供硬件状态信息。

X(未知),用于调试

在仿真中,X 表示你的设计存在问题。

看到 X 时,通常表示:

  • 未初始化的寄存器:你在使用它之前忘了设置值
  • 多个驱动源:两个不同的事物试图同时控制同一根导线
  • 时序违规:信号在错误的时间发生变化,导致状态不稳定

现实硬件中不存在 X。它是一种仿真工具,可以告诉你设计中存在问题,这样你就能在制造实际芯片之前修复它。

如果没有 X,你可能会看到随机的 0 或 1,却没有意识到存在问题。X 会让 bug 显现出来。

常见原因:

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

你可以像赋值 0 和 1 一样赋值 X 和 Z:

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 的处理方式可能不同
  • 始终初始化 reg 信号,避免仿真中出现 X
challenge icon

挑战

填写代码,写出包含 X 和 Z 的正确值。

需要完成的任务:

  1. 将 a 设为一个 4 位值,其中第 1 位未知(其他位为 0)
  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 在线编译器