深刻理解阻塞和非阻塞的不一样

记住:阻塞赋值就是它运行时,别人就不能运行,而且直接赋值到底

     非阻塞赋值就是它运行时,不阻碍别人的运行,这里说不清(你懂的就OK)

   num<=num+1;//是表明只有在时钟结束的时候右边的数据才赋值给左边的寄存器。

  

1、设计原则

  一、在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;编程

  二、在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构;布局

2、语句排列前后的缺点

  一、语句的排列有时候是决定了语句的执行顺序。当几个语句在同一时刻执行时,可是因为排列的不一样就会形成前后执行,就会出现竞争冒险。spa

3、什么叫阻塞赋值?

  一、阻塞赋值操做符”=“设计

  二、为何叫阻塞赋值呢?教程

    即阻止其余语句执行的赋值语句。由于在赋值时,先计算等号右边部分的值,此时赋值语句就不容许任何别的语句的执行,直到如今的赋值完成,即左边等于右边的时候,才容许别的语句执行。队列

  三、阻塞赋值缺点举例说明:事件

    1)always@(posedge clk or posedge rst)同步

      if(rst) y1=0;it

      else y1=y2;变量

    2)always@(posedge clk or posedge rst)

      if(rst) y2=1;

      else y2=y1;

    在同一个时钟沿到来时,咱们二者的两个always块在硬件上是不可能同步的,中间会差个几皮秒的相隔时间。

    若是1)先执行,那么y1和y2都是1。

    若是2)先执行,那么y1和y2都是0。

    这说明这个verilog模块是不稳定的,一定会产生冒险和竞争。

4、非阻塞赋值

  一、为何叫非阻塞赋值?

    由于在整个右边语句计算和左边语句被赋值的过程当中,其余语句依然能够运行。

  二、非阻塞赋值操做过程:

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

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

5、verilog模块编程要点

  记住如下8点,才能在综合布局布线后的方阵中避免出现冒险竞争现象。

  一、时序电路建模时,用非阻塞赋值。

  二、锁存器电路建模时,用非阻塞赋值。

  三、用always块创建组合逻辑模型时,用阻塞赋值。

  四、在同一个always块中,创建时序和组合逻辑电路时,用非阻塞赋值。

  五、在同一个always块中不要即便用非阻塞赋值又使用阻塞赋值。

  六、严禁在多个always块中对同一个变量赋值。易产生竞争冒险。

  七、用$strobe系统任务来显示用非阻塞赋值的变量值。

  八、在复制时不要使用#0延迟。

6、verilog的层次化事件队列

  这里我没有看懂,就是感受有一个点:非阻塞赋值LHS变量的更新是安排在非阻塞赋值更新事件队列中,而剩余的其余队列是被安排在另外的一个队列事件中。

7、实例讲解

  一、使用阻塞赋值,不能自行触发的振荡器,不建议

    initial #10 clk=0;//--------------------------(1)

    always@(clk) //-----------------------------(2)

      #10 clk=~clk;//------------------------(3)

    这里使用的是阻塞赋值,在(1)中,咱们的clk变化成0,触发了always块,延迟10ns,clk变成1

    注意在由0->1的过分期间,咱们是不容许任何其余程序执行的,因此always块没有检测到变化,也就是always块并无由于第二次的clk变化而被触发。

  二、采用非阻塞赋值,自触发振荡器,不建议

    initial #10 clk=0;//--------------------------(1)

    always@(clk) //-----------------------------(2)

      #10 clk<=~clk;//-----------------------(3)

     这里always块第一次触发后~clk便被计算出来,并赋值给LHS的事件并被安排在更新事件队列中。在非阻塞赋值更新事件队列被激活以前,又遇到@(clk)语句。当clk发生变化时,always块便被触发。这里看来延迟10ns是有必要的。

  三、移位寄存器模型

    当阻塞赋值时,在并行的always块中,咱们虽然说是并行的,当是他们开始的时间是有前后的,这样就可能形成竞争现象,因此咱们不建议在用阻塞赋值。可是咱们使用非阻塞赋值时,就不会出现竞争现象,由于他不是阻塞的,也不会当即就会变化的。这样很好,你懂的。。。。

  

摘自:verilog数字系统设计教程(夏宇闻)

相关文章
相关标签/搜索