阻塞赋值和非阻塞赋值有何区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阻塞赋值和非阻塞赋值有何区别相关的知识,希望对你有一定的参考价值。

一、特点不同

1、阻塞赋值:顺序安排不好时会出现竞争。

2、非阻塞赋值:允许其他的Verilog语句同时操作。

二、表示不同

1、阻塞赋值:在Verilog HDL的概念中阻塞赋值操作符用等号(即=)表示。

2、非阻塞赋值:非阻塞赋值操作符用小于等于号(即<=)表示。

三、操作情况不同

1、阻塞赋值:在赋值时先计算等号右手部分的值,这时赋值语句不允许任何别的Verilog语句的干扰,直到现行的赋值完成时刻,才允许别的赋值语句的执行。

2、非阻塞赋值:由时钟节拍决定,在时钟上升到来时,执行赋值语句右边,然后将begin-end之间的所有赋值语句同时赋值到赋值语句的左边。非阻塞赋值允许其他的Verilog语句同时进行操作。

参考技术A 阻塞赋值和非阻塞赋值的本质的区别:
1、阻塞赋值是按需执行,非阻塞赋值是并行执行;
2、两种赋值语句对应着两种不同的电路结构。阻塞赋值对应的电路结构往往与触发沿没有关系,只与输入电平的变化有关系;而非阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生赋值的情况。
3、在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。
原因:这是因为要使综合前仿真和综合后仿真一致的缘故。
解释:1、阻塞赋值操作符用等号(即
=
)表示。“阻塞”是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量。
例如:
当执行“x=next_x;”时,x会立即的到next_x的值。而下一句“y=x;”必须等到“x=next_x;”执行完毕才能被执行。由于这两条语句都没有延迟(相当于导线),导致他们的等价语句为“y=next_x;”。
赋值是实时的,计算完右面的马上赋值给左边的,然后再执行下一句,操作时串行的,且在一个alway内完成。
2、非阻塞赋值操作符用小于等于号
(即
<=
)表示。“非阻塞”是指在进程语句(initial和always)中,当前的赋值语句不会阻断其后的语句。非阻塞语句可以认为是分为两个步骤进行的:
①计算等号右边的表达式的值,(我的理解是:在进入进程后,所有的非阻塞语句的右端表达式同时计算,赋值动作只发生在顺序执行到当前非阻塞语句那一刻)。
②在本条赋值语句结束时,将等号右边的值赋给等号左边的变量。
例如:
当执行“x<=next_x;”时,并不会阻断语句“y<=x;”的执行。因此,语句“y<=x;”中的x的值与语句“x<=next_x;”中的x的值不同:语句“y<=x;”中的x是第一个D触发器的初值(Q0)。
而语句“x<=next_x;”中的x的值是D触发器经过一个同步脉冲后的输出值(Q1)。
基于此这个进程产生了与阻塞赋值进程截然不同的结果,即:产生了移位寄存器的效果,next_x
à
x
à
y。
扩展资料:
阻塞赋值的执行可以认为是只有一个步骤的操作,即计算RHS并更新LHS,且不能允许有来自任何其他Verilog语句的干扰。所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后再开始赋值的。
非阻塞赋值的操作可以看作为两个步骤的过程;
(1)在赋值时刻开始时,计算非阻塞赋值RHS表达式;
(2)在赋值时刻结束时,更新非阻塞赋值LHS表达式。
非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在"initial”块和“al—ways"块等过程块中,而非阻塞赋值不允许用于连续赋值。
参考资料:
搜狗百科——阻塞赋值
搜狗百科——非阻塞赋值
参考技术B (1)在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;
(2)在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。
原因:这是因为要使综合前仿真和综合后仿真一致的缘故。
、阻塞赋值操作符用等号(即
=
)表示。“阻塞”是指在进程语句(initial和always)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋值可以看成是一步完成的,即:计算等号右边的值并同时赋给左边变量。例如:
当执行“x=next_x;”时,x会立即的到next_x的值。而下一句“y=x;”必须等到“x=next_x;”执行完毕才能被执行。由于这两条语句都没有延迟(相当于导线),导致他们的等价语句为“y=next_x;”。
赋值是实时的,计算完右面的马上赋值给左边的,然后再执行下一句,操作时串行的,且在一个alway内完成。
2、非阻塞赋值操作符用小于等于号
(即
<=
)表示。“非阻塞”是指在进程语句(initial和always)中,当前的赋值语句不会阻断其后的语句。非阻塞语句可以认为是分为两个步骤进行的:
①计算等号右边的表达式的值,(我的理解是:在进入进程后,所有的非阻塞语句的右端表达式同时计算,赋值动作只发生在顺序执行到当前非阻塞语句那一刻)。
②在本条赋值语句结束时,将等号右边的值赋给等号左边的变量。
例如:
当执行“x<=next_x;”时,并不会阻断语句“y<=x;”的执行。因此,语句“y<=x;”中的x的值与语句“x<=next_x;”中的x的值不同:语句“y<=x;”中的x是第一个D触发器的初值(Q0)。而语句“x<=next_x;”中的x的值是D触发器经过一个同步脉冲后的输出值(Q1)。基于此这个进程产生了与阻塞赋值进程截然不同的结果,即:产生了移位寄存器的效果,next_x
à
x
à
y。
  简单理解就是,阻塞赋值是按需执行,非阻塞赋值是并行执行。
