本节介绍verilog中task任务函数和function函数的使用。
一、task任务函数的调用
任务就是封装在“task-endtask”之间的程序,任务通过调用来执行,任务可以彼此调用,而且任务内还可以调用函数。
task task_id;
[declaration]
procedural_statement
endtask
task标志着一个任务定义的开始,task_id是任务名,可选项declaration是端口声明语句和变量声明语句,任务接收输入值和输出值通过此处声明的端口进行。
调用:
task_id(端口1,端口2,…,端口N);
任务调用语句中,参数列表的顺序必须与任务定义中的端口声明顺序相同。任务调用语句是过程性语句,所以任务接收返回数据的变量必须是寄存器类型(翻译一下就是说:task中的语句赋值是<=类型,变量类型要用reg修饰)。
此外,在task任务内部可以对外部的变量进行修改。
task write_byte;
input [5:0]Ctrl_Cmd;
input [7:0]Wr_Byte_Data;
begin
Cmd <= Ctrl_Cmd;
Tx_DATA <= Wr_Byte_Data;
Go <= 1'b1;
end
endtask
write_byte(WR,reg_addr[15:8]);
二、function函数分析
函数的目的是返回一个用于表达式的数值。
function <返回值的类型或范围>函数名;
<端口声明语句>
<变量类型说明语句>
begin
<语句>
… …
end
endfunction
Attention:
(1)、<返回值的类型或范围>可不定义,如果默认则代表一位寄存器类型数据。
(2)、函数返回的值:函数定义蕴含声明了一个与函数同名的、函数内部的寄存器,其位数与定义的相同。
(3)、函数的定义不能包含任何的时间控制语句,以及任何用# @ wait来标识的语句。
(4)、函数的定义中必须包含一个赋值语句给函数中的一个内部变量赋以函数的值,该内部变量具有和函数名一样的名字。
function integer clogb2 (input integer size);
begin
size = size - 1;
for (clogb2=1;size>1; clogb2=clogb2+1)
size = size >>1;
end
endfunction // clogb2
以上的函数声明中定义了一个返回值类型为整型变量的函数,函数名为clogb2,该函数名中蕴含了一个同名为clogb2的变量。
欲知后事如何,请听下回分解~~