0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SystemVerilog中的类的继承

芯片验证工程师 来源:芯片验证工程师 作者:芯片验证工程师 2022-11-15 09:47 次阅读

继承是基于类的面向对象编程(object-oriented pro - gramming)的最重要特性之一。

扩展类,简言之,就是基类的扩展。

扩展类继承了基类的所有属性和方法,并且支持在继承类中重写基类的属性和方法以及新增更多的属性和方法。

所以,继承类的好处是什么?

1、继承类对基类的复用+改进
2、基类的改动能很快地影响到所有继承类,减少公共代码的修改

例如,可以定义一个名为EthernetPacket的基类。然后定义扩展类,如EtherErrorPacket、EtherLatencyPacket等,除了继承基类的属性,还可以根据需要新增更多的新属性和方法。

module class_TOP( );

class base;
logic [31:0] data1;
logic [31:0] data2;
logic [31:0] busx;

function void bus;
busx = data1 | data2;
endfunction

function void disp;
$display("From Base Class :: busx OR = %h", busx);
endfunction

endclass : base

class ext extends base;
logic [31:0] data3; //add a new property
function new ( );
$display("Call base class method from extended class - 
super.disp");
super.disp;
endfunction

function void bus; //redefne function 'bus' of class 'base'
busx = data1 & data2 & data3;
//data1,data2 inherited from class 'base'
endfunction

function void disp; //redefne function 'disp' of 
class 'base'
$display("From Extended Class :: busx AND = %h",busx);
endfunction

endclass : ext

initial begin
base b1;
ext e1;
b1 = new;
e1 = new;
b1.data1 = 32'h ffff_0000;
b1.data2 = 32'h 0000_ffff;
b1.bus;
b1.disp( );
e1.data1 = 32'h 0101_1111;
e1.data2 = 32'h 1111_ff;
e1.data3 = 32'h 1010_1010;
e1.bus;
e1.disp( );
end
endmodule

仿真log:

Call base class method from extended class - super.disp
From Base Class :: busx OR = xxxxxxxx
From Base Class :: busx OR = ffffffff
From Extended Class :: busx AND = 00001010
 V C S S i m u l a t i o n R e p o r t

在class “base”中,我们定义了属性data1、 data2和busx,然后又定义了2个functions “bus”和“disp”

由于我们没有显式地定义构造函数new(),所以变量data1, data2和busx都会被初始化成“x”态 。

class “ext”是class “base”的继承类,所以类“ext”自然也会有属性“data1,” “data2,” 和“busx”。

同时我们在类“ext”中额外声明了属性“data3”,并且覆盖了父类中函数“bus”和“disp”的声明。

在上面的例子中,我们在扩展类"ext"中的构造函数中通过关键字“super.”来调用父类中声明的函数。所以会打印:

From Base Class :: busx OR = xxxxxxxx

在initial语句块中,我们赋值父类中的属性,然后打印出“busx.”(即data1 | data2)。然后修改扩展类中的属性,然后打印出“busx.”(覆盖过的函数data1 & data2 & data3)

仿真的log也证明了父类的函数被成功地覆盖掉了。

每一个class 都会有一个构造函数new()(隐式或者显式的),在扩展类的构造函数中,第一件事就是要去调用父类的构造函数“super.new( )”。然后如果你忘了在扩展类的构造函数中添加,编译仿真工具也会自动帮你添加的。

一般来说不需要显式地添加super.new(),但是如果构造函数带参数,那么必须要显式地添加supoer.new()

Inheritance Memory Allocation

还是那句话,理解一个语言的很多特性都需要从内存分配的角度去理解。

如果需要完全理解扩展类,就需要理解基类和扩展类中的属性和函数的内存分配。

module class_TOP( );
 class aa;
 int i1;
 function funAA;
 endfunction
 endclass : aa
 
 class bb extends aa;
 int i1;
 function funBB;
 endfunction
 endclass : bb
 
 initial begin
 bb b;
 b = new( );
 end
 endmodule


在上面的例子中,虽然我们只是调用了扩展类的构造函数“b = new( ),” ,但是实际上,我们不仅分配的类“bb”的内存空间,还分配了基类“aa”的内存空间,即使变量名称一样。

93d6f52a-6436-11ed-8abf-dac502259ad0.png

这个同名的变量需要通过作用域(不同的内存分配)进行区分。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1328

    浏览量

    109510
  • System
    +关注

    关注

    0

    文章

    162

    浏览量

    36634

原文标题:SystemVerilog中的类的继承

文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [启芯公开课] SystemVerilog for Verification

    学快速发展,这些趋势你了解吗?SystemVerilog + VM是目前的主流,在未来也将被大量采用,这些语言和方法学,你熟练掌握了吗?对SoC芯片设计验证感兴趣的朋友,可以关注启芯工作室推出的SoC芯片
    发表于 06-10 09:25

    systemverilog学习教程

    systemverilog的一些基本语法以及和verilog语言之间的区别。
    发表于 04-01 14:24

    Python多重继承使用方法

    继承是面向对象编程的一个重要方式,通过继承,子类可以扩展父的功能,Python也具有该特性,除此之外,Python还可以使用多重继承。语法:class subClass(Base1,
    发表于 04-19 14:41

    js的寄生继承详解

    // 将原型继承和非原型继承组合为一体的继承方式叫做组合继承,但是这种方法的继承是有一点小缺陷的,下级函数
    发表于 05-31 06:03

    【微信精选】C++的精髓继承就该这么理解!

    的公有成员。C++继承 以下例子:定义了一个基base,定义了一个子类sum,子类继承了基base,#include class su
    发表于 08-15 09:41

    使用SystemVerilog来简化FPGA接口的连接方式

    FPGA接口的连接方式。    也许很多FPGA工程师对SystemVerilog并不是很了解,因为以前的FPGA开发工具是不支持SystemVerilog的,导致大家都是用VHDL或者Verilog来
    发表于 01-08 17:23

    求大神详细介绍一下关于的封装与继承

    求大神详细介绍一下关于的封装与继承
    发表于 04-28 06:40

    C++ 多继承 虚基分享

    /details/1027495131.多继承派生有多个基或者虚基,同一个不能多次作为某个派生
    发表于 07-02 06:54

    浅析多继承派生的虚基

    继承派生与基有何关系?多继承派生与虚基有何关系?
    发表于 09-30 06:26

    python继承

    的同时,又可以根据需要进行修改、拓展。继承的语法结构是class 子类(父):1. 单继承举个例子:下面的代码。先是定义了一个 People
    发表于 03-08 16:40

    对RT-Thread内核的封装继承与多态有关理解

    像是每一次继承发生时,都为新产生的子类添加了更多功能,同时也继承了父的属性。多态—改写对象行为在 RT-Thread 如何体现了多态呢,这一点有时候会带给我困惑,但是如果仔细阅读平
    发表于 04-13 17:41

    请问SpinalHDL的Area到底是什么意思

    (仅限于纯组合逻辑)。Area在SpinalHDKL里,与Verilog、SystemVerilog相对应的概念是Component,当我们的继承了Component后,与之相应的
    发表于 07-22 14:22

    更好地理解SystemVerilog的多态Polymorphism

    多态(Polymorphism) ,从字面意思上看指的是多种形式,在OOP(面向对象编程)中指的是同一个父的函数可以体现为不同的行为。在SystemVerilog,指的是我们可以使用父
    发表于 12-05 17:34

    SystemVerilog的断言手册

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    发表于 07-22 14:12 20次下载

    SystemC 和SystemVerilog的比较

    就 SystemC 和 SystemVerilog 这两种语言而言, SystemC 是C++在硬件支持方面的扩展,而 SystemVerilog继承了 Verilog,并对 Verilog 在面向对象和验证能力方面进行了扩
    发表于 08-16 10:52 5230次阅读