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的覆盖。
- 先掌握核心方法满足日常需要,碰到新的问题后打开手册,查看类的原型、方法,再不断拓展。