November 9, 2011

blocking & non-blocking


顧名思義,所謂的blocking就是verilog大括號所刮起來的敘述中,每個敘述是必須依序執行的,例如: 

always @(a or b) begin 
a=#1 b; 
c=#2 a; 
end 

這邊在always使用的是=的operator,也就是blocking的敘述。這段程式碼模擬的時候,a會在b的值變動後的一個時間單位被賦予b的值,而c會在a被賦予b的值之後的兩個時間單位,被賦予a的值。也就是說c會在b的值變動後的三個時間單位才會被賦予b的值。這是因為blocking的敘述,將每個敘述都視為要依序執行的,因此必須等前一個敘述完成之後才會執行下一個敘述。 

那如果使用non-blocking的operator(<=),程式改寫如下 
always@(a or b)begin 
a<=#1 b; 
c<=#2 a; 
end 

這段程式碼,會在b的值變動的一個時間單位之後,將b的值賦予給a,不過在b的值變動的第二個時間單位之後,a的值就會傳給了c,而不會到第(1+2)個時間單位過後才給值。看得出來嗎? 差別就在使用non-blocing的敘述,括號內的所有敘述都是"同時"執行的,不會有先後關係。這主要是為了硬體的特性,軟體主要都是依序執行的,這種平行的觀念比較常在硬體出現。


ref: http://tinyurl.com/3takxyw

No comments:

Post a Comment

三個逗號俱樂部

《免責聲明》 本部落格不針對任何金融商品進行買賣建議, 內容來自公開資訊觀測站之分享與各大媒體之評論為主, 投資人應審慎評估並獨立判斷,切勿以本部落格資訊作為投資依據。 靜候 時機來臨;瞬間掌握重壓;享受 獲利奔馳。 -------------------------...