FPGA開発日記

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

オープンソース・アウトオブオーダCPU NaxRiscvを概観する (1.)

NaxRiscvはオープンソースのアウトオブオーダCPUコアだ。 非常に参考になるデザインだと思うのだが、SpinalHDLというScalaをベースとした謎の言語で書かれている。

spinalhdl.github.io

  • レジスタ・リネームによるアウトオブオーダー実行
  • スーパースカラ(例:2デコード、3実行ユニット、2リタイア)
  • (RV32/RV64)IMAFDCSU (Linux / Buildroot / Debian)
  • ポータブルHDLだが、分散RAMを持つFPGAをターゲットとする(Xilinx series 7がこれまで使用されたリファレンスである)
  • (比較的)低い面積使用と高いfmaxを目標とする(最高のIPCではない)
  • 分散化されたハードウェア・エラボレーション(プラグインでパラメトリック化された空のトップレベル)
  • カスタマイズを容易にするため、パイプラインフレームワークを中心に実装されたフロントエンド
  • 複数のリフィルとライトバック・スロットを持つノンブロッキング・データ・キャッシュ
  • BTB + GSHARE + RAS分岐予測器
  • ハードウェア・リフィルドMMU(SV32、SV39)
  • 投機的キャッシュ・ヒット予測による3サイクルのロード・トゥ・ユーズ・レイテンシ
  • verilatorシミュレーションとKonata(gem5ファイルフォーマット)によるパイプラインの可視化
  • RISCV External Debug Support v.0.13.2の実装によるJTAG/OpenOCD/GDBのサポート
  • Tilelinkによるメモリコヒーレンシーのサポート
  • オプションのコヒーレントL2キャッシュ

デザインのダウンロードとビルド方法は昔にまとめていた:

msyksphinz.hatenablog.com

今回はもうちょっとデザインの中身を確認したいという目的がある。

https://spinalhdl.github.io/NaxRiscv-Rtd/main/NaxRiscv/introduction/index.html#pipeline より引用

とりあえずCoremarkを動かした:

cd src/test/cpp/naxriscv/obj_dir
./VNaxRiscv --name coremark --load-elf ../../../../../ext/NaxSoftware/baremetal/coremark/build/rv32ima/coremark.elf --pass-symbol pass
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 1993233
Total time (secs): 1993233.000000
Iterations/Sec   : 0.000005
Iterations       : 10
Compiler version : GCC11.1.0
Compiler flags   : -DPERFORMANCE_RUN=1  -march=rv32ima -mabi=ilp32 -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=rv32ima -mabi=ilp32 -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
5.02 Coremark/MHz
SUCCESS coremark

RV64を試す

RV64のNaxRiscvを生成するためには以下のコマンドを使う。

sbt "runMain naxriscv.Gen64"
cd $NAXRISCV/src/test/cpp/naxriscv
make compile
./obj_dir/VNaxRiscv --name coremark --load-elf ../../../../ext/NaxSoftware/baremetal/coremark/build/rv64ima/coremark.elf --pass-symbol pass
2K performance run parameters for coremark.
CoreMark Size    : 666
Total ticks      : 2025329
Total time (secs): 2025329.000000
Iterations/Sec   : 0.000005
Iterations       : 10
Compiler version : GCC11.1.0
Compiler flags   : -DPERFORMANCE_RUN=1  -march=rv64ima -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=rv64ima -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.94 Coremark/MHz
SUCCESS coremark