2013年5月6日 10:42:38

Verilog HDL 学习笔记2-blocking and non-blocking assignment

---学习贵在总结,将学习的心得体会记录

  在学习verilog的过程中,碰到的第一块绊脚石就是data type中wire 和reg的使用,第二块就是blocking 和non-blocking assignment 的区别和使用。现将学习过程中的疑惑和自己的理解总结。

  照惯例,还是先将官方说明贴出来,verilog 2001关于blocking and non-blocking assignment 表述如下:

blocking assignment :A blocking procedural assignment statement shall be executed before the execution of the statements that follow it in a sequential block (see 9.8.1). A blocking procedural assignment statement shall not prevent the execution of statements that follow it in a parallel block (see 9.8.2).

这表明的是:在顺序块中(begin end)中,阻塞过程赋值语句会阻塞其后语句的执行。也就是说,在前面的语句执行完之前,后面的语句是不能被执行的。但是在并行块中不会阻塞(fork join 语句,一般用不到)

non-blocking  assignment :The non blocking procedural assignment allows assignment scheduling without blocking the procedural flow. The non blocking procedural assignment statement can be used whenever several variable assignments within the same time step can be made without regard to order or dependence upon each other.

这表明的是:non-blocking assignment 不会阻塞过程块中的顺序语句,从用户的角度来看,这些语句是并行的。  

  官方的讲述总是不够细致,或者不够通俗易懂。那就来看看夏老师关于阻塞和非阻塞的理解,夏老师书中第14章《深入理解阻塞和非阻塞赋值的不同》详细介绍了区别和使用。

在该章概述中夏老师就提到了该章是根据国外的一篇论文,经过自己的理解编写而成的。虽然夏老师没有在参考文献中提到该篇论文,但是难逃google搜索啊,该论文是一位大牛之作,值得拜读。论文名为《Nonblocking Assignments in Verilog Synthesis, Coding Styles That Kill!》作者Clifford E. Cummings。

  首先来说的是在编写verilog代码时必须牢记的8个要点,才能在综合布局布线后的仿真中避免出现冒险竞争现象,原则如下:

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

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

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

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

  (5)在同一个always块中不要即用非阻塞赋值又用阻塞赋值

  (6)不要在一个以上的always块中为同一个变量赋值

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

  (8)在赋值时不要使用#0延迟

其实从blocking 和 non-blocking 字面意思上来说,区别就是“阻塞”。要理解“阻塞”,还得从The Verilog "stratified event queue"说起,上述paper中对于"stratified event queue"的解释如下:

  An examination of the Verilog "stratified event queue" (see Figure 1) helps to explain how Verilog blocking and nonblocking assignments function. The "stratified event queue" is a fancy name for the different Verilog event queues that are used to schedule simulation events.

仿真器在仿真时将每个time step分成四个不同的队列,如下图所示:

每个公司的仿真器对于一个time step的处理安排可能不一样,下图来自某知名专家的讲稿:

对比两图可以看出:

对于阻塞和非阻塞赋值语句,均可以拆成两步,即evaluate(求值,求LHS的值) 和assign或update(赋值,将LHS值赋给RHS)。对于blocking assignment而言,evaluate和assign或update都在一个time step的开始时完成,只有在上一个blocking assignment statement完成后,同一个过程块中的下一个blocking assignment statement才能开始执行。而对于non-blocking assignment而言,所有语句的在一个time step的开始时evaluate,在一个time step结束时assign,从用户的角度看,这些语句是并行执行的。

下面就来讲一下初学verilog的困惑和解决之道:

先贴一下八大原则吧(最后两个原则在可综合的代码编写中将用不到)

  

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

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

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

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

  (5)在同一个always块中不要即用非阻塞赋值又用阻塞赋值

  (6)不要在一个以上的always块中为同一个变量赋值

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

  (8)在赋值时不要使用#0延迟

在开始用到verilog时,先接触到了状态机,被一段式,两段式,三段式给弄糊涂了(后面应该会专门有文讲述状态机的编写)。状态机的三个大部分:组合逻辑:次态生成,时序逻辑:状态转移,输出逻辑:状态或者时序。当时疑惑着怎么处理阻塞和非阻塞语句,后在师兄的告诫下,建议采用三段式或者两段式,即将组合逻辑和时序逻辑写在不同的always块中。这样问题就好解决了!

所以,建议1:尽可能的将组合逻辑和时序逻辑剥离,写在不同的always块中,这样原则(4)和原则(5)可以退化到原则(1)和原则(3)。

同时,为了让状态输出正确,经常会采用“显性时钟”(我个人这么叫),也就是会采用计数器来指导状态的转移:

这样一来的话由于计数器为时序逻辑,次级状态生成为组合逻辑,如果将计数器写在次级状态生成中会产生比较恶劣的后果,所以根据建议1将计数器单独写成always块。在此也可以引申出第二条建议(如果将计数器的自加看成反馈通路的话):

建议2 : always块中应避免组合反馈回路

疑惑与解决之道将持续更新,以后碰到相应问题的时候即会将问题补充到后面。

