--- title: Blocking & Non-blocking description: View the slide with "Slide Mode". --- # Blocking & Non-blocking ## 實驗內容 * 分析 Blocking & Non-blocking 的分別 ## 程式碼 blocking.v ```verilog=11 always @(posedge clk or negedge rst_n) begin //正緣觸發 if (~rst_n) begin a = a_i; //a_o = a_i b = b_i; //b_o = b_i end else begin a = b; //a_o = b_o b = a; //b_o = b_o end end ``` nonblocking.v ```verilog=11 always @(posedge clk or negedge rst_n) begin //正緣觸發 if (~rst_n) begin a <= a_i; //a_o = a_i b <= b_i; //b_o = b_i end else begin a <= b; //a_o = b_o b <= a; //b_o = a_o end end ``` ## 結果 blocking ![](https://imgur.com/C8whUpU.png) nonblocking ![](https://imgur.com/xjJXoUR.png) ## 說明 >blocking 與 nonblocking 差別在 = 和 <= >blocking 中會依序執行,先將 b 的值存進 a,此時再執行 b = a 時 b 會等於 b 的上一個狀態,從圖表中會發現 b_o 的狀態一直保持不變,這段的等於跟平常寫的程式的觀念是一樣的。 >但 nonblocking 中的 <= 會同時執行,所以 a 會等於 b 的上一個狀態,反之 b 會等於 a 的上一個狀態,從圖表中可以明顯發現一直在互換,如果在C語言裡要達成這樣的狀態話,需要多設一個暫存的變數才可以互換兩個值。 ## 心得 >這次實驗中我覺得比較複雜的地方是正緣觸發以及可以同時並行這兩點我花比較多時間理解。