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

如何仅执行UVM继承类child_class_c的printInfo函数?

解决UVM子类virtual函数调用时父类函数同时执行的问题

问题根源

你遇到的这种情况,几乎都是因为子类child_class_c的printInfo函数中显式调用了super.printInfo()——这行代码会主动触发父类的同名函数执行,即使函数已经被声明为virtual。

具体解决方案

方案1:移除子类中的父类函数调用

直接修改child_class_c的printInfo实现,删掉对父类函数的显式调用,只保留子类自身的逻辑:

class child_class_c extends my_frame_c;
  `uvm_object_utils(child_class_c)

  function new(string name = "child_class_c");
    super.new(name);
  endfunction

  virtual function void printInfo();
    // 移除这一行:super.printInfo();
    // 仅保留子类专属的打印逻辑
    `uvm_info("CHILD_CLASS", "子类printInfo执行", UVM_MEDIUM)
  endfunction
endclass

方案2:确认函数覆盖的正确性(排查潜在疏漏)

虽然你提到二者都实现了virtual函数,但需要确保两个关键点:

  • 父类my_frame_c的printInfo确实被声明为virtual(这是子类能正确覆盖的前提):
class my_frame_c extends uvm_sequence_item;
  `uvm_object_utils(my_frame_c)

  function new(string name = "my_frame_c");
    super.new(name);
  endfunction

  // 必须声明为virtual才能被子类覆盖
  virtual function void printInfo();
    `uvm_info("MY_FRAME", "父类printInfo执行", UVM_MEDIUM)
  endfunction
endclass
  • 子类printInfo的函数签名和父类完全一致(返回值、参数列表必须完全相同),否则属于函数重载而非覆盖,此时会根据引用类型执行对应版本。

验证示例

在child_init_seq_c的body任务中,无论是用子类引用还是父类引用指向子类实例,调用printInfo都只会执行子类版本:

class child_init_seq_c extends my_base_seq;
  `uvm_object_utils(child_init_seq_c)

  function new(string name = "child_init_seq_c");
    super.new(name);
  endfunction

  virtual task body();
    child_class_c child_inst;
    my_frame_c parent_inst;

    child_inst = child_class_c::type_id::create("child_inst");
    child_inst.printInfo(); // 子类引用调用,执行子类版本

    parent_inst = child_class_c::type_id::create("parent_inst");
    parent_inst.printInfo(); // 父类引用指向子类实例,因virtual特性执行子类版本
  endtask
endclass

内容的提问来源于stack exchange,提问作者bu-ral

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:50:09