verilog中的task和function不同点如下:
1)函数只能与主模块共同用同一个仿真时间单位,而任务可以定义自己的仿真时间单位;
2)函数不能启动任务,而任务能启动其他函数和任务;
3)函数至少要有一个输入变量,而任务可以没有或有多个任何类型的输入变量;
4)函数返回一个值,而任务则不返回值;
函数的目的是通过返回一个值来响应输入信号的值,verilog中使用函数时,把它当作表达式中的操作符,这个操作的结果的值就是函数的返回值;
任务能支持多种目的,能计算多个结果值,这些结果值只能通过被调用的任务的输出或总线端口输出。
function函数的使用规则:
1.函数的定义不能包含有任何的时间控制语句,即# @ 或wait语句;
2.函数不能启动任务;
3.定义函数至少要有一个输入参量;
4.在函数的定义中必须有一条赋值语句给函数中的一个内部变量赋以函数的结果值,该内部变量具有和函数名相同的名字;
function <返回值的类型或范围> getbyte;
input [15:0] address;
begin
//<说明语句>
getbyte = result_expression;
end
endfunction
//<返回值的类型或范围>这一个选项是可选的,如默认则返回值为一位寄存器类型的数据,即function reg getbyte;
module tryfact;
//函数的定义
function [31:0] factorial;
input [3:0] operand;
reg [3:0] index;
begin
factorial = 1;
for(index=2; index<=operand; index=index+1)
factorial = index * factorial;
end
endfunction
//函数的测试
reg [31:0] result;
reg [3:0] n;
initial begin
result = n * factorial(n)/((n*2)+1) //函数的调用
$display("final result: %d", result);
end
endmodule
task任务的使用规则:
如果传给任务的变量值和任务完成后接收结果的变量已定义,就可以用一条语句启动任务,任务完成以后任务就传回启动过程。
任务想要有输出,必须定义output类型的变量,将值赋值给输出类型的变量;
task my_task;
input a, b;
inout c;
output d, e;
<语句>
c = foo1;
d = foo2;
d = foo3; //对任务的输出变量赋值
endtask
任务调用:my_tasks(v, w, x, y, z);
任务定义的变量和任务调用的变量是一 一对应的。
module traffic_lights;
reg clock, red, amber, green;
parameter on = 1, off = 0, reg_tics = 350, amber_tics = 500, green_tics = 150;
//交通灯初始化
initial reg = off;
initial amber = off;
initial green = off;
//交通灯控制时序
always begin
red = on;
light(red, red_tics); //调用等待任务
green = on;
light(green, green_tics);
amber = on;
light(amber, amber_tics);
end
// 定义task任务
task light;
output color;
input [31:0] tics;
begin
repeat(tics)
@(posedge clock);
color = off;
end
endtask
//产生时钟
always begin
#100 clock = 0;
#100 clock = 1;
end
endmodule