Menu
Coddy logo textTech

Hoja de Trucos de Verilog

Última actualización

Estructura de módulos y puertos

Un módulo es el componente básico: tiene un nombre y una lista de puertos.

SintaxisSignificado
module adder(...); ... endmoduleDefine un módulo y su cuerpo
input clk;Un puerto de entrada
output q;Un puerto de salida
output reg q;Una salida controlada desde un bloque always
input [7:0] data;Un bus de entrada de 8 bits (vector)
inout sda;Un puerto bidireccional
adder u1 (.a(x), .b(y), .sum(s));Instancia un módulo por puertos con nombre

Tipos de datos

wire modela una conexión; reg contiene un valor que asigna el código procedural.

ElementoQué hace
wire w;Una red controlada por assign o por la salida de un módulo
reg r;Contiene un valor asignado dentro de un bloque always/initial
wire [3:0] bus;Un vector de 4 bits (bits del 3 al 0)
reg [7:0] count;Un registro de 8 bits
bus[2]Selecciona un solo bit
bus[3:1]Selecciona un segmento de bits (part-select)
reg mem [0:255];Una memoria: un array de registros
parameter WIDTH = 8;Una constante con nombre para el módulo

Literales numéricos

El formato es <size>'<base><value>: tamaño en bits, base como b/o/d/h.

SintaxisSignificado
4'b1010Binario de 4 bits, valor 10
8'hFFHexadecimal de 8 bits, valor 255
8'hffIgual: los dígitos hexadecimales no distinguen mayúsculas
16'd255Decimal de 16 bits, valor 255
3'o7Octal de 3 bits, valor 7
8'b1010_1100Los guiones bajos agrupan dígitos para mejorar la legibilidad
1'bxUn valor de bit desconocido (x)
1'bzUn valor de bit de alta impedancia (z)

Operadores

Operadores a nivel de bits, lógicos, de comparación y de reducción.

