FPGA開発日記

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

自作CPUにベクトル命令を追加する実装検討 (33. LMUL>1の対応考え直し)

前回の続き。マイクロコードを変更して再実験を行う。今回の再実験で考え直さなければならないのは以下の通りだった。

  1. LMULを命令情報として追加して、最後の命令であればROBに命令終了通知を出す。
  2. vsetvl命令がLMUL_CHANGE例外を出すとき、VSEWとかVLMULの値は過去のものを保持するが、vlの書き込みは行う。
  3. 例外実行中のvsetvl命令では、vsetvli x0, x0を使用するので、vlの値をキープするように変更する。

これにより、一応簡単なLMUL=8のテストケースは動作するようになった。 しかしまだ甘すぎるので、さっそく検証を動かしていこうと思う。

  • 基本の考え直し。
  • LMULが大きくなる方向の変化
    • 例外を発生させて、物理レジスタを退避させて整列させる。
    • 起点レジスタ(LMUL=8の場合は8の倍数となるレジスタ)の値はリネームマップに書かれている。それ以外の従属するレジスタ(8の倍数以外のレジスタ)は、リネームマップに記載されない。リネームマップ内で、常にLMUL=8をベースにして再計算される。この状況はWhole Register Storeへの取り扱いの時に必要となる。
      • ちなみに、Whole Register Loadへの取り扱いはLMUL=1に戻さないとどうにもならない。
  • LMULが小さくなる方向(ただしマイナスを除く)
    • 例外を発生させなくてもよいと思っていたが、元の起点レジスタ以外のベクトルレジスタのリネームマップテーブルが正しく更新されていないため、矛盾が生じる。
    • 元の起点レジスタ以外のレジスタのリネームマップが正しくないので、誤ったレジスタ名を読んでしまう。
    • したがって、LMULが小さくなる方向であっても、レジスタを再整列させる必要がある。
    • ただし、vs1r命令を用いて1つずつ元に戻すことはできない。vs1r命令の粒度では、物理レジスタのリネーム・マップを管理していないからである。(LMULの大きさで管理している)
    • そこで、pushするときは古いLMULの大きさでpushし、popするときは、新しいLMULの大きさでpopするという芸当を使わなければならない。