阻塞(blocking)赋值与非阻塞(non-blocking)赋值
2016-03-05 18:18
1251 查看
阻塞赋值:当前语句没有执行完以前不会执行下一条语句,只有当当前语句中的“计算”完成之后,直接赋值,下一条语句才会执行;
各条语句执行的顺序为:
(1)x = 0 到reg_b = reg_a之间的语句在0时刻执行;//可以认为执行这些语句所需的时间为0,但是在实际电路中有延迟,所以使用阻塞赋值时要考虑实际情况
(2)reg_a[2] = 0在时刻15执行;
(3)reg_b[15:13] = {x,y,z} 在时刻25执行;
(4)count = count + 1在时刻25执行。
非阻塞赋值:当前语句不会阻碍下一条语句的执行,但是只有块结束时才会赋值。
各条语句的执行顺序为:
(1)x = 0 到reg_b = reg_a之间的语句在0时刻执行;
(2)reg_a[2] = 0在时刻15执行;
(3)reg_b[15:13] = {x,y,z} 在时刻10执行;
(4)count = count + 1在时刻0执行。
阻塞与非阻塞赋值使用不当会造成竞争冒险的出现,阻塞与非阻塞赋值的使用准则为:
1.在描述组合逻辑的always块里使用阻塞赋值,则综合成组合逻辑电路;
2.在描述时序逻辑的always块里使用非阻塞赋值,则综合成时序逻辑电路。
reg x,y,z; reg [15:0] reg_a,reg_b; integer count; initial begin x = 0; y = 1; z = 1; count = 0; reg_a = 16'b0; reg_b = reg_a; #15 reg_a[2] = 1'b1; #10 reg_b[15:13] = {x,y,z}; count = count + 1; end
各条语句执行的顺序为:
(1)x = 0 到reg_b = reg_a之间的语句在0时刻执行;//可以认为执行这些语句所需的时间为0,但是在实际电路中有延迟,所以使用阻塞赋值时要考虑实际情况
(2)reg_a[2] = 0在时刻15执行;
(3)reg_b[15:13] = {x,y,z} 在时刻25执行;
(4)count = count + 1在时刻25执行。
非阻塞赋值:当前语句不会阻碍下一条语句的执行,但是只有块结束时才会赋值。
reg x,y,z; reg [15:0] reg_a,reg_b; integer count; initial begin x = 0; y = 1; z = 1; count = 0; reg_a = 16'b0; reg_b = reg_a; reg_a[2] <= #15 1'b1; reg_b[15:13] <= #10 {x,y,z}; count <= count + 1; end
各条语句的执行顺序为:
(1)x = 0 到reg_b = reg_a之间的语句在0时刻执行;
(2)reg_a[2] = 0在时刻15执行;
(3)reg_b[15:13] = {x,y,z} 在时刻10执行;
(4)count = count + 1在时刻0执行。
阻塞与非阻塞赋值使用不当会造成竞争冒险的出现,阻塞与非阻塞赋值的使用准则为:
1.在描述组合逻辑的always块里使用阻塞赋值,则综合成组合逻辑电路;
2.在描述时序逻辑的always块里使用非阻塞赋值,则综合成时序逻辑电路。
相关文章推荐
- [LeetCode]216. Combination Sum III
- 《Android源码设计模式》 面向对象六大原则
- Activity交互---Activity跳转(Intent实现)
- 1009. 说反话
- CentOS hadoop 分布式集群的搭建
- UIDynamicBehavior的简单使用:接球小游戏
- UDP
- hdu1043 Eight
- 剑指offer面试题7——用两个栈实现队列
- AndroidStudio技巧:快速清除app数据
- 剑指offer面试题7——用两个栈实现队列
- CakePHP 3.2 数据库访问和ORM篇
- UESTC--1251(模拟)
- 通知中心(loading...)
- CF 427D 后缀数组
- 39. Combination Sum
- 关于低功耗蓝牙的连接参数更新
- Spring核心IOC容器实现分析
- ViewPager禁止滑动以及它与内层滑动控件水平方向上事件冲突的解决方法
- 深入学习JavaScript的AngularJS框架中指令的使用方法