[Systemverilog学习笔记] class
文章目录
一、Class 基础知识
class的定义是什么?
class是一种用户自定义的数据结构,一个OOP()的构造结构,可以封装对应数据并产生对数据的任务和方法;
亦可以表述:包含变量和子程序的基本构造块;
class中有什么?
封装的数据类型和操作数据类型的任务和函数。
存在以下常用名称:
属性 (property) :一个类中的数据类型;
方法 (Method):操作数据的任务和函数;
构造函数 (constructor) : 类中定义的new()函数,在类创建时自动调用;
句柄 (handle) : 指向对象的指针 ;
对象 (Object) : 一个创建的某个类的实例,需要使用new()函数进行创建,否则值为null;
如何定义一个类,并且使用它?
class Myclass; //class name
bit [2:0] header; //property
bit encode;
bit [2:0] mode;
bit [7:0] data;
bit stop;
// constructor
function new(bit [2:0] header = 3'h1, bit [2:0] mode = 5);
this.header = header;
this.encode = 0 ;
this.mode = mode ;
this.stop = 1 ;
endfunction : new
//Method
function display();
$display("Header = 0x%0h,Encode = 0x%0b,Mode = 0x%0h,Stop = 0x%0b",
this.header,this.encode,this.mode,this.stop);
endfunction : display
endclass : Myclass
module tb_top ();
Myclass pkt0,pkt1;
initial begin
pkt0 =new(); //use default parameter
pkt0.display();
pkt1 =new(3'h2,2h'h3);
pkt1.display();
end
endmodule
代码分析:
1、new函数–构造函数
类中定义的new() 即自定义构造函数,当tb_top模块中例化一个对象的时候,会为该对象申请一个新的内存块来保存对象的变量,大小为类中所定义的属性大小之和,然后初始化变量,当使用系统new函数(class中未自定义new)时,会将变量设置为默认值;当使用自定义new函数时,可以初始化默认值成我们想要的数值;
new函数会返回一个指向类的对象的句柄,其类型就是类本身,所以不能有返回值;
Sytemverilog 会优先调用赋值操作符左边的句柄类型,如下所示
class Transcation;
//...
endclass : Transcation
class Driver;
Transcation tr;
function new();
tr =new(); //会调用Transcation类中的new函数
endfunction