Dominando Referência Hierárquica em Verilog: Evite Colisão de Nomes em Módulos e Blocos
A maioria das linguagens tem característica chamada escopo (scope) definindo visibilidade de seções de código a variáveis e métodos. O escopo define um namespace para evitar colisão entre nomes de objetos no mesmo namespace.
Verilog define novo escopo para módulos, functions, tasks, blocos nomeados e generate blocks.
module tb;
reg signal;
// Outra variável não pode ser declarada com nome existente no mesmo escopo
reg signal; // Erro!
// Mas 'signal' pode ser reutilizado dentro de task - escopo diferente
task display();
reg signal = 1;
$display("signal = %0b", signal);
endtask
endmodule
Um identificador (nome de sinal) pode declarar apenas um tipo de item em um escopo. Duas variáveis de tipos iguais/diferentes não podem ter mesmo nome, nem task e variável com mesmo nome, nem net e instância de porta com mesmo nome no mesmo escopo.
Todo identificador em Verilog tem caminho hierárquico único, onde cada instância de módulo, task, function ou bloco begin end ou fork join nomeado define novo nível/escopo.
Exemplo de Referência Hierárquica
module tb;
// Cria duas instâncias de módulos diferentes
A uA();
B uB();
// Bloco nomeado declara sinal e imprime valor em 10ns
initial begin : TB_INITIAL
reg signal;
#10 $display("signal=%0d", signal);
end
// Tenta acessar outros escopos via referências hierárquicas
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
Log de Simulação
xcelium> run Hello, this is A TB signal=0 signal_1=1 signal_2=0 xmsim: *W,RNQUIE: Simulation is complete.
Referência de Nome para Cima (Upwards Name Referencing)
Um módulo de nível inferior pode referenciar itens em módulo acima na hierarquia. Ex: signal no bloco TB_INITIAL visível da task display em A.
module A;
task display();
$display("Hello, this is A");
// Referência para cima, TB_INITIAL visível neste módulo
#5 TB_INITIAL.signal = 1;
endtask
endmodule
Note que TB signal agora é 1 em vez de 0, devido à mudança por referência hierárquica ascendente feita pelo módulo A.
Log de Simulação
xcelium> run Hello, this is A TB signal=1 signal_1=1 signal_2=0 xmsim: *W,RNQUIE: Simulation is complete.
Outro exemplo com múltiplos módulos aninhados onde nó folha acessa diretamente membros de nós superiores via referência hierá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(); // ou A.display()
b.display(); // ou B.display()
c.display(); // ou C.display()
a.b.c.display();
end
endmodule
Log de Simulação
xcelium> run Hello, this is A Hello, this is B Hello, this is C Hello, this is C xmsim: *W,RNQUIE: Simulation is complete.
Quando compilador encontra b.display():
- Procura no escopo atual (módulo D) se
bdefinido. Se não existe, procura no escopo envolvente e sobe até escopo do módulo. Se ainda não achado, próxima etapa. - Procura no escopo mais externo do módulo pai; se não achado, continua subindo na hierarquia.
Verilog
- Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
- Dominando Concatenação Verilog: Guia Prático
- Verilog Essencial: Visão Geral Concisa
- Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
- Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
- Dominando Funções em Verilog para Design RTL Eficiente
- Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
- Dominando Referência Hierárquica em Verilog: Evite Colisão de Nomes em Módulos e Blocos
- Gerador de Clock Verilog: Guia de Design e Implementação
- Dominando Tarefas de Display do Verilog: Depuração e Logging Eficientes