2日目で説明したモデルの構造と実行フェーズの一部を使って、モデルのひな形を作ってみます。説明内容としては、簡単な仕様のモデルの作り方と実行とかぶるのですが、ここでは「噛み砕いて」、1歩ずつ進 めていきたいと思います。
ベースは「01日目」のtb_top.svです。
`timescale 1ps/1psmodule tb_top; `include "uvm_macros.svh" import uvm_pkg::*; class sample_test extends uvm_test; `uvm_component_utils(sample_test) function new (string name="sample_test", uvm_component parent=null); super.new(name,parent); endfunction task run_phase(uvm_phase phase); uvm_report_info("TEST", "Hello World"); endtask endclass initial begin run_test(); endendmoduleclass記述が増えていくので、上記のclass記述を別ファイルにしてincludeします。
--- tb_top.sv
`timescale 1ps/1psmodule tb_top; // UVM class library `include "uvm_macros.svh" import uvm_pkg::*; // uvm user code `include "sample_test.sv" /// ←ここ ///////////////////////////////////// initial begin run_test(); endendmodule--- sample_test.sv
class sample_test extends uvm_test; `uvm_component_utils(sample_test) function new (string name="sample_test", uvm_component parent=null); super.new(name,parent); endfunction task run_phase(uvm_phase phase); uvm_report_info("TEST", "Hello World"); endtaskendclasstb_top.svとsample_test.svが「同じディレクトリ」にある状態を想定して、compileとrunします。
これで、Hello Worldが表示されることを確認しましょう。
追加する前に、サンプルモデルを置くディレクトリを作成しておきます。
ディレクトリを移動して、sample_env.svを記述します。
class sample_env extends uvm_env; `uvm_component_utils(sample_env) function new (string name, uvm_component parent); super.new(name,parent); endfunction task run_phase(uvm_phase phase); uvm_report_info("ENV", "Hello ENV"); endtaskendclassuvm_component_utilsマクロは半定型文みたいなものです。newも。ところで、uvm_testクラスのnewにはnameに初期値を入れていますが、uvm_envクラスのnewにはnameに初期値を入れていません。何故かと いうと、uvm_envクラスは「uvm_testクラスにインスタンスして、生成記述をするときに名前を指定する」のですが、uvm_testクラスはユーザー側でインスタンス、生成しないんですね。だから、というわけで す。
もう1つファイルを作っておきます。
--- sample_model.svh
`include "sample_env.sv"今後まだファイルを追加していくので、このようにモデル毎にincludeファイルを作るのが定番です。
uvm_envを組み込む
それでは次に、上記で記述したuvm_envクラスを組み込みましょう。uvm_testクラスにインスタンスして、「生成」します。
class sample_test extends uvm_test; `uvm_component_utils(sample_test) sample_env env; function new (string name="sample_test", uvm_component parent=null); super.new(name,parent); endfunction function void build_phase(uvm_phase phase); super.build_phase(phase); env = sample_env::type_id::create("env", this); //注意 endfunction task run_phase(uvm_phase phase); uvm_report_info("TEST", "Hello World"); endtaskendclass黄色いところが「追加」した記述です。
現在、tb_top.svは以下のようになっています。
`timescale 1ps/1psmodule tb_top; // UVM class library `include "uvm_macros.svh" import uvm_pkg::*; // uvm user code `include "sample_model.svh" `include "sample_test.sv" ///////////////////////////////////// initial begin run_test(); endendmoduleそれでは、コンパイルして実行してみましょう。include記述が3つありますので、vlogに指定する +incdir+パス+パス... に注意してください。
実行すると、以下のように表示されるはずです。
# UVM_INFO @ 0: reporter [RNTST] Running test sample_test...# UVM_INFO @ 0: uvm_test_top [TEST] Hello World# UVM_INFO @ 0: uvm_test_top.env [ENV] Hello ENV