Menu

O que é Verilog? Um guia para iniciantes na linguagem de descrição de hardware

Uma introdução em português simples ao Verilog - o que é, para que serve, como ele difere de uma linguagem de programação comum e por que projetistas digitais ainda recorrem a ele depois de 40 anos.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Uma linguagem para descrever circuitos

A maioria das linguagens que você já viu - Python, JavaScript, Go - descreve uma sequência de instruções para uma CPU executar. Verilog descreve um circuito. Você anota quais wires existem, quais registers existem e como os sinais fluem entre eles. Um simulador pode então reproduzir o comportamento do circuito, e uma ferramenta de síntese pode compilar o mesmo texto nos gates e flip-flops de um chip real.

Essa é a definição de uma linha. As implicações levam mais tempo para absorver.

Esse trecho parece um programa minúsculo: um module, um bloco initial, uma system task $display. Pressione Run e você verá hello from verilog. Por baixo dos panos, porém, o simulador não está executando uma função - ele está fingindo que o tempo está passando e avançando o circuito. É por isso que você verá $finish em todos os lugares: alguém precisa dizer ao simulador para parar.

O que "descrição de hardware" realmente significa

Uma linha de C executa quando o program counter chega nela. Uma linha de Verilog descreve uma peça de circuito que existe sempre. Considere:

assign y = a & b;

Isso não é "calcule y uma vez". É "existe um wire y, e a cada momento no tempo ele equivale a a AND b". Mude a ou b e y segue imediatamente. Várias declarações assign em um módulo não são uma sequência - são descrições paralelas de partes separadas do circuito.

Esta é a característica definidora do Verilog e a fonte de todo bug de iniciante. A maior parte do que você escreve descreve coisas acontecendo concorrentemente, e as poucas construções que parecem declarações ordenadas (dentro de blocos initial e always) só parecem assim porque o simulador finge.

O que você constrói com Verilog

Você verá Verilog usado em todos os níveis da pilha digital:

  • Lógica combinacional. Somadores, multiplexadores, decodificadores, fatias de ALU - qualquer coisa em que a saída dependa apenas das entradas atuais.
  • Lógica sequencial. Contadores, registradores de deslocamento, máquinas de estado finitas, qualquer coisa sincronizada por um posedge clk.
  • Núcleos de processadores. De CPUs feitas como tarefa em cursos universitários até os núcleos RISC-V open-source que vão em silício real, o RTL é geralmente Verilog ou SystemVerilog.
  • Projetos para FPGA. Lógica carregada em uma FPGA Xilinx ou Intel - redes, processamento de imagem, controle embarcado - é majoritariamente escrita em Verilog.
  • ASICs. Os chips customizados dentro do seu celular, do seu roteador, do seu carro - o front-end do projeto é HDL, e Verilog é uma das duas escolhas dominantes.

Você não precisa de nada desse hardware para aprender. Tudo nestes docs roda em um simulador no navegador.

Simulação vs Síntese

Existem duas formas de "executar" Verilog, e elas não são a mesma coisa:

  • Simulação reproduz o comportamento do circuito em software. O simulador (Icarus Verilog, Verilator, ModelSim, ferramentas comerciais) lê seus módulos mais um testbench - código que aciona as entradas - e produz saída: logs de texto, formas de onda, relatórios de pass/fail.
  • Síntese pega um subconjunto do Verilog e o compila em uma netlist de gates reais. Uma ferramenta de fornecedor (Vivado, Quartus, design-compiler tools em grandes empresas) cuida do mapeamento. Verilog sintetizado precisa obedecer regras extras - blocos initial e chamadas $display não existem no silício.

O editor no navegador nestas páginas faz simulação. É tudo que você precisa até estar lançando um chip real ou programando uma FPGA.

Verilog vs SystemVerilog

Se você procurar, verá os dois nomes. SystemVerilog é um superconjunto - mantém toda construção do Verilog e adiciona recursos voltados principalmente para verificação (classes, testes aleatórios com restrições, asserções, interfaces, um sistema de tipos muito mais rico). Tudo que você aprende aqui é SystemVerilog válido. Os dois nomes se misturam na prática; a maioria das ferramentas aceita ambos e a maioria dos arquivos termina em .v independentemente. Diremos "Verilog" ao longo destes docs.

Verilog vs VHDL

