FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-Vコアの検証インタフェースRVVIについて調べる (3. トレースインタフェースRVVI-API)

RISC-Vコアの検証環境RVVIについて調査している。 RVVI-APIは、取得したトレースデータを検証用DVに渡すためのインタフェースだ。

github.com


RVVI-APIは、C/C++のヘッダファイルもしくはSystemVerilogのパッケージとして定義されている。

  • C/C++/include/host/rvvi/rvvi-api.h
  • SystemVerilog:/source/host/rvvi/rvvi-api-pkg.sv`

Doxygenにより生成されたドキュメントは以下。

  • www.riscv-verification.org/docs/rvvi/doxygen

RVVI-APIインタフェースを動かすためには、大きく分けて2種類の方法がある。

  • DPI呼び出しを使用してテストベンチから直接呼び出す
  • rvviTraceインタフェースをモニタリングしているSystemVerilogモジュールから間接的に呼び出し、適切なAPIの呼び出しを行う。
    • ImperasDVの一部として、trace2apirvviTraceに定義されている。

APIを動作させるためには、3つの大きなフェーズに分かれている。

  • 初期化
  • メインループ
    • RTLの内部状態とネットの伝搬
    • 命令リタイアもしくはトラップの通知
    • RTL状態と参照モデルの比較
  • シャットダウン

初期化

  • 構成の設定は rvviRefConfigSetStringrvviRefConfigSetInt によって行われる。
    • 指定できる構成はRVVI標準ではなく、RVVIの実装で定義されている。
  • テストハーネスはrvviRefInitを呼び出すことによってRVVIの実装を初期化し、テストするELFファイルを指定しリファレンスモデルにロードする。
  • DUTを初期化する。必要に応じてRVVI-APIの機能を使用して自由に呼び出しを行うことができる
  • CSRレジスタは必要に応じてvolatileとしてマークできる
    • マイクロアーキテクチャによって定義される任意のCSRレジスタはvolatileとしてマークすることができ、リファレンスモデルによって動作が予測できない場合にはrvviRefCsrSetVolitileを設定する。
    • CSRレジスタの特定のビットのみがvolatileである場合には、rvviRefCsrSetVolatileMask関数によって、特定のビットをvolatileとしてマークすることができる。
  • CSRレジスタは比較対象から除外することができる:
    • rvviRefCsrCompareEnable によって、特定のCSRレジスタの比較を無効化することができる
    • 特定のCSRレジスタの特定のビットはrvviRefCsrCompareMaskによって無効化することができる
    • この機能は、CSRレジスタに問題があるか、正しくないことが分かっている場合に必要になる場合がある
  • 初期化フェーズにおいて、volatileなメモリ領域もマークすることができる。volatileなデータはDUTから抽出され、リファレンスモデル側に通知されアップデートされる。この機能は、メモリマップドI/Oと、メモリマップドデバイスなどに適用することができる。

メインループ

  • DUTモデルは任意のサイクル数で進んでいく
  • これらのサイクルの間、トレーサインターフェイスは、プロセッサHART上で発生した命令リタイアやトラップを報告する
  • プロセッサの信号の変更(割り込みピンなど)もRVVI-APIに伝達される。
  • 命令リタイアイベントでは、テストベンチはRVVI-APIを使用してハードウェアの状態と、リファレンスモデルを比較する
    • 不一致が発生すると、ユーザに報告される
  • 非常に多くの不一致が発生すると、その状態を検出してテストベンチは終了することができる

テストハーネスは、どの時点でもリファレンスモデルの状態を自由に検査することができる。 特定のRVVI-API関数(rvviRefPcGet, rvviRefGprGet, など) を用いて、必要に応じてカスタム比較ルーチンを構築できる。

シャットダウンフェーズ

非常にシンプルで、両方のモデルにリリースを行う。

  • ハーネスはDUTにシャットダウンコマンドを発行する
  • ハーネスはrvviRefShutdownを使用してリファレンスモデルにシャットダウンコマンドを発行する

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com