第八课 OOP
- 什么是OOP?
可以帮助你搭建并维护一个大型的testbench;提升代码效率;提升代码的复用性。
Terminology
Class(类,蓝图) -> Object(对象,表示具体的物件) -> Handle(句柄,指向对象的指针/地址)-> Properties(属性,类当中定义的变量)-> Methods(方法,控制属性的方法)
SV当中尽量不要写always,而是用task和function处理任务的过程(偏软件思维)
OOP的三大特点:封装、继承、多态
语法
- 创建class:
class BusTran;bit[31:0] addr,crc,data[8];//data是8x32的数组function calc_crc;crc = addr^data.xor;
endfunction:calc_crcfunction display;$display("BusTran:%h",addr);
endfunction:displayendclass:BusTran //最后的名字可以不写
- 创建 object:
BusTran b;
b = new();
new有三个作用:1.在内存中分配空间给b,2.给b当中的变量赋初值,(二太赋0,四态赋x),3.返回存储了对象的地址
***也可以自己编写一个针对物件初始化的new函数。
***若对同一个object进行new,则新new的空间赋给object后原来的空间被释放,new的时候要确定object确实需要一个新的空间。
b = null;
使用null关键字可以手动释放空间
- 使用object
b.addr = 32'h42; //给b当中的变量赋值
b.display(); //调用b中的函数
变量
-
Static Variables
创建一个静态变量,可以在模块中被使用,并且不会被new函数释放或初始化。(注意,不是全局变量)
静态变量与class的种类有关,而不受object初始化影响,由属于该class的所有object共享
经常用于储存元数据,例如创建了多少个object等等。
在这里b1.id=0,b2.id=1,而count在b1和b2当中都是2。 -
Class routines
routine指在class当中定义的task或者function,它们的名字和功能是可以重复的。
class当中是可以引用其它class的,这个和verilog中module当中例化其它的module用法相似。
Handles
- shallow copy
b2 = new b1 ;
语句属于浅拷贝,只能拷贝class本身含有的属性,但是class中嵌套的class只能复制其指针,因此两个B模块(b1和b2)指向的是同一个指针,也就是同一个a模块。
- deep copy
深拷贝下所有的定义都被全新复制了一遍。
b1 = new;
b2 = new;
b2.copy(b1);
Inheritance
关键字:extends
在类之间共享代码的方式:1.例化另一个类 2.继承另一个类
继承能够增加额外的properties和methods,因此能够让代码具有很高的复用性。
class Transaction;bit [31:0] src,dst,data[1024],crc;
endclassclass BadTr extends Transaction;bit bad_crc;
endclassBadTr bt;
bt = new;
bt.src = 42;
bt.bad_crc = 1;
可以看到在上面的例子中BadTr继承了Transaction,Transaction所有的属性都能够在BadTr中看到。
除此之外还能修改原来的method,关键字:super
class Transaction bit [31:0] src,dst,data[1024],crc;function void calc_crc();crc = src^dst^data.xor;endfunction
endclassclass BadTr extends Transaction;rand bit bad_crc;function void calc_crc();super.calc_crc();if(bad_crc) crc = ~crc;endfunction
endclass
可以看到在用super调用了父类的函数之后,又添加了新的语句来修改crc的算法。
- virtual class 虚类
相当于一个空壳,虚类不能单独使用,必须要由一个实类继承
虚类不会被用于例化,但是可以储存最基本的类属性,方便在多个子实类当中重复继承。
可以理解为一种“模板”或者“框架”,由子实类来补充框架中的细节。