前回のおさらい
uvm_testを継承してsample_testのclassを作成しました。
top.sv
module top;
`include "uvm_macros.svh" // uvmのマクロを有効にする。「`」で始まるやつ。
import uvm_pkg::*; // uvmのパッケージを有効にする。「`」以外。
class sample_test extends uvm_test; // 一番上はuvm_testを継承したclassを使用する。
`uvm_component_utils(sample_test) // sample_testをuvmのデータベースに登録する。
// systemverilogのクラスの構文。uvm独自ではない。
function new(string name="sample_test", uvm_component parent=null);
super.new(name, parent);
endfunction
// uvm独自の構文。
task run_phase(uvm_phase phase);
`uvm_info(this.get_name(), "Hello World", UVM_NONE);
endtask
endclass
initial begin
run_test("sample_test"); // `uvm_component_utils(<クラス>)で登録した<クラス>を実行する。
end
endmodule
これからclassがどんどん増えるので、別ファイルで管理します。
top.sv(修正後)
module top;
`include "uvm_macros.svh" // uvmのマクロを有効にする。「`」で始まるやつ。
import uvm_pkg::*; // uvmのパッケージを有効にする。「`」以外。
`include "sample_test.svh"
initial begin
run_test("sample_test"); // `uvm_component_utils(<クラス>)で登録した<クラス>を実行する。
end
endmodule
sample_test.svh(新しく作成)
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_info(this.get_name(), "Hello World", UVM_NONE)
endtask
endclass
Env階層を作成する
uvm_envを継承してsample_envを作成します。
sample_env.svh
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_info(this.get_name(), "Env", UVM_NONE);
endtask
endclass
前回作成したテストベンチに組み込みます。
そのために、Env階層(sample_env.shv)をTest階層(sample_test.svh)にインスタンスします。
sample_test.svh(Env階層をインスタンスする)
class sample_test extends uvm_test;
`uvm_component_utils(sample_test)
sample_env env; // sample_env型の変数を宣言する。
function new(string name="sample_test", uvm_component parent=null);
super.new(name, parent);
endfunction
function void build_phase(uvm_phase phase); // 階層をつなぐuvm独自のfunction
super.build_phase(phase);
env = sample_env::type_id::create("env", this); // 階層をつなぐおまじない。
endfunction
task run_phase(uvm_phase phase);
`uvm_info(this.get_name(), "Hello World", UVM_NONE)
endtask
endclass
sample_test.svh, sample_env.svhをtop.svに組み込みます。
top.sv(sample_env.svh組み込み版)
module top;
`include "uvm_macros.svh"
import uvm_pkg::*;
`include "sample_env.svh"
`include "sample_test.svh"
initial begin
run_test("sample_test");
end
endmodule
これで、以下のファイルが作成されました。
- top.sv
- sample_test.svh
- sample_env.svh
実行してみます。
実行結果
[UVM_INFO][uvm_test_top] Hello World
[UVM_INFO][env] Evn
解説
今回は、sample_test.svhにbuild_phaseのfunctionを追加しました。
sample_env env; // sample_env型の変数を宣言する。
function void build_phase(uvm_phase phase); // 階層をつなぐuvm独自のfunction
super.build_phase(phase);
env = sample_env::type_id::create("env", this); // 階層をつなぐおまじない。
endfunction
build_phaseはUVMで作成したclassとclassを階層的につなげるfunctionです。
以下の記述を用います。
<変数> = <変数の型>::type_id::create(“<変数>”, this);
まとめ
Env階層を追加しました。
コメント