Verilog语句中task & function的区别
task与function的不同点:
1. function只能与主模块共用同一个仿真时间单元,而task可以定义自己的仿真时间单元;
2. task能调用function和其他task,而function不能调用task;
3. function至少要有一个输入变量,而任务可以没有,也可以有多个任何类型的变量;
4. 函数返回一个值,而任务不返回值。
例子:
让一个字的高字节和低字节互换。
task switch_bytes;
input [15:0]old_word; //输入输出端口及类型定义
output [15:0]new_word;
begin
new_word={old_word[7:0],old_word[15:8]};
end
endtask
// 调用任务
switch_bytes(old_word,new_word);
function [15:0]switch_bytes; //定义的函数需标明位数,否则默认为一位
input [15:0]old_word; //输入变量及类型定义
begin
switch_bytes={old_word[7:0],old_word[15:8]};
end
endfunction
//调用函数
new_word=switch_bytes(old_word);
其中,函数的名称定义需要标明位数,因为函数的定义把函数的返回值所赋值寄存器名称初始化为与函数同名的内部变量。
与任务相比,函数的定义有较多的约束,如下:
1. 函数的定义不能包含有任何的时间控制语句,例如#,@或者wait来标识的语句;
2. 函数不能启动任务;
3. 函数的定义至少要有一个输入变量;
4. 函数的定义中必须要有一条赋值语句给函数中的一个内部变量赋以函数的结果值,该变量需与函数同名。
