任务应通过声明调用,该声明定义了传递给任务的参数值和接收结果的变量。任务完成后,控制权应传回调用进程。因此,如果任务内部有定时控制,则调用任务的时间与控制返回的时间可以不同。一个任务可以调用其他任务,而其他任务又可以调用其他任务--调用的任务数量不受限制。无论调用了多少个任务,在所有调用的任务完成之前,控制权都不会返回。任务的语法定义如下表所示:
从上表可以看出,标准提供了两种可供选择的任务声明语法。第一种语法以关键字 task 开始,随后是可选的关键字 automatic,接着是任务名称和分号,最后以关键字 endtask 结束。任务项声明(task_item_declaration)可指定以下内容:
- input参数
- output参数
- inout参数
- 过程块中可声明的所有数据类型
第二种语法应以关键字 task 开始,然后是任务名称和括号内的 task_port_list。task_port_list 应由零个或多个逗号分隔的 task_port_items 组成,括号后应加上分号,最后以关键字 endtask结束。
例 1-下面的示例说明了包含五个参数的任务定义的基本结构:
或者使用任务声明的第二种语法形式,任务可定义如下:
用下面的语句即可调用该任务:
my_task (v, w, x, y, z);
任务调用参数(v , w , x , y 和 z,相当于c语言的实参)与任务定义的参数(a , b , c , d 和 e,相当于c语言中的形参)相对应。
示例 2-下面的示例通过描述交通灯顺序来说明任务的使用:
module traffic_lights;
reg clock, red, amber, green;
parameter on = 1, off = 0, red_tics = 350, amber_tics = 30, green_tics = 200;
// initialize colors.
initial red = off;
initial amber = off;
initial green = off;
always begin // sequence to control the lights.
red = on; // turn red light on
light(red, red_tics); // and wait.
green = on; // turn green light on
light(green, green_tics); // and wait.
amber = on; // turn amber light on
light(amber, amber_tics); // and wait.
end
// task to wait for 'tics' positive edge clocks before turning 'color' light off.
always begin // waveform for the clock.
100 clock = 0;
#100 clock = 1;
end
task light;
output color;
input [31:0] tics;
begin
repeat (tics) @ ( posedge clock);
color = off; // turn light off.
end
endtask
endmodule // traffic_lights.
点赞加关注博主(ID:FPGA小飞)的博文,咱们一起系统学习verilog最终标准IEEE Std 1364-2005吧!