天天看点

Verilog HDL的任务和函数

Technorati 标签: FPGA, CPLD, Verilog HDL

任务和函数只能实现组合逻辑,而对时序逻辑无能为力。

一、任务

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

继续阅读