OS-VVM VHDL project simulations with GHDL 4.1 GCC Backend

Instructions on installing GHDL 4.1 from source on Ubuntu 22.04.4 LTS and simulating an example OS-VVM test-bench to verify a VHDL RTL project.

by Timothy Stotts

Understanding GHDL 4.1 installation options

When installing GHDL from source code, there are 3 backends to choose from:

  • mcode: recommended by the GHDL author to save compilation time on small projects
  • GCC: requires download of the sources of the GNU Compiler Collection
  • LLVM: requires a simple install of LLVM, CLang, GNAT, and a newer C++ library includes

With this example, the GHDL 4.1 program will be compiled with the GCC backend. The Xilinx Vivado 2021.2 UNISIM and UNIMACRO libraries will be compiled with GHDL. And then, an example VHDL project plus OS-VVM libraries will be compiled and simulated.

Note that the mcode backend is not used in this example.

Note also that the GHDL maintainer has chosen to deprecate the GCC backend. It is possible that engineers still favor the GCC backend for the purpose of analyzing code coverage of their VHDL designs. As such, this post was still written.

The workstation this example was performed on

For this example, it is helpful to use an Ubuntu Linux Workstation that is sufficiently fast for single-thread execution. Here’s the system I ran this example on.

$ neofetch 
           `.:/ossyyyysso/:.               timothystotts@d1study 
        .:oyyyyyyyyyyyyyyyyyyo:`           --------------------- 
      -oyyyyyyyodMMyyyyyyyysyyyyo-         OS: Kubuntu 22.04.4 LTS x86_64 
    -syyyyyyyyyydMMyoyyyydmMMyyyyys-       Host: Dev One Notebook PC 
   oyyysdMysyyyydMMMMMMMMMMMMMyyyyyyyo     Kernel: 6.5.0-27-generic 
 `oyyyydMMMMysyysoooooodMMMMyyyyyyyyyo`    Uptime: 51 mins 
 oyyyyyydMMMMyyyyyyyyyyyysdMMysssssyyyo    Packages: 2820 (dpkg), 20 (snap) 
