UVMの環境構築第9回では、エンバイロンメントの定義(作成)方法について解説していきます。
なお、ソースコードはGitHubに公開しています。
目次
UVMの環境構築!シリーズの目次は、第1回 解説編の一番下をご覧ください。
エンバイロンメントはuvm_envまたはそのサブクラスを継承して定義します。
エンバイロンメントは、あるDUTをターゲットとした検証コンポーネントを束ねてひとまとめにするコンポーネントです。一般的に、エージェント、スコアボード、他のエンバイロンメントを含みます。
今回は、エージェントとスコアボードをインスタンスします。
エンバイロンメントでは、エージェント、スコアボード、他のエンバイロンメントのインスタンスを作成し、接続します。
今回は行いませんが、インスタンスの生成を制御するコンフィグレーションパラメータを持たせることもあります。下記に例を示します。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.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 |
今回は、エンバイロンメントの定義方法について解説しました。シリーズを通してご覧いただけると、UVM検証環境が構築できるようになりますので、ぜひ他のコンポーネントの解説もご覧ください。
シリーズ目次はこちら