自作RISC-Vコアを各種SoC環境で使いたい。 ただし自分のコアの動作にまだ自信がないので検証インタフェースを持って、どんなSoC環境でも一応形として一致検証ができるようにしたい。 インタフェースを統一していた方がいい気がするので、RISC-V Verification Interface (RVVI) について調査することにした。
どうも見ている限り、これはRISC-V公式の仕様では無いっぽい?ので注意。ただこういう仕様をオープンにしているのはRVVIだけっぽいので、これに則るためにはどうしたらいいのか考えよう。
まずは以下の図を見てみる。
- 一番左がVerilogで記述されたDUTの部分。これが検証対象
- 真ん中がDUTと検証用のIPを接続するためのインタフェース。これはC++でもVerilogでも良い
- 一番右が検証用IP。今回はImperasDVとなっている。本当はSpikeとかを接続できるようになりたい
どうやら、検証インタフェースとしては3つが定義されている。
- コアのRTLトレースインタフェース:RVVI-TRACE
これはDUTに接続されることが想定されていると思われる。左側のVerilog DUTと真ん中のインタフェースを接続しているのがこれに当たる。 コアから適切な情報を取り出してトレース情報を作成する。 これをRVVIのインタフェースを通じてDV用のIPに伝達されることになる。
- リファレンスモデル DVサブシステムインタフェース:RVVI-API
RVVI-TRACEから伝達された情報をさらに加工して、ImperasDVなどの検証用IPに接続するというもの。 真ん中の接続インタフェースと、検証用IP(右側のDV)を接続する。
- テストベンチ向けの仮想化粧周辺機器:RVVI-VVP
DUTに接続する外部インタフェースを定義する。上記の図において左側のDUTの下側に接続されているもの。 UARTなどの外部インタフェースを接続するためのもの。 タイマー、割り込み、デバッグ、ランダムイベント生成、print/log/UARTなどを接続することができるもの。