System Verilog学习笔记(十三)——面向对象编程(1)
OOP术语
- 类(class):包含了数据和方法(function,task)的类型
- 对象(object):类在例化后的实例,对象在创建时需要先声明再例化
- 句柄(handle):指向对象的指针,可以指向很多对象但是一次只能指向一个
- 原型(prototype):程序的声明部分,包含程序名、返回类型和参数列表
类
- SV在类的定义时,只需要定义构建函数,如果未定义,则系统会自动帮助定义一个空的构建函数(没有形式参数,函数体亦为空)
- SV类是在运行时测试平台需要的时候才被创建,在SV中,激励对象被不断地创建并且用来驱动DUT,检查结果
- 类在使用前必须先例化
- 声明
class Transaction;
//变量和方法
endclass:Transaction
句柄
- 声明和使用
Transaction tr; //声明一个句柄
tr=new (); //为一个Transaction对象分配空间
初始化为特殊值null
- 为对象创建一个句柄
Transaction t1,t2; //声明两个句柄
t1=new(); //为第一个对象分配地址
t2=t1; //t1和t2都指向该对象
t1=new(); //为第二个对象分配地址
定义构造函数(constructor)
- new( )函数又称构造函数,既能分配内存,创建对象,又能初始化变量。默认情况下,将变量设置成默认数值——二值变量为0,四值变量为X。
- new函数不能有返回值,因为构造函数总是返回一个指向类对象的句柄,其类型就是类本身。
静态变量(static)
- 在类中创建一个静态变量,该变量将被这个类的所有实例所共享,并且他的使用范围仅限于这个类。
- 通过类名访问静态变量,::是类作用域操作符
$display ("%d transaction were created",Transaction::count); //引用静态句柄
this
- this用来明确索引当前所在对象的成员(变量/参数/方法)
- this只可以用来在类的非静态成员、约束和覆盖组中使用
- this的使用可以明确所指向变量的作用域
class demo;
integer x;
function new(integer x);
this.x=x; //类变量x=局部变量x
endfunction
endclass
赋值和拷贝
- 声明变量和创建对象是两个过程,也可以一步完成
packet P1;
p1=new();
- 如果将p1赋值给另外一个变量p2,那么依然只有一个对象,指向这个对象的句柄有p1和p2
packet p1;
packet p2;
p1=new;
p2=new p1; //用new操作符进行复制
数据的隐藏和封装
- 类的成员在默认情况下是公共属性的,表示对于类自身和外部均可以访问该成员
- 对于商业开发,类的提供方会限制一些类成员的外部访问权限,继而隐藏类成员的更多细节
- 数据隐藏的方式使类的测试和维护都变得更为简单
- 对于成员的限定,如果使用local,则只有该类可以访问此成员,而子类或者外部均无法访问
- 对于成员的限定,如果使用protected,则表示该类和其子类可以访问此成员,而外部无法访问