NaxRiscvはオープンソースのアウトオブオーダCPUコアだ。 非常に参考になるデザインだと思うのだが、SpinalHDLというScalaをベースとした謎の言語で書かれている。
- レジスタ・リネームによるアウトオブオーダー実行
- スーパースカラ(例: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キャッシュ
デザインのダウンロードとビルド方法は昔にまとめていた:
今回はもうちょっとデザインの中身を確認したいという目的がある。
とりあえず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