大家可會好奇,同樣是賦值,為什麼會有 <=
, =
的區別呢?這就要提到 blocking
和 nonblocking
的概念。
先給一個 Pseudocode,再來分析兩者的差別:
// 初始化變數
a <- 5
b <- 6
c <- 7
// 主程式
b <- a
c <- b
a <- c
為了不混淆,我們以
<-
代表賦值
// 初始化變數
initial begin
a = 5;
b = 6;
c = 7;
end
// 主程式:blocking assignment (=)
always *(posedge clk) begin
b = a;
c = b;
a = c;
end
Blocking 表示的過程就和 C 語言的運行方式一樣,也就是說執行完 b = a
之後,才會執行 c = b
, a = c
。因此當電路運行後,a
, b
, c
皆為 5 。Blocking 的含義就是當執行 b = a
時,下方的電路不會被執行,就像被擋住 (block) 一般。
// 初始化變數
initial begin
a <= 5;
b <= 6;
c <= 7;
end
// 主程式:nonblocking assignment (<=)
always *(posedge clk) begin
b <= a;
c <= b;
a <= c;
end
Nonblocking 加入了平行運算的概念,也就是說 b <= a
, c <= b
, a <= c
是同時運作的。也可以用另一個觀點來看,我們先確認所有 <=
右邊的運算結果,再一次賦值給 <=
左邊。因此最終的結果 a
是 7 ,b
是 6 ,c
是 5 。
Blocking 和 nonblocking 並非每次都要考慮,像是上述的「初始化變數」,變數之間沒有相依性問題,就不需要考慮。Blocking 大致上可以視為用在組合電路的賦值,而 nonblocking 可以視為用在循序電路的賦值。以此區別就可以減少很多錯誤了,當然特殊情況不在此限!