いよいよ自作CPUにベクトル・メモリ・アクセス命令を実装するときが来た。まずは簡単なUnit Strideロード命令を実装しようと思う。 何も考えずに、Cacheableな領域にストレートにアクセスする形式から考えていきたい。
とりあえずデバッグして、簡単なテストベンチは動作するようになった。ベクトル・ロードが動いている。
パイプラインにL1Dキャッシュをつなげて、MSHRとかもスカラ側にパラメータを変更することですぐにつながるようにしていたのでその辺の接続は非常に簡単だ。 あとはいくつかシンプルなテストを流して、動作することを確認した。
4721 : 257 : PC=[0000000080002012] (M,62,01) 40f5873b subw a4, a1, a5 GPR[14](9) <= 0000000000000024 4724 : 258 : PC=[0000000080002016] (M,63,01) 04877757 vsetvli a4, a4, e16, m1, ta, mu GPR[14](13) <= 0000000000000010 4727 : 259 : PC=[000000008000201a] (M,00,01) 5e07cc57 vmv.v.x v24, a5 VPR[24](40) <= 00400040_00400040_00400040_00400040_00400040_00400040_00400040_00400040_ 18954 : L1D Load-In : 80003440(00209) : 000a216f_6f66202c_29286e69_616d2074_6e656d65_6c706d49_00000000_00000000_74657274_736e696d_0000656c_6379636d_0000296c_6c756e28_01010101_01010101 18954 : Load ISS Check : 80003440 : 000a216f_6f66202c_29286e69_616d2074_6e656d65_6c706d49_00000000_00000000_74657274_736e696d_0000656c_6379636d_0000296c_6c756e28_01010101_01010101 4744 : 260 : PC=[000000008000201e] (M,01,01) 5e05ccd7 vmv.v.x v25, a1 VPR[25](41) <= 00640064_00640064_00640064_00640064_00640064_00640064_00640064_00640064_ 4744 : 261 : PC=[0000000080002022] (M,01,02) 02085f07 vle16.v v30, (a6) VPR[30](52) <= 74657274_736e696d_0000656c_6379636d_0000296c_6c756e28_01010101_01010101_ 4744 : 262 : PC=[0000000080002026] (M,01,04) 000097ba c.add a5, a4 GPR[15](63) <= 0000000000000050 4744 : 263 : PC=[0000000080002028] (M,01,08) 0000983a c.add a6, a4
次はベクトルストアなのだが、どうしようか。同様にスカラのストアバッファに接続しても、ストアバッファは128bit程度のインタフェースしか持っていないので幅が足りない。 コヒーレンスをあまり気にかけたくなければ、スカラ側のストアバッファを使ったほうがいいんだけどな。