Icarus VerilogとSCVの連携(VPI)

機能検証

Verilog RTLのデザインをSCV(SystemC Verification Library)で検証する環境のサンプルです。

Kenji-Ishimaru/scv_iv_sample
Co-simulation of SCV and Icarus Verilog. Contribute to Kenji-Ishimaru/scv_iv_sample development by creating an account on GitHub.

サンプルの動作環境

このサンプルは次の環境で動作を確認しました。

サンプルの概要

サンプルの基本的な構成は、Icarus VerilogとSystemCの連携(VPI)と同じです。Verilogでインスタンス化したmod_aという簡単なRTLに対して、SVCでランダムデータの入力を行い、SystemCでRTLの出力とリファレンスデータの一致確認を行っています。

サンプルの概要

DUTのmod_a.vは、8ビットの2入力を内部で加算して出力する単純な回路です。

ランダムデータ用の構造体

RTLのDUTは、i_valid, i_in_a, i_in_bという3つの入力があります。この入力データをランダムに生成するために、data_tという構造体を定義します。

data_tに対応するscv_extensions<data_t> classを作成します。

コンパイルスクリプト

SystemC関連のソースファイルは、g++で事前にコンパイルしておき、iverilog-vpiでVPI用のCファイルとリンクさせます。-lscvオプションが必要です。

ランダムデータの生成

mod_a::stimulus()内でランダムデータを生成しています。制約条件のあるランダムデータを生成する場合は、 scv_constraint_baseを派生させた制約条件のクラスを作成する必要があります。

SCV_CONSTRAINT

SCV_CONSTRAINTを使うと、「ランダムかつi_in_aとi_in_bを同じ値にする」といった制約条件を指定することができます。

keep_only

keep_onlyを使うと、ランダムデータの生成範囲を指定できます。

mod_a::stimulus()

ランダムデータを生成するには、scv_smart_ptr()もしくは制約条件を指定したclassをインスタンス化します。ランダムデータは、next()メソッドをコールすると生成されます。次の例は、scv_smart_ptr, my_constraint1, my_constraint2, my_constraint3という順で、それぞれ5回のランダムデータ生成を行っています。 RTLへのデータの書き込みは、ランダムデータ生成後に行っています。

 

実行結果

シミュレーションを実行すると、次のようなログが表示されます。SCVで生成されたランダムデータでDUTが動作しているのが分かります。

シミュレーション結果の波形

 

タイトルとURLをコピーしました