跳到內容

可程式設計邏輯/並行執行

來自華夏公益教科書

此頁面將討論並行程式執行,這是在程式設計 HDL 時最大的問題之一。

內聯執行

[編輯 | 編輯原始碼]

內聯執行是在計算機程式中通常發生的事情。指令按順序執行,一個指令完成執行後才會執行下一個指令。這不是 HDL 程式設計的工作方式,儘管我們將在本文中學習的 HDL 允許一些用於順序操作的功能。嘗試強制硬體設計完全順序通常是極低效的,在這種情況下,通常最好簡單地使用微控制器,並在軟體而不是硬體中執行您的任務。


連續執行

[編輯 | 編輯原始碼]

Verilog、VHDL 甚至 SystemC 都是描述電子電路的方法,作為大型複雜原理圖的替代方案。電子硬體通常具有許多同時相互並行執行的元件。

由於這一事實,HDL 中的語句通常被視為並行執行,除非另有說明。這與傳統的計算機程式設計非常不同,對於經驗豐富的計算機程式設計師來說,將其才能轉化為 HDL 可能很困難。

問題和陷阱

[編輯 | 編輯原始碼]

許多傳統的計算機演算法依賴於程式碼按順序執行這一事實。出於這個原因,許多此類演算法無法輕鬆或肯定地應用於 HDL。

嘗試使硬體中的操作順序不僅是一項艱鉅的任務(程式設計需要更長時間),而且還需要更多硬體資源,例如鎖存器、暫存器和定時電路。完全放棄順序操作也會導致定時和程式複雜性的問題。

與軟體的關係

[編輯 | 編輯原始碼]

有使用多執行緒軟體經驗的程式設計師可能會很快理解同步並行執行的概念,儘管有一些值得討論的細節。在軟體中,所有指令都被認為是按順序執行的,一個接一個地按照預定義的順序執行。併發程序或“執行緒”的錯覺是由於不同的執行緒快速切換來切換去,以至於看起來是在並行執行。即使在多核處理器中,所有執行緒也不可能真正並行執行,因為通常計劃執行的活動執行緒數多於同時處理它們的可用核心數。

在硬體中,單獨的程序確實同時發生,沒有任何錯覺。由於多個程序同時發生,並且它們的行動與全域性時鐘訊號同步,因此更容易在程序之間獲得正確的計時,並避免競爭條件或死鎖。在軟體中,任務排程程式可以以任何順序排程各個執行緒,或者以任意方式將它們分佈在不同的處理核心上(應用程式程式設計師通常不知道排程程式使用什麼演算法)。

另一個問題是硬體模組不像軟體模組那樣動態載入或解除安裝。這意味著所有要使用的硬體必須一次建立,並且實際上是靜態的。執行時無法載入其他模組。一旦晶片生產出來,唯一新增功能的方法是設計並生產一個新晶片,然後將晶片連線在一起。這個概念的另一個方面是硬體模組仍然存在,並且仍然執行,即使程式設計師沒有明確考慮該操作。

考慮一個具有 3 個模組的晶片設計:輸入模組、處理模組和輸出模組。輸入模組從外部匯流排讀取訊號,對其進行處理,然後由輸出模組將其寫回匯流排。假設訊號當前位於處理模組中:那麼另外兩個模組在同一時間都在做什麼?所有模組的操作都需要始終考慮在內,如果某些模組應該在某些時候處於“休眠”狀態,則需要新增該功能。

華夏公益教科書