任务(task):

  1. 用task和endtask进行声明,可以有input,output,inout参数
  2. 结果通过被调用的任务的输出或者总线端送出
  3. 可以有多个类型的变量
  4. 模块内可以包含时序控制,时间控制结构
  5. 可以调用其它任务或者函数
  6. 任务的输入输出是用来传入传出变量的,而模块端口是连接
  7. 可能存在两次同时调用任务的可能,用automatic可以自动分配地址

eg:

module mult (clk,a,b,out,delay);

       input clk;        (输入输出)

       input [3:0] a,b;

       output [7:0] out;

       reg [7:0] out;

              always @ (posedge clk)

                     mult_use(a,b,out);

              task mult_use;

              input [3:0] xme,tome;

              output [7:0] result;

                     wait (delay)   (时序)

                     result=xme*tome; (结果通过输出给调用函数的输出out)

              endtask

endmodule

函数(function)

  1. 通过返回一个值来相应输入信号的值
  2. 一般做作为表达式中的操作符,操作结果就是函数的返回值
  3. 至少需要一个输入变量一个返回值
  4. 函数中不能调用任务,可以调用其它函数
  5. 不能包含非阻塞语句
  6. 仿真时间从0开始
  7. 不包含时序
  8. 只有输入input参数并且由函数名返回一个结果
  9. 函数调用既可出现在过程块也可以出现在连续赋值语句
  10. 每次电路综合的函数都会成为一个独立的电路模块,而仿真中函数只能与子模块公用一个仿真时间单位
  11. 如果函数在两个不同地方被同时调用则需要用自动递归automatic函数解决

eg:

       module orand(a,b,c,en,out);

       input en;

       input [7:0] a,b,c;

       output [7:0] out1,out2;

       reg [7:0] out1,out2;

              always @ (a or b or c or en)

作为表达式的操作符)

              function [7:0] fun_log;

只有且至少有一个input)

                     input en;

  1. 不包含时序)

只能为阻塞语句,类似软件代码顺序执行)

                            else

函数名返回结果)

                endfunction

       endmodule

函数和任务的区别:

函数和任务的区别:


function

task

输入

至少有一个输入端口

可以多个或者没有

输出

没有输出

多个或没有

结果

函数名返回一个值

输出端口传递

调用

可以其它函数,不能调用任务

可以调用函数或者任务

逻辑

常用于计算或者描述组合逻辑

时序控制行为描述

被调用

以语句的一部分出现,类似操作符

通过单独的任务调用语句实现

出现

过程块或者连续赋值语句中

过程块中

时间

无时序,时间控制语句

可以出现时间时序控制语句

disable

不允许disable中断

可以由disable中断

总结:

1.任务可以理解为将不同的input送进去,在top task里面有不同的小task和function一起协同处理,最终通过output送出来。

2.函数可以理解为软件的函数,串行处理所以不能有时序和时间的控制语句,所以必须要有一个或者多个输入,经过函数的处理之后返回一个值,这个值就等于function(value)。