FPGA開発日記

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

オープンソース・アウトオブオーダCPU NaxRiscvを概観する (7. RVCサポートのNaxRiscvをRTLシミュレーションする)

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

ちょっとRVC付きのNaxRiscvについてRTLシミュレーションの流し方をまとめておく。

  • ビルド対象について、withRvcを有効化しておく。
diff --git a/src/main/scala/naxriscv/Gen.scala b/src/main/scala/naxriscv/Gen.scala
index 031ce67..b33862e 100644
--- a/src/main/scala/naxriscv/Gen.scala
+++ b/src/main/scala/naxriscv/Gen.scala
@@ -529,7 +529,7 @@ object Gen64 extends App{
       withRdTime = false,
       aluCount    = 2,
       decodeCount = 2,
-      withRvc = false,
+      withRvc = true,
       withDebug = false,
       withEmbeddedJtagTap = false,
       debugTriggers = 4,
$ sbt "runMain naxriscv.Gen64"
$ cd $NAXRISCV/src/test/cpp/naxriscv
$ make compile

RTLシミュレーションの方法:

$ ./obj_dir/VNaxRiscv --trace --trace-ref --name coremark --load-elf ../../../../ext/NaxSoftware/baremetal/coremark/build/rv64imac/coremark.elf --pass-symbol pass
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 2166532
Total time (secs): 2166532.000000
Iterations/Sec   : 0.000005
Iterations       : 10
Compiler version : GCC11.1.0
Compiler flags   : -DPERFORMANCE_RUN=1  -march=rv64imac -mabi=lp64 -mcmodel=medany -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -I../driver -O3 -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -DCORE_DEBUG=0  -lgcc -lc -nostartfiles -ffreestanding -Wl,-Bstatic,-T,../common/app.ld,-Map,coremark.map,--print-memory-usage
Memory location  : STACK
seedcrc          : 0xe9f5
[0]crclist       : 0xe714
[0]crcmatrix     : 0x1fd7
[0]crcstate      : 0x8e3a
[0]crcfinal      : 0xfcaf
Correct operation validated. See README.md for run and reporting rules.
CoreMark 1.0 : 0.000005 / GCC11.1.0 -DPERFORMANCE_RUN=1  -march=rv64imac -mabi=lp64 -mcmodel=medany -Wno-pointer-to-int-cast -Wno-int-to-pointer-cast -I../driver -O3 -fno-common -funroll-loops -finline-functions -falign-functions=16 -falign-jumps=4 -falign-loops=4 -finline-limit=1000 -fno-if-conversion2 -fselective-scheduling -fno-crossjumping -freorder-blocks-and-partition -DCORE_DEBUG=0  -lgcc -lc -nostartfiles -ffreestanding -Wl,-Bstatic,-T,../common/app.ld,-Map,coremark.map,--print-memory-usage / STACK
4.62 Coremark/MHz
SUCCESS coremark

こうして波形も確認することができる。これはRVCの命令がディスパッチされているところ。 ソースコードでの挙動の予想と違い、RVC命令はAlignerではまだ16ビット命令表現のままだった。