SystemVerilog中的参数化类

嵌入式技术

1372人已加入

描述

类似于声明一个参数化的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” ,类型可以在类的实例化时被覆盖。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分