Vengineerの妄想(準備期間)

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

VMM 1.1:vmm_testクラスの例題(その2)

Verification Engineerの戯言

テストプログラムのexamples/std_lib/vmm_test/alu_test.svを見てみましょう。
    `include "alu_if.sv"

    program alu_test(alu_if.drvprt alu_drv_port, alu_if.monprt alu_mon_port);

    `include "alu_env.sv"
    `include "tests.incl"

        alu_env env;

        initial begin
            env = new(alu_drv_port, alu_mon_port);
            vmm_test_registry::run(env);
        end

    endprogram
vmm_test_register::run(env)を実行してます。
vmm_test_register::run(env)は、vmm_test.svファイルで次のように定義されています。
結構長いですが、順番に見ていきましょう。
    task vmm_test_registry::run(vmm_env env);
        string   testname;
        vmm_test tst = null;
        vmm_test one_tst = null;
  
        if (registry.num() == 1) begin
            void'(registry.first(testname));
            one_tst = registry[testname];
        end
registryには、vmm_testを継承して定義したテストが登録されています。
登録されているテストが1つのときは、それをone_tstに代入します。
        if (!registry.exists("Default")) begin
        // Create a default testcase and run it
            tst = new("Default", "Default testcase that simply calls env::run()");
        end
registryに"Default"というテストが登録されていたtstに代入します。
        if (vmm_opts::get_bit("test_help", "List available testcases")) begin
            list();
            $finish();
        end
シミュレーション実行時に、+vmm_test_helpが指定されていたら、登録されているテストをlist
表示し、シミュレーションを終了します($finish)。
        testname = vmm_opts::get_string("test", ,"Name of testcase to run");
+vmm_test=テスト名が指定されているかどうかをチェックします。
        // If no tests were specified but only one test is known, run it
        if (testname == "") begin
            string str;

            // If there was only one user-defined tests, use it
            if (one_tst != null) begin
                tst = one_tst;
                testname = tst.get_name();
            end
            // If there is only the default test, use it
            else if (registry.num() == 1) begin
                void'(registry.first(testname));
                tst = registry[testname];
            end
+vmm_test=テスト名でテスト名が指定されていない時は、"Default"テストがあれば、
"Default"テストをテスト名にします。
            // Don't known which test to use!
            else begin
                string msg[$];

                msg = '{"No test was selected at runtime using +vmm_test=<test>.",
                        "Available tests are:"};
                display_known_tests(msg, 1);
                return;
            end
        end
"Default"テストがなければ、メッセージを表示し、登録されているテスト名の一覧を表示します。
        else begin
            if (!registry.exists(testname)) begin
                string msg[$];
                string str;

                $sformat(str, "Unknown test name \"%s\" specified.", testname);
                msg.push_back(str);
                display_known_tests(msg, 1);
                return;
            end
            tst = registry[testname];
        end
+vmm_test=テスト名でテスト名が指定されている場合は、登録されているをチェックします。
登録されていないときは、エラーメッセージを表示し、登録されているテスト名の一覧を表示します。

この時点でテスト名は、tstに設定されています。
        `vmm_note(log, `vmm_sformatf("Running test \"%s\"...", testname));
        tst.run(env);
    endtask
最後にやっと、テスト名を表示し、tst.run(env)を実行します。
そう、ここで前回のVMM 1.1:vmm_testクラスの例題(その1)でみたテストのrunタスクが実行されます。

P.S
本日、27000訪問者を達成できました。
来年の2周年(2009年3月3日)には、30000訪問者達成できればいいなーーー。

検証、Verification、SystemVerilog、VMM、Verification Methodology Manual