任务和函数只能实现组合逻辑,而对时序逻辑无能为力。
一、任务
任务就是一段封装在“task…endtask”之间的程序。任务可以彼此调用,而且任务内还可以调用函数。
1、任务定义
形式如下:
task task_id; // 任务名
[declaration] // 端口定义
procedural_statement // 任务的具体操作语句
endtask一些注意事项:
a. 在任务定义结构中不能出现initial和always过程块。
b. 任务的输入、输出端口和双向端口数量不受限制,甚至可以没有输入、输出端口和双向端口。
2、任务调用
形式如下:
task_id[(端口1, 端口2, …, 端口n)];
一些注意事项:
a. 任务调用语句只能出现在过程块内;
b. 任务的输出端口必须和寄存器类型的数据变量对应;
二、函数
1、函数定义
形式如下:
function [range] function_id;
input_declaration
other_declarations
procedural_statement
endfunction
其中[range]参数指定返回值的类型或位宽,默认是1比特数据。function_id为所定义函数的名称,对函数的调用也是通过函数名来完成的,而且它在函数结构体内代表一个内部变量,函数调用的返回值就是通过函数名变量传递给调用语句的。
一些注意事项:
a. 函数定义只能在模块中完成,不能出现在过程块中;
b. 函数至少要有一个输入端口,但不能包含输出和双向端口;
c. 在函数结构中,不能使用任何形式的时间控制语句(#、wait等),也不能使用disable中止语句;
d. 函数定义结构体总不能出现过程块语句;
e. 函数内部可以调用函数,但不能调用过程。
2、函数调用
形式如下:
function_id(expr1, expr2, …, exprN);
一些注意事项:
a. 函数调用可以在过程块中完成,也可以在assign这样的连续赋值语句中出现;
b. 函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数。
3、任务和函数的区别
比较点 | 任务 | 函数 |
输入、输出 | 可以有任意多个各种类型的参数 | 至少有一个输入,不能有输出和双向端口 |
调用 | 任务只能在过程语句中调用,而不能在连续赋值语句中调用 | 函数可作为赋值操作的表达式,用于过程赋值和连续赋值语句 |
触发事件控制 | 任务不能出现always语句;可以包含延时控制语句(#),但只能面向仿真,不能综合 | 函数中不能出现(always、#)这样的语句,要保证函数的执行在零时间内完成 |
调用其他任务和函数 | 可以调用其他任务和函数 | 只能调用函数,不能调用任务 |
返回值 | 没有返回值 | 只有一个返回值 |
其他说明 | 任务调用语句可以作为一条完整的语句出现 | 函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数 |