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
// ...