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 probar si funciona correctamente. Al cambiar las entradas y observar las salidas, puedes verificar que tu diseño se comporte como se espera.
Piénselo como si estuviera probando una máquina: presiona diferentes botones (estímulos) y observa qué sucede (salidas). Crear buenos estímulos es una parte esencial de la escritura de un banco de pruebas (testbench).
Por ejemplo, observe 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 es aplicado, luego esperamos 10 unidades de tiempo (#10) antes del siguiente estímulo. Esto le da al DUT tiempo 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 | Patrones repetitivos | 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. Se asignan valores uno por uno con retardos.
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 Repeat
Ú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 Forever
Útil para señales continuas como relojes.
initial begin
clk = 0;
forever #5 clk = ~clk;
endReglas importantes
| Regla | Explicación |
|---|---|
| Use retardos entre las asignaciones de estímulos | #10 permite tiempo para que el DUT responda |
Use reg para señales de estímulo | Porque cambian con el tiempo |
Agregue $finish al final | Para detener la simulación |
Desafío
Se te proporciona un módulo de compuerta OR. Tu tarea es agregar el estímulo faltante y las sentencias $display para imprimir los resultados.
Qué hacer:
Agrega estímulos para probar las cuatro combinaciones de entrada (00, 01, 10, 11):
- En cada línea, establece los valores para
xey - Agrega
#10para un retraso - Agrega
$displaypara imprimir el resultado
El <strong>$display</strong> debe verse así:
$display("%d %d | %d", x, y, z);Hoja de referencia
El Estímulo (Stimulus) son los valores de entrada aplicados a un DUT en un banco de pruebas (testbench) para verificar el comportamiento correcto.
Métodos para Crear Estímulos
Asignaciones secuenciales – el enfoque más simple:
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
$finish;
endBucle For – probar todas las combinaciones de entrada:
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i; #10;
end
$finish;
endBucle Repeat – repetir el estímulo N veces:
repeat (10) begin
#10 a = ~a;
endBucle Forever – señales continuas como relojes:
initial begin
clk = 0;
forever #5 clk = ~clk;
endReglas Clave
- Use
regpara las señales de estímulo (cambian con el tiempo) - Agregue retardos (por ejemplo,
#10) entre las asignaciones para permitir que el DUT responda - Finalice la simulación con
$finish
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ñadir estímulo y visualización para 0 0
// TODO: Añadir estímulo y visualización para 0 1
// TODO: Añadir estímulo y visualización para 1 0
// TODO: Añadir 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 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