特殊值 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 也变成 XZ(高阻抗)
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
挑战
填写代码,写出包含 X 和 Z 的正确值。
需要完成的任务:
- 将
a设为一个 4 位值,其中第 1 位未知(其他位为 0) - 将
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 在线编译器