Jump to content

    

Как правильно написать task automatic на System Verilog

Здравствуйте, уважаемые гуры.

 

Есть что-то типа такого:

 

always @ (posedge Clk or posedge Reset)
begin
    if (Reset)
        begin
          VarA <= 0;
          VarB <= 0;
        end
    else
    begin
       simple_task(VarC, VarA);
       simple_task(VarD, VarB);
    end
end

task automatic simple_task;
input Var1;
output Var2;
begin
  Var2 <= ~Var1;
end
endtask

 

2 переменные изменяются при помощи 2х экземпляров task'а.

Проблема в том, что если использовать присваивание "<=" , то синтезатор (Quartus 18) ругается - говорит, что нельзя automatic с таким присваиванием.

Использовать присваивание "=" можно и все ок, но с таким присваиванием проблемы дальше, т.е. оптимально, чтобы на выходе из этого блока было присваивание "<=".

 

Понятно, что можно сделать task'и и присваивание "=", а потом переприсвоить в другую переменную по "=>".

Но так громоздко, хочется написать проще.

 

Кто что посоветует?

 

Share this post


Link to post
Share on other sites

А, ну да. Понятно, что можно вместо таска сделать модуль. Но захотелось сделать именно таск.

Share this post


Link to post
Share on other sites

Приветствую!

А, ну да. Понятно, что можно вместо таска сделать модуль. Но захотелось сделать именно таск.
Если по логике подходит то сделайте как функцию

...
function logic simple_func (input logic var1);
  return ~var1;
endtask
... 
   VarC <= simple_func(VarA);
...

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
Приветствую!

Если по логике подходит то сделайте как функцию

...
function logic simple_func (input logic var1);
  return ~var1;
endtask
... 
   VarC <= simple_func(VarA);
...

 

Удачи! Rob.

У реального таска несколько выходов.

Share this post


Link to post
Share on other sites
On 9/28/2018 at 2:18 PM, Koluchiy said:

У реального таска несколько выходов.

У функции также м.б. несколько выходов: https://stackoverflow.com/questions/25396647/understanding-system-verilog-function-return-values

Share this post


Link to post
Share on other sites

ИМХО зачем вообще использовать таск в дезайне?

Share this post


Link to post
Share on other sites

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

Как я в свое время понял, task предназначен для формирования некого сценария работы чего либо, то бишь для верификации/тестов. А если что-то хочется посчитать и при этом не нагромоздить - использовать функции (как у вас).

И ведь неспроста ведь операторы времени (#, wait, @)  отсутствуют в функциях.

Хотелось бы, чтобы и другие разработчики оставили мнение по этому поводу. Использует ли кто таск в синтезе?

Share this post


Link to post
Share on other sites

task - это возможность вынести общие куски кода в отдельную сущность. Это уменьшает громоздкость, улучшает читабельность, сопровождаемость. Наконец, это просто удобно. Конечно, надо это делать всегда к месту, и в моей практике таких мест было не очень много. Например, в одном проекте была пара довольно развесистых автоматов, у которых были похожие фрагменты кода. Успешно вынеслось в task'и.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now