FPGA開発日記

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

自作CPUにベクトル命令を追加する実装検討(41. リプレイキューとベクトルuopsの考え直し)

実装の考え直しをして、Uop Generatorを移動して、アドレス生成の調整を行う。 1uop分しかReplay Queueには格納されないので、再度パイプラインに流すときのアドレスの調整を行う必要がある。

通常は、最初のアドレスがrs1+0でそれをベースにaddress generatorの中でDLENBを加算しているのだが、途中の要素からリプレイが入るとrs+DLEN*Nからのアドレス再計算が必要になる。

この部分は、リプレイキューに途中まで計算した仮想アドレスを覚えておいて、そこから再計算が必要になるのはやむを得ないところだ。

  • VLE32.v v10, a10
0. v10[0] <= XPR[a10] + 0 (=vaddr_temp)
1. v10[1] <= XPR[a10] + DLENB (=vaddr_temp + DLENB)
2. v10[2] <= XPR[a10] + DLENB*2 (=vaddr_temp + DLENB)
3. v10[3] <= XPR[a10] + DLENB*3 (=vaddr_temp + DLENB)

ここで、1. からリプレイが入るとすると、XPR[a10] + DLENBから再スタートしないといけないので、リプレイキューに入る命令は、このアドレスを覚えておかなければならない。

1. v10[1] <= XPR[a10] + DLENB (=vaddr_temp + DLENB)
2. v10[2] <= XPR[a10] + DLENB*2 (=vaddr_temp + DLENB)
3. v10[3] <= XPR[a10] + DLENB*3 (=vaddr_temp + DLENB)