Examples of using cocotb for functional verification of VHDL designs with GHDL.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
6.9 KiB

  1. The original repository is now located on my own git-server at [https://git.goodcleanfun.de/tmeissner/cocotb_with_ghdl](https://git.goodcleanfun.de/tmeissner/cocotb_with_ghdl)
  2. It is mirrored to github with every push, so both should be in sync.
  3. # cocotb_with_ghdl
  4. *At the moment, this repo is in an early state and serves as a learning tool for me. So it contains a a lot of quirks and code which can be done much better by cocotb-professionals.*
  5. A collection of examples of using [cocotb](https://www.cocotb.org/) for functional verification of VHDL designs with [GHDL](https://github.com/ghdl/ghdl).
  6. This is a project with the purpose to learn using cocotb with GHDL. It is intended for my simple (and more complex in future) experiments with using the Python language instead of VHDL or SV to verify digital designs.
  7. It is recommended to use an up-to-date version of GHDL as potential bugs are fixed very quickly. You can build GHDL from source or use one of the Docker images of the [hdl containers project](https://hdl.github.io/containers/) (recommended). For example the `hdlc/sim:scipy` docker image. This image contains a recent version of cocotb and a C++ compiler (needed to build some wheels during installing requirements with pip).
  8. Have fun!
  9. ## Quickstart guide
  10. ### Change into docker container & install requirements
  11. ```
  12. $ git clone https://git.goodcleanfun.de/tmeissner/cocotb_with_ghdl.git
  13. $ cd cocotb_with_ghdl
  14. $ ./env-setup.sh
  15. $ docker run --rm -ti --volume=$(pwd):/build -e DISPLAY=$DISPLAY \
  16. --volume /tmp/.X11-unix:/tmp/.X11-unix hdlc/sim:scipy /bin/bash
  17. $ ./docker-setup.sh
  18. Collecting cocotb-bus
  19. Downloading cocotb-bus-0.2.1.tar.gz (28 kB)
  20. Installing build dependencies ... done
  21. Getting requirements to build wheel ... done
  22. Preparing wheel metadata ... done
  23. ...
  24. Successfully built cocotb-bus wavedrom python-constraint
  25. Installing collected packages: lxml, cocotb-bus, toposort, svgwrite, pyyaml, pyucis, python-constraint, pyboolector, cocotbext-axi, attrdict, wavedrom, pyvsc, pyuvm, cocotbext-uart, cocotbext-spi, cocotbext-pcie, cocotbext-eth, cocotb-coverage
  26. Successfully installed attrdict-2.0.1 cocotb-bus-0.2.1 cocotb-coverage-1.1.0 cocotbext-axi-0.1.18 cocotbext-eth-0.1.18 cocotbext-pcie-0.1.20 cocotbext-spi-0.1.2 cocotbext-uart-0.1.2 lxml-4.7.1 pyboolector-3.2.2.20220125.14 python-constraint-1.4.0 pyucis-0.0.5.20211020.1 pyuvm-2.6.1 pyvsc-0.6.7.1792877175 pyyaml-6.0 svgwrite-1.4.1 toposort-1.7 wavedrom-2.0.3.post2
  27. ```
  28. ### Run default test (UART TX)
  29. ```
  30. root@6ee2bee145d4:~# cd /build/tests/
  31. root@6ee2bee145d4:/build/tests# make
  32. make -f Makefile results/uarttx.xml
  33. make[1]: Entering directory '/build/tests'
  34. mkdir -p results
  35. mkdir -p work
  36. /usr/local/bin/ghdl -i --std=08 --workdir=work --work=libvhdl ../libvhdl/common/UtilsP.vhd && \
  37. /usr/local/bin/ghdl -i --std=08 --workdir=work --work=work ../libvhdl/syn/*.vhd && \
  38. /usr/local/bin/ghdl -m --std=08 --workdir=work -Pwork --work=work uarttx
  39. analyze ../libvhdl/common/UtilsP.vhd
  40. analyze ../libvhdl/syn/UartTx.vhd
  41. elaborate uarttx
  42. MODULE=tb_uart TESTCASE=test_uarttx TOPLEVEL=uarttx TOPLEVEL_LANG=vhdl \
  43. /usr/local/bin/ghdl -r --workdir=work -Pwork --work=work uarttx --vpi=/usr/local/lib/python3.9/dist-packages/cocotb/libs/libcocotbvpi_ghdl.so --wave=results/uarttx.ghw --psl-report=results/uarttx_psl.json --vpi-trace=results/uarttx_vpi.log
  44. loading VPI module '/usr/local/lib/python3.9/dist-packages/cocotb/libs/libcocotbvpi_ghdl.so'
  45. -.--ns INFO cocotb.gpi ..mbed/gpi_embed.cpp:76 in set_program_name_in_venv Did not detect Python virtual environment. Using system-wide Python interpreter
  46. -.--ns INFO cocotb.gpi ../gpi/GpiCommon.cpp:99 in gpi_print_registered_impl VPI registered
  47. VPI module loaded!
  48. 0.00ns INFO Running on GHDL version 2.0.0-dev (v1.0.0-974-g0e46300c) [Dunoon edition]
  49. 0.00ns INFO Running tests with cocotb v1.7.0.dev0 from /usr/local/lib/python3.9/dist-packages/cocotb
  50. 0.00ns INFO Seeding Python random module with 1644236947
  51. /usr/local/lib/python3.9/dist-packages/attrdict/mapping.py:4: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working
  52. from collections import Mapping
  53. /usr/local/lib/python3.9/dist-packages/attrdict/mixins.py:5: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working
  54. from collections import Mapping, MutableMapping, Sequence
  55. 0.00ns INFO Found test tb_uart.test_uarttx
  56. 0.00ns INFO running test_uarttx (1/1)
  57. First simple test
  58. 0.00ns INFO Valid-accept driver
  59. 0.00ns INFO cocotbext-vai version 0.0.1
  60. 0.00ns INFO Copyright (c) 2022 Torsten Meissner
  61. 0.00ns INFO UART receiver
  62. 0.00ns INFO cocotbext-uart version 0.0.1
  63. 0.00ns INFO Copyright (c) 2022 Torsten Meissner
  64. 0.00ns INFO Hold reset
  65. 100.00ns INFO Released reset
  66. 110.00ns INFO Sending data: 0xaf
  67. 1170.00ns INFO Received data: 0xaf
  68. 1190.00ns INFO Sending data: 0x56
  69. 2280.00ns INFO Received data: 0x56
  70. 2300.00ns INFO Sending data: 0xb1
  71. 3390.00ns INFO Received data: 0xb1
  72. 3410.00ns INFO Sending data: 0x80
  73. 4500.00ns INFO Received data: 0x80
  74. 4520.00ns INFO Sending data: 0xc4
  75. 5610.00ns INFO Received data: 0xc4
  76. 5630.00ns INFO Sending data: 0x8
  77. 6720.00ns INFO Received data: 0x8
  78. 6740.00ns INFO Sending data: 0x68
  79. 7830.00ns INFO Received data: 0x68
  80. 7850.00ns INFO Sending data: 0x30
  81. 8940.00ns INFO Received data: 0x30
  82. 8960.00ns INFO Sending data: 0xa2
  83. 10050.00ns INFO Received data: 0xa2
  84. 10070.00ns INFO Sending data: 0x70
  85. 11160.00ns INFO Received data: 0x70
  86. 11160.00ns INFO test_uarttx passed
  87. 11160.00ns INFO **************************************************************************************
  88. ** TEST STATUS SIM TIME (ns) REAL TIME (s) RATIO (ns/s) **
  89. **************************************************************************************
  90. ** tb_uart.test_uarttx PASS 11160.00 0.23 48943.29 **
  91. **************************************************************************************
  92. ** TESTS=1 PASS=1 FAIL=0 SKIP=0 11160.00 0.31 35939.72 **
  93. **************************************************************************************
  94. make[1]: Leaving directory '/build/tests
  95. ```
  96. ## Available Tests
  97. ### UART
  98. Simple tests of UART transmitter & receiver of the *libvhdl* project
  99. * `make DUT=uarttx` or `make`
  100. * `make DUT=uartrx`
  101. ### Wishbone
  102. Simple tests of Wishbone slave of the *libvhdl* project
  103. * `make DUT=wishbone`