¿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 de Verilog especial 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 Testbench?
Cuando construyes un módulo, necesitas asegurarte de que funcione correctamente. Un testbench te permite:
- Aplicar diferentes valores de entrada a tu módulo
- Observar las salidas
- Compruebe si las salidas coinciden con lo que espera
- Haga esto automáticamente sin pruebas manuales
Testbench vs Design Module
| Design Module | Testbench | |
|---|---|---|
| Propósito | Implementa el hardware | Prueba el design module |
| ¿Tiene puertos? | Sí (inputs y outputs) | No (autónomo) |
| ¿Sintetizable? | Sí | No (solo simulation) |
Ejemplo simple de testbench
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 del módulo — crea una copia del módulo and_gate y lo 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 testbench no tiene puertos
regse utiliza para señales que cambian (entradas al DUT)wirese utiliza para señales provenientes del DUT (salidas)
- El módulo que se está probando se llama DUT (Design Under Test)
$finishfinaliza la simulación
Cubriremos la creación de estímulos, la visualización de resultados y otras características de testbench en las siguientes lecciones.
Desafío
Se te proporciona un módulo de puerta AND. Tu tarea es agregar las partes que faltan a su testbench.
Qué hacer:
Agrega las siguientes partes al testbench:
- 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 Verilog?Hardware vs SoftwareNiveles de abstracción de diseñoTu primer móduloComentarios4Operadores Parte 1
Operadores aritméticosOperador de móduloOperadores de comparaciónRepaso - Matemáticas simplesOperadores bit a bit7Asignación y Compuertas
Asignación ContinuaAsignación con OperadoresPrimitivas de Compuertas IntegradasCompuertas AND OR NOTCompuertas XOR XNORResumen - 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 condicionalResumen - Desafío de operadores14Fundamentos de Testbench
¿Qué es un Testbench?Creación de estímulosDisplay y MonitorDumpfile y DumpvarsUso de tareas del sistemaResumen: Testbench completo3Sistema de numeración
Representación binariaNúmeros con tamaño definidoNúmeros sin tamaño definidoNúmeros negativosValores especiales X y ZResumen - Formatos de números6Módulos
Estructura del móduloPuertos de entrada y salidaPuertos InoutInstanciación de módulosMapeo de puertos por nombreMapeo de puertos por ordenResumen: Construye un módulo