浅谈阻塞赋值与非阻塞赋值的区别
最近有转行做IC验证的同事问我"="(阻塞)与"<="(非阻塞)的区别,笔者本来不想讲基础入门这些的,一来这些知识很多书籍教程都有提到,而且很多博主也写了,笔者写博客的初衷为了记录一些项目,还有一些技巧,再者就是希望能帮到需要的人。很多人都搞混的话,笔者就个人理解来谈谈阻塞赋值与非阻塞,初学的时候笔者也经常搞混。主要还是不理解这其中的区别,书上讲的基本就是理论的,什么时序电路一般用"<=",组合逻辑一般用"="。事实上无论在啥逻辑都可以用,只是这样做不规范罢了。笔者后面能够准确区分开这两者也是看了黑金的《XXX那些事儿》的书才弄清楚。里头讲得很直白,比起书上更容易理解。
笔者的理解可以参考下图,在下面的代码中,都是时钟上升沿的时候对信号赋值。然而不同的是,"="阻塞赋值是在上升沿的一瞬间完成,图中"="的空间可以理解为在时钟上升沿的瞬间产生的时间静止,而阻塞赋值就是在时间静止的时候完成赋值的。而"<="非阻塞赋值则是上升沿瞬间之后完成的赋值,所以赋值在阻塞赋值完成之后。
根据上图就可以简单推出a0,b0,a1可以说在上升沿瞬间更新r_test的赋值,但是b0在当前瞬间还未有效,也就是没法赋值给b1。可以理解成在上升沿瞬间,时间静止下完成了a0 = r_test,a1 = a0的所有阻塞赋值。在上升沿之后,可以当作上升沿瞬间,可以理解为时间静止之后,才开始阻塞赋值。仿真结果如下:
要是看完以上内容还是没法理解阻塞与非阻塞,那笔者也在没办法了,可能这种理解方法并不适合所有人。那就多看看相关数籍或者其他人的博客,也许会有适合自己的理解方式。