跳轉到內容

微處理器設計/暫存器檔案

來自華夏公益教科書,開放的書籍,開放的世界

暫存器是 CPU 內部用於儲存資料和地址的臨時儲存位置。

暫存器檔案是包含微處理器所有通用暫存器的元件。一些 CPU 也將 PC 和狀態暫存器等特殊暫存器置於暫存器檔案中。其他 CPU 將它們分開。

在設計 CPU 時,有些人區分“架構特徵”和“實現細節”。“架構特徵”是程式設計師可見的部分;如果有人制作了一個新系統,其中任何這些部分與舊的 CPU 不同,那麼突然之間所有舊的軟體將無法在新 CPU 上執行。“實現細節”是那些雖然我們投入了更多時間和精力來使其正常工作,但可以製作一個新系統,該系統有不同的實現方式,並且仍然保持軟體相容性——有些程式可能執行得快一點,其他程式可能執行得慢一點,但它們都產生與早期機器上相同的結果。


程式設計師可見的暫存器集對軟體相容性的影響比資料路徑的任何其他部分都大,也許比整個計算機中的任何其他部分都大。程式設計師可見的暫存器集的架構特徵是暫存器的數量、每個暫存器中的位數以及暫存器的邏輯組織。組合語言程式設計師喜歡擁有許多暫存器。早期的微處理器暫存器數量非常少,受芯片面積的限制。如今,許多晶片有空間容納大量暫存器,因此程式設計師暫存器的數量受其他限制:更多的程式設計師可見暫存器需要更大的運算元欄位。更多的程式設計師可見暫存器需要在中斷或上下文切換時花費更多時間儲存和恢復暫存器。軟體相容性要求保持完全相同的程式設計師可見暫存器數量、大小和組織。組合語言程式設計師喜歡“扁平”的地址空間,其中(虛擬)記憶體中任何位置的完整地址都適合單個地址暫存器。因此,架構師想要的(虛擬)記憶體數量為每個地址暫存器設定了最小寬度。 [1]

“通用暫存器”的概念——一組暫存器,其中任何一個暫存器可以在不同的時間充當堆疊指標、索引暫存器、累加器、程式計數器等,是在 1971 年左右發明的。 [2]

雖然暫存器可以用一組觸發器暫存器來實現,但基於 SRAM 的全定製暫存器檔案使用更少的面積和功耗。 [3][4]

許多單晶片 CPU 的整體效能受暫存器檔案讀取操作的速度限制。 [3]

暫存器檔案

[編輯 | 編輯原始碼]

一個簡單的暫存器檔案是一組暫存器和一個譯碼器。暫存器檔案需要一個地址和一個數據輸入。

然而,這個簡單的暫存器檔案在現代處理器設計中並不實用,因為有些情況下我們不想將新值寫入暫存器。此外,我們通常希望在一個週期內同時讀取兩個值並將一個值寫回。考慮以下等式

為了執行此操作,我們想要從暫存器檔案讀取兩個值,AB。我們還有一個結果,我們希望在操作完成時將其寫回暫存器檔案。對於我們不想將任何值寫入暫存器檔案的情況,我們新增一個稱為Read/Write的控制訊號。當控制訊號為高電平時,資料被寫入暫存器,當控制訊號為低電平時,沒有新值被寫入。

在這種情況下,為我們指定第三個地址埠以用於寫地址可能是有利的。

許多人選擇為其流水線微處理器使用 3 埠暫存器檔案,以便它可以每個週期執行這樣的 ALU 指令。每個週期 CPU 從暫存器檔案中讀取兩個值以準備根據一條指令對其進行操作,同時 CPU 將來自先前指令的某些結果寫入暫存器檔案中的其他暫存器。(超標量處理器 和 VLIW 需要具有 6 個或更多埠的暫存器檔案)。

(具有運算元轉發的微處理器是否會在同一個時鐘週期內從一個暫存器讀取並寫入同一個暫存器?)

全定製暫存器檔案通常從 SRAM 設計開始。與 SRAM 晶片一樣,基於 SRAM 的暫存器檔案為每個埠包含一對差分位線——但與單個 SRAM 讀/寫埠不同,暫存器檔案通常至少有一個專用的寫埠和幾個專用的讀埠。典型的暫存器檔案在每個指令週期重複此過程:首先,在預充電階段,每個讀埠的一對差分位線的兩條位線彼此短路並充電到 Vdd/2。然後,字線將一個位單元連線到這些線——稍微使這些長位線上的電荷失去平衡。最後,CPU 使感應放大器使輕微的失衡放大到正常的數字邏輯電平。 [5][3][6][4]


比你能搖動的棍子還多的暫存器

[編輯 | 編輯原始碼]

考慮機器字非常小的情況,因此暫存器的可用地址空間非常有限。如果我們有一個只能容納 2 位暫存器地址的機器字,我們只能定址 4 個暫存器。但是,暫存器檔案實現起來很小,所以我們有足夠的空間容納 32 個暫存器。有幾個解決方案可以解決這個難題——幾種透過使用多個暫存器來提高效能的方法,即使我們沒有足夠的位數在指令字中直接定址它們。

