目录
task语句和function语句是verilog设计中分别用于定义任务和函数的,通过定义task和function,能够将本来很大的程序模块分解为较小的任何和函数,这样更便于理解和调试。在设计中,可能在一些大的程序中经常会某个程序段在不同的地点被反复用到,通过定义task和function进行调用要节省代码量,简化程序的结构,也方便理解。
1. 函数与任务的不同
先宏观地了解一下函数和任务的不同点,然后带着疑问去学习会有方向。
任务与函数的不同点:
- 函数只能与主模块共用一个仿真时间单位,而任务定义自己的仿真时间单位。
- 函数不能启动任务,任务可以启动其他任务和函数。
- 函数至少要有一个输入变量,而任务可以没有或有多任何类型的变量。
- 函数返回一个值,而任务不返回值。
注意,函数的目的是通过返回一个函数值来响应输入信号的值,而任务的目的有很多种,能计算过个结果值,这些结果值只能通过被调用的任务的输出的输出或总线端口送出。Verilog HDL模块使用函数时,是将其当作表达式种的操作符(认真体会啊,操作符的话,就会就结果) ,这个操作执行后的结果就是函数的返回值,该返回值可以用于其他操作。
2. task说明语句
前文就说过,函数的目的就是需要函数返回一个用于其他表达式的值。
2.1 task定义
定义任务的语法如下:
task<任务名>
<端口及数据类型声明语句>
<语句1>
<语句2>
…………
<语句n>
endtask
在任务内的各种语句,其语法与Vierlilog 的module块中用法一致。
2.2 任务的调用及变量的传递
任务的调用:
<任务名> (端口1,端口2,…..,端口n);
下面举例子说明怎么定义任务与调用任务:
任务定义:
task my_task;
input a,b; //可以有输入
inout c;
output d,e; //可以有输出
<语句>
….
c = fool; //
d = foo2; //对输出变量赋值
e = foo3;
endtask
任务调用:
my_task(v,w,x);
任务调用变量(v,w,x)和任务定义的I/O变量(a,b,c)之间是一一对应的,当任务启动时,由v和w传入的变量赋给了a和b,而当任务完成之后的输出又通过c赋给x,
3. function说明语句
前文就介绍了,调用函数的目的就是需要返回一个用于其他表达式的值
3.1定义函数的语法
function<返回值的类型或范围>(函数名); //返回值的类型可选,默认返回值为一位寄存器类型数据
<端口说明语句>
<变量类型说明语句>
begin
<语句>
………
end
endfunction
注意:<返回值的类型或范围>这一项是可选项,如缺省则返回值位一位寄存器类型数据
- 举例说明
下面举一个实际程序的例子,来说明一下function函数的实际定
义与如何调用。