What Is A 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 utilizado 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 testing manual
testbench frente a módulo de diseño
| Módulo de diseño | testbench | |
|---|---|---|
| Propósito | Implementa hardware | Prueba el módulo de diseño |
| ¿Tiene ports? | Sí (inputs y outputs) | No (autocontenido) |
| ¿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 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
- testbench tiene no ports
regse usa para signals que change (inputs a DUT)wirese usa para signals de DUT (outputs)
- El module que se está tested se llama DUT (Diseño bajo prueba)
$finishfinaliza la simulation
Cubriremos la creación de estímulos, la visualización de resultados y otras funcionalidades de testbench en las siguientes lecciones.
Desafío
Se te proporciona un módulo de puerta AND. Tu tarea es añadir las partes que faltan a su testbench.
Qué hacer:
Añade 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 VerilogHardware frente a softwareTu primer móduloComentariosNiveles de abstracción del diseño4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge14Testbench Basics
What Is A TestbenchCreating StimulusDisplay And MonitorDumpfile And DumpvarsUsing System TasksRecap - Full Testbench3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine LogicPractica por tu cuenta: Compilador de Verilog online