iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
Software Development

數位 IC 設計起手式系列 第 21

Day 21: Race Condition

  • 分享至 

  • xImage
  •  

Race Condition 中文翻譯為「競爭條件」。

這個問題非常常見,不只是在設計電路時出現,軟體設計時也會見到這個問題。稍微概述一下這個問題:當有兩個以上的行為同時進行,且這些行為會相互影響,那麼結果會如何?答案是不可預期。

Swap

我們以 swap 的行為來解釋這個現象。

initial a = b;
initial b = a;

這段程式碼包含兩個 initial blocks,所以兩個區塊會同時被執行,但是由於內部程式碼為 blocking 形式,實際上是誰先被執行,我們無法肯定。也因此這段程式碼不一定會達到 swap 的預期。這個行為衍生的問題就叫做 race condition 。

那麼該如何做調整呢?第一種方式就是增加變數 temp ,就像是我們在軟體設計所使用的方式。第二種方式就是改用 Nonblocking 形式。

先從第一種方式說起。我們增加兩個暫存用變數,分別儲存 a, b 的變數數值,接著再讓 a, b 從暫存的變數中取得數值,程式碼如下:

initial begin
    temp_a = a;
    temp_b = b;
    b = temp_a;
    a = temp_b;
end

使用這種方式,我們會搭配 blocking 的思維,這樣程式碼才會由上而下的去執行,最後 a, b 得到交換後的數值。

第二種方式是透過 Nonblocking 的賦值方式來達到 swap 。程式碼如下:

initial a <= b;
initial b <= a;

為什麼將 = 換成 <= 就可以達到目的?因為兩者是同時進行的,因此 a <= b 所取得的 b 是執行前所得到的數值,而不是受 b <= a 所影響的結果。相同的道理也可以被用在 b <= a 之上,因此最終我們可以得到正確的數值。

Zero Delay Control

Delay 就是延遲,我們在撰寫 testbench 時大量使用過。例如,#3 就是延遲三個時間單位。

Zero Delay 就是 #0 。乍看之下,我們可能會問說他的意義在哪裡?延遲 0 個時間單位是有延遲還是沒有延遲?如果以程式的觀點來看,是沒有延遲的,一樣是在那個時間點執行該行程式。但是如果以當下的時間點來看,就會是延遲。因為 #0 的意義在於他要確保這行程式在這個時間點的最後才執行。不過,如果一個時間點同時有多行程式都是零延遲 (#0) ,那麼 race condition 又會再次出現。往好處想, #0 其實可以解決 race condition 的問題,因為我們可以規範兩個同時間點執行的程式,誰先執行,誰後執行!


上一篇
Day 20: Initial & Always 運作模式
下一篇
Day 22: 迴圈大禮包
系列文
數位 IC 設計起手式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言