任务和函数只能实现组合逻辑,而对时序逻辑无能为力。 一、任务 任务就是一段封装在“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、#)这样的语句,要保证函数的执行在零时间内完成 | | 调用其他任务和函数 | 可以调用其他任务和函数 | 只能调用函数,不能调用任务 | | 返回值 | 没有返回值 | 只有一个返回值 | | 其他说明 | 任务调用语句可以作为一条完整的语句出现 | 函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数 |
|