RISC-VのRMW(Read Modify Write)命令を自作OoOコアに実装しようとしている。
まずはAMOADD.W命令の実装から初めて見ている。 RMW命令は基本的にSTQからパイプラインに流すようにしている。 ただしストア命令のようにL1Dに最後に書くだけではないので、L1Dに最初にアクセスしてレジスタロード用のメモリリクエストを発行し、 最後にL1Dへのアップデートの書き込みを行う。
したがってSTタイプの命令ではあるのだが、L1DへのアクセスチェックとLRQ(Load Request Queue)による外部からのデータロードを駆動する必要がある。 STQのエントリにも、LRQ待ち合わせのためのステートマシンを追加している。
RMWのためのステートマシンはだいたい以下の通り。ちょっとわかりにくいが、STQでもLRQのリクエスト確認をしている。 ST-BufferでL1D存在チェックをしてもいいと思うのだが、そうするとレジスタアップデートのために新しいパスを追加しないといけないのでこのような構成にした。
ST-Bufferのステートマシンについては、あまり変更はしていないのだがRMWのための演算回路を追加している。
とりあえず最も基本的な動作はできるようになった。次は、RMWからのフォワーディングはサポートしていないのでそれを禁止する必要がある。 (つまり、L1Dへの書き込みが完了するまで後続のロード命令の動作を禁止する)。 今度はこれを実装していこう。
2542 : 70 : PC=[0000000080000180] (U,10,01) 00002697 auipc a3, 0x2 GPR[13](27) <= 0000000080002180 2546 : 71 : PC=[0000000080000184] (U,11,01) e8068693 addi a3, a3, -384 GPR[13](30) <= 0000000080002000 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) 00b6a72f amoadd.w a4, a1, (a3) MR4(0x0000000080002000)=>ffffffff80000000 MW4(0x0000000080002000)=>000000007ffff800 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) 04771263 bne a4, t2, pc + 68 10298 : L1D Load-In : 80002000(00000) : 00000000_00000000_00000001_7ffff800 10298 : Load ISS Check : 80002000 : 00000000_00000000_00000000_7ffff800 10302 : L1D Stq Store : 80002000(00000) : ___________________________7ffff800 10302 : STQ ISS Check : 80002000 : 00000000_00000000_00000000_7ffff800 2581 : 77 : PC=[000000008000019c] (U,04,01) 0006a783 lw a5, 0(a3) MR4(0x0000000080002000)=>000000007ffff800 GPR[15](6) <= 000000007ffff800 2583 : 78 : PC=[00000000800001a0] (U,05,01) 800003b7 lui t2, 0x80000 GPR[07](2) <= ffffffff80000000 2584 : 79 : PC=[00000000800001a4] (U,06,01) 8003839b addiw t2, t2, -2048 GPR[07](24) <= 000000007ffff800 2585 : 80 : PC=[00000000800001a8] (U,07,01) 00300193 li gp, 3 GPR[03](28) <= 0000000000000003 2585 : 81 : PC=[00000000800001ac] (U,07,02) 02779863 bne a5, t2, pc + 48 2605 : 82 : PC=[00000000800001b0] (U,11,01) 800005b7 lui a1, 0x80000