Simulinkでロジック信号を可視化する方法（備忘録）

# はじめに
Simulink/HDL CoderでFPGA実装するようなモデルで、ロジック信号をデバッグしようとすると、特に長い尺の信号を取り扱う場合、色々と問題があり難しいことが多かったので、可視化の代替案を備忘録として残します。

# ロジックアナライザー
Simulinkにもロジック波形を表示する機能はあるみたいですが、MATLAB R2023a時点では色々と問題があったので、信号のログはSimulinkで取りつつ、可視化は別の方法でやりました。

信号ログを取る手段としては、HDL VerifierにTo VCD Fileブロックを使いました。

可視化の手段としては、２つ
1. VCDファイルに対応したHDLシミュレータを使う
（ModelSim/Questaを使用した）
2. フリーのビューワーGTK Waveを使う

※GTK Waveはこちらからダウンロードできます。

https://gtkwave.sourceforge.net/


# To VCD Fileブロック
VCDファイルとは

https://en.wikipedia.org/wiki/Value_change_dump

一般的なHDLシミュレータでデータダンプに使われる標準的なファイルフォーマットです。

SimulinkシミュレーションのデータをVCDファイルに保存するブロックは HDL Verifier > To VCD Fileブロック

https://www.mathworks.com/help/hdlverifier/ref/tovcdfile.html


#### To VCD Fileブロックの制約
* Simulinkのバス信号に対応していないので、Signal Conversionブロック（出力：バーチャル バス） + Bus to Vectorブロックでベクトル信号に変換する
* 複数階層の信号をまとめてVCDブロックに接続するのにGoto/Fromブロックが便利
    * ただし、このブロックはAtomicサブシステムや参照モデルの境界を超えられない。Atomicや参照モデルには、その階層にVCDブロックを置く必要がある。
* 信号名がビューワーの表示名になるので、Simulink信号名をわかりやすく命名する
* Simulinkサンプル時間をキリのいい数字ににする（分解能が1tick未満になるとエラーとなる。詳細は後述）
* アクセラレータに対応している
    * 参照モデル内にある場合はアクセラレータが使えない
* 任意の固定小数点, Boolean, double, singleデータ型に対応している。halfは対応していない。
* 右クリックメニューからビューアーに接続した場合は、VCDファイルに信号名が継承されない
* [Nx1], [1xN], [NxM] の行列信号も保存できるが、NxMの行列はベクトル信号として保存される


#### To VCD Fileブロックのサンプル時間に関して
このブロックに小数点以下の桁数が多いサンプル時間の信号を入力するとエラーが発生します。

例えばFull HD 60fpsの画像処理を行う場合、ピクセルストリームのサンプル時間は以下の通り。
HSize: 1920
VSize: 1080
TotalPixelsPerLine: 2200
TotalVideoLines: 1125
FrameRate: 1/60

PixelSampleTime: 1/60/2200/1125
= 6.734006734006734e-09

HDLシミュレータの1tickは、扱うことのできる時間分解能を1ns, 1ps, 1fsにしても上記のサンプル時間は精度が足りないので、Simulink側のサンプル時間を調整します。

HDLシミュレータの1tick: 1ns
PixelSampleTime: 10nsとなるようにすると
FrameRate = 10e-9 * 2200 * 1125
= 0.02475


フレームサンプル時間を上記設定に設定するとエラーが発生せずにVCDブロックを使用できます。

## モデルの設定

To VCD Fileに保存する方法は2つあります。
1. ブロックに接続する
2. ブロックを置かずに右クリックメニューからビューアーに接続する


#### 1. Goto/Fromブロックで信号を集約して入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/ec1668d9-9d50-7773-91b8-b373d1be3c72.png)
これは信号の取り回しが煩雑になりがちなので、お勧めしません。

#### 2. 信号を右クリックしてビューアーに接続（こちらがお勧め）
信号線を右クリック > ピューアーの作成と接続 > HDL Verifier > To VCD File
をクリックするとブロックを置かずに接続できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/e90f761f-8ecf-4a17-2eb4-441362ca7b68.png)

ビューアーを開いて、信号の数やTimescale設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/d77da20d-fd93-423d-14dc-d2b84160d95d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/28e69e45-be1e-b36e-8600-0409bb4249fb.png)

複数信号を接続したい場合は、ビューアーマネージャーを開いて・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/86ab0f7a-f78c-6831-780b-ab83614efcd6.png)

下図のマネージャ画面で、1つのビューアーに信号を追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/163bbad7-7f67-29c7-9c06-43a915999ac5.png)



# VCDファイルの表示

#### HDLシミュレータ（Questa/ModelSim）の場合

HDLシミュレータを起動。Questa/ModelSimは以下のコマンドで起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/1ce87b88-b85b-d14b-cf61-dbfbd575408b.png)

ModelSim/Questaの場合は以下のコマンドでVCDファイルをWLFファイルに変換。
```:Questa/ModelSim
vcd2wlf test_vcd.vcd test_vcd.wlf
```

ファイル読み込みと波形の表示は
Fileメニュー>Open
Objects画面で信号名を選択してAdd Waveをクリックすると実行できます。

コマンドだと以下
```:Questa/ModelSim
OpenFile test_vcd.wlf
add wave *
```


#### GTK Waveの場合

GTK Waveをインストール、パス設定がされていれば、MATLABからシステムコマンドを実行すればGTK Waveを開くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/d30ff28c-8ed8-bc97-4d48-ba8e1499f584.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/41b0c9bd-31e1-5429-e5c0-c7a59125b454.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/276e0d9c-2b84-1009-2202-09f4af49369e.png)


# それぞれの特長
* GTK Waveの特長
    * 起動までが速い。手軽に使える点が良い。
    * カーソルは1つしか置けない。代わりにマーカーを使って時間測定できるがあまり使いやすくはない。
    * ビューワーの拡大縮小は[Ctrl+Shift+－], [Ctrl+－]

* ModelSim/Questaの特長
    * 起動には時間がかかる。
    * カーソルを複数置けて、各カーソル間の時間測定が容易。
    * ビューワーの拡大縮小は [i], [o]キー
    * 波形表示フォーマットのオプションが豊富。アナログ波形など。


以上