任务

任务(task)几乎与函数类似,但任务可以计算多个变量并使用输出或 inout 语句返回它们,但不像函数那样必需,即任务不是返回类型,并且任务能够具有诸如 #、@、等待。任务也可以调用另一个任务和函数。

语法:

task_name(arguments); 

task task_name(arguments); 
statement1; 
statement2; 
. 
.  
statementN;  
endtask  

限制:

  • 任务不可综合

流程图

01

automatic task#

每当声明为 automatic task 时,每次调用该任务时,模拟器都会分配新的内存。一般来说,任务在模块内部是静态的,要使其自动执行,需要添加 automatic 关键字,如下所示。

语法:

task automatic task_name()

示例:

         task automatic factorial_automatic(int var1);
          #1;
          if(var1>=2)
          begin
            factorial_automatic(var1-1);
            result=result*var1;
          end
          else
          begin
            result=1;
           ->a;
        end
      endtask
      initial
      begin
        
        fork
          factorial_static(5);
         factorial_automatic(5);
         join
       fork
      wait(a.triggered);
      $display("@ %0t ns , factorial_automatic:%0d",$time,result);
      end

流程图:

02

从任务中调用函数#

示例:

       initial
       begin
        $display("\t ----output for func from task----");
        $display("\t@ %0t ns, In the initial block",$time);
        $display("\tcalling task");
        task_sum;
        $display("\treturned to initial from function");
       end  
 
     task task_sum;
        #1 $display( "\t@ %0t ns , I'm in task",$time);
        $display("\tcalling func inside a task");
        #1 void'(function_sum);
        $display("\treturned to task from function");
      endtask
 
      function function_sum;
        $display( "\t@ %0t ns I'm in function",$time);
      endfunction

从函数中调用任务是非法的,但从任务中调用 func 是正常的,因为函数没有任何耗时的语句。

流程图:

03

全局任务#

如果一个任务是在模​​块和类之外声明的,则该任务被称为全局任务,默认的全局任务本质上是静态的。该全局任务可以从任何模块调用,通过以下示例可以更好地理解。

示例:

     task mul(input int var1,var2,output int res);
         #1 res=var1*var2;
      endtask
  
     module task1();
  
     int multiplicand=5,multiplicator=6,result;
      initial
       begin
         $display("\t ----output of global task----");
       mul(multiplicand,multiplicator,result);
       $display("\t @ %0t ns , %0d X %0d = %0d",$time,multiplicand,multiplicator,result);
       end
     endmodule
 
     module task2();
      int r;
     initial
       begin
       #2 mul(7,8,r);
       $display("\t @ %0t ns , 7 X 8 = %0d",$time,r);
       end
     endmodule

禁用任务#

可以通过在任务名称中使用关键字 disable 来禁用任务,这会在调用禁用时停止该特定任务。

示例:

      module disable_task();
  
     initial
     begin
       $display("\t ----output of disable task----");
       fork
       display_task();
       #20 disable display_task.task_A;
        join
     end
  
     task display_task();
       begin : task_A
          $display("\t @ %0t ns , task_A initiated",$time);
          #30 $display("\t @ %0t ns , task_A finished",$time);
        end :task_A
   
      begin : task_B
        $display("\t @ %0t ns , task_B initiated",$time);
        #10 $display("\t @ %0t ns , task_B finished",$time);
      end :task_B
  
      endtask
      endmodule