自作RISC-V CPUのデバッグ手法

8.7K Views

June 02, 24

スライド概要

2024/06/02に開催された「第3回自作CPUを語る会」のLTで発表したスライドです

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

自作 RISC-V CPUの デバッグ手法 kanataso@kanapipopipo 第3回 自作CPUを語る会 2024/06/02

2.

自作RISC-V CPU、どうやってデバッグしてます か

3.

大前提 assertを書く テストを書く

4.

基本 : riscv-tests RISC-VのCPU向けのテストセット 命令1つ1つに対してのテストが揃っている ・物理アドレス(p), 仮想アドレス(v)向けのテストがある

5.

iverilog, verilator OSSのVerilogのシミュレータ verilatorは高速、でも制限あり どちらも変なバグがある(気がする)

6.

GitHub Actionsでコミットごとにテストを実行

7.

riscv-tests .tohostに結果が書き込まれる ・1なら成功 ・gpレジスタにも書き込まれている ↓ メモリステージで.tohostに書き込まれ るのを確認したら、書き込み内容を 見て$finish

8.

riscv-tests ページング込みのテスト(-v-)が終わらない ・.tohostが仮想アドレスになっている ページングユニットを越した先で判定するべきだった

9.

riscv-testsが落ちたらどうする? vcdを見る? → GTKWave 波形を見てもいいが、ちょっと面倒 →簡単なログを$displayで出力すると楽

10.

$displayの問題点 always @(posedge clk) begin $display(“〜”); end が複数あると、displayされる順番がクロック毎に入れ替わったりする & $displayが増えると、目的のログを探すのが大変! ・波形を見るのとそこまで変わらない気がしてくる

11.

解決法 : $displayの形式を正規化して出力、処理 正規化したログを出力, 保存 → pythonで処理 → 見やすいログ!

12.

見やすいログができた

13.

Konataで見れるようにもできる 命令フェッチで命令にidを振っておくとKanata log formatに変換できる。

14.

riscv-testsが落ちたら.... まず、Konataでどこでおかしくなったか確認 次に、おかしい部分をテキストログで確認 それでも分からなければ、vcdを確認 vcdだけよりもよくなった?

15.

まだつらい 数十万~数千万命令実行後に何かがおかしくなっているかもしれない場合、 ・ログを出力するだけで遅くなる ・ログの容量がとても大きくなる ・そもそもpcの遷移が正しいのかを確認するのがつらい ・どこかでストールしてしまうが、いつストールし始めたか分からん →デバッグ速度が非常に遅くなる

16.

ログを出力するだけで遅くなる n命令目, nクロック後からログを出力するオプションを作成すればOK ・ログを表示するかどうかの変数をpackageに用意する $dumpon, $dumpoff

17.

pcの遷移が正しいのかを確認する spikeと比べればOK spike : riscv-software-src/riscv-isa-sim RISC-V公式のシミュレータ 実行したPCを出力する機能がある(トレース) →これと比べられるログを生成して、比べる

18.

不審なストールを検知する nクロックの間、ずっと同じ命令を処理し続けているときに、 finishしてデバッグ用の情報を表示するオプションを作成 WFI (Wait For Interrupt)に注意 長いストールを表示するとKonataが重くなる

19.

riscv-testsが落ちた, 変な挙動になったら.... おかしくなった場所がわからない場合、 ・spikeと比較 ・ストール検知 でおかしくなる場所を探る。

20.

riscv-testsが落ちた, 変な挙動になったら.... おかしくなった場所がわかったので、 まず、Konataでどこでおかしくなったか確認 次に、おかしい部分をテキストログで確認 それでも分からなければ、vcdを確認

21.

まだつらい! 割り込み系のバグ ・ISSと割り込みのタイミングが変わるので、比較ができなくなる メモリのバグ ・たいへん ・メモリ操作を監視すると良いが、キャッシュにバグがあったらどうする

22.

ChiselでSVをテスト BlackBoxを使う ただし、ポートにinterfaceとかstructが使えない