Guia Prático: Crie Seu Projeto Inicial em SystemVerilog

Este tutorial tem como objetivo guiar você na criação do seu primeiro projeto 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., passando por etapas simples e essenciais para quem começa a explorar a linguagem. A ideia aqui é apresentar um exemplo prático de um pequeno módulo, com foco no entendimento do fluxo básico de criação, compilação e simulação.

Organização Inicial do Projeto🔗

Para iniciar, pressupõe-se que o ambiente de desenvolvimento (ferramentas de simulaçãoFerramentas de Simulação: Simulação prática: construção e teste de circuitos combinacionaisFerramentas de Simulação: Simulação prática: construção e teste de circuitos combinacionaisAprenda a simular circuitos combinacionais com ferramentas como Logisim, Proteus e Multisim. Teste, valide e otimize seus projetos digitais. Confira! e editor de texto) já esteja configurado. Caso ainda não tenha feito isso, certifique-se de ter:

1. Um simulador que suporte 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. (por exemplo, QuestaSim, VCS ou outro equivalente).

2. Um editor de texto ou IDE capaz de abrir e editar arquivos .sv.

Uma organização simples de pastas pode ajudar no desenvolvimento:

Pasta/ArquivoDescrição
src/*Contém os arquivos SystemVerilog (código-fonte).
tb/*Diretório opcional para arquivos de testbench (caso queira separar seu código de teste).
scripts/* (opcional)Scripts de automação para compilação, simulação, etc.
Makefile (opcional)Arquivo Makefile ou script para facilitar a execução de passos recorrentes (compilação, etc.).

Criando um Módulo de Exemplo🔗

Vamos desenvolver um módulo simples chamado contadorRegistradores e Contadores: Contadores síncronos e assíncronos: sequências personalizadasRegistradores e Contadores: Contadores síncronos e assíncronos: sequências personalizadasAprenda as diferenças entre contadores assíncronos e síncronos, e descubra como utilizar sequências personalizadas para otimizar sistemas digitais., que incrementa um valor binárioSistemas 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. a cada ciclo de relógio. É um excelente ponto de partida para entender a estruturaEstruturas e Uniões: Organizando Dados ComplexosEstruturas e Uniões: Organizando Dados ComplexosAprenda como aplicar estruturas e uniões em SystemVerilog. Descubra a diferença entre packed e unpacked com exemplos práticos e dicas para um design otimizado. básica de um design 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..

Crie o arquivo contadorRegistradores e Contadores: Contadores síncronos e assíncronos: sequências personalizadasRegistradores e Contadores: Contadores síncronos e assíncronos: sequências personalizadasAprenda as diferenças entre contadores assíncronos e síncronos, e descubra como utilizar sequências personalizadas para otimizar sistemas digitais..sv na pasta src/:

module contador (
    input  logic       clk,    // Sinal de clock
    input  logic       rst_n,  // Sinal de reset ativo em nível baixo
    output logic [3:0] count   // Saída de 4 bits para contagem
);
    // Bloco sensível à borda de subida do clock ou borda de descida do reset
    always_ff @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            count <= 4'b0;     // Quando rst_n é 0, a contagem zera
        else
            count <= count + 1;
    end
endmodule

Destaques do Código

  • Declaração de Módulo

No 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., a palavra-chave module e o nome (contadorRegistradores e Contadores: Contadores síncronos e assíncronos: sequências personalizadasRegistradores e Contadores: Contadores síncronos e assíncronos: sequências personalizadasAprenda as diferenças entre contadores assíncronos e síncronos, e descubra como utilizar sequências personalizadas para otimizar sistemas digitais.) definem a unidade de design.

  • I/Os (Entradas e Saídas)

Utilizamos logicTipos de Dados Básicos: Bit, Logic e Reg em DetalhesTipos de Dados Básicos: Bit, Logic e Reg em DetalhesDescubra as diferenças entre os tipos de dados Bit, Logic e Reg em SystemVerilog neste tutorial prático, com dicas de uso e melhores práticas. em vez de wire ou regTipos de Dados Básicos: Bit, Logic e Reg em DetalhesTipos de Dados Básicos: Bit, Logic e Reg em DetalhesDescubra as diferenças entre os tipos de dados Bit, Logic e Reg em SystemVerilog neste tutorial prático, com dicas de uso e melhores práticas.. Isso é um dos diferenciais do 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., tornando o código mais expressivo e flexível.

  • Bloco always_ff

É um tipo de bloco sempre sensível a flip-flopsFlip-Flops e Latches: Tipos: SR, JK, D, T (funcionamento e clock)Flip-Flops e Latches: Tipos: SR, JK, D, T (funcionamento e clock)Aprenda os conceitos de Flip-Flops e Latches, incluindo tipos SR, JK, D e T, além do impacto do clock na sincronização de circuitos digitais. (indicando armazenamentos síncronos ou assíncronos). Dessa forma, o simulador sabe que count é atualizado em cada borda de clockFlip-Flops e Latches: Tipos: SR, JK, D, T (funcionamento e clock)Flip-Flops e Latches: Tipos: SR, JK, D, T (funcionamento e clock)Aprenda os conceitos de Flip-Flops e Latches, incluindo tipos SR, JK, D e T, além do impacto do clock na sincronização de circuitos digitais. ou reset.

Configurando um Testbench Simples🔗

Embora não entremos em detalhes de testbench estrutural, podemos criar rapidamente um testbench simples para verificar o funcionamento do módulo. Crie o arquivo tb_contador.sv na pasta tb/ (ou, caso prefira, no mesmo diretório do arquivo-fonte).

module tb_contador();
    // Sinais de teste
    logic clk;
    logic rst_n;
    logic [3:0] count_out;
    // Instancia o módulo contador
    contador uut (
        .clk    (clk),
        .rst_n  (rst_n),
        .count  (count_out)
    );
    // Clock: alterna a cada 5 ns
    always #5 clk = ~clk;
    initial begin
        // Inicializa os sinais
        clk   = 0;
        rst_n = 0;
        // Mantém reset por 20 ns
        #20;
        rst_n = 1;
        // Roda simulação por alguns ciclos
        #100;
        // Finaliza a simulação
        $finish;
    end
endmodule
Observação: Este testbench cria um clock e valida o reset inicial, permitindo observar a evolução da saída count_out ao longo de alguns ciclos de clock.

Simulando o Projeto🔗

A forma de invocar o simulador varia conforme a ferramenta utilizada. Em geral:

1. Compile os arquivos 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., por exemplo:

vlog src/contador.sv tb/tb_contador.sv

2. Rode a simulação:

vsim tb_contador

3. No ambiente de simulaçãoFerramentas de Simulação: Simulação prática: construção e teste de circuitos combinacionaisFerramentas de Simulação: Simulação prática: construção e teste de circuitos combinacionaisAprenda a simular circuitos combinacionais com ferramentas como Logisim, Proteus e Multisim. Teste, valide e otimize seus projetos digitais. Confira!, observe o waveform para conferir se o valor de count_out está incrementando a cada ciclo de clockFlip-Flops e Latches: Tipos: SR, JK, D, T (funcionamento e clock)Flip-Flops e Latches: Tipos: SR, JK, D, T (funcionamento e clock)Aprenda os conceitos de Flip-Flops e Latches, incluindo tipos SR, JK, D e T, além do impacto do clock na sincronização de circuitos digitais..

Se estiver usando outro simulador, como VCS, os comandos podem ser semelhantes a:

vcs -sverilog src/contador.sv tb/tb_contador.sv -o simv
./simv

Conclusão🔗

Neste tutorial, você:

A partir daqui, você estará preparado para 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, podendo explorar mais recursos da linguagem e suas potencialidades 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., gradativamente. Boa prática e bons estudos!

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