リザベーションステーション

Tomasulo構造では、リザベーションステーションの番号をタグとして用いていたが、レジスタリネーミングを行う場合は、リネームされた物理レジスタ番号をタグとして用いる方が簡単である。

図6.19 リザベーションステーションと演算結果の格納

結果として、全体の構造は図6.19のようになる。命令デコーダで解釈された命令の演算とフリーリストから取り出された結果を格納する物理レジスタ番号や、後述のコミット機構のエントリ番号などが、リザベーションステーションのOPR、Tag部に送られる。それと並行して、オペランドのソースレジスタ番号(Rs)を並列リネーム機構で物理ソースレジスタ番号(PRs)に変換し、レジスタファイルのタグとデータを読み、データはリザベーションステーションのOP1、OP2の中のデータ格納フィールド、タグはそれぞれのタグフィールドに送る。

これらのオペランドは、Validの場合は、データ部に格納されたデータが正しいことを示し、Validでない場合は、データ部の内容はゴミで、依存する命令の実行が終わった時点でタグ部の指す物理レジスタからデータを受け取る必要があることを示している。

図6.19では、1系統の演算ユニットしか書かれていないが、一般には複数の整数演算があり、それに加えてロードストア用のアドレス計算ユニットなどがある。したがって、図6.20に示すように、それぞれの演算ユニットにリザベーションステーション(RS)が設けられており、整数演算命令の場合は整数RS、ロードストア命令の場合はロードストアRSとアドレス計算用RS、また、浮動小数点演算の場合は浮動小数点RSに命令を格納する必要がある。また、この図6.20に示す例では整数RS1は加減算と論理演算だけの比較的簡単な実行ユニットが接続されており、整数RS2は、加減、論理演算ユニットと乗除算ユニットが接続されている。したがって、整数演算命令でも、乗除算を含む場合はRS2に命令を格納する必要がある。

図6.20 リザベーションステーションと実行ユニット

リザベーションステーションは図6.21に示したような構造になっている。リザベーションステーションは、常に全エントリがリザルトバスをモニタしており、OP1、OP2と一致したタグを持つデータが出現すると、その値をデータ部に取り込み、Validビットを’1’にする。

図6.21 リザベーションステーションの構成

そして、双方のオペランドデータがValidになり、演算ユニットが使用可能になった命令を選んで演算を行う。この図では、どのようにして実行開始するエントリを選択するかという機構は省略されているが、条件を満たすエントリが複数ある場合は、理想的には古いものから順に選択するのが良いが、制御回路を簡単にするため、単純にエントリ番号の若いものからというような選択法も用いられる。

そして、演算結果は、物理レジスタ番号タグPRdを付けて、リザルトバスに載せられる。図6.19に示したように、リザルトバスは物理レジスタファイルとリザベーションステーションに繋がっており、物理レジスタファイルは、タグ部で指定された番号の物理レジスタエントリに演算結果を書き込み、状態をValidにする。

なお、これまでの説明では、オペランドがValidである場合はリザベーションステーションにデータの値を格納しているが、値を格納する部分を節約して、物理レジスタ番号とValidビットだけを格納する方式もある。この方式では、リザルトバスのデータを監視して、Validになっていないエントリは、自分のオペランドとなっている物理レジスタのデータをリザルトバス上に見つけるとValidビットを"1"にする。そして、両方のオペランドがValidになり、演算器やリザルトバスが確保でき命令の実行条件の整った時に、物理レジスタファイルからオペランドの値を読み出す。

この方式の場合は、リザベーションステーションのデータを格納する部分は節約できるが、実行条件が整ったタイミングで必ずレジスタが読める必要があり、並列に動作する演算パイプラインすべてに対応するリードポートを持つ物理レジスタファイルが必要になる。

また、このように制御すると、演算結果の受け渡しが物理レジスタ経由になってしまい実行が遅れるので、これを避けるために、物理レジスタタグは結果より1サイクル前にリザルトバスに載せ、その結果を利用する命令が次のサイクルに実行可能になる場合は、オペランドはリザルトバスから直接受け取るというような制御が行われる。