http://blog.163.com/taofenfang_05/blog/static/64214093201181692057682/
任务和函数只能实现组合逻辑,而对时序逻辑无能为力。
1 任务
任务就是一段封装在“task-endtask”之间的程序。任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的。调用某个任务时可能需要它处理某些数据并返回操作结果,所以任务应当有接收数据的输入端和返回数据的输出端。
任务可以彼此调用,而且任务内还可以调用函数。任务是不可综合的,它只能用于仿真。
(1)任务定义
任务定义的形式如下:
task task_id // 任务名
[declaration] //端口定义
procedural_statement //任务的具体操作语句
endtask
其中,task_id是任务名;可选项declaration是端口声明语句和变量声明语句,任务接收输入值和返回输出值就是通过此处声明的端口进行的;procedural_statement是一段用来完成这个任务操作的过程语句,如果过程语句多于一条,应将其放在语句块内。
一些注意事项:
a. 在任务定义结构中不能出现initial和always过程块。
b. 任务的输入、输出端口和双向端口数量不受限制,甚至可以没有输入、输出端口和双向端口。
(2)任务调用
任务调用语句可以在initial语句和always语句中使用,其语法形式如下:
task_id[(expr1, expr2, ........, exprN)];
task_id是要调用的任务名,expr1, expr2, ........是参数列表。参数列表给出传入任务的数据(进入任务的输入端)和接收返回结果的变量(从任务的输出端接收返回结果),任务调用语句中参数列表的顺序必须与任务定义中的端口声明顺序相同。任务调用语句是过程性语句,所以任务调用中接收返回数据的变量必须是寄存器类型。
调用任务时,可以引用任务声明所在的模块内定义的任何变量。
任务内可以带有时序控制,如时延。但任务的输出值必须等到整个任务的全部语句都执行完之后才能返回。
2 函数
和任务一样,verilog的函数也是一段可以完成特定操作的程序,这段程序处于关键词“function-endfunction”之间。
(1)函数定义
函数定义和任务定义一样,可以出现在模块内的任何位置,其形式如下:
function [range] function_id;
input_declaration
other_declarations
procedural_statement
endfunction
其中[range]参数指定返回值的类型或位宽,默认是1比特数据。
function_id为所定义函数的名称,对函数的调用也是通过函数名来完成的,而且它在函数结构体内代表一个内部变量,函数调用的返回值就是通过函数名变量传递给调用语句的。
一些注意事项:
a. 函数定义只能在模块中完成,不能出现在过程块中;
b. 函数至少要有一个输入端口,但不能包含输出和双向端口;
c. 在函数结构中,不能使用任何形式的时间控制语句(#、wait等),也不能使用disable中止语句;
d. 函数定义结构体总不能出现过程块语句;
e. 函数内部可以调用函数,但不能调用过程。
函数的定义中并没有声明输出,函数定义时,在函数内部已经隐性的声明了一个寄存器变量,该寄存器变量与函数名同名并且取值范围也相同。
(2)函数调用
函数也是在被调用时才被执行的,调用函数的语句:func_id(expr1, expr2, ........., exprN),其中,func_id是要调用的函数名,expr1, expr2, ......exprN是传递给函数的输入参数列表,该输入参数列表的顺序必须与函数定义时声明其输入的顺序相同。
在函数内部声明的所有寄存器都是静态的,当函数被调用时,这些寄存器的值不能被改变。
一些注意事项:
a. 函数调用可以在过程块中完成,也可以在assign这样的连续赋值语句中出现;
b. 函数调用语句不能单独作为一条语句出现,只能作为赋值语句的右端操作数。
3 任务与函数比较
比较点 任务 函数
输入输出 可以有任意多个输入输出 至少一输入,不能有输出和双向端口
调用 任务只能在过程语句中调用, 函数可作为赋值操作的表达式,
而不能在连续赋值语句中调用 用于过程赋值和连续赋值语句
触发事件控制 任务不能出现always语句; 函数中不能出现always、#,
可以包含延时控制语句(#), 这样的语句,要保证函数执行
但只能面向仿真,不能综合 在零时间内完成
调用其他 可以调用其他任务和函数 只能调用函数,不能调用任务
返回值 通过输出端口传递返回值 通过函数名返回,只有一个返回值
其他说明 任务调用语句可以作为一条 函数调用语句不能单独作为
完整的语句出现 一条语句,出现只能作为赋
值语句的右端操作数
中断 可以由disable中断 不允许由disable中断