SystemVerilog类与继承

时间:2022-07-22
本文章向大家介绍SystemVerilog类与继承,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

01

1.类的概述

类是一种封装了数据和操作这些数据的子程序;

一个数据包可能被定义为一个类,类中可以包含指令、地址、队列、数据等;

class Transaction;   //简单的类
    bit[31:0]addr,crc,data[8];

    function void display;
        $display("Transaction:%h",addr);
    endfunction:display

    function void calc_crc;
        crc=addr^data.xor;
    endfunction:calc_crc
endclass:Transaction

2.OPP术语

类(class):包含成员变量和成员方法;verilog对应模块(module);

对象(object):类在例化后的一个实例;verilog中需要例化一个模块才能使用;

句柄(handle):指向对象的指针;

3.构建函数

new函数:

例化对象实体时为其开辟内存空间;

对内部成员变量初始化;

执行完之后返回指向类对象的句柄;

new函数不能有返回值;

class Packet;
    integer command;
    function new();   //构造new函数
        command=IDLE;
    endfunction
endclass
Packet p;  //创建一个句柄
p=new();//  为Packet分配地址,调用Packet中的new函数

new()和new[]区别

相同点:都申请内存并初始化变量;

不同点:调用new()仅创建一个对象,而new[]则建立一个含有多个元素的数组;

new()可以使用参数设置对象的数值,而new[]只需使用一个数值来设定数组大小;

4.使用对象

对对象使用“.”符号来引用变量和子程序;

Transaction  p;//创建一个Transaction的句柄
p=new();            //为对象Transaction分配空间
p.addr=32'h16;  //初始化变量值
p.display();  //调用一个子程序

5.静态变量

如果多个对象共享有一个成员(变量/方法),可以添加关键字static;

class Packet;
    static integer file =$fopen("word",r);
   ……
endclass
Packet t;
data=$fgetc(t.file);  //或者Packet::file  ::为类作用域操作符

6.this

this用来明确索引当前所在对象的成员(变量/参数/方法);

this只可以在类的非静态成员方法、约束、覆盖组中使用;

this可以明确所指变量的作用域,避免变量所指不清楚;

class Bug;
    integer  z;   //Bug类的成员变量x
    function new(integer z);   //构建函数new的参数z
        this.z=z;     //为了区分z,在new函数中通过this.z索引对象的成员变量
    endfunction
endclass

7.句柄传递

区别对象和对象的句柄:

通过声明一个句柄来创建一个对象;

在一次仿真中,一个句柄可以指向多个对象;

在创建对象之后,指向该对象的句柄可以有多个;

为多个对象分配地址

Transaction t1,t2; //声明两个句柄
t1=new(); //例化对象,将new函数返回的句柄赋值于t1
t2=t1;  //将t1值赋值给t2 ,即t1和t2都指向同一个对象
t1=new();  //例化第二个对象,将其句柄赋值给t1
//所以最后t1和t2分别指向了不同的对象

8.赋值和拷贝

声明变量和创建对象是两个过程,也可一步完成;

Packet p1;
p1=new;

如果将p1赋值给另一个变量p2,那么依旧只有一个对象,只是指向这个对象的句柄有p1和p2;

对象的拷贝:

Packet p1;  //p1、p2指向两个不同的对象
Packet p2;  
p1=new;  
p2=new p1;  创建p2对象时,将从p1拷贝其成员变量(整数、字符串、句柄等)

02

类的继承

1.概述

继承允许从一个现存的类得到一个新的类并共享其变量和子函数;

原始的类称为基类或者超类,新类称为扩展类;

子类可以继承父类的成员;

父类句柄可以指向子类的对象;

LinkedPacket zl=new;   //  zl子类句柄  父类句柄fl
Packet fl=zl;

2.super

super用来访问当前对象的父类成员;

当子类成员与父类成员同名,需要使用super来指定访问其父类成员;

class Packet ; //父类
    integer value;
    function integer delay();
        delay=value*value;
    endfunction
endclass

class LinkedPacket extend Packet;// 子类
     integer value;
     function  integer delay();
        delay=super.delay()+value*super.value;//super访问子类的父类同名的delay、value
    endfunction
endclass

END