静态和自动任务之间有什么区别.
program class_ref;
int index,value;
class holding_values;
int ass_array[*];
task assign_value (int value,int index);
ass_array[index] = value;
endtask
function void disp(int index);
$display("%t %M:ASSOSIATIVA VALUE%d ",$time,ass_array[index]);
endfunction
endclass
initial begin
holding_values obc;
index =5;
value =88;
obc = new();
map(obc,value);
obc.disp(index);
end
task map(ref holding_values obc,ref int value );
value +=5;
obc.assign_value(value,index);
obc =null;
endtask
endprogram
Run Code Online (Sandbox Code Playgroud)
如果执行此代码,它将给出错误
参数参数在静态任务函数声明中是非法的
如果任务"map"自动运行程序.
为什么我们需要自动完成任务?静态和自动任务有什么区别?
Tud*_*imi 10
对于静态任务,同一任务的多次调用将引用相同的局部变量.对于自动任务,局部变量对于每次调用任务都是唯一的.
这意味着执行以下任务:
task some_task();
int foo = 5;
// ...
endtask
Run Code Online (Sandbox Code Playgroud)
如果我们将它定义为静态,那么所有调用都会看到foo的相同值(即foo将在它们之间共享).这意味着更改一个线程中的值将使所有其他线程也看到更改.
如果我们自动定义some_task(),那么每个调用都有自己的foo本地副本,完全独立于其他调用.在一个线程中更改foo对其他线程没有任何影响.
我认为值得注意的是,在system-verilog中,模块/程序或独立中定义的每个任务/函数 默认为静态,但如果在类中定义,则默认为自动(如在任何其他编程语言中).我认为原因是verilog不是"普通语言"而是HDL语言, always模块中的块根据定义是静态的.
function add();
int i;
i++;
$display("i=%0d", i);
endfunction
module try;
initial begin
add();
add();
$finish;
end
endmodule
Run Code Online (Sandbox Code Playgroud)
输出:
i=1
i=2
$finish called from file "try.sv", line 15
Run Code Online (Sandbox Code Playgroud)