阻塞赋值和非阻塞赋值
时隔一年,再次学习阻塞赋值和非阻塞赋值,温故知新,醍醐灌顶。搜集多方资料,汇总于此,共同学习。希望对大家有所帮助。
《Verilog数字系统设计教程》第3版 夏宇闻
4.9 赋值语句和块语句
4.9.1 赋值语句
在Verilog HDL语言中,信号有两种赋值方式:
- 非阻塞(Non_Blocking)赋值方式(如b <= a;)
(1)在语句块中,上面语句所赋的变量值不能立即就为下面的语句所用;
(2)块结束后才能完成这次赋值操作,而所赋的变量值是上一次赋值得到的;
(3)在编写可综合的时序逻辑模块时,这是最常用的赋值方法。 - 阻塞(Blocking)赋值方式(如b = a;)
(1)赋值语句执行完后,块才结束;
(2)b的值在赋值语句执行完后立刻就改变的;
(3)在时序逻辑中使用时,可能会产生意想不到的结果。
非阻塞赋值方式和阻塞赋值方式的区别常给设计人员带来问题。问题主要是对“always”块内的reg型信号的赋值方式不易把握。到目前为止,前面所举的例子中的“always”模块内的reg型信号都是采用下面的这种赋值方式:
b <= a;
这种方式的赋值并不是马上执行的,也就是说,“always”块内的下一条语句执行后,b并不等于a,而是保持原来的值,“always”块结束后,才进行赋值。而阻塞赋值方式,如下所示:
b = a;
这种赋值方式是马上执行的,也就是说执行下