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

Как правильно написать 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'и.

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


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

Доброго дня.

Есть код, описывающий стирание RAM, но этих RAM несколько, разной глубины и с разными шинами. Можно ли такую конструкцию запихивать в task, чтобы не копипастить этот код несколько раз, или есть более правильные способы?

 

	always_ff @(posedge CLK)
		begin
			if (reset)
				begin
					erasing_counter <= 0;
					cell_counter <= 0;
					erasing_wren <= 0;
					erasing_wrclock <= 0;
					erasing_wraddress <= 0;
				end
			else if (erasing)
				begin
					if (cell_counter <= CELL)
						begin
							if (erasing_counter == 8)
								begin
									erasing_counter <= 0;
									cell_counter <= cell_counter + 1;
								end
							else 
								erasing_counter <= erasing_counter + 1;
						end
					unique case(erasing_counter)
						2,3 : erasing_wren <= 1;
						4,5 : begin erasing_wren <= 1; erasing_wrclock <= 1; end
						6   : begin erasing_wren <= 1; erasing_wrclock <= 0; end
						7   : begin erasing_wren <= 0; erasing_wrclock <= 0; erasing_wraddress <= erasing_wraddress + 1; end
					endcase
				end
			else
				begin
					erasing_counter <= 0;
					cell_counter <= 0;
					erasing_wren <= 0;
					erasing_wrclock <= 0;
					erasing_wraddress <= 0;
				end			
		end

	always_ff @(posedge CLK)
		begin
			if (reset)
				erasing <= 0;
			else if ((Erasing_ram)) 
				erasing <= 1;
			else if ((cell_counter == CELL) && (erasing_counter == 8))
				erasing <= 0;
		end

 

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


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

2 часа назад, Restinstage сказал:

Есть код, описывающий стирание RAM, но этих RAM несколько, разной глубины и с разными шинами. Можно ли такую конструкцию запихивать в task, чтобы не копипастить этот код несколько раз, или есть более правильные способы?

 

Параметрами пользоваться умеете?

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

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


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

40 minutes ago, iosifk said:

Параметрами пользоваться умеете?

Ими все и задано. В стандарте про таски тоже почитал. Тут кто-то говорил, что таск должен выполняться за один такт, иначе не синтезируется. А кое-кто писал даже, что таски вообще не синтезируются) Вот я и спрашивал, может правильнее void функцию использовать или как-то еще

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


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

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

2 minutes ago, Restinstage said:

Ими все и задано. В стандарте про таски тоже почитал. Тут кто-то говорил, что таск должен выполняться за один такт, иначе не синтезируется. А кое-кто писал даже, что таски вообще не синтезируются) Вот я и спрашивал, может правильнее void функцию использовать или как-то еще

Чтобы  таск  был синтезируемым  внутри него не должно быть time-consume конструкций. Тоесть никаких  #delay,  @(posedge clk), и.т.д  которые можно использовать в  не синтезируемых тасках.  Поэтому применение  таск в синтезе   похоже  на функции.

 

Удачи! Rob.

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


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

14 minutes ago, Restinstage said:

ся. А кое-кто писал даже, что таски вообще не синтезируются)

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

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


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

On 10/18/2018 at 4:48 PM, Darky777 said:

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

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

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

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

У меня тоже  сформировалось видение, что таски - для моделирования, а для синтеза - функции.

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


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

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...