什么是类?
一种将复杂数据及操作数据的方法封装在一起的数据类型。
如何声明类?
class firstcls;/*类名*/
logic [7:0] data; /*数据,即属性*/
static int count=0; /*共享属性(静态变量)*/
function void display; /*显示数据的函数,即方法;方法可以在类之外定义(extern/::)*/
$display("Data:%h", data);
endfunction:display
static function void displaycnt;/*静态方法,可以读写静态变量,不能读写非静态变量*/
$display("Number of objects:%d",count);
endfunction
function new;/*构造函数,创建对象,初始化变量*/
data = 8'h0;
endfunction
task start();/*类中方法默认自动存储*/
$display("Start!");
endtask
endclass:firstcls /*添加标记*/
如何使用类?
使用类之前,需要了解相关术语。
术语 | 描述 |
---|---|
类 | 包含属性和方法的基本构建块 |
对象 | 类的一个实例 |
句柄 | 指向对象的指针 |
属性 | 储存数据的变量 |
方法 | 操作变量的任务或者函数 |
原型 | 程序的头(程序名,返回参数和参数列表) |
因此,使用类,要先实例化一个属于该类的对象,然后使用其属性或者方法。类就像一张飞机图纸,根据图纸,可以制造出真实的飞机(对象),依据一张图纸可以制造许多飞机,同样一个类可以实例化出许多对象。句柄就像飞机的生产编号,一一对应,某架飞机生产时,应当为其分配特定编号。
fisrtcls aobj; /*声明一个句柄*/
aobj = new(); /*构造函数,为firstcls对象分配空间*/
aobj.display; /*调用显示函数*/
$display("%d %d",aobj.count,firstcls::count);/*两种方法都能调用静态变量*/
aobj = null;/*解除分配*/
如何嵌套类?
可以在类中使用其他类,不过要注意编译顺序问题,可用typedef class语句提前声明要用到的嵌套类。
如何传递对象?
利用句柄可以传递对象,但是要注意使用ref关键词,否则无法修改对象的属性。否则调用时,是把参数复制进去,对原先的对象无法造成影响。
如何复制对象?
可以用new操作符复制对象,但是对象内若包含了其他句柄,则无法自动复制,仍然保持原样。因此通常在类中定义一个copy方法用于复制。