前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SystemVerilog类与继承

SystemVerilog类与继承

作者头像
数字芯片社区
发布2020-07-20 16:00:39
1.1K0
发布2020-07-20 16:00:39
举报
文章被收录于专栏:数字芯片数字芯片

01

1.类的概述

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

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

代码语言:javascript
复制
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函数不能有返回值;

代码语言:javascript
复制
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.使用对象

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

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

5.静态变量

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

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

6.this

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

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

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

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

7.句柄传递

区别对象和对象的句柄:

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

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

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

为多个对象分配地址

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

8.赋值和拷贝

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

代码语言:javascript
复制
Packet p1;
p1=new;

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

对象的拷贝:

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

02

类的继承

1.概述

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

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

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

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

代码语言:javascript
复制
LinkedPacket zl=new;   //  zl子类句柄  父类句柄fl
Packet fl=zl;

2.super

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

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

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数字ICer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.类的概述
  • 2.OPP术语
  • 3.构建函数
    • new()和new[]区别
    • 4.使用对象
    • 5.静态变量
    • 6.this
    • 7.句柄传递
    • 8.赋值和拷贝
    • 类的继承
      • 1.概述
        • 2.super
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档