EazyChange

导航

 

阻塞赋值(=):

  我们先做下面定义:RHS—赋值等号右边的表达式,LHS—赋值等号左边的表达式。在串行语句块中,阻塞赋值语句按照它们在块中的排列顺序依次执行,即前一条语句没有完成赋值之前,后面的语句不可能被执行,换言之,后面的语句被阻塞了。阻塞赋值的执行可以认为只有一个步骤的操作,即计算RHS并更新LHS,此时不允许有来自任何其他Verilog语句的干扰。所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上是在前一条赋值语句结束后开始赋值的。有句话我一直没读懂:从理论上讲,它与后面的赋值语句只有概念上的先后,而无实质上的延时。

  例如:

  begin

    B = A;

    C = B + 1;

  end

  首先第一条语句执行,将A的值赋给B,接着执行第二条语句,将B+1(即A加1),并赋给C。也就是说C = A + 1。

 

  非阻塞赋值(<=):

  非阻塞语句的执行过程是:首先计算语句块内部所有右边表达式(RHS)的值,然后完成对左边寄存器变量的赋值操作,例如,下面两条非阻塞赋值语句的执行过程是:先计算右边表达式的值并暂存在一个暂存器中,A的值被保存在一个寄存器中,而B+1的值被保存在另一个寄存器中,在begin和end之间所有语句的右边表达式都被计算并存储完后,对左边的寄存器变量的赋值才会进行。这样C得到的是B的原始值而不是A加一。

  begin

    B <= A;

    C <= B +1;

  end

 

  如果我们想让两个最基本的D触发器串联,我们用阻塞和非阻塞赋值看看结果有什么不同

  阻塞和非阻塞的不同造成了电路上巨大的不同,因此他们的差别应该牢记。

  我们在从仿真(Simulation)的角度去看一下,在输出结果上有造成什么样的不同,我们有同样的的testbench。

 

代码

 

  仿真波形如下:

  可以看到,在阻塞赋值的情况下当时钟上升沿来的时候读取输入iD的值,并且输出oQA和oQB的值应该是一样的,从波形中我们可以看出输出oQA和oQB的波形是完全一样的。

  在非阻塞赋值的情况下,它是先计算 iD 和 oQA的值,开始 iD的值为1, oQA的值是不定的,所以oQA被赋为1, 而oQB还是被赋为不定值,两者的波形不一致。

 

  阻塞和非阻塞的学习随着以后的深入还得深刻理解,在用时要遵循规则,避免麻烦。

posted on 2015-04-15 14:33  EazyChange  阅读(487)  评论(0编辑  收藏  举报