类似于声明一个参数化的module,我们也可以声明一个参数化的class。这个参数可以用来实例化不同数值和类型的对象。
参数化的类可以减少代码量,提高代码的可维护性。
Parameters类似于一个类里面的局部变量,不同的参数可以具有不同的默认值,并且可以在实例化时被覆盖掉。
对象的参数在构造时已经确定了,也就是说不支持在仿真时动态地修改。
参数化类的声明格式如下:
class mClass #(int DATA = 32);
参数化类例化方式如下:
mClass #(64) mClassInst;
mClass #(.DATA(64)) mClassInst;
参数化类例化时可以是值传递,也可以是位置传递。一般parameter都是使用大写字母表示。
数值参数化
module top;
class packet #(parameter int A_WIDTH = 32, D_WIDTH = 32);
//parameter keyword is optional
bit [A_WIDTH-1:0] address;
bit [D_WIDTH-1:0] data ;
function new( );
address = 'hff;
data = 'h11;
endfunction
endclass
initial begin
packet #(.A_WIDTH(64), .D_WIDTH(16)) p1;
packet #(16,8) p2;
packet p3; //default values of parameters
$display (“p1.address = %0d bits”, $bits(p1.address));
$display (“p1.data = %0d bits”, $bits(p1.data));
$display (“p2.address = %0d bits”, $bits(p2.address));
$display (“p2.data = %0d bits”, $bits(p2.data));
$display (“p3.address = %0d bits”, $bits(p3.address));
$display (“p3.data = %0d bits”, $bits(p3.data));
end
endmodule
仿真log:
p1.address = 64 bits
p1.data = 16 bits
p2.address = 16 bits
p2.data = 8 bits
p3.address = 32 bits
p3.data = 32 bits
V C S S i m u l a t i o n R e p o r t
在上面的例子中,我们定义了参数化类“packet”,其中含有参数A_WIDTH和D_WIDTH,默认值都是32。
后面我们在实例化时可以覆盖这两个参数的默认值,也可以不覆盖(使用默认值)。
类型参数化
除了数值参数化,还可以声明类型参数化的类,示例如下:
module top;
//parameterize data type
class packet #(parameter type I = int);
I data; //data of type I (default ‘int’)
endclass
initial begin
//Instantiate ‘packet’ with diferent data type overrides.
packet #(bit[3:0]) p1; //override with data type
‘bit[3:0]’
packet p2; //default data type ‘int’
packet #(real) p3; //override with data type ‘real’
$display ("p1.data Type = ", $typename(p1.data));
$display ("p2.data Type = ", $typename(p2.data));
$display ("p3.data Type = ", $typename(p3.data));
end
endmodule
仿真log:
p1.data Type = bit[3:0]
p2.data Type = int
p3.data Type = real
V C S S i m u l a t i o n R e p o r t
在类“packet”中,我们声明了parameter “type I = int” ,这是一个类型parameter,具体作用和数值parameter有所区别。
类型名称是“I” ,默认类型是“int” ,类型可以在类的实例化时被覆盖。