阻塞赋值和非阻塞赋值

2017-12-01

在Verilog语言中,赋值语句经常使用,阻塞赋值和非阻塞赋值经常带给我们很多困扰。在此讨论两种赋值方式的差异性。

       首先根据表面含义深刻理解阻塞和非阻塞:

       阻塞:在进程语句块中(initial或者always或者其他),当前赋值语句的执行阻塞了后面语句的执行。即后面语句的赋值需要等到当前赋值过程完成才能得以执行,即可认为执行过程是顺序执行(我们要明白Verilog中,大多数情况模块都是并发执行的)。

       非阻塞:当前赋值语句的执行不会阻塞后续语句的执行,即可以认为当前赋值语句的完成和后续的执行过程是并发执行的

       下面通过一个例子说明:

initial                       initial
begin                          begin
b=a;                            b<=a;
c=b;                            c<=b;
end                             end             

    上述左侧为阻塞赋值,右侧为非阻塞赋值;

     左侧代码中,当b=a执行完之后,即b的值已经变成了a;此时,c的值被赋给b的值,实际上,c的值就是a的值了,即c=b=a;

     而右侧代码,b被赋给a的值,c被赋给b的值同时发生,即c得到得到的b的值,并非是改变后的b的值,而是b没有改变之前的原来的值。    

 

posted @ 2017-12-01 20:00  少年π  阅读(1518)  评论(0编辑  收藏  举报