Fundamentos de Módulos Verilog: Estrutura e Sintaxe
Um module é um bloco de código Verilog que implementa uma certa funcionalidade. Módulos podem ser embutidos dentro de outros módulos e um módulo de nível superior pode se comunicar com seus módulos de nível inferior usando suas portas de entrada e saída.
Sintaxe
Um module deve ser delimitado por palavras-chave module e endmodule. Nome do módulo deve ser dado logo após a palavra-chave module e uma lista opcional de portas pode ser declarada também. Note que portas declaradas na lista de declaração de portas não podem ser redeclaradas dentro do corpo do módulo.
module ([port_list]);
// Contents of the module
endmodule
// A module can have an empty portlist
module name;
// Contents of the module
endmodule
Todas as declarações de variáveis, statements de dataflow, functions ou tasks e instâncias de módulos inferiores, se houver, devem ser definidas dentro das palavras-chave module e endmodule. Pode haver múltiplos módulos com nomes diferentes no mesmo arquivo e podem ser definidos em qualquer ordem.
Exemplo
O módulo dff representa um D flip flop que tem três portas de entrada d, clk, rstn e uma porta de saída q. Conteúdos do módulo descrevem como um D flip flop deve se comportar para diferentes combinações de entradas. Aqui, a entrada d é sempre atribuída à saída q na borda positiva do clock se rstn for alto porque é um reset active low.
// Module called "dff" has 3 inputs and 1 output port
module dff (
input d, input clk, input rstn, output reg q
);
// Contents of the module
always @ (posedge clk) begin
if (!rstn) q <= 0;
else q <= d;
end
endmodule
Esquemático de Hardware
Este módulo será convertido no seguinte circuito digital durante a síntese.
Qual o Propósito de um Módulo?
Um módulo representa uma unidade de projeto que implementa certas características comportamentais e será convertido em um circuito digital durante a síntese. Qualquer combinação de entradas pode ser dada ao módulo e ele fornecerá uma saída correspondente. Isso permite que o mesmo module seja reutilizado para formar módulos maiores que implementam hardware mais complexo.
Por exemplo, o DFF mostrado acima pode ser encadeado para formar um shift register.
module shift_reg (
input d, input clk, input rstn, output q
);
wire [2:0] q_net;
dff u0 (.d(d), .clk(clk), .rstn(rstn), .q(q_net[0]));
dff u1 (.d(q_net[0]), .clk(clk), .rstn(rstn), .q(q_net[1]));
dff u2 (.d(q_net[1]), .clk(clk), .rstn(rstn), .q(q_net[2]));
dff u3 (.d(q_net[2]), .clk(clk), .rstn(rstn), .q(q));
endmodule
Esquemático de Hardware
Note que as instâncias dff são conectadas juntas com fios como descrito pelo módulo RTL Verilog.
Em vez de construir a partir de blocos menores para formar blocos de projeto maiores, o inverso também pode ser feito. Considere a decomposição de um motor GPU simples em componentes menores de forma que cada um possa ser representado como um módulo que implementa uma funcionalidade específica. O motor GPU mostrado abaixo pode ser dividido em cinco sub-blocos diferentes onde cada um executa uma funcionalidade específica. A unidade de interface de barramento obtém dados de fora para o projeto, que é processada por outra unidade para extrair instruções. Outras unidades na linha processam dados fornecidos pela unidade anterior.
Cada sub-bloco pode ser representado como um module com um certo conjunto de sinais de entrada e saída para comunicação com outros módulos e cada sub-bloco pode ser further dividido em blocos mais finos conforme necessário.
O Que São Módulos Top-Level?
Um módulo top-level é aquele que contém todos os outros módulos. Um módulo top-level não é instanciado dentro de qualquer outro módulo.
Por exemplo, módulos de projeto são normalmente instanciados dentro de módulos top-level de testbench para que a simulação possa ser executada fornecendo estímulo de entrada. Mas, o testbench não é instanciado dentro de qualquer outro módulo porque é um bloco que encapsula tudo o mais e portanto é o módulo top-level.
Design Top Level
O código de projeto mostrado abaixo tem um módulo top-level chamado design. Isso é porque ele contém todos os outros sub-módulos necessários para tornar o projeto completo. Os sub-módulos podem ter sub-módulos mais aninhados como mod3 dentro de mod1 e mod4 dentro de mod2. De qualquer forma, todos estes são incluídos no módulo top level quando mod1 e mod2 são instanciados. Então isso torna o design completo e é o módulo top-level para o projeto.
Testbench Top Level
O módulo testbench contém estímulo para verificar funcionalidade do projeto e é primariamente usado para verificação funcional usando ferramentas de simulação. Portanto, o projeto é instanciado e chamado d0 dentro do módulo testbench. Da perspectiva do simulador, testbench é o módulo top level.
Nomes Hierárquicos
Uma estrutura hierárquica é formada quando módulos podem ser instanciados um dentro do outro, e portanto o módulo top level é chamado de root. Como cada instância de módulo inferior dentro de um dado módulo é requerida a ter nomes de identificador diferentes, não haverá ambiguidade em acessar sinais. Um nome hierárquico é construído por uma lista destes identificadores separados por pontos . para cada nível da hierarquia. Qualquer sinal pode ser acessado dentro de qualquer módulo usando o caminho hierárquico para aquele sinal particular.
// Take the example shown above in top level modules
design.mod_inst1 // Access to module instance mod_inst1
design.mod_inst1.y // Access signal "y" inside mod_inst1
design.mod_inst2.mod_inst2.a // Access signal "a" within mod4 module
testbench.d0._net; // Top level signal _net within design module accessed from testbench
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 Funções Matemáticas do Verilog para Design de Hardware Eficiente