SystemVerilog学习——类的继承

news2024/11/16 21:34:27

目录

一、概述

二、基本概念

三、继承的意义

3.1 代码复用(Code Reusability)

3.2 扩展功能(Functionality Extension)

3.3 多态性(Polymorphism)

3.4 简化代码结构(Code Organization)

3.5 提升可维护性(Maintainability)

四、访问控制

五、父类方法的重载和覆盖

六、总结


一、概述

        在 SystemVerilog (SV) 中,类的继承机制与面向对象编程(OOP)中的继承概念类似,允许我们基于现有的类创建新类,以便重用代码和扩展功能。通过继承,子类可以继承父类的属性(成员变量)和方法(成员函数),并且可以覆盖父类的方法,也可以新增自己的属性和方法。继承有助于实现代码的重用、扩展和多态性。

二、基本概念

        在 SystemVerilog 中,继承通过在类定义时使用 extends 关键字来实现。子类会继承父类的所有公共和保护成员,并可以重写父类的方法,也可以添加自己的成员。

class ParentClass;
    // 父类成员变量
    int x;
    
    // 父类构造函数
    function new();
        x = 0;
    endfunction
    
    // 父类方法
    function void display();
        $display("x = %0d", x);
    endfunction
endclass

class ChildClass extends ParentClass;  // 继承父类
    // 子类成员变量
    int y;
    
    // 子类构造函数
    function new();
        super.new();  // 调用父类构造函数
        y = 0;
    endfunction
    
    // 子类重写父类的方法
    function void display();
        super.display();  // 调用父类的方法
        $display("y = %0d", y);
    endfunction
endclass
  • 继承父类的成员:子类自动继承父类的成员变量和方法,除非子类重写了这些方法或成员。
  • 重写方法:子类可以重写父类的方法,通过 functiontask 重新定义同名方法。如果子类希望在重写方法中调用父类的实现,可以使用 super 关键字来调用父类的同名方法。
  • 构造函数:子类可以定义自己的构造函数,如果子类构造函数中需要调用父类构造函数,必须使用 super.new() 显式调用父类的构造函数。
  • 成员变量的继承:子类会继承父类的成员变量,但是子类可以根据需要新增或修改成员变量。父类的成员变量在子类中保持可访问(除非是私有的)。
  • 多态性:通过继承,子类可以实现不同的行为来覆盖父类的行为,这对于在仿真中实现不同类型的对象非常有用。

        使用示例:

module test;
    initial begin
        // 创建父类和子类对象
        ParentClass p = new();
        ChildClass c = new();

        // 使用父类对象调用方法
        p.display();   // 输出 "x = 0"
        
        // 使用子类对象调用方法
        c.display();   // 输出 "x = 0" 和 "y = 0"
    end
endmodule

三、继承的意义

        继承是面向对象编程(OOP)中的一个核心概念,它在 SystemVerilog 中也有着重要的作用。继承允许我们通过从已有的类(父类)创建新的类(子类)来实现代码的复用和扩展,避免重复的代码,提高代码的可维护性和可扩展性。继承带来的好处主要有以下几个方面:

3.1 代码复用(Code Reusability)

        继承最直接的作用是实现代码的复用。子类可以继承父类的成员变量和方法,从而无需重复编写相同的代码。例如,如果你有一个基础类(父类),可以通过继承将其功能扩展到其他类(子类)中,而不需要重新实现父类已经完成的部分。

class Animal;
    string name;
    function new(string name);
        this.name = name;
    endfunction
    function void speak();
        $display("Animal sound");
    endfunction
endclass

class Dog extends Animal;
    function new(string name);
        super.new(name);  // 调用父类构造函数
    endfunction
    function void speak();
        $display("%s says Woof!", name);
    endfunction
endclass

        在这个例子中,Dog 类继承了 Animal 类的 name 成员变量和 speak() 方法,并且通过重写 speak() 方法,定义了 Dog 特有的行为。 

