《systemverilog验证》阅读笔记 -- 面向对象编程基础

  • 类可以定义在任意地方
  • OPP术语
  • 类的声明和实例化
  • 对象的解除分配
  • 使用对象
  • 静态变量和动态变量
  • this关键词
  • typedef class的用法

面向对象编程OPP,使用户能够创建复杂的数据类型,并且将数据和使用方法紧密结合在一起。
用户可以在更加抽象的层次下,建立测试平台和系统级模型,通过调用函数来执行一个动作(抽象出的模型更容易阅读),而不是改变信号的电平(太细节)。
这样做的好处:
1. 测试平台和设计细节分开;
2. 可靠而且易于维护;
3. 方便以后项目的重用。

类可以定义在任意地方

每个类最好保存在独立文件里。
类如果数目太大,可以采用package把类和类型定义捆绑在一起。

OPP术语

  1. 类class。包含变量和子程序的块。
  2. 对象object。类的一个实例。
  3. 句柄handle。指向对象的指针。
  4. 属性property。存储数据的变量。systemverilog对应的是变量(variable)
  5. 方法method。task或者function。
  6. 原型prototype。程序的头,包括程序名、返回类型和参数列表。内容,称为程序体。

类的声明和实例化

类的声明和实例化,推荐是分成两行。

Transaction Tr;//声明句柄,是一个指针变量。(形象举例,向政府申请一个门牌地址)
Tr = new();//为Transaction对象,分配地址。(形象举例,构造一个真实的房子;对应上一行的门牌地址。以后,门牌地址就对应这一个房子。)

new,是类的实例化,主要是对类的成员变量进行初始化,比如二态变量,默认值为0;四态变量,默认值为X。所以,在new构造函数里,可以改变类的成员变量默认值。如下所示:
《systemverilog验证》阅读笔记 -- 面向对象编程基础_第1张图片

对象的解除分配

句柄没用之后,可以删除对象,来释放内存空间,保证仿真速度。

Tr=null;
  • 不能回收一个被句柄引用的对象;
  • 对象里的子程序,其线程未结束;就不能回收相应的对象;

使用对象

只要声明并构造了一个类变量。那么就有了这一类的真实对象,可以用Tr.functionA、Tr.taskB、Tr.variableC,使用这个房子里的每一样物品了(默认都是public公共,如果local变量的话,只能类内部访问)。

静态变量和动态变量

  1. 静态变量,定义是用static关键词。访问是用::
    注意,要保证在创建第一个对象前,对静态变量进行初始化;
    另外,注意,在类的构造函数new()代码段,不能对静态变量初始化。
    所以,相同类,多次new之后,静态变量是可以作为这个类的全局变量使用的。
    同理,非静态变量,即动态变量,每次new之后,都会有其统一的默认初始值。相同类,多次new之后,动态变量是可以作为这个类的局部变量使用的。
    如下例:
    《systemverilog验证》阅读笔记 -- 面向对象编程基础_第2张图片

  2. 因为静态变量,是直接存储在内存里;所以访问类的静态变量,是不需要构造函数的,甚至不需要类的声明。如下例:
    《systemverilog验证》阅读笔记 -- 面向对象编程基础_第3张图片

  3. 静态方法,function和task,也是类似的道理。可以作为相同类的全局方法使用。

this关键词

如下例,this的作用,是指明变量是该层次类里的变量。而非function内部的内部变量。
《systemverilog验证》阅读笔记 -- 面向对象编程基础_第4张图片

typedef class的用法

默认,类的描述,是按照顺序去编译的。
然而,利用typedef class,可以预先定义类,而类的描述可以推后描述。比如下例:
《systemverilog验证》阅读笔记 -- 面向对象编程基础_第5张图片

你可能感兴趣的:(verilog)