story · 2020年06月01日

SystemVerilog 概念浅析之package(import&include)

SystemVerilog中的package提供了保存和共享数据、参数和方法的机制,可以在多个module、class、program和interface中重用。
package中声明的内容都属于这个package作用域(scope)。在使用这些内容时,需要先import这个package,然后通过package引用。

SystemVerilog中的package通过package和endpackage声明

package my_pkg;
  typedefenumbit [1:0] { RED,YELLOW, GREEN, RSVD } e_signal;
  typedefstruct { bit [3:0]signal_id;
                     bit       active;
                     bit [1:0] timeout;
                   } e_sig_param;
 
  function common ();
      $display ("Calledfrom somewhere");
     endfunction
endpackage
 

然后通过import :: 指定需要导入的内容。如果需要导入所有内容,就需要输入
import my\_pkg::* ;

// Import the package defined above to use e_signal
 
package my_pkg;
  typedef enum bit [1:0] { RED,YELLOW, GREEN, RSVD } e_signal;
  typedef struct { bit [3:0]signal_id;
                     bit       active;
                     bit [1:0]timeout;
                   } e_sig_param;
 
  function common ();
      $display ("Called fromsomewhere");
    endfunction
endpackage
 
program test_case;
 
  import my_pkg::* ;
  class myClass;
    e_signal   my_sig;
  endclass

  myClass cls;
 
  initial begin
    cls = new ();
    cls.my_sig = GREEN;
    $display ("my_sig =%s", cls.my_sig.name());
    common ();
  end
 
endprogram

使用Questasim仿真

run
# my_sig = GREEN
# Called from somewhere
# 1
# Simulation stop requested.

因为我们输入了import my\_pkg::* ;所以仿真器才认识e\_signal

我们将import my\_pkg::***删掉再仿真,**仿真器会报出编译错误

** Error: **.sv(23): Invalid type'e_signal'. Please check the type of the variable 'my_sig'.
** Error: **.sv(30): (vlog-2730) Undefinedvariable: 'GREEN'.

package变量作用域

假设在顶层和package中具有同名的变量READ

package my_pkg;
  typedef enum bit { READ, WRITE }e_rd_wr;
endpackage 
 
program test_case;
 
import my_pkg::* ;
 
typedef enum bit { WRITE, READ } e_wr_rd;
 
  initial begin
        automatic e_wr_rd    opc1 = READ;
        automatic e_rd_wr    opc2 = READ;
      $display ("READ1 = %0dREAD2 = %0d ", opc1, opc2);
  end
 
endprogram
 

此时会发生编译错误:

** Error: (vlog-8386) **.sv(13): An enumvariable 'opc2' of type 'e_rd_wr' may only be assigned the same enum typedvariable or one of its values. 
Variable 'READ' of type 'e_wr_rd' is not valid.

这时候需要使用赋值方式

opc2 = my_pkg::READ;

仿真器输出log:

run
# READ1 = 1 READ2 = 0
# 1
# Simulation stop requested.

那么import和include有什么区别呢?

\`include将文件中所有文本原样插入包含的文件中。这是一个预处理语句,\`include在import之前执行。

import不会复制文本内容。但是import可package中内容引入import语句所在的作用域。

总结下就是

include****\_ is equivalent to copy/paste or insertion of whatever is present in that file to wherever you include.\_

import \_is used to make all/select variables from a package visible. \_

本文转载自公众号:芯片数字实验室
原文链接:
https://mp.weixin.qq.com/s/BO-EWUqetf3ablmuMwSL4w
未经作者同意,请勿转载!

推荐阅读
想了解更多内容,欢迎关注芯片数字实验室专栏
推荐阅读
关注数
12320
内容数
222
前瞻性的眼光,和持之以恒的学习~
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息