Vengineerの妄想

人生を妄想しています。

Layered Stimulusの例題、その2

Verification Engineerの戯言

Layered Stimulusの例題、その1で紹介した「Layered Stimulus」のうち、
上の3つ(basic_scenario_xxxx)はscenarioの基本的な使い方になります。

まずは、基本中の基本であるexamples/layered_stimulus/basic_scenarioを見ていきましょう!
使用するファイルは、下記の5つです。
    scenario.svh & scenario_pkg.sv
    driver_pkg.sv
    transaction_pkg.sv
    top.sv
scenario.svh & scenario_pkg.svは、シナリオを定義しています。
driver_pkg.svは、ovm_scenario_driverクラスを継承したmy_driverクラスの定義ファイルです。
transaction_pkg.svは、シナリオ、シナリオコントローラおよびドライバに渡されるパラメータの型(トランザクションの型)の定義ファイルです。
最後のtop.svは、envクラス(ovm_envクラスを継承する)およびトップテストベンチを定義しています。

top.svenvクラスは、次のようになっています。
    package user_pkg;

    import ovm_pkg::*;

    `include "ovm_templates.svh"
    `include "transaction_pkg.sv"
    `include "driver_pkg.sv"
    `include "scenario.svh"

    `define NUM_SEQS 10

    class env extends ovm_env;
      int i;
      ovm_scenario_controller #(bus_req, bus_rsp) sqr;

      scenarioA #(bus_req, bus_rsp) scenario_a[`NUM_SEQS];
      my_driver #(bus_req, bus_rsp) drv ;

      function new(string name, ovm_component parent);
        string str;

        super.new(name, parent);
        sqr = new("scenario_controller", this);

        for (i = 0; i < `NUM_SEQS; i++) begin
          scenario_a[i] = new("scenario");
        end
    
        // create and connect driver
        drv = new("slave", this);
        drv.set_scenario_controller(sqr);
      endfunction

    task run();
        int i;

        for (i = 0; i < `NUM_SEQS; i++) begin
          fork
            scenario_a[i].start(sqr, null);
          join_none
          #0;
        end
        wait fork;
        report_summarize();
        global_stop_request();
    endtask

    endclass
    endpackage
envクラスは、user_pkgパッケージ内で定義されています。このことは、トップテストベンチの記述部分で説明します。
envクラスは、シナリオ(scenarioAクラス)、シナリオコントローラ(ovm_scenario_controller)、ドライバ(my_driver)をインスタンスに持っています。
シナリオとドライバは新しいクラスを定義していますが、シナリオコントローラはovm_scenario_controllerクラスをそのまま使っています。
「Layered Stimulus」では、シナリオコントローラは基本的に新しくクラスを定義する必要はなく、ovm_scenario_controllerクラスを使えばよいようです。

new関数インスタンスを生成し、シナリオコントローラとドライバを接続します(drv.set_scenario_controller(sqr)の部分で!)。

runタスクで10個のシナリオを開始し(scenario_a[i].start(sqr, null))し、すべてのシナリオが終了するまで待ちます(wait fork)。
サマリーレポート後、シミュレーションを中止します(global_stop_request)。

シナリオの開始は、ovm_scenario_base::startタスクで説明しましたね!。
wait forkは、IEEE 1800-2005の11.8.1 Wait forkを確認してください。
シミュレーションの中止は、OVM : global_stop_requestタスクで説明しましたね!

top.svのトップテストベンチ(topモジュール)は、次のようになっています。
    module top;
      import user_pkg::*;
      env e;

      initial begin
        $display("In top initial block");
        e = new("env", null);
        e.run_test();
      end
    endmodule

import user_pkg::*;で、envクラスで出てきたuser_pkgパッケージがでてきます。このimportenvクラスの定義を取り込めます。

トップテストベンチでは、envクラスだけの構成になっています。
initial文で、envクラスを生成し(e = new("env", null);)、シミュレーションを開始します(e.run_test())。
e.run_test()については、別途説明したいと思います。

次回、Layered Stimulusの例題、その3では、シナリオ(scenarioAクラス)とドライバ(my_driverクラス)をみていきます。

検証、Verification、SystemVerilog、OVM、Open Verification Methodology