自作RISC-Vコアの検証を強化するために、ランダムテストケースの適用を始めた。
RISC-Vにおけるランダムテストケースはriscv-torture
がオープンソースで使用可能だ。開発が終了してから時間がかなり立っているが、さてどうだろう。
とりあえず適用してみる。実行にはScalaが必要だ。整数命令に限定して命令を生成してみた。
// random assembly code generated by RISC-V torture test generator // nseqs = 200 // memsize = 1024 #include "riscv_test.h" RVTEST_RV64U /* ... 省略 ..*/ pseg_0: la x19, test_memory+1341 la x24, test_memory-917 la x10, test_memory+2067 la x11, test_memory+1849 lb x20, 1655(x24) la x30, test_memory-187 la x15, test_memory+1085 addi x5, x0, 627 la x6, test_memory+2847 div x22, x2, x2 sb x5, -1953(x6) la x8, test_memory+288 sd x13, 1051(x30) addi x17, x0, 1 addi x1, x0, -261 addi x4, x0, -1739 mulh x29, x5, x5 sll x17, x17, 63 addi x18, x0, -1 lw x27, -549(x19) sll x31, x1, x4 xor x18, x18, x17 lh x12, -1175(x10) /* ... 省略 ... */
ランダムテストとしては品質が良さそうだ。実行してみよう。
GPR[05](13) <= 0000000000000273 2619 : 82 : PC=[00000000800001c4] (U,03,01) f0f18313 addi t1, gp, -241 GPR[06](14) <= e147057addf46b2c 2620 : 83 : PC=[00000000800001c8] (U,04,01) 02214b33 div s6, sp, sp GPR[22](15) <= 0000000000000001 2620 : RTL(4,2) Exception Cause = 7 ========================================== 2620 : Exception Happened(4,2) : Cause = Store Access Fault(7) ========================================== 2639 : RTL(9,1) Exception Cause = 27 2639 : 83 : PC=[0000000080000004] (M,09,01) 34202f73 csrr t5, mcause GPR[30](20) <= 0000000000000007 2654 : 85 : PC=[0000000080000008] (M,11,01) 00800f93 li t6, 8 GPR[31](22) <= 0000000000000008 /* ... 途中省略 ...*/ MW4(0x0000000080001000)=>00000000ddf46d3d 2736 : 113 : PC=[0000000080000044] (M,01,02) ff9ff06f j pc - 0x8 GPR[00](0) <= 0000000000000000 10950 : L1D Stq Store : 80001000(256) : ___________________________ddf46d3d =============================== SIMULATION FINISH : FAIL (CODE=61) ===============================
よく考えてみると、例外が発生した場合にはいろんな状況に応じて復帰させないといけない。このままじゃだめだ。例外時の動作を変更する。
GPR[28](58) <= 000000008000031c 3630 : 274 : PC=[000000008000003c] (M,08,01) 004e0e13 addi t3, t3, 4 GPR[28](6) <= 0000000080000320 3636 : RTL(9,1) Exception Cause = 27 3636 : 275 : PC=[0000000080000040] (M,09,01) 341e1073 csrw mepc, t3 3649 : RTL(1,1) Exception Cause = 24 3649 : 276 : PC=[0000000080000044] (M,01,01) 30200073 mret 3666 : 277 : PC=[0000000080000320] (U,09,01) 034f1fb3 mulh t6, t5, s4 ========================================== Wrong GPR[31](70): RTL = 0000000000000009, ISS = ffffffffffffffff ========================================== =============================== SIMULATION FINISH : FAIL (CODE=100) ===============================
なるほどそれっぽいバグを見つけることができそうだ。これで運用してみよう。