1、OOP术语
a.类(class):包含变量和子程序(函数或者任务)的基本构建块。
b.对象(object):类的一个实例。
c.句柄(handle):指向对象的指针。
d.属性(property):存储数据变量。
e.方法(method):任务或者函数中操作变量的程序性代码。
f.原型(prototype):程序的头,包括程序名、返回类型和参数列表。程序体则包含了执行代码。
类是对象的一个模板,其内部定义了数据和方法。对象是类的一个例化和实现。
注:《SystemVerilog验证 测试平台编写指南》中使用 变量(variable)和程序(routine),而没有使用OOP中的属性(property)和方法(method)。
2、用户使用对象的三个步骤:
a.定义类:
class packet;
...
endclass:packet
class long_packet;
...
endclass:long_packet
b.在module、class、function、task等地方声明对象:
1 packet my_packet;
2 packet packet_array[32];
3 long_packet my_l_packet;
对象标识符(my_packet/packet_array/my_l_packet)是例化该对象的句柄(指向对象的指针)。当该对象被创建的时候,该句柄有效,默认情况下句柄将为空(null)。
c.通过构造函数new创建对象的例化
通过new这个构造函数给对象分配内存空间,并且把入口地址赋给对象的句柄:
1 my_packet=new(168);
2 my_l_packet=new();
例5.1 简单的Transaction类
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
3、在哪里定义类?
program、module、package中。或者在这些块之外的任何地方。
例5.2 Class in a package
//File abc.svh
package abc;
calss Transaction;
//Class body
endclass
endpackage
例5.3 Importing a package in program
program automatic test;
import abc::*;
Transaction tr;
//Test code
endprogram
sv中,激励对象不断的被创建并且用来驱动DUT,检查结果。最后这些对象所占用的内存可以被释放。以供新的对象使用。
例5.4 声明和使用一个句柄
1 Transaction tr;//声明一个句柄
2 Tr=new(); //为 Transaction对象分配空间
注:
1、调用new函数例化一个对象,即在为该对象申请一个新的内存块来保存对象的变量。
2、new除了分配内存外,还初始化变量。default 二值为0,四值为X。
3、new函数不能有返回值,因为构造函数是返回一个指向类的对象的句柄,其类型就是本身。
例5.4 简单的用户定义的new()函数
class Transaction;
logic [31:0] addr,crc,data[8];
function new;
addr = 3;//固定值
data= '{default:5};//crc未定义,默认值为X
endfunction
endclass
4.创建多个对象
Transaction t;//创建一个句柄(可以理解为对象创建一个名牌)
t =new();//分配新的Transaction(可以理解为把名牌放到了一个位置)
t=new();//分配第二个,并且释放第一个t(可以理解为把名牌换了一个位置,原来的位置不在有,被清除)
t=null;//清除句柄
**解释:**第二行调用了new()函数创建了一个对象,并将对象地址存放到句柄t中,下一个new函数重新创建了一个对象,并将新的对象的地址存放到句柄中,将原来t的值覆盖掉。这时,已经没有任何句柄指向第一个对象,可以将其解除或分配。对象可以立刻被删除,或者登上一段时间被删除。最后一行明确的删除了t句柄。
注意:句柄的值为null时,表示清除句柄。
5.使用对象
可以使用“.”符号来引用变量和子程序。
例:
Transaction t;//声明一个Transaction句柄
t=new();//创建一个Transaction对象,并将对像的地址存放到句柄中
t.addr=32'h42;//设置变量的值
t.display();//调用一个子程序
参考文献
【1】测试平台编写指南