01
类
类是一种封装了数据和操作这些数据的子程序;
一个数据包可能被定义为一个类,类中可以包含指令、地址、队列、数据等;
class Transaction; //简单的类
bit[31:0]addr,crc,data[8];
function void display;
$display("Transaction:%h",addr);
endfunction:display
function void calc_crc;
crc=addr^data.xor;
endfunction:calc_crc
endclass:Transaction
类(class):包含成员变量和成员方法;verilog对应模块(module);
对象(object):类在例化后的一个实例;verilog中需要例化一个模块才能使用;
句柄(handle):指向对象的指针;
new函数:
例化对象实体时为其开辟内存空间;
对内部成员变量初始化;
执行完之后返回指向类对象的句柄;
new函数不能有返回值;
class Packet;
integer command;
function new(); //构造new函数
command=IDLE;
endfunction
endclass
Packet p; //创建一个句柄
p=new();// 为Packet分配地址,调用Packet中的new函数
相同点:都申请内存并初始化变量;
不同点:调用new()仅创建一个对象,而new[]则建立一个含有多个元素的数组;
new()可以使用参数设置对象的数值,而new[]只需使用一个数值来设定数组大小;
对对象使用“.”符号来引用变量和子程序;
Transaction p;//创建一个Transaction的句柄
p=new(); //为对象Transaction分配空间
p.addr=32'h16; //初始化变量值
p.display(); //调用一个子程序
如果多个对象共享有一个成员(变量/方法),可以添加关键字static;
class Packet;
static integer file =$fopen("word",r);
……
endclass
Packet t;
data=$fgetc(t.file); //或者Packet::file ::为类作用域操作符
this用来明确索引当前所在对象的成员(变量/参数/方法);
this只可以在类的非静态成员方法、约束、覆盖组中使用;
this可以明确所指变量的作用域,避免变量所指不清楚;
class Bug;
integer z; //Bug类的成员变量x
function new(integer z); //构建函数new的参数z
this.z=z; //为了区分z,在new函数中通过this.z索引对象的成员变量
endfunction
endclass
区别对象和对象的句柄:
通过声明一个句柄来创建一个对象;
在一次仿真中,一个句柄可以指向多个对象;
在创建对象之后,指向该对象的句柄可以有多个;
为多个对象分配地址
Transaction t1,t2; //声明两个句柄
t1=new(); //例化对象,将new函数返回的句柄赋值于t1
t2=t1; //将t1值赋值给t2 ,即t1和t2都指向同一个对象
t1=new(); //例化第二个对象,将其句柄赋值给t1
//所以最后t1和t2分别指向了不同的对象
声明变量和创建对象是两个过程,也可一步完成;
Packet p1;
p1=new;
如果将p1赋值给另一个变量p2,那么依旧只有一个对象,只是指向这个对象的句柄有p1和p2;
对象的拷贝:
Packet p1; //p1、p2指向两个不同的对象
Packet p2;
p1=new;
p2=new p1; 创建p2对象时,将从p1拷贝其成员变量(整数、字符串、句柄等)
02
继承允许从一个现存的类得到一个新的类并共享其变量和子函数;
原始的类称为基类或者超类,新类称为扩展类;
子类可以继承父类的成员;
父类句柄可以指向子类的对象;
LinkedPacket zl=new; // zl子类句柄 父类句柄fl
Packet fl=zl;
super用来访问当前对象的父类成员;
当子类成员与父类成员同名,需要使用super来指定访问其父类成员;
class Packet ; //父类
integer value;
function integer delay();
delay=value*value;
endfunction
endclass
class LinkedPacket extend Packet;// 子类
integer value;
function integer delay();
delay=super.delay()+value*super.value;//super访问子类的父类同名的delay、value
endfunction
endclass
END