FPGA開発日記

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

自作RISC-VコアにおけるRMW命令の実装 (3. RMW命令のデバッグ)

RISC-VのRMW(Read Modify Write)命令を自作OoOコアに実装しようとしている。

AMOADDの実装は完了した。次に、RMW命令を追い越そうとする命令を検出して止める機能を実装する。 パイプライン中でSTQを参照し、自分よりも古いRMW命令が存在している場合にそれを検出して実行を止める機能を付けた。

自分よりも古いRMW命令が存在した場合命令はパイプラインから離脱してLDQ/STQに戻ってくるのだが、そのあとどうやって再開すればいいのかが問題だ。 単純に考えれば、ハザードの発生したRMW命令が抜けるのを待つ。つまりRMWの存在しているSTQのインデックスを覚えておいて、それが解放されれば一斉に再開となるのだが、 STQのインデックスを記憶しておくのが正直面倒なので、RMWのハザードにぶつかった命令は基本的に最も古い命令になるまで再開しないこととした。 性能は落ちるが、どっちにしろRMW命令を使っているのであまり性能面で気にするところではない。

これにより、一通り簡単なRMW命令のテストが動くようになった。 しかしまだすべてのリグレッションテストがPASSしているわけではない。それぞれのテストケースをチェックしていこう。

rv64ua-p-amomaxu_w      : ERROR
rv64ua-p-amominu_w      : ERROR
rv64ua-p-amomin_w       : ERROR
rv64ua-p-amoor_d        : PASS
rv64ua-p-amoadd_d       : PASS
rv64ua-p-amomaxu_d      : ERROR
rv64ua-p-amomax_d       : ERROR
rv64ua-p-amomax_w       : ERROR
rv64ua-p-amoswap_d      : PASS
rv64si-p-scall  : PASS
rv64ua-p-amomin_d       : ERROR
rv64ua-p-amoadd_w       : ERROR
rv64ua-p-amoor_w        : ERROR
rv64ua-p-amoand_w       : ERROR
rv64ua-p-amominu_d      : ERROR
rv64si-p-wfi    : PASS
rv64ua-p-amoand_d       : PASS
rv64si-p-ma_fetch       : PASS
rv64si-p-dirty  : PASS
rv64si-p-icache-alias   : PASS
rv64ua-p-amoxor_w       : ERROR
rv64ua-p-amoswap_w      : ERROR
rv64ua-p-amoxor_d       : PASS
2546 : 72 : PC=[0000000080000188] (U,11,02) 00a6a023 sw      a0, 0(a3)
MW4(0x0000000080002000)=>0000000080000000
10250 : L1D Load-In     : 80002000(00000) : 00000000_00000000_00000000_80000000
10250 : L1D Merged      : 80002000(00000) : 00000000_00000000_00000000_80000000
10250 : Load ISS Check  : 80002000        : 00000000_00000000_00000000_80000000
2569 : 73 : PC=[000000008000018c] (U,12,01) 60b6a72f amoand.w a4, a1, (a3)
MR4(0x0000000080002000)=>ffffffff80000000
MW4(0x0000000080002000)=>0000000080000000
GPR[14](38) <= ffffffff80000000
2569 : 74 : PC=[0000000080000190] (U,12,02) 800003b7 lui     t2, 0x80000
GPR[07](41) <= ffffffff80000000
2571 : 75 : PC=[0000000080000194] (U,13,01) 00200193 li      gp, 2
GPR[03](31) <= 0000000000000002
2571 : 76 : PC=[0000000080000198] (U,13,02) 04771063 bne     a4, t2, pc + 64
10298 : L1D Load-In     : 80002000(00000) : 00000000_00000000_00000000_80000000
10298 : Load ISS Check  : 80002000        : 00000000_00000000_00000000_80000000
10302 : L1D Stq Store  : 80002000(00000) : ___________________________80000000
10302 : STQ  ISS Check : 80002000        : 00000000_00000000_00000000_80000000
2582 : 77 : PC=[000000008000019c] (U,14,01) 0006a783 lw      a5, 0(a3)
MR4(0x0000000080002000)=>ffffffff80000000
GPR[15](24) <= ffffffff80000000
2582 : 78 : PC=[00000000800001a0] (U,14,02) 800003b7 lui     t2, 0x80000
GPR[07](42) <= ffffffff80000000
2584 : 79 : PC=[00000000800001a4] (U,15,01) 00300193 li      gp, 3
GPR[03](28) <= 0000000000000003
2584 : 80 : PC=[00000000800001a8] (U,15,02) 02779863 bne     a5, t2, pc + 48
2585 : 81 : PC=[00000000800001ac] (U,00,01) 0010059b addiw   a1, zero, 1
GPR[11](25) <= 0000000000000001
2591 : 82 : PC=[00000000800001b0] (U,01,01) 01f59593 slli    a1, a1, 31
GPR[11](3) <= 0000000080000000
2591 : 83 : PC=[00000000800001b4] (U,01,02) 60b6a72f amoand.w a4, a1, (a3)
MR4(0x0000000080002000)=>ffffffff80000000
MW4(0x0000000080002000)=>0000000080000000
GPR[14](43) <= ffffffff80000000
2592 : 84 : PC=[00000000800001b8] (U,02,01) 800003b7 lui     t2, 0x80000
GPR[07](5) <= ffffffff80000000
2593 : 85 : PC=[00000000800001bc] (U,03,01) 00400193 li      gp, 4
GPR[03](27) <= 0000000000000004
2593 : 86 : PC=[00000000800001c0] (U,03,02) 00771c63 bne     a4, t2, pc + 24
10386 : L1D Load-In     : 80002000(00000) : 00000000_00000000_00000000_80000000
10386 : Load ISS Check  : 80002000        : 00000000_00000000_00000000_80000000
10390 : L1D Stq Store  : 80002000(00000) : ___________________________80000000
10390 : STQ  ISS Check : 80002000        : 00000000_00000000_00000000_80000000
2604 : 87 : PC=[00000000800001c4] (U,04,01) 0006a783 lw      a5, 0(a3)
MR4(0x0000000080002000)=>ffffffff80000000
GPR[15](6) <= ffffffff80000000
2604 : 88 : PC=[00000000800001c8] (U,04,02) 800003b7 lui     t2, 0x80000