カミは死んだ

Paper Is Dead ... osz

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