VivadoでMIG+DDR3のシミュレーションの走らせ方メモ&ModelsimでのMIGシミュレーションの走らせ方追加

# 始めに
 Arty A7でDDR3 DRAMを使い始めて、それまで自作のダミーのMIGでシミュレーションとデバッグをやっていたのですが、さすがにタイミング起因と考えられる実機の症状をコピーできなくなってきました。論理シミュレーションは使いなれたModel simを使っているのですが、さすがにMIGそのものが入ったシミュレーションを行う必要になったため、やってみたところ、いくつかはまる点があったので、メモにまとめました。

 ### 2024/2/18追記
　ModelsimでもMIGのシミュレーション動作が確認できたので、方法を追記します。ただ、（少なくともwebエディションでは）性能面ではアドバンテージありません。かなり遅いです。Modelsim使い慣れている方にはと助けになるかもしれません。
 
 # 参考リンク

 [MIG を使って DRAM メモリを動かそう (1)～(5)](https://www.acri.c.titech.ac.jp/wordpress/archives/6048)

 [【FPGAテストベンチ/検証ノウハウ】DDRメモリモデルの初期値設定方法](https://www.paltek.co.jp/techblog/techinfo/230125_01#a02)

 [AR# 56961: Vivado シミュレータ : 相対パスを使用して VHDL または Verilog コードでファイルを読み出す方法](https://support.xilinx.com/s/article/56961?language=ja)

[How to generate MMCM simulation library for logic simulation in ModelSim DE](https://support.xilinx.com/s/question/0D52E00006hpmxlSAA/how-to-generate-mmcm-simulation-library-for-logic-simulation-in-modelsim-de?language=ja)

[SIP_PHY_CONTROL unknown](https://support.xilinx.com/s/question/0D52E00006hpZ4FSAU/sipphycontrol-unknown?language=ja)

[AR# 6538: ModelSim (MXE, SE, PE) - VLOG Error: "Unresolved reference to 'glbl'" occurs when I try to simulate a Verilog design with Xilinx software version 2.1i (or later) (Verilog)](https://support.xilinx.com/s/article/6538?language=ja)


 # やり方メモ

### 1.VivadoでMIG+DDR3のシミュレーションの走らせ方

(1) [MIG を使って DRAM メモリを動かそう (1)～(5)](https://www.acri.c.titech.ac.jp/wordpress/archives/6048)を参考に、MIGを使ったモジュールを設計します。

(2) シミュレーション用DDR3モデルが以下のフォルダにあるので、そこから　ddr3_model.sv　と　ddr3_model_parameters.vh　をシミュレーションファイル用フォルダにコピーします。
\<project directory\>/\<project directory\>_sim/sim_1/behav/xsim/

(3) ddr3_model.svの103行目あたりに以下の2行を追加します。ただし、メモリにあらかじめデータを入れる場合のみmem_initを設定してください。

\`define MAX_MEM

\`define mem_init

(4) 現在動作ドライブの(Linuxの場合はたぶん/の下)にtmpフォルダを作成してください。project directoryがCドライブの場合は、c:\tmpを作成します。

(5) シミュレーション用のテキストデータファイルを以下のフォルダに入れます。（相対パス指定の方法や、絶対パス指定の方法もあるようなのですが、筆者の環境ではうまくいきませんでした。）
\<project directory\>/\<project directory\>_sim/sim_1/behav/xsim/

(6) vivadoのプロジェクト内で、シミュレーションファイルとして、topのシミュレーションファイルと、　ddr3_model.sv　と　ddr3_model_parameters.vh　を登録してください。あとは、実行するだけです。初回実行時、/tmpの下に作られるファイルの書き込み権限で起こられてシミュレーションが止まりますが、シミュレーションの再実行で無事実行できました。
シミュレーショントップ記述のコツは、MIGやclock pllを使用したシミュレーションでは、最初の数十～数百サイクルはクロックが止まっていたり、DRAMの初期設定中だったりするので、流したいパターンはその間を避けるようにすることです。

### 2.Modelsimで動作させる
(1)(2)は同一です。

(3) まずはVivadoでrun implementationとrun simulationをしておきます。run simulationはシミュレーションファイル無しでも一応実行してください。

(4) tools>complie simulation librariesを実行してください。非常に時間がかかるので、以下のような設定で動作させてみました。再度実行するときは、上書きオプションを忘れずに。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575990/a744ecb9-9f48-6919-b3b1-4095e67d5ed6.png)

(5) File> export> Export simulation　を実行してください。書き出し先は自分でわかりやすいところにしておくとよいと思います。

(6) 必要なファイルをシミュレーションディレクトリにコピーします。
cp \<export directory\>/modelsim/modelsim.ini fsim2
cp \<export directory\>/modelsim/glbl.v fsim2
cp -r \<export directory\>/modelsim/srcs/sources_1/ip/* fsim2

(7) Modelsimを立ち上げ、コピーしたライブラリ含め、すべてのverilogファイルをコンパイルします。

(8) コマンドライン(Transcript)で、以下を入力してシミュレーションを立ち上げてください。
vsim -L secureip -L unisims_ver work.glbl work.simtop

# 最後に
自分用のメモとしてやり方の記録を残しましたが、だれかの助けになれば幸いです。ただ、vivadoのシミュレーションは非常に遅いと感じられるので、 ~~modelsim で動作できないか探ってみようと思います。~~ Modelsimはもっと遅かったです。原因はPLLライブラリがフェムトオーダで動作していることに起因しているようです。結局できるだけダミーのMIGでカバーして、必要になったらフルでシミュレーションするのがよさそうです。