Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Verilog

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.

Nota: Você não pode ter nenhum código escrito fora de um module!

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

  1. Domine o Verilog: Tutorial Completo para Projeto de Circuitos Digitais
  2. Dominando Concatenação Verilog: Guia Prático
  3. Verilog Essencial: Visão Geral Concisa
  4. Entendendo Atribuições em Verilog: Tipos, Sintaxe e Boas Práticas
  5. Verilog Blocking vs Non-Blocking: Diferenças Essenciais Explicadas
  6. Dominando Funções em Verilog para Design RTL Eficiente
  7. Entendendo Tasks em Verilog: Funções vs Tasks, Sintaxe e Uso
  8. Dominando Referência Hierárquica em Verilog: Evite Colisão de Nomes em Módulos e Blocos
  9. Gerador de Clock Verilog: Guia de Design e Implementação
  10. Dominando Funções Matemáticas do Verilog para Design de Hardware Eficiente