FPGA開発日記

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

Tenstorrentの公開したRISC-V検証パタン riscv_arch_tests を試す (5. テストパタンの解析)

ずっと試してみたかった、Tenstorrentが公開したRISC-V検証パタンである riscv_arch_tests を試してみることにした。 自作CPUに適用して、さらなるバグが発見されることを期待している。

github.com

テストパタンを試しているが、どうも.os_dataの扱い方がよく分からない。 .os_dataのセクションがそれぞれのテストパタンで違うので、それぞれでSpikeに違う設定をしなければならなくなっている。 結果的にSpikeを立ち上げるコマンドがかなり長くなってしまった。

  argv[arg_max++] = "-m0x80000000:0x10000," \
      "0x726000:0x1000," \
      "0x28cfb4d00:0x1000," \
      "0x9899ca3400:0x1000," \
      "0x1ce9e93c00:0x1000," \
      "0x13e316afc00:0x1000," \
      "0x129000:0x1000," \
      "0x1c0058:0x1000," \
      "0x4c7000:0x1000," \
      "0x1146018:0x1000," \
      "0x3d16000:0x1000," \
      "0x8a4f1d0:0x1000," \
      "0xce68008:0x1000," \
      "0x43755000:0x1000," \
      "0x80030328:0x1000," \
      "0x6b1e47200:0x1000," \
      "0x192c79b108:0x1000," \
      "0x281ee84058:0x1000," \
      "0x13e316afc00:0x1000," \
      "0x00000298b2df3010:0x1000," \
      "0x00000466799200b0:0x1000," \
      "0x00001c0bff9f5010:0x1000," \
      "0x0000000123612c00:0x1000," \
      "0x00000000001f8c00:0x1000," \

それでも、どうしてもSpikeでロードできないケースがある。

spike ../tests/riscv_arch_tests/riscv_tests/rv_c/rv_c/rv_c_3
spike ../tests/riscv_arch_tests/riscv_tests/rv_c/rv_c/rv_c_3
Access exception occurred while loading payload ../tests/riscv_arch_tests/riscv_tests/rv_c/rv_c/rv_c_3:
Memory address 0x1f8000 is invalid

このヘッダは何のために使われているんだ?

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOPROC+0x3     0x000000000000507c 0x0000000000000000 0x0000000000000000
                 0x00000000000000b5 0x0000000000000000  R      0x1
  LOAD           0x0000000000000000 0x00000000001f8000 0x00000000001f8000
                 0x0000000000000c30 0x0000000000000c30  RW     0x1000
  LOAD           0x0000000000001000 0x000000000027e000 0x000000000027e000
                 0x0000000000000068 0x0000000000000068  RW     0x1000
  LOAD           0x0000000000002000 0x000000000633a000 0x000000000633a000
                 0x000000000000004c 0x000000000000004c  RW     0x1000
  LOAD           0x0000000000003000 0x0000000080000000 0x0000000080000000
                 0x00000000000002ec 0x00000000000002ec  R E    0x1000
  LOAD           0x0000000000004000 0x0000000080002000 0x0000000080002000
                 0x00000000000004a0 0x00000000000004a0  RW     0x1000
  LOAD           0x0000000000005000 0x000025e3c625e000 0x000025e3c625e000
                 0x000000000000007c 0x000000000000007c  RW     0x1000

とりあえず必要そうなヘッダの情報を全部取り出して1つのファイルにして、Spike呼び出し時にこれを読み込むようにしてみた。

for rvi in `find . -name "rv*" | grep -v \.list`; do riscv64-unknown-elf-readelf -l ${rvi} | grep LOAD | sed 's/  */ /g'; done  | cut -f5 -d' ' | sort | uniq

テストは動作するようになったが、今度はハードウェア側のTLBを書き換えないと変な場所に書き込みをしてしまう。これは困ったなあ...

3835 : 178 : PC=[0000000080002030] (M,14,01) 00c11113 slli    sp, sp, 12
GPR[02](24) <= 000000012f1e3000
3836 : 179 : PC=[0000000080002034] (M,15,01) 12f10113 addi    sp, sp, 303
GPR[02](36) <= 000000012f1e312f
3841 : 180 : PC=[0000000080002038] (M,00,01) 00d11113 slli    sp, sp, 13
GPR[02](25) <= 000025e3c625e000
3841 : RTL(0,2) Exception Cause = Store Access Fault(7) PC=00008000203c, Inst=0000da9e, c.swsp  t2, 116(sp)
==========================================
3841 : Exception Happened(0,2) : Cause = Store Access Fault(7)
==========================================
3861 : RTL(4,1) Exception Cause = CSR Update Flush(27) PC=0000800000d0, Inst=342020f3, csrr    ra, mcause
3861 : 181 : PC=[00000000800000d0] (M,04,01) 342020f3 csrr    ra, mcause
MW4(0x000025e3c625e074)=>0000000004e01ba4
==========================================
Wrong PC: RTL = 00000000800000d0, ISS = 000000008000203c
==========================================