参考自以下链接处:
http://t.csdn.cn/4ws4t

下面直接看代码,代码中会有注意事项。

`timescale 1ns/10psmodule  traffic_lights  ;reg             clk         ;reg             red         ;reg             amber       ;reg             green       ;//产生时钟脉冲的always块always #10  clk = ~clk;parameter  on  = 1  ; parameter  off = 0  ;             //定义交通灯开启时间的任务task light;//task    input  [31:0] tics;    output reg color;//,建议先输入后输出begin    repeat(tics) @(posedge clk);//等待tics个时钟的上升沿    color=off;//关灯endendtask//交通灯初始化initial red=off;initial amber=off;initial green=off;//交通灯控制时序always begin    red=on; //开红灯    light('d350,red); //调用等待任务,                      //(1)括号中信号顺序与task声明的信号顺序一致;                      //(2)不能是参数类型的数据,比如你放的是parameter定义的数据就不行;                      //(3)既然是调用,就是调用其中的逻辑功能,使用的信号都需要是module下定义的,而不是用task中定义的的color。    green=on; //开绿灯    light('d300,green); //等待    amber=on; //开黄灯    light('d200,amber); //等待endendmodule

此代码没法仿真出波形,只是简单的例子而已。

task与funtion还是蛮重要的知识点,下面从我喜欢的视角简单总结一下二者的内容和区别:

(1)先从Verilog定义二者的写法开始,task的定义中直接加任务名称,中间不会有位宽的声明;而function毕竟就是函数,逻辑上使用函数一般就是赋值操作,赋值就要考虑位宽,所以function的定义中会加个位宽范围,如果不写就默认是1bit。

(2)写到了下面一部分,对于二者都是《端口及数据类型声明语句》,但是function只能有input输入变量,task则没这个限制,可以有input、output、inout;

(3)下一部分则一定要用“begin end”来写,这里就是实实在在的二者想实现的逻辑功能语句了,其中task想怎么写怎么写,可以有时延符号,也可以纯组合逻辑;但是function就只能是纯组合逻辑,不能加时延类型的符号。所以funciton可以综合。

(4)endtask、endfunction不能忘写。

从中文字眼来看,也知道任务是高级一点、包容一点的东西,所以一般可以理解函数是任务的子集,任务可以调用函数,函数不能反过来调用任务的。

但是怎么写,怎么用,还是得多练,多编译,多仿真。