OperadorQué hace
& | ^ ~AND, OR, XOR, NOT a nivel de bits
&& || !AND, OR, NOT lógicos (devuelven 1 bit)
== != < > <= >=Operadores de comparación
<< >>Desplazamiento a la izquierda y a la derecha
+ - * / %Operadores aritméticos
&busReducción AND (AND de todos los bits)
|busReducción OR (OR de todos los bits)
^busReducción XOR (paridad de todos los bits)
{a, b}Concatenación; {4{1'b1}} se replica a 4'b1111

Asignación continua

assign controla un wire de forma continua: úsalo para lógica combinacional.

SintaxisSignificado
assign y = a & b;Controla y con el AND de a y b
assign sum = a + b;Calcula una suma de forma continua
assign y = sel ? a : b;Ternario: un multiplexor 2 a 1
assign {c, s} = a + b;Captura el acarreo y la suma juntos
assign y = ~en;Controla un wire a partir de una señal invertida

Bloques procedurales

always e initial ejecutan sentencias; la lista de sensibilidad controla cuándo.

SintaxisSignificado
always @(*) begin ... endLógica combinacional (cualquier cambio en una entrada)
always @(posedge clk)Se ejecuta en cada flanco de subida del reloj (secuencial)
always @(negedge clk)Se ejecuta en cada flanco de bajada del reloj
always @(posedge clk or posedge rst)Bloque sincronizado con reset asíncrono
initial begin ... endSe ejecuta una vez en el tiempo 0 (testbenches, solo simulación)
begin ... endAgrupa varias sentencias
#10Retrasa 10 unidades de tiempo (solo simulación)

Bloqueante vs no bloqueante

Usa = para la lógica combinacional y <= para la lógica secuencial sincronizada.

SintaxisSignificado
a = b;Bloqueante: se ejecuta en orden, de inmediato
a <= b;No bloqueante: primero se leen todos los lados derechos y luego se asignan
always @(*) y = a & b;Combinacional: usa el bloqueante =
always @(posedge clk) q <= d;Un flip-flop: usa el no bloqueante <=
Mezclar = y <= en un mismo bloqueEvítalo: es una fuente común de errores

Control de flujo

Condicionales y bifurcaciones de varias vías dentro de los bloques procedurales.

SintaxisSignificado
if (cond) ... else ...Sentencia condicional
if (a) x = 1; else x = 0;If/else de una línea
case (sel) ... endcaseBifurcación de varias vías sobre un valor
2'b00: y = a;Un elemento de case
default: y = 0;Elemento de case de reserva
for (i = 0; i < 8; i = i + 1)Bucle (a menudo dentro de generate o de simulación)
repeat (4) @(posedge clk);Repite una sentencia N veces

Patrones comunes

Componentes básicos que escribes una y otra vez, además de tareas de testbench.

PatrónSintaxis
Flip-flop Dalways @(posedge clk) q <= d;
Registro con resetalways @(posedge clk) if (rst) q <= 0; else q <= d;
Contadoralways @(posedge clk) count <= count + 1;
Registro de estado de FSMalways @(posedge clk) state <= next_state;
Lógica de siguiente estado de FSMalways @(*) case (state) ... endcase
Imprimir un valor$display("q = %b", q);
Imprimir al cambiar$monitor("t=%0t q=%b", $time, q);
Finalizar la simulación$finish;

Cada elemento de la sintaxis de Verilog que necesitas, en una sola página. Esta hoja de trucos de Verilog es una referencia rápida para el lenguaje de descripción de hardware: declarar módulos y puertos, elegir tipos de datos, escribir lógica combinacional y secuencial, y los patrones de bloques always que describen circuitos reales.

La sintaxis aquí es Verilog estándar (IEEE 1364) y funciona en simuladores comunes como Icarus Verilog y Verilator. Copia lo que necesites o pruébalo en vivo en el playground de Verilog: escribe un módulo, simúlalo y ve la salida en tu navegador.

Preguntas frecuentes sobre la hoja de trucos de Verilog

¿Esta hoja de trucos de Verilog es gratis?
Sí. Esta hoja de trucos de Verilog es completamente gratuita, sin necesidad de registrarse. Guárdala en favoritos y vuelve cuando necesites consultar la sintaxis, un operador o un patrón de bloque always.
¿Cuál es la diferencia entre wire y reg?
Un wire modela una conexión física y debe controlarse de forma continua (mediante una sentencia assign o la salida de un módulo), así que lo usas para las redes combinacionales. Un reg mantiene su valor hasta que el código procedural lo cambia, así que lo usas para cualquier cosa que se asigne dentro de un bloque always o initial. A pesar del nombre, un reg no siempre se convierte en un registro de hardware; solo significa que el valor se establece de forma procedural.
¿Cuál es la diferencia entre la asignación bloqueante y la no bloqueante?
La asignación bloqueante (=) se ejecuta de inmediato y en orden, como una sentencia de programación normal, así que úsala para la lógica combinacional en los bloques always @(*). La asignación no bloqueante (<=) evalúa primero todos los lados derechos y luego actualiza los lados izquierdos a la vez, lo cual modela correctamente los flip-flops, así que úsala en los bloques sincronizados always @(posedge clk). Mezclar ambas en un mismo bloque es una fuente clásica de errores de simulación.
¿Puedo practicar Verilog en línea?
Sí. Abre el playground de Verilog para escribir un módulo, simularlo y ver la salida en tu navegador, sin instalar nada. Cuando quieras estructura, el curso interactivo y gratuito de Verilog de Coddy te lleva paso a paso desde los módulos y los tipos de datos hasta los bloques always y las máquinas de estados finitos.
¿Esta hoja de trucos es buena para principiantes?
Sí. Está organizada desde los fundamentos (módulos, puertos y tipos de datos) hasta la lógica secuencial y los patrones de FSM, de modo que puedes empezar con las secciones de arriba e ir avanzando hacia la descripción de circuitos reales.
Coddy programming languages illustration

Aprende Verilog con Coddy

COMENZAR