推荐答案
测试一下
题目
下面两端代码中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块的行为仿真差异
- 寄存器初值对仿真结果的影响