FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

RISC-Vテストパタン riscv-tests を使った命令セットシミュレータの検証 (Vモードのテストパタンの解析)

RISC-V の実装や命令セットシミュレータ (Instruction Set Simulator) を作ったとき、その実装の正当性をチェックするためにriscv-toolsのテストパタンを使用するという方法がある。

riscv-testsにはいくつかの種類があって、

  • rv32ui-p (32-bitモード、整数命令、Physical Addressing モード)
  • rv64uf-v (64-bitモード、浮動小数点命令、Virtual Addressingモード)

で、Virtual Addressingモードのテストパタンの検証なのだけれども結構ややこしいことになっている。 RISC-V の ISSであるSpikeで観測してみた。

この結果sretの動作についてはかなりわかってきたのだが、MMUの渡り方がかなり難しくて実装に手こずってしまった。

しかもRev1.7とRev1.10ではMMUのページテーブルの構成もかなり変わっている。 いろいろ試行を試したあたりでは、

  • AccessBit / DirtyBitのあたりの仕様が変わっている。
7. If pte:a = 0, or if the memory access is a store and pte:d = 0, either raise a page-fault exception

あたりもしっかり実装しないとPassできない。詳細は追ってブログに書こうと思う。

f:id:msyksphinz:20180406024424p:plain
図. RISC-V ページテーブルのアクセス制御表。

とりあえず、自作RISC-VシミュレータにV-ModeのMMUを実装したことでパタンの大半をPassできるようになってきた。

とはいえ400本中まだ140本か、、、先は長いな。それにRV32系のパタンが全部Failだ。

rv64ui-v-ld                    Fail
rv64ui-v-addw                  Pass
rv64ui-v-xor                   Pass
rv64ui-v-sltu                  Pass
rv64ui-v-subw                  Pass
rv64ui-v-bgeu                  Pass
rv64ui-v-andi                  Pass
rv64ui-v-srl                   Pass
rv64ui-v-sb                    Fail
rv64ui-v-slt                   Pass
rv64ui-v-sw                    Fail
rv64ui-v-and                   Pass
rv64ui-v-addi                  Pass
rv64ui-v-sraw                  Pass
rv64ui-v-ori                   Pass
rv64ui-v-sd                    Fail
rv64ui-v-srai                  Pass
rv64ui-v-sh                    Fail
rv64ui-v-jalr                  Pass
rv64ui-v-slti                  Pass
rv64ui-v-srlw                  Pass
rv64ui-v-sra                   Pass
rv64ui-v-lh                    Fail
rv64ui-v-auipc                 Pass
rv64ui-v-srliw                 Pass
rv64ui-v-lui                   Pass
rv64ui-v-blt                   Pass
rv64ui-v-bne                   Pass
rv64ui-v-srli                  Fail
rv64ui-v-sraiw                 Pass
rv64ui-v-lw                    Fail
rv64ui-v-bltu                  Pass
rv64ui-v-lbu                   Fail
rv64ui-v-slliw                 Pass
rv64ui-v-fence_i               Fail
rv64ui-v-beq                   Pass
rv64ui-v-or                    Pass
rv64ui-v-lb                    Fail
rv64ui-v-lhu                   Fail
rv64ui-v-add                   Pass
rv64ui-v-sub                   Pass
rv64ui-v-xori                  Pass
rv64ui-v-bge                   Pass
rv64ui-v-sll                   Pass
rv64ui-v-slli                  Pass
rv64ui-v-sltiu                 Fail
rv64ui-v-simple                Pass
rv64ui-v-addiw                 Pass
rv64ui-v-sllw                  Pass
rv64ui-v-lwu                   Fail
rv64ui-v-jal                   Pass

2018/04/07追記。32-bit V-Mode のパタンを追加してV-Modeのテストがかなり通るようになってきた。

grep Pass result.txt  | wc
    225     450    8100
grep Fail result.txt  | wc
    176     352    6336