SystemVerilog中的参数化类

类似于声明一个参数化的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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值