3.2 扩展功能(Functionality Extension)

        继承不仅仅是复用父类的代码,它还允许子类在继承的基础上扩展新的功能。子类可以通过新增自己的成员变量或方法来扩展父类的功能。这样,子类就可以在父类功能的基础上增加新的行为或特性。

class Car;
    string model;
    function new(string model);
        this.model = model;
    endfunction
    function void drive();
        $display("%s is driving", model);
    endfunction
endclass

class ElectricCar extends Car;
    string battery_type;
    function new(string model, string battery_type);
        super.new(model);  // 调用父类构造函数
        this.battery_type = battery_type;
    endfunction
    function void charge();
        $display("%s is charging", battery_type);
    endfunction
endclass

         在这个例子中,ElectricCar 类继承了 Car 类,并且新增了一个 battery_type 成员变量和一个 charge() 方法,使得电动汽车除了具备普通汽车的功能外,还可以充电。

3.3 多态性(Polymorphism)

        继承支持多态性(Polymorphism),即通过父类指针或引用来调用不同子类的实现。多态性是面向对象编程中的一种机制,它允许通过统一的接口调用不同的实现方式,极大地提高了系统的灵活性和可扩展性。

class Animal;
    function void speak();
        $display("Animal sound");
    endfunction
endclass

class Dog extends Animal;
    function void speak();
        $display("Woof!");
    endfunction
endclass

class Cat extends Animal;
    function void speak();
        $display("Meow!");
    endfunction
endclass

module test;
    initial begin
        Animal a;
        Dog d;
        Cat c;

        a = new();
        d = new();
        c = new();

        a.speak();  // 输出 "Animal sound"
        d.speak();  // 输出 "Woof!"
        c.speak();  // 输出 "Meow!"
    end
endmodule

         在这个例子中,Animal 是一个父类,DogCat 是它的子类。通过父类 Animal 的引用,我们可以动态地调用子类 DogCat 中的不同实现,这就是多态性。

3.4 简化代码结构(Code Organization)

        继承能够帮助我们组织代码,使得代码结构更清晰。子类通过继承父类,可以专注于实现差异化的功能,而共享和通用的功能则由父类来提供。这样可以减少重复代码,使得系统的设计更加简洁和模块化。

class Shape;
    function void draw();
        $display("Drawing shape");
    endfunction
endclass

class Circle extends Shape;
    function void draw();
        $display("Drawing circle");
    endfunction
endclass

class Square extends Shape;
    function void draw();
        $display("Drawing square");
    endfunction
endclass

        在这个例子中,Shape 是父类,它提供了一个通用的 draw() 方法,CircleSquare 子类重写了该方法,分别实现了不同形状的绘制功能。通过这种方式,我们可以保持代码的组织性和可扩展性。

3.5 提升可维护性(Maintainability)

        通过继承,如果父类中的逻辑发生变化,所有继承自父类的子类都可以直接受益。我们只需要修改父类中的代码,而不需要逐一修改所有子类中的代码。这极大地提高了系统的可维护性和可扩展性。

        如果父类中的 speak() 方法发生变化,所有继承自 Animal 的类都会自动更新,无需手动修改每一个子类。

四、访问控制

        在继承中,父类的成员变量和方法的访问控制(如 publicprotectedprivate)会影响子类的访问权限。

  • public:子类可以直接访问父类的公共成员。
  • protected:子类可以访问父类的受保护成员,但无法在类外部访问。
  • private:子类不能访问父类的私有成员,尽管它们可以在类内部定义和使用自己的私有成员

五、父类方法的重载和覆盖

        子类可以重载父类的方法,也可以覆盖父类的方法。如果子类方法需要调用父类的版本,可以使用 super 关键字:

class Parent;
    function void foo();
        $display("Parent foo");
    endfunction
endclass

class Child extends Parent;
    // 重写父类方法
    function void foo();
        $display("Child foo");
        super.foo();  // 调用父类的 foo 方法
    endfunction
