前回読んだ資料を基に、自作CPUのLSUを作り変えてみようと思う。
- EECS 470 Lecture 12 Memory Speculation
https://web.eecs.umich.edu/~twenisch/470_F07/lectures/12.pdf
現時点で私の自作CPUはLDQとSTQが別々に実装されているが、LDQはパイプライン実行時にSTQをサーチして自分よりも古い命令で物理アドレスが決まっていない命令を見つけると実行を止めてしまう。 ここを投機的に実行するように変更する。さらにストア命令はパイプライン実行中にLDQをサーチして自分よりも若くて同じ物理アドレスを参照した命令を見つける。
LDQはデータをロードすると物理レジスタファイルに書き込みを行うが、DONE通知をするだけでエントリが消えるわけではない。コミット通知が返ってくるまでエントリを保存し続けており、コミットが完了するとやっとエントリが消滅する。 自分よりも古いSTQ命令がまだ存在していると、決して当該LDQに対してコミット通知は帰ってこないので、STQは必ず物理アドレスを見つけることができるという訳だ。
次に、STQはDONE通知をRQBに渡すと同時にLDQのフラッシュしたい命令IDを通知する。この命令IDから先の命令はすべて無効化するという仕組みになるであろう。これはROBのエントリに無理やりDEAD信号をアサートするように変更すればよい気がする。とりあえずこれで実装してみよう。