UVM Cookbook 眺めてみた - Assigning Virtual Interfaces From The Configuration Space
はじめに
UVM Cookbookを眺めてみた、の続きです。今日はTestbenchのAssigning Virtual Interfaces From The Configuration Spaceです。
Assigning Virtual Interfaces From The Configuration Space
- UVMのrun_test()が呼ばれる前にトップ階層の信号とDUTの入出力はSystemVerilogのinterfaceで接続されているべきだよ。
- トップ階層とDUTのinterfaceはvirtual interfaceのハンドルにアサインされてuvm_config_db::setを使ってテストに渡されるよ。
- テストのbuildメソッドではvirtual interfaceは関連するコンポーネントのコンフィギュレーションオブジェクトにあるvirtual interfaceのハンドルにアサインされる必要があるよ。
- それから、個々のコンポーネントは自身のコンフィギュレーションオブジェクトにあるvirtual interfaceのハンドルにアクセスしてDUTの信号をドライブしたりモニタしたりするよ。
- コンポーネントをモジュール化したり再利用するために、driversとmonitorsはvirtual interfaceのポインタをコンフィギュレーション空間から直接取得するべきでは無いよ。
テストクラスでfirtual interfaceがコンフィギュレーションオブジェクトを通じて正しい検証コンポーネントにアサインされるか保障するよ。
次のコードは、SPIテストベンチでuvm_config_db::getメソッドでvirtual interfaceをapb_agentsのコンフィギュレーションオブジェクトのvirtual interfaceのハンドルにアサインする例だよ。
// これより前にbuildメソッドでapb agentのvirtual interfaceのアサインを追加しています。 // envをビルドしてenvのコンフィギュレーションを作りサブコンフィギュレーションとvirtual interfaceのアサインをインクルードします。 function void spi_test_base::build_phase( uvm_phase phase ); // envのコンフィギュレーションオブジェクトを作ります m_env_cfg = spi_env_config::type_id::create("m_env_cfg"); // envをコンフィギュレーションする関数をコールします configure_env(m_env_cfg); // apb agentのコンフィギュレーションオブジェクトを作ります m_apb_cfg = apb_agent_config::type_id::create("m_apb_cfg"); // apb agentをコンフィギュレーションする関数を呼びます configure_apb_agent(m_apb_cfg); // apbのvirtual interfaceを追加します if( !uvm_config_db #( virtual apb3_if )::get(this, "" , "APB_vif",m_apb_cfg.APB) ) `uvm_error(...) // 以降処理が続きます endfunction: build_phase