Á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ónxcelium> 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(),
- 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.
- Busca en el ámbito más externo del módulo principal y, si no se encuentra, sigue ascendiendo en la jerarquía.
Verilog