使用类与虚拟接口出现interface resolution编译错误的原因
问题原因分析
核心原因
这是Mentor Modelsim/QuestaSim编译SystemVerilog代码时的默认规则导致的:
- 当你导入任意package的成员时,编译器会完整解析整个package内的所有类型定义,而非仅解析你实际用到的类/函数。你的
clspkg中存在bst_generator类的定义,其中声明了virtual t_bst.producer类型的成员,不管你有没有实例化bst_generator类,只要这个类型声明存在,编译器就会尝试为该虚拟接口类型匹配设计中的对应接口实例。 - 即便你仅导入
clspkg::clock_generator而不是导入整个包,SystemVerilog的编译规则仍然要求编译器完整解析整个package的所有定义,bst_generator里的虚拟接口声明仍然会被识别到,触发检查逻辑,因此还是会报错。 - 你最初的测试bench里没有
t_bst接口的任何实例,因此编译器无法完成虚拟接口的类型解析,就会抛出对应的报错。 - 当你取消
t_bst实例化代码的注释后,设计中存在了至少一个t_bst接口的实例,编译器就能完成virtual t_bst.producer的类型匹配,哪怕你完全不使用这个实例,也不会再报错。
解决方法
你可以根据需求任选一种方案:
- 直接删除
clspkg中不需要的bst_generator类定义,从根源上消除virtual t_bst.producer的类型声明,就不需要额外实例化t_bst接口。 - 如果要保留
bst_generator的代码,编译时给Modelsim添加参数-allowunusedvirtualinterfaces,该参数会允许存在未匹配实例的虚拟接口类型,跳过对应检查。 - 按照你目前发现的方法,在测试bench中保留一个未使用的
t_bst接口实例即可,不会对实际运行功能产生影响。
内容的提问来源于stack exchange,提问作者David Belohrad
相关产品推荐
相关产品推荐

