【SystemVerilog基础】5.类

类和对象的概述

1、面相对象编程的三要素:封装、继承和多态

类的作用是封装。类的定义核心是属性声明和方法定义,所以类是数据和方法的自洽体,可以保存数据和处理数据,这是和struct结构体最重要的区别。结构体只是数据的集合,类可以对数据做出符合需要的处理。二者都可以定义数据变量,但是类在声明之后进行构造才会有实体,struct在声明的时候就已经开辟内存

2、为什么验证需要OOP

因为验证环境的不同组件所需要的功能和所需要处理得数据内容是不一样的,但是不同环境下的同一类型的组件所具备的功能和数据内容是相似的。所以验证世界的各个组件角色明确、功能分立,和使用面相编程构建验证世界的原则十分符合。

3、OOP的要素

Class类:基本模块包含成员变量和方法,理解为软件的盒子

Ojbect对象:类的实例

Handle句柄:用来指向对象的指针,Verilog通过层次化的索引找到结构中的设计实例,SV里面通过句柄来索引对象的变量和方法

Property属性:类中声明的存储数据的变量

Method方法:类中可以使用task和function来定义方法。

4、Verilog中例化和SV Class例化的差别

共同点在于使用相同的‘模板'来创建内存实例;不同点在于Verilog的例化是静态的,即在编译链接时完成,而SV class的例化是动态的,可以在任意时间点发生,这也使得类的例化方式更加灵活和节省空间。Verilog中没有句柄的概念,即只能通过层次化的索弓|方式,而SV class通过
句柄可以将对象的指针赋予其它句柄,使得操作更加灵活。

Transaction tr;//声明句柄
 tr = new();   //创建对象

创建对象开辟了空间,可以用来存放新的方法和成员变量,构建函数new()是系统预定义函数,不需要指定返回值,函数会隐式的返回例化后的对象指针。构建函数可以定义多个参数作为初始化时外部传入数值的手段:

function new(logic [31:0] a=3, d=5);
    ............
endfunction

5、句柄的传递

创建对象后,该对象的空间位置不会更改,但是指向该空间的句柄可以有很多个。

Transaction t1 , t2 ; 
    t1 = new();    //例化对象,将其句柄赋予t1
    t2 = t1;       //将t1的值赋予给t2,t1和t2同时指向一个对象
    t1 = new();    //例化第二个对象,将其句柄赋予t1

6、对象的销毁

 SV采用自动回收空间的处理方式,当一个对象在整个程序中没有任何一个地方需要他的时候,便会被销毁,收回空间。这里的需要指的是有句柄指向该对象。

7、句柄的使用

 8、静态变量

class中声明的变量默认为动态变量,生命周期为仿真开始后的某时间点开始到某时间点结束。使用关键词static来声明变量,则声明为静态变量,生命周期为整个仿真阶段,开始于编译阶段。

引用静态变量:class::var 或者 object.var,共享一个静态变量需要注意共享资源的保护。

9、静态方法

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

10、类之外定义方法

先定义类,然后在类中使用“extern+方法”,随后在类外围方法名前加上类名::

class Transaction;
    ..............
    extern function void display();
endclass
    
function void  Transaction::display();
     ..........
endfunction

11.在一个类中使用另外一个类

通过句柄的传递,一个类的内部可以包含另外一个类 ,最外层的类可以通过分层调用语法来调用其他类中的成员,但是一定要记得例化,否则句柄是null的话,会调用失败。

类的成员

类是成员变量和成员方法的载体,类作为载体,天生的封闭属性,它的属性和方法封装在内部,不会直接把成员变量暴露给外部。理解类的单一职责原则和开放封闭原则。

1、访问类型

public:子类和外部均可以访问成员,这也是默认类型

local:只有该类可以访问成员,子类和外部均不可以访问

protected:只有该类的子类可以访问成员,外部无法访问

2、class和module的异同

相同点:均可以作为封闭的容器来定义和存储

不同点:例化方面,模块一开始就需要确定是否被例化,而类在任何时间段都可以被例化,可以理解为module内部的都应该是静态的,而class可以在仿真的任何阶段声明然后动态的创建新的对象;封装性方面,module内部的变量和方法都是public的,而class可以设置为public、local还是protected。

继承性方面,模块没有任何的继承性而言,无法做任何扩展。而继承性则是类的一大特点。

3、类定义的地方

module、interface、program、package = “所有的盒子”

4、this和super

this代表当前实例,由近到远   this.name表示内容:第一优先的是当前类的成员变量,第二优先的是父类的成员变量

super在子类中先调用父类的犯法,在使用子类的方法。

类的继承

有子类(派生类)和父类(基类)之分,子类继承了父类的成员变量和成员方法。子类在定义的new的时候,应该首先调用父类的new函数,即super。new()。子类的实例对象在初始化的时候首先会调用父类的构造函数,当父类的构造函数完成时,会将子类实例对象的中的各个成员变量按照他们的定义时显式的初始化,如果没有默认值则不会被初始化,在成员变量赋值结束以后,才会进入new函数中执行剩余的初始化代码。

1、成员覆盖

但是在类定义里,父类和子类拥有同名的变量和方法也是允许的。当子类作用域中如果出现同父类相同的变量名或者方法名,则以子类作用域为准。同时我们也提供方法(super) 来调用父类的变量或者方法。默认情况下,如果没有super或者this来指示作用域,则依照从近到远的原则来引用变量即:首先看变量是否是函数内部定义的局部变量,其次看变量是否是当前类定义的成员变量,最后再看变量是否是父类或者更底层类的变量。

句柄的使用

1、句柄的传递

句柄可以作为形式参数通过方法来完成对象指针的传递,从外部传入方法内部。句柄也可以在方法内部首先完成修改,然后再由外部使用

 2、句柄的动态修改

在执行程序时候,可以在任何时刻为句柄创建新的对象并将新的指针赋值给句柄。在任务中修改句柄需要加ref关键词,尤其是句柄,没有声明为句柄的话,在方法内部对句柄的修改不会被调用该方法的代码看见。除此之外还可以在程序中修改对象

task generate_trans ();
    Transaction t;
    Transaction  fifo[$];
    t = new();
    for (int i=0;i<=3;i++) begin
        t.addr = i<<2;
        fifo.push_back(t);
      end
    t = fifo.pop_front();
endtask

3、对象的复制

使用new操作符来复制一个对象,这是使用简单的new函数的内建拷贝功能。

包的使用

package是将命名空间分隔开来,即使是使用不同package的同名类,只需要注明是使用哪个package中的就可以了

包的意义:将一个相关的类组织在单一的命名空间下,使得分属于不同模块验证环境的类来自于不同的package,可以通过package来解决类的归属问题。

在包中可以定义类、静态方法和静态变量,如果将类封装在某一个包中, 那么它就不应该在其它地方编译,这么做的好处在于之后对类的引用更加方便。类和包是好朋友,包是类的归宿,类是包的子民。一个完整模块的验证环境组件类,应该由一个对应的模块包来封装。使用` include的关键词完成类在包中的封装,要注意编译的前后顺序来放置各个`include的类文件。编译一个包的背后实际是将各个类文件“平铺"在包中,按照顺序完成包和各个类的有序编译。使用类的可以通过`import完成包中所有类或者某一个类的导入, 使得新的环境可以识别出该类,否则类会躺在包这个盒子里不被外部识别。

 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值