Construindo um Ambiente de Simulação por Linha de Comando com Icarus Verilog

Muitos desenvolvedores, ao concluírem um design como um contador, sentem-se inseguros quanto à sua correta operação. O desejo de simular o design esbarra frequentemente na complexidade de instalar gigabytes de software coemrcial e gerenciar licenças.

Não se preocupe — existe uma abordagem mais leve e clara, ideal tanto para aprendizado quanto para automação: utilizar o Icarus Verilog (iverilog) para criar um ambiente de simulação baseado em comandos. Este guia conduzirá você desde o início, sem dependência de interfaces gráficas. Através de poucos comandos, será possível executar seu design, gerar ondas, imprimir sinais e até implementar testes regressivos. O processo é análogo a compilar e executar um programa em C: compilar → executar → analisar os resultados.

Por que escolher o Icarus Verilog? Vai além de ser gratuito.

No domínio do design de FPGA e IC digital, a simulação funcional é a primeira linha de defesa. Seja implementando uma lógica combinacional, uma FSM complexa, ou mesmo um núcleo RISC-V, é indispensável validar o comportamento lógico na simulação antes de qualquer outra etapa.

O Icarus Verilog se destaca como a ferramenta ideal para iniciantes nessa fase. Não é uma alternativa meramente "aceitável", mas um simulador de código aberto que segue rigorosamente o padrão IEEE 1364, com suporte à maioria das características do Verilog-2005.

Seus benefícios vão muito além do custo zero:

  • ✅ Totalmente open source, sem preocupações com licenças.
  • ✅ Multiplatfaorma: funciona em Linux, macOS e Windows (via WSL).
  • ✅ Orientado por linha de comandos, perfeito para scripts e integração com pipelines de CI/CD.
  • ✅ Gera arquivos de ondas no formato VCD, que podem ser analisados visualmente com ferramentas como o GTKWave.
  • ✅ Arquitetura com compilação e execução separadas, facilitando a depuração e a reprodutibilidade.

Além disso, ele exige que você compreenda a essência do fluxo de simulação em Verilog — já que não há uma IDE para clicar em "Executar". Esse contato direto com os fundamentos é crucial para construir uma base sólida.

Primeiros passos: Realizando uma simulação completa em três etapas.

Utilizaremos um exemplo clássico de um Flip-Flop Tipo D (DFF) para demonstrar o processo completo, desde a escrita do código até a visualização das formas de onda.

Etapa 1: Criar dois arquivos — O Device Under Test (DUT) e o Testbench.

Comece criando dois arquivos com a extensão .v.

dff.v — O Design sob Teste (DUT)
// dff.v - Flip-Flop Tipo D com reset assíncrono, sensível à borda de subida
module dff (
    input wire clk,
    input wire reset_n,
    input wire data_in,
    output reg q_out
);

always @(posedge clk or negedge reset_n) begin
    if (!reset_n)
        q_out <= 1'b0;
    else
        q_out <= data_in;
end

endmodule

Um módulo simples. Na borda de subida do clock, a saída q_out amostra a entrada data_in. Um pulso no reset_n (ativo em nível baixo) força a saída a zero. Este é o bloco funadmental para qualquer lógica sequencial.

tb_dff.v — A Plataforma de Teste (Testbench)
// tb_dff.v - Plataforma de teste para o DFF
module tb_dff;

Tags: iverilog Verilog icarus-verilog testbench simulation

Publicado em 7-25 03:50