# task

*Задачи*, в отличие от *функций*, могут возвращать несколько значений и содержать внутри себя конструкции управления временем. Как и у модулей, у задач *порты могут быть трёх направлений*: входные, выходные и двунаправленные.

Задачи делятся на *статические* и *автоматические*. По умолчанию все задачи статические. В *статических* задачах все переменные, объявленные внутри, являются общими для всех вызовов этой задачи. В *автоматических* все переменные являются приватными, то есть личными для каждого запуска задачи.

*Синтаксис*

{% code overflow="wrap" lineNumbers="true" %}

```verilog
// static task
task [name] (input [port_list], inout [port_list], output [port_list]);
  begin
    [statements]
  end
endtask

// automatic task
task automatic [name] (input [port_list], inout [port_list], output [port_list]);
  begin
    [statements]
  end
endtask

// Задача с пустым листом портов
task [name] ();
  begin
    [statements]
  end
endtask
```

{% endcode %}

<table data-header-hidden><thead><tr><th></th><th></th></tr></thead><tbody><tr><td><em>Пример static task</em></td><td><em>Пример automatic task</em></td></tr><tr><td><pre class="language-verilog" data-overflow="wrap" data-line-numbers><code class="lang-verilog">module static_task_tb;
  initial display();
  initial display();
  initial display();
  initial display();

task display();
integer i = 0;
i = i + 1;
$display("i=%0d", i);
endtask
endmodule </code></pre></td><td><pre class="language-verilog" data-overflow="wrap" data-line-numbers><code class="lang-verilog">module automatic\_task\_tb;
initial display();
initial display();
initial display();
initial display();

task automatic display();
integer i = 0;
i = i + 1;
$display("i=%0d", i);
endtask
endmodule </code></pre></td></tr><tr><td><em>Результат исполнения</em></td><td><em>Результат исполнения</em></td></tr><tr><td><pre class="language-log" data-overflow="wrap" data-line-numbers><code class="lang-log">i=1
i=2
i=3
i=4 </code></pre></td><td><pre class="language-log" data-overflow="wrap" data-line-numbers><code class="lang-log">i=1
i=1
i=1
i=1 </code></pre></td></tr></tbody></table>

*Пояснение к примеру*

В примере в задаче создаётся переменная `i`, которая в случае *статической* задачи общая для всех четырёх запусков задачи и по факту инициализируется в 0 один раз. В случае *автоматической* задачи переменная создаётся внутри каждой задачи и все созданные `i` являются независимыми друг от друга.
