Verilog 任务

2024 年 8 月 29 日 | 阅读 3 分钟

一个函数旨在对输入进行一些处理并返回一个值。 相比之下,一个任务更通用,可以计算多个结果值,并使用 输出输入输出 类型的参数返回它们。

任务可以包含耗时的模拟元素,例如 @、posedge 等。任务用于所有编程语言,通常被称为过程或子例程。

数据被传递给任务,完成处理,并返回结果。它们必须被特别调用,并带有输入和输出数据,而不是仅仅连接到一般网表中。

包含在代码主体中,它们可以被多次调用,从而减少代码重复。

  • 任务在它们使用的模块中定义。可以在单独的文件中定义一个任务,并使用编译指令,将任务包含在实例化该任务的文件中。
  • 任务可以包含时序延迟,例如 posedge、negedge、# 延迟wait
  • 任务可以有任意数量的输入和输出。
  • 在任务中声明的变量是该任务的局部变量。任务中声明的顺序定义了调用者传递给任务的变量的使用方式。
  • 当没有使用局部变量时,任务可以获取、驱动和获取全局变量。当使用局部变量时,输出仅在任务执行结束时分配。
  • 任务可以调用另一个任务或函数。
  • 任务可用于对组合逻辑和时序逻辑进行建模。

一个任务必须用语句明确调用。 它不能像函数那样在表达式中使用。

语法

一个任务以关键字 task 开始,以关键字 endtask 结束。 输入和输出在关键字 task 之后声明。

局部变量在输入和输出声明之后声明。

关键字 automatic 将使任务变为 可重入 任务。 否则,它将默认为静态。 如果一个任务是静态的,则其所有成员变量将在已并发启动的同一任务的不同调用之间共享。

注意:分层引用无法访问自动任务项。

调用任务

如果任务不需要任何参数,则可以避免参数列表。 如果任务需要参数,它们可以在与其调用相同的语句中提供。

任务使能参数 (x, y, z) 对应于任务定义的参数 (a, b, c)。

由于 ab 是输入,因此 xy 的值将分别放置在 ab 中。 由于 c 被声明为输出,并在调用期间与 z 连接,因此总和将自动从 c 传递到变量 z

全局任务

在所有模块外部声明的任务被称为全局任务,因为它们具有全局作用域,可以在任何模块内调用。

执行完上面的代码后,会产生以下输出。

函数和任务的区别

函数任务
它不能有时间控制语句/延迟,因此在相同的模拟时间单位内执行。它可能包含时间控制语句/延迟,并且可能只在其他时间完成。
它不能启用一个任务。它可以启用其他任务和函数。
该函数应该至少有一个输入参数,并且不能有输出或输入输出参数。任务可以有零个或多个任何类型的参数。
一个函数只能返回一个值。它不能返回值,但可以使用输出参数达到相同的效果。