Verification Engineerの戯言
まずは、基本中の基本であるexamples/layered_stimulus/basic_scenarioを見ていきましょう!
使用するファイルは、下記の5つです。
driver_pkg.svは、ovm_scenario_driverクラスを継承したmy_driverクラスの定義ファイルです。
transaction_pkg.svは、シナリオ、シナリオコントローラおよびドライバに渡されるパラメータの型(トランザクションの型)の定義ファイルです。
最後のtop.svは、envクラス(ovm_envクラスを継承する)およびトップテストベンチを定義しています。
使用するファイルは、下記の5つです。
scenario.svh & scenario_pkg.sv driver_pkg.sv transaction_pkg.sv top.svscenario.svh & scenario_pkg.svは、シナリオを定義しています。
driver_pkg.svは、ovm_scenario_driverクラスを継承したmy_driverクラスの定義ファイルです。
transaction_pkg.svは、シナリオ、シナリオコントローラおよびドライバに渡されるパラメータの型(トランザクションの型)の定義ファイルです。
最後のtop.svは、envクラス(ovm_envクラスを継承する)およびトップテストベンチを定義しています。
top.svのenvクラスは、次のようになっています。
envクラスは、シナリオ(scenarioAクラス)、シナリオコントローラ(ovm_scenario_controller)、ドライバ(my_driver)をインスタンスに持っています。
シナリオとドライバは新しいクラスを定義していますが、シナリオコントローラはovm_scenario_controllerクラスをそのまま使っています。
「Layered Stimulus」では、シナリオコントローラは基本的に新しくクラスを定義する必要はなく、ovm_scenario_controllerクラスを使えばよいようです。
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 endpackageenvクラスは、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)。
サマリーレポート後、シミュレーションを中止します(global_stop_request)。
シナリオの開始は、ovm_scenario_base::startタスクで説明しましたね!。
wait forkは、IEEE 1800-2005の11.8.1 Wait forkを確認してください。
シミュレーションの中止は、OVM : global_stop_requestタスクで説明しましたね!
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パッケージがでてきます。このimportでenvクラスの定義を取り込めます。
トップテストベンチでは、envクラスだけの構成になっています。
initial文で、envクラスを生成し(e = new("env", null);)、シミュレーションを開始します(e.run_test())。
e.run_test()については、別途説明したいと思います。
initial文で、envクラスを生成し(e = new("env", null);)、シミュレーションを開始します(e.run_test())。
e.run_test()については、別途説明したいと思います。
次回、Layered Stimulusの例題、その3では、シナリオ(scenarioAクラス)とドライバ(my_driverクラス)をみていきます。
検証、Verification、SystemVerilog、OVM、Open Verification Methodology