阻塞赋值(=)与非阻塞赋值(<=)会给设计的电路所产生的差异,
重新理解阻塞赋值与非阻塞赋值的原理和意义,能够使我们在以后的设计中正确设计出符
合我们所想要表达的电路。
阻塞赋值(
=):该语句结束时就完成赋值操作,前面的语句没有完成前,后面的语
句是不能执行的。在一个过程块内多个阻塞赋值语句是顺序执行的。
非阻塞赋值(<=):一条非阻塞赋值语句的执行是不会阻塞下一条语句的执行,也就
是说在本条非阻塞赋值语句执行完毕前,下一条语句也可开始执行。非阻塞赋值语句在过
程块结束时才完成赋值操作。在一个过程块内的多个非阻塞赋值语句是并行执行的。
最后我们总结在编写 RTL 代码时推荐的一些规范,详细如下:
(
1)在编写时序逻辑的代码时采用非阻塞赋值的方式
计算赋值号右手边的信号时,所有的变量值均是触发沿到来前的值,更新的赋值号左
手边的信号作为触发沿后的值,并且保持到下一个触发沿到来时候,等待更新。这样,就
可以使得在同一个块中非阻塞赋值语句不必要求出现的顺序,都是在全部进行赋值号右手
边的信号计算后同时更新赋值号左手边的信号的值。非阻塞赋值可以简单的认为是赋予下
一状态的值。
(
2)使用 always 块来编写组合逻辑的代码时要用阻塞赋值的方式
使用 always 块建立组合逻辑电路模型时不要忘记 always 块中的敏感列表一定要使用电
平触发的方式,然后在 always 块中使用阻塞赋值语句就可以实现组合逻辑,这样做既简单
且方针又快又好,这样的风格是值得推荐的。
(
3)在同一个 always 块中不要既要用非阻塞赋值又用阻塞方式赋值
在同一个 always 块中对同一个变量既进行阻塞赋值又进行非阻塞赋值会产生综合不可
预测的结果,不是可综合的 Verilog 风格。
(
4)虽然锁存器电路建模是我们不推荐的,但是如果使用到要采用非阻塞赋值的方
式。
使用非阻塞赋值实现时序逻辑,实现锁存器是最为安全的。
(
5)一个 always 块只一个变量进行赋值
因为 always 块是并行的,执行的顺序是随机的,综合时会报多驱动的错误,所以严禁
在多个 always 块中对同一个变量赋值;当然也不推荐一个 always 对多个变量进行赋值,虽
然这种方式是允许的,但如果过多会导致代码的混乱且不易后期的维护和修改
阻塞赋值(=)与非阻塞赋值(<=)会给设计的电路所产生的差异,
最新推荐文章于 2023-04-11 10:22:44 发布