System verilog 我想终止一个永久任务,该任务由一个后来被终止的对象调用
结束程序System verilog 我想终止一个永久任务,该任务由一个后来被终止的对象调用,system-verilog,System Verilog,结束程序 //大家好,我正在创建u3_param类的对象,我使用了两个并行线程,一个线程调用u3_param对象的任务,它是永久的,在另一个并行线程中,在等待一些模拟延迟后,我通过赋值null删除了该对象。我认为永久对象的任务必须停止,但它仍在运行,我想知道如何杀死所谓的任务 您的模拟器不符合标准。向您的模拟器提供商提交问题。自Accellera的SystemVerilog 3.1中添加类以来,未引用对象上的垃圾收集一直是SystemVerilog标准的一部分 涵盖“内存管理”的章节(由LRM编
//大家好,我正在创建u3_param类的对象,我使用了两个并行线程,一个线程调用u3_param对象的任务,它是永久的,在另一个并行线程中,在等待一些模拟延迟后,我通过赋值null删除了该对象。我认为永久对象的任务必须停止,但它仍在运行,我想知道如何杀死所谓的任务 您的模拟器不符合标准。向您的模拟器提供商提交问题。自Accellera的SystemVerilog 3.1中添加类以来,未引用对象上的垃圾收集一直是SystemVerilog标准的一部分 涵盖“内存管理”的章节(由LRM编写:IEEE 1800-2005§7.26、IEEE 1800-2009§7.26、§8.29、Accellera的SystemVerilog 3.1/3.1a§11.26)涵盖了与SO的问题几乎相同的场景。引用所有LRM: 用户无需担心挂起引用、过早释放或内存泄漏。系统应自动回收不再使用的任何物体。在前面的示例中,当用户不再需要handle obj时,他们所做的就是将
null
分配给引用handle obj的所有变量。在任何活动作用域中存在对该对象的未完成引用,或对该对象的非静态成员的未决非阻塞分配时,不得回收该对象
如果您被这个错误困扰,那么您需要停止机械化,例如:
program ass_arry();
int i;
int j;
class u3_param;
int j;
task print(int s);
forever begin
#10us;
$display("%t %M:the object number=%d ",$time,s);
end
endtask
endclass
u3_param o_u3_param;//creating object
initial
begin
o_u3_param=new();//i am creating object handle here
o_u3_param.print(1);//i am calling task which is forever
end
initial
begin
#20us;
o_u3_param=null;
#50us;
$finish();
end
@用户3181456,“评论是为了要求澄清,留下建设性的批评,或添加相关但次要的附加信息,而不是为了社交。如果你想说“谢谢”,请投票或接受此人的答案,或者简单地通过对其他人的问题提供一个很好的答案来提前回答。”
// ...
class Object;
bit kill;
task run();
fork : run_thread
wait(kill==1) disable run_thread;
forever #5ns $display("I'm still alive @ %t",$time);
join_none
endtask
endclass
// ...
Object obj;
initial begin
obj = new();
obj.run();
#1us; obj.kill = 1;
#20ns; obj = null;
#20ns; $display("End @ %t",$time);
$finish;
end
// ...