- 功能:package(包)提供了共享parameter、data、type、task、function、sequence、assertion以及checker声明的机制
- 使用范围:在module、program、interface中引用package
- 使用限制:
-
不允许出现reg,wire信号
-
不允许出现hierarchy引用item(例如tb.dut…)
-
不允许包含module、interface
-
不允许访问定义在unit编译单元里的item(即定义在全局空间的类型在package内无法访问,但interface编译后在package内的class里是可以识别的)
-
注:module/interface区别于package,可以看见unit编译单元定义的全局item;所以全局import uvm_pkg:xxx*后在module和interface里就不需要在import了,但是在package里还需要再import uvm_pkg:xxx
-
- 使用方法:
- 泛式引用:import xxx_pkg::*
- 指定引用:import xxx_pkg::item
- 二级引用:export xxx_pkg::*
- 作用域:
- 如果是泛式引用,则会先在本身的module等内寻找,找不到才会去pkg内寻找;即module等可以定义和pkg相同的item
- 如果是指定引用,则该类型直接在module等内部调用,此时在module等中不应该出现和pkg内相同名字的类型定义
- import xxx_pkg::*如果在module 外import,则为全局性的,编译后会放在$unit编译单元中;如果在module 内import,则作用域仅在该module内
- import操作使得类型可见的域只是调用该import时当前的域(eg:在package a_pkg中import了package b_pkg::type_b,那么在module1中import a_pkg::*时,无法引用到type_b,可通过在a_pkg内export b_pkg::type_b二次定义解决)
- 注:即使在unit空间中import也不能跨域调用(eg:在module外import a_pkg,a_pkg中引用了b_pkg,那么module中是看不到b_pkg的)
- 使用建议:
-
不在unit空间进行任何声明,所有共享的声明都要在 package中。需要时,可以将package导入到unit中
-
std是sv内部自定义的package(eg:std::method)
-
- import和include的区别:
- `include是一个预处理语句,`include在import之前执行
- `include将文件中所有文本原样插入包含的文件中
- import不会复制文本内容。但是import可将package中内容引入import语句所在的作用域