FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

現代のCPUで遅延スロットが嫌われる訳

最初の頃、自分も遅延スロットが嫌われる理由が良く分からなくて、自分がCPUを自作してみて始めて気がついたのだが、 現代のCPU(スーパスカラなどの高速化の方式を取っているもの)にとって、遅延スロットは非常に面倒なものとなってしまっている。

まず、パイプラインフラッシュする場合に、全てをフラッシュできる訳ではないということ。フラッシュを発生させた次の命令は リザベーションステーションやリオーダバッファからはフラッシュさせることはできない。従って、ここに判定論理が必要になる。 遅延スロットの部分に、複数レジスタ書き込みが発生する命令が入ってきた場合はさらに悲惨だ。複数レジスタ書き込みをする命令は、 通常複数の小さな命令に分割され、それぞれがリオーダIDで管理される。複数レジスタに書き込む命令は、その割り当てられたID すべてのフラッシュを防がなければならない。例えば、mult命令がHI/LOレジスタに書き込むため複数レジスタ書き込みを発生させると、 2つのIDをフラッシュから守らなければならない。これは判定論理がやっかいだ。

次に、分岐処理は遅延スロットの次から始まるため、分岐命令をフェッチしても、直ぐに次のフェッチが出せる訳ではない。 もし分岐命令がフェッチの境界に存在した場合、遅延スロットの命令はフェッチできていないため、一旦遅延スロット分だけフェッチし、 ようやく分岐予測に基いて次のフェッチが出せるようになる。これも判定論理がやっかいだ。

Likely命令が入りだしてから自体はさらに難しくなった。 Likely命令は、分岐が成立すると遅延スロットを実行し、分岐が成立しない場合は遅延スロットを実行しない。 これの目的は、常に分岐が成立する方向に予測しておき、分岐が不成立となった場合は遅延スロットごとフラッシュできるようになる、 という設計者にとってみれば有利な命令なのだが、もちろん既存の分岐命令では遅延スロットを実行しなければならないため、 判定論理がより複雑になっただけである。

従って、MIPS Release6では、遅延分岐命令は推奨しない命令になってしまっている。新しく定義された、遅延スロット無しの命令を 利用することを推奨している。また、最近登場したRISC-Vも、遅延分岐は搭載していない。現代のCPUでは、遅延スロットは論理を難しくする やっかいな命令なのだ。