其中一些解決方案包括

  • 特殊用途暫存器,它們始終用於某些特定指令,因此該指令不需要任何位來指定該暫存器。
    • 在幾乎所有 CPU 中,程式計數器 PC 和狀態暫存器都與其他暫存器不同,有自己的一組特殊指令。
  • 將暫存器分成兩組,“地址暫存器”和“資料暫存器”,因此使用地址的指令需要足夠的位來選擇所有地址暫存器中的一個,這比選擇所有暫存器中的一個少 1 位。
  • 如 SPARC 上的暫存器視窗

[1]

  • 使用“暫存器組”。


Clipboard

要做到
簡單介紹一下“影子暫存器”



Clipboard

要做到
簡單介紹一下“暫存器重新命名”


暫存器組

[編輯 | 編輯原始碼]

術語“暫存器組”在兩種不同的意義上使用。 [7] 一些 CPU 具有多個不同的暫存器組(或“組”),而不是一個單一的暫存器檔案。

一種“暫存器組”類似於(主記憶體) 銀行切換。由於這種型別對組合語言程式設計師可見,在本節中,我們將稱之為“架構暫存器組”。其他型別的“暫存器組”允許 CPU 執行與單組實現完全相同的軟體(對組合語言程式設計師不可見),因此在本節中,我們將稱之為“微架構暫存器組”——這些實現選項與單片暫存器檔案實現相比具有各種優點。

架構暫存器組

[編輯 | 編輯原始碼]

考慮這樣一種情況,機器字長非常小,因此暫存器可用的地址空間非常有限。如果機器字長只能容納 2 位暫存器地址,那麼我們只能定址 4 個暫存器。然而,暫存器檔案實現起來很小,所以我們有足夠的空間存放 32 個暫存器。解決這個難題的方法是使用一個**暫存器組**,它由多個暫存器檔案組合在一起。

一個**暫存器組**包含多個暫存器檔案或 *頁*。同一時間只允許一個頁處於活動狀態,並且在 ISA 中添加了一些額外的指令來在可用暫存器頁之間切換。資料值只能寫入和讀取當前活動的暫存器頁,但是可以存在將資料從一個頁移動到另一個頁的指令。

如本圖所示,灰色方框表示當前頁,可以上下移動暫存器組上的頁。

如果暫存器組有 *N* 個暫存器,而一個頁只能顯示 *M* 個暫存器(其中 *N* > *M*),我們可以用兩個值分別表示暫存器地址,分別為 *n* 和 *m*。我們可以將這些值定義為

換句話說,*n* 和 *m* 分別是定址 *N* 和 *M* 個暫存器所需的位數。我們可以將地址分解為一個單獨的值,如下所示

其中 *p* 是為指定當前暫存器頁保留的位數。從該圖中可以看出,當前暫存器地址只是頁地址和暫存器地址的串聯。

微架構暫存器組

[edit | edit source]

有幾種技術可以將物理暫存器分成多個物理暫存器檔案(“組”),並使用控制邏輯使整個 CPU 在軟體上與同一 CPU 架構的其他實現相容,這些實現只使用一個單一的整體暫存器檔案。在現代高效能 CPU 中,這些技術用於構建軟體相容的 CPU,這些 CPU 執行速度更快、功耗更低、面積更小,而不是用單個傳統的多分支暫存器檔案實現相同的 CPU 架構。[8][9]

像 POWER2、Alpha 21264 和 Alpha 21464 一樣,複製整個暫存器檔案[8][7] 是微架構暫存器組的最簡單型別。這些 CPU 在內部用整個(架構)暫存器檔案的 2 個副本實現它們的暫存器檔案,並將一半的功能單元連線到每個副本。這需要每個暫存器檔案具有與單片暫存器檔案相同的寫入埠數(因為所有寫入都發送到 *兩個* 副本以保持同步),但每個暫存器檔案只需要單片暫存器檔案一半的讀取埠數。


參考文獻

[edit | edit source]
  1. a b "計算機體系結構:計算機設計的基礎和原理" 作者:Joseph D. Dumas 2006 年,第 111 頁。
  2. “通用暫存器”是由 C. Gordon Bell 和 Allen Newell 在撰寫他們的著作 *計算機結構:閱讀和示例*(1971)時發明的。——Frederik Nebeker。文章 “更多珍藏文字”。“IEEE Spectrum” 2003 年 7 月。
  3. a b c Larry R. Fenstermaker。 "當前模式感測放大器應用於雙埠暫存器檔案,作者:Larry R. Fenstermaker"。1998 年。
  4. a b Akshay Vijayashekar 和 Hasan Ali。 "最佳化暫存器檔案實現"。引用:“本論文的目的是為 Atmel 32 位微控制器實現一個全定製的、低功耗和麵積高效的暫存器檔案。... 暫存器檔案的大小為 32 個 32 位字,具有兩個寫入埠和四個讀取埠。”
  5. Norman P. Jouppi 和 Jeffrey Y. F. Tang "一個持續 20 MIPS 的 32 位 CMOS 微處理器,具有高持續效能與峰值效能比率"doi:10.1.1.85.988。1989 年。部分 “4.2。暫存器檔案感測放大器”。第 10-12 頁。
  6. Robert Reese。 "暫存器檔案"。1999 年。
  7. a b "當應用於暫存器時,銀行化是什麼意思?"
  8. a b Jessica H. Tseng 和 Krste Asanović。 "用於高頻超標量微處理器的組化多分支暫存器檔案"。2003 年。
  9. Il Park、Michael D. Powell 和 T. N. Vijaykumar。 "減少暫存器埠以實現更高的速度和更低的能量"。2002 年。
華夏公益教科書