systemverilog_静态与动态
- 一.序言
- 二.变量的静态与动态
- 1.定义及特点
- 2.注意点
- 3.例子
- 三.方法的静态与动态
- 1.定义及特点
- 2.注意
- 3.例子
一.序言
systemverilog中,静态与动态分为两大类问题进行讨论,分别为变量和方法。
二.变量的静态与动态
1.定义及特点
静态变量:创建于(初始化)编译阶段,存在于整个仿真过程,同一变量在不同实例间共享;
动态变量:创建于(初始化)调用时刻,调用结束对象销毁,同一变量在不同实例中分别存在;
2.注意点
(1)成员变量默认是动态的;
3.例子
(1)方法中的静态变量
语法:
用static关键字声明;
代码:
class cl1;task t1();static int a = 0;a = a +1;$display("a is %0d",a);endtask
endclass
module tb; initial begincl1 c1 = new();c1.t1();c1.t1();endendmodule
结果:
(2)方法中的动态变量
语法:
默认是动态或者用automatic声明;
代码:
class cl1;task t1();automatic int a = 0;a = a +1;$display("a is %0d",a);endtask
endclass
module tb; initial begincl1 c1 = new();c1.t1();c1.t1();endendmodule
结果:
(3)类中的静态变量
语法:
用static关键字声明;
代码:
class cl1;static int a = 0;task t1();a = a +1;endtask
endclass
module tb; initial begincl1 c1 = new();cl1 c2 = new();c1.t1();$display("a is %0d",c1.a);c2.t1();$display("a is %0d",c2.a);endendmodule
结果:
(4)类中的动态变量
语法:
默认是动态或者用automatic关键字进行声明;
代码:
class cl1;int a = 0;task t1();a = a +1;endtask
endclass
module tb; initial begincl1 c1 = new();cl1 c2 = new();c1.t1();$display("a is %0d",c1.a);c2.t1();$display("a is %0d",c2.a);end
endmodule
结果:
三.方法的静态与动态
1.定义及特点
(1)静态方法:
创建于编译阶段,所以在类实例化之前被调用;
只能访问类中的静态成员(包括静态变量或静态方法);
(2)动态方法:
创建于实例化,所以在类实**例化之后(不是声明后)**才能被调用;
既能访问类中的静态成员,又可以访问类中的动态成员;
2.注意
方法默认是动态的;
3.例子
class Myclass;static int staticvar = 0;int dynamicvar = 0;static function void static_method();$display("static var: %0d",staticvar);//error// $display("Dynamic var: %0d",dynamicvar);endfunction function void dynamic_method();$display("static var: %0d",staticvar);$display("dynamic var: %0d",dynamicvar);endfunction
endclass
module tb1;initial beginMyclass mc;Myclass::static_method();mc = new();mc.dynamic_method();end
endmodule
结果: