Verilog HDL数字集成电路高级程序设计课件:仿真验证与Testbench编写.ppt
使用任务可以使程序更加简洁易懂,以实际中的交通灯控制为例说明任务的定义、调用的特点。**moduletraffic_lights(red,amber,green);outputred,amber,green;reg[2:1]order;regclock,red,amber,green;parameterON=1,OFF=0,RED_TICS=350,AMBER_TICS=30,GREEN_TICS=200;//产生时钟脉冲alwaysbegin#100clock=0;#100clock=1;end//任务的定义,该任务用于实现交通灯的开启tasklight;outputred;outputamber;outputgreen;input[31:0]tic_time;input[2:1]order;beginred=OFF;green=OFF;amber=OFF;case(order)2b01:red=ON;2b10:green=ON;2b11:amber=ON;endcase**repeat(tic_time)@(posedgeclock);red=OFF;green=OFF;amber=OFF;endendtask//任务的调用,交通灯初始化initialbeginorder=2b00;light(red,amber,green,0,order);end//任务的调用,交通灯控制时序alwaysbeginorder=2b01;light(red,amber,green,RED_TICS,order);//调用开灯任务,开红灯order=2b10;light(red,amber,green,GREEN_TICS,order);//调用开灯任务,开绿灯order=2b11;light(red,amber,green,AMBER_TICS,order);//调用开灯任务,开黄灯endendmodule5.5.2函数
1.函数的定义**function返回值类型或位宽函数名;输入参量与类型声明局部变量说明begin 语句1; 语句2; …… 语句n;endendfunction函数定义是嵌入在关键字function和endfunction之间的,其中关键词function标志着一个函数定义结构的开端,endfunction标志着一个函数定义结构的结束。“函数名”是给被定义函数取的名称。这个函数名在函数定义结构内部还代表着一个内部变量,函数调用后的返回值是通过这个函数名变量传递给调用语句的。返回值类型或位宽是一个可选项,它是用来对函数调用返回数据的类型或宽度进行说明,它可以有如下三种形式:(1)“[msb:lsb]”:这种形式说明函数名所代表的返回数据变量时一个多位的寄存器变量,它的位宽由[msb:lsb]指定,比如如下函数定义语句:function[7:0]adder;就定义了一个函数“adder”,它的函数名“adder”还代表着一个8位宽的寄存器变量,其中最高位为第7位,最低位为第0位。(2)“integer”:这种形式说明函数名代表的返回变量是一个整数型变量。(3)“real”:这种形式说明函数名代表的返回变量是一个实数型变量。**“输入参量与类型声明”是对函数各个输入端口的宽度和类型进行说明,在函数定义中,必须至少有一个输入端口(input)的声明,不能有输出端口(output)的声明。数据类型声明语句用来对函数内用到的局部变量进行宽度和类型说明,这个说明语句的语法与进行模块定义时的相应说明语句语法是一致的。“局部变量说明”是对函数内部局部变量进行宽度和类型的说明。由“begin”与“end”关键词界定的一系列语句和任务一样,用来指明函数被调用时要执行的操作,在函数被调用时,这些语句将以串行方式得到执行。****例5.5-4:统计输入数据中“0”的个数 function[3:0]out0;