Creación de estímulos
Parte de la sección Fundamentos del Journey de Verilog de Coddy. Lección 74 de 90.
Estímulo se refiere a los valores de entrada que aplicas a tu diseño para comprobar si funciona correctamente. Al cambiar las entradas y observar las salidas, puedes verificar que tu diseño se comporta como esperas.
Piensa en ello como probar una máquina: presionas diferentes botones (estímulo) y observas lo que sucede (salidas). Crear un buen estímulo es una parte esencial de escribir un banco de pruebas.
Por ejemplo, observa el estímulo en el siguiente banco de pruebas:
module testbench;
reg a, b;
wire c;
and_gate dut (
.a(a),
.b(b),
.c(c)
);
initial begin
// EL ESTÍMULO COMIENZA AQUÍ
// Caso de prueba 1: Ambas entradas son 0
a = 0; b = 0; #10;
// Caso de prueba 2: a=0, b=1
a = 0; b = 1; #10;
// Caso de prueba 3: a=1, b=0
a = 1; b = 0; #10;
// Caso de prueba 4: Ambas entradas son 1
a = 1; b = 1; #10;
// EL ESTÍMULO TERMINA AQUÍ
$finish;
end
endmoduleCada estímulo se aplica, después esperamos 10 unidades de tiempo (#10) antes del siguiente estímulo. Esto le da tiempo al DUT para producir una salida.
Métodos para crear estímulos
| Método | Ideal para | Ejemplo |
|---|---|---|
| Asignaciones secuenciales | Pruebas simples | a = 0; b = 0; #10; |
| Bucle for | Probar todas las combinaciones | for (i = 0; i < 4; i++) |
| Bucle repeat | Repetir patrones | repeat (10) #5 clk = ~clk; |
| Bucle forever | Señales continuas | forever #5 clk = ~clk; |
Método 1: Asignaciones secuenciales
La forma más sencilla de crear estímulos. Asignas valores uno por uno con retrasos.
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
endMétodo 2: Bucle for
Útil cuando quieres probar todas las combinaciones de entrada posibles.
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i;
#10;
end
$finish;
endEsto prueba: 00, 01, 10, 11.
Método 3: Bucle de repetición
Útil para repetir el mismo estímulo muchas veces.
initial begin
a = 0; b = 1;
repeat (10) begin
#10 a = ~a;
end
$finish;
endMétodo 4: Bucle infinito
Útil para señales continuas, como los relojes.
initial begin
clk = 0;
forever #5 clk = ~clk;
endReglas importantes
| Regla | Explicación |
|---|---|
| Usa retrasos entre las asignaciones de estímulos | #10 permite que el DUT responda |
Usa reg para las señales de estímulo | Porque cambian con el tiempo |
Añade $finish al final | Para detener la simulación |
Desafío
Se te proporciona un módulo de puerta OR. Tu tarea es añadir el estímulo que falta y las instrucciones $display para imprimir los resultados.
Qué hacer:
Añade estímulos para probar las cuatro combinaciones de entrada (00, 01, 10, 11):
- En cada línea, establece los valores de
xyy - Añade
#10para indicar un retraso - Añade
$displaypara imprimir el resultado
La instrucción <strong>$display</strong> debería verse así:
$display("%d %d | %d", x, y, z);Pruébalo tú mismo
module or_gate (
input x,
input y,
output z
);
assign z = x | y;
endmodule
module testbench;
reg x, y;
wire z;
or_gate dut (
.x(x),
.y(y),
.z(z)
);
initial begin
$display("x y | z");
$display("---------");
// TODO: Añade estímulo y visualización para 0 0
// TODO: Añade estímulo y visualización para 0 1
// TODO: Añade estímulo y visualización para 1 0
// TODO: Añade estímulo y visualización para 1 1
$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