任务(task):
- 用task和endtask进行声明,可以有input,output,inout参数
- 结果通过被调用的任务的输出或者总线端送出
- 可以有多个类型的变量
- 模块内可以包含时序控制,时间控制结构
- 可以调用其它任务或者函数
- 任务的输入输出是用来传入传出变量的,而模块端口是连接
- 可能存在两次同时调用任务的可能,用automatic可以自动分配地址
eg:
module mult (clk,a,b,out,delay);
input clk; (输入输出)
input [3:0] a,b;
output [7:0] out;
reg [7:0] out;
always @ (posedge clk)
mult_use(a,b,out);
task mult_use;
input [3:0] xme,tome;
output [7:0] result;
wait (delay) (时序)
result=xme*tome; (结果通过输出给调用函数的输出out)
endtask
endmodule
函数(function)
- 通过返回一个值来相应输入信号的值
- 一般做作为表达式中的操作符,操作结果就是函数的返回值
- 至少需要一个输入变量一个返回值
- 函数中不能调用任务,可以调用其它函数
- 不能包含非阻塞语句
- 仿真时间从0开始
- 不包含时序
- 只有输入input参数并且由函数名返回一个结果
- 函数调用既可出现在过程块也可以出现在连续赋值语句
- 每次电路综合的函数都会成为一个独立的电路模块,而仿真中函数只能与子模块公用一个仿真时间单位
- 如果函数在两个不同地方被同时调用则需要用自动递归automatic函数解决
eg:
module orand(a,b,c,en,out);
input en;
input [7:0] a,b,c;
output [7:0] out1,out2;
reg [7:0] out1,out2;
always @ (a or b or c or en)
作为表达式的操作符)
function [7:0] fun_log;
只有且至少有一个input)
input en;
- 不包含时序)
只能为阻塞语句,类似软件代码顺序执行)
else
函数名返回结果)
endfunction
endmodule
函数和任务的区别:
函数和任务的区别:
function | task | |
输入 | 至少有一个输入端口 | 可以多个或者没有 |
输出 | 没有输出 | 多个或没有 |
结果 | 函数名返回一个值 | 输出端口传递 |
调用 | 可以其它函数,不能调用任务 | 可以调用函数或者任务 |
逻辑 | 常用于计算或者描述组合逻辑 | 时序控制行为描述 |
被调用 | 以语句的一部分出现,类似操作符 | 通过单独的任务调用语句实现 |
出现 | 过程块或者连续赋值语句中 | 过程块中 |
时间 | 无时序,时间控制语句 | 可以出现时间时序控制语句 |
disable | 不允许disable中断 | 可以由disable中断 |
总结:
1.任务可以理解为将不同的input送进去,在top task里面有不同的小task和function一起协同处理,最终通过output送出来。
2.函数可以理解为软件的函数,串行处理所以不能有时序和时间的控制语句,所以必须要有一个或者多个输入,经过函数的处理之后返回一个值,这个值就等于function(value)。