1.继承性
关键词:extends
例题
class cat;
protected cloor_t color;
local bit is_good;
function set_good(bit s);
this.is_good = s;
endfunction
endclass
class black_cat extends cat;
function new();
this.color = BLACK;
endfunction
endclass
class white_cat extends cat;
function new();
this.color = WHITE;
endfunction
endclass
black_cat bk;
white_cat wt;
initial begin
bk = new();
wt = new();
bk.set_good(1);
wt.set_good(1);
end
解析:
因为color的封装是protected,只有子类可以访问,所以无法通过外部修改颜色,A错。
因为is_good的封装是local,子类无法访问,黑猫是猫的子类,所以无法修改,B,外部也无法访问,C错。
子类通过super来索引父类的同名函数
子类中使用this.xxx是先访问子类有没有xxx的变量或者方法,而super.xxx直接访问父类的变量和方法,不会访问子类。
案例
在test类中通过继承于basic_test的两个子类test_wr和test_rd,分别用于对DUT进行写测试和读测试。
class basic_test; //父类
int def = 100;//成员变量赋予默认值
int fin;
task test(stm_ini ini);
$display("basic_test::test");
endtask
function new(int val);
...
endfunction
endclass
class test_wr extends basic_test;//子类wr
function new()l
super.new(def);
$display("test_wr::new");
endfunction
task test(stm_ini ini);
super.test(ini);
$display ("test_wr::test");
...
endtask
endclass
class test_rd extends basic_test;//子类rd
function new()l
super.new(def);
$display("test_rd::new");
endfunction
task test(stm_ini ini);
super.test(ini);
$display ("test_rd::test");
...
endtask
endclass
子类中的方法和父类本没有任何关联,是通过super才继承的。
2.成员覆盖
在上述代码父类中def = 100 的基础上,编写另一个子类
class test_wr extends basic_test;//子类wr
int def = 200;
function new()l
super.new(def);
$display("test_wr::new");
$display("test_wr::super.def = %0d",super.def);
$display("test_wr::this.def = %0d",this.def);
endfunction
...
endclass
这个子类中def = 200,所以super.def = 100,this.def = 200:.
问题:下述代码中wr.def和t.def的值分别是多少?
module tb;
...
basic_test t;//父类声明句柄
test_wr wr;//子类声明句柄
initial begin
wr = new();//子类创建对象
t = wr;子类句柄赋值给父类
$display("wr.def = %0d",wr.def);
$display("t.def = %0d",t.def);
end
endmodule
解析:子类句柄赋值给父类之后,被赋值的父类句柄只能指向整个子类中属于父类的部分,如图,t只能指向basic部分,所以t.def = 100,wr.def = 200.但父类的句柄不能赋值给子类