FPGA開発日記

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

自作RISC-V CPU開発におけるriscv-tortureの適用

自作RISC-Vコアの検証を強化するために、ランダムテストケースの適用を始めた。 RISC-Vにおけるランダムテストケースはriscv-tortureオープンソースで使用可能だ。開発が終了してから時間がかなり立っているが、さてどうだろう。

github.com

とりあえず適用してみる。実行には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)
===============================

なるほどそれっぽいバグを見つけることができそうだ。これで運用してみよう。