For Good FPGA Design

UVMの環境構築!(9) Environment

UVMの環境構築第9回では、エンバイロンメントの定義(作成)方法について解説していきます。

なお、ソースコードはGitHubに公開しています。

目次

シリーズ目次

UVMの環境構築!シリーズの目次は、第1回 解説編の一番下をご覧ください。

エンバイロンメントの概要

エンバイロンメントはuvm_envまたはそのサブクラスを継承して定義します。

エンバイロンメントは、あるDUTをターゲットとした検証コンポーネントを束ねてひとまとめにするコンポーネントです。一般的に、エージェント、スコアボード、他のエンバイロンメントを含みます。

今回は、エージェントとスコアボードをインスタンスします。

図1 UVMにおけるエンバイロンメント

エンバイロンメントの定義方法

エンバイロンメントでは、エージェント、スコアボード、他のエンバイロンメントのインスタンスを作成し、接続します。

今回は行いませんが、インスタンスの生成を制御するコンフィグレーションパラメータを持たせることもあります。下記に例を示します。num_mastersがコンフィグレーションパラメータです。12行目で、uvm_config_db#(T)::get()により、値を取得しています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ahb_env extends uvm_env;
    int num_masters;
    ahb_master_agent masters[];
    `uvm_component_utils_begin(ahb_env)
        `uvm_field_int(num_masters, UVM_ALL_ON)
    `uvm_component_utils_end
...
...
    function void build_phase(uvm_phase phase);
        string inst_name;
        super.build_phase(phase);
        uvm_config_db#(int)::get(this, "", "num_masters", num_masters);
        masters = new[num_masters];
        for(int i = 0; i < num_masters; i++) begin
            $sformat(inst_name, "masters[%0d]", i);
            masters[i] = ahb_master_agent::type_id::create(inst_name,this);
        end
    endfunction
...
...
end

my_env

それでは、ソースコードを見ながら、モニターの定義方法について解説します。

my_env.sv

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class my_env extends uvm_env;
 
    my_agent agent0;
    my_scoreboard scoreboard0;
 
    `uvm_component_utils(my_env)
 
    /* Constructor */
    function new(string name, uvm_component parent);
        super.new(name, parent);
    endfunction
 
    /* Build phase */
    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
 
        agent0 = my_agent::type_id::create("agent0", this);
        scoreboard0 = my_scoreboard::type_id::create("scoreboard0", this);
    endfunction
 
    /* Connect phase */
    function void connect_phase(uvm_phase phase);
        super.connect_phase(phase);
 
        agent0.monitor.item_collected_port.connect(scoreboard0.item_collected_export);
    endfunction
 
endclass
  • 1行目:uvm_envを継承して、my_envを定義します。
  • 3~4行目:エージェントとスコアボードを定義します。
  • 6行目:UVMマクロを書きます。
  • 8~11行目:コンストラクタを定義します。
  • 13~19行目:Build phaseを定義します。この中で、エージェントとスコアボードのインスタンスを作成します。前述の例のように、コンフィグレーションパラメータによって、インスタンスの作成を制御する場合もあります。
  • 21~26行目:Connect phaseを定義します。エージェント内のモニターのitem_collected_portと、スコアボードのitem_collected_exportを接続します。

まとめ

今回は、エンバイロンメントの定義方法について解説しました。シリーズを通してご覧いただけると、UVM検証環境が構築できるようになりますので、ぜひ他のコンポーネントの解説もご覧ください。

シリーズ目次はこちら

アバター画像
この記事を書いた人
ジーノ。大手電機メーカーで、基板設計の全般と、FPGAの設計に従事した経験を活かし、FPGAについて情報発信中。
RTL設計、シミュレーション、タイミング・クロージャ、FPGAまわりのハードウェア開発まで、幅広く取り扱っております。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA