Programación en Verilog/Testbench
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
editarLa 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
editarPara 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