UVM重写后类句柄属性访问报错及重写规则相关疑问
第一个示例报错原因
该报错是SystemVerilog的静态类型检查规则导致的,和UVM工厂重写逻辑无关:
- 你声明的
agent_a_h句柄的静态类型为agent_a,SV编译器在编译阶段只会检查agent_a类中是否定义了field成员。你的agent_a类本身没有声明field,因此编译阶段就直接抛出错误,不会到运行阶段再识别实际指向的对象类型。 - 类的成员变量属于静态绑定,仅由句柄的声明类型决定;只有虚函数属于动态绑定,运行时才会匹配实际对象的实现,这也是你第二个补充测试中
display()函数可以正常执行的原因:display是定义在agent_a中的虚函数,编译阶段检查合法,运行时自动调用实际生成的agent_c对象的对应实现。
如果需要访问field属性,可采用两种方案:
- 在
agent_a基类中提前定义field成员,子类可以对该成员赋值覆盖 - 调用
$cast将agent_a_h向下转型为agent_c类型的句柄后,再访问field属性
UVM工厂重写的适用规则
UVM工厂重写的核心要求是重写类与被重写类必须类型兼容,满足SystemVerilog的赋值规则:子类对象可以赋值给父类句柄。针对你的实际应用场景:
- 新增的
drv2必须是原有drv类的派生类,可以是直接子类,也可以是隔代的子孙类(比如你提到的层级结构中的C、D节点都可以),不需要必须为直接下级节点。 - 如果
drv2和drv没有继承关系,或drv2是drv的父类,重写后create返回的对象无法赋值给drv类型的句柄,运行时会抛出类型不兼容错误。
内容的提问来源于stack exchange,提问作者MoniCa
相关产品推荐
相关产品推荐

