FPGA開発日記

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

自作RISC-VコアにおけるRMW命令の実装 (2. 最も基本的なRMWの実装)

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