Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

Tarefa Verilog


Um function destina-se a fazer algum processamento na entrada e retornar um único valor, enquanto um task é mais geral e pode calcular vários valores de resultado e devolvê-los usando saída e dentro argumentos de tipo. As tarefas podem conter elementos demorados de simulação, como @ , postado e outros.

Sintaxe


Uma tarefa não precisa ter um conjunto de argumentos na lista de portas, caso em que ela pode ser mantida vazia.
  
  
	// Style 1
	task [name];
		input  [port_list];
		inout  [port_list];
		output [port_list];
		begin
			[statements]
		end
	endtask

	// Style 2
	task [name] (input [port_list], inout [port_list], output [port_list]);
		begin
			[statements]
		end
	endtask
	
	// Empty port list
	task [name] ();
		begin
			[statements]
		end
	endtask

  

Tarefa Estática


Se uma tarefa for estática, todas as suas variáveis ​​de membro serão compartilhadas em diferentes invocações da mesma tarefa que foi iniciada para ser executada simultaneamente
  
  
	task sum (input [7:0] a, b, output [7:0] c);
		begin
			c = a + b;
		end
	endtask
// or 	
	task sum;
		input  [7:0] a, b;
		output [7:0] c;
		begin
			c = a + b;
		end
	endtask
	
	initial begin
		reg [7:0] x, y , z;
		sum (x, y, z);          
	end

  

Os argumentos de habilitação da tarefa (x, y, z) correspondem aos argumentos (a, b, c) definidos pela tarefa. Desde um e b são entradas, valores de x e s será colocado em a e b respectivamente. Porque c é declarado como uma saída e conectado com z durante a invocação, a soma será automaticamente passada para a variável z de c .

Tarefa automática


A palavra-chave automatic tornará a tarefa reentrante, caso contrário, será estática por padrão. Todos os itens dentro de automático as tarefas são alocadas dinamicamente para cada chamada e não compartilhadas entre as chamadas da mesma tarefa em execução simultaneamente. Observe que automatic itens de tarefa não podem ser acessados ​​por referências hierárquicas.

Para ilustração, considere o estático exibição de tarefa que é chamada de diferentes initial blocos que são executados simultaneamente. Nesse caso, a variável inteira declarada na tarefa é compartilhada entre todas as invocações da tarefa e, portanto, o valor exibido deve ser incrementado para cada chamada.
  
  
module tb;
  
  initial display();
  initial display();
  initial display();
  initial display();
  
  // This is a static task
  task display();
    integer i = 0;
    i = i + 1;
    $display("i=%0d", i);
  endtask
endmodule

  
Registro de simulação
xcelium> run
i=1
i=2
i=3
i=4
xmsim: *W,RNQUIE: Simulation is complete.


Se a tarefa for automática, cada chamada da tarefa é alocada em um espaço diferente na memória de simulação e se comporta de maneira diferente.
  
  
module tb;
  
  initial display();
  initial display();
  initial display();
  initial display();
  
  // Note that the task is now automatic
  task automatic display();
    integer i = 0;
    i = i + 1;
    $display("i=%0d", i);
  endtask
endmodule

  
Registro de simulação
xcelium> run
i=1
i=1
i=1
i=1
xmsim: *W,RNQUIE: Simulation is complete.

Tarefas globais


As tarefas declaradas fora de todos os módulos são chamadas de global tarefas, pois elas têm um escopo global e podem ser chamadas dentro de qualquer módulo.
  
  
// This task is outside all modules
task display();
  $display("Hello World !");
endtask

module des;
  initial begin
    display();
  end
endmodule

  
Registro de simulação
xcelium> run
Hello World !
xmsim: *W,RNQUIE: Simulation is complete.


Se a tarefa foi declarada dentro do módulo des, ela teria que ser chamada em referência ao nome da instância do módulo.
  
  
module tb;
	des u0();
	
	initial begin
		u0.display();  // Task is not visible in the module 'tb'
	end
endmodule

module des;
	initial begin
		display(); 	// Task definition is local to the module
	end

	task display();
		$display("Hello World");
	endtask
endmodule

  
Registro de simulação
xcelium> run
Hello World
Hello World
xmsim: *W,RNQUIE: Simulation is complete.

Diferença entre function e task


Embora as funções e tarefas do Verilog sirvam a propósitos semelhantes, existem algumas diferenças notáveis ​​entre elas.
Função Tarefa
Não pode ter instruções/atrasos de controle de tempo e, portanto, executa na mesma unidade de tempo de simulação Pode conter declarações/atrasos de controle de tempo e só pode ser concluído em outro momento
Não é possível habilitar uma tarefa devido à regra acima Pode habilitar outras tarefas e funções
Deve ter pelo menos um argumento de entrada e não pode ter argumentos de saída ou entrada Pode ter zero ou mais argumentos de qualquer tipo
Pode retornar apenas um único valor Não é possível retornar um valor, mas pode obter o mesmo efeito usando argumentos de saída

Quando uma função tenta chamar um task ou contém uma instrução demorada, o compilador relata um erro.
  
  
module tb;
  reg signal;
  
  initial wait_for_1(signal);
  
  function wait_for_1(reg signal);
    #10;
  endfunction
endmodule

  
Registro de simulação
    #10;
    |
xmvlog: *E,BADFCN (testbench.sv,7|4): illegal time/event control statement within a function or final block or analog initial block [10.3.4(IEEE)].

Desativar tarefa


As tarefas podem ser desativadas usando o disable palavra-chave.
  
  
module tb;
  
  initial display();
  
  initial begin
  	// After 50 time units, disable a particular named
  	// block T_DISPLAY inside the task called 'display'
    #50 disable display.T_DISPLAY;
  end
  
  task display();
    begin : T_DISPLAY
      $display("[%0t] T_Task started", $time);
      #100;
      $display("[%0t] T_Task ended", $time);
    end
    
    begin : S_DISPLAY
      #10;
      $display("[%0t] S_Task started", $time);
      #20;
      $display("[%0t] S_Task ended", $time);
    end
  endtask
endmodule

  

Quando exibir tarefa foi iniciada pelo primeiro initial bloco, T_DISPLAY iniciou e foi desabilitado quando o tempo atingiu 50 unidades. Imediatamente o próximo bloco S_DISPLAY começou e correu até a conclusão por 80 unidades.
Registro de simulação
xcelium> run
[0] T_Task started
[60] S_Task started
[80] S_Task ended
xmsim: *W,RNQUIE: Simulation is complete.


Verilog

  1. Tutorial Verilog
  2. Concatenação Verilog
  3. Atribuições Verilog
  4. Verilog Blocking &Non-Blocking
  5. Funções Verilog
  6. Tarefa Verilog
  7. Escopo de Referência Hierárquica Verilog
  8. Gerador de Relógio Verilog
  9. Tarefas de Exibição Verilog
  10. Funções matemáticas Verilog