System Verilog学习11——类的方法和继承

目录

1.类和对象的概述

2.类的成员

2.1类与结构体的异同:

2.2类与模块(module) 的异同:

2.3关于类的思考

3.类的继承

3.1对父类方法的调用——super

3.2成员覆盖

3.3句柄的使用

3.4包的使用

1.类和对象的概述

类的定义核心是属性声明(property declaration)和方法定义(method definition)

类(class)中定义的变量不能是wire、reg等硬件类型变量,而module中可以定义bit等软件类型变量。module中定义的方法在过程块(initial或者always)调用。类中可以使用task和function,不能用initial和always。

Handle句柄(指针):用来指向对象的指针。可以方法对象中的成员变量或者成员方法

创建对象时,可以通过自定义构建函数完成变量的初始化和其他初始操作。

构建函数new()是系统预定义函数,不需要指定返回值,函数会隐式地返回实例化后的对象指针。

SV中通过new构造函数来创建对象,在创建对象的过程中,可以做一些初始化工作。new函数没有返回值,他的返回类型就是赋值表达式中左值的类型。如果没有自己定义new函数,那么SV会调用默认的new函数;一个派生类的new函数会先调用父类的new函数。

SV中可以将对象的指针赋予其他句柄,使得操作更灵活。

 

经过初始化以后,tr.addr的值为10.

句柄可以用来创建多个对象,也可以前后指向不同对象

静态方法

类似于静态变量,在class中定义的方法默认类型是动态方法,而我们也可以通过关键词static修改其类型为静态方法。静态方法内可以声明并使用动态变量,但是不能使用类的动态成员变量。原因是因为在调用静态方法时,可能并没有创建具体的对象,也因此没有为动态成员变量开辟空间,因此在静态方法中使用类的动态成员变量是禁止的,可能会造成内存泄漏,但是静态方法可以使用类的静态变量,因为静态方法同静态变量一样在编译阶段就已经为其分配好了内存空间。

通过句柄或者类名+双冒 索引

2.类的成员

类是成员变量和成员方法的载体,一个类的功能应该尽可能简单,不应承担过多的职责,这在设计模式种称之为单一职责原则(SPR  single Responsibility Principle)。类作为载体,其属性和方法被封装在内部,不会将成员变量暴露给外部,通过protected和local关键词来设置成员变量和方法的外部访问权限。即通过local和protected修饰的变量不能从外部通过句柄访问。

如果没有声明访问类型,那么成员的默认类型是public,子类和外部均可以访问成员。

如果声明为访问类型为protected,那么只有该类或者子类可以访问成员,外部无法访问。

如果声明为访问类型为local,那么只有该类可以访问成员,外部无法访问。

 访问类型的设定是为了更好的封装类,尤其是要发布供他人使用的软件包,对于初学者以及使用范围较窄的验证环境,可以使用默认的访问类型。

2.1类与结构体的异同:

二者本身都可以定义数据成员
类变量在声明之后,需要构造(construction) 才会构建对象(object) 实体,而struct在变量声明时已经开辟内存。
类除了可以声明数据变量成员,还可以声明方法(function/task) ,而struct则不能。
从根本来讲,struct仍然是一 种数据结构, 而class则包含了数据成员以及针对这些成员们操作的方法。

2.2类与模块(module) 的异同:

从数据和方法定义而言,二者均可以作为封闭的容器来定义和存储。

从例化来看,模块必须在仿真一开始就确定是否应该被例化,这可以通过generate来实现设计结构的变化;而对于类而言,它的变量在仿真的任何时段都可以被构造(开辟内存)创建新的对象。这一-点重要区别, 按照硬件世界和软件世界区分的观点来看,硬件部分必须在仿真一开始就确定下来, 即module和其内部过程块、变量都应该是静态的(static) ;而软件部分,即类的部分可以在仿真任何阶段声明并动态创建出新的对象,这正是软件操作更为灵活的地方。
从封装性(encapsulation) 来看,模块内的变量和方法是对外部公共(public) 开放的,而类则可以根据需要来确定外部访问的权限是否是默认的公共类型、或者受保护类型(protected) 还是私有类型(local)从继承性(inheritance) 来看,模块没有任何的继承性可言,即无法在原有module的基础上进行新module功能的扩展,唯一可支持的方式恐怕只有简单的拷贝和在拷贝的module_上做修改,而继承性正是类的一大特点。

2.3关于类的思考

类可以在哪里定义:module、interface、program、package等所有的“盒子”。

类作为一种数据载体,可以在类中再声明类成员。

●What is thisbr> ●如果在类中使用this,即表明this.X所调用的成员是当前类的成员,而非同名的局部变
量或者形式参数等。
function new (string name) ;
this. name = name;
endfunction
类有编译顺序吗br> ●有的!应该先编译基本类,再编译高级类。或者说,先编译将来被引用的类,再编译
引用之前已编译类的类。

3.类的继承

3.1对父类方法的调用——super

通过extends对子类进行定义,在子类中通过super对父类中方法进行调用

3.2成员覆盖

在父类和子类里,可以定义相同名称的成员变量和方法(形式参数和返回类型也应该相同),而在弓|用时,也将按照句柄类型来确定作用域。
 

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年6月18日
下一篇 2022年6月18日

相关推荐