在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5703|回复: 9

[求助] [请教]systemverilog的class继承问题

[复制链接]
发表于 2013-4-3 20:59:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
有如下代码:
  
  
class Trans_base;
    int i=1;
     
    function void display();
     $display("value of i: %d\n",i);
    endfunction
     
  endclass
  
class Trans_ext extends Trans_base;
    int i=2;
     
    function void display();
     $display("value of i: %d\n",i);
    endfunction
     
  endclass
  
module top;
   Trans_base tr1;
   Trans_ext tr2;
   
initial begin
   tr2 = new();
   tr2.display();
   tr1 = tr2;
   tr1.display();
end
  
endmodule
  
为什么打印的结果是:
2
1
  
而不是:
2
2
  
按照我的理解,“tr1 = tr2;”这句话只是把tr1指向了一块tr2的对象的memory,但是这块memory在之前(执行tr2=new()的时候)已经分配好了的啊,这句话难道把i值也改变了?
int i=1;和int i=2;这两句话应该是在初始化分配对象的内存时才会执行的啊,怎么感觉
tr1 = tr2;这句话在执行的时候也重新执行了int i = 1;这个语句呢?
  
本人菜鸟,多谢各位前辈指教!
发表于 2013-4-5 17:45:44 | 显示全部楼层
本帖最后由 chlalex 于 2013-4-10 17:03 编辑

tr2中其实有两个i:一个是super.i, 还有一个是this.i。在Trans_ext中你看到的i都是this.i,因为this.i覆盖了super.i,但是super.i实际上还是存在的。你可以试试在Trans_ext的display中打印super.i(我现在不在公司所以验证不了,请你自己尝试正确性. 经验证为正确)

Trans_ext没有定义new函数,所以缺省的new函数会自动调用Trans_base的new函数。而Trans_base也没有定义new函数,所以缺省的new函数会自动初始化i,也就是执行i=1。

当你创建tr2的时候,先是执行Trans_base的new函数,super.i = 1, 接着是执行this.i = 2。

当你用tr1去访问这个对象的时候,它只能看到自己的i,也就是tr2中的super.i,所以打印出来是1。
如果display被定义成virtual函数的话,打印出来的似乎也应该是1(我手边验证不了,请实践出结果。经验证为错误,打印出来是2)。

看你的code,如果不是纯粹练脑子的话,你似乎应该去掉Trans_ext中的i定义,用new来实现给i赋不同的初值
class Trans_ext extends Trans_base;
    function new();
        super.new();
        i = 2;
    endfunction
     
    function void display();
     $display("value of i: %d\n",i);
    endfunction
     
  endclass

以上的code因为不在公司所以不能验证,请你自己试一下正确性。
发表于 2013-4-8 13:42:12 | 显示全部楼层
tr1 = tr2;
实际上有一个强制类型转换的意思 tr1 = (Trans_ext)tr2;
C++里面函数的多态性也可以解释这一点,就不知道SV是不是也是这样的。

楼上解释更加详细:)
发表于 2013-5-8 20:53:20 | 显示全部楼层
加了virtual是多态,不加virtual是覆盖
发表于 2013-5-26 16:27:15 | 显示全部楼层
学习一下
发表于 2013-5-26 17:00:43 | 显示全部楼层
是的
应该是覆盖:)
发表于 2013-6-20 11:06:05 | 显示全部楼层
解释的很好,谢谢
发表于 2015-7-31 11:00:40 | 显示全部楼层
因為設了local variable的關係
发表于 2015-7-31 12:48:33 | 显示全部楼层
解释的挺好的
发表于 2016-3-29 23:17:50 | 显示全部楼层
回复 2# chlalex


    解释很清楚,感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-18 20:56 , Processed in 0.029779 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表