FPGA開発日記

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

自作CPUにベクトル命令を追加する実装検討 (18. ベクトルストア命令の実装)

いよいよ自作CPUにベクトル・メモリ・アクセス命令を実装するときが来た。まずは簡単なUnit Strideロード命令を実装しようと思う。 何も考えずに、Cacheableな領域にストレートにアクセスする形式から考えていきたい。

ベクトル・ストア命令の実装を検討している。ベクトル・ストアの超基本的な実装であるが、まずはアドレス変換を行って、その結果をSTQに格納しておく。 このとき、より汎用的なことを考えると、ベクトル・ストアは大量のアドレスを生成するので、その場でSTQを確保する(Late-binding)のようにしておく。 そして、STQがコミット状態になると、まずはストア用のベクトルデータをベクトル・レジスタから回収し、それをストアバッファに転送する。

この辺はいろいろと実装のオプションがあるように思う。

まずは基本的なベクトルストアからベクトルロード命令の挙動が動作するようになってきた。

MW8(0x0000000080003428)=>0000000000000004
MW8(0x0000000080003430)=>0000000000000004
MW8(0x0000000080003438)=>0000000000000004
==========================================
4703 : 237 : PC=[0000000080002022] (M,45,04) 000097ba c.add   a5, a4
GPR[15](106) <= 0000000000000008
4703 : 238 : PC=[0000000080002024] (M,45,08) 00371893 slli    a7, a4, 3
GPR[17](137) <= 0000000000000020
4703 : 239 : PC=[0000000080002028] (M,45,16) 00009846 c.add   a6, a7
GPR[16](177) <= 0000000080003440
18818 : L1D Load-In     : 80003400(00208) : 002f001e_001d001c_002b001a_00190018_00270016_00150014_00230012_00110010_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000
18818 : Load ISS Check  : 80003400        : 00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000
Warning : L1D Load Data Compare Error
4704 : 240 : PC=[000000008000202a] (M,46,01) fef654e3 bge     a2, a5, pc - 24
4706 : 241 : PC=[0000000080002012] (M,47,01) 40f5873b subw    a4, a1, a5
GPR[14](131) <= 000000000000005c
4710 : 242 : PC=[0000000080002016] (M,48,01) 05877757 vsetvli a4, a4, e64, m1, ta, mu
GPR[14](1) <= 0000000000000004
18850 : L1D Load-In     : 80003400(00208) : 00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004
18850 : Load ISS Check  : 80003400        : 00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000
18854 : L1D Stq Store  : 80003400(00208) : 00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004________________________________________________________________________
18854 : STQ  ISS Check : 80003400        : 00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000004_00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000
4717 : 243 : PC=[000000008000201a] (M,49,01) 5e07cf57 vmv.v.x v30, a5
VPR[30](35) <= 00000000_00000008_00000000_00000008_00000000_00000008_00000000_00000008_
4717 : 244 : PC=[000000008000201e] (M,49,02) 02087f27 vse64.v v30, (a6)
MW8(0x0000000080003440)=>0000000000000008
MW8(0x0000000080003448)=>0000000000000008
MW8(0x0000000080003450)=>0000000000000008
MW8(0x0000000080003458)=>0000000000000008
==========================================
4717 : 245 : PC=[0000000080002022] (M,49,04) 000097ba c.add   a5, a4
GPR[15](107) <= 000000000000000c
4717 : 246 : PC=[0000000080002024] (M,49,08) 00371893 slli    a7, a4, 3
GPR[17](138) <= 0000000000000020
4717 : 247 : PC=[0000000080002028] (M,49,16) 00009846 c.add   a6, a7
GPR[16](178) <= 0000000080003460

ここまでのフレームワークが完成すると、LMULを可変にするアプローチができるようになってくる。とりあえずベクトルロードはここまでにして、次に進んでみよう。