首页 > 解决方案 > UVM:为什么 get_type_name() 不是静态的?

问题描述

请考虑此代码...

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

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

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

谢谢!

标签: system-veriloguvm

解决方案


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

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

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


推荐阅读