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

Ámbito de referencia jerárquica de Verilog

La mayoría de los lenguajes de programación tienen un rasgo característico llamado alcance que define la visibilidad de ciertas secciones de código para variables y métodos. El ámbito define un espacio de nombres para evitar la colisión entre diferentes nombres de objetos dentro del mismo espacio de nombres.

Verilog define un nuevo alcance para módulos, funciones, tareas, bloques con nombre y generar bloques.

  
  
module tb;
	reg signal;
	
	// Another variable cannot be declared with
	// an already existing name in the same scope
	reg signal;
	
	// However, the name 'signal' can be reused inside
	// a task because it belongs to a different scope.
	task display();
		reg signal = 1;
		$display("signal = %0b", signal);
	endtask
	
endmodule

  

Un identificador, como un nombre de señal, se puede usar para declarar solo un tipo de elemento en un ámbito determinado. Esto significa que dos variables de tipos de datos diferentes o iguales no pueden tener el mismo nombre, o una tarea y una variable del mismo nombre, o incluso una instancia de red y puerta con el mismo nombre en el mismo ámbito.

Cada identificador en Verilog tiene un nombre de ruta jerárquico único, donde cada instancia de módulo, tarea, función o nombre begin end o fork join bloque define un nuevo nivel o alcance.

Ejemplo de referencia jerárquica

  
  
module tb;

	// Create two instances of different modules
	A uA();
	B uB();
	
	// Create a named block that declares a signal and 
	// prints the value at 10ns from simulation start
	initial begin : TB_INITIAL
		reg signal;
      #10 $display("signal=%0d", signal);      
	end
  
  	// We'll try to access other scopes using hierarchical
  	// references from this initial block
  	initial begin
  	  TB_INITIAL.signal = 0;
      uA.display();
      
      uB.B_INITIAL.B_INITIAL_BLOCK1.b_signal_1 = 1;
      uB.B_INITIAL.B_INITIAL_BLOCK2.b_signal_2 = 0;
    end
endmodule

  
  
  
module A;
	task display();
		$display("Hello, this is A");
	endtask
endmodule

module B;
	initial begin : B_INITIAL
		#50;
		begin : B_INITIAL_BLOCK1
			reg b_signal_1;
          #10 $display("signal_1=%0d", b_signal_1);
          
          
		end
		
		#50;
		begin : B_INITIAL_BLOCK2
			reg b_signal_2;
          #10 $display("signal_2=%0d", b_signal_2);
		end
	end
endmodule

  
Registro de simulación
xcelium> run
Hello, this is A
TB signal=0
signal_1=1
signal_2=0
xmsim: *W,RNQUIE: Simulation is complete.

Referencia de nombre hacia arriba

Un módulo de nivel inferior puede hacer referencia a elementos de un módulo superior en la jerarquía. Por ejemplo, la señal en el bloque TB_INITIAL sería visible desde la tarea de visualización en A.

  
  
module A;	
	task display();
		$display("Hello, this is A");
      
        // Upward referencing, TB_INITIAL is visible in this module
      	#5 TB_INITIAL.signal = 1;
	endtask
endmodule

  

Tenga en cuenta que la señal TB ahora es 1 en lugar de 0, debido al cambio de referencia ascendente realizado en la señal por el módulo A.

Registro de simulación
xcelium> run
Hello, this is A
TB signal=1
signal_1=1
signal_2=0
xmsim: *W,RNQUIE: Simulation is complete.

Aquí hay otro ejemplo con múltiples módulos anidados y el nodo hoja puede acceder directamente a los miembros desde los nodos superiores a través de una referencia jerárquica ascendente.

  
  
module tb;
  A a();
  
  function display();
    $display("Hello, this is TB");
  endfunction
endmodule

module A;
  B b();
  function display();
    $display("Hello, this is A");
  endfunction
endmodule

module B;
  C c();  
  function display();
    $display("Hello, this is B");
  endfunction
endmodule

module C;
  D d();
  
  function display();
    $display("Hello, this is C");
  endfunction
endmodule

module D;
  initial begin
    a.display();  // or A.display()
    b.display();  // or B.display()
    c.display();  // or C.display()
    
    a.b.c.display();
  end
endmodule

  
Registro de simulación
xcelium> run
Hello, this is A
Hello, this is B
Hello, this is C
Hello, this is C
xmsim: *W,RNQUIE: Simulation is complete.

Cuando el compilador encuentra b.display(),

  1. Busca en el alcance actual dentro del módulo D para ver si b está definido. Si no existe, busca el nombre en el ámbito adjunto y se desplaza hacia arriba hasta alcanzar el ámbito del módulo. Si aún no se encuentra el nombre, se continúa con el siguiente paso.
  2. Busca en el ámbito más externo del módulo principal y, si no se encuentra, sigue ascendiendo en la jerarquía.

Verilog

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