首页 > 其他分享 >UVM Primer OOP前置部分(Chapter 6)

UVM Primer OOP前置部分(Chapter 6)

时间:2024-02-21 23:44:20浏览次数:42  
标签:Chapter sound 父类 子类 make UVM animal new Primer

资料:

-UVM Primer(英文原版)
-UVM Primer(中译版)

前言:

-本部分将包括UVM Primer的第4章-第9章,仅整理OOP特性,不会涉及DUT及验证平台构建的相关内容。

正文:

本书的4-9章以一个动物园为例,讲述了OOP的不同特性,包括:
-类
-继承
-多态
-静态变量和方法
-factory模式

第六章:多态

多态(polymorphism),简单的说就是具有多种形态,调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。

-In programming language theory and type theory, polymorphism is the use of a single symbol to represent multiple different types.

现在让我们从最初开始,通过分类的方法理解多态。

class animal;
    int age = 0;
    
    function new(int a);
        age = a;
    endfunction : new
    
    // A function with a fatal hint
    function void make_sound();
        $fatal(1,"General animals don't have noise!");
    endfunction : make_sound
endclass

这是一个普通的动物类,包含一切动物,包括会叫的和不会叫的。因此虽然类的内部定义了方法,但却不应该在总体的animal中使用。

那么还像之前那样,我们基于动物大类创造狮子类,并在其中重载make_sound()函数:

class lion extends animal
    
    function new(int age);
        super.new(age);
    endfunction
    
    // Override make_sound
    function void make_sound();
        $display("Lion Roar!");
    endfunction
    
endclass : lion

类似的,我们可以创造鸡类,并赋予其不同的叫声。值得注意的一点是,由于SV要求我们显式的写出带有参数的构造函数,不能简单的继承基类中的构造函数。

那如果我们创建一个狮子,然后使用animal_h句柄指向它呢?

animal_h = lion_h;
animal_h.make_sound();
$display("The animal is %0d years old", animal_h.age);

这时候,编译器会报错"General animals don't have noise!",这是由于编译器按照animal的类型调用了make_sound()

这个时候我们会想到,狮子显然是动物的一个子集,因此从逻辑上来说,使用animal_h句柄指向它是不应该有问题的。所以最根本的问题是,应该如何让编译器知道,我们想调用的是lion内的方法呢?

这时候,我们就可以将基类中的方法变为虚方法(virtual),这意味着,基类中的make_sound()方法仅起到指示作用,这会告诉编译器“后续继承的类中有这么个方法,但是需要子类自己去进行重载”,如果子类不进行重载,那么基类的fatal将会报错!

class animal;
   int age=-1;

   function new(int a);
      age = a;
   endfunction : new

   // Notice the virtual keyword
   virtual function void make_sound();
      $fatal(1, "Generic animals don't have a sound.");
   endfunction : make_sound

endclass : animal

如果更进一步,我们可以将animal定义为抽象类(virtual class),这意味着其只能作为基类,且无法例化;而抽象类内部的方法,可以定义为纯虚方法( pure virtual),这意味着编译器会要求子类强制重载这个方法,并将进行检查。

// Notice virtual class 
virtual class animal;
   int age=-1;

   function new(int a);
      age = a;
   endfunction : new

    // This is a pure virtual method now without fatal
   pure virtual function void make_sound();

endclass : animal

如果尝试例化抽象类,编译器会报错:

在这里,我在使用之前看到的一个帖子当作例子:

作者的疑问是,在句柄“A1”指向B1后,原先例化的基类A1的内存就应当被释放了,那么为什么A1还能够访问基类的方法呢?

这是由于在创建一个子类的实例时,子类会继承父类的属性和方法。这意味着子类的实例可以访问父类中定义的属性和方法。在访问这些属性和方法时,实际上是在子类的实例上执行操作,但是这些操作可能会涉及到父类中的属性和方法。

在没有显式创建父类实例的情况下,子类实例如何访问父类的属性和方法呢?这是因为在创建子类实例时,系统会隐式地为父类分配内存,并且子类实例中包含了父类的部分。这是通过子类的构造函数(通常是 new() 函数)来实现的。

