数字IC习题2--verilog阻塞、非阻塞、延迟的用法

发布时间 2023-08-30 20:54:45作者: 傅红雪a

详细的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