在systemverilog中module,program,function和task默认都是static的,
可以在module,program,function和task加入automatic用作动态。
在class中是automatic的。
-
static 变量为静态的,在整个程序执行过程中都存在,并且无论被实例多少次,在内存中只存在一份,每次实例都是指向这一个地址,共享一个变量
-
automatic是每次实例均产生一个新的内存,互相不共享,是单独、不同的
static 和 automatic 除了可以修饰类中的成员变量,还可以修饰 function 和 task,被static修饰的方法称为静态方法,被automatic修饰的方法称为动态方法。 -
如果方法被static修饰,那么其内部所有的声明的变量都是 static 的
-
如果方法被修饰为 automatic,那么其内部所有的声明的变量默认都是 automatic的
module static_test;
//声明动态函数
function automatic int cnt1(input a);
int cnt = 0;
cnt += a;
return cnt;
endfunction
//声明静态函数
function static int cnt2(input a);
static int cnt = 0;
cnt += a;
return cnt;
endfunction
//未声明
function int cnt3(input a);
int cnt = 0;
cnt += a;
return cnt;
endfunction
endmodule
initial begin
$display("%0d",cnt1(1)); 输出1
$display("%0d",cnt1(1)); 输出1
$display("%0d",cnt2(1)); 输出1
$display("%0d",cnt2(1)); 输出2
$display("%0d",cnt3(1)); 输出1
$display("%0d",cnt3(1)); 输出2
end