Ambas são linguagens de descrição de hardware. Ambas são padrões IEEE. Ambas existem desde os anos 1980. As diferenças:

  • Sintaxe. Verilog descende do C - chaves, palavras-chave concisas, regras de tipo mais soltas. VHDL descende do Ada - mais verbosa, muito mais rigorosa quanto a tipos.
  • Geografia. Verilog domina no design comercial americano. VHDL ainda é comum na Europa, em trabalho de defesa e em codebases mais antigas.
  • Capacidade. São aproximadamente equivalentes no que conseguem expressar. Escolha com base no que sua equipe usa.

Se você está aprendendo HDL pela primeira vez, Verilog tem a curva mais suave - sintaxe menor, mais permissiva, e a biblioteca padrão de exemplos online é maior.

Como esses docs executam Verilog

O editor abaixo usa Icarus Verilog (iverilog) por baixo dos panos. Ele compila seu fonte em um simulador e o executa dentro de um sandbox. Sem licença do Vivado, sem instalação do Quartus, sem placa FPGA necessária. Você escreve um módulo mais um pequeno testbench, pressiona Run, e vê a saída e a forma de onda.

Esse é um contador de 4 bits completo mais um testbench. O módulo counter é o design under test (DUT); o módulo test mexe no clock, libera o reset e imprime o valor a cada ciclo. Execute-o e você verá count caminhar de 0 a 15 e dar a volta. Abra a aba Waveform e você verá a mesma coisa como transições de tensão.

O que vem a seguir

Você tem contexto suficiente para começar a escrever módulos. O próximo doc - Hardware vs Software - gasta um pouco mais de tempo na mudança de modelo mental, porque é o maior tropeço para novos programadores Verilog. Depois disso, instalar um simulador local (opcional - o navegador está ótimo), escrever seu primeiro módulo do zero e o resto da linguagem.

Vá no seu ritmo. A sintaxe é pequena; o modelo mental é o trabalho.

Perguntas frequentes

O que é Verilog em termos simples?

Verilog é uma linguagem de descrição de hardware (HDL) usada para descrever circuitos digitais em texto. Em vez de escrever instruções que uma CPU executa, você descreve wires, registers, gates e como os sinais fluem entre eles. Um simulador então executa a descrição para você verificar o comportamento, e uma ferramenta de síntese pode transformar a mesma descrição em um layout real de chip.

Para que serve o Verilog?

Verilog é usado para projetar e verificar hardware digital: CPUs, GPUs, switches de rede, controladores de memória, blocos de processamento de sinais, projetos para FPGA - qualquer coisa construída com gates e flip-flops. Também roda em simulação pura para ensinar lógica digital e prototipar projetos antes que qualquer silício seja produzido.

Verilog é uma linguagem de programação?

Não no sentido usual. Código Verilog descreve estrutura e comportamento de hardware - sinais, gates e armazenamento sincronizado por clock - em vez de uma sequência de instruções de CPU. Muitas linhas que você escreve acontecem concorrentemente no chip, não uma depois da outra. Essa mudança mental é o maior obstáculo ao migrar de software para Verilog.

Qual a diferença entre Verilog e SystemVerilog?

SystemVerilog é um superconjunto do Verilog. Mantém toda a sintaxe do Verilog e adiciona recursos principalmente para verificação: classes, estímulo aleatório com restrições, asserções, interfaces e tipos de dados mais ricos. Ferramentas que aceitam SystemVerilog também aceitam Verilog puro. Para a maior parte do trabalho introdutório, os dois parecem idênticos.

Qual a diferença entre Verilog e VHDL?

Verilog e VHDL são ambas linguagens de descrição de hardware que resolvem o mesmo problema. A sintaxe do Verilog descende do C e é mais concisa; a do VHDL descende do Ada e é mais verbosa e rigorosa quanto a tipos. O uso na indústria varia por região e equipe - ambas estão vivas, ambas são padronizadas (IEEE 1364/1800 para Verilog/SystemVerilog, IEEE 1076 para VHDL).

Verilog é difícil de aprender?

A sintaxe é pequena - menor que a do C++. A parte difícil é desaprender hábitos de software. Em Verilog, a maioria das declarações descreve coisas que acontecem ao mesmo tempo, não em sequência, e uma blocking assignment trocada por uma non-blocking pode mudar se seu circuito sequer funciona. Espere a primeira semana ser desorientadora antes que tudo se encaixe.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR