FPGA開発日記

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

RISC-VパタンをPASSさせるためのいくつかのISS修正(AMO命令)

http://bar.eecs.berkeley.edu/projects/images/projects/2010-riscv.png

画像: UCB-BAR: RISC-V Instruction Set Architecture より。

RISC-Vにおいて、アトミック命令としてAMO命令群が存在している。これは、

  1. メモリリード
  2. データ操作
  3. メモリライト、レジスタアクセス

をアトミックに実行する。例えば、AMOSWAP命令は

amoswap.w v0, v1, (a0)
  1. アドレスa0からメモリデータをリードする。
  2. v0にメモリデータを書き込む
  3. v1の値をメモリアドレスa0に書き込む

という操作となる。一方でAMO[ops]命令(例えばAMOAND命令)は、

  1. アドレスa0からメモリデータをリードする。
  2. v0にメモリデータを書き込む
  3. メモリデータとv0演算し、演算結果をメモリアドレスa0に書き込む

となる。これらのパタンでいくつか落ちていたので、ISSの修正を行った。

github.com

修正を行い、とりあえず現状はリグレッションテストでFAILしているのは以下のパタンのみになった。445本中435本がPASSだ。

The following tests FAILED:
          8 - rv32mi-p-timer (Failed)
          9 - rv32si-p-csr (Failed)
         47 - rv32ui-pm-lrsc (Failed)
        126 - rv64mi-p-dirty (Failed)
        130 - rv64mi-p-mcsr (Failed)
        134 - rv64mi-p-timer (Failed)
        136 - rv64si-p-csr (Failed)
        230 - rv64ui-pm-lrsc (Failed)
        436 - median (Failed)
        443 - spmv (Failed)

残っているのは、権限のあたりで実装が足りないところが多い。マシンモードのレジスタであっても、スーパバイザモード中に変更できる例外的な状態があったりだとか、 タイマ系も権限があるといっても、別の権限で実行中でも動作できたりなど、特殊な状態での動作をサポートする必要がある。 そのあたりを詰めて行こう。