一、格式/用法
function的一般格式为:
function <返回值的范围> (名字)
<端口说明语句>
<变量类型说明语句>
begin
……
end
endfunction
例如:
function [7:0] data_rx ;
input [7:0] data_in;
integer i;
for(i=0; i<range; i++)
begin
...
end
endfunction
task的一般格式为:
task <任务名> (<端口及数据类型说明语句>)
<语句1>
<语句2>
...
endtask
例如:
task tx_bit( input [7:0] data ); integer i; for (i=0; i<10; i=i+1) case (i) ... endcase endtask
二、二者区别(面试或笔试可能会有)
网上搜集的,大概总结了四点,有区别但是大体意思差不多
- 任务能调用函数,但函数不能调用任务。
- 任务可以描述组合逻辑和时序逻辑,定义结构中可以有延时语句;函数的定义不能包含有任何的时间控制语句,即任何用#、@、或wait来标识的语句。函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位。
- 任务可以有多个类型的输入;函数只能有input端口的输入参数,且至少输入一个参数。
- 任务可以没有返回值;函数必须有一个返回值。

图片来自知乎用户@罗成,详细内容可以去Verilog语法之十一:任务(task)和函数(function) - 知乎 (zhihu.com)
任务通常用于调试或对硬件进行行为描述,可支持多种目的,而函数通常用于计算、描述组合逻辑,目的是通过返回一个值来相应输入信号的值。
三、杂七杂八
在调用函数时,需要注意以下几点:
- 函数调用可以在过程块中完成,也可以在assign 这样的连续赋值语句中出现。
- 函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数
在调用任务时,需要注意以下几点:
- 任务调用语句只能出现在过程块内;
- 任务调用语句和一条普通的行为描述语句的处理方法一致;
- 当被调用输入、输出或双向端口时,任务调用语句必须包含端口名列表,且信号端口顺序和类型必须和任务定义结构中的顺序和类型一致。需要说明的是,任务的输出端口必须和寄存器类型的数据变量对应。
- 可综合任务只能实现组合逻辑,也就是说调用可综合任务的时间为“0” 。而在面向仿真的任务中可以带有时序控制,如时延,因此面向仿真的任务的调用时间不为“0“。
还有几点:
- 在第一行“task”语句中不能列出端口名称;
- 在任务定义的描述语句中,可以使用出现不可综合操作符合语句(使用最为频繁的就是延迟控制语句) ,但这样会造成该任务不可综合。
- 在任务定义中可以出现“disable 中止语句” ,将中断正在执行的任务,但其是不可综合的。当任务被中断后,程序流程将返回到调用任务的地方继续向下执行。