任务与函数
学习目标
理解任务和函数之间的区别
理解定义任务所需的条件,学会任务的声明和调用
理解定义函数所需的条件,学会函数的声明和调用
1.任务与函数的区别
函数 | 任务 |
函数能调用另一个函数,但不能调用另一个任务 |
任务能调用另一个任务,也能调用另一个函数 |
函数总是在仿真时刻0就开始执行 |
任务可以在非零时刻仿真 |
函数一定不能包含任何延迟、事件或者时序控制 声明语句 |
任务可以包含延迟、事件或者时序控制声明语句 |
函数至少有一个输入变量,函数可以有多个输入 变量 |
任务可以没有或者有多个输入、输出和双向变量 |
函数只能返回一个值,函数不能有输出或者双向 变量 |
任务不返回任何值,任何可以通过输出或者双向变量 传递多个值 |
任务和函数都必须在模块内进行定义,起作用范围局限于定义他们的模块。
任务可以代替普通的Verilog代码,其中可以包括延迟、时序、时间等语法结构,并且可以具有多个输出变量。
函数用于代替表示春组合逻辑的Verilog代码,在仿真时刻0就开始执行,只能有一个输出。因此,函数一般用于完成各类转换和常用计算
任务可以具有输入、输出和输入/输出(双向)变量,而函数只有输入变量。
可以在任务和函数中声明局部变量,如寄存器、时间、整数、实数和事件,但是不能声明线网类型的变量。
在任务和函数中只能使用行为级语句,但是不能包含always和initial块,。设计者可以在always块、initial块以及其他的任务和函数中调用任务和函数。
2.任务
任务使用task和endtask进行声明。如果子程序满足下面任意一个条件,则必须使用任务而不能使用函数。
子程序中包含有延迟、时序或者事件控制结构。
没有输出或者输出变量的的数目大于1.
没有输入变量。
2.3自动(可重入)任务
任务在本质上是静态的,任务中的所有声明项的地址空间是静态分配的,同事并发执行的多个任务共享这些存储区。
因此,如果这个任务在模块中的两个地方被同时调用,则这两个任务调用将对同一块地址空间进行操作。操作的结果很有可能是错误的。
为了避免这一问题,Verilog通过在task关键字前面添加automatic关键字,是任务成为可重入的,这样声明的任务也称为自动任务。
3.函数
Verilog使用关键字function和endfunction来进行函数声明。对于一个子程序来说,如果下面的所有条件全部成立,则可以使用函数来完成
在子程序内不含有延迟、时序或者控制结构
子程序只有一个返回值
至少有一个输入变量
没有输出或者双向变量
不含非阻塞赋值语句