【问题标题】:Getting a handle to a derived class member using uvm_factory使用 uvm_factory 获取派生类成员的句柄
【发布时间】: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


    【解决方案1】:

    鉴于提出的要求,不可能做你想做的事。如果address 打算放在每个派生类中,为什么不把它放在一个公共基类中,或者你的Base,或者位于你的BaseDerivedX 之间的一些中间基类上课?这就是继承的意义。

    您必须使用访问器函数,或者根据类型名称或$casting 的结果有条件地分支到每个类类型。

    【讨论】:

    • 是的,这和我想的一样。我只是想我会问。我给出的例子是简化的(但可能不是很好)。但我想你明白我的意思。感谢您的回复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2017-12-02
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    相关资源
    最近更新 更多