数字IC习题2--verilog阻塞、非阻塞、延迟的用法
详细的verilog阻塞、非阻塞、延迟的用法概念见以下链接
https://zhuanlan.zhihu.com/p/175078300
https://zhuanlan.zhihu.com/p/423993521
本文主要讲述这道笔试题解题思路:
【例题1】
module b1;
integer A, B;
initial begin
A = 0;
B = 9;
#1;
A <= 5;
B = A;
$display("$time=%p, CPI: A=%1d, B=%1d", $time, A, B);
#2;
A <= B;
B = A;
$display("$time=%p, CP2: A=%1d, B=%1d", $time, A, B);
end
endmodule
结果信息:
$time=1, CPI: A=0, B=0
$time=3, CP2: A=5, B=5
【解析】
阻塞赋值(=):在赋值时,先计算等号右边部分的值,再赋值给左边变量,直到该语句赋值完成,后面的语句才能执行,会阻塞后面的语句。(顺序执行)
非阻塞赋值(<=):执行赋值语句右边,然后将begin-end之间的所有赋值语句同时赋值到赋值语句的左边,但是左边的变量的值不会立即更新,直到always块所有语句执行完,才将左边变量的值更新。
//这里的延迟和打印信息和非阻塞语句加起来可以认为是一个语句块,非阻塞赋值只有等其他的语句执行完之后,它才进行赋值。
//如:
#1; A <= 5; B = A; $display("$time=%p, CPI: A=%1d, B=%1d", $time, A, B);
在这0-1s的第一秒的时间内,它把 A = 0;B = 9;赋值,但是打印信息没有打印
然后在1s-2s,即第二秒开始的时候,延迟和非阻塞语句跳过后,执行B = A; $display("$time=%p, CPI: A=%1d, B=%1d", $time, A, B);
此时打印0 0
第一个语句块执行完之后 A = 5 ; B =0;(注意这是中间过程变量,第一次打印出的值为0 0)
第二个语句块也是相同操作,延迟和非阻塞语句跳过后,执行B = A; $display("$time=%p, CPI: A=%1d, B=%1d", $time, A, B);
此时打印 5 5
第二个语句块执行完之后 A = 0 ; B =5;(注意这是中间过程变量,第二次打印出的值为5 5)
【例题2】
中间变量
0-1s A=5 B=3
1-2s之内(不包含1s 2s这两个时刻) A=4 B=5
2s 这个时刻 A=4 B=4 这里的A = 4 ,因为是延迟加非阻塞,实际上得到的B的值取上一层B=5的值
2-3s(不包含2s这个时刻) A=5 B=4
最终结果:打印值
CP1:A = 5,B=3
CP2:A = 4,B=4
CP3:A = 5,B=4