1.为什么需要包?
当我们想对2个IP同时进行验证时,我们可能会发现他们的验证环境中的各个模块儿是相似的,只是里面的内容数据不同。这时为了提高工作效率,我们可能需要对他们同时跑仿真,这就需要引入package,使得同一模块儿被填入不同的内容从而进行不同IP的仿真。
或者是在一个验证环境中,我们在顶层调用验证环境时,需要将所有的类组件include进来,为了代码的简洁明了,我们可以将所需要包含的文件写入package中,而只在top中import这个包即可。
关于包在验证中的实际使用可见:SV小项目—异步fifo的简单验证环境搭建(全)。
2.包的定义
包regs_pkg和arb_pkg的定义:
//对2个DUT或者1个DUT中的2个IP进行验证
package regs_pkg;//包1
`include "stimulator.sv"
`include "monitor.sv"
`include "checker.sv"
`include "env.sv"
endpackage
package arb_pkg;//包2
`include "stimulator.sv"
`include "monitor.sv"
`include "checker.sv"
`include "env.sv"
endpackage
可见虽然二者include的组件名字都一样,但其中的内容是不一样的,且编译时package会将命名空间分开来,互不影响,各自编译各自的,如果需要使用某个package中的组件时,语法如下:
module arbiter_tb;
regs_pkg::monitor mon1=new();
arb_pkg::monitor mon2=new();
endmodule
3.包的命名规则
在实际工作中,一般要求package名称独一无二,其内部的类的名称也应该独一无二。
package regs_pkg;//注意先后顺序,如若regs_stm中用到regs_mon,则regs_mon应放在regs_stm前面
`include "regs_stm.sv"
`include "regs_mon.sv"
`include "regs_chk.sv"
`include "regs_env.sv"
endpackage
package arb_pkg;//虽然这2个包中引入的类都一样,但最好用不同的名字标识
`include "arb_stm.sv"
`include "arb_mon.sv"
`include "arb_chk.sv"
`include "arb_env.sv"
endpackage
module test_tb;
import regs_pkg::*;//导入包
import arb_pkg::*;
//如果2个包里类的名称都一样,这里实例化时就不方便声明是哪个package中的类,只能用前面所述的方法,比较繁琐,所以最好2个包中引入的类用不同的名字标识
regs_mon mon1=new;//regs_pkg包中类的实例化
arb_mon mon2=new;//arb_pkg包中类的实例化
······
······
endmodule
4.顶层调用包
顶层环境中,除了要引入不同的类,往往也需要定义一些静态变量和方法,这些东西都可以包含在package中,当在顶层top要引入该包里的内容时,如下:
import pkg_name::*//*表示该package中的所有内容都引入进来