• SystemVerilog学习-07-类的继承和包的使用


    类的继承

    什么是继承?

    继承是面向对象编程范式的关键概念。类用来创建用户自定义类型. 继承使得用户可以用非常安全,非侵入的方式对类的行为进行增加或者修改。从基类做扩展并产生新的子类的过程叫类的派生,当一个类被扩展并创建之后,该派生类就继承了其基类的数据成员、属性和方法,这就是类的继承。

    继承后的类可以实现以下功能:

    1. 继承了原来类的方法,并可以修改

    2. 添加新的方法

    3. 添加新的数据成员

    在实现以上功能的同时需要满足一定的规则:

    1. 子类继承父类的所有数据成员和方法

    2. 子类可以添加新的数据成员和方法

    3. 子类可以重写基类中的数据成员和方法

    4. 如果一个方法被重写,其必须保持和基类的原有定义有一致的参数

    5. 子类可以通过super操作符来引用父类中的方法和成员

    6. 被声明为local的数据成员和方法只能对自己可见,对外部和子类都不可见;对声明为protected的数据成员和方法,对外部不可见,对自身和子类可见。

    继承和子类

    之前定义过的类Packet,可以进—步扩展构成一个新的类LinkedPacket。通过extends,LinkedPacket继承于其父类Packet,包括继承其所有的成员(变量/方法)。

    class LinkedPacket extends Packet;
    	LinkedPacket next;
    	function LinkedPacket get_next();
    		get_next = next;
    	endfunction
    endclass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    子类可以继承父类的成员,所以LinkedPacket对象也是一个合法的Packet对象。
    由此,父类句柄可以指向子类的对象

    LinkedPacket lp = new;
    Packet p = lp;
    
    • 1
    • 2

    关于父类和子类的句柄,可以将子类句柄直接赋值给父类句柄,子类可以拥有与父类同名的成员方法,子类可以拥有与父类同名的成员变量。

    super

    super是用来访问当前对象其父类的成员。尤其当子类的成员如果与父类的成员同名,那么需要使用super来指定访问其父类成员,而非默认的子类成员。

    class Packet; // base class
    	integer value;
    	function integer delay();
    		delay = value * value;
    	endfunction
    endclass
    class LinkedPacket extends Packet; //derived class
    	integer value ;
    	function integer delay();
    		delay = super.delay ()+ value * super.value;
    	endfunction
    endclass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    包的使用

    包的定义

    为了使得可以在多个模块(硬件)或者类(软件)之间共享用户定义的类型,SV添加了包(package) 。
    包的概念参考于VHDL,用户自定义的类型如类、方法、变量、结构体、枚举类等都可以在package…endpackage中定义。

    导出包的内容

    module、interface、class等可以使用包中定义或者声明的内容。

    • 可以通过域的索引符::号直接引用。

      definitions::parameter
      definitions::instruction_t inst
      
      • 1
      • 2
    • 可以指定索引一些需要的包中定义的类型到指定的域中。

      module M;
      	import definitions::instruction_t;
      	instruction_t inst;
      endmodule
      
      • 1
      • 2
      • 3
      • 4
    • 通过通配符 * 来将包中所有的类别导入到指定的域中。

      module M;
      	import definitions::*;
      	instruction_t inst;
      endmodule
      
      • 1
      • 2
      • 3
      • 4

      包和库的区分

      package这个容器可以对类型做一个隔离的作用。package的意义在于将软件(类、类型、方法等)封装在不同的域中,以此来与全局的域进行隔离。

      库是编译的产物,硬件( module、interface、program)都会编译到库中,如果不指定编译库的话,会被编译进入默认的库中。库可以容纳硬件类型,也可以容纳软件类型,例如类、方法和包。

      包只能容纳软件类型例如类、方法和参数。

    reference

    1. 西电路科验证PPT
  • 相关阅读:
    计算机的基本组成是什么样子的?
    Hadoop系列(一)——HDFS总结
    Jmeter的自动化测试实施方案
    裂开了,一次连接池参数导致的雪崩问题
    K8s service 底层逻辑
    GCC各版本对C++的支持情况
    关于网络协议的若干问题(二)
    明明数据已经更新了,但是视图就是没变? 试试 Vue.set的使用
    编译一个基于debian/ubuntu,centos,arhlinux第三方系统
    C++征途 --- List链表容器
  • 原文地址:https://blog.csdn.net/weixin_41445387/article/details/125544163