はじめに
Xilinx Vitis の中を調べるのその10。
sv_module_top の続き。今回は、 uvm_config_db の中で指定している uvm_test_top.top_env について、みていきます。
uvm_test_top.top_env は?
uvm_test_top.top_env は、svtb/multi_apuint_test_lib.sv の中で、下記のようになっています。multi_apuint_env クラスのインスタンスです。
`ifndef MULTI_APUINT_TEST_LIB__SV
`define MULTI_APUINT_TEST_LIB__SV
`include "uvm_macros.svh"
class multi_apuint_test_lib extends uvm_test;
multi_apuint_env top_env;
`uvm_component_utils(multi_apuint_test_lib)
function new (string name, uvm_component parent = null);
super.new(name, parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
top_env = multi_apuint_subsystem_pkg::multi_apuint_env::type_id::create("top_env", this);
uvm_config_db#(uvm_object_wrapper)::set(
this,
"top_env.multi_apuint_virtual_sqr.run_phase",
"default_sequence",
multi_apuint_subsys_test_sequence_lib::type_id::get()
);
`uvm_info(this.get_full_name(), "build_phase done", UVM_LOW)
endfunction
virtual function void end_of_elaboration_phase(uvm_phase phase);
uvm_root top = uvm_root::get();
top.print_topology();
endfunction
endclass
multi_apuint_env クラス
multi_apuint_env クラスは、multi_apuint_subsystem/multi_apuint_env.sv の中で定義されています。
class multi_apuint_env extends uvm_env; svr_latency_multi_in0 lat_multi_in0; svr_latency_multi_in1 lat_multi_in1; svr_latency_multi_out lat_multi_out; multi_apuint_virtual_sequencer multi_apuint_virtual_sqr; multi_apuint_config multi_apuint_cfg; svr_pkg::svr_env#(8) env_master_svr_multi_in0; svr_pkg::svr_env#(8) env_master_svr_multi_in1; svr_pkg::svr_env#(16) env_slave_svr_multi_out; multi_apuint_reference_model refm; multi_apuint_subsystem_monitor subsys_mon; `uvm_component_utils_begin(multi_apuint_env) `uvm_field_object (env_master_svr_multi_in0, UVM_DEFAULT | UVM_REFERENCE) `uvm_field_object (env_master_svr_multi_in1, UVM_DEFAULT | UVM_REFERENCE) `uvm_field_object (env_slave_svr_multi_out, UVM_DEFAULT | UVM_REFERENCE) `uvm_field_object (refm, UVM_DEFAULT | UVM_REFERENCE) `uvm_field_object (multi_apuint_virtual_sqr, UVM_DEFAULT | UVM_REFERENCE) `uvm_field_object (multi_apuint_cfg , UVM_DEFAULT) `uvm_component_utils_end function new (string name = "multi_apuint_env", uvm_component parent = null); super.new(name, parent); endfunction extern virtual function void build_phase(uvm_phase phase); extern virtual function void connect_phase(uvm_phase phase); extern virtual task run_phase(uvm_phase phase); endclass
svtb/sv_module_top.sv の uvm_config_db にて、uvm_test_top.top_env の中で下記のように設定しています。
- uvm_config_db #(virtual misc_interface)::set(null, "uvm_test_top.top_env.*", "misc_if", misc_if);
- uvm_config_db #( virtual svr_if#(8) )::set(null, "uvm_test_top.top_env.env_master_svr_multi_in0.*", "vif", svr_multi_in0_if);
- uvm_config_db #( virtual svr_if#(8) )::set(null, "uvm_test_top.top_env.env_master_svr_multi_in1.*", "vif", svr_multi_in1_if);
uvm_config_db #( virtual svr_if#(16) )::set(null, "uvm_test_top.top_env.env_slave_svr_multi_out.*", "vif", svr_multi_out_if);
env_master_svr_multi_in0.
- env_master_svr_multi_in1
- env_slave_svr_multi_out.
は、multi_apuint_subsystem/multi_apuint_env.sv の下記の部分に対応しています。
`uvm_field_object (env_master_svr_multi_in0, UVM_DEFAULT | UVM_REFERENCE) `uvm_field_object (env_master_svr_multi_in1, UVM_DEFAULT | UVM_REFERENCE) `uvm_field_object (env_slave_svr_multi_out, UVM_DEFAULT | UVM_REFERENCE)
sv_module_top の最後に、initial 文の中で、run_test() を実行しています。この run_test() を実行することで、UVMのテストが実行されます。UVMのテストは、svtb/multi_apuint_test_lib.sv になり、multi_apuint_test_lib クラスの build_phase タスクが実行されます。
initial begin run_test(); end
おわりに
次回は、実際のテストプログラム(テストシーケンス)をみてみます。