はじめに
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
おわりに
次回は、実際のテストプログラム(テストシーケンス)をみてみます。