You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UVM重写后类句柄属性访问报错及重写规则相关疑问

第一个示例报错原因

该报错是SystemVerilog的静态类型检查规则导致的,和UVM工厂重写逻辑无关:

  • 你声明的agent_a_h句柄的静态类型为agent_a,SV编译器在编译阶段只会检查agent_a类中是否定义了field成员。你的agent_a类本身没有声明field,因此编译阶段就直接抛出错误,不会到运行阶段再识别实际指向的对象类型。
  • 类的成员变量属于静态绑定,仅由句柄的声明类型决定;只有虚函数属于动态绑定,运行时才会匹配实际对象的实现,这也是你第二个补充测试中display()函数可以正常执行的原因:display是定义在agent_a中的虚函数,编译阶段检查合法,运行时自动调用实际生成的agent_c对象的对应实现。

如果需要访问field属性,可采用两种方案:

  1. 在agent_a基类中提前定义field成员,子类可以对该成员赋值覆盖
  2. 调用$cast将agent_a_h向下转型为agent_c类型的句柄后,再访问field属性
UVM工厂重写的适用规则

UVM工厂重写的核心要求是重写类与被重写类必须类型兼容,满足SystemVerilog的赋值规则:子类对象可以赋值给父类句柄。针对你的实际应用场景:

  • 新增的drv2必须是原有drv类的派生类,可以是直接子类,也可以是隔代的子孙类(比如你提到的层级结构中的C、D节点都可以),不需要必须为直接下级节点。
  • 如果drv2和drv没有继承关系,或drv2是drv的父类,重写后create返回的对象无法赋值给drv类型的句柄,运行时会抛出类型不兼容错误。

内容的提问来源于stack exchange,提问作者MoniCa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:15:05