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

Aks*_*til 5 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
Run Code Online (Sandbox Code Playgroud)

如果执行此代码,它将给出错误

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

如果任务"map"自动运行程序.

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

Tud*_*imi 10

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

这意味着执行以下任务:

task some_task();
  int foo = 5;
  // ...
endtask
Run Code Online (Sandbox Code Playgroud)

如果我们将它定义为静态,那么所有调用都会看到foo的相同值(即foo将在它们之间共享).这意味着更改一个线程中的值将使所有其他线程也看到更改.

如果我们自动定义some_task(),那么每个调用都有自己的foo本地副本,完全独立于其他调用.在一个线程中更改foo对其他线程没有任何影响.


Mei*_*eir 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
Run Code Online (Sandbox Code Playgroud)

输出:

i=1
i=2
$finish called from file "try.sv", line 15
Run Code Online (Sandbox Code Playgroud)