任务与函数

学习目标

理解任务和函数之间的区别

理解定义任务所需的条件,学会任务的声明和调用

理解定义函数所需的条件,学会函数的声明和调用

1.任务与函数的区别

函数 任务

函数能调用另一个函数,但不能调用另一个任务

任务能调用另一个任务,也能调用另一个函数

函数总是在仿真时刻0就开始执行

任务可以在非零时刻仿真

函数一定不能包含任何延迟、事件或者时序控制

声明语句

任务可以包含延迟、事件或者时序控制声明语句

函数至少有一个输入变量,函数可以有多个输入

变量

任务可以没有或者有多个输入、输出和双向变量

函数只能返回一个值,函数不能有输出或者双向

变量

任务不返回任何值,任何可以通过输出或者双向变量

传递多个值

任务和函数都必须在模块内进行定义,起作用范围局限于定义他们的模块。

任务可以代替普通的Verilog代码,其中可以包括延迟、时序、时间等语法结构,并且可以具有多个输出变量。

函数用于代替表示春组合逻辑的Verilog代码,在仿真时刻0就开始执行,只能有一个输出。因此,函数一般用于完成各类转换和常用计算

任务可以具有输入、输出和输入/输出(双向)变量,而函数只有输入变量。

可以在任务和函数中声明局部变量,如寄存器、时间、整数、实数和事件,但是不能声明线网类型的变量。

在任务和函数中只能使用行为级语句,但是不能包含always和initial块,。设计者可以在always块、initial块以及其他的任务和函数中调用任务和函数。

2.任务

任务使用task和endtask进行声明。如果子程序满足下面任意一个条件,则必须使用任务而不能使用函数。

子程序中包含有延迟、时序或者事件控制结构。

没有输出或者输出变量的的数目大于1.

没有输入变量。

 2.3自动(可重入)任务

任务在本质上是静态的,任务中的所有声明项的地址空间是静态分配的,同事并发执行的多个任务共享这些存储区。

因此,如果这个任务在模块中的两个地方被同时调用,则这两个任务调用将对同一块地址空间进行操作。操作的结果很有可能是错误的。

为了避免这一问题,Verilog通过在task关键字前面添加automatic关键字,是任务成为可重入的,这样声明的任务也称为自动任务。

3.函数

Verilog使用关键字function和endfunction来进行函数声明。对于一个子程序来说,如果下面的所有条件全部成立,则可以使用函数来完成

在子程序内不含有延迟、时序或者控制结构

子程序只有一个返回值

至少有一个输入变量

没有输出或者双向变量

不含非阻塞赋值语句

原文地址:https://www.cnblogs.com/fxygrzb/p/6066950.html