寄存器堆
寄存器堆
寄存器是計算機常用的基本器件。
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)。因此,布線所佔面積隨埠的平方增加,晶體管是線性增加。多個冗餘的具有較少讀埠的寄存器堆可能會比具有全套多個讀埠的單一寄存器堆,面積更小、讀取更快。MIPSR8000的整數單元,有一個寄存器堆的實現,有32個條目,字長64位,具有9個讀埠及4個寫埠。
• 解碼器經常劃分為預解碼(predecoder)與解碼(decoder)。
• 解碼器是一系列的與門,最終選定並驅動字線。
• 每個讀埠與寫埠都有自己的專用解碼器。例如,如果陣列有4個讀埠與2個寫埠,那麼就有6套地址解碼器,每個寄存器堆的條目有6條字線。
一個位元的基本存儲單元的基本模式:
• 狀態被存儲在一對反相器中;
• 數據通過一個NMOS晶體管取到與字線相配的“讀位線”上。
• 數據通過“寫位線”的電位來控制2個作為開關的NMOS管導通或者截止,從而把反相器的一端或者另外一端接地來寫入數據。
• 因此:讀埠需要一個晶體管,而寫埠需要4個晶體管!
許多可能的優化:
• 在基本存儲單元之間共享線路,如Vdd與Vss電源線。
• 讀位線經常預充為Vdd或者Vss。
• 讀位線經常是在Vdd或Vss電位附近的一個小幅值內波動來表示存儲的狀態。由感知放大器把這種小幅值信號變換為全幅值的邏輯信號。小幅值信號的速度更快,因為位線僅有很小的驅動但是具有很大的寄生電容。
• 寫位線是全幅值信號,這可能會導致與它伴生走線的讀位線的很大幹擾。
• 如果Vdd是平行走線可以關閉,如果這個周期內一個寫埠正在寫入。這種優化提高了寫速度。
• 採用低功率電子設備來降低能耗
大多數寄存器堆並沒有特殊設施來預防多個寫埠同時寫同一個寄存器條目。替代的,指令調度硬體確保在任何時鐘周期只有一條指令寫入特定的一個寄存器條目。如果針對同一個寄存器的多條機器指令同時被發出(issue),只有一條的寫使能(write enable)不被關閉。
每個基本存儲單元內部的兩個交叉反相器需要在寫位線執行後用一些時間修改內部狀態。如果正在寫操作時對同一個條目執行讀操作,或者需要等待更長時間,或者讀到的是錯誤的狀態數據。通常有一個旁路復用器(bypass multiplexor)把正在寫入的數據旁路(bypass)給讀埠。這種旁路復用器往往是更大規模旁路網路的一部分,用來把功能器件之間轉發還沒有提交的數據。
寄存器堆通常是間距匹配與所對應的數據通路,這避免了許多匯流排轉角,節約了佔用面積。但是由於每個單元必須有相同的位線間距,迫使數據通路上的位線間距遵從最寬的單元,浪費了面積。
如果一條數據通路經過多個單元,則通過兩條數據通路并行,使得每條數據通路的位線間距更小,從而節約了面積。因此通常會導致了一個寄存器堆的多個副本,每個副本有自己的數據通路。
例如,Alpha 21264 (EV6)處理器有兩個整數寄存器堆的副本。僅用一個時鐘周期就可以在二者之間傳播數據。發射邏輯(issue logic)試圖降低在兩個副本間的數據轉發。MIPSR8000浮點單元有兩個浮點寄存器堆的副本,每個副本有4個讀口、4個寫口。寫操作是對兩個副本的對應條目同時寫入。
處理器的寄存器重命名能為每個功能單元安排寫入到物理寄存器堆的一個子集。這可以避免每個基本存儲單元有多個寫口的要求,很大節約了面積。最終的寄存器堆,效果上是一個單寫口、雙讀口的寄存器堆組成的棧。
SPARCISA定義了“register window”,寄存器的5-bit架構名稱指向一個很大的有數百個條目的寄存器堆的一個窗口。register window沒移動一步就經過16個寄存器。因此每個架構寄存器名字僅指向這個寄存器堆中的少量寄存器。例如架構寄存器r20僅指向物理寄存器#20, #36, #52, #68, #84, #100, #116, 如果這個物理寄存器堆僅有7個窗口。