我想杀死一个永远的任务,这个任务被一个后来被杀死的物体所召唤

时间:2014-01-10 11:50:57

标签: system-verilog

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

endprogram

//所有我正在创建类u3_param的对象,我使用了两个并行线程,一个线程调用u3_param对象的任务,这是永远的,在等待一些模拟延迟之后在另一个并行线程中我通过赋值来删除对象null.i认为对象的任务是永远必须停止但它仍在运行,我想知道如何杀死被称为任务。

1 个答案:

答案 0 :(得分:0)

您的模拟器不符合标准。向您的模拟器提供商提出问题。由于在Accellera的SystemVerilog 3.1中添加了类,因此未引用对象上的垃圾收集已成为SystemVerilog标准的一部分。

涵盖“内存管理”的部分(由LRM:IEEE1800-2005§7.26,IEEE1800-2009§7.26,IEEE 1800-2012§8.29,Accellera的SystemVerilog 3.1 /3.1a§11.26)涵盖附近的一个场景与SO的问题相同。引用所有 LRM:

  

用户无需担心悬空引用,过早释放或内存泄漏。系统应自动回收任何不再使用的对象。在前面的示例中,用户所做的就是将null分配给引用句柄 obj 的所有变量,当它们不再需要它时。如果在任何活动范围内有对该对象的未完成引用,或者对该对象的非静态成员进行挂起的非阻塞分配,则不应回收该对象。

如果你遇到了这个bug,那么你需要一个停止机制,例如:

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