Questa Intel Starterの制限を確認する

# 結論を先に
Questa Intel Starterの制限5,000インスタンスは、**自分で書いたモジュールの実インスタンス数の合計**です。
**モジュールのサイズ(行数)は関係ありません。**
VHDL・Verilog共に`for-generate`によるループでのインスタンスもカウント対象です。
初期インストールされるライブラリ(`altera_mf, lpm`等)はこのカウントに含まれません。
VHDLのパッケージはカウントに含まれません。
# Questa Intel Starterについて
Quartus Lite 21.1から、添付されるHDLシミュレータがModelSimからQuesta 64bitに変更されました。
従来のModelSim Intel Starterはライセンス不要でしたが、Questa Intel Starterはライセンス設定が必要です。
設定方法はマクニカの下記のページを参照して下さい。

* [Questa* - Intel® FPGA Starter Edition ライセンスファイルの取得および設定方法](https://www.macnica.co.jp/business/semiconductor/articles/intel/139706/)

っていうか、IntelのWebにこの辺りの説明が全然無いけど、マクニカのページ無かったら誰も分からないヨ。
# ModelSim Intel Starterとの違い
細かい機能の違いは製品情報を見てもらうとして、最大の違いは規模の制限。

* [Questa* - インテル® FPGA エディション・ソフトウェア](https://www.intel.co.jp/content/www/jp/ja/software/programmable/quartus-prime/questa-edition.html)

どちらもVHDL,Verilog,SystemVerilog混合シミュレーションが可能。
ModelSimより速くなってるらしい、当然ながら有償版に比べて相当な速度制限が掛けられてますが、体感ではVivadoシミュレータより速いです。

| 項目 | ModelSim | Questa |
|:-:|:-:|:-:|
| 性能 | 1.0 | 1.25-2.5  |
| 規模の制限 | 10,000ステートメント | **5,000インスタンス** |
制限にはソフトと同時にインストールされるプリコンパイル済みのライブラリ(altera_mf, lpm等)は含まれません。
大きな違いとして、制限の数え方が**ModelSimの「10,000ステートメント」からQuestaは「5000インスタンス」**に変わってます。
# ModelSimのステートメント数
「ステートメント数」の単位は単純なソースの有効行数とは違うようですが、ソースが大きければステートメント数も多くなります。
手元にある「配列もループもgenerateも知らない人が書いた12倍コピペ」という15,000行の恐ろしいVHDLモジュール`sample_x12`をModelSimでロードすると**`38,779 statements`**と表示され、速度制限がかかるようになります。
ログを見ると`work.sample_x12`以外のモジュールはロードされていないので、この15,000行のモジュールはModelSimでは38,779ステートメントに相当し、ModelSim Intel Starterの制限10,000ステートメントを遙かに超えている事が分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256050/de1e15dd-ff32-dabe-6f0d-fab9e6a3d0c3.png)
このソースから1行ずつコメントアウトしていくと、おおよそ3ステートメントずつ減っていきます。
元の38,779ステートメントを1/3で換算すると約13,000行になりますので、全体の15,000行に対してまあまあ妥当な数字に見えます。
という事は、**ModelSimの10,000ステートメント制限はソースの有効行3,333行に相当する**と想定されます。
自分で書いたソースの合計が3,333行という事で、小さなFPGAでも全体をロードすると簡単に到達しそうですね。

初期インストールされるライブラリはカウントされないので、例えばRAM・ROMをHDLから推論させるようなコードはステートメント数を消費するので不利になり、`altera_mf`等のライブラリをインスタンスした方がお得と言えます。
## ループでインスタンスした場合のステートメント数
先の15,000行のVHDL`sample_x12`をループと配列を使って書き直した`sample`は**たったの400行**になり、もちろん10,000ステートメントの制限はクリアできます。(FPGA実機へのフィット結果は同等)
ステートメント数は制限を超えないと表示されないので、どれだけ小さくなったのかこれでは分かりません。

そこで、モジュール`sample`を以下のように`top`で`for-generate`を使って50個インスタンスすると、11,800ステートメントと表示されましたので、`sample`は236ステートメントと考えられます。
**38,779→236ステートメント**と、1%未満になってしまったので大丈夫か不安ですが、先述の通りFPGA実機へのフィット結果が同じなので機能は満たせています。

```VHDL:top.vhd
  gen_loop: for I in 1 to 50 generate
    sample_i: entity work.sample
    port map (...);
  end generate;
```
この事から、ModelSimのステートメント数はコンパイルしたユニークな行数ではなく、実際にインスタンス化した行数の合計という事が分かります。
# Questaのインスタンス数
ModelSimでは38,779ステートメントで制限を超えた`sample_x12`をQuestaでロードしてみると、制限に関するメッセージは表示されず通常の速度で実行可能です。
Questaでは**本当にソースの行数は関係ない**事が分かります。

今度は`top`で5,000回ループでインスタンスしてみます。
すると、`5001 non OEM instances`と表示されエラーになりました。
`top`が1個、`top`で`sample_x12`を5,000個インスタンスするので合計5,001個ですので、計算通りです。
**ModelSimとは違い、Questaではエラーなので実行できません。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256050/52cd6938-a51a-740e-39c3-5226d071ed46.png)
`top`でのループ回数を4,999に変更して合計がちょうど5,000個になるようにすると、正常にロードされ実行も出来ます。
計算すると、**38,779ステートメント×4,999個＝193Megaステートメント！！**でもQuestaでは実行可能です。

次は`sample_x12`を5,000個に戻し、`top`に追加でOEM instanceである`lpm_inv`のインスタンスを5,000個追加してみます。
結果は5001インスタンスのまま変わりませんでした。当然ですね。

```VHDL:top.vhd
  gen_loop: for I in 1 to 5000 generate  --5000個インスタンスする
    inv_i: entity lpm.lpm_inv  --lpm_invはOEMインスタンスなのでカウントされないはず
    generic map (...)
    port map (...);

    sample_x12_i: entity work.sample_x12 --自分のモジュールはカウント対象
    port map (...);
  end generate;
```
ちょうど5,000インスタンスのsimウインドウの表示
黄色マーカーがカウント対象インスタンス
緑色はOEMインスタンスなのでカウントの対象外
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256050/0711117a-27ac-69c4-9c15-ec35e5a62802.png)

4998～4999番目のインスタンス表示
水色のOEMでないVHDLパッケージ`common_pkg`もロードされているが、パッケージは対象外
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256050/7f105f16-3913-9eb5-5671-6d6684bf7e94.png)
# まとめ
Questa Intel Starterの5,000インスタンス制限は、自分で書いたモジュールを実際にインスタンス化した数の合計です。
モジュールの行数は関係ありません。
という訳で、無償版でも相当大きなデザインがシミュレーションできる事になります。
自分で書いたモジュール合計が5000個って、ちょっと想像できないな…[^1]

これまでQuartusの無償版では、ModelSimの10,000ステートメント制限がシミュレーションの懸案事項だったのですが、完全に解消されましたね。
これは非常に嬉しい。なんと言っても、ただでQuestaが使えるなんて、夢のようだわ。
Xilinxが混合言語に対応したVivadoシミュレータを無償版でも機能制限無し[^2]で出しているので、これに対抗したのかもしれません。

[^1]: ここだけの話、現時点でシミュレータが無い某G社のFPGAライブラリを自前でコンパイルしても大丈夫な気がする…
[^2]: 機能制限無しと言っても、そもそも実装されてる機能がそんなにある訳じゃ無いんだけど…