Blocking & Non Blocking
1. Blocking的語法 = //循序式的方式執行程式
Exp :
always@(posedge clock)
begin
Data = A&B; // blocking會先執行第一行程式
OUT = A+B; // 緊接著再執行第二行程式
end
注意 : 電路都使用blocking的方式設計會造成電路串連的太長,導致延遲太多時間。
2. Non blocking的語法 <= //平行式的方式執行程式
Exp :
always@(posedge clock)
begin
Data <= A&B; // non blocking會同時執行
OUT <= A+B; //
end
注意 : 電路都使用non blocking的方式設計會造成電路面積加大(成本提高),因為並行處理的輸出都要額外給予一個暫存器來儲存。
對於新手而言,該如何準確的判斷哪些時候該選用blocking,哪些時候又該選用non blocking來做處理,有相當程度的困難。因此通常會給予新手一些建議,避免設計電路上的錯誤。
1. 組合邏輯assign電路採用blocking,且必須搭配wire。
2. 循序邏輯always電路採用non blocking,且必須搭配reg。
# 組合邏輯à與時間無關,大多作為運算用。(如加、減法器)
# 循序邏輯à與時間有關,大多作為記憶資料,但不能運算。(如正反器)