#systemverilog# “类”翱翔在systemverilog的天空(6)关于this 和 super的使用

调用变量方面

1)this: 指向对象本身的一个指针

this:会先在当前作用域中查找,如果当前作用中没有,则会去上一级作用域中查找,知道找到该变量或者function/task为止;
super:首先会先在该类的父类中查找。

// https://www.edaplayground.com 调试
// 形参与成员名字重名,用 this 来区分:

`include "uvm_macros.svh"
`timescale 1ns/1ps
import uvm_pkg::*;

module top;
  class Person;
      int age = 10;   // 动态变量
      function void play_something();
        $display("initialize age: %0d!!!",age);
      endfunction     

      function int GetAge(int age);
          this.age = age;  // 形参与成员名字重名,用 this 来区分:
          return this.age;
      endfunction  
  endclass
      
  Person Harry;    // Person空指针

  initial begin
     Harry = new();    // 初始化
     Harry.play_something();  // initialize age: 10!!!
     $display("Harry's age is: %0d ",Harry.GetAge(12));  // 类对象age被传入参数改变
     Harry.play_something();  // initialize age: 12!!!
  end

endmodule

在这里插入图片描述 

 这里 age 是 GetAge 成员方法的形参,this.age 是 Person 类的成员变量。

super:指向最近父类对象的一个指针

super 可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。
super 也有三种用法:

1.普通的直接引用:与 this 类似,super 相当于是指向当前对象的父类,这样就可以用 super.xxx 来引用父类的成员。

2.子类中的成员变量或方法与父类中的成员变量或方法同名
 

// 类中的成员变量或方法与父类中的成员变量或方法同名

`include "uvm_macros.svh"
`timescale 1ns/1ps
import uvm_pkg::*;

module top;
  class Country;
    string name;
    function void play_something();
      name = "China";
    endfunction     
  endclass
  
  class City extends Country;
     string name;
     function void play_something();
       name = "Shanghai";
       super.play_something();  //调用父类方法(先调用父类方法,再调用父类变量,父类变量不为null)  
       $display("son name: %0s!!!",name);			//调用本class变量 name="Shanghai"
       $display("super name: %0s!!!",super.name);   //调用父类变量 super.name="China"
     endfunction
  endclass


  City c;    // City空指针
  
  initial begin
	 c = new();    // 初始化
     c.play_something();
  end

endmodule
    

 在这里插入图片描述

 这里既调用了父类的方法,也调用了父类的变量。若不调用父类方法 value(),只调用父类变量 name 的话,则父类 name 值为默认值 null。

// 不调用父类方法就调用父类变量,父类变量为null
class City extends Country;
   string name;
   function void play_something();
     name = "Shanghai";
     //super.play_something();  //调用父类方法(先调用父类方法,再调用父类变量,父类变量不为null)  
     $display("son name: %0s!!!",name);			//调用本class变量 name="Shanghai"
     $display("super name: %0s!!!",super.name);   //调用父类变量 super.name="China"
   endfunction
endclass

在这里插入图片描述

运行结果符合预期:不调用父类方法的前提下,便开始调用父类变量,父类变量为null 。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值