¿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):
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:
- Cómo hacer las prácticas de arquitectura desde Linux del profesor Juan González.
- Simulación de Diseños VHDL con Software Libre: La Herramienta GHDL también de Juan González.








