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