Programación en Verilog/Testbench

← Directivas para el compilador Testbench Ejemplos →




La finalidad de un testbench no es otro que verificar el correcto funcionamiento de un módulo o diseño. El desarrollo de un testbench es tan complejo como la realización de un módulo a verificar. La ventaja de estos elementos es la posibilidad de no tener que ser sintetizable.

Para describir un testbench el diseñador debe tener siempre presente las especificaciones de diseño, en la que quedan reflejadas las funciones del diseño y, por tanto, las funciones a verificar.

Estructura

editar

La estructura de un testbench se compone de tres elementos básicos.

  • Módulo DUT: (Desing Under Test) Diseño a verificar.
  • Módulo test: Este módulo es el encargado de activar las señales de entrada al módulo DUT y de analizar las salidas que produce éste.
  • Módulo tb: Este módulo incluye los anteriores. Se caracteriza por no tener ni entradas ni salidas, es decir corresponde a una declaración estructural del conexionado de los módulos.

Generación de estímulos

editar

Para la generación de estímulos se utilizan los procesos initial y always. La elección de éstos viene determinada por las características de las señales a generar. Dependiendo de la naturaleza de la señal, éstas se pueden generar de forma síncrona o asíncrona. La generación asíncrona se basa en el uso de retardos para activar y desactivar señales, mientras que la generación síncrona se basa en el uso de eventos, disparados por flancos para activar y desactivar señales. En este caso todas las señales que se activen de forma síncrona se harán con un retardo.


Señal reset asíncrona

editar
  initial
  begin
    rst = 1'b0;
    #35
    rst = 1'b1;
    #50
    rst = 1'b0;
  end


Señal reset síncrona

editar
  initial
  begin
    rst = 1'b0;
    repeat(2)
      @(posedge clk) #1;
    rst = 1'b1;
    @(posedge clk) #1;
    rst = 1'b0;
  end



-- Salidas

signal mayor : std_logic;
signal menor : std_logic;
signal igual : std_logic;

BEGIN

-- Instancia la Unidad Bajo Prueba (Unit Under Test)
uut: comp4b PORT MAP (
A => A,
B => B,
mayor => mayor,
menor => menor,
igual => igual
);
-- Proceso para los estímulos
stim_proc: process
begin
-- Estado inicial, por 100 ns

A <= "0000"; B <= "0000";

wait for 100 ns;
for i in 0 to 15 loop
A <= A + 1; -- Estímulos para los datos de entrada
B <= B - 1;
wait for 100ns;
end loop;
wait; -- Se mantiene inactivo
end process;

END;

Señales de control o datos

editar
  initial
  begin
    en = 1'b0;
    din = 8'b0;

    // Se espera 30 ciclos
    repeat(30)
      @(posedge clk) #1;

    // Se activan las entradas
    en  = 1'b1;
    din = 8'b10101010;

    // Se desactiva la entrada de datos
    @(posedge clk) #1;
    din = 8'b0;
    
    // Se espera a la señal ready del DUT
    wait (ready == 1'b1);
    en = 1'b0; // Se desactiva el enable

    // Se comprueba el resultado
    if (dout == 8'b01010101)
      $display("Test OK");
    else
      $display("Test FAIL");

    // Se finaliza el test
    @(posedge clk) #1;
    $finish;
  end



← Directivas para el compilador Testbench Ejemplos →