Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 36

Tema 5:

Simulación con un banco de pruebas


VHDL - test bench.

6.1 Introducción
6.2 Diseño de un test bench
6.3 Ejemplos
6.4 VHDLSimuli
Tema 5:
Simulación con un banco de pruebas
VHDL - test bench.

6.1 Introducción
6.2 Diseño de un test bench
6.3 Ejemplos
6.4 VHDLSimuli
Introducción

‰ Simulación
ƒ Para simular un diseño es necesario generar estímulos
para todas las entradas.
ƒ Algunos programas (Foundation) permiten generar las
entradas de forma interactiva.
ƒ En la mayoría de los casos es necesario escribir una
descripción del entorno conocido como un test bench.

‰ VHDLsimuli
ƒ Disponible en la página de la asignatura.
ƒ Licencia limitada gratis.
Tema 5:
Simulación con un banco de pruebas
VHDL - test bench.

6.1 Introducción
6.2 Diseño de un test bench
6.3 Ejemplos
6.4 VHDLSimuli
Diseño de un test bench

En primer lugar se diseñan los bloques básicos del diseño


Diseño de un test bench

Se conectan los bloques para formar un bloque estructural


- Cables que no salen al exterior: signals
- Cables que salen al exterior: ports
Diseño de un test bench

Se incluye nuestro diseño en un bloque superior sin puertos


(el TestBench)
Diseño de un test bench

Se declara una señal por cada uno de los puertos


Diseño de un test bench

En la architecture del testbench se asignan estímulos a las entradas


Tema 5:
Simulación con un banco de pruebas
VHDL - test bench.

6.1 Introducción
6.2 Diseño de un test bench
6.3 Ejemplos
6.4 VHDLSimuli
Ejemplo

