日本ロジック設計    - VHDL ロジック記述サンプル -


TOPページ 


忘れがちな定番記述、Vivado 使用時の注意点等


  AI学習禁止
  無断転載禁止
  免責事項: 当サイトの情報を元に取った行動の結果について、一切の責任を負いません
  No unauthorized reproduction or AI training allowed.
  Unauthorized reproduction prohibited.
  Disclaimer: We are not responsible for any actions taken based on the information on this site.
  (C) 2025 JAPAN LOGIC DESIGN 日本ロジック設計


 ●下位ブロックを呼び出す際の「未使用信号」の処理 [VHDL]
  コンポーネントで定義していた信号を、インスタンス化する際に未使用にする記述。

[picture:tips_0001]


 ●ベクトル信号の 0 RESET記述 [VHDL]
  半端なビット数の 0 記述より、others 記述がすっきりする。

[picture:tips_0002]


 ●オープンドレイン出力ピンの記述 [VHDL][MODELSIM][VIVADO]

[picture:tips_0004]


 ●I2Cインターフェイスなどで、PULL-UPを使う場合の記述 [VHDL][MODELSIM][VIVADO]

[picture:tips_0003]


 ●XDCファイルで PULL-UP を指定している場合の VIVADOシミュレーションの注意 [VHDL][VIVADO]
  MODELSIM と VIVADOシミュレーションとで結果が食い違う原因の一つとして、XDCファイルでの PULL-UP 指定がある。
  VIVADOシミュレーションでは、XDCファイルで内蔵 PULL-UP を指定した際、
  ビヘイビアモデルのシミュレーションで信号が 「不定」 扱いになり、うまくシミュレーションできない場合がある。
   ※RTL記述ロジックでは問題ない。
   ※MODELSIM ではそもそも XDCファイル指定が無いため問題ない。
  事例としては、
   ・シミュレーションが通り、納品
   ・顧客から PULL-UPの追加を依頼され、XDCフィルで PULL-UP指定を追加
   ・シミュレーションが通らなくなる
  など。
  テストベンチで外部から明確に '0' を入力しても「不定」扱いとなってしまうため、シミュレーション結果が異なってしまう。
  対策として、上記「I2Cインターフェイス」と同様、'H' '1' 共に '1'と認識する記述を追加するのが確実。

[picture:tips_0014]


 ●複数ファイルで配列定義を共有する記述方法 [VHDL]
  配列(array)定義を複数のファイルで共有したい場合は、配列(array)定義を独立したファイルで作成し、
  他のファイルには use WORK.TYPES.all を記述する方法がすっきりする。
  注意点として、ModelSim では、配列定義ファイルを先にコンパイルする必要がある。(コンパイルの順番がシビア)

[picture:tips_0007]


 ●シミュレーション波形にタイトルを付ける [VHDL][MODELSIM][VIVADO]
  シミュレーション時、単に波形を表示するだけでは何のテストを行っているのかわかりにくいため、
  タイトルを付けると見やすくなる。

[picture:tips_0011]

  タイトルを付けるには、タイトル用の string 変数を定義し、必要な場所で文字列を設定すればよい。
  シミュレーション時に、定義した string 変数を WAVE に追加しておく。
  なお、文字数は string 定義と合わせる必要があるため、文字数が少ない場合は残りをスペースで埋める。
  この記述は、MODELSIM/VIVADOシミュレーション共通で使用可能。

[picture:tips_0012]


 ●ModelSim/Vivadoシミュレーションのテストベンチ記述を共通化する方法 [VHDL][MODELSIM][VIVADO]
  テストベンチの記述を共通化するポイントは以下の通り。
  詳細な記述例は、本サイトで公開されている各サンプルを参照のこと。

[picture:tips_0005]


 ●補足-1: Vivado のシミュレーションの違い
  Vivado でのコンパイル/回路配置完了後のシミュレーションには
   ・post-implementation functional simulation (論理シミュレーション)
   ・post-implementation timing simulation (タイミングシミュレーション)
  の2種類がある。

[picture:tips_0009]

  この2つは、本来なら同じシミュレーション結果になる必要がある。
  もし結果が異なる場合は、タイミングが間に合っていない可能性があり、対策を検討しなければならない。

  なお、制約ファイル(xxxxx.XDC) にて、入力信号のタイミング記述を忘れていると、
  クロックエッジよりも僅かに遅い入力信号をラッチしてしまい(論理シミュレーションでは次のクロックでラッチ)
  シミュレーション結果が異なる場合がある。
  入力信号のラッチタイミングで食い違いが出た場合は、制約ファイルを確認するとよい。

  また、まれにコンパイラの最適化時のバグなどで結果が異なる場合もある。
  分周回路にて、分周比を1/2で動作させているにもかかわらず、分周カウンターが4bitで記述されているなど、
  余分なビットの記述があると最適化時に不具合が出ることがある。
  テストベンチにて、実行クロック数の期待値チェックを入れておくと不具合を検出できる可能性が上がる。

  タイミングシミュレーションは実行に時間が掛かるため頻繁に行うと効率が悪いが、
  ある程度作業が進んだら、2つが同じ結果になるか確認することを勧める。


 ●補足-2: Vivado シミュレーションのフリーズ
  Vivado バージョン 2025.1.1 (2025.11.04 現在)にて、シミュレーション中にフリーズする現象が発生することがある。
  正確にはフリーズではなく、永遠とシミュレーションが終わらない現象。
  シミュレーション時にタスクマネージャーを実行しておくと、CPU使用率がほぼ0になり、そのまま待っていると永遠に終わらない。
  なお、「Cancel」ボタンは効くため強制終了は可能。

[picture:tips_0010]

  対策として、一度VIVADOを終了し、キャッシュ関連ディレクトリ/シミュレーション関連ディレクトリの2つを削除し、
  再度コンパイル/シミュレーションを実行すればうまくいく場合がある。
[picture:tips_0013]

  これでもダメな場合は、プロジェクトに関する全ファイルを全て消去し、新規にプロジェクト作成しなおす。
  ※保証は無い