Jump to content

    
Sign in to follow this  
Koluchiy

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

Recommended Posts

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

 

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

 

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

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

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

...
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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Доброго дня.

Есть код, описывающий стирание 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

 

Share this post


Link to post
Share on other sites
2 часа назад, Restinstage сказал:

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

 

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

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

Share this post


Link to post
Share on other sites
40 minutes ago, iosifk said:

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

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

Share this post


Link to post
Share on other sites

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

2 minutes ago, Restinstage said:

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

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

 

Удачи! Rob.

Share this post


Link to post
Share on other sites
14 minutes ago, Restinstage said:

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

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

Share this post


Link to post
Share on other sites
On 10/18/2018 at 4:48 PM, Darky777 said:

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

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

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

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this