返回介绍

10.2 任务

发布于 2020-09-09 22:55:48 字数 2263 浏览 1579 评论 0 收藏 0

task_declaration ::= task [lifetime] task_body_declaration   // 引用自附录A.2.7

task_body_declaration ::=
    [interface_identifier.|class_scope] task_identifier;
    {tf_item_declaration}
    {statement_or_null}
    endtask [: task_identifier]
  | [interface_identifier.|class_scope] task_identifier ([tf_port_list]);
    {block_item_declaration}
    {statement_or_null}
    endtask [: task_identifier]

tf_item_declaration ::=
    block_item_declaration
  | tf_port_declaration

tf_port_list ::=
    tf_port_item {, tf_port_item}

tf_port_item ::=
    {attribute_instance}
        [tf_port_direction] data_type_or_implicit
        port_identifier variable_dimension [= expression]

tf_port_direction ::= port_direction | const ref

tf_port_declaration ::=
    {attribute_instance} tf_port_direction data_type_or_implicit list_of_tf_variable_identifiers;

lifetime ::= static | automatic      // 引用自附录A.2.1

signing ::= signed | unsigned        // 引用自附录A.2.2.1

data_type_or_implicit ::=
    data_type
  | [signing] {packed_dimension}

语法 10-1 — 任务语法(摘录自附录A)

Verilog任务声明或者在圆括号(向ANSI C一样)中,或者在声明和方向中具有形式参数。

task mytask1 (output int x, input logic y);
    ...
endtask

task mytask2;
    output x;
    input y;
    int x;
    logic y;
    ...
endtask

每一个形式参数可以具有下列之一的方向:

input   // 在开始的时候拷贝值
output  // 在结束的时候拷贝值
inout   // 在开始的时候拷贝,在结束的时候输出
ref     // 传递引用(参见10.4.2节)

在SystemVerilog中,如果没有指定参数的方向,那么它的缺省方向是输入。一旦指定了一个方向,那么它就成为后续参数的缺省方向。在下面的例子中,形式参数ab缺省为输入,uv都是输出。

task mytask3(a, b, output logic [15:0] u, v);
    ...
endtask

每一个形式参数都具有一个数据类型,它或者显式声明,或者从一个缺省类型继承。SystemVerilog中任务参数的缺省类型为logic。

SystemVerilog允许将一个数组声明为任务的形式参数。例如:

// b的声明结果为input [3:0][7:0] b[3:0]
task mytask4(input [3:0][7:0] a, b[3:0], output 3:0][7:0] y[1:0]);
    ...
endtask

Verilog-2001允许将任务声明成自动的,因此所有的形式参数和本地变量都被存储在堆栈当中。SystemVerilog扩展了这种能力,它允许在一个静态任务中将特定的形式参数和本地变量声明成自动的,或者,它也允许在一个自动任务内将特定的形式参数和本地变量声明成静态的。

在SystemVerilog中,多条语句可以在任务声明和endtask之间被写入,这也就意味着begin...end可以被忽略。如果begin...end被忽略,这些语句顺序地执行,这与它们被包含在begin...end组中是一样的。任务中没有任何语句也是合法的。

在Verilog中,当任务到达endtask的时候任务退出。而对于SystemVerilog,在endtask关键字之前可以使用return语句退出任务。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文