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できない。詳細は追ってブログに書こうと思う。
図. 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