Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Verilog

Tarea Verilog

Un function está destinado a realizar algún procesamiento en la entrada y devolver un valor único, mientras que un task es más general y puede calcular múltiples valores de resultados y devolverlos usando salida y dentro-fuera argumentos de tipo. Las tareas pueden contener elementos que requieren mucho tiempo de simulación, como @ , pospuesto y otros.

Sintaxis

Una tarea no necesita tener un conjunto de argumentos en la lista de puertos, en cuyo caso puede mantenerse vacía.

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

  

Tarea estática

Si una tarea es estática, todas sus variables miembro se compartirán entre diferentes invocaciones de la misma tarea que se inició para ejecutarse simultáneamente

  
  
	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

  

Los argumentos de habilitación de tareas (x, y, z) corresponden a los argumentos (a, b, c) definidos por la tarea. Desde un y b son entradas, valores de x y y se colocará en a y b respectivamente. Porque c se declara como una salida y se conecta con z durante la invocación, la suma se pasará automáticamente a la variable z de c .

Tarea automática

La palabra clave automatic hará que la tarea sea reentrante, de lo contrario será estática por defecto. Todos los artículos dentro de automático las tareas se asignan dinámicamente para cada invocación y no se comparten entre invocaciones de la misma tarea que se ejecutan simultáneamente. Tenga en cuenta que automatic no se puede acceder a los elementos de la tarea mediante referencias jerárquicas.

Por ejemplo, considere el estático pantalla de tareas que se llama desde diferentes initial bloques que se ejecutan simultáneamente. En este caso, la variable entera declarada dentro de la tarea se comparte entre todas las invocaciones de la tarea y, por lo tanto, el valor mostrado debería incrementarse para cada invocación.

  
  
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 simulación
xcelium> run
i=1
i=2
i=3
i=4
xmsim: *W,RNQUIE: Simulation is complete.

Si la tarea se hace automática, a cada invocación de la tarea se le asigna un espacio diferente en la memoria de simulación y se comporta de manera 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 simulación
xcelium> run
i=1
i=1
i=1
i=1
xmsim: *W,RNQUIE: Simulation is complete.

Tareas globales

Las tareas que se declaran fuera de todos los módulos se denominan global tareas ya que tienen un alcance global y se pueden llamar dentro de cualquier módulo.

  
  
// This task is outside all modules
task display();
  $display("Hello World !");
endtask

module des;
  initial begin
    display();
  end
endmodule

  
Registro de simulación
xcelium> run
Hello World !
xmsim: *W,RNQUIE: Simulation is complete.

Si la tarea se declaró dentro del módulo des, tendría que llamarse en referencia al nombre de la instancia del 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 simulación
xcelium> run
Hello World
Hello World
xmsim: *W,RNQUIE: Simulation is complete.

Diferencia entre function y task

Aunque las funciones y tareas de Verilog tienen propósitos similares, existen algunas diferencias notables entre ellas.

Función Tarea
No puede tener instrucciones de control de tiempo/retraso y, por lo tanto, se ejecuta en la misma unidad de tiempo de simulación Puede contener declaraciones de control de tiempo/retraso y solo puede completarse en otro momento
No se puede habilitar una tarea debido a la regla anterior Puede habilitar otras tareas y funciones
Debe tener al menos un argumento de entrada y no puede tener argumentos de salida o de entrada Puede tener cero o más argumentos de cualquier tipo
Puede devolver solo un único valor No puede devolver un valor, pero puede lograr el mismo efecto usando argumentos de salida

Cuando una función intenta llamar a un task o contiene una declaración que consume mucho tiempo, el compilador informa un error.

  
  
module tb;
  reg signal;
  
  initial wait_for_1(signal);
  
  function wait_for_1(reg signal);
    #10;
  endfunction
endmodule

  
Registro de simulación
    #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)].

Deshabilitar tarea

Las tareas se pueden deshabilitar usando el disable palabra clave.

  
  
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

  

Cuando mostrar la tarea fue lanzada por el primer initial bloque, T_DISPLAY se inició y se deshabilitó cuando el tiempo llegó a 50 unidades. Inmediatamente, el siguiente bloque S_DISPLAY comenzó y se completó en 80 unidades.

Registro de simulación
xcelium> run
[0] T_Task started
[60] S_Task started
[80] S_Task ended
xmsim: *W,RNQUIE: Simulation is complete.


Verilog

  1. Tutorial de Verilog
  2. Concatenación Verilog
  3. Asignaciones de Verilog
  4. Bloqueo y no bloqueo de Verilog
  5. Funciones de Verilog
  6. Tarea Verilog
  7. Ámbito de referencia jerárquica de Verilog
  8. Generador de reloj Verilog
  9. Tareas de visualización de Verilog
  10. Funciones matemáticas de Verilog
  11. Formato de hora de Verilog