SV---类的继承

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 

SV---类的继承_第1张图片

解析:

因为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才继承的。

SV---类的继承_第2张图片

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.但父类的句柄不能赋值给子类

SV---类的继承_第3张图片

你可能感兴趣的:(SV,systemverilog)