RISC-Vコアの検証環境RVVIについて調査している。 RVVI-APIは、取得したトレースデータを検証用DVに渡すためのインタフェースだ。
RVVI-APIは、C/C++のヘッダファイルもしくはSystemVerilogのパッケージとして定義されている。
Doxygenにより生成されたドキュメントは以下。
- www.riscv-verification.org/docs/rvvi/doxygen
RVVI-APIインタフェースを動かすためには、大きく分けて2種類の方法がある。
- DPI呼び出しを使用してテストベンチから直接呼び出す
rvviTrace
インタフェースをモニタリングしているSystemVerilogモジュールから間接的に呼び出し、適切なAPIの呼び出しを行う。- ImperasDVの一部として、
trace2api
がrvviTrace
に定義されている。
- ImperasDVの一部として、
APIを動作させるためには、3つの大きなフェーズに分かれている。
- 初期化
- メインループ
- RTLの内部状態とネットの伝搬
- 命令リタイアもしくはトラップの通知
- RTL状態と参照モデルの比較
- シャットダウン
初期化
- 構成の設定は
rvviRefConfigSetString
とrvviRefConfigSetInt
によって行われる。- 指定できる構成はRVVI標準ではなく、RVVIの実装で定義されている。
- テストハーネスは
rvviRefInit
を呼び出すことによってRVVIの実装を初期化し、テストするELFファイルを指定しリファレンスモデルにロードする。 - DUTを初期化する。必要に応じてRVVI-APIの機能を使用して自由に呼び出しを行うことができる
- CSRレジスタは必要に応じてvolatileとしてマークできる
- CSRレジスタは比較対象から除外することができる:
- 初期化フェーズにおいて、volatileなメモリ領域もマークすることができる。volatileなデータはDUTから抽出され、リファレンスモデル側に通知されアップデートされる。この機能は、メモリマップドI/Oと、メモリマップドデバイスなどに適用することができる。
メインループ
- DUTモデルは任意のサイクル数で進んでいく
- これらのサイクルの間、トレーサインターフェイスは、プロセッサHART上で発生した命令リタイアやトラップを報告する
- プロセッサの信号の変更(割り込みピンなど)もRVVI-APIに伝達される。
- 命令リタイアイベントでは、テストベンチはRVVI-APIを使用してハードウェアの状態と、リファレンスモデルを比較する
- 不一致が発生すると、ユーザに報告される
- 非常に多くの不一致が発生すると、その状態を検出してテストベンチは終了することができる
テストハーネスは、どの時点でもリファレンスモデルの状態を自由に検査することができる。
特定のRVVI-API関数(rvviRefPcGet
, rvviRefGprGet
, など) を用いて、必要に応じてカスタム比較ルーチンを構築できる。
シャットダウンフェーズ
非常にシンプルで、両方のモデルにリリースを行う。
- ハーネスはDUTにシャットダウンコマンドを発行する
- ハーネスは
rvviRefShutdown
を使用してリファレンスモデルにシャットダウンコマンドを発行する