blob: 331a5447693afb296ad76f91009624915d596549 [file] [log] [blame]
//
// -------------------------------------------------------------
// Copyright 2004-2008 Synopsys, Inc.
// Copyright 2009 Mentor Graphics Corporation
// All Rights Reserved Worldwide
//
// Licensed under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in
// writing, software distributed under the License is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See
// the License for the specific language governing
// permissions and limitations under the License.
// -------------------------------------------------------------
//
class vmm_test_registry;
static local vmm_opts _vmm_opts = init_opts();
local static function vmm_opts init_opts();
init_opts = _vmm_opts;
if (init_opts == null) begin
init_opts = new;
end
return init_opts;
endfunction
local static vmm_test registry[string];
local static vmm_log log = new("vmm_test_registry", "class");
local static int width = 1;
extern `VMM_STATIC_M task run(vmm_env env);
extern `VMM_STATIC_M function void list();
extern /*local*/ `VMM_STATIC_M function void Xregister_testX(vmm_test tst);
extern local `VMM_STATIC_M function void display_known_tests(ref string msg[$],
input bit fatal);
function new();
_vmm_opts = init_opts();
void'(_vmm_opts.get_bit("test_help","List available testcases"));
void'(_vmm_opts.get_string("test","Default","Name of testcase to run"));
endfunction
endclass
function vmm_test::new(string name,
string doc = "");
this.log = new("Testcase", name);
this.doc = doc;
this.registry.Xregister_testX(this);
endfunction
function void vmm_test::Xset_log_instanceX(string inst);
this.log.set_instance(inst);
endfunction
function string vmm_test::get_name();
return this.log.get_instance();
endfunction
function string vmm_test::get_doc();
return this.doc;
endfunction
task vmm_test::run(vmm_env e);
e.run();
endtask
function void vmm_test_registry::Xregister_testX(vmm_test tst);
string name;
if (tst == null) begin
`vmm_error(log, "Attemtping to register NULL test.");
return;
end
name = tst.get_name();
if (registry.exists(name)) begin
`vmm_error(log, `vmm_sformatf("Attempting to register test \"%s\" more than once.",
name));
return;
end
registry[name] = tst;
if (name.len() > width) width = name.len();
endfunction
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
if (!registry.exists("Default")) begin
// Create a default testcase and run it
tst = new("Default", "Default testcase that simply calls env::run()");
end
if (_vmm_opts.get_bit("test_help", "List available testcases")) begin
list();
$finish();
end
testname = _vmm_opts.get_string("test", ,
"Name of testcase to run");
// 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
// Don't known which test to use!
else begin
string msg[$];
msg.push_back("No test was selected at runtime using +vmm_test=<test>.");
msg.push_back("Available tests are:");
display_known_tests(msg, 1);
return;
end
end
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_note(log, `vmm_sformatf("Running test \"%s\"...", testname));
tst.run(env);
endtask
function void vmm_test_registry::list();
string msg[$];
string str;
msg.push_back("Available tests are:");
msg.push_back(str);
display_known_tests(msg, 0);
endfunction
function void vmm_test_registry::display_known_tests(ref string msg[$],
input bit fatal);
bit [12:0] n = 0;
string str;
static string spaces = " ";
n = 0;
foreach (registry[name]) begin
string testname = name;
$sformat(str, "%d) %s%s : %s", n++, testname,
spaces.substr(0, width-testname.len()-1),
registry[name].get_doc());
msg.push_back(str);
end
if ((fatal && log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) ||
(!fatal && log.start_msg(vmm_log::NOTE_TYP, vmm_log::NORMAL_SEV))) begin
foreach (msg[i]) void'(log.text(msg[i]));
log.end_msg();
end
endfunction