推荐答案
测试一下
题目
另外一个区别则是更细微的差别:举个例子,
参考答案与知识点
参考答案
wire 类型的变量在声明后未驱动时默认值为高阻态 Z,但一旦被连续赋值(assign)驱动,其值立即生效,持续不变。本题中 assign a = 1'b0 在仿真 0 时刻即开始驱动 a 为 0,因此 a 始终为 0。
reg 类型的变量在仿真开始时默认值为不定态 X(除非显式初始化)。always@(*) 是组合逻辑块,其敏感列表为 *(所有输入信号),块内语句仅在敏感列表中的信号发生变化时执行。在仿真 0 时刻,由于没有任何信号发生变化,该 always 块不会自动执行,所以阻塞赋值 b = 1'b0 不会发生,b 保持初始值 X,因此仿真结果为不定态。即使 always@(*) 在 0 时刻会因为电平敏感而触发一次(某些仿真器行为),但标准 Verilog 规范中,always@(*) 仅在敏感信号变化时执行,初始时刻没有事件,不保证执行。实际仿真中,大部分工具会在 0 时刻执行一次 always@(*) 以获得初始组合逻辑值,但题目明确指出“b 是不定态”,说明该仿真环境未在 0 时刻执行该块,或者题目意图强调理论上的区别。
核心区别:连续赋值(assign)独立于过程块,仿真一开始即持续驱动;过程赋值(always 块内)依赖敏感事件,初始时刻可能不被执行,导致 reg 保持默认 X。因此,仿真时 a 确定,b 可能为 X。
涉及知识点
- wire 与 reg 的初始默认值
- 连续赋值与过程赋值的执行时机
- always@(*) 的触发条件
- 仿真 0 时刻事件调度