参考自以下链接处:
http://t.csdn.cn/4ws4t
下面直接看代码,代码中会有注意事项。
`timescale 1ns/10ps module 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;//关灯 end endtask //交通灯初始化 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); //等待 end endmodule
此代码没法仿真出波形,只是简单的例子而已。
task与funtion还是蛮重要的知识点,下面从我喜欢的视角简单总结一下二者的内容和区别:
(1)先从Verilog定义二者的写法开始,task的定义中直接加任务名称,中间不会有位宽的声明;而function毕竟就是函数,逻辑上使用函数一般就是赋值操作,赋值就要考虑位宽,所以function的定义中会加个位宽范围,如果不写就默认是1bit。
(2)写到了下面一部分,对于二者都是《端口及数据类型声明语句》,但是function只能有input输入变量,task则没这个限制,可以有input、output、inout;
(3)下一部分则一定要用“begin end”来写,这里就是实实在在的二者想实现的逻辑功能语句了,其中task想怎么写怎么写,可以有时延符号,也可以纯组合逻辑;但是function就只能是纯组合逻辑,不能加时延类型的符号。所以funciton可以综合。
(4)endtask、endfunction不能忘写。
从中文字眼来看,也知道任务是高级一点、包容一点的东西,所以一般可以理解函数是任务的子集,任务可以调用函数,函数不能反过来调用任务的。
但是怎么写,怎么用,还是得多练,多编译,多仿真。