参考技术C 阻塞与非阻塞赋值的语言结构是Verilog语言中最难理解的概念之一。
有这样的两个要点:
(1)在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;
(2)在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。
这样做的原因是:
这是因为要使综合前仿真和综合后仿真一致的缘故。
为了更好地理解上述要点,我们需要对Verilog语言中的阻塞赋值和非阻塞赋值的功能和执行时间上的差别有深入的理解。我们定义下面的两个关键字:
RHS——方程式右手方向的表达式或变量可分别缩写成
RHS表达式或RHS变量;
LHS
——方程式左手方向的表达式或变量可分别缩写成LHS
表达式或LHS变量。
IEEE
Verilog标准定义了有些语句有确定的执行时间,有些语句没有确定的执行时间。若有两条或两条以上的语句准备在同一时间执行,但由于语句的排列顺序不同,却产生了不同的输出结果。这就是造成Verilog模块冒险和竞争的原因。为了避免产生竞争,理解阻塞和非阻塞赋值在执行时间上的差别是至关重要的。
1、阻塞赋值
阻塞赋值用等号(=)表示。为什么称这种赋值为阻塞赋值呢?因为在赋值时先计算RHS部分的值,这是赋值语句不允许任何别的Verilog语言的干扰,直到现行的赋值完成时刻,即把RHS赋值给LHS的时刻,它才允许别的赋值语句的执行。
一般可综合的赋值操作在RHS不能设定延时(即使是0延时也不允许)。从理论上讲,它与后面的赋值语句只有概念上的先后,而无实质的延迟。若在RHS上加延迟,则在延迟时间会阻止赋值语句的执行,延迟后才进行赋值,这种赋值语句是不可综合的,在需要综合的模块设计中不可使用这种风格的代码。
所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上是在前一句赋值语句结束之后再开始赋值的。
2、非阻塞赋值
非阻塞赋值用小于等于号(<=)表示。为什么称这种赋值为非阻塞赋值呢?因为在赋值开始时计算RHS表达式,赋值操作时刻结束时更新LHS。在计算非阻塞赋值的RHS表达式和更新LHS期间,其他的Verilog语句,包括其他的非阻塞赋值语句都可能计算RHS表达式和更新LHS。非阻塞赋值允许其他的Verilog语句同时进行操作。非阻塞赋值可以看作两个步骤的过程:
(1)在赋值开始时,计算非阻塞赋值RHS表达式;
(2)在赋值结束时,更新非阻塞赋值LHS表达式。
非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在“initial”块和“always”块等过程块中,而非阻塞赋值不允许用于连续赋值。
参考技术D 阻塞与非阻塞赋值的语言结构是Verilog语言中最难理解的概念之一。
有这样的两个要点:
(1)在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;
(2)在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。
这样做的原因是:
这是因为要使综合前仿真和综合后仿真一致的缘故。本回答被提问者采纳

阻塞赋值和非阻塞赋值

为尽量避免在综合布局布线后的仿真中出现冒险竞争现象,在编写Verilog代码时必须牢记以下8个原则:

1,时序电路建模时,用非阻塞赋值。

2,锁存器电路建模时,用非阻塞赋值。

3,用always块建立组合逻辑模型时,用阻塞赋值。

4,在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。

5,在同一个always块中不要既用非阻塞赋值又用阻塞赋值。

6,不要在一个以上的always块中为同一个变量赋值。(新手几乎都会犯的错误,Vivado在综合时会报critical warning: multiple-driver)

7,用$strobe系统任务来显示用非阻塞赋值的变量值。

8,在赋值时不要使用 #0 延迟。

参考《Verilog数字系统设计教程 第四版 夏宇闻》

以上是关于阻塞赋值和非阻塞赋值有何区别的主要内容,如果未能解决你的问题,请参考以下文章

verilog中阻塞赋值和非阻塞赋值的区别

verilog阻塞赋值和非阻塞赋值的区别

verilog中为啥非阻塞赋值要用绝对时延

在 verilog中的非阻塞赋值在啥时候赋值时刻结束?

阻塞赋值和非阻塞赋值

阻塞赋值和非阻塞赋值