从硬件的角度上来看,blocking assignment  是顺序流,更适合于建模组合电路;non-blocking assignment 是并行,更适合于建模时序电路。

本节写得比较仓促,不足之处甚多,以后还会陆续补充!

转载于:https://www.cnblogs.com/LNAmp/archive/2013/05/06/3063079.html

Verilog HDL 学习笔记2-blocking and non-blocking assignment相关推荐

  1. Verilog HDL 学习笔记3-Latch

    Verilog HDL 学习笔记3-Latch 第一次接触Latch是在大二学习数电的时候,那时候Latch被翻译成锁存器,当时还纠结着锁存器和寄存器的区别(要是当时我知道他俩的英文名叫latch和r ...

  2. Verilog HDL学习笔记(一)常见错误

    我初学verilog语言,很多细节都没注意,按着自己的思想就写了,编译的时候才发现各种问题.这些都是我在学习中遇到的问题,还是很常见的. 1.Error (10028): Can't resolve ...

  3. Verilog HDL学习笔记

    目录 1 硬件描述语言简介 1.1 概述 1.2 HDL语言特点 2 程序的基本语法 2.1 Verilog HDL 程序结构 2.1 Verilog HDL 程序规则 模块 连续赋值语句assign ...

  4. Verilog HDL程序笔记2

    Verilog HDL程序笔记2 Verilog HDL程序笔记1:写出属于你的第一个Verilog HDL模块 文章目录 Verilog HDL程序笔记2 前言 一.如何测试模块? 1.仿真平台 2 ...

  5. 【Verilog HDL学习之路】第二章 Verilog HDL的设计方法学——层次建模

    2 Verilog HDL的设计方法学--层次建模 重要的思想: 在语文教学中,应该先掌握核心方法论,再用正确的方法论去做题目,这样能够逐渐加深对于方法论的理解,做题的速度和准确率也会越来越高. 在V ...

  6. 【Verilog HDL学习之路】第一章 Verilog HDL 数字设计总论

    1 Verilog HDL 数字设计总论 1.1 几个重要的概念 EDA(Electronic Design Automation) 电子技术自动化 EDA工具 类似于软件工程中的IDE(集成开发环境 ...

  7. [笔记][原创]Verilog HDL语法分析笔记

         这篇帖子用于记录学习Verilog过程中的一些syntax的问题,会不断更新,有不正确的地方请各位帮忙指正:D 一.Verilog 语法中的可综合性 Verilog HDL 真的很强大,如果 ...

  8. system verilog断言学习笔记

    文章目录 前言 SVA介绍 什么是断言 SVA术语 并发断言 即时断言 建立SVA块 一个简单的序列 边沿定义的序列 SVA中的时钟定义 禁止属性 一个简单的执行块 蕴含操作符 交叠蕴含 非交叠蕴含 ...

  9. Verilog HDL 学习篇——六位数码管驱动

    根据原理图可知,此处数码管数据时共享的,每个位由片选信号分隔开,考虑人眼的视觉残留,可用扫描的方式更新数据. 这个驱动,有两个比较重要的,就是扫描驱动和二进制转BCD编码了 先说扫描驱动吧,要让第一个 ...

最新文章

  1. C++中的类模板详细讲述
  2. Py学生信息管理系统 案例(优化版)
  3. jboss 不适用内置日志_适用于孩子,父母和祖父母的JBoss HornetQ –第1章
  4. 如何获取codeforces的完整数据
  5. 4.2 算法之数论 9274 beeline(python)
  6. 安装配置Exchange 问题集
  7. DNS 反向解析出错 Error in named configuration: zone centos.vbird/IN: loaded serial 2011080401
  8. mysql路径猜解_猜解数据库(MYSQL)信息
  9. 创建虚拟交换机(New-VMSwitch)
  10. 物联网应用技术和计算机应用技术哪个更好,2020物联网应用技术专业选什么大学好?...
  11. 手把手教你编写网页图形验证码识别工具
  12. 文字加下划线单选按钮效果,RadioGroup实现
  13. 在网页前端调用exe程序并传参
  14. pygame之窗口大小调整
  15. 微信小程序中如何将数据保存到内存中并且读取的同步写法
  16. networkx_to_metis
  17. 温度表达转化(华氏温度到摄氏温度)
  18. 前5名最佳SQL数据库恢复软件
  19. SP(软件过程)的发展历程2:计划驱动软件开发过程时代
  20. 程序员硬核吸猫:自制猫抓板、猫脸识别、智能猫窝!

热门文章

  1. 一站式帮助企业解决采购供应平台有哪些?
  2. Java开发快速学习!黑马java项目实战
  3. MacOS 删除 多余音频设备 eshow data source item 0
  4. java调用dll做加解密试例
  5. ThreadLocal原理详解--终于弄明白了ThreadLocal
  6. 仅有两年工作经验的我是如何成功面试阿里P6,android开发的基础
  7. SpringWeb 系列教程
  8. 打造最可靠的自动驾驶基础架构
  9. 浏览器插件安装 (Adblock Plus)
  10. 自建证书配置HTTPS服务器