当前位置: 首页 > news >正文

阻塞赋值与非阻塞赋值(verilog篇)

阻塞赋值与非阻塞赋值(verilog篇)

2017-09-30 竹海 相约电子ee

相信刚刚接触verilog的读者,多少对阻塞赋值和非阻塞赋值仍有一些困惑。笔者在这篇文章,带领大家深入的理解这两者的区别。

 

首先笔者给一些实验及仿真数据。通过修改testbench文件,利用modelsim软件来观察两者的不同。

同样也可以这样写:

 

                                                                                  

输出波形如下:

稍作改动:

输入波形如下:

细心的读者会发现是 " = " 与 " <= "的区别。

1> 当使用 " = " ,记为阻塞赋值。从开始时刻开始,经过2个周期置1,持续4个周期后置0。也就是说在执行一条语句时,其他的语句不能执行。

打个比方,有很多车都要上高架,由于道路堵塞,一次只能通过一辆车,其他车只能等这辆过去后,才能过。

2 > 当使用 " <= " ,记为非阻塞赋值。从开始时刻开始,经过2个周期置1;从开始时刻,经过4个周期后置0。你会发现,经过四个周期后,test信号始终维持低电平,好像最后一句赋值没发生一样。

再打个比方,还是很多车准备过高速路口,通常有多个出口。现在有三辆车都过,这三辆车是互不影响的。

实际上也就是延迟三个周期置高电平,可是延迟两个周期已经置高电平了,可以分析这句一定是同时进行的。

 

通过作者的分析,相信读者可能加深了对两者区别的理解。

 

在此笔者推荐用阻塞赋值的方法,书写testbench脚本初始化模块,这样时序较为容易分析。

 

那么以上两者对电路有那种影响呢?

 

采用非阻塞赋值,部分代码如下:

 

always @(posedge clk)

begin 

b <= a;

z <= b;

end 

 

其综合对应的电路如下:

 

采用阻塞赋值,部分代码及综合电路如下:

 

 

always @(posedge clk)

begin 

b = a;

z = b;

end 

区别已经很明显了,具体区别就不再赘述,不过在这里,我想说的是,不要以为加入寄存器变量,一定意味着添加寄存器,这是错误的。

 

对于阻塞赋值,b为寄存器变量,可没有输出为b的寄存器哟。

 

综上所述,阻塞赋值和非阻塞赋值各占一片天。always 里面一定是非阻塞赋值,这可不一定哟。

具体问题具体分析,我相信,即使最简单的语法知识,深入分析之后,也会收获很多的。

转载:https://mp.weixin.qq.com/s?__biz=MzI4NTM4NjgyNg==&mid=100000173&idx=1&sn=b6cc881e9e82893b0d8ab22ef2fa7549&chksm=6bedb0885c9a399e334dafd5623a1260950a7ae5f6751fc2206b7d441baa073516b39ca16cfc&mpshare=1&scene=23&srcid=11295jqBMDZ97ciHjoM2uuZP#rd

相关文章:

  • 《软件需求十步走》阅读笔记4
  • 【VBA编程】01.第一个VBA程序Hello world
  • Linux Runtime PM介绍【转】
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • c作业3
  • Day23_IO第五天
  • 安装eclipse,配置tomcat
  • virt-manager管理整个云平台的instances
  • Day 02 链锁
  • shell基础--变量
  • Hibernate主键生成策略及选择
  • Java集合系列:-----------05LinkedList的底层实现
  • nginx+tomcat单个域名及多个域名配置
  • PV统计优化设计
  • 非常好!讲逻辑回归的,讲得很透彻
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 0基础学习移动端适配
  • Angular6错误 Service: No provider for Renderer2
  • AngularJS指令开发(1)——参数详解
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • js ES6 求数组的交集,并集,还有差集
  • php ci框架整合银盛支付
  • Python socket服务器端、客户端传送信息
  • redis学习笔记(三):列表、集合、有序集合
  • sessionStorage和localStorage
  • 从0实现一个tiny react(三)生命周期
  • 检测对象或数组
  • 前嗅ForeSpider中数据浏览界面介绍
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 实习面试笔记
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • (C++17) optional的使用
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (三)docker:Dockerfile构建容器运行jar包
  • (一) springboot详细介绍
  • (一一四)第九章编程练习
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET框架设计—常被忽视的C#设计技巧
  • @ConditionalOnProperty注解使用说明
  • @RequestBody与@ModelAttribute
  • [ SNOI 2013 ] Quare
  • [ 蓝桥杯Web真题 ]-布局切换
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [Angular] 笔记 21:@ViewChild
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BZOJ2850]巧克力王国