1. 程式人生 > >verilog中阻塞賦值與 非阻塞賦值的區別

verilog中阻塞賦值與 非阻塞賦值的區別

非阻塞(Non_Blocking)賦值方式( 如 b <= a; ), 塊結束後才完成賦值操作,值並不是立刻就改變的, 這是一種比較常用的賦值方法。(特別在編寫可綜合模組時)。

阻塞(Blocking)賦值方式( 如 b = a; ),  賦值語句執行完後,塊才結束,值在賦值語句執行完後立刻就改變的,  可能會產生意想不到的結果。

一般情況下

組合邏輯使用=賦值,

時序邏輯使用<=賦值。

舉個例子:

初始化m=1,n=2,p=3;分別執行以下語句
1、begin 
   m=n;

n=p;

p=m;
   end
2、begin
   m<=n;

n<=p;

p<=m;
   end
結果分別是:1、m=2,n=3,p=2;(在給p賦值時m=2已經生效)

2、m=2,n=3,p=1;(在begin-end過程中,m=2一直無效而是在整體執行完後才生效)
這兩種賦值“=”用於阻塞式賦值;“<=”用於非阻塞式賦值中。
阻塞賦值:阻塞賦值語句是在這句之後所有語句執行之前執行的,即後邊的語句必須在這句執行完畢才能執行,所以稱為阻塞,實際上就是順序執行。
非阻塞賦值:非阻塞賦值就是與後邊相關語句同時執行,即就是並行執行。
所以一般時序電路使用非阻塞賦值,assign語句一般使用=阻塞賦值;
組合邏輯電路使用阻塞賦值。

在使用阻塞賦值和非阻塞賦值時的八大原則:

1)時序電路建模時,採用非阻塞賦值;

2)鎖存器電路建模時,採用非阻塞賦值;

3)用always塊建立組合邏輯模型時,採用阻塞賦值;

4)用always塊建立時序和組合邏輯混合電路時,採用非阻塞賦值;

5)不要在同一個always塊中同時使用非阻塞賦值和阻塞賦值;

6)不要在一個以上的always塊中為同一個變數賦值;

7)用$strobe系統任務來顯示用非阻塞賦值的變數值;

8)在賦值時,不要用#0延遲;
--------------------- 
作者:企業雲基礎平臺 
原文:https://blog.csdn.net/iPlatForm/article/details/78874239

 
版權宣告:本文為博主原創文章,轉載請附上博文連結!