task

 

任务就是一段封装在“task-endtask”之间的程序。任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,

那么这个任务是不会执行的。

定义任务的语法如下:

任务:

task <任务名>;
      <端口及数据类型声明语句>
      <语句1>
      <语句2>
      ...
      <语句n>
endtask

 

task程序的一些写法

task send_data(len);//任务名字和长度,任务的声明,类似C语言
       integer len,i;//变量声明区
       begin//必须加begin和end
                for(i=0;i<len;i=i+1)//循环语句
                begin
                        @(posedge sclk);//for循环的时候一定要按照节拍来工作。如果注视掉本行,在波形图上i_data和i_addr都为零不动了。因为瞬间溢出成0
                        i_addr<=i[7:0];//可以用阻塞赋值也可以用非阻塞赋值。阻塞赋值就是直接赋过去,非阻塞赋值会延时一拍。
                        i_data<=i[7:0];//截取低8位
                        //用case语句产生一个协议,当地址为0时,i_data=0xff;
                        //当地址为1时,i_data=0x55;
                        //当地址为2时,i_data=0x00;
                        //其他地址全部保留赋值为0xff;
                end
                i_addr<=0;
            i_data<=0;
       end  
endtask

 

 1 //实现len个时钟周期延时
 2 task delay(len);
 3 
 4     integer i,len;
 5     begin
 6             for(i= 0;i<len;i = i+1)
 7             begin
 8                 @( posedge    clk );
 9 
10             end
11     end
12 endtask
13 //产生一位的时序
14 task spi_bit();
15     begin
16             sclk = 0;
17             delay(5);
18             sclk = 1;
19             delay(5);
20             sclk    = 0;
21     end
22     endtask
23 //产生len位的时钟
24     task    spi_data(len);
25             integer    len,i;
26             begin
27                     cs_n    = 0;
28                     for(i = 0;i < len ; i = i + 1)
29                     begin
30                             @( posedge    clk)
31                             spi_bit();
32                     end
33                     
34                     delay(5);
35                     cs_n = 1;
36             
37     
38      end
View Code
1 //在initial语句中的调用
2 initial
3     begin
4             #0
5                     sclk    = 0;
6                     mosi    =    1'bz;   
7             #200
8                     spi_data(10);
9     end
View Code