endclass

六、总结

  • 继承使得子类可以扩展和重用父类的功能。
  • 多态性允许子类定义自己的行为,而不必修改父类代码。
  • super 关键字用于调用父类的方法和构造函数。
  • 类的成员访问控制决定了哪些成员可以被继承和访问。

        通过继承,我们可以在 SystemVerilog 中创建层次化的类结构,这对于大型验证环境和复用组件非常有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2241762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

T6识别好莱坞明星

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 导入基础的包 from tensorflow import keras from tensorflow.keras import layers,models import os, PIL, pathlib import matplotlib.pyplot as pl…

Odoo :一款免费开源的日化行业ERP管理系统

文 / 开源智造Odoo亚太金牌服务 概述 构建以 IPD 体系作为核心的产品创新研发管控体系,增进企业跨部门业务协同的效率,支撑研发管控、智慧供应链、智能制造以及全渠道营销等行业的场景化,构筑行业的研产供销财一体化管理平台。 行业的最新…

48.第二阶段x86游戏实战2-鼠标点击call

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…

Vue 学习随笔系列十五 -- 数组遍历方法

数组遍历方法 文章目录 数组遍历方法1. for 循环2. forEach (不会修改数组本身)3. map (不修改数组本身)4. some(不修改数组本身)5. every(不修改数组本身)6. filter(不修改数组本身)7. find(不修改数组本身)8. findIndex拓展 9. reduce(累加)拓展 1. fo…

FreeRTOS的列表与列表项

目录 1.为什么要学列表? 2.什么是列表和列表项? 2.1 列表 2.2列表项 2.3,迷你列表项 3.列表与列表项的初始化 3.1 列表初始化 3.2列表项初始化 4.列表项的“增删查”(插入、删除、遍历) 4.1列表项的插入 4.1.1…

数字IC后端教程之Innovus hold violation几大典型问题

今天小编给大家分享下数字IC后端实现Physical Implementation过程中经常遇到的几个hold violation问题。每个问题都是小编自己在公司实际项目中遇到的。 数字后端实现静态时序分析STA Timing Signoff之min period violation Q1: 在Innouvs postCTS时序优化的log中我们经常会看…

VS2022编译32位OpenCV

使用环境 Visual Studio 2022 OpenCV: 4.7.0 cmake: 3.30.2一、使用CMake工具生成vs2022的openCV工程解决方案 打开cmake,选择opencv的源代码目录,创建一个文件夹,作为VS工程文件的生成目录 点击configure构建项目,弹出构建设置…

企业生产环境-麒麟V10(ARM架构)操作系统部署Zookeeper单节点集群版

前言:ZooKeeper是一个分布式协调服务,它为分布式应用提供一致性服务,是Apache Hadoop的子项目。它被设计为易于编程,同时具有高性能和高可靠性。ZooKeeper提供了一个简单的接口和一些基本的文件系统操作,使得开发者能够…

vue3 中直接使用 JSX ( lang=“tsx“ 的用法)

1. 安装依赖 npm i vitejs/plugin-vue-jsx2. 添加配置 vite.config.ts 中 import vueJsx from vitejs/plugin-vue-jsxplugins 中添加 vueJsx()3. 页面使用 <!-- 注意 lang 的值为 tsx --> <script setup lang"tsx"> const isDark ref(false)// 此处…

深度学习服务器租赁AutoDL

1. 根据需要选择租用的显卡 算力市场 1.1 显卡选择 1.2 环境配置 2. 服务器使用 2.1 上传文件 2.2 调试环境 2.3 跑代码 python train.py && /usr/bin/shutdown # && /usr/bin/shutdown表示代码成功运行结束后&#xff0c;自动关机3. 省钱绝招 省钱绝招 …

IDEA部署AI代写插件

