レジスタファイル

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