Documentación de Verilog
Referencia concisa y basada en ejemplos de Verilog. Lee el concepto, mira el código y practícalo en un recorrido de Coddy.
Inicia un recorrido guiado de VerilogPrimeros pasos
- ¿Qué es Verilog?Una introducción en lenguaje sencillo a Verilog: qué es, para qué sirve, en qué se diferencia de un lenguaje de programación tradicional y por qué los diseñadores digitales siguen recurriendo a él tras 40 años.
- Hardware vs SoftwarePor qué Verilog resulta desconcertante después de los lenguajes de software: concurrencia por defecto, el tiempo como concepto de primera clase y sentencias que no se ejecutan en orden.
- Instalar VerilogInstala Icarus Verilog y GTKWave para compilar y simular Verilog localmente. O sáltate la instalación y usa el editor del navegador - cualquiera de las dos funciona para estos docs.
- Tu primer móduloEscribe tu primer módulo Verilog completo desde cero - declaración, puertos, una pieza de lógica combinacional y un testbench que lo excita. Ejecutable en el navegador.
- ComentariosCómo escribir comentarios de una línea y de múltiples líneas en Verilog, además de los patrones de documentación que los diseñadores digitales usan para mantener legibles los módulos a medida que crecen.
Tipos de datos y números
- Wire y regLos dos tipos de datos principales en Verilog - `wire` para conexiones continuas y `reg` para almacenamiento procedural - y la regla para elegir entre ellos cada vez.
- Vectores y arraysCómo declarar señales multibit con `[7:0]`, slicearlas, combinarlas y la diferencia entre un vector empaquetado y un array de memoria.
- ParámetrosCómo usar `parameter` y `localparam` para definir constantes en tiempo de compilación, parametrizar anchos y profundidades y sobrescribir valores cuando instancias un módulo.
- Literales numéricosCómo escribe Verilog las constantes: con tamaño vs sin tamaño, las bases `'b` `'h` `'d` `'o`, números con signo, guiones bajos para legibilidad y los gotchas que pillan a los principiantes.
- Valores X y ZLas señales de Verilog tienen cuatro valores posibles, no dos. Aquí está lo que `x` (desconocido) y `z` (alta impedancia) significan realmente en simulación, y cómo depurarlos.
Operadores
- OperadoresLos operadores principales de Verilog - aritméticos, de comparación, lógicos y el condicional `?:` - con las reglas y gotchas en torno a anchos mezclados y signed-ness.
- Bit a bit y reducciónLos operadores a nivel de bit en Verilog: AND/OR/XOR bit a bit, las formas de inversión y los operadores de reducción que colapsan un vector entero a un solo bit.
- Concatenación y replicaciónCómo pegar señales juntas con `{}` y copiar un patrón N veces con `{N{...}}` - los operadores indispensables de Verilog para construir buses más anchos a partir de piezas.
Módulos y estructura
- Puertos de móduloCómo declarar puertos de módulo - input, output e inout - la lista de puertos de estilo ANSI y cuándo una salida debería ser `wire` vs `reg`.
- Instanciación de módulosCómo instanciar un módulo dentro de otro, la diferencia entre conexiones de puerto por nombre y por posición, y los patrones de múltiples instancias que usarás para construir diseños reales.
- Asignación continuaCómo funciona `assign` - la relación siempre cierta que describe, qué puede y qué no puede excitar, y los patrones en los que brilla comparado con el código procedural.
Bloques procedurales
- Bloque alwaysCómo funcionan los bloques `always`, la diferencia entre `always @(*)` combinacional y `always @(posedge clk)` sincronizado por reloj, y las reglas que deciden qué hardware produce cada uno.
- Bloque initialCómo los bloques `initial` se diferencian de `always`, por qué solo existen en simulación, y los patrones comunes - estímulos, configuración de forma de onda, encabezados de log - para los que se usan.
- Blocking vs Non-blockingEl tema más confuso para principiantes en Verilog. Qué significan realmente `=` y `<=` dentro de un bloque `always`, y la regla que previene la mayoría de las condiciones de carrera.
Flujo de control
- If-elseCómo funciona `if`/`else` dentro de un bloque `always`, la trampa del latch que atrapa a los principiantes y el hardware de codificador de prioridad que producen los `else if` encadenados.
- Sentencia caseCómo funciona `case` para una decodificación multivía limpia, el `default` que nunca deberías saltarte, y las diferencias entre `case`, `casex` y `casez`.
- Loops forCómo los loops `for` de Verilog difieren de sus primos del software - los desenrolla el sintetizador en hardware paralelo, no se ejecutan iterativamente en runtime.
Lógica secuencial y FSM
- Lógica sincronizadaCómo construir registros, contadores, shift registers y pipelines a partir de bloques `always` sincronizados por reloj - el patrón caballo de batalla de todo diseño digital síncrono.
- Máquinas de estadosCómo escribir una FSM de Verilog como hacen los profesionales - un registro de estado sincronizado por reloj, un bloque combinacional de siguiente estado y una separación limpia que es fácil de leer y sintetizar.
Bancos de prueba y simulación
- Fundamentos de testbenchCómo escribir un testbench Verilog - generación de reloj, secuencia de reset, estímulos, observación y el esqueleto estándar que dirige cada simulación que vas a correr.
- Display y MonitorCómo funcionan `$display`, `$write` y `$monitor` - los especificadores de formato que usarás, la diferencia entre ellos y cuándo cada uno es la herramienta correcta.
- Dumpfile y VCDCómo añadir salida de forma de onda VCD a un testbench - `$dumpfile`, `$dumpvars`, selección de scope y cómo ver el archivo resultante en GTKWave o el editor del navegador.
- Timescale y retardosCómo la directiva `` `timescale `` establece la unidad de `#delay`, las reglas para combinar unidades distintas entre archivos y cómo los retardos interactúan con la lógica sincronizada por reloj.