レジスタファイル(英: Register file)は、コンピュータの中央演算装置(CPU)にレジスタを多数集積したものである。
現代的な集積回路によるレジスタファイルは、高速なSRAMに複数のポートを持たせる形で実装されている。通常のマルチポートの SRAM は同じポートで読み書きするのに対して、このような RAM は専用の読み書きポートを持つ点で異なる。
CPU の命令セットアーキテクチャは、メモリとチップ上の機能ユニットとでデータを橋渡しするレジスタを定義するが、単純な CPU では「アーキテクチャ上のレジスタ」が CPU 内の物理的なレジスタに1:1で対応する。一方より複雑な CPU はレジスタ・リネーミングを用いて物理的なレジスタとアーキテクチャ上のレジスタの対応関係が実行時に動的に変化する。レジスタファイルは命令セットアーキテクチャの一部で、プログラムから直接扱える存在であり、プログラムからは透過的に存在しており直接扱えないキャッシュメモリとは異なる。
レジスタファイルの一般的な回路上のレイアウトは垂直に読み出すことができる単純な配列である。すなわち、一本のワード線が水平に走り、ビットセルの列が垂直に走るビットライン上に配置される。低振幅のビットラインの信号を論理レベルに増幅するセンスアンプは、最後に配置される。大きなレジスタファイルは、単純で小さい配列を線対称に並べたり、回転させて並べたりして構築される場合もある。
レジスタファイルはポートごとにワード線を持ち、読み出しポートの幅に応じた読み出し線と書き込みポートのビット幅1に対して2本の書き込み線を持つ。各ビットセルは、VddとVssも持つ。これにより、信号線部分の面積はポート数の2乗に比例して増加し、トランジスタの面積はポート数に比例して増加する。
ある時点で、少数の読み出しポートを持った複数のレジスタファイルのほうが、全ての読み出しポートを備えたレジスタファイルより小さくかつ/または高速であると考えられるようになった。たとえば MIPS R8000の整数ユニットは0.7 μm プロセスで製造され、9本の読み出しポートと4本の書き込みポートを備えた32エントリーの64ビットレジスタファイルを持つが、それでも数十センチの距離からチップを見てレジスタファイルを視認できるほどである。
様々な最適化が可能である:
レジスタファイルは複数の書き込みポートが同時に同じ箇所に書き込まれた場合の対策をとっていない。代わりに、命令スケジューリングを行うハードウェアが、一サイクルで一つの命令しか一箇所に書き込めないことを保証する。同じレジスタを書き込み対象とする複数の命令が発行されると、一つの命令以外は書き込めないようにする。
セルを構成する二つのインバータが書き込み後静定するには一定の時間がかかるので、その間読み出しの操作には時間がかかるか、あるいは壊れたデータを返す可能性がある。このため、書き込まれたデータを読み出しポートに転送するバイパス回路を持ち、読み書きが同時に行われた場合に備えるのが一般的である。
レジスタファイルはデータパスの間隔と一致している。間隔を合わせることで、データパスの曲がり角にバスを配置しなくてもすむ。しかし、全てのユニットが同じ幅を持たなければならず、データパス中の各ユニットの幅は、最も広いものに合わせることになり、それ以外のユニットでは無駄な面積を消費する。レジスタファイルは書き込みポートのビットごとに2本の線があるため、また全てのビット線は各ビットセルに接続されている必要があるため幅広であり、この幅がデータパスの間隔を決定することが多い。
一つのデータパス上に複数のユニットが存在する場合には、二つのデータパスを隣接させ、通常のデータパスよりも狭い間隔のビット間隔を持たせることにより面積を節約することができる。この場合、レジスタファイルのコピーがデータパスごとに必要になる。
Alpha 21264 (EV6) は、整数のレジスタファイルを二つ複製して持っており、互いにデータをコピーするためのサイクルが存在し、命令発行のロジックによって二つのレジスタファイル間でデータ転送する回数を削減するようにしていた。またMIPS R8000 の浮動小数点ユニットも浮動小数点レジスタファイルを二つ複製して持ち、それぞれ4つの読み込みポートと4つの書き込みポートと備え、書き込みは二つのレジスタファイルに同時に行われるようになっていた。
レジスタ・リネーミングを行うプロセッサでは、各機能ユニットが物理レジスタの一部に対して書き込むように割り当てることができる。これによって、ビットごとに複数のポートを持たせる必要がなくなり、面積を大きく節約することができる。その結果、レジスタファイルは複数レジスタファイルに対して一つの書き込みポートを持つものになる。この技術はレジスタ間の複製や読み出しポートのサブセット化の部分で利点があり、究極的には各機能ユニットに書き込み1つ、読み込み2つのレジスタファイルを配置することになる。少数のポートを持つレジスタファイルの大半はトランジスタなので、この方法を極限まで推し進めることが最善ではないが、それでも有用である。
SPARC命令セットアーキテクチャはレジスタ・ウィンドウを定義しており、アーキテクチャ上の5bitのレジスタ名が、より数百エントリーのレジスタファイルの一部であるウインドウ示す。
数百エントリーものマルチポートのレジスタファイルは非常に大きな面積を必要とする。レジスタウィンドウは 16 レジスタずつスライドし、アーキテクチャ上のレジスタ名が大きな配列内の少数のレジスタのみ示すようになっている。たとえば、アーキテクチャ上のレジスタ r20 は、ウィンドウが7つであれば物理レジスタ#20, #36, #52, #68, #84, #100, #116 を指す可能性がある。
面積を節約するため、SPARC の実装では、レジスタファイルが 32 エントリーのものあり、各セルは7つのビットを持っている。外部のポートからは一つしか読み出すことはできないが、その内容を回転させることができ、1サイクルでレジスタウインドウを動かすことができる。この変化を及ぼすために使用される信号線の大半は局所的なものであるため、わずかな電力で大きなバンド幅を達成することができる。
同様の技法がR10000のレジスタリネーミング用の割り当てファイルにも用いられている。この場合には、各物理レジスタが6bitの仮想レジスタの番号を格納する。このリネーミングファイルでは、分岐予測が誤っていた場合でも、古いリネーミングの状態を1サイクルで復帰できるよう(レジスタ・リネーミング参照)、分岐が発生するごとにリネーミング状態がチェックされる。