FPGA開発日記

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

Rocket-ChipのAtomic命令動作観察 (2. QuadCoreConfigによるAtomic命令のRTLシミュレーション)

Chipyardの4コアコンフィグレーションを使用してAtomic命令の動作をシミュレートする。

テストとして以下のようなプログラムを作り、4コアが同じキャッシュラインを更新していくことを確認していきたい。

 int global = 0;

 static inline void amoadd_d()
 {
   int ret;
   asm volatile ("amoadd.w %0, %1, %2" : "=r"(ret) : "r"(1), "m"(global));
 }

 unsigned long data = 0x3421L;

 int main(void)
 {
   for (int i = 0; i < 100; i++) {
     amoadd_d();
   }

   return 0;
 }


 int __main(void)
 {
   for (int i = 0; i < 100; i++) {
     amoadd_d();
   }

   return 0;
 }

__main()はコア0以外のコアが実行するためのmain()関数で、Weak定義してあるので明示的に定義することで有効化できる。

make debug CONFIG=QuadRocketConfig
./simulator-chipyard-QuadRocketConfig-debug +verbose -v accum.quad.vcd ../../tests/amoadd.riscv 2>&1 | spike-dasm | tee amoadd.quad.log

amoadd.w命令の動作を観察する。

grep amo amoadd.quad.log
C3:      11190 [1] pc=[0000000080000240] W[r12=0000000000000184][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
C2:      11244 [1] pc=[0000000080000240] W[r12=0000000000000185][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
C1:      11298 [1] pc=[0000000080000240] W[r12=0000000000000186][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
C3:      11294 [1] pc=[0000000080000240] W[r12=0000000000000187][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
C2:      11348 [1] pc=[0000000080000240] W[r12=0000000000000188][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
C1:      11402 [1] pc=[0000000080000240] W[r12=0000000000000189][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
C3:      11375 [1] pc=[0000000080000240] W[r12=000000000000018a][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
C2:      11429 [1] pc=[0000000080000240] W[r12=000000000000018b][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
C1:      11483 [1] pc=[0000000080000240] W[r12=000000000000018c][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
C3:      11456 [1] pc=[0000000080000240] W[r12=000000000000018d][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
C2:      11533 [1] pc=[0000000080000240] W[r12=000000000000018e][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)
C1:      11617 [1] pc=[0000000080000240] W[r12=000000000000018f][1] R[r13=00000000800006a0] R[r14=0000000000000001] inst=[00e6a62f] amoadd.w a2, a4, (a3)

一応上手く行っているようだ。波形の詳細解析は今後。

f:id:msyksphinz:20220223003803p:plain
./simulator-chipyard-QuadRocketConfig-debug +verbose -v accum.quad.vcd ../../tests/amoadd.riscv 2>&1 | spike-dasm | tee amoadd.quad.log の実行結果波形