前言 Hello大家好&#xff0c;当下是AI盛行的时代&#xff0c;好多好多东西在AI大模型的趋势下都变得非常的简单。 比如之前想画一幅风景画得先去采风&#xff0c;然后写实什么的&#xff0c;现在你只需描述出你想要的效果AI就能够根据你的描述在几分钟之内画出一幅你想要的风景…

【大数据技术基础 | 实验十】Hive实验:部署Hive

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;安装部署&#xff08;二&#xff09;配置HDFS&#xff08;三&#xff09;启动Hive 六、实验结果&#xff08;一&#xff09;启动结果&#xff08;二&#xff09;Hive基…

Flume1.9.0自定义Sink组件将数据发送至Mysql

需求 1、将Flume采集到的日志数据也同步保存到MySQL中一份&#xff0c;但是Flume目前不支持直接向MySQL中写数据&#xff0c;所以需要用到自定义Sink&#xff0c;自定义一个MysqlSink。 2、日志数据默认在Linux本地的/data/log/user.log日志文件中&#xff0c;使用Flume采集到…

Onlyoffice配置一 JWT認證

案例 使用官網給c# MVC的例子&#xff0c;主要在版本7.2之後&#xff0c;默認加入JWT認證&#xff0c;docker版本尚且可以在创建的时候使用默认的指令避开&#xff0c;但是在exe版本&#xff0c;即使配置为false&#xff0c;重启之后也会默认开启。 简单说一下如何配置 配置J…

ZeroSSL HTTPS SSL证书ACMESSL申请3个月证书

目录 一、引言 二、准备工作 三、申请 SSL 证书 四、证书选型 五、ssl重要性 一、引言 目前免费 Lets Encrypt、ZeroSSL、BuyPass、Google Public CA SSL 证书&#xff0c;一般免费3-6个月。从申请难易程度分析&#xff0c;zerossl申请相对快速和简单&#xff0c;亲测速度非…

MySql 日期周处理方式

MySql 日期周处理方式 最近在做数仓相关工作&#xff0c;最近遇到 几个问题&#xff0c; 1、计算指定日期是一年中的第几周&#xff0c;周一为周的第一天 2、计算周的开始时间&#xff0c;结束时间 3、计算周对应的年 比如 2023-01-01 WEEKOFYEAR(2023-01-01) 是2022年的52周&…

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56

STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56 1. STM32F407 BootLoader 中的 Flash 擦除功能详解 在嵌入式系统中&#xff0c;BootLoader 的设计是非常关键的部分&#xff0c;它负责引导主程序的启动、升级以及安全管理。而在 STM32F407 等 MCU 上实现 BootLoader&…

【Homework】【5】Learning resources for DQ Robotics in MATLAB

Lesson 5 代码-TwoDofPlanarRobot.m 表示一个 2 自由度平面机器人。该类包含构造函数、计算正向运动学模型的函数、计算平移雅可比矩阵的函数&#xff0c;以及在二维空间中绘制机器人的函数。 classdef TwoDofPlanarRobot%TwoDofPlanarRobot - 表示一个 2 自由度平面机器人类…

Uniapp 引入 Android aar 包 和 Android 离线打包

需求&#xff1a; 原生安卓 apk 要求嵌入到 uniapp 中&#xff0c;并通过 uniapp 前端调起 app 的相关组件。 下面手把手教你&#xff0c;从 apk 到 aar&#xff0c;以及打包冲突到如何运行&#xff0c;期间我所遇到的问题都会 一 一 进行说明&#xff0c;相关版本以我文章内为…

你可以通过以下步骤找到并打开 **Visual Studio 开发者命令提示符**:

你可以通过以下步骤找到并打开 Visual Studio 开发者命令提示符&#xff1a; 1. 通过开始菜单查找 打开 开始菜单&#xff08;点击屏幕左下角的 Windows 图标&#xff09;。在搜索框中输入 Developer Command Prompt。你应该看到以下几种选项&#xff08;具体取决于你的 Visu…