【问题标题】:UVM: Why is get_type_name() not static?UVM:为什么 get_type_name() 不是静态的?
【发布时间】:2021-12-21 18:55:50
【问题描述】:

请考虑这段代码...

virtual class SomeThing extends uvm_pkg::uvm_object;
  `uvm_object_utils(SomeThing)
  ...
endclass

class MyThing extends SomeThing#(MyTransaction);
  `uvm_object_param_utils(MyThing)

  function new(string name = "MyThing");
    super.new(name);
    `uvm_info(get_name(), {"Created a ", get_type_name(),
                           " using transactions of type: ",
                           MyTransaction::get_type_name()},  // <--
              UVM_LOW)
  endfunction
  ...
endclass: MyThing

我的问题被标记为&lt;--。这是非法的,因为get_type_name() 不是静态方法,不能与范围解析运算符:: 一起使用。 (Synopsys 和 Cadence 模拟器都有类似的抱怨。)

为什么这个方法不是静态的?绕过访问器方法来读取包含我想要的值的“const静态字符串”感觉不对。

谢谢!

【问题讨论】:

  • 试试MyTransaction::type_name

标签: system-verilog uvm


【解决方案1】:

get_type_name 不打算打印类型的名称。它的目的是打印给定对象实例的类型名称。

get_type_name 是一个virtual 函数。虚函数背后的意图是支持多态性。如果我们有一个uvm_object 类型的变量(get_type_name 是首先定义的),我们可以在其中存储uvm_object 的任何子类的对象。如果我们在对象上调用get_type_name,我们将获得对象类型的名称,而这段代码在编译时并不知道该对象的类型。

多态性使得编写通用代码成为可能,因为它可以与任何具体的对象类型一起工作,只要该类型是该代码“理解”的事物的子类型。

【讨论】:

  • 是的。谢谢都铎提米。我确实明白,如果要使用此方法,它必须是虚拟的。我想我的抱怨是我真的希望该方法既是静态的(允许范围解析运算符)又是虚拟的......干杯!我正在(并且一直在)按照@Serge 的建议做,尽管感觉还是有点不对。
猜你喜欢
  • 1970-01-01
  • 2012-12-04
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多