【发布时间】:2019-12-19 02:44:01
【问题描述】:
如果我有一个基类和 3 个派生类,是否有使用基类类型指针访问派生类变量的方法?
示例:(取出不相关的代码 - 构造函数等)
class Base extends uvm_object;
bit[7:0] data;
virtual function void set_address(bit[7:0 a);
// do nothing
endfunction
endclass
class DerivedA extends base;
bit[7:0] address;
virtual function void set_address(bit[7:0 a);
address = a
endfunction
endclass
class DerivedB extends base;
bit[7:0] address;
virtual function void set_address(bit[7:0 a);
address = a
endfunction
endclass
class DerivedC extends base;
bit[7:0] address;
virtual function void set_address(bit[7:0 a);
address = a
endfunction
endclass
现在,假设我从我的 uvm_test 将基类覆盖为 DerivedA。我有一个记分牌,但所有类型都通用 - Base、DerivedA、DerivedB 和 DerivedC。
class Scb extends uvm_scoreboard;
Base item = Base::type_id::create("m_item"); <------- item will be of type derivedA
item.address = 'hAA; <------ illegal
item.set_address('hAA); <------ legal
endclass
这一切都很好,但实际上,我有多个成员变量,不想为所有变量创建访问函数。我正在尝试类似下面的方法,但不知道该怎么做。
class Scb extends uvm_scoreboard;
string s;
uvm_factory f = uvm_factory::get();
Base item = Base::type_id::create("m_item"); <------- item will be of type derivedA
s = item.get_type_name() <----- DerivedA
$cast(type_name_handle, f.create_object_by_type_name(s)); <----- this is what I want - to create a handle of derived type so I can then access the Derived variables.
endclass
这一切似乎都没有必要,但这是由于我无法控制的事情的组合 - 即我需要上面的所有 4 个类,并且希望避免使用基于 type_name 的 case 语句(有许多派生类)。
这里有什么解决方案吗?到目前为止,我开始认为这是不可能的。
【问题讨论】:
标签: system-verilog uvm