FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

RVC命令に対応したRISC-VアウトオブオーダコアBOOM v2.2リリース (1. ビルド & シミュレーション試行)

RISC-VのアウトオブオーダプロセッサであるBOOMのVersion 2.2がリリースされた。

リリース通知から、アップデート内容を確認してみると、

  • 全てのコンフィグレーションでRISC-V Compressed("RVC")命令をサポート
  • PMPレジスタのサポート
    • 確かにこれまでPMPレジスタにアクセスすると必ず例外が発生していた。
    • 多くのプロジェクトではPMPレジスタが使用されている(Keystoneなど)
  • ノンブロッキングL1キャッシュはRocket-Chipからフォークされた。
    • これはPMPサポートのために必要。しかしさらに強力なDCacheを搭載する予定。
  • マイナーなCSR命令の修正
  • ReadTheDocs documentation を作成 https://docs.boom-core.org/en/latest/
  • ウェブサイトを作り直し boom-core.org
  • BOOMのリポジトリはriscv-boomに移動しなおした。
    • これまではEsperantoTechのリポジトリとして管理されていたのだが、riscv-boomに戻ったのか。
  • BOOMによるSpectre攻撃のデモンストレーション https://github.com/riscv-boom/boom-attacks
  • CircleCIによるCI環境の構築
  • Chisel3の構文に書き換えを実施。

これはなかなかに面白そうだ。早速、使ってみよう。

github.com

ちなみに、今回はリビジョン 1e5bc7c を使って動作確認を行った。

ドキュメントは以下にすべて用意されている。といってもこれは内部パイプラインのドキュメントだ。これは便利。

docs.boom-core.org

ビルドの方法はこれまでの通り。資料を見ながら進める。

git clone https://github.com/riscv-boom/boom-template.git
cd boom-template
./scripts/init-submodules.sh

export RISCV=${HOME}/riscv_boomv22
export PATH=$RISCV/bin:$PATH

./scripts/build-tools.sh

これで、環境が整ったのでVerilatorでビルドし、シミュレーションを実行してみる。

cd verisim
make

早速Dhrystoneを実行したのだが、途中で失敗してしまった。

make output/dhrystone.riscv.out
  • output/dhrystone.riscv.out
using random seed 1548641781
This emulator compiled with JTAG Remote Bitbang client. To enable, use +jtag_rbb_enable=1.
Listening on port 61599
  first_pc: 0x0080001140 last_npc: 0x0080001142  Assertion failed: [fetchmonitor] A non-cfi instruction is followed by the wrong instruction.
    at fetchmonitor.scala:146 assert (first_pc === last_npc,

そこで、COMMITログをONにして様子を見てみることにした。

diff --git a/src/main/scala/common/consts.scala b/src/main/scala/common/consts.scala
index 3abc41d..78c7ca8 100755
--- a/src/main/scala/common/consts.scala
+++ b/src/main/scala/common/consts.scala
@@ -23,7 +23,7 @@ import freechips.rocketchip.util.Str
 trait BOOMDebugConstants
 {
    val DEBUG_PRINTF        = false // use the Chisel printf functionality
-   val COMMIT_LOG_PRINTF   = false // dump commit state, for comparision against ISA sim
+   val COMMIT_LOG_PRINTF   = true  // dump commit state, for comparision against ISA sim
    val O3PIPEVIEW_PRINTF   = false // dump trace for O3PipeView from gem5
    val O3_CYCLE_TIME       = (1000)// "cycle" time expected by o3pipeview.py

Dhrystoneの実行結果のログを確認すると、以下の命令を実行して停止している。

3 0x0000000080001b32 (0x84818d13) x26 0x00000000800028f0
3 0x0000000080001b36 (0x00001997) x19 0x0000000080002b36
3 0x0000000080001b3a (0xda298993) x19 0x00000000800028d8
3 0x0000000080001b3e (0x490a1497) x 9 0x00000000c90a2b3e
  first_pc: 0x0080001b40 last_npc: 0x0080001b42  Assertion failed: [fetchmonitor] A non-cfi instruction is followed by the wrong instruction.
    at fetchmonitor.scala:146 assert (first_pc === last_npc,

うーん、0x1b3eの次は0x1b42で、その周辺も命令も問題なさそうだが、、、

riscv64-unknown-elf-objdump -D dhrystone.riscv | less
...
    80001b32:   84818d13                addi    s10,gp,-1976 # 800028f0 <Ptr_Glob>
    80001b36:   00001997                auipc   s3,0x1
    80001b3a:   da298993                addi    s3,s3,-606 # 800028d8 <Ch_2_Glob>
    80001b3e:   00001497                auipc   s1,0x1
    80001b42:   baa48493                addi    s1,s1,-1110 # 800026e8 <main+0xcfc>
    80001b46:   f3043903                ld      s2,-208(s0)
    80001b4a:   00000517                auipc   a0,0x0
    80001b4e:   67e50513                addi    a0,a0,1662 # 800021c8 <main+0x7dc>
    80001b52:   85ca                    mv      a1,s2
    80001b54:   e24ff0ef                jal     ra,80001178 <debug_printf>
    80001b58:   4505                    li      a0,1

GitHubのページにはrv64ui-p-addの結果のみ書いてあるのだが、まだ調整が必要なのかな。