パイプラインのCPUを作っていると、どうしても問題になってくるのが遅延時間だ。5ステージくらいなら問題ないし、フォワーディングパスを投入すればほぼストール無しでパイプラインを構成できる。 しかし、スーパスカラやスーパパイプラインを作っていると、どうしてもストールは発生するし、それをどのように抑えるのかが問題になる。 一般的に、5ステージなどの短いパイプラインでストールを発生させようとしても、せいぜい5ステージ全体に一発で止まるような信号を出せばよくて、全体を一気に止めても遅延上特に問題が無いことが多い。 現状自作CPUもそこで遅延が大きくなっており、特にロードストアのユニットからリザベーションステーションを通じて、リネーミングのところまで制御信号を一気通貫させてしまっているためそれで遅延が大きい。
このため、遅延を短かくするために、ロードストア、リザベーションステーションで制御信号を分割する。 所謂AXIのハンドシェークのような感じで、VALIDとREADYを使って信号を受け渡す。
- VALID (送り側) : 投げっぱなしにする。相手のREADYが上がっていると問答無用で受け側は受け取ったことにする。
- READY (受け側) : READYが立ち上がっているときは、必ず受け取ることができる状態。
例えば、受け側が送り側のVALIDに同期してデータを受け取り、それにより受け側のバッファが一杯になったとすると、そこでREADY信号を降ろす。そしてREADY信号が上がるまでは、送り側は次の信号をキープする。 この切り変りのタイミングで次のVALIDが入ってくることもあるので、そのためにもう一段受けるためのバッファを用意しておく(よくSkid Bufferと呼ばれるらしい?)
こうして、現在自作CPUのタイミングを切り直し中...