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