cxhy 发表于 2014-7-13 16:27:50

FPGA开发经验之task与funtion的使用

Task与funtion

task和function说明语句分别用来定义任务和函数。
--特点
1、利用任务和函数可以把一个很大的程序模块分解成许多小的任务和函数便于理解和调用。
2、输入、输出和总线信号的值可以传入、传出任务和函数。
3、任务和函数往往还是打的程序模块中在不同地点多次用到的相同的程序段。


--task和function区别
task和function的主要不同有以下四点:
1、function只能与主模块公用一个仿真时间单位,而task可以定义自己的仿真时间单位。
2、function不能启动task,而task可以启动其他的task和function。
3、function至少有一个输入变量,而task可以没有或者有多个任何类型的变量。
4、function返回一个值,而task则不返回值。

--目的
function的目的是通过返回一个值来响应输入信号的值。
task能支持多种目的,能计算多个结果值,这些结果值之恩能通过被调用的task的输出或者总线端口送出。

--举例
Verilog中模块使用函数时是把它当作表达式中的操作符,这个操作的结果就是这个函数的返回值。例如:
定义一个task或者function对一个16位的字进行操作,让高字节与低字节互换,把它变为另一个字(假定这个任务或函数名为:switch_bytes)。
task返回的新字是通过输出端口的变量,因此16位字字节互换任务的调用源码是这样的:
switch_bytes(old_word,new_word);
任务switch_bytes把输入old_word的字的高低字节互换放入new_word端口输出。
function返回的新字是通过函数本身的返回值,因此16位字字节互换函数的调用源码是这样的:
new_word = switch_butes(old_word);
函数switch_bytes把输入的old_word的字的高低字节互换后赋值给new_word。

Task语法定义任务语法如下:
任务:
task <任务名>;
<端口及数据类型声明语句>;
<语句1>;
<语句2>;
<语句3>;
...
<语句n>;
Endtask
这些声明语句的语法与模块定于中的对应声明语句语法一致。
2、任务的调用及变量的传递
启动任务并传递输入输出变量的声明语句的语法如下:
任务的调用:
<任务名> (端口1,端口2,端口3,...,端口n);
--function说明
函数的目的是返回一个用于表达式的值。
定义函数的语法:
        function <返回值的类型和范围>(函数名);
          <端口说明语句>;
           begin
          <语句>
          ........
           end
       endfunction

Task调用实例
01        module traffic_lights;
02       reg clock;
03       reg red;
04       reg amber;
05       reg green;
06          
07       parameteron = 1,
08           off = 0,
09           red_tics = 350,
10           amber_tics = 30,
11           green_tics = 200;
12          
13        //交通灯初始化
14       initial red=off;
15       initial amber=off;
16       initial green=off;
17        //交通灯控制时序
18        always begin
19       red=on; //开红灯
20       light(red,red_tics); //调用等待任务
21       green=on; //开绿灯
22       light(green,green_tics); //等待
23       amber=on; //开黄灯
24       light(amber,amber_tics); //等待
25        end
26        //定义交通灯开启时间的任务
27        task light(color,tics);
28       output color;
29       input tics;
30          
31       begin
32          repeat(tics) @(posedge clock);//等待tics个时钟的上升沿
33          color=off;//关灯
34       end
35        endtask
36        //产生时钟脉冲的always块
37        always begin
38       #100 clock=0;
39       #100 clock=1;
40        end
41          
42        endmodule
Funtion调用实例
01        module tryfact;
02       //函数定义------------------------------
03        function operand;
04       input operand;
05       reg index;
06       begin
07          factorial = operand ? 1 : 0;
08          for(index = 2; index <= operand; index = index + 1)
09          factorial = index * factorial;
10       end
11        endfunction
12        //函数的测试----------------------------------
13       reg result;
14       reg n;
15        initial begin
16       result = 1;
17       for (n = 2; n < 9; n = n + 1) begin
18          $display ("Partial result n = %d result = %d",n,result);
19          result = n * factorial(n)/((n*2) + 1);
20       end
21       $display ("Finalresult = %d",result);
22        end
23        endmodule//模块结束


wangjun403 发表于 2014-7-15 09:43:16

这是抄书的吧
页: [1]
查看完整版本: FPGA开发经验之task与funtion的使用