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;