阻塞赋值和非阻塞赋值

Posted 少年π

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阻塞赋值和非阻塞赋值相关的知识,希望对你有一定的参考价值。

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没有改变之前的原来的值。    

 

以上是关于阻塞赋值和非阻塞赋值的主要内容,如果未能解决你的问题,请参考以下文章

阻塞赋值和非阻塞赋值

verilog阻塞赋值和非阻塞赋值的区别

verilog 阻塞和非阻塞啥区别啊?

用一个例子来学习阻塞赋值和非阻塞赋值

verilog中阻塞赋值和非阻塞赋值的区别

verilog中为啥非阻塞赋值要用绝对时延