前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SystemVerilog中Package

SystemVerilog中Package

作者头像
数字IC小站
发布2020-06-30 15:56:14
1.6K0
发布2020-06-30 15:56:14
举报
文章被收录于专栏:数字IC小站数字IC小站

Package是systemverilog中的语言结构,它使相关的声明和定义能够组合在一起。Package可能包含类型定义,常量声明,函数和类模板。为了能在一个范围内使用Package,必须先导入它,然后才能引用其内容。

我们一般把不同模块的类定义在不同的Package中,这样可使得分属于不同的模块验证的类来自不同的Package中。


需要注意的是,不同的package可以包含同名不同内容的文件,甚至可以包含同一个文件而不引起多重定义问题。原因在于package是将命名空间分开的,因此如果出现相同文件,我们只需要注意是使用哪个package中的就好。


以下分情况讨论package的使用情况,所有仿真都是基于VCS2019.06版本。


  • 如果不引入package,也不使用上次讲到的ifndef宏定义的情况下,多个文`include同一个文件会出现多重定义的情况,所以首先来看下在package下是什么情况。

需要注意的是,因为在a_pkg和b_pkg中包含了同样的文件名的文件,因此我们定义的时候建议使用 a_pkg::monitor这种写法,否则可能有错误。

仿真结果如下:


  • 特别的,如果上面的monitor3也更改名字为monitor,那么我们再来看下各种情况的区别:

上图这种写法,仿真结果会报Error:因为在多个地方定义了monitor:

但是需要注意的是,上述代码在questa sim10.6c中是可以通过编译的...所以为了减少不必要的错误,我们推荐使用不同的名称,当然,使用相同名称时,需要所有的类名前都加上*_pkg::,这种写法是任意仿真器都允许的。

需要注意的是,如果把testbench中的class放到module中,上述语句是可以执行的,因此,为了减少不必要的麻烦,我们还是推荐VCS的写法。


  • 再加点,如果我们在c_pkg中import入a_pkg,那么我们能不能在module中引入c_pkg,从而调用a_pkg中的class呢?

代码如下所示:

结果是不行的,因为import操作使得类型可见范围限制在只调用该import的域,因此到module中则不行了,仿真结果如下:


解决方法是使用export语句,使得重新得到定义:

则仿真结果如下:


  • 总结下:
  • 我们可以在module、program、interface中通过import的方法引入package。
  • package一般用来共享参数、数据、类型、任务、函数以及类等
  • 不允许出现reg,wire信号
  • 如果是泛式引用,即import *_pkg::*;,则会先在本身的模块、程序内寻找,找不到才会去pkg内寻找。
  • 如果是指定引用,如import *_pkg::monitor;则直接调用,这时候我们在module、program中不应该出现相同名字的类型定义,否则报错。
  • 在module、program中的二级引用需要添加export *_pkg::*;语句。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数字IC小站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档