system-verilog - 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”感觉是错误的。
谢谢!
解决方案
get_type_name
不打算打印类型的名称。它的目的是打印给定对象实例的类型名称。
get_type_name
是一个virtual
函数。虚函数背后的意图是支持多态性。如果我们有一个类型的变量uvm_object
(其中get_type_name
首先定义),我们可以在其中存储任何子类的对象uvm_object
。如果我们要调用get_type_name
该对象,我们将获得对象类型的名称,而这段代码在编译时并不知道该对象的类型。
多态性使得编写通用代码成为可能,因为它可以与任何具体的对象类型一起工作,只要该类型是该代码“理解”的东西的子类型。
推荐阅读
- c# - 远程服务器返回错误:NotFound。“type”类型的对象图包含循环,如果禁用引用跟踪,则无法序列化
- c++ - 在 Crypto++ 库中找不到 hkdf.h
- python - SQLAlchemy ORM多对多表关系-TypeError:不支持的操作数类型
- html - 使用 flexbox 使多个文本居中
- git - Gitlab推力被拒绝
- php - 从 URL 中隐藏父目录,或允许链接不需要该父目录
- c++ - 具有以向量作为参数的构造函数的对象向量
- coverity - Coverity 找到了很多我的构建没有使用的 .h 文件
- jboss - 如何在 JBOSS EAP 6.4 上运行 Jhipster 5.4.0 战争
- css - 在 Angular6 中全局使用 CSS Grid