前言

任务就是一段封装在“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);