Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Verilog

Verilog hiërarchisch referentiebereik

De meeste programmeertalen hebben een karakteristieke eigenschap genaamd scope die de zichtbaarheid van bepaalde codesecties voor variabelen en methoden definieert. Het bereik definieert een naamruimte om botsingen tussen verschillende objectnamen binnen dezelfde naamruimte te voorkomen.

Verilog definieert een nieuwe scope voor modules, functies, taken, benoemde blokken en genereer blokken.

  
  
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

  

Een identifier, zoals een signaalnaam, kan worden gebruikt om slechts één type item in een bepaalde scope te declareren. Dit betekent dat twee variabelen van verschillende of dezelfde gegevenstypen niet dezelfde naam kunnen hebben, of een taak en een variabele met dezelfde naam, of zelfs een net en gate-instantie met dezelfde naam in hetzelfde bereik.

Elke identifier in Verilog heeft een unieke hiërarchische padnaam, waarbij elke module-instantie, taak, functie of naam begin end of fork join blok definieert een nieuw niveau of bereik.

Hiërarchisch referentievoorbeeld

  
  
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

  
Simulatielogboek
xcelium> run
Hello, this is A
TB signal=0
signal_1=1
signal_2=0
xmsim: *W,RNQUIE: Simulation is complete.

Naamverwijzing naar boven

Een module op een lager niveau kan verwijzen naar items in een module erboven in de hiërarchie. Signaal in blok TB_INITIAL zou bijvoorbeeld zichtbaar zijn vanuit de weergavetaak in 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

  

Merk op dat het TB-signaal nu 1 is in plaats van 0, vanwege de opwaartse verwijzingswijziging die door module A in het signaal is aangebracht.

Simulatielogboek
xcelium> run
Hello, this is A
TB signal=1
signal_1=1
signal_2=0
xmsim: *W,RNQUIE: Simulation is complete.

Hier is nog een voorbeeld met meerdere geneste modules en het bladknooppunt heeft rechtstreeks toegang tot leden van bovenliggende knooppunten via opwaartse hiërarchische verwijzing.

  
  
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

  
Simulatielogboek
xcelium> run
Hello, this is A
Hello, this is B
Hello, this is C
Hello, this is C
xmsim: *W,RNQUIE: Simulation is complete.

Wanneer de compiler b.display() vindt,

  1. Het kijkt in de huidige scope binnen module D om te zien of b is gedefinieerd. Als het niet bestaat, zoekt het naar de naam in het omsluitende bereik en gaat het omhoog totdat het modulebereik is bereikt. Als de naam nog steeds niet wordt gevonden, gaat het naar de volgende stap.
  2. Het kijkt in het buitenste bereik van de bovenliggende module en als het niet wordt gevonden, blijft het omhoog gaan in de hiërarchie.

Verilog

  1. Verilog-zelfstudie
  2. Verilog-aaneenschakeling
  3. Verilog - In een notendop
  4. Verilog-opdrachten
  5. Verilog blokkeren en niet-blokkeren
  6. Verilog-functies
  7. Verilog-taak
  8. Verilog hiërarchisch referentiebereik
  9. Verilog-klokgenerator
  10. Verilog-weergavetaken
  11. Verilog wiskundige functies