阻塞非阻塞

阻塞和非阻塞

阻塞: =
可用在assign语句和always语句中,
表示只要源信号发生变化,目标信号就立刻完成赋值操作,
在always块中,结果与语句顺序有关,
在always块中是顺序关系
非阻塞:         <=
只能用在always语句中,
表示该语句结束时完成赋值操作,
结果与语句顺序无关,
并行关系

可以这样理解:阻塞赋值,进程会阻塞在某条语句,而非阻塞赋值,进程不会阻塞在某条语句。
例如: r_data_out_0 = data_in;
r_data_out_1 = r_data_out_0;
进程阻塞在语句1,完成语句1后再进行语句2的赋值,调换语句1和语句2会改变结果,可以看成是顺序关系。
语句1和语句2顺序交换后综合结果与非阻塞结果相同。

r_data_out_0 <= data_in;
r_data_out_1 <= r_data_out_0;
进程不会阻塞在语句1,在进行语句1的同时也在进行语句2,调换语句1和语句2不会改变结果,可以看成是并行关系。
语句2中的r_data_out_0其实是语句1赋值前的r_data_out_0的值。

也可以这样理解:阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.
   阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
   非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

在always块中需要讨论的各种情况:
1、 赋值左侧变量各不相同,且左侧变量不在右侧出现。
r_data_out_0 <= data_in_0; r_data_out_0 = data_in_0;
r_data_out_1 <= data_in_1; r_data_out_1 = data_in_1;
这种情况,阻塞、非阻塞仿真结果、综合结果均相同。

2、赋值左侧变量相同,但左侧变量不出现在右侧。
r_data_out <= data_in_0; r_data_out = data_in_0;
r_data_out <= data_in_1; r_data_out = data_in_1;
这种情况,非阻塞第一条语句综合时会被优化掉,仿真时第一条语句也被覆盖掉。
阻塞的第二条语句会覆盖第一条语句,综合时第一条语句被优化掉。当然,仿真时第一条语句也被覆盖掉。
总之,阻塞和非阻塞仿真结果、综合结果均相同。不管是仿真还是综合,第一条语句都不会起作用,完全可以删掉。
需要注意的是,若两条语句出现在不同always块中,综合时会出错。所以这种情况完全不应该出现,出现了也没意义。

3、赋值左侧变量不相同,但左侧变量出现在右侧。
r_data_out_0 <= data_in;     r_data_out_0 = data_in; r_data_out_1 = r_data_out_0;
r_data_out_1 <= r_data_out_0;    r_data_out_1 = r_data_out_0; r_data_out_0 = data_in;
这种情况,在时序电路中:
非阻塞在语句1未赋完值前就执行语句2,因而语句2赋到的值是上一clk周期的r_data_out_0值。
阻塞在语句1赋完值后就执行语句2。
非阻塞和阻塞1仿真结果、综合结果均不相同。非阻塞是两级D触发器,阻塞1是两个一级D触发器。
注意阻塞情况下,顺序不同结果也不同,非阻塞和阻塞2仿真结果、综合结果均一样。
在组合电路中:
阻塞、非阻塞仿真结果、综合结果均一样。因为就算是非阻塞,语句2被赋予了r_data_out_0赋予data_in值之前的值,
但一旦r_data_out_0被赋予了data_in的值,r_data_out_1就会被赋予r_data_out_0赋予data_in值之后的值。
特别注意,阻塞2综合结果同阻塞1、非阻塞一样,但仿真结果不一样。

4、赋值左侧变量相同,且出现在右侧。
r_data_out <= r_data_out + 2'b10; r_data_out = r_data_out + 1'b1;
r_data_out <= r_data_out + 1'b1; r_data_out = r_data_out + 1'b1;
这种情况,非阻塞第一条语句会被优化掉,只执行第二条语句。
 阻塞执行完第一条语句执行第二条语句。
总结:
1、一般在时序电路中使用非阻塞赋值,在组合电路中采用阻塞赋值。
2、对于非阻塞赋值,不要多条语句赋值给同一变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值