自动和静态任务之间有什么区别,为什么我们不能通过引用传递静态任务

时间:2015-01-19 09:43:35

标签: system-verilog

静态和自动任务之间有什么区别。

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

如果执行此代码,则会给出错误

  

引用参数在静态任务函数声明中是非法的

如果任务"地图"程序自动运行。

为什么我们需要自动完成任务?静态和自动任务有什么区别?

2 个答案:

答案 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声明即使在任务之外删除数组,如果通过引用该任务传递了数组的元素,那么该元素必须保持活动状态。删除数组后,模拟的其余部分仍然无法看到它。这将是一种快速遇到内存不足错误的有趣方法。

问题:静态任务的参数是否有可能具有静态生命周期?如果是这样,如果使用不同的参数值再次调用该任务,是否可以使用指向另一个对象的指针覆盖对象的引用句柄?