手机版 欢迎访问it开发者社区(www.mfbz.cn)网站

当前位置: > 开发

SV中import和include的区别

时间:2021/4/13 21:31:01|来源:|点击: 次

    一个常见问题:我们应该从package中import类或者Include它们?为了正确回答这个问题,先主要介绍这两个关键词的区别。


 

    SystemVerilog仅使用类型的名称来确定类的类型等效性。例如,假设我下面有这两个类定义A和B:

图片

    SystemVerilog认为这两个类定义是不相等的类型,因为它们的名称不同,即使它们的内容或类主体是相同的。类的名称不仅包括简单名称A和B,还包括其他名称。名称还包括定义的声明范围。当你在package中声明一个类时,package名称将成为该类名称的前缀:

图片

    现在,有A类的两个定义,一个定义为P::A,另一个定义为Q::A。而且变量P::a1和Q::a1是类型不兼容的,引用了两个不同的A类。使用包含文件重写以上示例将导致相同的情况,即还是两个不兼容的类定义。

图片

    在将A类包含在每个package中之后,将得到A类的两个定义,因为使用include只是在文件中剪切和粘贴文本的快捷方式,所以结果毫无疑问与上图一样。从包中导入名称不会重复文本。这样就可以从另一个软件包中看到该名称,而无需复制定义。

图片

    类A在package P中声明,并且仅在package P中声明。变量R::a1和S::a1是类型兼容的,因为它们都是P::A类型。SystemVerilog中的package提供了保存和共享数据、参数和方法的机制,可以在多个module、class、program和interface中重用。package中声明的内容都属于这个package作用域(scope)。在使用这些内容时,需要先import这个package,然后通过package引用。

 

 

    综上所述,他们之间的区别如下:

    `include将文件中所有文本原样插入包含的文件中。这是一个预处理语句,`include在import之前执行。他的主要作用就是在package中平铺其他文件,从而在编译时能够将多个文件中定义的类置于这个包中,形成一种逻辑上的包含关系。

    import不会复制文本内容。但是import可package中内容引入import语句所在的作用域,以帮助编译器能够识别被引用的类,并共享数据。

 

    在我们的TB中,include通常分为以下几类:

1)package内的include文件:在package内,前面是import library,比如“import uvm_pkg::*”,紧接着即使include文件,通常会把本目录下相关的文件都include进来,比如virtual sequence文件,testcase文件。

2)package外的include文件:这种用法在我们现在的环境中使用不多,目前最常用的是include interface文件,比如,在xxx_env_pkg文件的最开头,include "xxx_if.sv"

3)为了文件管理方法,将部分code写到一个单独的文件中,然后在主文件中直接include进来,相当于将多个文件合并成一个文件。比如,一个subsys要用到很多API,而这些API共有A, B,C三类,分别由3个人完成,则可以写成api_a.sv, api_b.sv, api_c.sv,在l0_basic_vseq.sv中,将这三个文件include进来。

 

微信公众号

     建立了一个微信公众号“Andy的ICer之路”,此公众号主要分享数字IC相关的学习经验,文章主要在公众号上发,csdn会尽量同步更新,有兴趣的朋友可以关注一下!

 

Copyright © 2002-2019 某某自媒体运营 版权所有