一个复杂的testbench是非常冗长且复杂的。解决这种复杂性的一种途径是将代码分割由一些小的段落组合而成。verilog中的function和task可以帮助我们完成复杂代码段的分割。function包含输入声明并返回一个值,当被调用时,函数立即执行因此在函数中不可以有时间控制结构。相比而言,task结构更加的灵活,该结构可以包含有输入,输出以及双向端口的声明同时可以包含有时间控制结构。可以通过输出和双向端口返回多个值。
二者主要有以下四个不同点:
①、函数只能与主模块共用同一个仿真时间单位,而任务可以定义自己的仿真时间单位;
②、函数不能启动任务,任务可以启动其他任务或者函数;
③、函数至少要有一个输入变量,而任务可以没有或有多个任何类型的变量;
④、函数返回一个值,而任务则不返回值。
--目的
function的目的是通过返回一个值来响应输入信号的值。
task能支持多种目的,能计算多个结果值,这些结果值之恩能通过被调用的task的输出或者总线端口送出。
--举例
Verilog中模块使用函数时是把它当作表达式中的操作符,这个操作的结果就是这个函数的返回值。例如:
定义一个task或者function对一个16位的字进行操作,让高字节与低字节互换,把它变为另一个字(假 定这个任务或函数名为:switch_bytes)。
task返回的新字是通过输出端口的变量,因此16位字字节互换任务的调用源码是这样的:
switch_bytes(old_word,new_word);
任务switch_bytes把输入old_word的字的高低字节互换放入new_word端口输出。
function返回的新字是通过函数本身的返回值,因此16位字字节互换函数的调用源码是这样的:
new_word = switch_butes(old_word);
函数switch_bytes把输入的old_word的字的高低字节互换后赋值给new_word。
Task: With SystemVerilog, there is a default direction of input if no direction has been specified. Once a direction is given, subsequent formals default to the same direction. In the following example, the formal arguments a and b default to inputs, and u and v are both outputs.
task mytask3(a, b, output logic [15:0] u, v);
...
endtask