前回から一生懸命RoCCインタフェースに接続したアクセラレータのデバッグをしているのだが、どうも上手く行かない。 RoCCインタフェースからコマンドを受け取って、L1キャッシュに対してアクセスをしてデータを取り出し、そのデータに対して加工を行いたいのだが、途中でステートマシンがハングしてしまう。 これをデバッグするために、シミュレーション実行時にvcdを出力して、wlfで変換しQuestaSimで見てみることにした。
RocketCoreでシミュレーション実行結果でVCDを取得する方法
デバッグ用のシミュレーションバイナリを生成して、vcdを出力する。
cd emulator make debug CONFIG=RoccExampleConfig ./emulator-rocketchip-RoccExampleConfig-debug +verbose -vrocc.vcd ~/riscv64/riscv64-unknown-elf/riscv64-unknown-elf/bin/pk ../../rocket-rocc-examples/build/test-accumulator 2> rocc_debug.log
さらに、vcdをwlfに変換して、QuestaSimで波形デバッグする。
vcd2wlf rocc.vcd rocc.wlf
vsim -gui rocc.wlf
昨日もちょっと愚痴ったが、この一連の流れを実施するのに、おおよそイタレーションとしては2時間程度かかってしまう。Chiselの状態でシミュレーションさせてくれ。。。 何のためのVerilogラッパーだよ。。。
RoCCインタフェースの解析
L1 Dキャッシュに対して複数メモリアクセスを実施しなければならないのだが、途中でステートマシンが止まっているのはL1 Dキャッシュへアクセスするインタフェースの、Ready信号がずっと落ちてしまっておりステートマシンが動作しない。
このあたり、資料が無くて本当にやりづらい。。。
2017/09/02追記。Request Validを、Request Readyが上がるまで待つっていうステートマシンに変えたら本当にRequest Readyが上がらなくて泣きそうである。