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

UVM Primer OOP前置部分(Chapter 4-5)

时间:2024-02-18 22:34:30浏览次数:34  
标签:Chapter square struct int 句柄 UVM new Primer rectangle

资料:

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

前言:

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

正文:

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

第四章:OOP概述

OOP的优点:

-代码重用:
较易理解,由于方法封装在类中,如果设计或者用例发生或需要更改(这是常有的事),那么只需要对类内部进行调整;此外,如果产生了功能的拓展,代码也无需做较大改动;

-代码维护
与上一条类似,如果一个项目中的代码由多个人完成,各写各的会导致代码的同步出现问题,而统一在封装好的类内进行操作,能够避免上述问题;

-内存管理
应结合实际用力进行理解,在此不赘述;

第五章:类与继承

1、结构体和类

常见的结构体如下:

// A Rectangle Sturct
typedef struct{
    int width;
    int length;
} rectangle_struct;

// A Square Sturct
typedef struct{
    int side;
} square_struct;

我们在模块中可以例化出这两个图形,并使用其中的信息进行运算:

module top_struct;
    // 2 Figure
    rectangle_struct rectangle_s;
    square_struct    square_struct;
    
    // Calculation
    initial begin
       	rectangle_s.width = 10;
       	rectangle_s.length = 20; 
       
        display("Rectangel area = %0d",rectangle_s.width * rectangle_s.length);
    end
endmodule

但在本例中,结构体也存在一些局限性,包括:

-两个结构体之间存在关系却无法体现;

(Though we know there is a relationship between rectangles and squares, our
program does not .)

-定义变量时仿真器就会为其分配内存;

-计算面积的操作需要了解长方体的面积公式;

因此,我们使用类(CLASS)来解决上述的问题:

class rectangle
    int width;
    int length;
    
    // Explicit Allocate Memory
    function new(int w, int l);
        length = l;
        width  = w;
    endfunction
    
    // Calculate Area
    function int area();
        return length * width;
    endfunction
endclass

类中含有不同的元素:

-We have declared class variables called length and width. In object-oriented terms
these are called the class's data members.

-We call a function or a task defined within a class a method.

此外,编译器不会自动为类分配内存,因此用户必须调用类的 new()构造函数来为对象显式分配内存

在定义好了长方形这个类之后,我们可以在顶层模块中例化和使用:

module top_class;
    // A handle
    rectangle rectangle_h;
    
    initial begin
        rectangle_h = new(.l(50), .w(20));
        // Method in class
        display("Area = %0d", rectangle_h.area());
    end
endmodule

这样,我们在计算面积时就无需知道矩形的面积,而是直接使用类内部的方法即可。

在上面的代码中,我们使用句柄(handle)指向一个矩形类。SV中的句柄和C中的指针类似,但是功能具有一些差别,包括:

1、句柄只能指向类例化出的对象,而指针对其指向的数据类型没有限制;

2、句柄不能做数值计算操作,而指针可以(*p++);

3、句柄需要使用$cast操作以进行类型转换,而指针更加灵活;

4、当对象没有被句柄指向时,其对应的内存将会被回收(严格来说不应该放在句柄的知识里);

Anyway,在这部分中,我们成功定义、例化了一个类,采用句柄指向这个类,并使用了类内部的方法计算了面积;

2、类的继承

下面我们来看看类的另一个特性,继承。

// A Rectangle Sturct
typedef struct{
    int width;
    int length;
} rectangle_struct;

// A Square Sturct
typedef struct{
    int side;
} square_struct;

现在我们知道,我们可以将两个结构体变成两个类:长方形和正方形,并将他们各自的计算面积公式作为方法进行封装,但我们知道,正方形就是特殊的长方形,这种联系可以作为分类的基础,对正方形进行进一步细分,我们使用extends关键字进行重用:

class square extends rectangle;
    // Override New Function
    function new(int side);
        super.new(.l(side), .w(side));
    endfunction
endclass

我们使用extends关键词定义了square类,编译器也会通过extends关键字得知,square将会继承父类rectangle的所有数据成员和方法。接着,我们重载(Override)了父类中的new()函数,super关键字将会指示编译器使用rectangle中的构造函数,并向长和宽均传入同一个值side。

这样,我们可以继续完善之前的代码了:

module top_class;
    rectangle rectangle_h;
    // A New Handler
    square    square_h;
    
    initial begin
        rectangle_h = new(.l(50), .w(20));
        display("Area Rectangle = %0d", rectangle_h.area());
        
        // A New Object
        square_h = new(.side(25));
        display("Area Square = %0d", square_h.area());
    end
endmodule

尽管在这段代码中,我们两次调用了new()函数,但是编译器能够知道,这是两种分属不同对象的方法。

标签:Chapter,square,struct,int,句柄,UVM,new,Primer,rectangle
From: https://www.cnblogs.com/harold-fey/p/18020064

相关文章

  • 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[......
  • C Primer Plus 中文第6版 10.13 第11题
    题目:编写一个程序,声明一个int类型的3*5二维数组,并用合适的值初始化它。该程序打印数组中的值,然后各值翻倍(即是原来的2倍),并显示出各个元素的新值。编写一个函数显示数组的内容,再编写一个函数把各元素的翻倍。这两个函数都以函数名和行数作为参数。分析:写2个函数即可。翻倍函数,用于使......
  • Chapter 8. Miscellaneous Widgets
    目录LabelEntrySpinButtonProgressBarInfoBarTooltipsLabelGtk::Label可以在Label构造函数中指定文本,orlaterwiththeset_text()orset_markup()methods.标签的宽度将自动调整。您可以通过在标签字符串中放置换行符(“\n”)来生成多行标签。可以使用set_justify()方......