为了实现一个类的不同对象之间的数据和函数共享_SystemVerilog类与继承

5630259be4ac02c8da56c8a9be1b6c98.png

一、类(class)与对象

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拷贝其成员变量(整数、字符串、句柄等)

二、类的继承

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值