Vengineerの妄想

人生を妄想しています。

Xilinx Vitis の中を調べる(その12)

はじめに

Xilinx Vitis の中を調べるのその12。

その他のUVM 関連コード

今まで見てきたUVM関連コード以外で、UVM に関するコードは、verilog/multi_apuint_subsystem ディレクトリにあります。このディレクトリには、下記のようなファイルがあります。基本的には、UVMで必要なクラスを定義していることになります。

  • multi_apuint_config.sv
  • multi_apuint_env.sv
  • multi_apuint_pkg_sequence_lib.sv
  • multi_apuint_reference_model.sv
  • multi_apuint_scoreboard.sv
  • multi_apuint_subsystem_monitor.sv
  • multi_apuint_subsystem_pkg.sv
  • multi_apuint_virtual_sequencer.sv

  • multi_apuint_config.sv は、入力・出力に接続するクラスのコンフィギュレーションを行っています。

  • multi_apuint_env.sv は、前にも説明しましたが、全体の環境設定のクラスです。
  • multi_apuint_pkg_sequence_lib.sv は、マクロ定義のファイルです。
  • multi_apuint_scoreboard.sv は、Scoreboard で、出力信号のモニターして、何かを行っています。
  • multi_apuint_reference_model.sv は、リファレンスモデルで、入力・出力信号のDelay[0 .. 2]のカバレッジを取っています。
    • multi_apuint_subsystem_monitor.sv は、入力・出力のモニターです。
  • multi_apuint_subsystem_pkg.sv は、マクロ定義のファイルです。
  • multi_apuint_virtual_sequencer.sv は、Virtual Sequencer です。

結局、UVMで何をやっていたのか?

テストベンチに UVM を使うことで、C/C++ から生成された Verilog HDL への入出力に対して、タイミングをふってテストします。

Cでのテストベンチの入力信号に対する出力信号をファイルに出力し、そのファイルをRTLシミュレーションで使います。

この例題のCのテストベンチを再度見てみましょう。

for 文にて、入力信号 multi_in0 が 0 から、multi_in1 が 1 からで、multi_in0 が 9 、multi_in1 が 10 までのテストをしています。しかしながら、multi_in0 と multi_in1 は 8ビットの正の整数なので、0 から 255 までのテストを行わなければいけます。また、multi_in0 と multi_in1 の組み合わせを考えると、multi_in0 の 256 と multi_in1 の 256 の掛け算 256 x 256 のテストが必要です。。。C Simulation ではそれなりの時間でシミュレーションできると思いますが、RTLシミュレーションではかなりの時間がかかると思います。。

void multi_apuint(ap_uint<8> multi_in0, ap_uint<8> multi_in1,
        ap_uint<16> *multi_out);

int main(){
    using namespace std;

    ap_uint<8> multi_in0;
    ap_uint<8> multi_in1;
    ap_uint<16> multi_out;

    for (multi_in0=0, multi_in1=1; multi_in0<10; multi_in0++, multi_in1++){
        multi_apuint(multi_in0, multi_in1, &multi_out);
        cout << "multi_out = " << multi_out << endl;
        if (multi_out != (multi_in0 * multi_in1))
            return(1);
    }

    return(0);
}

おわりに

Random Stall を ON にすることで、UVMを使ったシミュレーション環境を生成してくれますが、Cでのテストベンチにてちゃんとしたテストをしていないと、ダメなんです。。。よ。

ということで、Random Stall を ON にする前に、C Simulation にてカバレッジを取りましょう!

そして、カバレッジが大丈夫!となったら、Random Stall を ON にしましょう。。。といっても、各信号のDelayが 0, 1, 2 だけでいいのだろうか?とは思います。

それから、UVMについて知りたいのなら、まずは、UVMを使った簡単な例題について学んでからの方がいいと思います。Vitis が生成する UVM ベースのコードを理解するには UVM のそれなりの知識が必要だと思います。