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

    文章

    1351

    浏览量

    110074
  • System
    +关注

    关注

    0

    文章

    165

    浏览量

    36928

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

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

收藏 人收藏

    评论

    相关推荐

    SystemVerilog构造函数new

    systemverilog,如果一个没有显式地声明构造函数(new()),那么编译仿真工具会自动提供一个隐式的new()函数。这个new函数会默认地将所有属性变量。
    发表于 11-16 09:58 3636次阅读

    SystemVerilog的Virtual Methods

    SystemVerilog多态能够工作的前提是父的方法被声明为virtual的。
    发表于 11-28 11:12 698次阅读

    关于Java继承的问题

    在Java继承是面向对象编程的一个重要概念,它允许一个(称为子类或派生继承另一个
    的头像 发表于 09-30 10:48 553次阅读

    浅析多继承派生的虚基

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

    python继承

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

    什么是继承?

    什么是继承?继承是子类利用父定义的方法和变量就像它们属于子类本身一样. class Car {   int color_number;&n
    发表于 04-28 14:26 720次阅读

    Java继承与派生

    对于面向对象的程序设计语言来说,毫无疑问是其最重要的基础。抽象、封装、继承、多态这四大特性都离不开,只有存在,才能体现面向对象编程的特点,今天我们就来了解一些
    发表于 09-27 10:55 0次下载
    Java<b class='flag-5'>类</b>的<b class='flag-5'>继承</b>与派生

    构造函数()继承的方式与实验

    继承:利用构造函数()继承的方式 : JS是没有的概念的 , 把JS
    发表于 11-24 15:26 654次阅读

    C++继承访问级别学习总结(二)

    上一篇文章我们介绍了c++继承学习总结;今天我们继续来分享c++继承
    的头像 发表于 12-24 16:10 735次阅读

    python继承详解

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

    怎样在Java实现多继承

    Java是一种面向对象的只允许单继承的语言,那么怎样在Java实现多继承呢? 2 方法 1. 多层继承 如果要直接继承
    的头像 发表于 02-17 14:55 1326次阅读

    简述继承

    继承:一个继承另一个,自动拥有这个的属性和方法,类似于包含与被包含的关系。被
    的头像 发表于 02-17 15:00 1015次阅读
    简述<b class='flag-5'>类</b>的<b class='flag-5'>继承</b>

    Python继承详解

    在 Python 继承是一种重要的面向对象编程概念。通过继承,我们可以定义一个新的,它继承了现有
    的头像 发表于 04-20 16:56 1282次阅读

    Python继承的基本规则

    继承规则 与其他基于的语言一样,可以通过继承组合多个定义。 定义可以扩展(或继承)多个其他
    的头像 发表于 09-20 14:24 519次阅读

    java子类可以继承的什么

    Java是一种面向对象的编程语言,它支持继承的概念。继承是面向对象编程的三大特性之一,它允许一个(称为子类或派生继承另一个
    的头像 发表于 08-20 11:02 1148次阅读