【IC验证】systemverilog_包
systemverilog_包
- 一.定义
- 二.语法
- (1)定义语法
- (2)域索引
- (a)说明
- (b)方法一
- (c)方法二
- (d)方法三
- 三.注意
- 1.注意点一
- 2.注意点二
- 3.注意点三
- 4.`注意点四`
一.定义
包就是将软件类型的成员(自定义类型,参数,成员变量,方法,类等(没有模块))进行打包,方便重复使用和共享。
二.语法
(1)定义语法
package 包名字;//自定义类型typedef enum {RED,GREEN,BLUE} color_t;//定义参数或常量const int MAX_VALUE = 100;//方法function int double_value(data_in);double_value = data_in *2;endfunctiontask print_message(string msg);$display("%s",msg);endtask//类class my_class;endclass
endpackage
(2)域索引
(a)说明
在模块中使用package中的内容前,必须要先把使用的东西导入到模块中。
原因:在编译testbench时,其会查找所有library中的内容,但是不会查找package,所以需要提前告诉编译器去package中查找。
(b)方法一
说明:使用前将包中的所有成员都导入;
语法:
import 包名::*;
例子:
结果:
(c)方法二
说明:使用前将包中使用的成员导入;
语法:
import 包名::使用的成员;
例子:
结果:
(d)方法三
说明:使用时将包中使用的成员导入;
语法:
包名::使用的成员;
例子:
结果:
三.注意
1.注意点一
说明:
包中的成员都是静态成员;
例子:
见二.2.d
2.注意点二
说明:
当前区域和包中的成员同名时,使用的成员会优先在当前的区域查找,只有当前区域没有时才会去包中查找;
代码:
package pak1;int data1 = 7;class class1;endclass
endpackagepackage pak2;int data2 = 8;class class2;endclass
endpackagemodule tb1;import pak1::*;import pak2::*;int data1 = 9;int data2 = 10;initial begin$display("data1 == %0d",data1);$display("data2 == %0d",data2);end
endmodule
结果:
3.注意点三
说明:当两个包中存在同名成员时,在使用包中的成员时,必须指定来自哪个包;
4.注意点四
注意:两个包中的成员最好不要重命,包和其他区域的成员最后不要重命;