阻塞赋值与非阻塞赋值

概念:

1、阻塞赋值

阻塞赋值用等号(=),一般对应电路中的组合逻辑赋值,等号右端的结果会立刻赋值给左端。

2、非阻塞赋值

非阻塞赋值用小于等于号(<=)表示,一般对应电路中的时序逻辑赋值,等号右端的结果不会立刻赋值给左端。

在always语句中,阻塞赋值等号左端的参数如果参与该模块的其他运算,则按照赋值后的结果参与运算,而非阻塞赋值等号左端的参数依旧按照未赋值前的结果参与运算。

案例分析:

下述代码都是一个缓存输出的模块。

阻塞赋值与非阻塞赋值_第1张图片

主要赋值运算部分都是最赋值,综合出的RTL视图如图1所示。

阻塞赋值与非阻塞赋值_第2张图片

图 1

可以看出在RTL视图中已经没有reg a,实际上赋值部分实现的功能是在时钟上升沿给b赋data_i的值。

那看看下面这种写法,这段代码综合出的结果也是图1。这两段代码中,由于a是阻塞赋值,所以不能起到缓存的作用。

阻塞赋值与非阻塞赋值_第3张图片

而下面的两段代码则可以做到二级缓存输出。

阻塞赋值与非阻塞赋值_第4张图片

RTL视图均为:

阻塞赋值与非阻塞赋值_第5张图片

应用场景&注意事项:

一般意义上讲,“在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构”和“在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构”【1】。在组合逻辑和时序逻辑混合描述的情况下使用两种赋值方法,也会形成不同电路结构的组合。

参考资料

【1】深入理解阻塞和非阻塞赋值的区别

https://blog.csdn.net/Pieces_thinking/article/details/76120512​blog.csdn.net

你可能感兴趣的:(阻塞赋值与非阻塞赋值)