執行一道算術指令(R-type)
我們來把一道最簡單的指令走過整條資料路徑:像「add x3, x1, x2」這樣的算術運算——讀兩個暫存器、把它們結合、把結果寫到第三個暫存器。這類指令稱為 R-type(暫存器型),因為三個運算元都是暫存器,完全不碰記憶體。一步步跟著這一道指令走,是看見資料路徑活起來的最好方式。
這趟旅程有五個清楚的步驟。(1)提取:PC 對指令記憶體定址,後者交回 32 位元指令,同時 PC 被加到 PC + 4 以備下次。(2)解碼並讀暫存器:控制單元察看運算碼,同時暫存器檔讀出指令欄位中指名的兩個來源暫存器(x1 與 x2),把它們的值放上 ALU 的兩個輸入。(3)執行:ALU 對這兩個值做所要求的運算(這裡是加法)。(4)結果朝暫存器檔送回(載入指令會在此繞道資料記憶體,但 R-type 不會)。(5)寫回:在 RegWrite 控制訊號被拉高的情況下,ALU 的結果被寫入目的暫存器(x3)。
注意算術指令有哪些訊號是「關」的:MemRead 與 MemWrite 都是 0(不碰記憶體)、分支訊號是 0(控制流自然落到 PC + 4),而且一個多工器被設定成讓 ALU 的第二個輸入來自暫存器、而非符號擴展後的立即值。載入指令會用到的那些實體導線都在,控制只是不去把它們打開而已。這就是資料路徑/控制分工的全部概念,用一個例子說完。
對「sub x6, x4, x5」:暫存器檔讀出 x4 與 x5,多工器把 x5(而非立即值)餵給 ALU,ALU 做減法,RegWrite 為 1 所以 x6 得到差值,MemRead = MemWrite = Branch = 0,PC 前進到 PC + 4。
一道 R-type 指令:讀兩個暫存器,ALU 結合,寫回——記憶體與分支保持關閉。
每一種指令類型都走同一條資料路徑,只是控制訊號不同。R-type 剛好把記憶體與分支路徑關著——這些路徑的硬體在實體上依然存在。