首页 > 其他分享 >SV/UVM 类的多态和虚方法解析

SV/UVM 类的多态和虚方法解析

时间:2024-07-09 09:28:12浏览次数:13  
标签:函数 endfunction hometown 多态 SV UVM animal print bird

        类具有三大特性:封装/继承/多态,多态是面对对象编程中最神奇的特征,也是最抽象和难以理解的特征。对于初学者来说,最好对sv有了一定了解,在掌握了封装和继承之后再学习多态会更容易理解。

1.类的继承

        首先复习一下继承的概念:继承是利用共性构建一个基类(父类),在此基础上将问题分类,不同的分类具有各自的共性,使用这些分类的共性构建一个派生类(子类)。

class bird extends animal;
function new();
 super.new();
 category = "bird";
endfunction
endclass

        继承的优点在于方便,子类从父类派生后天然具有父类所有特征:父类的成员变量也是子类的成员变量,父类的成员函数也是子类的成员函数。当然,子类也可以自己定义额外的成员变量和系统函数。

        需要注意的是,如果父类中某成员类型是local,那么子类也不可以对其访问。local类型变量只有当前类可以访问,protected类型变量可以供父类子类访问而不被外部访问。

2.类的多态

        假设animal中存在函数:

class animal;
 function void print_hometown();
 $display("my hometown is earth!");
 endfunction
endclass

        同时在bird和nobird类中也有自己的函数:

class bird extends animal;
 function void print_homwtown();
 $display("my hometown is sky!");
 endfunction
endclass


class nobird extends animal;
 function void print_homwtown();
 $display("my hometown is land!");
 endfunction
endclass

现在有一个名字为print_animal的函数:

function automatic void print_animal(animal p_animal);
 p_animal.print();
 p_animal.print_hometown();
endfunction

该函数的参数是一个animal类型的指针,如果我们实例化一个bird,并传递给函数,当然是完全可以的:

initial begin
 bird members[20];
 members[0] = new();
 members[0].init("parrot",20091021,"bird",20,1);
 print_animal(members[0]);
end

但是这样打印出来的结果会是“my hometown is earth”,而不是希望的“my hometown is sky”。为了得到想要的结果,我们可以进行类型转换:

function automatic void print_animal2(animal p_animal);
 bird p_bird;
 nobird p_nbird;
 p_animal.print();
 if($cast(p_bird,p_animal))
   p_bird.print_hometown();
 else if($cast(p_nbird,p_animal))
   p_nbird.print_hometown();
endfunction

        从父类向子类的类型转换需要通过cast系统函数进行,但是反过来子类向父类的类型转换可以自动完成,如调用print_animal时,members[0]是bird类型,系统自动将其转成animal类。这种做法虽然实现了目标,但是非常冗余复杂,并且不具备可重复性,如果有更多类型,岂不是需要一个一个进行定义,修改函数非常麻烦。那么有什么办法可以自动解决呢?

3.虚函数

        答案就是虚函数,在定义函数前只需要在前面加上virtual关键字:

class animal;
 virtual function void print_hometown2();
 $display("my hometown is earth!");
 endfunction
endclass

class bird extends animal;
 virtual function void print_hometown2();
 $display("my hometown is sky!");
 endfunction
endclass

class nobird extends animal;
 virtual function void print_hometown2();
 $display("my hometown is land!");
 endfunction
endclass

在print_animal3中调用该函数:

function automatic void print_animal3(animal p_animal);
 p_animal.print();
 p_animal.print_hometown2();
endfunction

        在initial语句中将members[0]传递给此函数后,打印出来的结果就变成了我们想要的“my hometown is sky”。同理如果实例化一个nobird,结果就会变成“my hometown is land”。在print_animal3中,调用同样的函数,输出了不同的结果,表现出了不同形态,这就是多态。而多态的实现需要依赖虚函数。

标签:函数,endfunction,hometown,多态,SV,UVM,animal,print,bird
From: https://blog.csdn.net/zangzangbupei/article/details/140270461

相关文章

  • 【SVN】 设置过滤上传文件
    项目级过滤文件1.1在项目空白处,右键选择SVN-Properties1.2New->Other->新建一个“svn:global-ignores”属性1.3查看效果选中上传项目,右键-》SVN->Add如图所示,.vs、bin、obj文件都过滤了全局过滤文件配置2.1在项目工作根目录上,右键->TortosieSVN->Settin......
  • Java--多态
    1.多态为同一方法根据发送对象的不同而采用多种不同的行为方式2.一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多3.多态存在的条件    1.有继承关系    2.子类重写父类方法    3.父类引用指向子类对象4.多态是方法的多态,属性没有多......
  • SVN 80道面试题及参考答案(2万字长文)
    目录解释SVN的全称和主要功能。SVN与CVS相比,有哪些主要改进?描述SVN的工作流程。什么是版本库(repository)?它存储了什么?解释工作副本(workingcopy)的概念。SVN如何处理文件的版本控制?SVN中的“commit”是什么意思?解释“update”操作的作用。如何查看一个文件的历史版......
  • [UVM]IC验证自动结束仿真函数——uvm_top.set_timeout/set_report_max_quit_count
    Title:[UVM]IC验证自动结束仿真函数——uvm_top.set_timeout/set_report_max_quit_count文章目录1-前言2-uvm_top.set_timeout3-set_report_max_quit_count4-运用5-小结1-前言​数字IC验证过程中,需要运行不同Testcase,有些TC会因为TC配置、TB机制等原因,导致m......
  • libaom 编码器实验 AV1 标准 SVC 分层编码
    SVC编码视频SVC编码,即ScalableVideoCoding(可适性视讯编码或可分级视频编码),是H.264/MPEG-4AVC编码的一种扩展,它提供了更大的编码弹性,并且具有时间可适性(TemporalScalability)、空间可适性(SpatialScalability)及讯杂比(质量)可适性(SNRScalability)三大特性。这种编码方式允......
  • 支持向量机(Support Vector Machine,SVM)
    支持向量机(SupportVectorMachine,简称SVM)是一种监督学习模型,主要用于分类和回归分析。SVM的基本思想是寻找一个决策边界或超平面,使得两类样本之间的间隔最大化。这个间隔被定义为支持向量到超平面的最短距离,而支持向量就是那些恰好位于间隔边缘上的训练样本点。线性可分......
  • Java笔试|面试 —— 对多态性的理解
    谈谈对多态性的理解:一个事物的多种形态(编译和运行时状态不一致性)实现机制:通过继承、重写和向上转型(Objectobj=new子类())来实现。1.广义上的理解子类对象的多态性,方法的重写;方法的重载;子类对象的多态性:编译时是父类对象,运行时是不确定的子类对象。(体现不一致性)......
  • 将svg格式的图片转为png格式的图
    ""D:\桌面\素材2-副本\coffee.svg"先安装Python中的cairosvg库pipinstallcairosvgimportcairosvgdefconvert_svg_to_png(svg_file_path,png_file_path):"""将SVG文件转换为PNG文件。:paramsvg_file_path:SVG文件的路径。:paramp......
  • Day10-面向对象-继承和多态
    继承和多态Day10面向对象-继承2.继承2.1继承的好处2.2继承的语法2.3继承的特点一:成员变量2.3.1私有化(private)2.3.2成员变量不重名2.3.3成员变量重名(实际开发中不推荐这样做)2.4继承的特点二:成员方法2.4.1成员方法不重名2.4.2成员方法重名——重写(Override)......
  • 【Java探索之旅】多态:重写、动静态绑定
    文章目录......