商震 发表于 2021-8-24 12:06:35

verilog阻塞赋值和非阻塞赋值混用的一种危害

初学者在verilog学习中,往往容易犯一种比较典型的错误,即阻塞赋值和非阻塞赋值混淆使用。众所周知,非阻塞赋值(<=)往往用在always语句等时序逻辑之中,而阻塞赋值(=)往往用于assign语句等组合逻辑语句之中。那么,两者混用,会有什么后果呢?
在实际应用中,混用可能有时候编译不会报错,但是会导致发生不可预料的逻辑错误以及仿真错误。


例如:我们有如下led代码:




红框中框出的部分,为在alwasy语句中使用了阻塞赋值。

对其进行前仿真结果如下图:



对其进行后仿真结果如下图:



可以看到,前仿真和后仿真的结果不一致,在前仿真中,led翻转只持续了一拍,而在后仿真中,led符合计数器满发生翻转的规律。
如果在板级验证层面,在本工程上把计数器的值修改到便于观察,使(cnt==24999999),可以看到实际现象如后仿真一般,led正常闪烁。
所以,过于随意的使用阻塞赋值和非阻塞赋值,会导致不可预知的后果,请大家务必牢记!


页: [1]
查看完整版本: verilog阻塞赋值和非阻塞赋值混用的一种危害