浅析SystemVerilog之package

https://zhuanlan.zhihu.com/p/106486751
http://blog.eetop.cn/blog-1561828-2316833.html

  • SV中的module,interface,program,checker,都提供declaration空间,内部定义都local当前的那个scope,相互之间的building block不影响,不识别。
  • package也可以提供一个declaration的空间,可以被其他的building block共享,Package declaration可以被import到其他的building block中,或者package中。
  • package中不能再包含module,interface,program,checker等带有declare属性的声明

import与include的区别?

  • include将文件中所有文本原样插入包含的文件中。这是一个预处理语句,`include在import之前执行。
  • import不会复制文本内容。但是import可package中内容引入import语句所在的作用域。

package的使用方法

我们通过一个简单的例子来进行一下说明。

package my_pkg;
    int y = 10;
    task common();
            $display("In my_pkg,Calledfrom somewhere");
    endtask
program test_case;
   import my_pkg::*;

   initial begin
     $display("y = %0d",y);
     common();
   end

endprogram

运行结果:

 y = 10
 In my_pkg,Calledfrom somewhere
  • package中一般会定义一些变量,struct、function、task等,用于不同的scope之间共享。
  • 隐式import:😗
  • 显式import::y;import::common();
  • 这里的显式和隐式import都是可以的;

问题一:当需要import多个package的时候,有同名的变量的时候

package my_pkg_0;
    int x = 25;
    task common();
            $display("In my_pkg_0,Calledfrom somewhere");
    endtask
package my_pkg;
    int y = 10;
    task common();
            $display("In my_pkg,Calledfrom somewhere");
    endtask
program test_case;
   import my_pkg::*;
   import my_pkg_0::*;

task common();
   $display("In program,Calledfromsomewhere");
endtask
   initial begin
     $display("x = %0d",x);
     $display("y = %0d",y);
     common();
     my_pkg::common();
     my_pkg_0::common();
   end

endprogram

运行结果:

x = 25
y = 10
In program.Calledfromsomewhere
In my_pkg.Calledfromsomewhere
In my_pkg_0.Calledfromsomewhere
  • import多个package的时候,有同名函数或者变量的时候,一定要指名是哪个package的函数或者变量,否则的话,会报错;
  • 顶层import的时候一定要全;

问题二:当需要多个package嵌套的时候,又要怎么处理呢?

package my_pkg_0;
    int x = 25;
    task common();
            $display("In my_pkg_0,Calledfrom somewhere");
    endtask
package my_pkg;
    import my_pkg_0::*;
    export my_pkg_0::x;
    export my_pkg_0::common;
    int y = 10;
    task common_0();
            common();
            $display("In my_pkg,Calledfrom somewhere");
    endtask
program test_case;
   import my_pkg::*

task common();
   $display("In program,Calledfromsomewhere");
endtask
   initial begin
     $display("x = %0d",x);
     $display("y = %0d",y);
     common();
     my_pkg::common();
     my_pkg_0::common();
   end

endprogram

运行结果:

x = 25
y = 10
In program.Calledfromsomewhere
In my_pkg_0.Calledfromsomewhere
In my_pkg.Calledfromsomewhere
In my_pkg_0.Calledfromsomewhere
  • 一个package调用另一个package,需要import:😗;
  • 并且一定要显示调用export::x,export::common(如果是function/task的export,可以用隐式调用export my_pkg_0:😗)
posted on 2021-05-15 17:41  猪肉白菜_125  阅读(1656)  评论(0编辑  收藏  举报