任务就是一段封装在“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
1 //在initial语句中的调用 2 initial 3 begin 4 #0 5 sclk = 0; 6 mosi = 1'bz; 7 #200 8 spi_data(10); 9 end