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

System verilog 自动任务和静态任务之间有什么区别,为什么我们不能通过引用传递静态任务,system-verilog,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:A

静态任务和自动任务之间的区别是什么

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
如果执行此代码,将给出错误

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

如果将任务“映射”设置为自动,则程序将运行


为什么我们需要使任务自动化?静态任务和自动任务之间有什么区别?

对于静态任务,同一任务的多次调用将引用相同的局部变量。对于自动任务,局部变量对于任务的每次调用都是唯一的

这意味着对于以下任务:

task some_task();
  int foo = 5;
  // ...
endtask
如果我们定义它static,那么所有调用都将看到相同的foo值(即foo将在它们之间共享)。这意味着更改一个线程中的值将使所有其他线程也看到更改


如果我们要定义某个_task()automatic,那么每个调用都有自己的foo本地副本,完全独立于其他调用。在一个线程中更改foo不会对其他线程产生任何影响。

我认为还值得注意的是,在系统verilog中,模块/程序或独立程序中定义的每个任务/函数默认为静态的,但如果在类中定义,则默认为自动的(与任何其他编程语言一样)。我想这是因为verilog不是一种“普通语言”,而是一种HDL语言,模块中的
总是
块根据定义是静态的

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
没有人回答这个问题的“为什么我们不能通过引用传递静态任务”部分。据我所知,LRM没有提供“为什么”,但我可以大胆猜测并提出进一步的问题

猜测:垃圾收集是个问题。通过传递对静态函数的引用,实际上可以使它们永远保持活力。LRM声明,即使在任务之外删除了一个数组,如果数组的一个元素通过引用传递给任务,那么该元素必须保持活动状态。删除阵列后,它仍然不会对其余的模拟可见。这将是一种快速运行内存不足错误的有趣方式


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

同样值得注意的是,有些人会忽略语言规范,并假设所有操作都是自动的,不管如何。如果任务是静态的,则对同一任务的多次调用将终止以前的任务称为task,因此任务之间不共享变量@Tudor@AkshayPatil我不这么认为。如果任务是静态的,那么对同一任务的多次调用将不会杀死先前调用的任务。示例如下: