# Instalação/compilação do GHDL em UBUNTU e MINT (e talvez Debian) # ATENÇÃO: há diferenças entre as versões; leia as instruções um ou dois # passos adiante ANTES de efetuar os comandos. # # os comentários estão marcadas por "#" (podem ser de mais de uma linha) # # ATENÇÃO: os comandos estão "diretos" no texto para que possam # ser copiados com o mouse: # i) três clicks com o botão esquerdo copia a linha inteira (fica em vídeo reverso) # ii) um click com o botão do meio cola no propmt (na tela do terminal) # eu uso aptitude, use o que você costuma usar: apt-get ou outro # # (0) pode facilitar a instalação se você iniciar por apt-get install aptitude # (0.5) refresque a base de dados aptitude update # (1) instale as ferramentas para compilação; se já estão instalados, continue # se o aptitude pedir bibliotecas e programas adicionais, aceite e instale aptitude install wget make flex bison unzip gzip tar sed grep gawk findutils # (2) instale os compiladores; se já estão instalados, continue aptitude install libz-dev gnat gcc g++ gtkwave # (3) SE o seu sistema é UBUNTU então diga (veja (3.2) se é MINT) aptitude install clang-6.0 llvm-8 # (3.1) SE o aptitude reclamar que existem outras versões mais jovens # (números maiores) troque-as. No comando abaixo x e y são as # versões indesejadas, tipicamente a versão 10 no llvm e # 8 ou 10 no clang. Remova estas versões e instale as # indicadas aptitude purge clang-x.0 llvm-y aptitude install clang-6.0 llvm-8 # (3.2) SE o seu sistema é MINT então instale o clang-8.0 (oito) ao invés # do clang-6.0. aptitude install clang-8.0 llvm-8 # (4) veja qual a versão de gcc foi instalada: diga gcc --version # (5) e lembre do primeiro número de versão (mais à esquerda). # No meu caso é a versão 7, então diga aptitude install libgcc-7-dev # (6) crie o diretório para instalação sudo mkdir /opt/ghdl # (7) mude a posse do novo diretório para o seu usuário mortal, # porque não é uma boa ideia fazer a compilação como root sudo chown $USER.$GROUP /opt/ghdl # (8) vá para o diretório de compilação cd /opt/ghdl # (9) baixe o código fonte. DEVE ser a versão v0.37 wget https://github.com/ghdl/ghdl/archive/v0.37.tar.gz # (10) descompacte com tar e vá para o diretório do ghdl tar xzvf ./v0.37.tar.gz cd ghdl-0.37 # (11) crie o diretório para a compilação mkdir build cd build # (12) configure em preparaçãp para compilar (o comando está em 2 linhas) ../configure --with-llvm-config=/usr/bin/llvm-config \ --prefix=/usr/local --disable-synth # (12.5) SE o configure reclamar do llvm-config, diga, ao invés ../configure --with-llvm-config=/usr/lib/llvm-8/bin/llvm-config \ --prefix=/usr/local --disable-synth # (13) SE o configure executar, prossiga; # (13.1) e então é só dizer make # (13.2) SE o make reclamar que não encontra clang, porque # o pacote do clang está (aparentente) quebrado; o conserto # envolve a criação de dois links: sudo ln -s /usr/bin/clang++-6.0 /usr/bin/clang++ sudo ln -s /usr/bin/clang-6.0 /usr/bin/clang # (13.3) se o make quebrar e aparecer a seguinte msgm de erro # ../src/ortho/llvm4-nodebug/llvm-cbindings.cpp:18:10: fatal error: 'llvm-c/Target.h' file not found # #include "llvm-c/Target.h" # # então é necessário des-instalar o llvm (expurgue a versão que você instalou) aptitude purge llvm-8 # e instalar a versão de desenvolvimento aptitude install llvm-dev # e voltar para o passo (12). Esse caso foi num "Linux Mint 19.3 Tricia" # (13.9) SE ALGO DER ERRADO, mande as mensagens de erro para o professor # (14) a compilação demora muitos segundos, # podem aparecer alguns warnings, # e depois de aparecer MUITA saída na tela, termina com algo como # # ---------------------------------------------------------------------- x86_64-linux-gnu-gnatlink-7 /opt/ghdl/ghdl-master/build/pic/libghdl.ali -shared-libgcc -o libghdl-1_0_dev.so -g -fPIC -g -shared -Wl,-soname,libghdl-1_0_dev.so pic/grt-cstdio.o sed -e '1,/-- BEGIN/d' -e '/-- END/,$d' -e 's/^ -- //' < b~libghdl.adb > libghdl.bind rm -f -f libghdl.a ar rc libghdl.a b~libghdl.o pic/grt-cstdio.o `sed -e /^-/d < libghdl.bind` grep adalib libghdl.bind | sed -e 's/^-L//' -e 's@adalib/@adalib/libgnat.a@' > libghdl.link # ------------------------------------------------------------------------ # o que sinaliza o fim da compilação # (15) e então instale sudo make install # (16) aparece mais um monte de saída, que termina com # ----------------------------------------------------------------------- install -m 644 -p libghdl.link /usr/local/lib/ install -m 644 -p ../src/synth/ghdlsynth.h /usr/local/include/ install -m 644 -p ../src/synth/ghdlsynth_gates.h /usr/local/include/ /usr/local/bin/ghdl --disp-standard --std=87 > /usr/local/lib/ghdl/src/std/v87/standard.vhdl /usr/local/bin/ghdl --disp-standard --std=93 > /usr/local/lib/ghdl/src/std/v93/standard.vhdl /usr/local/bin/ghdl --disp-standard --std=08 > /usr/local/lib/ghdl/src/std/v08/standard.vhdl # ----------------------------------------------------------------------- # (17) para testar o compilador GHDL diga ghdl --version # (18) deve aparecer na tela algo como (as versões podem ser diferentes) # ---------------------------------------------------------------------------- GHDL 0.37-dev (tarball) [Dunoon edition] Compiled with GNAT Version: 7.5.0 llvm code generator Written by Tristan Gingold. Copyright (C) 2003 - 2021 Tristan Gingold. GHDL is free software, covered by the GNU General Public License. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # ---------------------------------------------------------------------------- # o que completa a instalação # (19) para fazer uma limpeza, diga make clean # (20) se você quiser liberar bastante espaço, diga rm -rf /opt/ghdl/ghdl-0.37 # (21) se você não quiser mais usar o aptitude, diga apt-get purge aptitude # (22) agora vem o teste de fogo: compile e execute o programa de testes # o programa de testes soma alguns números de 32 bits e mostra os # operandos e o resultado. O arquivo com o código fonte é tb_teste.vhd. # Para compilar e executar diga wget http://www.inf.ufpr.br/roberto/ci210/tb_teste.vhd ghdl -a tb_teste.vhd && ghdl --elab-run tb_teste # (23) o executável chama-se tb_teste e pode ser executado diretamente ./tb_teste # a saída correta é ghdl --elab-run tb_teste tb_teste.vhd:201:7:@0ms:(assertion note): A=00000000 B=00000000 s=00000000 tb_teste.vhd:201:7:@2ns:(assertion note): A=00000000 B=00000000 s=00000000 tb_teste.vhd:201:7:@4ns:(assertion note): A=00000001 B=00000001 s=00000002 tb_teste.vhd:201:7:@6ns:(assertion note): A=00000fff B=00000001 s=00001000 tb_teste.vhd:201:7:@8ns:(assertion note): A=00001111 B=00001111 s=00002222 tb_teste.vhd:201:7:@10ns:(assertion note): A=00002222 B=00002222 s=00004444 tb_teste.vhd:201:7:@12ns:(assertion note): A=00004444 B=00004444 s=00008888 tb_teste.vhd:201:7:@14ns:(assertion note): A=00000000 B=00000000 s=00000000 tb_teste.vhd:201:7:@16ns:(assertion note): A=00000000 B=00000000 s=00000000 # (24) para ver a saída "limpa" diga ./tb_teste | egrep -v assertion A=00000000 B=00000000 s=00000000 A=00000000 B=00000000 s=00000000 A=00000001 B=00000001 s=00000002 A=00000fff B=00000001 s=00001000 A=00001111 B=00001111 s=00002222 A=00002222 B=00002222 s=00004444 A=00004444 B=00004444 s=00008888 A=00000000 B=00000000 s=00000000 A=00000000 B=00000000 s=00000000Agradeço a Eduardo Gobbo, Eduardo Todt, Gustavo do Prado Silva, Luís Risch, Pedro Churata e Rubens Z Laszlo pela ajuda com as tentativas e correção das instruções.