Vengineerの妄想(準備期間)

人生は短いけど、長いです。人生を楽しみましょう!

Xilinx Vitis の中を調べる(その10)

はじめに

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

おわりに

次回は、実際のテストプログラム(テストシーケンス)をみてみます。