UVM中factory机制的本质

factory机制的本质是什么?

factory机制本质是对SystemVerilog中new函数的重载,其带来了如下好处:

  • 提供新的创建实例的方法:根据类名创建这个类的一个实例。
    • 应用:根据run_test的参数AAA创建了一个AAA的实例
  • 提供重载过程控制函数,使得重载更加灵活,代码复用性更方便。
    • 应用:通过重载transaction、sequence或component,复用原有代码,快速创建新测试用例。

factory机制式的重载的过程

// src/ch8/section8.2/8.2.1/correct/my_case0.sv
function void my_case0::print_hungry(bird b_ptr);
   b_ptr.hungry();
   b_ptr.hungry2();
endfunction
...
function void my_case0::build_phase(uvm_phase phase);
   bird bird_inst;
   super.build_phase(phase);
   
   set_type_override_by_type(bird::get_type(), parrot::get_type());
   
   bird_inst = bird::type_id::create("bird_inst");
   print_hungry(bird_inst);
endfunction
// 打印结果如下:
// "I am a parrot, I am hungry" // virtual函数
// "I am a bird, I am hungry2"

解释如下:

  • 第13行进行例化时,由于前面set_type_override_by_type描述了bird到parrot的重载记录,所以bird_inst对应的实例化对象为parrot类型。
  • 第14行将bird_inst传递给print_hungry函数时,会被转换为函数形参bird类型的b_ptr,所以
    • 执行第3行的b_ptr.hungry();时,由于hungry是virtual修饰的函数,所以会被重载,执行parrot类中的hungry,打印 “I am a parrot, I am hungry”
    • 执行第4行的b_ptr.hungry2();时,由于hungry2未被virtual修饰,所以不会重载,执行bird类中的hungry2,打印 “I am a bird, I am hungry2”

factory机制式复杂的重载

UVM支持连续的重载

set_type_override_by_type(bird::get_type(), parrot::get_type());
set_type_override_by_type(parrot::get_type(), big_parrot::get_type());

注意:调用virtual函数/任务时,会查询这两条记录后,所以经过连续重载bird中调用的virtual函数最后会调用big_parrot中对应函数

替换式的重载:后者的重载记录会替换前者的重载记录

set_type_override_by_type(bird::get_type(), parrot::get_type());
set_type_override_by_type(bird::get_type(), sparrow::get_type());

注意:这里是否替换重载记录可以通过set_type_override_by_type的第三个参数控制,默认情况为1

  • 为1时,存在对同一 被重载的类型 的重载记录时,用当前重载记录 覆盖 前面的重载记录
  • 为0时,存在对同一 被仲裁的类型 的重载记录时,不会 用当前重载记录 覆盖 前面的重载记录

参考资料

UVM实战(卷一) 张强 编著 机械工业出版社


如需了解更多相关内容,欢迎关注“多读点书”,让我们一起阅读,一起成长。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值