GHDLとVunitでVHDLのテスト環境を構築する[Docker版]

# はじめに
「[GHDLとVunitでVHDLのテスト環境を構築する](https://qiita.com/ryo_i6/items/7d1bf7ecdc3edd69d0b0)」のDocker版です
波形確認用に[GTKWave](https://sourceforge.net/projects/gtkwave/)を追加しています

# 開発環境
* Windows10 Pro 64bit
* Docker for Windows Community Edition Version 2.0.0.3
* VcXsrv X Server Version "1.20.1.4"
* ghdl/ext:ls-vunit-gtkwave
    * Python 3.7.4
    * GHDL : 0.37-dev
    * vunit-hdl : 4.0.9rc0
    * GTKWave Analyzer v3.3.102
    * X11 libraries

# 環境構築
Windows上でテストおよび波形確認を行うためVcXsrvのインストールとDockerイメージの作成を行います

## VcXsrv

### VcXsrvのインストール
[VcXsrv](https://sourceforge.net/projects/vcxsrv/)をインストールします
今回は[chocolatey](https://chocolatey.org/)からインストールしました

```shell
choco install vcxsrv -y
```

### VcXsrvの起動
VcXsrvを起動します
設定はすべてデフォルトでOKです

## Docker
Docker for Windowsのインストールについては他の記事を参考にしてください

### ディレクトリ構成
下記のようなディレクトリ構成を想定しています

```text:ディレクトリ構成
C:.
├─docker-compose.yml
├─ghdl
│  └─Dockerfile
└─project
   ├─run.py # テスト実行ファイル
   ├─src
   │  └─*.vhd
   ├─test
   │  └─*.vhd
   └─vunit_out # テスト結果出力フォルダ
```

### Dockerfileの作成

自動テストおよび波形確認を行うため`ghdl/ext:latest`を使用します
VcXsrvでgtkwaveの波形を確認するため`ENV DISPLAY host.docker.internal:0.0`を設定します

```dockerfile:Dockerfile
FROM ghdl/ext:latest
# VcXsrvでWindows上にGUIを表示するための設定
ENV DISPLAY host.docker.internal:0.0
```

### docker-compose.ymlの作成
volumesを使用するため、事前にDocker for WindowsのShared Drivesを設定しておくようにしてください

```yml:docker-compose.yml
version: '3'
services:
  ghdl:
    restart: always
    build: ./ghdl
    working_dir: "/project"
    volumes:
      - ./project:/project
    tty: true
```

### テスト実行ファイルrun.pyの作成
[Vunitの例](https://vunit.github.io/examples.html)にあるVHDL User Guideを元にテスト実行ファイルを作成します

```python:run.py
from os.path import join, dirname
from vunit import VUnit

root = dirname(__file__)
project = VUnit.from_argv()

lib = project.add_library("lib")
lib.add_source_files(join(root, "src", "*.vhd"), "lib")
lib.add_source_files(join(root, "test", "*.vhd"), "lib")

project.main()
```

### dockerイメージの作成
docker-composeでghdlイメージを作成します

```shell
docker-compose build ghdl
```

# テストの実行

## GUIなしでテスト実行
srcおよびtestフォルダにファイルを入れて
docker-composeからrun.pyを実行するとテストが実行され結果が表示されます

```shell
docker-compose run --rm ghdl python run.py
```

```text:実行結果
(省略)

==== Summary ===============================================
pass lib.tb_uartreceiver_0.o_EN          (0.6 seconds)
pass lib.tb_uartreceiver_0.normal        (0.5 seconds)
pass lib.tb_uartreceiver_0.parity error  (0.8 seconds)
pass lib.tb_uartreceiver_0.framing error (0.7 seconds)
============================================================
pass 4 of 4
============================================================
Total time was 2.7 seconds
Elapsed time was 2.7 seconds
============================================================
All passed!
```

## GUIありでテスト実行
`-g`オプションをつけるとVcXsrvでGTKWaveの波形もあわせて確認することができます

```shell
docker-compose run --rm ghdl python run.py -g
```

![GTKWave_sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313464/f09450f8-ad0c-c2eb-c18c-71de9433272e.jpeg)


# 参考
[GHDL](http://ghdl.free.fr/)
[ghdl/docker](https://github.com/ghdl/docker)
[ghdl/docker usecase.md](https://github.com/ghdl/docker/blob/master/USE_CASES.md)
[Vunit](https://vunit.github.io/index.html#)
[VcXsrv](https://sourceforge.net/projects/vcxsrv/)
[GTKWave](https://sourceforge.net/projects/gtkwave/)
[Docker for windowsのコンテナ内でGUIアプリを実行](https://fileszero.kimurak.net/2019-04-18-docker-and-gui-on-windows/)
[GHDLとVunitでVHDLのテスト環境を構築する](https://qiita.com/ryo_i6/items/7d1bf7ecdc3edd69d0b0)

# 更新履歴
2019/09/23
イメージ名を`ghdl/ext:ls-vunit-gtkwave`から`ghdl/ext:latest`に変更