静态和自动任务之间有什么区别。
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
如果执行此代码,则会给出错误
引用参数在静态任务函数声明中是非法的
如果任务"地图"程序自动运行。
为什么我们需要自动完成任务?静态和自动任务有什么区别?
答案 0 :(得分:6)
我认为值得注意的是,在system-verilog中,模块/程序中定义的每个任务/函数或独立默认为静态,但如果在类中定义,则默认为自动(和任何其他编程语言一样)。我认为原因是verilog不是“普通语言”,而是HDL语言,模块中的always
块根据定义是静态的。
function add();
int i;
i++;
$display("i=%0d", i);
endfunction
module try;
initial begin
add();
add();
$finish;
end
endmodule
输出:
i=1
i=2
$finish called from file "try.sv", line 15
答案 1 :(得分:0)
没有人解决问题的“为什么我们不能通过引用静态任务”。就我所知,LRM没有提供“为什么”,但我可以冒险猜测并提出进一步的问题。
猜猜:垃圾收集是个问题。通过传递对静态函数的引用,实际上,它们永远保持活着。 LRM声明即使在任务之外删除数组,如果通过引用该任务传递了数组的元素,那么该元素必须保持活动状态。删除数组后,模拟的其余部分仍然无法看到它。这将是一种快速遇到内存不足错误的有趣方法。
问题:静态任务的参数是否有可能具有静态生命周期?如果是这样,如果使用不同的参数值再次调用该任务,是否可以使用指向另一个对象的指针覆盖对象的引用句柄?