具体来说,当你创建子类的实例时(例如 B B1 = new();),子类的构造函数会被调用。在子类的构造函数中,通常会隐式地调用父类的构造函数(通常是 super.new())。这样,父类的内存就被分配了,并且子类的实例中包含了父类的属性和方法。因此,子类实例可以通过自己的指针访问父类的属性和方法,因为这些属性和方法已经在子类实例中了。

标签:Chapter,sound,父类,子类,make,UVM,animal,new,Primer
From: https://www.cnblogs.com/harold-fey/p/18026431

相关文章

  • chapter4-字符串
    记录字符串常考的4种操作:遍历、加密、统计、匹配。1.字符串介绍C++提供了字符串(string)这种基本数据类型,它可以很方便地对字符串进行各种操作。使用需要添加头文件#include<string>。1.1字符串的构造字符串的构造包括定义和初始化两个部分,定义一个字符串的方式和定义其他基本......
  • UVM Primer OOP前置部分(Chapter 4-5)
    资料:-UVMPrimer(英文原版)-UVMPrimer(中译版)前言:-本部分将包括UVMPrimer的第4章-第9章,仅整理OOP特性,不会涉及DUT及验证平台构建的相关内容。正文:本书的4-9章以一个动物园为例,讲述了OOP的不同特性,包括:-类-继承-多态-静态变量和方法-factory模式第四章:OOP概述OOP的优点......
  • chapter3-排序和查找2
    2.基础查找所谓查找,就是在查找空间中找寻符合要求的解的过程。查找方法有多种,下面简单介绍3种。不同的策略对查找的效率和结果有不同的影响。2.1线性查找从首元素开始,遍历整个序列,直到找到目标元素,则结束算法;或者遍历完序列还没有匹配,则查找失败结束算法。时间复杂度为O(n)。......
  • chapter3-排序和查找
    1.排序排序就是把一组无序的数据变成有序的过程。对于机试而言,直接使用C++封装好的sort函数就可以了。sort函数内部采用快速排序实现,因此非常高效。使用sort函数,需要引用#include<algorithm>头文件,sort(first_address,last_address,compare)有三个参数,first和last待排序序列的......
  • C++Primer
    前言固然,轻薄短小的书籍乍见之下让所有读者心情轻松,但如果舍弃太多应该深入的地方不谈,也难免令人行止失据,进退两难。……作为一个好的学习者,背景不是重点,重要的是,你是否具备正确的学习态度。起步固然可从轻松小品开始,但如果碰上大部头巨著就退避三舍、逃之夭夭,面对任何技术只......
  • uvm error catcher
    classuvm_err_catcherextendsuvm_report_catcher;sringdemote_error_str[$];functionnew(stringname="uvm_err_catcher");super.new(name);endfunctionvirtualfunctionaction_ecatch();if(get_severity()==UVM_ERROR)begin......
  • Reinforcement Learning Chapter2
    本文参考《ReinforcementLearning:AnIntroduction(2ndEdition)》SuttonK臂赌博机问题描述:你有k个选择,每个选择对应一个奖励,收益由所选动作决定的平稳概率分布产生,目标为最大化某段时间内的总收益期望。联系我们在chapter1中提到的reward,value,action等概念,我们在这个K臂赌博机......
  • C++ Primer 学习笔记 PartI C++基础
    Ch1开始略这一章包含控制流,条件,循环,注释,标准IO等内容。对于C语言/ACMC+STL中常见数值的内容不再赘述,仅总结较为不熟悉的内容。PartIC++基础CH2变量和基本类型2.1基本内置类型2.1.1算术类型2.1.1类型转换向unsigned赋超出范围的值,结果取余,对于signed,结果未定义。......
  • chapter2-暴力求解
    1、枚举对所有可能的情况进行枚举。面对枚举类型的题目,在想到思路的时候,要习惯于分析一下这种方法的复杂度是多少,结合题目的数据量分析这样的方法是否可行,然后再动手写代码,节约时间。计算机1000MS,大约可进行10^7次运算。所以,常见的代码时间复杂度,1秒内可接受的数据量如下表:......
  • CMU-15445(Fall 2023) Project0 C++ Primer 个人笔记
    CMU-15445Project0c++语法问题我直接问的gpt测试文件测试文件都存放在/bustub-private/test目录下,可以自己修改里边的测试方法并且查看有哪些特殊情况需要处理。Task1Get方法使用一个cur节点指向当前正在查找的节点,index指向当前当前正在查找的字符,在children_中查找key[......