与C语言类比,可以把任务理解成返回类型为void的子程序,把函数理解为带有返回值类型的子程序。
1、任务(task)
(1)任务定义的语法为:
task《任务名》; 《端口与类型说明》 《局部变量说明》 begin 《语句》 endendtask
需要注意的是,在第一行task语句中不能列出端口名列表;可以没有输入、输出端口和双向端口,也可以有一个或多个输入、输出端口和双向端口。
(2)任务的调用
《任务名》(端口1,端口2,。..,端口n);
任务的调用只能在过程块中进行。当被调用的任务具有输入或输出端口时,任务调用语句必须包含端口列表。这个列表内端口出现的顺序和类型必须与任务定义的顺序和类型一致。
2、函数(function)
函数的目的是通过返回一个值来响应输入信号的值。函数不能启动任务,但任务可以启动函数。在Verilog HDL中函数被当作操作符来使用,结果就是这个函数的返回值。
(1)函数的定义
function《返回值的类型和位宽》(函数名) 《端口与类型说明》 《局部变量说明》 begin 《语句》 endendfunction
其中,返回值的类型和位宽是可选项,如果缺省会返回一位寄存器类型数据。Verilog HDL认为函数的定义隐式地声明了与函数同名的寄存器。函数的定义把函数被返回值所赋值寄存器的名称初始化为与函数同名的内部变量。
(2)函数的调用
《函数名》(《输入表达式1》,《输入表达式2》,。..,《输入表达式n》);
其中,n个输入表达式要与函数定义结构中说明的各个端口一一对应,他们代表各个输入端口的输入数据,这些输入表达式的排列顺序及类型必须与各个输入端口在函数定义结构中的排列顺序及类型严格保持一致。
函数的调用不能单独作为一条语句出现,他只能作为一个操作出现在赋值语句内,不仅能够用于过程块内的赋值,还能够出现在assign语句中。
3、任务与函数的比较
(1)函数至少必须有一个输入端口,而任务可以有多个、一个或没有输入端口;
(2)函数不能有输出端口,而任务可以有多个、一个或没有输出端口;
(3)函数调用通过函数名返回一个返回值,而任务调用通过端口传递返回值;
(4)函数中不能调用任务,但任务中可以调用函数;
(5)函数调用不能作为一条语句出现,而任务调用可以;
(6)函数调用可以出现在过程块或者连续赋值语句中,而任务调用只能出现在过程块中。
文章出处:【微信公众号:FPGA之家】
责任编辑:gt
全部0条评论
快来发表一下你的评论吧 !