调用变量方面
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 。