为何未修改wire值时仿真器仍在0时刻触发@(test_wire)事件?
Verilog中未赋值wire的@事件为何在0时刻触发?
问题代码
wire test_wire; logic test_logic; initial begin fork begin $display($time, "wire before!"); @(test_wire); $display($time, "wire after!"); end begin $display($time, "logic before!"); @(test_logic); $display($time, "logic after!"); end join_none end
仿真输出
0 wire before! 0 logic before! 0 wire after!
核心疑问
已知wire默认高阻态(z)、logic默认未知态(x),未对二者赋值的情况下,为何@(test_wire)在0时刻就触发,而@(test_logic)无响应?
原因解释
- wire的触发逻辑:在仿真初始化阶段(0时刻),未被驱动的wire会从“无驱动状态”隐式切换到高阻态z,这个状态变化会被仿真器识别为一个事件,因此
@(test_wire)会立刻触发,执行后续的$display。 - logic的触发逻辑:logic属于四值变量,在0时刻会直接初始化为未知态x,整个过程没有发生“状态变化”(仿真事件定义中,从无到x不算有效信号变化),所以
@(test_logic)会一直等待,直到test_logic的状态发生真正的改变(比如从x变为0/1/z)。
简单来说,wire的初始z是驱动赋值的结果,存在状态跃迁;而logic的初始x是变量的默认初始化,没有跃迁过程,因此不会触发电平敏感的@事件。
内容的提问来源于stack exchange,提问作者WangYang.Cao
相关产品推荐
相关产品推荐

