verilog阻塞赋值和非阻塞赋值混用的一种危害
初学者在verilog学习中,往往容易犯一种比较典型的错误,即阻塞赋值和非阻塞赋值混淆使用。众所周知,非阻塞赋值(<=)往往用在always语句等时序逻辑之中,而阻塞赋值(=)往往用于assign语句等组合逻辑语句之中。那么,两者混用,会有什么后果呢?在实际应用中,混用可能有时候编译不会报错,但是会导致发生不可预料的逻辑错误以及仿真错误。
例如:我们有如下led代码:
红框中框出的部分,为在alwasy语句中使用了阻塞赋值。
对其进行前仿真结果如下图:
对其进行后仿真结果如下图:
可以看到,前仿真和后仿真的结果不一致,在前仿真中,led翻转只持续了一拍,而在后仿真中,led符合计数器满发生翻转的规律。
如果在板级验证层面,在本工程上把计数器的值修改到便于观察,使(cnt==24999999),可以看到实际现象如后仿真一般,led正常闪烁。
所以,过于随意的使用阻塞赋值和非阻塞赋值,会导致不可预知的后果,请大家务必牢记!
页:
[1]