處理器:資料路徑與控制

微程式控制(microprogrammed control)

/ MY-kroh-proh-gram-ing /

建造控制單元有兩種方式。你可以手工接出一堆邏輯閘,讓它在給定運算碼時點亮對的控制訊號——快,但僵硬。或者你可以把控制訊號放在一塊微小的內部查表記憶體裡,讓每道機器指令觸發其中一小串條目,就像自動演奏鋼琴讀著打孔的紙捲。後者就是微程式控制:控制邏輯本身是一支存在記憶體裡的小程式(微碼)。

在微程式化的多週期 CPU 裡,執行一道機器指令意味著跑過數個微指令,每個微指令本質上就是一列控制訊號值(一個週期份的開關設定)加上指向下一個微指令的指標。運算碼選定要從微碼的哪裡開始;機器接著一個微步驟接一個微步驟地走,直到指令完成。於是「載入」變成一段短腳本:算位址、讀記憶體、寫暫存器——腳本的每一行都是一個微指令。

誠實的比較:微程式讓複雜指令集(CISC)更容易建造、也更容易修正或擴充——你可以靠重寫微碼改變行為,而不必重接矽,歷史上廠商也確實出過微碼修補。代價是速度:每週期從記憶體查微指令,比專用閘慢。這也是 RISC 機器偏好以快速硬接線控制即可實作的較簡單指令的原因之一。現代高效能 x86 晶片其實兩者兼用:大多數指令是硬接線的,但罕見或複雜的指令仍退回微碼,而微碼更新至今仍是廠商在現場修補 CPU 錯誤的方式。

一道微碼化的「載入」可能跑這樣的微指令:(1)ALU = 基底+偏移,存到暫存區;(2)在該位址做 MemRead,存到暫存區;(3)RegWrite 把暫存區寫入目的暫存器;(4)去提取下一道指令。一段存好的微腳本,共四行。

控制訊號以一支小程式的形式存在記憶體中;每道機器指令跑一段短短的微碼腳本。

微碼是 CPU 內部的東西,並非組合語言程式設計師寫的機器碼——它是更底下的一層。多數程式設計師從不見到微碼,但廠商的微碼更新正是某些 CPU 安全漏洞(例如某些 Spectre 變種)被修補的方式。

又称
microprogrammingmicrocode微碼