IC验证学霸笔记2——Verilog基本语法之系统任务(八)
task和function语句分别用来由用户定义任务和函数;
task和function往往是大的程序模块中不同地点多次用到相同的程序段;
利用task和function可将一个很大的程序模块分解为许多较小的task和function,
便于理解和调试;输入,输出和总线信号的值可以传入,传出任务和函数。
task语句
当希望能够对一些信号进行一些运算并输出多个结果(即有多个输出变量)时,宜采用任务结构; 常常利用任务来帮助实现结构化的模块设计,将批量的操作以任务的形式独立出来,使设计简单明了。
注1:任务的定义和调用必须在同一个module模块内;
注2:任务被调用时,需列出端口名列表,且必须与任务定义中的I/O变量一一对应;
注3:一个任务可以调用其他任务和函数;
例:任务的定义和调用:
当任务启动时,有v,w和x传入的变量赋值给a,b,c;
当任务完成时,输出通过c,d,e赋值给x,y,z。
例:通过任务调用完成4个4位二进制输入数据的冒泡排序。
测试文件:
$random为系统任务,返回一个32位的带符号的随机数;
一般用法为:$random %b;
其中b>0,它给出一个范围在-b+1——b-1之间的随机数;
{$random}%15通过位拼接操作,产生一个0-14之间的随机数。
function语句(可以综合)
函数的目的是通过返回一个用于某表达式的值,来响应输入信号。适用对不同变量采用同一运算的操作。 函数在模块内部定义,通常在本模块中调用,也能根据按模块层次分级命名的函数名从其他模块调用。而任务只能在同一模块内定义和调用。
注1:函数的调用是通过将函数作为调用函数的表达式中操作数来实现的。
注2:函数在综合时被理解称为具有独立运算功能的电路,每调用一次函数,相当于改变此电路的输入,以得到相应的计算结果。
函数的使用规则:
1. 函数的定义不能包含任何时间控制语句——用延迟#,时间控制@或等待wait标示的语句。
2. 函数不能调用task;
3.定义函数时至少要有一个输入参数!且不能有任何输出或输入/输出双向变量;
4.在函数的定义中必须有一条赋值语句,该函数的一个内部寄存器赋以函数的结果值,该内部寄存器与函数同名。
2. 函数不能调用task;
3.定义函数时至少要有一个输入参数!且不能有任何输出或输入/输出双向变量;
4.在函数的定义中必须有一条赋值语句,该函数的一个内部寄存器赋以函数的结果值,该内部寄存器与函数同名。
例:利用函数对一个8位二进制数中为0的位进行计数。
波形:
阶乘运算:
测试文件: