Перейти к содержанию

    

Как правильно написать 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'и и присваивание "=", а потом переприсвоить в другую переменную по "=>".

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Приветствую!

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

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

 

Удачи! Rob.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
On 9/28/2018 at 2:18 PM, Koluchiy said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти