system verilog 指针this 和 super

调用变量

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

使用 this 和 super 调用成员变量和方法,this 和 super的区别在于:

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


调用方法

https://www.runoob.com/w3cnote/the-different-this-super.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值