OOP术语
OOP:object oriented programming
Class类:包含变量和子程序的基本构建块
Object对象:类的一个实例
Handle句柄:指向对象的指针
Property属性:存储数据的变量;在V中,可以是wire或reg类型
Method方法:类中可以使用task或者function来定义方法以便处理自身或者外部传入的数据;在V中可在module中定义task或function,也可以使用initial或always处理数据 (SV中不可,initial和always仿真就执行,class使用时才调用)
类(class)
验证中类的作用:激励生成器;驱动器;监测器;比较器
function参数默认input,logic类型
句柄的声明不用放在initial块中
没有句柄指向的类,生命周期消亡,分配空间消失
类的成员操作
类的闭合属性
public:子类和外部可以访问成员
protected:该类和子类可以,外部不可以
local:该类可以,子类和外部不可以
Verilog & SV的class
Verilog的例化是静态的,SV的class例化是动态的,更加灵活和节省空间
Verilog中没有句柄,SV的class可将对象的指针赋予其它句柄,操作更灵活
浅复制 & 深复制
浅复制仅复制对象的所有属性,但不包括属性成员中句柄指向的对象
深复制创建一个新的和原始句柄指向的内容相同的字段,是两个一样大的数据段,故两者的句柄指向的空间是不同的,但内容是相同的,之后新对象中的句柄指向的内容与原始对象中句柄指向的内容不会相互影响。
(面试重点)
类 & 模块(module)
二者都可作为封闭的容器来定义和存储
硬件部分必须在仿真一开始就确定下来,即module和其内部过程块、变量都应是静态的;
而软件部分,类的部分可在仿真任何阶段声明并动态创建出新的对象。
封装性上,模块是public,而类可根据需要确定外部访问的权限。
继承性上,模块无继承性。
OOP三大特性
类的封装
封装是面向对象编程的核心思想,将对象的属性(变量)和行为(方法)封装起来
类和结构体:类变量在声明之后需要构造才会构建对象实体,而struct在变量声明时已开辟内存,类除了声明数据变量成员,还可声明方法(function/task)
类的继承:分为实现继承和接口继承
super.new();系统自动调用父类的new函数
优先显示子类的方法;new函数不能共享,显示子类和父类的new函数
类的多态
当一个类派生出子类的时候,基类中的一些方法可能需被重写;用对象中的类型来决定调用哪一个实现方法,这是一个动态的过程,动态的选择方法的实现方式叫多态
重写:子类中具有的与父类相同的函数名和参数的方法
带有虚方法的类称为多态类
没有继承就没有多态
虚方法
添加virtual关键字声明一个虚方法,虚方法是一个基本的多态性结构
每个类的继承关系只有一个虚方法的实现,而且是在最后一个派生类中
p2指针发现dis()是虚方法会在子类中找是否重写
类型转换
一种多态形式
父类→子类:向下类型转换(安全)
子类→父类:向上类型转换(不安全,会报错)
$cast(目标,源);//目标=源
//可以通过在endmodule后加上冒号和模块名来区分多个模块,分清多个endmodule与module的对应
module top;
……
endmodule:top