← FPGA数字IC知识手册

推荐答案 测试一下

另外一个区别则是更细微的差别:举个例子,

编程题 中等 笔试真题

参考答案

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 时刻事件调度
← 上一题
登录后反馈错题
下一题 →