大家可會好奇,同樣是賦值,為什麼會有 <=, = 的區別呢?這就要提到 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 可以視為用在循序電路的賦值。以此區別就可以減少很多錯誤了,當然特殊情況不在此限!