如何仅执行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
相关产品推荐
相关产品推荐

