Verification Engineerの戯言
テストプログラムのexamples/std_lib/vmm_test/alu_test.svを見てみましょう。
vmm_test_register::run(env)は、vmm_test.svファイルで次のように定義されています。
結構長いですが、順番に見ていきましょう。
登録されているテストが1つのときは、それをone_tstに代入します。
表示し、シミュレーションを終了します($finish)。
"Default"テストをテスト名にします。
登録されていないときは、エラーメッセージを表示し、登録されているテスト名の一覧を表示します。
`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 1.1:vmm_testクラスの例題(その1)でみたテストのrunタスクが実行されます。
`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訪問者達成できればいいなーーー。
本日、27000訪問者を達成できました。
来年の2周年(2009年3月3日)には、30000訪問者達成できればいいなーーー。
検証、Verification、SystemVerilog、VMM、Verification Methodology Manual