暫存器堆
暫存器堆(register file)是CPU中多個暫存器組成的陣列,通常由快速的靜態隨機讀寫存儲器(SRAM)實現。這種RAM具有專門的讀埠與寫埠,可以多路並發訪問不同的暫存器。
CPU的指令集架構總是定義了一批暫存器,用於在內存與CPU運算部件之間暫存數據。在更為簡化的CPU,這些架構暫存器(architectural registers)與CPU內的物理存在的暫存器一一對應。在更為複雜的CPU,使用暫存器重命名技術,使得執行期間哪個架構暫存器對應於哪個暫存器堆的物理存儲條目(physical entry stores)是動態改變的。暫存器堆是指令集架構的一部分,程序可以訪問,這與透明的CPU高速緩存(cache)不同。
實現
通常的設計布局是一個簡單的陣列,在水平方向的一行就是暫存器的全字長寬度,一行的每一位元的存儲單元(bit cell)通過位線(Bit Line)讀/寫其數據。在垂直方向把暫存器一次即能全字長讀出。放大電路(Sense amplifier)通常設在底部,把讀出的小幅值的兩根位線(組成了一對差分電路)的電位差,放大為全幅值的邏輯值電位。更大的暫存器堆的設計是鏡像與旋轉後(tiling mirrored and rotated)拼貼這種簡單的暫存器陣列。
暫存器堆的每個條目(entry,即一個物理暫存器)對每個埠(port)都有一條字線(word line),每個位元的基本存儲單元,對每個讀埠有1條位線,對每個寫埠有2條位線。每個位元的基本存儲單元都連接到了供電的Vdd(高電平)與Vss(低電平或者接地),這裡的d是指組成SRAM的場效應管的漏極(drain),s是指場效應管的源極(source)。因此,布線所占面積隨埠的平方增加,電晶體是線性增加。多個冗餘的具有較少讀埠的暫存器堆可能會比具有全套多個讀埠的單一暫存器堆,面積更小、讀取更快。MIPS R8000的整數單元,有一個暫存器堆的實現,有32個條目,字長64位,具有9個讀埠及4個寫埠。
解碼
- 解碼器經常劃分為預解碼(predecoder)與解碼(decoder)。
- 解碼器是一系列的與門,最終選定並驅動字線。
- 每個讀埠與寫埠都有自己的專用解碼器。例如,如果陣列有4個讀埠與2個寫埠,那麼就有6套地址解碼器,每個暫存器堆的條目有6條字線。
陣列
一個位元的基本存儲單元的基本模式:
- 狀態被存儲在一對反相器中;
- 數據通過一個NMOS電晶體取到與字線相配的「讀位線」上。
- 數據通過「寫位線」的電位來控制2個作為開關的NMOS管導通或者截止,從而把反相器的一端或者另外一端接地來寫入數據。
- 因此:讀埠需要一個電晶體,而寫埠需要4個電晶體!
許多可能的優化:
- 在基本存儲單元之間共享線路,如Vdd與Vss電源線。
- 讀位線經常預充為Vdd或者Vss。
- 讀位線經常是在Vdd或Vss電位附近的一個小幅值內波動來表示存儲的狀態。由感知放大器把這種小幅值信號變換為全幅值的邏輯信號。小幅值信號的速度更快,因為位線僅有很小的驅動但是具有很大的寄生電容。
- 寫位線是全幅值信號,這可能會導致與它伴生走線的讀位線的很大干擾。
- 如果Vdd是平行走線可以關閉,如果這個周期內一個寫埠正在寫入。這種優化提高了寫速度。
- 採用低功率電子設備來降低能耗[1]
微架構
大多數暫存器堆並沒有特殊設施來預防多個寫埠同時寫同一個暫存器條目。替代的,指令調度硬體確保在任何時鐘周期只有一條指令寫入特定的一個暫存器條目。如果針對同一個暫存器的多條機器指令同時被發出(issue),只有一條的寫使能(write enable)不被關閉。
每個基本存儲單元內部的兩個交叉反相器需要在寫位線執行後用一些時間修改內部狀態。如果正在寫操作時對同一個條目執行讀操作,或者需要等待更長時間,或者讀到的是錯誤的狀態數據。通常有一個旁路復用器(bypass multiplexor)把正在寫入的數據旁路(bypass)給讀埠。 這種旁路復用器往往是更大規模旁路網絡的一部分,用來把功能器件之間轉發還沒有提交的數據。
暫存器堆通常是間距匹配與所對應的數據通路,這避免了許多匯流排轉角,節約了占用面積。但是由於每個單元必須有相同的位線間距,迫使數據通路上的位線間距遵從最寬的單元,浪費了面積。
如果一條數據通路經過多個單元,則通過兩條數據通路並行,使得每條數據通路的位線間距更小,從而節約了面積。因此通常會導致了一個暫存器堆的多個副本,每個副本有自己的數據通路。
例如,Alpha 21264 (EV6)處理器有兩個整數暫存器堆的副本。僅用一個時鐘周期就可以在二者之間傳播數據。發射邏輯(issue logic)試圖降低在兩個副本間的數據轉發。MIPS R8000浮點單元有兩個浮點暫存器堆的副本,每個副本有4個讀口、4個寫口。寫操作是對兩個副本的對應條目同時寫入。
處理器的暫存器重命名能為每個功能單元安排寫入到物理暫存器堆的一個子集。這可以避免每個基本存儲單元有多個寫口的要求,很大節約了面積。最終的暫存器堆,效果上是一個單寫口、雙讀口的暫存器堆組成的棧。
SPARC ISA定義了「register window」,暫存器的5-bit架構名稱指向一個很大的有數百個條目的暫存器堆的一個窗口。register window沒移動一步就經過16個暫存器。因此每個架構暫存器名字僅指向這個暫存器堆中的少量暫存器。例如架構暫存器r20僅指向物理暫存器#20, #36, #52, #68, #84, #100, #116, 如果這個物理暫存器堆僅有7個窗口。
參考文獻
- ^ "Energy efficient asymmetrically ported register files" by Aneesh Aggarwal and M. Franklin. 2003.
外部連結
- Register File Design Considerations in Dynamically Scheduled Processors(頁面存檔備份,存於網際網路檔案館) - Farkas, Jouppi, Chow - 1995
- Register file design considerations in dynamically scheduled processors(頁面存檔備份,存於網際網路檔案館) - Farkas, Jouppi, Chow - 1995
參見