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

Systemverilog

前回のおさらい

テストベンチに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
sample_test.svh
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_info(this.get_name(), "Hello World", UVM_NONE)
    endtask
endclass

今回はEnv階層の下にAgent階層を作成します。

Agent階層を作成する

uvm_agentを継承してsample_agentを作成します。

sample_agent.svh
class sample_agent extends uvm_agent;
    `uvm_component_utils(sample_agent)

    function new(string name, uvm_component parent=null);
        super.new(name, parent);
    endfunction

    task run_phase(uvm_phase phase);
        `uvm_info(this.get_name(), "Agent", UVM_NONE)
    endtask
endclass

Agent階層を作成したので、Env階層にぶら下げます。

sample_env.shv(Agent階層をインスタンスする)
class sample_env extends uvm_env;
    `uvm_component_utils(sample_env)

    sample_agent agent; // 追加

    function new(string name, uvm_component parent);
        super.new(name, parent);
    endfunction

    function void build_phase(uvm_phase phase); // 追加
        super.build_phase(phase);
        agent = sample_agent::type_id::create("agent", this);
    endfunction

    task run_phase(uvm_phase phase);
        `uvm_info(this.get_name(), "Env", UVM_NONE);
    endtask
endclass

sample_test.svhは変更なしです。

sample_test.svh(変更なし)
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_info(this.get_name(), "Hello World", UVM_NONE)
    endtask
endclass
top.sv(sample_agent.svh組み込み版)
module top;
    `include "uvm_macros.svh"
    import uvm_pkg::*;

    `include "sample_agent.svh" // 追加。
    `include "sample_env.svh"
    `include "sample_test.svh"

    initial begin
        run_test("sample_test");
    end
endmodule
実行結果
[UVM_INFO][uvm_test_top] Hello World
[UVM_INFO][env] Env
[UVM_INFO][agent] Agent

解説

前回と同じなので割愛します。

まとめ

Agent階層を追加しました。

コメント

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