Salida
Enable
Clk ENTITY contador IS
PORT (
salida: out std_logic_vector(7 DOWNTO 0);
Reset clk: in std_logic;
reset: in std_logic;
enable: in std_logic
);
END contador;
Ejemplo
Architecture contador_arch of contador is
signal cuenta, p_cuenta: std_logic_vector(7 downto 0);
begin
salida<=cuenta;
comb:process(cuenta, enable)
Begin
if enable=‘1’ then
p_cuenta<=cuenta+1;
Else
p_cuenta<=cuenta;
end if;
end process;
sinc:process(clk, reset)
begin
if reset=‘1’ then
cuenta <= (others => ‘0’);
esif(clk='1' and clk'event) then
cuenta <= p_cuenta;
end if;
end process;
End contador_arch;
Ejemplo

CONTADOR

salida 8 bits

enable
ENTITY TestBench IS
END TestBench;
reset

clk

TestBench

PASO 1: Definir la entidad TestBench sin añadir ningún puerto


Ejemplo

ARCHITECTURE TestBench_arch OF TestBench IS


CONTADOR
COMPONENT contador

salida 8 bits
PORT (
enable
salida: out std_logic_vector(7 DOWNTO 0);
clk: in std_logic;
reset: in std_logic;
reset enable: in std_logic
clk

);
TestBench
END COMPONENT;

PASO 2: Declarar como componente el circuito para simular


Ejemplo

Valor por defecto (tiempo 0)

CONTADOR

salida_s

salida 8 bits
SIGNAL salida_s : std_logic_vector (7 downto 0);
enable_s SIGNAL clk_s : std_logic:= '0';
enable

SIGNAL enable_s : std_logic;


SIGNAL reset_s: std_logic;
reset_s
reset

clk
BEGIN - - contenido de la arquitectura
clk_s
TestBench

PASO 3: Declarar una señal por cada puerto del componente.


Ejemplo

CONTADOR

salida_s
DUT: contador
salida 8 bits

enable_s
PORT MAP(
enable

salida => salida_s,


clk => clk_s,
reset_s
reset
enable => enable_s,
clk
reset => reset_s);
clk_s
TestBench

PASO 4: Realizar una instancia al componente, conectando sus


puertos a las señales correspondientes
Ejemplo

clk_s <= NOT clk_s AFTER 50 ns;

CONTADOR
estimulos: PROCESS
salida_s
BEGIN
salida 8 bits
reset_s<='1';
enable_s
enable
enable_s<='1';
WAIT FOR 100 ns;
reset_s<='0';
reset_s
reset
WAIT FOR 1000 ns;
clk
enable_s<='0';
clk_s
TestBench WAIT;
END PROCESS;

END TestBench_arch;

PASO 5: Generar los estímulos


Formas de estímulos básicos

‹ Valor
initial
SIGNAL nombre: TIPO := VALOR_INITIAL;

‹ Asignaciones en tiempo
Senal <= val1, val2 after XX, val3 after YY …;

‹ Asignacionesrecurrentes en tiempo
Senal <= OP senal after XX ;
Estímulos en procesos

‹ Se puede utilizar la orden WAIT dentro


de un proceso sin lista sensible
‹ Mientras el proceso esta parado en un
“wait”, las últimas asignaciones toman
efecto.

WAIT for TIEMPO;


WAIT until CONDICION;
WAIT on SEÑAL;
Exemplo de procesos
process
Variable v: integer range 0 to 255;
Begin
a <= ’0’;
v := 1;
wait for 100 ns;
v := v + 1;
a <= ’1’;
wait on c, d;
a <= ’0’;
wait until d = 15 and d’event;
a <= ’1’;
wait on c for 200 ns;
a <= v;
….
End process;
Acceso a ficheros

‹ Las libarías básicas contienen funciones


simples para acceso a ficheros.
– Es posible leer estímulos desde ficheros
– Es posible salvar resultados en ficheros

LIBRARY STD;
USE STD.TEXTIO.ALL
LIBRARY IEEE;
USE IEEE.STD_LOGIC_TEXTIO.ALL
‹ ¡Cambio del sintaxis en 1993!
Acceso a ficheros

‹ Sintaxis original
FILE fin : TEXT IS IN “i.txt”;
FILE fout: TEXT IS OUT “o.txt”;

‹ Sintaxis VHDL’93
FILE fin : TEXT open READ_MODE is “i.txt";
FILE fout : TEXT open WRITE_MODE is “o.txt";
Lectura de ficheros
‹ Solamente se puede leer lineas enteros
Variable linea: LINE;
Readline (fin, linea);
‹ Se puede sacar los campos de la linea uno
por uno:
Read(linea, primer_campo);
Read(linea, segundo_campo);
‹ Campos escritos en decimal o formato
12
34
16#FF# 1
Escritura de ficheros
‹ Solamente se puede escribir líneas enteros
Variable linea: LINE;
writeline (fout, linea);
‹ Se construye la línea campo por campo
write(linea, primer_campo);
write(linea, “ “);
write(linea, segundo_campo);
‹ Campos son escrito en su formato natural
‹ Normalmente existe las funciones HWRITE
para escribir en HEX y BWRITE para escribir
en binario.
Acceso a ficheros -- ejemplo
PROCESS (load)
VARIABLE lineain, lineaout: LINE;
VARIABLE campo1, campo2: integer;
BEGIN
IF (load = ‘1’) THEN
READLINE(fin, lineain);
READ(lineain, campo1);
READ(lineain, campo2);
entrada1 <= campo1;
entrada2 <= campo2;
END IF;
campo1 := conv_integer(senal);
WRITE(lineaout, campo1);
WRITELINE(fout, lineaout);
END PROCESS;
Tema 5:
Simulación con un banco de pruebas
VHDL - test bench.

6.1 Introducción
6.2 Diseño de un test bench
6.3 Ejemplos
6.4 VHDLSimuli
VHDL Simuli
1. Crear un workspace
2. Añadir ficheros
Architecture del testbench
signal t_clk :std_logic := '0';
begin
uut : contador
generic map(ANCHO => 8)
port map (
enable => t_enable,
clk => t_clk,
resetz => t_resetz,
resets => t_resets,
q => t_q);

t_clk <= NOT t_clk after 50 ns;


t_resetz <= '0', '1' after 55 ns;
t_resets <= '0', '1' after 500 ns, '0' after 600 ns;
t_enable <= '1', '0' after 1000 ns, '1' after 1100 ns;

end tbench_1;
3. “Compilar” los fuentes
4. Seleccionar la entidad
5. Arrancar la simulación
6. Añadir señales para visulizar
7. Simular el paso de tiempo…
EJEMPLO

También podría gustarte