Vengineerの妄想(準備期間)

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

run_testタスク(OVM 1.0/1.0.1の場合)

Verification Engineerの戯言

OVM 1.0/1.0.1対応

OVMにおいて、テストを開始するためにはrun_testタスクを呼ぶことになります。
このrun_testタスクは、トップテストベンチのinitial文内で呼びます。

examples/sequence/test.sv を見てみると、
    module test;

      `include "ovm.svh"

      // かなり、省略

      initial begin
        set_config_string("sequencer", "default_sequence", "simple_seq_sub_seqs");
        sequencer = new("sequencer", null); sequencer.build();
        driver = new("driver", null); driver.build();
        driver.seq_item_prod_if.connect_if(sequencer.seq_item_cons_if);
        run_test();
      end

  endmodule
のように、initial文の最後で呼んでいます。

では、run_testタスクはどこでどのように実装されているのでしょうか?

実装されている場所は、src/base/ovm_env.svh で、次のように定義されています。
    task run_test (string test_name="");
        ovm_env::run_test(test_name);
    endtask
run_testタスクは、あるクラスに属するのではなく、ただのタスクとして実装されています。
トップテストベンチであるモジュール内でovm.svhをインクルードすることで、run_testタスクの定義を取り込み、initial文内で使えることになります。

run_testタスクの実態では、ovm_envクラスクラスタスクであるrun_testタスクを実行しているだけです。
クラスタスクであるので、ovm_envクラスインスタンスを指定しなくても呼び出すことができるのです。
ちょっとしたテクニックですね!