-
面向对象编程三要素:封装、继承、多态。
-
类实际上为数据类型,对象为一个具体的实例。例如,int为语言提供的一种数据类型。
-
类的定义其实是属性(即成员变量)、行为等的声明,将这一类的属性提取出来。类是属性和方法的自洽体,能够保存和处理数据;而struct结构体则是单纯的数据集合,不能对数据做出符合需求的处理。
-
成员方法(即方法)则为对数据的处理方法,例如在类中的属性(即成员变量)和行为,定义一个人类的类,人不仅有属性(年龄、名字等),还有一些行为(跑步、说话等),这些行为的实现就需要方法去实现。
例如:
为什么要用OOP?
-
在每个代码块endfunction、endclass后加label便于配对和阅读。如:endclass :Transaction和endfunction :display等
-
把class改成module也一样。class为软件盒子,module为硬件盒子。
-
class也要进行例化。
-
在module内的方法以及变量都是静态的,伴随整个过程。
-
在class(软件)内的方法和变量则为动态变量,调用一次后销毁。
-
在软件盒子class内,不能定义硬件的变量,即wire、reg等硬件定义,使用bit等定义软件变量;module硬件盒子内可以定义硬件信号,也可以用bit定义变量。
-
接口的指针可以传递到类里,因此类可以通过接口获得硬件内部的信号。因此软件盒子和硬件盒子的连接媒介为interface接口。
-
module里定义的方法要在initial和always过程块中调用;在class内定义的方法通过方法嵌套方法来调用,且在class中不能使用initial和always。
-
OOP的概念要素
谈到句柄(指针),则将它理解为指向例化的对象。谈到属性,即为成员变量,可以使用logic和bit。
-
Verilog的例化和SV的class例化的区别
1.Transaction tr创建叫tr的指针,假设地址为0x0011;tr = new()创建了对象,同时对应在堆中开辟了0x0011指向的存储空间。
2.对象的空间位置不会改变,并且指向改存储空间的句柄(指针)可以有多个。
3.句柄:创建一个句柄,即指针,需要指向一个对象:
tr = new();
-
硬件例化仿真在load时,硬件层次结构就已经确定了(即在跑仿真时不能改变),在编译前就提前确定好了。
-
SV软件的例化即可以很灵活使用,可以随时例化和销毁掉。
答案:BCD——tr = new TR();例如一个人可以有多个名字,小名、大名等,句柄指向对象。 -
-
创建对象:即开辟了新的内存空间,用来存放新的成员变量和方法
tr = new(10);//10被传递给a了
*函数new(),创建对象,并返回句柄给tr。
例题
答案:C;10被传入后在function内addr的3被代替掉为10,logic先定义为16,但是最终起作用的是new内重新赋值为10。
-
句柄的传递
对象——存储空间。
句柄——空间指针,指向存储空间的指针。
t2 = t1;让t2句柄指向了同一个对象,即堆中的同一片存储空间。
*函数new(),创建对象,并返回句柄
1.t1 = new();——通过new创建了一个对象,然后把这个new()返回的句柄赋予了t1。
2.看到了一次new(),那么就是例化了一次对象。因此上述代码中例化了两个对象。
-
SV也采用了自动回收空间的处理方式。
"需要"指的是,如果存在句柄(指针)指向这个对象(存储空间),那么这个对象是被需要的;反之没有句柄指向该对象,那么该对象不被需要,会被自动销毁。
#####注意#####
创建动态数组为:
byte nb[];
nb = new[10];//new后采用的是中括号。
创建对象则是new(),用的是小括号。
#############
-
例题
答案:只指向最后一个第四个对象,选B;之前的对象没有句柄指向了。
如果加了automatic,执行完initial1后,最后动态变量wd就不存在了,句柄也销毁了,对象也销毁了,答案选D。
null为关键词
-
静态变量
引用class类中的静态变量,需要使用class::var语句来引用。
例化了一次Transaction,count就会加一次。如图标注,索引静态变量。
-
静态方法中可以声明并使用动态变量,但是不能使用class类中的动态成员变量,这是因为如果在调用该静态方法时,静态方法中没有创建具体的对象,那就没有开辟动态成员变量的存储空间,则该方法无法正确使用。
-
静态方法可以使用类的静态变量,这是因为静态方法和静态变量在编译阶段就已经分配好了内存空间。动态成员变量则不会在编译阶段分配内存空间。