嵌入式技术
类似于声明一个参数化的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” ,类型可以在类的实例化时被覆盖。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !