微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > systemverilog的class继承问题

systemverilog的class继承问题

时间:10-02 整理:3721RD 点击:
有如下代码:
  
  
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;这个语句呢?
  
本人菜鸟,多谢各位前辈指教!

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因为不在公司所以不能验证,请你自己试一下正确性。

tr1 = tr2;
实际上有一个强制类型转换的意思 tr1 = (Trans_ext)tr2;
C++里面函数的多态性也可以解释这一点,就不知道SV是不是也是这样的。
楼上解释更加详细:)

加了virtual是多态,不加virtual是覆盖

学习一下

是的
应该是覆盖:)

解释的很好,谢谢

因為設了local variable的關係

解释的挺好的



    解释很清楚,感谢!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top