Un lenguaje para describir circuitos
La mayoría de los lenguajes que conoces - Python, JavaScript, Go - describen una secuencia de instrucciones para que una CPU las ejecute. Verilog describe un circuito. Anotas qué wires existen, qué registros existen y cómo fluyen las señales entre ellos. Un simulador puede entonces reproducir el comportamiento del circuito, y una herramienta de síntesis puede compilar ese mismo texto en las puertas y flip-flops de un chip real.
Esa es la definición en una línea. Las implicaciones tardan más en asimilarse.
Ese fragmento parece un programa diminuto: un module, un bloque initial, una tarea de sistema $display. Pulsa Ejecutar y verás hello from verilog. Por debajo, sin embargo, el simulador no está ejecutando una función - está fingiendo que el tiempo pasa y haciendo avanzar el circuito. Por eso verás $finish por todas partes: alguien tiene que decirle al simulador que pare.
Qué significa realmente "descripción de hardware"
Una línea de C se ejecuta cuando el contador de programa llega a ella. Una línea de Verilog describe un trozo de circuitería que existe siempre. Considera:
assign y = a & b;
Eso no significa "calcula y una vez". Significa "existe un wire y, y en cada instante de tiempo es igual a a AND b". Cambia a o b y y lo sigue inmediatamente. Varias sentencias assign en un módulo no son una secuencia - son descripciones paralelas de partes distintas del circuito.
Esta es la característica definitoria de Verilog y la fuente de cada bug de principiante. La mayor parte de lo que escribes describe cosas que ocurren concurrentemente, y las pocas construcciones que parecen sentencias ordenadas (dentro de los bloques initial y always) solo lo parecen porque el simulador finge.
Qué construyes con Verilog
Verás Verilog usado en todos los niveles del stack digital:
- Lógica combinacional. Sumadores, multiplexores, decodificadores, slices de ALU - cualquier cosa donde la salida depende solo de las entradas actuales.
- Lógica secuencial. Contadores, registros de desplazamiento, máquinas de estados finitos, cualquier cosa sincronizada con
posedge clk. - Núcleos de procesador. Desde CPUs de tarea universitaria hasta los núcleos RISC-V open-source que se envían en silicio real, el RTL normalmente es Verilog o SystemVerilog.
- Diseños para FPGA. La lógica que se carga en una FPGA de Xilinx o Intel - redes, procesamiento de imagen, control embebido - se escribe de forma abrumadora en Verilog.
- ASICs. Los chips a medida dentro de tu teléfono, tu router, tu coche - el diseño front-end es HDL, y Verilog es una de las dos opciones dominantes.
No necesitas nada de este hardware para aprender. Todo en estos docs se ejecuta en un simulador basado en navegador.
Simulación vs síntesis
Hay dos maneras de "ejecutar" Verilog, y no son lo mismo:
- Simulación reproduce el comportamiento del circuito en software. El simulador (Icarus Verilog, Verilator, ModelSim, herramientas comerciales) lee tus módulos más un testbench - código que excita las entradas - y produce salida: logs de texto, formas de onda, reportes de pass/fail.
- Síntesis toma un subconjunto de Verilog y lo compila en una netlist de puertas reales. Una herramienta del proveedor (Vivado, Quartus, herramientas tipo design-compiler en empresas grandes) se encarga del mapeo. El Verilog sintetizado tiene que obedecer reglas extra - los bloques
initialy las llamadas a$displayno existen en silicio.
El editor del navegador en estas páginas hace simulación. Eso es todo lo que necesitas hasta que envíes un chip real o programes una FPGA.
Verilog vs SystemVerilog
Si te pones a buscar, verás los dos nombres. SystemVerilog es un superconjunto - mantiene cada construcción de Verilog y añade características orientadas principalmente a verificación (clases, testing aleatorio con restricciones, aserciones, interfaces, un sistema de tipos mucho más rico). Cualquier cosa que aprendas aquí es SystemVerilog válido. Los dos nombres se mezclan en la práctica; la mayoría de las herramientas aceptan ambos y la mayoría de los archivos terminan en .v independientemente. Diremos "Verilog" a lo largo de estos docs.
Verilog vs VHDL
Los dos son lenguajes de descripción de hardware. Los dos son estándares IEEE. Los dos llevan en circulación desde los años 80. Las diferencias:
- Sintaxis. Verilog desciende de C - llaves, palabras clave concisas, reglas de tipos más laxas. VHDL desciende de Ada - más verboso, mucho más estricto con los tipos.
- Geografía. Verilog domina en el diseño comercial de EE. UU. VHDL sigue siendo común en Europa, en trabajo de defensa y en bases de código más antiguas.
- Capacidad. Son aproximadamente equivalentes en lo que pueden expresar. Elige según lo que use tu equipo.
Si estás aprendiendo HDL por primera vez, Verilog tiene la rampa más suave - sintaxis más pequeña, más permisiva, y la biblioteca estándar de ejemplos en línea es más grande.
Cómo estos docs ejecutan Verilog
El editor de abajo usa Icarus Verilog (iverilog) por debajo. Compila tu código fuente en un simulador y lo ejecuta dentro de un sandbox. No hay licencia de Vivado, ni instalación de Quartus, ni placa FPGA requerida. Escribes un módulo más un pequeño testbench, pulsas Ejecutar y ves la salida y la forma de onda.
Eso es un contador completo de 4 bits más un testbench. El módulo counter es el diseño bajo prueba (DUT); el módulo test mueve el reloj, libera el reset e imprime el valor en cada ciclo. Ejecútalo y verás cómo count camina de 0 a 15 y vuelve a empezar. Abre la pestaña de Waveform y verás lo mismo como transiciones de voltaje.
Qué viene a continuación
Tienes contexto suficiente para empezar a escribir módulos. El siguiente doc - Hardware vs Software - dedica un poco más de tiempo al cambio del modelo mental, porque es el mayor tropiezo único para los nuevos programadores de Verilog. Después de eso, instalar un simulador local (opcional - el navegador está bien), escribir tu primer módulo desde cero y el resto del lenguaje.
Ve a tu ritmo. La sintaxis es pequeña; el modelo mental es el trabajo.
Preguntas frecuentes
¿Qué es Verilog en términos sencillos?
Verilog es un lenguaje de descripción de hardware (HDL) que se usa para describir circuitos digitales en forma de texto. En vez de escribir instrucciones que una CPU ejecuta, describes wires, registros, puertas lógicas y cómo fluyen las señales entre ellos. Un simulador ejecuta la descripción para que puedas verificar el comportamiento, y una herramienta de síntesis puede convertir esa misma descripción en el layout real de un chip.
¿Para qué se usa Verilog?
Verilog se usa para diseñar y verificar hardware digital: CPUs, GPUs, switches de red, controladores de memoria, bloques de procesamiento de señal, diseños para FPGA - cualquier cosa construida con puertas y flip-flops. También se ejecuta en simulación pura para enseñar lógica digital y prototipar diseños antes de producir silicio.
¿Verilog es un lenguaje de programación?
No en el sentido habitual. El código Verilog describe la estructura y el comportamiento del hardware - señales, puertas y almacenamiento sincronizado por reloj - en vez de una secuencia de instrucciones de CPU. Muchas líneas que escribes ocurren de forma concurrente en el chip, no una tras otra. Ese cambio mental es el mayor obstáculo al pasar del software a Verilog.
¿Cuál es la diferencia entre Verilog y SystemVerilog?
SystemVerilog es un superconjunto de Verilog. Mantiene toda la sintaxis de Verilog y añade características principalmente para verificación: clases, estímulos aleatorios con restricciones, aserciones, interfaces y tipos de datos más ricos. Las herramientas que aceptan SystemVerilog también aceptan Verilog clásico. Para la mayoría del trabajo introductorio, los dos se ven idénticos.
¿Cuál es la diferencia entre Verilog y VHDL?
Verilog y VHDL son ambos lenguajes de descripción de hardware que resuelven el mismo problema. La sintaxis de Verilog desciende de C y es más concisa; la de VHDL desciende de Ada y es más verbosa y estricta con los tipos. El uso en la industria varía por región y equipo - los dos siguen vivos, los dos son estándar (IEEE 1364/1800 para Verilog/SystemVerilog, IEEE 1076 para VHDL).
¿Es difícil aprender Verilog?
La sintaxis es pequeña - más pequeña que C++. La parte difícil es desaprender los hábitos del software. En Verilog, la mayoría de las sentencias describen cosas que suceden al mismo tiempo, no en secuencia, y una asignación bloqueante donde debería ir una no bloqueante puede cambiar si tu circuito siquiera funciona. Espera que la primera semana se sienta desorientadora antes de que encaje.