精华内容
下载资源
问答
  • 文章主要介绍Verilog中阻塞赋值和非阻塞赋值的正确使用方法。
  • 阻塞赋值和非阻塞赋值

    万次阅读 2019-05-11 19:17:06
    一、阻塞赋值 阻塞赋值的操作符为=; 阻塞赋值的执行可以认为是只有一个步骤的操作:所谓阻塞的...二、非阻塞赋值 非阻塞赋值的操作符为<=; 非阻塞赋值的操作可以看作为两个步骤的过程: 1)在赋值时刻开始时,计...

    一、阻塞赋值

    阻塞赋值的操作符为=;
    阻塞赋值的执行可以认为是只有一个步骤的操作:所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后在开始赋值的。
    阻塞赋值在语句结束后立即完成赋值操作;
    阻塞赋值常用于组合逻辑电路的设计

    二、非阻塞赋值

    非阻塞赋值的操作符为<=;
    非阻塞赋值的操作可以看作为两个步骤的过程:
    1)在赋值时刻开始时,计算非阻塞赋值RHS表达式。
    2)在赋值时刻结束时,更新非阻塞赋值LHS表达式。
    非阻塞赋值常用于时序逻辑电路的设计

    三、总结:

    阻塞赋值是顺序执行的,而非阻塞赋值是并行执行的 ;

    展开全文
  • 阻塞赋值和非阻塞赋值的深度理解

    千次阅读 多人点赞 2021-05-10 22:55:14
    1.1简单叙述阻塞赋值和非阻塞赋值的区别: (1)阻塞赋值(=)必须是阻塞赋值完成后,才进行下一条语句的执行;赋值一旦完成,等号左边的变量值立即变化。在同一个块中,非阻塞赋值表达式的书写顺序不影响赋值的结果。...

    1、先看看常问的问题
    1.1简单叙述阻塞赋值和非阻塞赋值的区别:
    (1)阻塞赋值(=)必须是阻塞赋值完成后,才进行下一条语句的执行;赋值一旦完成,等号左边的变量值立即变化。在同一个块中,非阻塞赋值表达式的书写顺序不影响赋值的结果。硬件没有对应的电路。(要点为串行,立即生效)
    (2)非阻塞赋值(<=),在赋值开始时计算表达式右边的值,在本次仿真周期结束时才更新被赋值变量,即赋值不是立即生效的;非阻塞赋值允许块中其他语句同时执行。在同一个块中,非阻塞赋值表达式的书写顺序不影响赋值的结果。硬件有对应的电路。
    (要点:并行,不是立即生效,同时执行)
    1.2具体例子:移位寄存器
    (1)阻塞赋值按照下面的写法生成的并非移位寄存器

    module pipe(
    input d,
    input clk,
    output q3
    );
    reg q1,q2,q3;
    always@(posedge clk)
    	begin
    			q1=d;
    			q2=q1;
    		   q3=q2;
    	end
    endmodule
    

    综合效果如下图所示:
    在这里插入图片描述
    用阻塞赋值实现移位寄存器的代码:
    module pipe(
    input d,
    input clk,
    output q3
    );
    reg q1,q2,q3;
    always@(posedge clk)
    begin
    q3=q2;
    q2=q1;
    q1=d;
    end
    endmodule
    在这里插入图片描述也就是说,在阻塞赋值的块中,各个语句的顺序不一样,综合出来的结果是不同的。

    (2)将上面两个换成非阻塞赋值后,综合出来的结果都是移位寄存器且结果相同。
    第一种情况的代码及对应电路

    module pipe(
    input d,
    input clk,
    output q3
    );
    reg q1,q2,q3;
    always@(posedge clk)
    	begin
    			q1<=d;
    			q2<=q1;
    		   q3<=q2;
    	end
    endmodule
    

    在这里插入图片描述
    第二种情况的代码和对应的电路

    module pipe(
    input d,
    input clk,
    output q3
    );
    reg q1,q2,q3;
    always@(posedge clk)
    	begin
    		q3<=q2;
    		q2<=q1;
    		q1<=d;
    	end
    endmodule
    

    在这里插入图片描述
    2、两个多选题
    在这里插入图片描述
    第一个题:ABD
    分析原因:不选C的原因,非阻塞赋值也可描述组合逻辑电路,只是这样的代码风格不好。
    这个题我也不能确定是不是这样理解,如果您发现有不对的,望您能指点我一下。我不选C是来源于下面:
    在这里插入图片描述

    第二个题:ABD

    3、看夏宇闻老师《Verilog数字系统设计教程》的读书笔记
    阻塞赋值对应的电路结构往往与触发沿没有关系,只与输入的电平变化有关系;非阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生赋值的情况。
    阻塞赋值操作符是“=”,非阻塞赋值操作符是“<=”。
    阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上是前一句赋值语句结束后再开始赋值的。
    非阻塞赋值的概念是指在赋值操作开始时刻计算RHS表达式,赋值操作结束时刻更新LHS。关键来了,always块里的其他语句是同时进行计算RHS表达式和更新LHS的。

    非阻塞赋值操作只能对寄存器类型变量进行赋值,因此只能用在“initial”块和“always”块等过程块中,非阻塞赋值不能用于连续赋值(assign语句)。
    个人理解:阻塞赋值是指过程块中的语句是串行执行的(即一条语句执行完成才能执行下一条语句);非阻塞赋值是指过程块中的语句是并行执行的,即所有的语句都可以在赋值操作开始时刻同时计算RHS,在赋值操作结束时刻同时更新LHS。

    8个要点:
    (1) 时序电路建模时,用非阻塞赋值(<=)。
    (2) 锁存器电路建模时,用非阻塞赋值(<=)。
    (3) 用always块建立组合逻辑时,用阻塞赋值(=)。
    (4) 在同一个always块中建立时序和组合逻辑电路时,用非阻塞赋值。
    (5) 在同一个always块中不要既用非阻塞赋值又用阻塞赋值。
    (6) 不要在一个以上的always块中为同一个变量赋值。
    (7) 用$strobe系统任务来显示用非阻塞赋值的变量值。
    (8) 在赋值时不要使用#0延迟。

    4、希望加强记忆的部分内容
    (1)KaTeX parse error: Expected 'EOF', got '#' at position 322: …FFFFFF,t_70)(2)#̲0延时赋值:在非阻塞赋值操作前…strobe
    在这里插入图片描述(4)verilog层次化事件队列
    在这里插入图片描述
    5、思考题
    思考题:
    (1) 用电平敏感列表触发条件的always块表示组合逻辑时,应该用哪一种赋值。
    阻塞赋值
    (2) 用带时钟沿触发条件的always块表示时序电路时,应该使用哪一种赋值?
    非阻塞赋值

    (3) 为什么不能在多个always块中为同一个变量赋值?
    可能会导致竞争冒险,即使使用非阻塞赋值也可能产生竞争冒险。因为always块的执行顺序其实是随机的,所以仿真的时候会产生竞争冒险。

    (4) 为什么不能用$display系统任务来显示用阻塞赋值的变量值?
    在这里插入图片描述

    也就是display命令的执行在非阻塞赋值之前执行
    (5) s t o r e 和 store和 storedisplay这两个显示用系统任务有什么不同?各用于什么场合?
    简言之: s t o r e 是 显 示 在 非 阻 塞 赋 值 结 束 后 的 值 。 store是显示在非阻塞赋值结束后的值。 storedisplay是显示在非阻塞赋值操作之前的值。
    细节如下:
    s t r o b e 和 strobe和 strobemonitor显示命令是排列在监控事件队列中。在仿真的每一步结束时刻,当该仿真步骤内所有的赋值都完成以后, s t r o b e 和 strobe和 strobemonitor显示出所有要求显示的变量值的变化。
    在这里插入图片描述在这里插入图片描述

    (6) 仿真器在处理阻塞和非阻塞赋值操作队列过程中有什么不同?
    阻塞赋值是由动态事件队列调度的,而非阻塞赋值不是由动态事件队列调度的。
    (7) 为什么在可综合verilog模块的设计中,必须注意并遵守本章的8条原则?

    在这里插入图片描述在这里插入图片描述

    关键词:避免出现冒险和竞争的现象;保证综合前仿真和综合后仿真一致。

    展开全文
  • 1、阻塞赋值   是顺序执行的,上面一条语句执行完之后,再执行下一行语句,如下图所示: 2、非阻塞赋值   第一行语句执行的时候,并不阻止下面语句的执行,并行执行。如下图所示: ...

    1、阻塞赋值
      是顺序执行的,上面一条语句执行完之后,再执行下一行语句,如下图所示:
    在这里插入图片描述

    2、非阻塞赋值
      第一行语句执行的时候,并不阻止下面语句的执行,并行执行。如下图所示:
    在这里插入图片描述
    3、使用方法
    在这里插入图片描述


    展开全文
  • Verilog中的赋值语句类型主要分为两类,阻塞赋值语句和非阻塞赋值语句,关于赋值赋值语句和非阻塞赋值语句的区别,下面我们将通过实际代码以及仿真结果来进行形象的讲解。 一、阻塞赋值语句 阻塞赋值操作实质...

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档





    前言

           Verilog中的赋值语句类型主要分为两类,阻塞赋值语句和非阻塞赋值语句,关于赋值赋值语句和非阻塞赋值语句的区别,下面我们将通过实际代码以及仿真结果来进行形象的讲解。




    一、阻塞赋值语句

           阻塞赋值操作实质上是一次性连续完成的,即计算等号右边变量(或表达式)的值并立即赋值给等号左边的变量。

           其中阻塞的含义为在同一个always块中,当前赋值语句正在执行时,禁止其后的所有其他赋值语句的执行。只有当前赋值语句执行完成后,其后的赋值语句才能被执行。

          下面设计了一个简单的数字电路,

    功能:(1)当有复位信号(rst=0时),a0、a1、a2的值均为0;

              (2)当没有复位信号时,在时钟的上升沿,a2=(a0 & a1)|(~a0 & ~a1),然后把a2赋给a1,再把a1赋给a0,注意,以上赋值均为阻塞赋值,即用=号进行的赋值;

              (3)a0的值作为输出。

          代码如下:

    module blocking_assign(out,clk,rst);
       input clk;
       input rst;
       output out;
       
       reg a0,a1,a2;
       
       assign out=a0;
       
       always @(posedge clk,negedge rst)
         if (~rst)
    	   begin 
    	     a2=1'h0;
    		 a1=1'h0;
    		 a0=1'h0;	 
    	   end
    	 else
    	   begin 
    	     a2=(a0 & a1)|(~a0 & ~a1);
    		 a1=a2;
    		 a0=a1;
    	   end
    	
    endmodule

    仿真结果如下:




    二、非阻塞赋值语句




            非阻塞赋值操作实质上是分两步完成的,即第一步:在敏感事件开始时刻(如clk正跳变沿开始时刻)开始计算等号右边变量(或表达式)的值;第二步:在敏感事件结束时刻(如clk正跳变沿结束时刻)将等号右边的值赋给等号左边的变量。即计算和赋值之间有个微小的时间差。

            其中非阻塞的含义为在执行当前的非阻塞赋值语句的同时允许其他的语句执行。

            下面代买是上面同样功能的非阻塞赋值实现:

    module nb_assign(out,clk,rst);
       input clk;
       input rst;
       output out;
       
       reg a0,a1,a2;
       
       assign out=a0;
       
       always @(posedge clk,negedge rst)
         if (~rst)
    	   begin 
    	     a2<=1'h0;
    		 a1<=1'h0;
    		 a0<=1'h0;	 
    	   end
    	 else
    	   begin 
    	     a2<=(a0 & a1)|(~a0 & ~a1);
    		 a1<=a2;
    		 a0<=a1;
    	   end
    	
    endmodule

      这里简单的讲解下非阻塞赋值的一些重点应用场景。

           就如上图代码所示,需要将a0、a1表达式的计算结果赋给a2,然后将a2的值赋给a1,再讲a1的值赋给a0;这里就要好好理解非阻塞赋值计算和赋值之间的时间差的重大意义。

                                               式1  :a2<=(a0 & a1)|(~a0 & ~a1)             

                                               式2 : a1<=a2

                                               式3 :    a0<=a1

           因为非阻塞赋值语句是允许后面的语句同时运行,也就是说,其实式1、式2、式3左边的表达式(一个变量也可以理解成表达式)是同时进行计算的,但因为非阻塞赋值语句当中计算和赋值之间有个微小的时间差,所以说式2左边的表达式a2的值,不是与它同时运行的式1左边表达式的计算结果,因为还没有赋给a2这个变量(表达式的计算值暂时存在了内存当中),所以此时a2取得是当前事件(clk上升沿)之前a2的存储值。

    下面是代码的仿真结果:

     简单理解的方法就是,当clk的上升沿来临时,计算a2的值,必须取clk上升沿前a0和a1的值进行计算,a1和a0的值也是同理(取clk上升沿之前)。

     
    




    总结

      理解好阻塞赋值和非阻塞赋值的区别,对Verilog数字设计将会有很大的帮助。

    今天的数字电路设计只是分享就到这儿,留下你们的关注支持下我吧,以后还会定时努力更新的!

    展开全文
  • 在做芯片设计写硬件描述语言时,对于初学者必然面对的一个问题是,该如何使用阻塞赋值和非阻塞赋值。对于个问题,首先要理解什么是阻塞赋值?什么是非阻塞赋值? 阻塞赋值 从形式上来看,阻塞赋值用等号(=)表示...
  • Verilog语法之阻塞赋值和非阻塞赋值

    千次阅读 2020-02-07 14:32:06
    本文转自知乎罗成的文章Verilog语法之六:阻塞赋值与非阻塞赋值 总的文章小白如何快速入门Verilog 本文首发于微信公众号“花蚂蚁”,想要学习FPGA及Verilog的同学可以关注一下。 一、初步理解阻塞赋值与非阻塞赋值 ...
  • 过程赋值语句,又分为阻塞赋值和非阻塞赋值语句。 1. 阻塞赋值   阻塞赋值的语法如下: 寄存器变量 = 表达式 ; 右边表达式的逻辑计算和对左边寄存器变量的赋值是一个统一操作中的两个小操作,这两个小操作之间...
  • Verilog中阻塞赋值(=)和非阻塞赋值(<=)的区别 **阻塞赋值:**前面语句执行完,才可执行下一条语句;即:前面语句的执行(b=a)阻塞了后面语句的执行(c=b)。即:always块内,2条语句顺序执行。 **非阻塞赋值:...
  • 阻塞赋值和非阻塞赋值三条黄金使用原则 3 golden rules 1、时序逻辑一定用非阻塞赋值”<=”,一旦看到敏感列表有 posedge 就用”<=”。 2、组合逻辑一定用”=” ,一旦敏感列表没有 posedge 就用”=”,一旦...
  • 阻塞赋值的执行可以认为是只有一个步骤的操作,即计算RHS并更新LHS,且不允许其他语句的干扰。
  • 阻塞赋值和非阻塞赋值竞争实验 RHS:运算符(= or <=)右侧的表达式 LHS:运算符(= or <=)左侧的表达式 竞争(Race Condition):在同一仿真时间槽(time-slot)多条语句同时执行顺序不同时可能产生不同的...
  • Verilog中阻塞赋值(=)和非阻塞赋值(<=)的区别 **阻塞赋值:**前面语句执行完,才可执行下一条语句;即:前面语句的执行(b=a)阻塞了后面语句的执行(c=b)。即:always块内,2条语句顺序执行。 **非阻塞赋值:...
  • 阻塞赋值“=”在beginend之间的语句是顺序执行,属于串行语句。always语句的敏感变量如果不含有时钟,即always(*)这样描述,那么也属于组合逻辑,需要使用阻塞赋值。 一个组合逻辑的例子: always @(*) begin ...
  • 总是在阻塞赋值和非阻塞赋值这里困惑,今天有空做了个小的仿真实验,终于弄明白了这verilog仿真器中赋值时的规律,有过verilog仿真经验的直接看底部图即可。 首先引起我迷惑的是在verilog仿真的时候,总会设计到一...
  • 原文链接: http://blog.sina.com.cn/s/blog_6c7b6f030101hl9t.html 稍微接触过Verilog HDL的都对阻塞与非阻塞赋值略知...
  • 简介: IEEE Verilog标准中提供了阻塞赋值和非阻塞赋值方式,二者在应用中存在区别。
  • Verilog中阻塞赋值和非阻塞赋值区别

    千次阅读 2016-06-01 17:33:53
    1、阻塞赋值操作符用等号(即 = )表示。“阻塞”是指在进程语句(initialalways)中,当前的赋值语句阻断了其后的语句,也就是说后面的语句必须等到当前的赋值语句执行完毕才能执行。而且阻塞赋值可以看成是一步...
  • FPGA中阻塞赋值与非阻塞赋值原理实验
  • =驱动表达式 非阻塞赋值比较接近真实的电路工作状态,应为他从综合的角度考虑到了延时并行性。 在过程启动中,非阻塞赋值使三条语句同时运行,而阻塞赋值是按顺序方式完成更新的数据的。 新...
  • 一、初步理解阻塞赋值与非阻塞赋值 在Verilog HDL语言中,信号有两种赋值方式: (1).非阻塞(Non_Blocking)赋值方式( 如 b <= a; ) 块结束后才完成赋值操作。 b的值并不是立刻就改变的。 这是一种比较常用的...
  • Ciletti5.8行为建模方式的比较5.8.2 数据流/寄存器传输级模型硬禾学堂class.eetree.cn阻塞赋值非阻塞赋值 时隔一年,再次学习阻塞赋值和非阻塞赋值,搜集多方资料,汇总于此,共同学习。希望对大家有所帮助。
  • 非阻塞赋值往往与触发沿有关系,只有在触发沿时才有可能发生赋值的变化; 两个要点 在描述组合逻辑的always块中使用阻塞赋值; 在描述时序逻辑的always块中使用非阻塞赋值; 阻塞的概念:同一个always块中。其...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,606
精华内容 25,042
关键字:

阻塞赋值和非阻塞赋值