處理器:資料路徑與控制
執行一道載入(load)
一道載入指令把一個值從資料記憶體取進暫存器,例如「lw x5, 8(x1)」意思是「到位址 x1 + 8,抓那裡的東西,放進 x5」。它是用到資料路徑最多的指令,所以追蹤它幾乎能看到每一個元件協同運作——也解釋了為何載入通常設下最壞情況的時序。
一步步來:(1)照常提取指令;PC 前進到 PC + 4。(2)從暫存器檔讀基底暫存器 x1,並從指令取出 12 位元偏移(8)。(3)符號擴展器把該偏移加寬到全寬。(4)一個多工器選擇符號擴展後的偏移(而非第二個暫存器)作為 ALU 的第二輸入,ALU 把 x1 + 8 相加以形成記憶體位址——這稱為位址計算。(5)在 MemRead 被拉高下,資料記憶體於該位址被讀取,交回所存的值。(6)一個多工器選擇來自記憶體的值(而非 ALU 結果)來寫回,在 RegWrite 被拉高下,該值落入 x5。
這裡有兩個多工器做了算術指令不需要的真活:一個替 ALU 輸入選了立即值而非暫存器,另一個替寫回選了記憶體輸出而非 ALU 輸出。這條較長的旅程——提取指令、再 ALU、再記憶體、再寫暫存器——就是釘住單週期時脈的關鍵路徑。它也預告了管線的五個階段:提取、解碼、執行、記憶體、寫回。
對「lw x5, -4(x1)」且 x1 = 0x1000:符號擴展器把 0xFFC 化為 -4,ALU 算出 0x1000 +(-4)= 0x0FFC,資料記憶體交回那裡的字組,該字組被寫入 x5——一個週期裡五個元件同時動作。
載入用到最多資料路徑:符號擴展、ALU 算位址、讀記憶體、再寫回暫存器。
載入裡的 ALU 並不是在做程式的算術——它在計算記憶體位址(基底+偏移)。初學者有時以為載入「只是讀記憶體」,事實上它先做了一次加法。
又称
另见