saulvargas.esEl blog de Saúl Vargas

Simulación de diseños VHDL con Software Libre

¿Cuántas veces has maldecido a Xilinx ISE por tardar tanto en cargar, dar unos warnings o errors poco claros o directamente colgarse? Yo muchas. Por eso y por mi preferencia por el Software Libre, cuando empecé las prácticas de Arquitectura e Ingenierí­a de Computadores, decidí­ buscar un reemplazo libre. Y encontré la combinación ghdl + GTKWave.

Básicamente, ghdl es un simulador basado en GCC que crea ejecutables a partir de un diseño. No puede, por tanto, sintetizar componentes en una netlist. GTKWave es un visor de ondas bastante completo que sirve para ver la salida de una simulación hecha con ghdl. Por tanto, estos dos programas te permiten realizar de forma libre, rápida y muy cómoda tus simulaciones en VHDL, pero no te sirven para, por ejemplo, pasar tu diseño a una FPGA.

¿Cómo instalo yo estos programas? En Debian, Ubuntu y demás derivados basta con ejecutar lo siguiente (con permisos de superusuario):

# apt-get install ghdl gtkwave

Para otras Distros consulta tu sistema de paquetes, o bájate directamente las fuentes de las webs oficiales de cada programa (si no sabes instalar programas a mano te recomiendo que leas este tutorial).

Pongamos un ejemplo. Sea inv.vhd el fichero que contiene el siguiente código VHDL:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
 
entity inv is
port
(
    I: in std_logic;
    O: out std_logic
);
end inv;
 
architecture behavioral of inv is
begin
    O <= not I;
end behavioral;

Para comprobar que el código anterior no tiene ningún error sintáctico o semántico, basta con escribir lo siguiente en consola:

$ ghdl -a inv.vhd

Esto te mostrará, de haberlos, los errores en el código. Para probar que este diseño funciona, usaremos el siguiente testbench llamado inv_tb.vhd:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
 
entity inv_tb is
end inv_tb;
 
architecture behavioral of inv_tb is
 
    component inv
    port
    (
        I: in std_logic;
        O: out std_logic
    );
    end component;
 
    signal I: std_logic;
    signal O: std_logic;
 
begin
 
    inv0: inv port map
    (
        I => I,
        O => O
    );
 
    process
    begin
        I <= '0';
        wait for 10 ns;
        assert O = '1' report "Fallo del inversor" severity error;
        I <= '1';
        wait for 10 ns;
        assert O = '0' report "Fallo del inversor" severity error;
        report "Fin de la simulación";
        wait;
    end process;
 
end behavioral;

Para comprobar que este código está bien escrito, usaremos de nuevo la opción -a de ghdl:

$ ghdl -a inv_tb.vhd

Ahora hay que compilar el testbench para poder ejecutarlo y ver qué tal funciona nuestro inversor. Para ello:

$ ghdl -e inv_tb

Ojo que en este caso el argumento es el nombre de la entidad que queremos compilar, no el fichero. Si no aparece ningún error, se generará un ejecutable llamado inv_tb. Podemos ejecutarlo y ver si nuestro trabajo se ha hecho bien:

$ ghdl -r inv_tb

En este caso se obtiene la salida más esperada:

inv_tb.vhd:37:9:@20ns:(report note): Fin de la simulación

Seguramente nos interese también ver un gráfico de ondas correpondiente a la simulación realizada. En este caso hay que añadir la opción –vcd=filename.vcd al último comando, y ejecutar GTKWave:

$ ghdl -r inv_tb --vcd=inv_tb.vcd
$ gtkwave inv_tb.vcd

Añadimos las señales, ajustamos el nivel de zoom, y voilá (pulsa para ampliar):gtkwave

No quiero alargarme explicando otras opciones de ghdl, GTKWave, por qué esto va así­ o asá, etc. Si quieres ampliar información, puedes consultar las respectivas webs de cada programa, además de un par de recomendaciones:

Comments are closed.