1.task定义为任务,完成的是某个具体功能。可以在initial语句和always语句中使用,不过initial语句使用较多。
2. task如何使用?
(1)定义任务
task 任务名 (端口及数据类型声明语句);
语句1
语句2
......
语句n
endtask
(2)调用任务
任务名 (端口 1,端口 2, ... 端口 n);
任务调用中的端口 1,端口 2, ... 端口 n与定义任务中的变量一一对应,实现将端口 1,端口 2, ... 端口 赋值给定义任务中的变量名,有点类似C语言的函数实参与形参。
3.需要理解的点
*任务没有返回值
*任务可以自己定义的仿真时间单位
*任务可以在启动其他任务
*任务在仿真中用的较多
4.实际应用
产生一组串行数据
`timescale 1ns/1ns
module tb_uart_rx();
reg sys_clk;
reg sys_rst_n;
reg rx;
wire [7:0] po_data;
wire po_flag;
always #10 sys_clk = ~sys_clk;
initial begin
sys_clk = 1'b1;
sys_rst_n <= 1'b0;
rx <= 1'b1;
#20;
sys_rst_n <= 1'b1;
end
//模拟发送8次数据,分别为0~7
initial begin
#200
rx_bit(8'd0); //任务的调用,任务名+括号中要传递进任务的参数
rx_bit(8'd1);
rx_bit(8'd2);
rx_bit(8'd3);
rx_bit(8'd4);
rx_bit(8'd5);
rx_bit(8'd6);
rx_bit(8'd7);
end
//任务的定义
task rx_bit(input [7:0] data);
integer i; //定义一个变量,int i 不行。
for(i=0; i<10; i=i+1) begin //不可用i=i++的方式
case(i)
0: rx <= 1'b0; //起始位
1: rx <= data[0];
2: rx <= data[1];
3: rx <= data[2];
4: rx <= data[3];
5: rx <= data[4];
6: rx <= data[5];
7: rx <= data[6];
8: rx <= data[7];
9: rx <= 1'b1; //终止位
endcase
#(5208*20); //每发送1位数据延时5208个时钟周期
end
endtask //任务以endtask结束
uart_rx uart_rx_inst(
.sys_clk (sys_clk ),
.sys_rst_n (sys_rst_n ),
.rx (rx ),
.po_data (po_data ),
.po_flag (po_flag )
);
endmodule