SV学习笔记—包package的使用

 1.为什么需要包?

       当我们想对2个IP同时进行验证时,我们可能会发现他们的验证环境中的各个模块儿是相似的,只是里面的内容数据不同。这时为了提高工作效率,我们可能需要对他们同时跑仿真,这就需要引入package,使得同一模块儿被填入不同的内容从而进行不同IP的仿真。

       或者是在一个验证环境中,我们在顶层调用验证环境时,需要将所有的类组件include进来,为了代码的简洁明了,我们可以将所需要包含的文件写入package中,而只在top中import这个包即可。

SV学习笔记—包package的使用

  关于包在验证中的实际使用可见: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中的所有内容都引入进来

上一篇:打印九九乘法表


下一篇:go圣经笔记——入门