← 2022 · 荣耀 笔试

推荐答案 测试一下

下面两端代码中in,q1、q2和q3的初值分别为0,1,2,3,那么经过1个时钟周期后,左侧q3的值和右侧q3的值分别变成了

A.0,0 B.0,2 C.0,3 D.2,0
简答题 中等 笔试真题

参考答案

【解析】本题考察阻塞赋值(=)与非阻塞赋值(<=)的区别。左侧always块使用阻塞赋值,语句按顺序执行。在时钟上升沿到来时,首先执行“q1 = in”,由于in初值为0,q1被更新为0;接着执行“q2 = q1”,此时q1已变为0,故q2=0;最后执行“q3 = q2”,q2为0,故q3=0。因此左侧q3的值为0。右侧always块使用非阻塞赋值,所有赋值在时钟上升沿同时采样赋值右侧表达式的旧值,然后统一更新左侧变量。初始时刻:in=0,q1=1,q2=2,q3=3。采样时,q1 <= in 采样in的旧值0;q2 <= q1 采样q1的旧值1;q3 <= q2 采样q2的旧值2。更新后,q1=0,q2=1,q3=2。因此右侧q3的值为2。故左侧q3=0,右侧q3=2,对应选项B。 【易错点】①混淆阻塞与非阻塞赋值的执行顺序;②忽略非阻塞赋值采样的是时钟沿前的旧值;③未正确应用题目给出的初值(in=0,q1=1,q2=2,q3=3)。

涉及知识点

  • 阻塞赋值(=)顺序执行
  • 非阻塞赋值(<=)并行采样旧值
  • Verilog中always块的行为仿真差异
  • 寄存器初值对仿真结果的影响
← 上一题
登录后反馈错题
下一题 →