发布时间:2022-10-04 文章分类:编程知识 投稿人:李佳 字号: 默认 | | 超大 打印

参考自以下链接处:
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不能忘写。

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

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