sv面向对象:类

2023-10-27

写在前面:开始修炼

类是通过代码怎么体现?

实例1:定义一个类

//systemverilog绿皮书
//例5.1简单的 Transaction类
class Transaction;
    bit [31: 0] addr, crc, data[8];//class properities

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

    function void calc_crc:
        crc=addr^data. xor;
    endfunction: calc_crc
endclass: Transaction
  • 类封装了数据和对数据的操作(定义一个类就体现了类的封装性
  • 类中的数据称为属性( properties)
  • 类中对数据的操作子程序称为方法( methods) 

实例2:创建新的对象

Transaction b;// 声明一个句柄b
b=new();       //调用new()函数创建一个对象
  •  声明一个句柄b。

该句柄描指向一个 Transaction 类型的对象。当声明一个句柄时,它的初始值为null

  • 调用new()函数创建一个对象。new()函数就是构造函数,创建对象空间

调用new函数时,系统会分配一块内存空间,用于存储对对象中得变量。

  1. new函数分配内存空间,存放Transaction的实例
  2. 将实例中的变量值初始化,默认情况下,二值逻辑变量初始值为0,四值逻辑变量的初始值位x
  3. 返回存放实例的地址(指针pointer)

 实例总结:

实例1和实例2组合起来就满足了类的基本特征

因此,使用一个类就包括三步:定义一个类、声明一个句柄、创建一个对象

而实例中包括一些基本概念,看下面描述。

面向对象的基本概念

  • 类 class

◆编码元素,包含所有的属性和功能

◆将数据和对数据的操作封装在起 Encapsulates

◆提供建立对象的模板

◆可以看做一种数据结构

  • 对象 Object

◆对象 object是类class的实体

  • 句柄 Handle

◆类型安全的指向对象( object)的指针( pointer)

  • 属性 Properties

◆类( class)的实体( object)中包含的各种变量( variables)

  • 方法 Methods

◆操作变量的任务(task)和函数( function)

面向对象编程的基本术语

面向对象编程的优势

  • 传统的编程:分开处理数据结构和算法
  • 面向对象编程:通过封装的方式对数据进行组织和管理

◆类( class)封装了数据和对数据的处理算法

◆对象( object)是一个类的实例

◆类( class)是有成员( members)组成的

◆成员( members)可以是属性( properties)(数据或者变量)或者方法( methods)(任务task或函数 function)

  • OOP具有继承的特性-允许对已经存在的类的成员进行扩展
  • OOP具有多态的特性一在运行时将数据和函数进行绑定 

类中的一些常识:

  • 释放句柄指向的对象的内存空间

◆如果没有句柄指向个对象, Systemverilog将释放该对象的内存空间

◆当句柄指向一个对象时, SystemVerilog不会释放该对象的内存空间

◆将句柄设置为null,将手动释放所有的句柄

  • 重新new()一下,就会重新开辟内存空间

  • 在一个类中可以使用另外一个类(多层嵌套)

  • 使用层次化语法hierarchical

句柄的使用

shallow copy浅复制(指向同一个内存空间 )

获得对象的句柄

◆类的属性和实例化对象可以在类声明时直接被初始化
浅复制不会复制嵌套的对象(只是复制了句柄)
◆可以通过点号“.”操作符对对象中的变量进行操作,比如b1.aj
◆可以通过手动编写代码实现对所有变量的全复制,包括嵌套的对象

Transaction b1,b2;//声明两个句柄b1,b2
b1=new;            //给b1分配内存空间
b2=new;            //给b2分配内存空间
b2.copy(b1);       //深复制,其中一个改变,不会影响另外一个

好,我们讲这个句柄讲的挺多的了,我给大家看一个例子。(这就是E课网中的原话,就喜欢听这句话,路桑的全是蓝字,小白很0.0)

实例:class_t.sv

//class_t.sv
//E课网
program class_t;
	//Class with constructor,with no parameter
	class  A;
	integer j;
	//Constructor
	//Task in class(object method)
	endclass
	//Class with constructor,with no parameter
	class  B;
		integer i;
		A a=new;
		//Constructor
		//Task in class(object method)
		function copy(B in);
			this.i=in.i;    //父类B中的i
			this.a.j=in.a.j;//父类B中父类A中的j
		endfunction
	endclass
	
	initial begin
		B b1 = new;
		B b2 = new;
		b2 = b1;//shallow copy
		//b2.copy(b1);//deep copy
		b2.a.j=50;
		$display("b2.a.j=%0d\nb1.a.j=%0d",b2.a.j,b1.a.j);
	end
endprogram
运行shallow copy的仿真结果:b2.a.j=50,b1.a.j=50

运行deep copy的仿真结果:   b2.a.j=50, b1.a.j=x

静态变量

Systemverilog中允许在类中声明一个静态变量

  • 静态变量跟类的定义相关,跟实例对象无关
  • 静态变量用于存储可变数据,如创建的实例的数量
  • 静态变量被类的所有对象共享

oop:继承inheritance

  • 在原有的类的基础上增加新功能
  • 单一继承:修改一个类的当前功能

◆在派生类中使用关键字" super"可以引用基类中的成员

◆如果在派生类中修改了基类中的成员,这必须使用关键字" 'super'获取基类的相关成员

实例:class_extend_example. sv

//systemverilog与功能验证(钟文枫)
//Chapter7 class_extend_example. sv
class Packet;
	//属性
	integer status;
	
	//方法
	task rst();
		status =0
	endtask
endcalass

Class DerivedPacket extends Packet;
	//属性
	integer a,b, c;
	/方法
	task showstatus ();
		$display(status);
	endtask
endclass

数据保护:本地变量 local


派生类不能操作基类中的本地变量(local)

 

 

抽象类和虚方法

oop:多态与虚方法直接关系

多态总结:实方法看句柄 ;虚方法看对象

实例:virtual_method.sv

//virtual_method.sv
//E课网
class A;
	virtual task disp();
		$display("This is class A");
	endtask
endclass

class EA extends A;
	task disp();
		$display("This is Extended class A");
	endtask
endclass

program main;
	EA my_ea;//声明一个EA句柄my_ea;
	A my_a;  //声明一个A 句柄my_a;

	initial begin
		my_a = new;//给my_a创建一个对象
		my_a.disp();//调用my_a的task
		
		my_ea = new;//给my_ea创建一个对象
		my_a=my_ea;//浅复制,句柄改变
		my_a.disp();//调用my_ea的task
	end
endprogram

仿真结果如下: 

This is class A
This is Extended class A
这是虚方法,因此只看对象

实例:basic_method.sv 

//basic_method.sv
//E课网
class A;
	task disp();
		$display("This is class A");
	endtask
endclass

class EA extends A;
	task disp();
		$display("This is Extended class A");
	endtask
endclass

program main;
	EA my_ea;//声明一个EA句柄my_ea;
	A my_a;  //声明一个A 句柄my_a;

	initial begin
		my_a = new;//给my_a创建一个对象
		my_a.disp();//调用my_a的task
		
		my_ea = new;//给my_ea创建一个对象
		my_a=my_ea;//浅复制,句柄改变
		my_a.disp();//调用my_ea的task
	end
endprogram

仿真结果如下: 

This is class A
This is class A

实例:class_extern_methods.sv(这些宏?)

//class_extern_methods.sv
//E课网
`ifndef CLASS_EXTERN_SV
`define CLASS_EXTERN_SV

`include "class_extern.sv"

function class_extern::new();
	this.address=$random;
	this.data ={$random, $random};
	this.crc =$random;
endfunction

task class_extern::print();
	$display("Address : %x", address);
	$display("Data    : %x", data);
	$display("CRC     : %x", crc);
endtask
`endif

//class_extern.sv
//E课网
`ifndef CLASS_EXTERN_SVI
`define CLASS_EXTERN_SVI
class class_extern;
	int address;
	bit [63:0] data;
	shortint crc;
	
	extern function new();
	extern task print();
endclass
`endif
仿真结果:b2.a.j=50,b1.a.j=x
 

参数化类​  

通用的类是很有用的,特别是在例化的时候可以修改数组的大小和数据类型。为了避免为每个特定的类编写类似的代码, SystemVerilog也支持参数化类,就如C++中的模板。

写到最后:好好修炼

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sv面向对象:类 的相关文章

随机推荐

  • 蓝桥杯 调手表【第九届】【决赛】【B组】

    比较简单的题 看到网上题解基本都是bfs解法 发个贪心解法记录一下 include
  • VSCode格式化XML

    VSCode格式化XML 文章目录 VSCode格式化XML 1 结果展示 2 插件 notepad 自带的xml插件不是很好用 显示xml树的插件经常失灵 尝试在VSCode上找到了一些插件 很好的解决了XML的格式化和XML节点显示的问
  • 【华为OD机试真题 Python】数组二叉树

    前言 本专栏将持续更新华为OD机试题目 并进行详细的分析与解答 包含完整的代码实现 希望可以帮助到正在努力的你 关于OD机试流程 面经 面试指导等 如有任何疑问 欢迎联系我 wechat steven moda email nansun09
  • HashMap底层原理分析(结合面试问题分析)

    1 为什么HashMap底层数组的容量总是2的幂次方 答 因为hashmap的底层在计算一个entry存放在数组中的索引值的时候 采用哈希值运算 如果经过哈希算法得到的一个哈希值h的后面的二进制表示为 0101 0101 此时的数组的长度l
  • 软件构造总结笔记

    软件构造总结笔记 本笔记依据考试大纲 调整课堂讲义的分点 以知识点分化作为条理 精简原本人课堂笔记 进行总结 GitHub仓库资源 gzn00417 2020Spring Software Construction 文章目录 软件构造总结笔
  • 记一次某src得子域名接管漏洞挖掘

    如下案例是fofa找的 在火线资产里直接搜索关键词html noSuchbucket 可以看到显示如下信息
  • 无损剪切音视频文件的跨平台工具: LosslessCut

    mifi lossless cut Stars 17 3k License GPL 2 0 LosslessCut是一款跨平台的FFmpeg GUI工具 它可以对视频 音频和字幕等相关媒体文件进行快速无损操作 该软件最主要的功能是无损剪切和
  • 初识网络原理

    确定不来看看新出炉的知识 目录 1 网络互连 1 1局域网 1 2广域网 2 网络通信基础 2 1IP地址 2 2端口号 3 认识协议 3 1五元组 3 2协议分层 3 3OSI 7层模型 3 4TCP IP5层 或5层 模型 3 5网络设
  • 请求参数默认值多种实现方式

    文章目录 1 直接赋值 2 使用切面实现默认值 自定义注解 切面类 控制层使用 效果展示 3 使用过滤器Filter实现 自定义请求体 自定义过滤器 1 直接赋值 当前页码 private int pageNum 1 每页条数 privat
  • idea快速清理无效类文件

    1 右击选中的项目 如下图所示 2 在弹出框中输入 unused declaration点击选择 如下图所示 3 弹出如下图所示 点击ok 此时需要一段时间 4 结果如下图所示 5 此时 一个个选中 然后双击 有4种处理模式 如下图所示 S
  • 基于Distflow的最优潮流模型(OPF)--模型推导篇

    开篇 前言 自打上期内容火电机组经济调度建模及求解 基础篇推出以后 有小伙伴留言 不考虑潮流问题的经济调度都是耍流氓 作为一个有文化的流氓 我们尝试着为大家科普潮流计算 对于电力系统而言 潮流计算是一个非常复杂且重要内容 如果我们推文中有什
  • 俞敏洪:与其有钱,不如值钱

    很多人一辈子有两个追求 一个是有钱 一个是值钱 有的人运气好 出生在富贵之家 一出生就像贾宝玉一样嘴里含着玉 有钱就不是问题 但有钱解决不了第二个问题 也就是你本人值不值钱的问题 值钱是个人价值的体现 比如你去找一份工作 人家给你开出百万年
  • 链表 List.h

    链表 List h include list h include
  • Android指纹门锁ESP32项目

    本教程中我向您展示如何使用指纹扫描仪Android手机通过ESP32或ESP8266 Wifi或Arduino wifi模块进行门解锁 要创建此项目 您需要ESP32 中继模块 电磁门锁和Android手机 所需零件 源代码 详情参阅 亚图
  • layUI 使用select选择框无法显示出样式,看不到、等解决方案

    我们在写layui代码时候可能遇到这样的问题 明明代码都是从layui官网上复制下来的 却还是会看不到相应的元素 就比如我昨天遇到的一个BUG 代码如上 但是页面上却没有显示出选择框 选择框这里却依然没有结果出现 这个问题困扰了我几个小时
  • js下载base64格式的图片

    步骤 1 创建一个a标签 2 给a标签创建点击事件 3 将base64数据转为Blob类型 4 将a标签的href指向Blob类型数据 5 触发a标签 代码 template vue qr 组件可以自动将 text绑定的url地址转换为二维
  • 【Python零基础入门篇 · 9】:字典的相关操作

    文章目录 字典 键 值 字典的基本格式 字典的定义 键值对 键的唯一性 字典的常见操作一 增删改查 查看元素 根据键名返回值 删除元素 del clear 修改元素 添加元素 字典中的常见操作二 len 求长度 dict keys dict
  • SQL语句:查询数据表的前n行信息

    每种数据库使用的关键字都不一样 每种数据库使用的关键字都不一样 每种数据库使用的关键字都不一样 SQL Server MS Access 语法 TOP SELECT TOP number percent column name s FROM
  • Java 模拟百度翻译

    相信百度翻译对于大家来说并不陌生 本案例要求编写一个程序模拟百度翻译 用户输入英文之后搜索程序中对应的中文 如果搜索到对应的中文就输出搜索结果 反之给出提示 package demo52 import java util HashMap i
  • sv面向对象:类

    写在前面 开始修炼 类是通过代码怎么体现 实例1 定义一个类 systemverilog绿皮书 例5 1简单的 Transaction类 class Transaction bit 31 0 addr crc data 8 class pr