28_覆盖方法

1. 概述

在这里插入图片描述

  • 覆盖可以将原先的driver替换为新的drv2,后续可以用drv2做实际的例化。
  • 新定义的类型drv2必须继承原有类型。
    在这里插入图片描述

2. 覆盖方法

在这里插入图片描述

  • 这个函数是要做类型覆盖,新类型替代原有类型
    在这里插入图片描述
  • 替换实例
  • UVM顶层是root,然后是test,接下来是env,假设下面是checker,那么他的层次化索引路径为"root.test.env.checker"
    在这里插入图片描述

3. 覆盖实例

在这里插入图片描述

  • queastasim直接将uvm_pkg编译好放到环境中了,因此我们直接import就行。但是vcs没有编译好,需要事先编译。
  • 1定义、2注册、3创建new(),必须有super.new

在这里插入图片描述

在这里插入图片描述

  • comp2必须继承于comp1,否则在create时候无法成功返回句柄,必须有继承关系才可以将子类句柄给父类句柄。
    在这里插入图片描述
  • 在没有comp1::type_id::set_type_override(comp2::get_type());这个覆盖命令时,c1/c2都是comp1的实例,都会调用comp1的Hello。
  • 覆盖必须发生在创建之前。
  • 加上这句话之后,使用c2使用工厂做创建,在无需修改原有代码的基础上,就实现了将c2使用comp2进行实例化。即comp2覆盖了comp1,但是没有修改任何源代码。
  • 而c1使用new()创建,那还是调用comp1的hello
  • 注意,替换后c2被返回的是子类的句柄,而c2本身是父类的句柄。
  • c2指向的是小三角(父类作用范围),由于在父类中hello是virtual,那么在实际调用的时候会调用子类的方法。若没有virtual只能调用父类的hello。因此有预感某些方法可能被覆盖,那就事先设定为virtual。
    在这里插入图片描述
    在这里插入图片描述

4. 确保成功覆盖

在这里插入图片描述

  • test层面的覆盖高于env层次的覆盖,因此最终生效的是test的覆盖。
    在这里插入图片描述
  • 先掌握核心方法满足日常需要,碰到新的问题后打开手册,查看类的原型、方法,再不断拓展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值