【SystemVerilog】UVMで検証環境を作成する~Envを追加する~【#2】

Systemverilog

前回のおさらい

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階層を追加しました。

コメント

タイトルとURLをコピーしました