dynamic

阻塞与非阻塞的区别

0
阅读(3248)

做了一个PWM的简单模块,无意中让我发现了阻塞与非阻塞的他们的区别真的很大,一不小心真的会让人找不到错误在哪里。。。。。

下面我贴出我的分析:

非阻塞:always @(posedge CLOCK)
 if(!REST_N)
  begin
   F<=0;
   j<=0;
  end
 else
 begin 
  if(j==200)  
        F<= ~ F;
               if(j==300)   
        begin
   F<= ~ F;
   j<=0;
        end

  j<=j+1;
        end
结果做仿真的时候看到无论如何J加到了300也不能清零,我就纳闷了到底什么问题呢,郁闷了一会,突然我想到了在时序逻辑中不能对同一个变量再次赋值,这就非阻塞在整个always 结束后才赋值的原因,于是我果断的改了一下
always @(posedge CLOCK)
 if(!REST_N)
  begin
   F<=0;
   j<=0;
  end
 else
 begin 
  if(j==200)  
        F<= ~ F;
               if(j==300)   
        begin
   F<= ~ F;
   j=0;
        end
  j=j+1;
        end
结果就解决了,这下子真让我从实践中明白了,非阻塞是在always结束后才赋值。于是我又想了一招:
always @(posedge CLOCK)
 if(!REST_N)
  begin
   F<=0;
   j<=0;
  end
 else
 begin 
  if(j==200)  
        F<= ~ F;
               if(j==300)   
        begin
   F<= ~ F;
   j=0;
        end
  j<=j+1;
        end
于是乎又行了,呵呵,真正明白了阻塞跟非阻塞的赋值了。
但是这个代码让我有点费解的是,在时序逻辑中用非阻塞,组合逻辑中用阻塞,阻塞和非阻塞不要同时在一个always块中出现,貌似我这个小小的实验能把这个道理给推翻了,这是为什么呢?。。。。。