Documentação de Verilog
Referência concisa e baseada em exemplos de Verilog. Leia o conceito, veja o código e pratique em uma jornada da Coddy.
Inicie uma jornada guiada de VerilogPrimeiros passos
- O que é Verilog?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.
- Hardware vs SoftwarePor que Verilog parece desorientador depois de linguagens de software: concorrência por padrão, tempo como conceito de primeira classe e declarações que não executam em ordem.
- Instalar VerilogInstale o Icarus Verilog e o GTKWave para compilar e simular Verilog localmente. Ou pule a instalação e use o editor do navegador - qualquer um funciona para estes docs.
- Seu primeiro moduleEscreva seu primeiro module Verilog completo do zero - declaração, ports, uma peça de lógica combinacional e um testbench que o aciona. Executável no navegador.
- ComentáriosComo escrever comentários de linha única e múltiplas linhas em Verilog, mais os padrões de documentação que projetistas digitais usam para manter modules legíveis conforme crescem.
Tipos de dados e números
- Wire e RegOs dois principais tipos de dados em Verilog - `wire` para conexões contínuas e `reg` para armazenamento procedural - e a regra para escolher entre eles toda vez.
- Vetores e ArraysComo declarar sinais multi-bit com `[7:0]`, fatiá-los, combiná-los e a diferença entre um vetor packed e um array de memória.
- ParametersComo usar `parameter` e `localparam` para definir constantes em tempo de compilação, parametrizar larguras e profundidades e sobrescrever valores ao instanciar um module.
- Number LiteralsComo o Verilog escreve constantes: sized vs unsized, as bases `'b` `'h` `'d` `'o`, números signed, underscores para legibilidade e as pegadinhas que mordem iniciantes.
- X e Z ValuesSinais Verilog têm quatro valores possíveis, não dois. Aqui está o que `x` (desconhecido) e `z` (alta impedância) realmente significam em simulação e como debugá-los.
Operadores
- OperadoresOs operadores principais em Verilog - aritméticos, comparação, lógicos e o condicional `?:` - com as regras e pegadinhas em torno de larguras mistas e signedness.
- Bitwise e ReductionOs operadores em nível de bit em Verilog - AND/OR/XOR bitwise, as formas de inversão e os operadores de reduction que colapsam um vetor inteiro em um único bit.
- Concatenação e ReplicaçãoComo colar sinais com `{}` e copiar um padrão N vezes com `{N{...}}` - os operadores indispensáveis do Verilog para construir barramentos mais largos a partir de pedaços.
Módulos e estrutura
- Module PortsComo declarar ports de module - input, output e inout - a lista de ports no estilo ANSI e quando uma saída deve ser `wire` vs `reg`.
- Module InstantiationComo instanciar um module dentro de outro, a diferença entre conexões de port nomeadas e posicionais e os padrões de múltiplas instâncias que você vai usar para construir designs reais.
- Continuous AssignmentComo `assign` funciona - a relação sempre-verdadeira que descreve, o que pode e o que não pode conduzir, e os padrões em que brilha comparado a código procedural.
Blocos procedurais
- Always BlockComo blocos `always` funcionam, a diferença entre combinacional `always @(*)` e clocked `always @(posedge clk)` e as regras que decidem qual hardware cada um produz.
- Initial BlockComo blocos `initial` diferem de `always`, por que só existem em simulação e os padrões comuns - estímulo, setup de forma de onda, cabeçalhos de log - para os quais são usados.
- Blocking vs Non-blockingO tópico mais confuso para iniciantes em Verilog. O que `=` e `<=` realmente significam dentro de um bloco `always`, e a regra que evita a maioria das race conditions.
Fluxo de controle
- If-ElseComo `if`/`else` funciona dentro de um bloco `always`, a armadilha do latch que pega iniciantes e o hardware de priority-encoder que cadeias de `else if` produzem.
- Case StatementComo `case` funciona para decodificação multi-way limpa, o `default` que você nunca deve pular e as diferenças entre `case`, `casex` e `casez`.
- For LoopsComo loops `for` em Verilog diferem de seus primos de software - são desenrolados pelo sintetizador em hardware paralelo, não executados iterativamente em runtime.
Lógica sequencial e FSMs
- Clocked LogicComo construir registers, contadores, shift registers e pipelines a partir de blocos `always` clocked - o padrão burro de carga de cada design digital síncrono.
- Finite State MachinesComo escrever uma FSM Verilog do jeito que profissionais fazem - um state register clocked, um bloco combinacional de next-state e uma separação limpa fácil de ler e sintetizar.
Testbenches e simulação
- Testbench BasicsComo escrever um testbench Verilog - geração de clock, sequência de reset, estímulo, observação e o esqueleto padrão que aciona cada simulação que você vai rodar.
- Display e MonitorComo `$display`, `$write` e `$monitor` funcionam - os format specifiers que você vai usar, a diferença entre eles e quando cada um é a ferramenta certa.
- Dumpfile e VCDComo adicionar saída de forma de onda VCD a um testbench - `$dumpfile`, `$dumpvars`, seleção de escopo e como visualizar o arquivo resultante no GTKWave ou no editor do navegador.
- Timescale e DelaysComo a diretiva `` `timescale `` define a unidade de `#delay`, as regras para combinar unidades diferentes entre arquivos e como delays interagem com lógica clocked.