本文首发于微信公众号“花蚂蚁”,想要学习FPGA及Verilog的同学可以关注一下。

一、初步理解阻塞赋值与非阻塞赋值

在Verilog HDL语言中,信号有两种赋值方式:

(1).非阻塞(Non_Blocking)赋值方式( 如 b <= a; )

  • 块结束后才完成赋值操作。
  • b的值并不是立刻就改变的。
  • 这是一种比较常用的赋值方法。(特别在编写可综合模块时)

(2).阻塞(Blocking)赋值方式( 如 b = a; )

  • 赋值语句执行完后,块才结束。
  • b的值在赋值语句执行完后立刻就改变的。
  • 可能会产生意想不到的结果。

非阻塞赋值方式和阻塞赋值方式的区别常给设计人员带来问题。问题主要是给"always"块内的reg型信号的赋值方式不易把握。

到目前为止,前面所举的例子中的"always"模块内的reg型信号都是采用下面的这种赋值方式:

b 

这种方式的赋值并不是马上执行的,也就是说"always"块内的下一条语句执行后,b并不等于a,而是保持原来的值。"always"块结束后,才进行赋值。而另一种赋值方式阻塞赋值方式,如下所示:

b 

这种赋值方式是马上执行的。也就是说执行下一条语句时,b已等于a。尽管这种方式看起来很直观,但是可能引起麻烦。下面举例说明:

[例1]:

always 

[例1] 中的"always"块中用了非阻塞赋值方式,定义了两个reg型信号b和c,clk信号的上升沿到来时,b就等于a,c就等于b,这里应该用到了两个触发器。请注意:赋值是在"always"块结束后执行的,c应为原来b的值。这个"always"块实际描述的电路功能如下图所示:

[例2]:

always 

[例2]中的 "always"块用了阻塞赋值方式。clk信号的上升沿到来时,将发生如下的变化:b马上取a的值,c马上取b的值(即等于a),生成的电路图如下所示只用了一个触发器来寄存器a的值,又输出给b和c。这大概不是设计者的初衷,如果采用[例1]所示的非阻塞赋值方式就可以避免这种错误。

二、深入理解阻塞和非阻塞赋值的不同

  1. 在描述组合逻辑的always 块中用阻塞赋值,则综合成组合逻辑的电路结构。
  2. 在描述时序逻辑的always 块中用非阻塞赋值,则综合成时序逻辑的电路结构。

为什么一定要这样做呢?这是因为要使综合前仿真和综合后仿真一致的缘故。

首先了解两个定义:

RHS 方程式右手方向的表达式或变量可分别缩写为: RHS 表达式或 RHS 变量。

LHS – 方程式左手方向的表达式或变量可分别缩写为: LHS 表达式或 LHS 变量。

阻塞赋值的执行可以认为是只有一个步骤的操作:

计算RHS 并更新LHS,此时不能允许有来自任何其他Verilog 语句的干扰。 所谓阻塞的概念是指在同一个always 块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后再开始赋值的。

[例1]用阻塞赋值的反馈振荡器(不好的例子)

module 

例1中,如果前一个always块的复位信号先到0 时刻,则y1 和y2 都会取1,而如果后一个always 块的复位信号先到0 时刻,则y1 和y2 都会取0。这清楚地说明这个Verilog 模块是不稳定的会产生冒险和竞争的情况。

如果在一个过程块中阻塞赋值的RHS 变量正好是另一个过程块中阻塞赋值的LHS 变量,这两个过程块又用同一个时钟沿触发,如果阻塞赋值的次序安排不好,就会出现竞争。若这两个阻塞赋值操作用同一个时钟沿触发,则执行的次序是无法确定的。

非阻塞赋值的操作可以看作为两个步骤的过程:

1) 在赋值时刻开始时,计算非阻塞赋值RHS 表达式。

2) 在赋值时刻结束时,更新非阻塞赋值LHS 表达式。

[例2] 用非阻塞赋值的反馈振荡器(正确示范)

module 

例2中,无论哪一个always 块的复位信号先到, 两个always 块中的非阻塞赋值都在赋值开始时刻计算RHS 表达式,而在结束时刻才更新LHS 表达式。所以这两个always 块在复位信号到来后,在always 块结束时 y1 为0 而y2为1 是确定的。从用户的角度看这两个非阻塞赋值正好是并行执行的。

非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在"initial"块和"always"块等过程块中。非阻塞赋值不允许用于连续赋值。

下面通过几个通过移位寄存器的例子来更好的理解阻塞赋值与非阻塞赋值

下图表示是一个简单的移位寄存器方框图:

[例3] 不正确地使用的阻塞赋值来描述移位寄存器。(方式 #1)

module 

在上面的模块中,按顺序进行的阻塞赋值将使得在下一个时钟上升沿时刻,所有的寄存器输出值都等于输入值d。在每个时钟上升沿,输入值d 将无延时地直接输出到q3。

[例4] 用阻塞赋值来描述移位寄存器也是可行的,但这种风格并不好。(方式 #2 )

module 

在上面的模块中,阻塞赋值的次序是经过仔细安排的,以使仿真的结果与移位寄存器相一致。虽然该模块可被综合成移位寄存器,但我们不建议使用这种风格的模块来描述时序逻辑。

[例5] 不好的用阻塞赋值来描述移位时序逻辑的风格(方式 #3)

module 

本例中,阻塞赋值分别被放在不同的always 块里。仿真时,这些块的先后顺序是随机的,因此可能会出现错误的结果。这是Verilog 中的竞争冒险。按不同的顺序执行这些块将导致不同的结果。但是, 这些代码的综合结果却是正确的流水线寄存器。也就是说,前仿真和后仿真结果可能会不一致。

[例6] 不好的用阻塞赋值来描述移位时序逻辑的风格(方式 #4)

module 

[例7] 正确使用非阻塞赋值来描述时序逻辑的设计风格 (方式 #1)

module 

[例8] 正确使用非阻塞赋值来描述时序逻辑的设计风格 (方式 #2)

module 

[例9] 正确使用非阻塞赋值来描述时序逻辑的设计风格 (方式 #3)

module 

[例10] 正确使用非阻塞赋值来描述时序逻辑的设计风格 (方式 #4)

module 

以上移位寄存器时序逻辑电路设计的例子表明:

•4种阻塞赋值设计方式中有1种可以保证仿真正确

•4种阻塞赋值设计方式中有3种可以保证综合正确

•4种非阻塞赋值设计方式全部可以保证仿真正确

•4种非阻塞赋值设计方式全部可以保证综合正确

阻塞赋值和非阻塞赋值的原则归纳如下:

  • 原则1:时序电路建模时,用非阻塞赋值。
  • 原则2:锁存器电路建模时,用非阻塞赋值。
  • 原则3:用always 块写组合逻辑时,采用阻塞赋值。
  • 原则4:在同一个always 块中同时建立时序和组合逻辑电路时,用非阻塞赋值。
  • 原则5:在同一个always 块中不要同时使用非阻塞赋值和阻塞赋值。
  • 原则6:不要在多个always 块中为同一个变量赋值。

本文首发于微信公众号“花蚂蚁”,想要学习FPGA及Verilog的同学可以关注一下。

verilog reg赋初值_Verilog语法之六:阻塞赋值与非阻塞赋值相关推荐

  1. Verilog HDL中阻塞语句和非阻塞语句的区别

    在Verilog中有两种类型的赋值语句:阻塞赋值语句("=")和非阻塞赋值语句("<=").正确地使用这两种赋值语句对于Verilog的设计和仿真非常重要 ...

  2. 【Verilog 基础】阻塞赋值和非阻塞赋值的区别

    目录 阻塞赋值 非阻塞赋值 实际工程仿真 阻塞赋值仿真 编写Verilog代码 编写测试文件代码 综合看RTL图 进行实际仿真 非阻塞赋值仿真 编写Verilog代码 编写测试文件代码 综合看RTL图 ...

  3. Verilog中阻塞赋值和非阻塞赋值的区别

    Verilog中阻塞赋值(=)和非阻塞赋值(<=)的区别 **阻塞赋值:**前面语句执行完,才可执行下一条语句:即:前面语句的执行(b=a)阻塞了后面语句的执行(c=b).即:always块内, ...

  4. verilog中阻塞赋值与 非阻塞赋值的区别

    非阻塞(Non_Blocking)赋值方式( 如 b <= a; ), 块结束后才完成赋值操作,值并不是立刻就改变的, 这是一种比较常用的赋值方法.(特别在编写可综合模块时). 阻塞(Block ...

  5. 07-阻塞赋值与非阻塞赋值原理分析——小梅哥FPGA设计思想与验证方法视频教程配套文档...

    芯航线--普利斯队长精心奉献 实验目的:掌握阻塞赋值与非阻塞赋值的区别 实验平台:无 实验原理: 阻塞赋值,操作符为"=","阻塞"是指在进程语句(initia ...

  6. 把变量赋值给寄存器_阻塞赋值和非阻塞赋值的区别与记忆

    罗成:Verilog语法之六:阻塞赋值与非阻塞赋值​zhuanlan.zhihu.com 通过上面的文章先了解下,阻塞赋值和非阻塞赋值的区别. b<=a; c<=b; 非阻塞赋值 b=a; ...

  7. 硅芯思见:阻塞赋值与非阻塞赋值

    0 丑话说在前边 RHS:运算符(= or <=)右侧的表达式 LHS:运算符(= or <=)左侧的表达式 竞争(Race Condition):在同一仿真时间槽(time-slot)多 ...

  8. 通过举例谈谈阻塞赋值与非阻塞赋值的区别

    这篇博客,通过举例说明:非阻塞赋值和阻塞赋值的区别? 一般非阻塞赋值用于时序逻辑,而阻塞赋值用于组合逻辑: 非阻塞赋值语句是并行执行的,等到一个时钟完成后才完成赋值,而阻塞赋值是顺序执行的,下一条赋值 ...

  9. 查询框赋值后不可编辑_【技巧分享】阻塞赋值与非阻塞赋值

    原创 小黑同学 明德扬FPGA科教 关于阻塞赋值和非阻塞赋值的问题,明德扬的学员提得比较多,今天小黑老师专门给大家普及一下阻塞赋值和非阻塞赋值的相关知识. 一.概述 1.阻塞赋值对应的电路往往与触发沿 ...

最新文章

  1. TF-IDF与余弦相似性的应用
  2. 益老而弥坚:软件开发哲学反思录
  3. shell批量创建和删除10个系统帐号密码(密码为随机10位字符串)
  4. 最大似然估计MLE和最大后验估计MAP理解
  5. JPEG压缩matlab实现
  6. Apache Kafka-max.poll.interval.ms参数含义说明
  7. P1886 滑动窗口(求连续区间最值的O(N)解法,单调队列)
  8. V星入侵(V 2009)第一季全集下载
  9. informix报错244_关于informix的配置问题
  10. 第六次课作业(质量管理、项目人力资源管理)
  11. *[hackerrank]Girlfriend Necklace
  12. linux文件管理服务,linux系统配置及服务管理_文件管理
  13. python语言三大基本控制结构_Python基础知识之4——三大控制结构
  14. js获取下月时间_JS获取上月,本月,下月的开始时间与结束时间
  15. web测试 结果存储类型为“Database”,但尚未指定结果储存库连接字符串
  16. JavaEE之HTML常见标签及个人简历制作
  17. Winform UI界面设计例程——多线程访问UI控件
  18. Android获取外网IP地址
  19. 题解-怪盗基德的滑翔翼 c++
  20. 古诗词PPT模板推荐

热门文章

  1. STM32CubeMX配置SDRAM
  2. 实例:Qt | 百度语音识别
  3. 单招软件职业技能测试,2018绵阳职业技术学院单独招生《软件技术》专业技能测试方案...
  4. ps3安装linux的功能,ps3上linux系统安装
  5. 面试题-python/django/sql
  6. 基于Python的模型的保存、恢复、继续训练
  7. 邓丽君领域建模题目答案以及建模竞赛题第2赛季第24轮
  8. HDU6599 (字符串哈希+回文自动机)
  9. 元素周期表排列的规律_元素周期表排列规律资料
  10. 好用的机电revit软件丨revit中怎么画球体,半球体,椭球体?