关于uvm中factory重载机制的问题
把driver重载成new_driver增加一个analysis_portb_port;
在testcase class中的build_phase中通过 set_type_overwrite_by_type重载driver和monitor。
在env中通过created实例化为driver_hmonitor_h
此时我是实例化的driver_h和monitor_h应该是new_monitor 和new_driver类型,应该是具备a_port和b_port的
但是我在test_case的connect phase进行connect时提示找不到这俩port!
我通过print_topolpgy函数打印整个拓扑图时,发现driver_h和monitor_h中有这俩port!为什么有我在connect的时候会告诉我没有!
补充一句:错误是在编译时爆出的!
没明白,你都编译错误了,居然还能打印拓扑
打印拓扑是把connect屏蔽掉打印的
以monitor为例,在create的时候是new了一个new_monitor的对象,但是你的handle仍然是monitor的,也就是说一个父类的handle指向了子类,oop里的是根据type进行区分,因此会出现此类编译错误,这也是为什么oop大多采用access function进行重载
解决方法:
使用access function进行connect操作
我后来想了一下,重载是不是只能把原有的东西重写,如果新增属性是不是就属于派生了呀!
我对你说的access function 方式重载不太清楚,不知道有没有相关资料贴一下呢。
举个例子,为什么你可以在print_topology里面看到新增的port,是因为最终调用的是每个对象的print() function,而当你override之后,虽然你的monitor的type是原来的type即(monitor),但是handle指向子类new_monitor的内存空间,因此你调用print就是new monitor的print,同理,要想实现你说的功能,可以在父类里面定义一个空函数:
function connect_with_driver(analysis_portb_port);
return;
endfunction
然后在new monitor中重载这个函数:
function connect_with_driver(analysis_portb_port);
this.a_port.connect(b_port);
endfunction
在test case的connect phase里面这样定义:
mon.connect_with_driver(driver.b_port);
这样你override时就不会有问题了
嗯,只要重载的类中不要出现新的变量就不会有问题。
override是run time起效果的,你在compile就要用到新的port肯定会报错的