基类构造函数
在systemverilog中,如果一个类没有显式地声明构造函数(new()),那么编译仿真工具会自动提供一个隐式的new()函数。这个new函数会默认地将所有属性变量。

初始化为默认值(“0”:2状态变量,“x”:4状态变量)。
super.new( )
继承类中new()函数默认一开始就会调用其父类中的new()函数(super.new( )).
module class_TOP( );
class base;
function new( );
$display($stime,,,” new( ) from BASE Class”);
endfunction
endclass : base
class ext extends base;
function new;
super.new( ); //MUST be the frst statement
$display($stime,,, “Call super.new from Extended
class”);
endfunction
endclass: ext
base base1;
ext ext1;
initial begin;
ext1 = new( );
end
initial #1 $fnish(2);
endmodule
仿真log:
0 new( ) from BASE Class
0 Call super.new from Extended class
$fnish at simulation time 1
V C S S i m u l a t i o n R e p o r t
上面是一个关于继承类构造函数执行顺序的简单示例。在类“base”中,我们定义了它的构造函数new(),一个简单的$display语句。
然后我们将“base”类扩展到“ext”类。当”ext”被实例化时,它的new()方法将首先调用super.new ()。
在仿真log中,我们看到” base “类的display语句比”ext”类的display语句先执行。
另外还需要知道的是,如果你去掉“super.new”,我们依然会得到相同的仿真打印信息,因为编译仿真工具会默认帮我们添加“super.new”语句。
但是,如果new函数中存在参数,就必须要要显式地加上super.new (*),因为工具事先没法知道你想要声明的参数是什么?
强烈建议在所有的扩展类中都显式地加上super.new ,以获得更好的可读性。
module class_TOP( );
class base;
logic [31:0] data;
function new(logic [31:0] dataIn);
data = dataIn;
$display($stime,,, “new( ) from BASE Class: data=%h”,
data);
endfunction
endclass : base
class ext extends base;
function new (logic [31:0] dataExt);
super.new(dataExt); //MUST call super.new
//MUST be the frst statement
//pass dataExt to the base class constructor
$display($stime,,, “super.new from Extended class”);
endfunction
endclass: ext
base base1;
ext ext1;
logic [31:0] data;
initial begin;
data = ‘hf0f0_f0f0;
ext1 = new(data);
end
initial #10 $fnish(2);
endmodule
仿真log:
0 new( ) from BASE Class: data=f0f0f0f0
0 super.new from Extended class
$fnish at simulation time 10
V C S S i m u l a t i o n R e p o r t
在本例中,我们在new函数中传递参数dada,以初始化类中的变量。如果这时我们不加上super.new,仿真工具就会报错:
Error-[SV-SNCIM] Super new call is missing
testbench.sv, 13
class_TOP
Base class constructor specifcation is missing in derived class ‘ext’.
Please add ::new arguments to ‘extends’ specifcation or add
call to ‘super.new’ in ::new.
审核编辑:汤梓红