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
- 基于Windows下python环境变量配置
- 【机器学习笔记之七】PCA 的数学原理和可视化效果
- 2017"百度之星"程序设计大赛 - 复赛1005&&HDU 6148 Valley Numer【数位dp】
- 【专知-关关的刷题日记20】Leetcode 119. Pascal's Triangle II
- 2017"百度之星"程序设计大赛 - 复赛1003&&HDU 6146 Pokémon GO【数学,递推,dp】
- 2017"百度之星"程序设计大赛 - 复赛1001&&HDU 6144 Arithmetic of Bomb【java大模拟】
- Java面向对象抽象类实例练习
- 经典JS闭包面试题
- Java面向对象接口的应用实例练习
- 【机器学习笔记之八】使用朴素贝叶斯进行文本的分类
- 【Java学习笔记之二十二】解析接口在Java继承中的用法及实例分析
- 扫一扫二维码就能打开网站,就能添加联系人,就能链接wifi(续)
- Java面向对象抽象类案例分析
- 【Java学习笔记之二十三】instanceof运算符的用法小结
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mybatis高级查询(三):分页查询
- 以OpenResty搭建RTB竞价引擎接入层
- 优化Linux bootloader速度的究极之路:从GRUB到EFI Stub
- Linux--nc命令
- Netty之美--I/O模型
- 023.基于IT论坛案例学习Elasticsearch(二):Query高级知识(一)
- 打卡群刷题总结0807——验证二叉搜索树
- 打卡群刷题总结0808——二叉树的层序遍历
- Mybatis高级查询(四):延迟加载
- I/O多路复用器之隐秘的角落
- 打卡群刷题总结0809——二叉树的锯齿形层次遍历
- 简单的ssm整合练手项目:汽车项目
- 在spring-boot中使用pageHelper插件
- 要深入 JavaScript,你需要掌握这 36 个概念
- mybatis-plus实现增删改查