實現
通常的設計布局是一個簡單的陣列,在水平方向的一行就是暫存器的全字長寬度,一行的每一位元的存儲單元(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個寫連線埠。
解碼
陣列
一個位元的基本存儲單元的基本模式:
許多可能的最佳化:
在基本存儲單元之間共享線路,如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個視窗。