svm_factory.sv
===========================================
virtual class svm_object;
endclass
===========================================
class svm_component extends svm_object;
string name;
function new(string name)
this.name = name;
endfuction
virtual task run_test();
endtask
endclass
===========================================
class svm_object_wrapper;
pure virtual function string get_type_name();
pure virtual function svm_object create_object(string name);
endclass
class svm_component_registry #(type T = int, string Tname = "<unkown>") extends svm_object_wrapper;
typedef svm_component_registry#(T,Tname) this_type;
static this_type me = get();
static function this_type get();
if (me == null) me = new();
svm_factory f = new();
f.register(me);
return me;
endfunction
function string get_type_name();
return Tname;
endfuction
function svm_object create_obj(string name );
T obj;
obj = new();
return obj
endfunction
endclass
===========================================
class svm_factory;
static svm_object_wrapper m_type_name[string];
static svm_factory m_inst;
static function svm_factory get();
if (m_inst == null) m_inst = new();
endfuction
static function void register(svm_object_wrapper c);
m_type_name[c.get_type_name()] = c;
endfucntion
static function svm_object get_test_name(string tname = "");
string name;
svm_component temp_comp;
svm_object_wrapper sow;
if(!$value$plusarg("+TESTNAME=%s",name)) begin
$display(" +TESTNAME NOT FOUND");
if(testname == "")
$finish();
else
name = tname;
end
sow = m_type_name[name];
$cast(temp_comp, sow.create_object(sow.get_type_name()));
return temp_comp;
endfunction
endclass
===========================================