Guia Prático: Hierarquia de Módulos em SystemVerilog

A hierarquia é um dos conceitos centrais em projetos de hardware descritos em SystemVerilog. Pense em um sistema complexo como uma construção: cada prédio, andar, sala ou equipamento faz parte de uma grande estrutura organizada em níveis (hierarquias). Em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital., isso não é diferente. Você pode criar blocos (módulos) menores e interconectá-los para formar sistemas mais elaborados, mantendo o projetoIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. organizado e escalável.

Neste tutorial, vamos explorar passo a passo como instanciar módulosOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. e conectá-los entre si para que o fluxo de sinais e de dados seja correto e claro. Nosso objetivo é que você entenda como estabelecer a relação pai-filho na hierarquia e aprenda as principais formas de passar sinais entre eles.

Visão Geral de Módulos🔗

Em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. (assim como no estilo tradicional de Verilog), um módulo corresponde a um bloco funcional do seu projeto. Cada módulo pode conter:

Quando criamos um “módulo pai” (top-level), ele pode ser responsável por controlar ou orquestrar “módulosOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. filhos” (submódulos). Essa relação define nossa hierarquia de design.

Sintaxe Básica de Módulos🔗

Para relembrar a forma de declarar um módulo básico em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital.:

module nome_modulo (
    input  logic      clk,
    input  logic      reset,
    input  logic [3:0] a,
    output logic [3:0] b
);
    // Lógica interna do módulo
endmodule

No exemplo acima, definimos um móduloOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. chamado nome_modulo com algumas portas de entrada e saída. Essas portas serão a interfaceInterfaces SystemVerilog: Simplificando Conexões de SinalInterfaces SystemVerilog: Simplificando Conexões de SinalDescubra como utilizar interfaces em SystemVerilog para agrupar sinais e simplificar a conexão entre módulos, reduzindo erros e aumentando a eficiência. de comunicação com outros módulos.

Conexão de Blocos: Instanciando Submódulos🔗

Instanciar um submódulo significa criar uma “cópia funcional” dele dentro de outro módulo. Assim como plugin, você aloca a “ficha” do submódulo dentro do módulo pai. A sintaxe básica de instanciação em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. é:

nome_modulo inst_nome (
    .clk    ( clk_sistema ),
    .reset  ( rst_sistema ),
    .a      ( sinal_a ),
    .b      ( sinal_b )
);

Observe que:

Conexão Posicional vs. Conexão Nomeada

Conexão nomeada (ilustrado acima) é altamente recomendada, pois deixa o código mais fácil de ler, reduzindo riscos de erros. Entretanto, há também a forma de conexão posicional:

nome_modulo inst_nome (clk_sistema, rst_sistema, sinal_a, sinal_b);

Nesse caso, a ordem das portas na instância deve corresponder exatamente à ordem declarada no móduloOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. original. Um pequeno deslize na ordem pode causar problemas de difícil identificação, por isso é menos seguro que a conexão nomeada.

Exemplo de Hierarquia Completa🔗

Considere um sistema onde seu móduloOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. superior (chamado top_system) contém dois submódulos responsáveis por diferentes tarefas. Cenas do cotidiano de projetosIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. mais complexos: cada submódulo pode realizar uma parte da lógica do sistema, e as interconexões definem como elas interagem.

module submodule_adder (
    input  logic [3:0] in1,
    input  logic [3:0] in2,
    output logic [4:0] sum
);
    // Soma simples de 4 bits (saída com 1 bit extra para overflow)
    assign sum = in1 + in2;
endmodule
module submodule_multiplier (
    input  logic [3:0] in1,
    input  logic [3:0] in2,
    output logic [7:0] product
);
    // Multiplicação simples de 4 bits (saída pode ter 8 bits)
    assign product = in1 * in2;
endmodule
module top_system (
    input  logic [3:0] data_a,
    input  logic [3:0] data_b,
    output logic [4:0] result_sum,
    output logic [7:0] result_product
);
    // Instanciação do módulo somador
    submodule_adder u_adder (
        .in1 ( data_a ),
        .in2 ( data_b ),
        .sum ( result_sum )
    );
    // Instanciação do módulo multiplicador
    submodule_multiplier u_multiplier (
        .in1      ( data_a ),
        .in2      ( data_b ),
        .product  ( result_product )
    );
endmodule

Neste exemplo:

1. submodule_adder: MóduloOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. que recebe duas entradas de 4 bits (in1, in2) e gera uma saída de 5 bitsSistemas de Numeração e Conversão: Binário, Decimal, Octal e HexadecimalSistemas de Numeração e Conversão: Binário, Decimal, Octal e HexadecimalAprenda conversões de sistemas numéricos em eletrônica digital. Descubra métodos para converter entre decimal, binário, octal e hexadecimal com exemplos. (sum).

2. submodule_multiplier: MóduloOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. que recebe duas entradas de 4 bits (in1, in2) e fornece uma saída de 8 bitsSistemas de Numeração e Conversão: Binário, Decimal, Octal e HexadecimalSistemas de Numeração e Conversão: Binário, Decimal, Octal e HexadecimalAprenda conversões de sistemas numéricos em eletrônica digital. Descubra métodos para converter entre decimal, binário, octal e hexadecimal com exemplos. (product).

3. top_system: MóduloOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. de nível superior que instância ambos os submódulos e interliga seus sinais de entrada (data_a, data_b) aos pinos dos filhos. Em seguida, exporta as saídas (result_sum, result_product) para fora.

Esse arranjo mostra como dividir as funcionalidades para simplificar o projetoIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital., ilustrando a ideia de hierarquia: top_system como móduloOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. pai, e submodule_adder e submodule_multiplier como módulosOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. filhos.

Dicas de Organização🔗

Vantagens de uma Hierarquia Bem Definida🔗

1. Manutenção Facilitada: Alterar ou corrigir um submódulo é mais simples quando cada parte possui responsabilidade bem limitada.

2. Reutilização: Um submódulo bem projetado pode ser usado em diversos projetosIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital., reduzindo o retrabalho.

3. Legibilidade: Hierarquias claras possibilitam compreender o projetoIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. de forma top-down ou bottom-up, ajudando em revisões de código.

Conclusões🔗

A hierarquia de módulosOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. em SystemVerilogIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. é uma ferramenta indispensável para organizar e escalar projetos de hardwareBoas Práticas de Programação Embarcada e Otimização de CódigoBoas Práticas de Programação Embarcada e Otimização de CódigoDescubra técnicas e práticas essenciais para otimizar o código de sistemas embarcados, garantindo desempenho e eficiência em projetos eletrônicos.. Entender como instanciar submódulos e conectá-los corretamente é a base para arquiteturas mais complexas e, ao mesmo tempo, mais gerenciáveis.

Você viu como é simples criar um módulo pai que integra módulosOrganização de Projeto: Divisão em MódulosOrganização de Projeto: Divisão em MódulosAprenda a dividir projetos em módulos com SystemVerilog e descubra como organizar código para garantir clareza, testes facilitados e manutenção ágil. filhos. Hierarquia é essencial para manter os projetos de hardware bem estruturados, colaborando para uma fase de verificaçãoIntrodução ao SystemVerilog: História e EvoluçãoIntrodução ao SystemVerilog: História e EvoluçãoDescubra a trajetória do SystemVerilog, sua origem a partir do Verilog, e os marcos que transformaram a verificação de hardware na indústria digital. e manutenção mais fluida. Sinta-se à vontade para aplicar esses conceitos em designs de qualquer porte, sempre mantendo a clareza dos nomes de instâncias e a coerência dos sinais conectados!

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados