Menu
Coddy logo textTech

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
endmodule

Cada 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étodoIdeal paraEjemplo
Asignaciones secuencialesPruebas simplesa = 0; b = 0; #10;
Bucle ForProbar todas las combinacionesfor (i = 0; i < 4; i++)
Bucle RepeatPatrones repetitivosrepeat (10) #5 clk = ~clk;
Bucle ForeverSeñales continuasforever #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;
end

Mé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;
end

Esto 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;
end

Método 4: Bucle Forever

Útil para señales continuas como relojes.

initial begin
  clk = 0;
  forever #5 clk = ~clk;
end

Reglas importantes

ReglaExplicación
Use retardos entre las asignaciones de estímulos#10 permite tiempo para que el DUT responda
Use reg para señales de estímuloPorque cambian con el tiempo
Agregue $finish al finalPara detener la simulación
challenge icon

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):

  1. En cada línea, establece los valores para x e y
  2. Agrega #10 para un retraso
  3. Agrega $display para 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;
end

Bucle 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;
end

Bucle Repeat – repetir el estímulo N veces:

repeat (10) begin
  #10 a = ~a;
end

Bucle Forever – señales continuas como relojes:

initial begin
  clk = 0;
  forever #5 clk = ~clk;
end

Reglas Clave

  • Use reg para 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
endmodule
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos