在学习UVM环境的过程中,验证组件env,driver等都是在package中引用的,只是大概知道package中打包了一些有相关性的文件,详细的不理解。自己要搭建/修改验证平台时无从下手,so,记录package相关内容在此,加深理解/供以后回顾。
------------------------------------------------------------------------------------------------
Package在UVM中的作用是什么?
参照【SystemVerilog的语言参考手册】的定义
【SystemVerilog包提供了额外的机制在多个SystemVerilog模块,接口和程序之间,共享参数,数据,类型,任务,函数,序列,以及特性的声明。
包是显示命名的作用域。它出现在源文本的最外层。类型,变量,任务,函数和特性都可以在一个包中声明。这些声明可以在模块,接口,程序和其他包中通过导入或完成的解析名字来引用。】
个人理解:
存在相关性,需要相互调用的各种类型的数据,文件就放在一个包中,类似一个数据共享空间。
例如:
我们需要在uvm_base_test中例化env,在env中例化driver,refmodel等。可以把所有文件都按照层次关系include到一个文件中,需要被调用的先include。这样的方法只能看出被调用关系,不能体现各组件间的层次关系。通过package把test层,env层次,agent层次的组件分别打包,这样层次,调用关系更清晰。
把平台所需的结构体都写到一个包中,这个结构体包在多个包中都要引用,在test层次的包中引用的结构体包并不能作用到env层中。
【包声明产生了一个作用域,它包含了用于在一个或多个编译单元,模块,接口或程序间共享的声明。位于包内的项目通常是类型定义,任务以及函数。位于包内的项目不能具有层次化的作用。(比如dut.item这样的调用)
Package的引用方法
1)使用域解析操作符 :: 进行引用
2)通过import语句进行引用
import分为显示导入和隐式导入(通配导入)。
例如要导入pkg_a中的test函数。
显示导入:import pkg_a::a;
隐式导入:import pkg_a::*;
隐式搜索优先级:
在module内部 "import pkg_name::*",代表的是该package中定义的类型可能会在module等内部有效可见。只有当module等无法在内部索引到正确类型时,才会转而去package中去搜寻,如果索引到了那么该package中的这个类型则变得在module中可见。
Package中include的文件为什么不需要指定路径?
因为文件是先编译过的吗?