¿Qué es un testbench?
Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 73 de 90.
Un testbench es un módulo especial de Verilog que se utiliza para probar otro módulo. Proporciona entradas a tu diseño y comprueba si las salidas son correctas.
¿Por qué necesitamos un banco de pruebas?
Cuando construyes un módulo, debes asegurarte de que funcione correctamente. Un banco de pruebas te permite:
- Aplicar diferentes valores de entrada a tu módulo
- Observar las salidas
- Comprueba si las salidas coinciden con lo que esperas
- Hazlo automáticamente sin realizar pruebas manuales
Banco de pruebas frente a módulo de diseño
| Módulo de diseño | Banco de pruebas | |
|---|---|---|
| Propósito | Implementa hardware | Prueba el módulo de diseño |
| ¿Tiene puertos? | Sí (entradas y salidas) | No (autocontenido) |
| ¿Sintetizable? | Sí | No (solo simulación) |
Ejemplo sencillo de banco de pruebas
module testbench; // ¡Sin puertos!
// Las entradas y salidas provienen del módulo que estamos probando (el DUT).
reg a, b; // reg para entradas
wire c; // wire para salida
// Esto es la instanciación de un módulo — crea una copia del módulo and_gate y la nombra dut
and_gate dut ( // Instanciar DUT
.a(a),
.b(b),
.c(c)
);
// Este es un bloque initial que aplica valores de prueba a las entradas del módulo que se está probando.
initial begin // Aplicar valores de prueba
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
end
endmodulePuntos clave
- El banco de pruebas no tiene puertos
regse utiliza para las señales que cambian (entradas a DUT)wirese utiliza para las señales provenientes de DUT (salidas)
- El módulo que se está probando se llama DUT (diseño bajo prueba)
$finishfinaliza la simulación
En las siguientes lecciones abordaremos la creación de estímulos, la visualización de resultados y otras características del banco de pruebas.
Desafío
Se te proporciona un módulo de compuerta AND. Tu tarea es añadir las partes que faltan a su banco de pruebas.
Qué hacer:
Añade las siguientes partes al banco de pruebas:
- Declara
regpara las entradasayb - Declara
wirepara la salidac - Instancia
and_gatecon el nombreduty conecta los puertos
Pruébalo tú mismo
module and_gate (
input a,
input b,
output c
);
assign c = a & b;
endmodule
module testbench;
// Tarea 1: Declara reg para las entradas a y b
// Tarea 2: Declara wire para la salida c
// Tarea 3: Instancia and_gate con el nombre dut
// Conecta .a(a), .b(b), .c(c)
initial begin
a = 0; b = 0; #10 $display("%d & %d = %d", a, b, c);
a = 0; b = 1; #10 $display("%d & %d = %d", a, b, c);
a = 1; b = 0; #10 $display("%d & %d = %d", a, b, c);
a = 1; b = 1; #10 $display("%d & %d = %d", a, b, c);
$finish;
end
endmoduleEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1Introducción
Qué es VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operadores, parte 1
Operadores aritméticosOperador móduloOperadores de comparaciónRepaso: matemáticas simplesOperadores bit a bit7Asignaciones y compuertas
Asignación continuaAsignación con operadoresPrimitivas de compuertas integradasCompuertas AND, OR y NOTCompuertas XOR y XNORRepaso: circuito de compuertas lógicas10Toma de decisiones
Sentencia IfIf - ElseRepaso - Comparador simpleSentencia CaseCasex y CasezRepaso - Diseño de ALU5Operadores, parte 2
Operadores lógicosOperadores de reducciónOperadores de desplazamientoOperador de concatenaciónOperador condicionalRepaso: desafío de operadores11Bucles
Bucle ForBucle WhileBucle de repeticiónBucle infinitoInstrucción DisableRepaso: patrones de bucles14Fundamentos de los testbench
¿Qué es un testbench?Creación de estímulosVisualización y monitorizaciónDumpfile y DumpvarsUso de tareas del sistemaRepaso: testbench completo3Sistema numérico
Representación binariaNúmeros con tamañoNúmeros sin tamañoNúmeros negativosValores especiales X y ZRepaso: formatos numéricos6Módulos
Estructura de módulosPuertos de entrada y salidaPuertos inoutInstanciación de módulosAsignación de puertos por nombreAsignación de puertos por ordenRepaso: construir un móduloPractica por tu cuenta: Compilador de Verilog online