今天在仿真实验时遇到一个有趣的问题。通过type_id::create创建object需要传入字符串name,但是测试发现,在new function中打印显示传入的name,始终是默认值。
class
Result:
reporter [CREATE] obj1 type [obj1] created
看起来“o1”并没有传进new函数,因此打印了默认值。
通过查看UVM源码,找到以下代码(uvm_object_defines.svh):
// m_uvm_object_create_func
看起来现在的代码走到了`else分支。
通过补充set_name function,验证了猜想:
function
Result:
reporter [CREATE] obj1 type [obj1] created
reporter [SET_NAME] obj1 type [o1] set
这样看似乎解决了这个问题。不过如果能走第一个分支,似乎就不存在这个问题了。
之后再次经过搜索代码以及查看仿真工具设置,澄清了这个问题。
首先,我使用的仿真器默认使用UVM1.1d,在这个版本的UVM中,默认不会开UVM_NO_DEPRECATED这个define,因此没有define UVM_OBJECT_MUST_HAVE_CONSTRUCTOR(uvm_macros.svh),从而在上文编译处走`else分支。
//
其次,在UVM1.2中,已经要求默认define UVM_OBJECT_MUST_HAVE_CONSTRUCTOR。这一点可以在UVM1.2 Release Notes Mantis 4518中看到。
并且还附上了解释:
https://verificationacademy.com/verification-methodology-reference/uvm/docs_1.2/html/files/overviews/relnotes-txt.html#Why_uvm_object_constructors_are_now_mandatoryverificationacademy.comUVM 1.2 Release Notes
UVM 1.2 Release Notesverificationacademy.com基本上和上文所述一致,即UVM推荐在uvm_object类的new函数中使用name参数,但是一旦使用之后,通过new("o1")直接例化object,和通过type_id::create("o1")造成的结果可能是不一致的。如果在new函数中需要使用name参数,这种不一致性就可能造成令人困扰的结果。
同时,解释中还提到在UVM1.3中,将只保留修改后这种正确的方式。