前言
任务就是一段封装在“task-endtask”之间的程序。任务是通过调用来执行的,而且只有在调用时才执行,如果定义了任务,但是在整个过程中都没有调用它,那么这个任务是不会执行的。调用某个任务时可能需要它处理某些数据并返回操作结果,所以任务应当有接收数据的输入端和返回数据的输出端。另外,任务可以彼此调用,而且任务内还可以调用函数。
一、语法说明
如果传给任务的变量值和任务完成后接收结果的变量已经定义,就可以用一条语句启动任务。任务完成以后控制就传回启动过程。如任务内部有定时控制,则启动的时间可以与控制返回的时间不同。任务可以启动其他的任务,其他任务又可以启动别的任务,可以启动的任务数是没有限制的。不管有多少任务启动,只有当所有的任务完成以后,控制才能返回。
二、语法定义
任务:
task<任务名>;
<端口及数据类型声明语句>
<语句1>
<语句2>
…
<语句n>
endtask
任务的调用以及变量的传递
任务的调用:
<任务名>(端口1,端口2,…端口n);
三、实例说明
串口通信实现-串口发送(vivado&verilog版)TB文件有使用,可以参考。链接如下:
串口通信实现-串口发送(vivado&verilog版)
代码如下(示例):
task uart_tx_byte;
input [7:0]tx_data;
begin
uart_rx = 1;
#20;
uart_rx = 0;
#8680;
uart_rx = tx_data[0];
#8680;
uart_rx = tx_data[1];
#8680;
uart_rx = tx_data[2];
#8680;
uart_rx = tx_data[3];
#8680;
uart_rx = tx_data[4];
#8680;
uart_rx = tx_data[5];
#8680;
uart_rx = tx_data[6];
#8680;
uart_rx = tx_data[7];
#8680;
uart_rx = 1;
#8680;
end
endtask
调用方法:
uart_tx_byte(8'h5a);