System Verilog OOP 学习笔记

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】测试平台编写指南

发布了50 篇原创文章 · 获赞 5 · 访问量 2686

猜你喜欢

转载自blog.csdn.net/qq_43042339/article/details/103854376