概念:
1、阻塞赋值
阻塞赋值用等号(=),一般对应电路中的组合逻辑赋值,等号右端的结果会立刻赋值给左端。
2、非阻塞赋值
非阻塞赋值用小于等于号(<=)表示,一般对应电路中的时序逻辑赋值,等号右端的结果不会立刻赋值给左端。
在always语句中,阻塞赋值等号左端的参数如果参与该模块的其他运算,则按照赋值后的结果参与运算,而非阻塞赋值等号左端的参数依旧按照未赋值前的结果参与运算。
案例分析:
下述代码都是一个缓存输出的模块。
主要赋值运算部分都是最赋值,综合出的RTL视图如图1所示。
图 1
可以看出在RTL视图中已经没有reg a,实际上赋值部分实现的功能是在时钟上升沿给b赋data_i的值。
那看看下面这种写法,这段代码综合出的结果也是图1。这两段代码中,由于a是阻塞赋值,所以不能起到缓存的作用。
而下面的两段代码则可以做到二级缓存输出。
RTL视图均为:
应用场景&注意事项:
一般意义上讲,“在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构”和“在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构”【1】。在组合逻辑和时序逻辑混合描述的情况下使用两种赋值方法,也会形成不同电路结构的组合。
参考资料
【1】深入理解阻塞和非阻塞赋值的区别
https://blog.csdn.net/Pieces_thinking/article/details/76120512blog.csdn.net