-yyyyyyyydMysyyyyyyyyyyyyyysdMMMMMysyyy-   Shell: bash 5.1.16 
oyyyysoodMyyyyyyyyyyyyyyyyyyydMMMMysyyyo   Resolution: 1920x1080 
yyysdMMMMMyyyyyyyyyyyyyyyyyyysosyyyyyyyy   DE: Plasma 5.24.7 
yyysdMMMMMyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy   WM: kwin 
oyyyyysosdyyyyyyyyyyyyyyyyyyydMMMMysyyyo   Theme: [Plasma], Breeze [GTK2/3] 
-yyyyyyyydMysyyyyyyyyyyyyyysdMMMMMysyyy-   Icons: [Plasma], breeze [GTK2/3] 
 oyyyyyydMMMysyyyyyyyyyyysdMMyoyyyoyyyo    Terminal: konsole 
 `oyyyydMMMysyyyoooooodMMMMyoyyyyyyyyo     CPU: AMD Ryzen 7 PRO 5850U with Radeon Graphics (16) @ 4.507GHz 
   oyyysyyoyyyysdMMMMMMMMMMMyyyyyyyyo      GPU: AMD ATI 03:00.0 Cezanne 
    -syyyyyyyyydMMMysyyydMMMysyyyys-       Memory: 19512MiB / 63613MiB 
      -oyyyyyyydMMyyyyyyysosyyyyo-
        ./oyyyyyyyyyyyyyyyyyyo/.                                   
           `.:/oosyyyysso/:.`                                      

Note that this budget HP Linux workstation is capable of executing a program at over 4.0 GHz CPU core speed, and it has a decent amount of L2 and L3 cache. That is helpful for quicker execution of the test-bench simulation. Also note that the workstation is running an Ubuntu 22.04 install which was later switched to the full Kubuntu 22.04 install without removing the original Ubuntu 22.04. That might make a difference in the default installed libraries already on the system.

Compiling GHDL 4.1 with the GCC backend

It was decided to create an Ubuntu 22.04.4 Virtual Machine with a default installation for the purpose of identifying a complete list of tool, library, and headers dependencies. The below list was used for the VMware Virtual Machine with default Ubuntu 22.04.4.

Installing prerequisite system tools and libraries

Compiling GHDL 4.1 with the GCC backend requires the following non-default tools and libraries to be installed on Ubuntu 22.04.

  1. GCC GNAT - the GNU ADA language compiler
  2. GCC C Compiler - the GNU C Compiler
  3. GCC C++ Compiler - the GNU C++ Compiler
  4. Std C++ 12 headers - a set of C++ headers that are newer than the default version 11
  5. Headers for ZLib - compilation headers for the zlib1g ZLib library.
  6. Headers for GMP - compilation headers for the GPM library.
  7. Headers for MPC - compilation headers for the MPC library.
  8. Headers for MPFR - compilation headers for the MPFR library.
  9. TexInfo - documentation system for on-line information and printed output.
  10. GIT and GITK - command-line and graphical SCM if you wish to clone the GHDL head instead of downloading the release TAR archive, or if you wish to clone the example OS-VVM project below.

Here is how to install the default version of these with documentation easily on Ubuntu 22.04:

~$ sudo apt install gcc g++ make gnat libstdc++-12-dev \
zlib1g-dev libgmp-dev libmpc-dev libmpfr-dev texinfo
~$ sudo apt install git gitk
~$ sudo apt install gcc-doc gnat-doc bash-doc make-doc \
libstdc++-12-doc

Note that the -doc packages are optional, but could prove useful for reading manual pages offline should the user have any questions regarding these tools, now, or in the future.

Download GHDL 4.1 from GitHub

GHDL can be downloaded as pre-compiled binaries or as source code. With this example, we will be installing from source.

Navigate with a web browser to the GHDL release page: GDHL Releases

Download from the source code link the file at tag v4.1.0.tar.gz . GHDL 4.1.0 source

Navigate with a web browser to the GCC 12.3.0 release folder: GCC 12.3.0 Release

Download from the list of files gcc-12.3.0.tar.gz . GCC 12.3.0 source

Extract this program’s source code to a temporary folder:

~$ mkdir ~/tmp-ghdl-gcc-4.1.0/
~$ cd ~/tmp-ghdl-gcc-4.1.0/
~/tmp-ghdl-gcc-4.1.0
$ tar -x -z -f ~/Downloads/ghdl-4.1.0.tar.gz
$ tar -x -z -f ~/Downloads/gcc-12.3.0.tar.gz

Compile and Install GHDL 4.1 with the GCC 12 backend

To compile and install GHDL with GCC backend, it is recommended to install to the prefix /opt/ghdl-gcc-4.1.0 instead of /usr/ to prevent conflict with GCC apt packages. This also keeps the GHDL bare-bones GCC out of the system path and only for use when running GHDL.

Also, an optional first step. Set CFLAGS and CXXFLAGS to indicate to GCC to compile with optimizations specific to your computer’s hardware. The Gentoo Linux Wiki keeps a page with recommend compilation options for a wide range of hardware: Safe CFLAGS.

These compiler flags were chosen for the AMD Ryzen 7 PRO hardware mentioned above.

$ export CFLAGS="-O2 -march=znver3 -mshstk --param=l1-cache-line-size=64 --param=l1-cache-size=32 --param=l2-cache-size=512"
$ export CXXFLAGS="-O2 -march=znver3 -mshstk --param=l1-cache-line-size=64 --param=l1-cache-size=32 --param=l2-cache-size=512"

After this, in the same shell prompt, compile GHDL with the GCC backend.

~/tmp-ghdl-gcc-4.1.0$ cd ./ghdl-4.1.0
$ mkdir build
$ cd build
$ ../configure --with-gcc=$HOME/tmp-ghdl-gcc-4.1.0/gcc-12.3.0 \
--prefix=/opt/ghdl-gcc-4.1.0
$ make copy-sources
$ mkdir gcc-objs
$ cd gcc-objs
$ $HOME/tmp-ghdl-gcc-4.1.0/gcc-12.3.0/configure \
--prefix=/opt/ghdl-gcc-4.1.0 \
--enable-languages=c,vhdl \
--disable-bootstrap --disable-lto --disable-multilib --disable-libssp \
--disable-libgomp --disable-libquadmath \
--enable-default-pie
$ make -j4
$ sudo make install
$ cd ../
$ make ghdllib
$ sudo make install
$ cd $HOME/

To run the new GHDL 4.1.0 with GCC backend:

$ cd $HOME/
$ export PATH="/opt/ghdl-gcc-4.1.0/bin:$PATH"
$ which ghdl
/opt/ghdl-gcc-4.1.0/bin/ghdl
$ ghdl --version
GHDL 4.1.0 (tarball) [Dunoon edition]
 Compiled with GNAT Version: 10.5.0
 GCC 12.3.0 code generator
Written by Tristan Gingold.

Copyright (C) 2003 - 2024 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.

Downloading an example OS-VVM-based VHDL project and simulating

This author has previously created a GitHub project called fpga-serial-acl-tester-3. (This project was updated last year to again execute with GHDL 3.0 and newer, same as worked before adding Arty S7-25 board support. The changes were only entity and file names. The simulation runs with Arty A7-100 as the target; but it would be possible to enhance the test-bench to target either board.)

FPGA Serial ACL Tester Version 3 project and source code

To clone this project with GIT with your GitHub account into a local workarea on an Ubuntu workstation, and begin setup of the example, do this:

~$ git clone --recursive \
git@github.com:timothystotts/fpga-serial-acl-tester-3.git \
fpga-serial-acl-tester-3-ghd41
~$ cd ./fpga-serial-acl-tester-3-ghd41/ACL-Tester-Design-VHDL/Work_Dir_GHDL/

Note that the OS-VVM check-out is release 2021.02, as this is the OS-VVM version that was cloned at the time of the last commit of this project. (OS-VVM 2021.02 is compatible with GHDL 3.0.0 with GCC backend.) Using a 2024 release of OS-VVM with GHDL 4.1.0 was not yet tested.

Also note that it is necessary to compile the Xilinx UNISIM and UNIMACRO sources as they are used in the VHDL RTL source. This assumes that Xilinx Vivado 2021.2 application is installed on the Linux workstation under path /opt/Xilinx/Vivado/2021.2 . If this is the case, here’s how to automatically compile and setup the UNISIM and UNIMACRO sources for GHDL:

~/fpga-serial-acl-tester-3-ghdl3/ACL-Tester-Design-VHDL/Work_Dir_GHDL
$ # Edit the ./example-vivado-compile-mod.patch with your own compiler flags.
$ sudo patch -p0 < ./example-vivado-compile-mod.patch
$ /opt/ghdl-gcc-4.1.0/lib/ghdl/vendors/compile-xilinx-vivado.sh \
--unisim --unimacro --vhdl2008
$ ln -s xilinx-vivado/unisim ./
$ ln -s xilinx-vivado/unimacro ./
$ # Set the variable NATIVE_CFLAGS to your own hardware's compiler flags.
$ export NATIVE_CFLAGS="-O2 -march=znver3 -mshstk --param=l1-cache-line-size=64 --param=l1-cache-size=32 --param=l2-cache-size=512"
$ time ./ghdl-run.sh run

Example output of the run script, not including any compile-time and execution-time warning messages, and not including all compiler optimization flags:

See the script output in TXT format, including compiler flags, in your browser at: example-fpga-serial-acl-tester-3-ghdl-4.1-gcc-be.txt

$ ./ghdl-run.sh run
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/NamePkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/OsvvmGlobalPkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/VendorCovApiPkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/TranscriptPkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/TextUtilPkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/AlertLogPkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/MessagePkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/SortListPkg_int.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/RandomBasePkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/RandomPkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/CoveragePkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/MemoryPkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/ScoreboardGenericPkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/ScoreboardPkg_slv.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/ScoreboardPkg_int.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/ResolutionPkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/TbUtilPkg.vhd
ghdl -a --std=08 --work=osvvm -O2 ../OSVVM/OsvvmLibraries/osvvm/OsvvmContext.vhd
ghdl -a --std=08 --work=OSVVM_Common -O2 ../OSVVM/OsvvmLibraries/Common/src/StreamTransactionPkg.vhd
ghdl -a --std=08 --work=OSVVM_Common -O2 ../OSVVM/OsvvmLibraries/Common/src/AddressBusTransactionPkg.vhd
ghdl -a --std=08 --work=OSVVM_Common -O2 ../OSVVM/OsvvmLibraries/Common/src/AddressBusResponderTransactionPkg.vhd
ghdl -a --std=08 --work=OSVVM_Common -O2 ../OSVVM/OsvvmLibraries/Common/src/AddressBusVersionCompatibilityPkg.vhd
ghdl -a --std=08 --work=OSVVM_Common -O2 ../OSVVM/OsvvmLibraries/Common/src/ModelParametersPkg.vhd
ghdl -a --std=08 --work=OSVVM_Common -O2 ../OSVVM/OsvvmLibraries/Common/src/FifoFillPkg_slv.vhd
ghdl -a --std=08 --work=OSVVM_Common -O2 ../OSVVM/OsvvmLibraries/Common/src/OsvvmCommonContext.vhd
ghdl -a --std=08 --work=osvvm_uart -O2 ../OSVVM/OsvvmLibraries/UART/src/UartTbPkg.vhd
ghdl -a --std=08 --work=osvvm_uart -O2 ../OSVVM/OsvvmLibraries/UART/src/ScoreboardPkg_Uart.vhd
ghdl -a --std=08 --work=osvvm_uart -O2 ../OSVVM/OsvvmLibraries/UART/src/UartTxComponentPkg.vhd
ghdl -a --std=08 --work=osvvm_uart -O2 ../OSVVM/OsvvmLibraries/UART/src/UartRxComponentPkg.vhd
ghdl -a --std=08 --work=osvvm_uart -O2 ../OSVVM/OsvvmLibraries/UART/src/UartContext.vhd
ghdl -a --std=08 --work=osvvm_uart -O2 ../OSVVM/OsvvmLibraries/UART/src/UartTx.vhd
ghdl -a --std=08 --work=osvvm_uart -O2 ../OSVVM/OsvvmLibraries/UART/src/UartRx.vhd
ghdl -a --std=08 --work=work -O2 ../RTL/clock_divider.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/clock_enable_divider.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/arty_reset_synchronizer.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/ext_interrupt_debouncer.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/lcd_text_functions_pkg.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/multi_input_debounce.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/one_shot_fsm.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/pulse_stretcher_synch.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/ssd_display.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/thresh_presets_selector.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/thresh_presets_pkg.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/acl_tester_fsm.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/adxl362_readings_to_ascii.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/lcd_text_feed.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/led_pwm_driver.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/led_palette_pulser.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/pmod_stand_spi_solo_pkg.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/pmod_generic_spi_solo.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/pmod_acl2_stand_spi_solo.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/pmod_cls_stand_spi_solo.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/pmod_acl2_custom_driver.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/pmod_cls_custom_driver.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/uart_tx_feed.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/uart_tx_only.vhdl
ghdl -a --std=08 --work=work -O2 ../RTL/fpga_serial_acl_tester_a7100.vhdl
ghdl -a --std=08 --work=work -O2 ../Testbench/acl_testbench_pkg.vhdl
ghdl -a --std=08 --work=work -O2 ../Testbench/clock_gen.vhdl
ghdl -a --std=08 --work=work -O2 ../Testbench/board_ui.vhdl
ghdl -a --std=08 --work=work -O2 ../Testbench/pmod_acl2.vhdl
ghdl -a --std=08 --work=work -O2 ../Testbench/board_uart.vhdl
ghdl -a --std=08 --work=work -O2 ../Testbench/pmod_cls.vhdl
ghdl -a --std=08 --work=work -O2 ../Testbench/pmod_7sd.vhdl
ghdl -a --std=08 --work=work -O2 ../Testbench/fpga_serial_acl_tester_testbench.vhdl
ghdl -a --std=08 --work=work -O2 ../Testbench/fpga_serial_acl_tester_testharness.vhdl
ghdl -a --std=08 --work=work -O2 ../Testbench/test_default_fpga_regression.vhdl
ghdl -e --std=08 -fsynopsys -frelaxed -O2 test_default_fpga_regression
ghdl -r --std=08 -fsynopsys -frelaxed test_default_fpga_regression ---vcd=test.vcd ---write-wave-opt=test.opt --stop-time=1us
FPGA_SERIAL_ACL_TESTER_TESTBENCH starting simulation.
Logging enabled for ALWAYS, INFO, PASSED.
%% Log   ALWAYS  in u_tbc_clock_gen, Starting system clock emulation with period 10000000 fs. at 1 ns
%% Log   ALWAYS  in u_tbc_board_ui, Starting board user interface emulation, 4 buttons, 4 switches, 4 RGB LEDs, 4 Basic LEDs. at 1 ns
%% Log   ALWAYS  in u_tbc_pmod_acl2, Starting Pmod ACL2 emulation with SPI mode 0 bus, two interrupt lines, internal clock of 8.0 MHz. at 1 ns
%% Log   ALWAYS  in u_tbc_pmod_cls, Starting Pmod CLS emulation with SPI mode 0 bus. at 1 ns
%% Log   ALWAYS  in u_tbc_board_uart, Starting Board UART emulation at baud 115200. at 1 ns
%% Log   ALWAYS  in u_tbc_pmod_7sd, Starting monitoring emulation of Pmod SSD (7SD). at 1 ns
%% Log   ALWAYS  in u_tbc_pmod_cls, Entering Pmod CLS emulation with SPI mode 0 bus. at 2 ns
%% Log   ALWAYS  in u_tbc_pmod_acl2, Entering Pmod ACL2 emulation of interrupt lines. at 2 ns
%% Log   ALWAYS  in u_tbc_pmod_acl2, Entering Pmod ACL2 emulation of Data Ready filter control. at 2 ns
%% Log   ALWAYS  in u_tbc_pmod_acl2, Updating Pmod ACL2 emulation of Data Ready filter control executing with period 2500000000000 fs . at 2 ns
%% Log   ALWAYS  in u_tbc_pmod_acl2, Entering Pmod ACL2 emulation with SPI mode 0 bus. at 2 ns
%% Log   ALWAYS  in u_tbc_board_ui, Entering emulation of switches 0,1,2,3 . at 2 ns
%% Log   INFO    in u_tbc_board_ui, BOARD UI switches 0,1,2,3 unselected at startup. at 2 ns
%% Log   ALWAYS  in u_tbc_board_ui, Entering emulation of buttons 0,1,2,3 . at 2 ns
%% Log   INFO    in u_tbc_board_ui, BOARD UI buttons 0,1,2,3 released at startup. at 2 ns
%% Log   ALWAYS  in u_tbc_clock_gen, Delaying external reset running with delay 1000000000 fs. at 2 ns
%% Log   ALWAYS  in u_tbc_clock_gen, Entering external clock running with period 10000000 fs and 50% duty cycle. at 2 ns
./test_default_fpga_regression:info: simulation stopped by --stop-time @1us
ghdl -r --std=08 -fsynopsys -frelaxed test_default_fpga_regression
FPGA_SERIAL_ACL_TESTER_TESTBENCH starting simulation.
Logging enabled for ALWAYS, INFO, PASSED.
%% Log   ALWAYS  in u_tbc_clock_gen, Starting system clock emulation with period 10000000 fs. at 1 ns
%% Log   ALWAYS  in u_tbc_board_ui, Starting board user interface emulation, 4 buttons, 4 switches, 4 RGB LEDs, 4 Basic LEDs. at 1 ns
%% Log   ALWAYS  in u_tbc_pmod_acl2, Starting Pmod ACL2 emulation with SPI mode 0 bus, two interrupt lines, internal clock of 8.0 MHz. at 1 ns
%% Log   ALWAYS  in u_tbc_pmod_cls, Starting Pmod CLS emulation with SPI mode 0 bus. at 1 ns
%% Log   ALWAYS  in u_tbc_board_uart, Starting Board UART emulation at baud 115200. at 1 ns
%% Log   ALWAYS  in u_tbc_pmod_7sd, Starting monitoring emulation of Pmod SSD (7SD). at 1 ns
%% Log   ALWAYS  in u_tbc_pmod_cls, Entering Pmod CLS emulation with SPI mode 0 bus. at 2 ns
%% Log   ALWAYS  in u_tbc_pmod_acl2, Entering Pmod ACL2 emulation of interrupt lines. at 2 ns
%% Log   ALWAYS  in u_tbc_pmod_acl2, Entering Pmod ACL2 emulation of Data Ready filter control. at 2 ns
%% Log   ALWAYS  in u_tbc_pmod_acl2, Updating Pmod ACL2 emulation of Data Ready filter control executing with period 2500000000000 fs . at 2 ns
%% Log   ALWAYS  in u_tbc_pmod_acl2, Entering Pmod ACL2 emulation with SPI mode 0 bus. at 2 ns
%% Log   ALWAYS  in u_tbc_board_ui, Entering emulation of switches 0,1,2,3 . at 2 ns
%% Log   INFO    in u_tbc_board_ui, BOARD UI switches 0,1,2,3 unselected at startup. at 2 ns
%% Log   ALWAYS  in u_tbc_board_ui, Entering emulation of buttons 0,1,2,3 . at 2 ns
%% Log   INFO    in u_tbc_board_ui, BOARD UI buttons 0,1,2,3 released at startup. at 2 ns
%% Log   ALWAYS  in u_tbc_clock_gen, Delaying external reset running with delay 1000000000 fs. at 2 ns
%% Log   ALWAYS  in u_tbc_clock_gen, Entering external clock running with period 10000000 fs and 50% duty cycle. at 2 ns
%% Log   ALWAYS  in u_tbc_clock_gen, Entering external reset running low with period 1000000000 fs. at 1002 ns
%% Log   INFO    in u_tbc_board_ui, BASIC LED PWM 3 lasted for: L:1010000000 fs at 1022 ns
%% Log   INFO    in u_tbc_board_ui, BASIC LED PWM 3 changed to: L:0 at 1022 ns
%% Log   INFO    in u_tbc_board_ui, BASIC LED PWM 2 lasted for: L:1010000000 fs at 1022 ns
%% Log   INFO    in u_tbc_board_ui, BASIC LED PWM 2 changed to: L:0 at 1022 ns
%% Log   INFO    in u_tbc_board_ui, BASIC LED PWM 1 lasted for: L:1010000000 fs at 1022 ns
%% Log   INFO    in u_tbc_board_ui, BASIC LED PWM 1 changed to: L:0 at 1022 ns
%% Log   INFO    in u_tbc_board_ui, BASIC LED PWM 0 lasted for: L:1010000000 fs at 1022 ns
%% Log   INFO    in u_tbc_board_ui, BASIC LED PWM 0 changed to: L:0 at 1022 ns
%% Log   INFO    in u_tbc_board_ui, RGB LED PWM 0 lasted for: R:1010000000 fs G:1010000000 fs B:1010000000 fs at 1022 ns
%% Log   INFO    in u_tbc_board_ui, RGB LED PWM 0 changed to: R:0 G:0 B:0 at 1022 ns
%% Log   INFO    in u_tbc_board_ui, RGB LED PWM 1 lasted for: R:1010000000 fs G:1010000000 fs B:1010000000 fs at 1022 ns
%% Log   INFO    in u_tbc_board_ui, RGB LED PWM 1 changed to: R:0 G:0 B:0 at 1022 ns
%% Log   INFO    in u_tbc_board_ui, RGB LED PWM 2 lasted for: R:1010000000 fs G:1010000000 fs B:1010000000 fs at 1022 ns
%% Log   INFO    in u_tbc_board_ui, RGB LED PWM 2 changed to: R:0 G:0 B:0 at 1022 ns
%% Log   INFO    in u_tbc_board_ui, RGB LED PWM 3 lasted for: R:1010000000 fs G:1010000000 fs B:1010000000 fs at 1022 ns
%% Log   INFO    in u_tbc_board_ui, RGB LED PWM 3 changed to: R:0 G:0 B:0 at 1022 ns
%% Log   INFO    in u_tbc_pmod_7sd, 7SD Digit 0 is turned OFF: 0000000 at 6162 ns

Conclusions

Hopefully this post has been helpful for understanding the possibilities of simulating your own VHDL-2008 project with GHDL. The program GHDL is mature and open-source, and can be useful for VHDL projects at school, hobby, or employment.

Also, I hope that the fpga-serial-acl-tester-3 project is useful for not only RTL design, but for ideas for how to structure the start of a VHDL-2008 test-bench.

Remember that the GHDL maintainer may discontinue GCC backend support in the future. See the example for compiling GHDL with LLVM backend instead at: OS-VVM VHDL project simulations with GHDL 3.0.

Cheers.