最近做项目的时候,重用了别人的验证组件,需要对发包的driver做一定的修改,于是想到了重载。但是报了这样一个错:
# UVM_FATAL @ 0: reporter [FCTTYP] Factory did not return a component of type 'sds_ge_driver'. A component of type 'my_sds_ge_driver' was returned instead.
觉得非常的奇怪,因为其他的关于激励的重载都是OK的。这个问题定位了很久,排查了重载格式不对,重载了两次,sds_ge_driver被例化了2次的可能,还是没有解决这个问题。后来我在整理filelist的时候,发现sds_ge_driver.sv这个文件,被加进来了两次,一次是组件VIP里的,一次是我自己在外面添加的。问题就出现在了这里,我自己添加的sds_ge_driver.sv文件内容上跟VIP里的一模一样,但是开头的宏文件有区别,我的定义是这样的:
`ifndef SDS_GE_DRIVER_SV
`define SDS_GE_DRIVER_SV
VIP里是这样的:
`ifndef SDS_GE_DRIVER__SV
`define SDS_GE_DRIVER__SV
多了一个下划线。。。。。这个还是用软件统一生产的头文件,很难发现。。。。
就是因为宏定义的不同,导致了sds_ge_driver.sv这个文件被编译了两次,在UVM的factory中被注册了两次,导致在重载的时候报错。去掉我自己添加的文件,重载OK!。
最后引用我师父的一句话:诡异的问题一般都是低级问题。。