个人笔记。
task-endtask在verilog中就是一个任务语句,个人认为相当于c语言中的任务函数。任务是通过调用来执行的,可以在initial语句和always语句中调用使用。
任务定义:
task tesk;
input [7:0] A;
output reg [7:0] outvalue;
begin
case(A)
"a":begin
outvalue[7:0]<=8'h00;
end
endcase
end
endtask
形式如上,其中tesk是任务名,input [7:0] A是输入端口说明, output reg [7:0] outvalue是输出端口说明,根据任务需要可以选择写不写输入输出端口说明,endtask是结束任务标志。
任务调用:其形式tesk(端口1,端口2,端口3,...),以上面为例其调用为tesk("a",out),且必须在initial语句和always语句中调用。
以案例为例:
task tesk1;
input [7:0] A; //输入端口
output reg [7:0] outvalue; //输出端口
begin
case(A)
"a":begin
outvalue[7:0]<=8'h00;
end
endcase
end
endtask
task tesk2;
output reg [7:0] outvalue; //输出端口
begin
outvalue[7:0]<=8'h01;
end
endtask
task tesk3;
output reg [15:0] tesk3_buf; //输出端口
begin
tesk1("a",tesk3_buf[7:0]); //调用tesk1
tesk2(tesk3_buf[15:8]) //调用tesk2
end
reg [15:0] out;
always @(posedge i_clk or negedge nrst)
begin
tesk3(out[15:0]); //调用tesk3
end
此案例任务tesk3调用了tesk1、tesk2,但tesk3并不是在always中所以调用无效,在always语句中调用了tesk3任务因此tesk1、tesk2任务有效。其中reg [15:0] out在外部定义。
另一种任务调用形式如下示例:
task process; (任务名)
begin
process_a[31:0]<=a_tdata[31:0];
process_b[31:0]<=b_tdata[31:0];
process_result[31:0]<=result_tdata[31:0];
end
endtask
这里可以直接在initial语句或always语句中调用该任务名,即可执行里面的程序。