Vivadoでシミュレーションを行う

# はじめに
FPGAの授業の補助資料として入門したての頃に詰まったポイント、早く知っていればよかったなというポイントをいくつかまとめて記事にします。
今回はVivado単体でシミュレーションを行う方法です。
※授業では通常紹介されませんが、家でシミュレーションを行う必要がある場合にご利用ください。なお、ModelSimより低速なのでその点はご了承ください。

# Vivadoを起動しシミュレーション用のプロジェクトを作成する
Vivado起動後File>Project>Newを選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/cac91abe-1af3-9872-3ae2-6ace350928b2.png)
「Next」を押し、保存先やプロジェクト名などを入力し「Next」を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/d825540d-e8cb-75e9-b768-7b1fb151a03c.png)

「RTLProject」を選択し「Next」を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/01987d91-332d-abdb-2ac3-36d1a691c129.png)

NewProjectSummaryの画面まで「Next」を押し飛ばします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/3712ea19-a9ae-8150-b5f9-09102a742b8c.png)
最後に「Finish」を押します。

Finish選択後Vivadoのメイン画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/e5040cc9-96c4-a5f4-d6ae-6088e6e30cc3.png)

# 論理合成対象のソースコードとテストベンチを追加する
今回はサンプルとしてXORShiftで乱数を生成するrandモジュールとそのテストを用意しました。
https://gist.github.com/mmitti/07b6ddf778abdfc588d88c16da6e3985
なお、ココでは論理合成対象はシミュレーション後に論理合成の確認を行うため、「Design Soruces」に追加します。
## 論理合成対象の追加
左側「FlowNavigator」内の「Add Sources」を選択します。
つぎに表示されたダイアログの「Add or create design sources」を選択し、「Next」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/35bbd732-816d-d519-dc59-b59840e2f993.png)
「Add Files」もしくは「Add Directories」を選択し、論理合成対象のソースコードを選択し追加します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/0a1a914a-4146-1f09-191f-96e2cb92effa.png)
>ここで「Copy sources into project」にチェックが外れていることを確認してください。チェックが入っているとプロジェクトフォルダー以下にコピーされますが、コピー元を編集しても反映されず、トラブルのもとになります。

追加したファイルを確認し「Finish」を押します。
## シミュレーション用ファイルを追加する
左側「FlowNavigator」内の「Add Sources」を選択します。
つぎに表示されたダイアログの「Add or create simulation sources」を選択し、「Next」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/0d2416bc-0d25-a3dc-7992-990f68d3bc00.png)

あとの手順は論理合成対象のソースコードを追加するときと同じです。

サンプルを追加すると「Sourcces」ウィンドウが図のようになると思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/89560194-f950-c5fa-f125-53ed37779ee5.png)

# シミュレーション対象を選択
今回のように複数のテストベンチを追加した場合は、どのテストベンチをシミュレーションするか選択する必要があります。
選択中のテストベンチは「Sources」ウィンドウ内でモジュール名が太字になり先頭に![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/668b0a21-cc2a-a7d8-f8ba-e53fea5b00c6.png)マークが追加されます。
シミュレーション対象を切り替えるには、テストベンチを右クリックし、「Set as Top」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/a80b19f1-9f5a-0cd6-a771-4fe67b4c1444.png)

# シミュレーションを行う
シミュレーションを行うには左側「Flow Navigator」内の「SIMULATION」から「Run Simulation」を選択し、「Run Behavioral Simulaion」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/202ce829-638b-61ac-fece-f1818ec00b30.png)
実行後このように波形が表示されると思います。（テストベンチで\$finish()や\$stop()などで停止した場合はソースが表示されますが、その隣のUntiltedタブなどを押すと波形が表示されます。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/2470473f-b817-afe2-5b78-abb9fc2464c6.png)
\$displayなどで出力したメッセージは下部「Tcl Console」に出力されます。

## 操作方法
よく使うボタン類をいかにまとめます。
![i.png](https://qiita-image-store.s3.amazonaws.com/0/140084/9baa5bb0-7269-c2fc-f1b1-8b8372183c26.png)

下位モジュールの信号を追加したい場合は「Scope」ウィンドウ及び、「Object」ウィンドウを使います。
図のように左側などに折り畳まれている場合はクリックして開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/732a2fd7-d3ba-1b43-c51a-be7975b7691e.png)

閉じてしまった場合は上部メニュー「Window」内に項目があります。

「Scope」ウィンドウにはモジュール階層が表示されているので任意のモジュールを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/fc6eec84-d1b3-719d-cc22-c559bf2d8efa.png)

モジュールを選択すると対象モジュールに含まれる信号線が「Object」ウィンドウに表示されますので波形を見たいものを右側波形ウィンドウにドラッグアンドドロップし、最初からシミュレーションします。


実行例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/1f77b301-d71f-9e1c-92da-a504b3871799.png)

## 波形を見やすくカスタマイズする
信号名を右クリックすると波形表示のオプションがいくつかあります。
### 波形の色を変える
信号名を右クリックし「Signal Color」から色を変えることが出来ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/24fc75b3-77c7-446d-b316-a1e57d13b645.png)

色を変えた例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/4a1c44be-be82-aec2-d6ef-e56de31660ef.png)
> 不定値及び未接続と見間違えるので赤と青は使わないほうがいいかもしれません。

### 基数を変更
デフォルトは16進数ですが10進数や2進数表記にすることが出来ます。
信号名を右クリックし「Radix」から選択してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/034ca5cf-822f-7e6b-d6cb-9fc7eb85b14f.png)

基数を変えた例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/cb7b2379-ddb5-c526-4150-d00d1c4a39cc.png)

### グループ化と水平線
信号を見やすくするために複数の信号をグループにまとめることと波形表示領域に水平線を追加することが出来ます。
信号名を右クリックし「New Group」でグループを「New Divider」で水平線を追加できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/37fad24d-c568-8f18-b257-1bd0992494c1.png)
なお、グループや水平線には名前をつけることが出来ます。

例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/75b3b764-a30c-997b-772d-dd4d679bcb73.png)

グループは閉じることも出来ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/77884c13-abde-5066-b877-3302e30b8545.png)

## カスタマイズした設定を保存する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/6a925258-5ed5-5529-2b27-91146d2bb38f.png)
保存ボタン（Save Wave configurations）を押して保存先を選択します。
保存した設定が「Source」ウィンドウ内に追加されていることを確認してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/140084/7ff5babc-647c-3d12-7b21-3ef932d76895.png)
次回シミュレーション実行時にこの設定が読みこまれます。

>なお、複数のテストベンチを切り替えながら使う場合で波形設定を保存した場合、紹介した手順ではうまく切り替えれず、波形設定を複数保存するとシミュレーション時に複数の波形ウィンドウが開かれると思います。
>テストベンチごとに波形設定を変えたい場合はシミュレーションセットを作成してセットを切り替える必要があるみたいです。（気が向いたら追記します。）


# シミュレーション後
シミュレーション後は必ず論理合成を行い、ラッチができてないかなどを確認してください。

# ModelSimとVivadoSimの速度差(追記)
授業ではModelSimを利用していますが、絵を出力する回路のシミュレーション所要時間を比較してみました。

||Vivado|ModelSim|
|:---:|:---:|:---:|
|所要時間|1:14|0:15|

約5倍早いという感じです（シミュレーション対象の回路により前後します)