Modelsim で d フリップフロップの VHDL コードを書いていますが、シミュレーションしようとするとエラーが発生します。
エラー: (vsim-3601) 時間 400 ps で反復制限に達しました。
それが何を意味するのかはわかりませんが、ソース コードの多くにエラーがないか調べましたが、成功しませんでした。誰が問題が何であるかを推測できますか?
このエラーは通常、ModelSim が無限ループに陥っていることを示しています。VHDL では、信号がセンシティビティ リストに配置され、この信号がプロセスで変更された場合に発生する可能性があります。シグナルが変化し、プロセスがトリガーされ、プロセスがシグナルを変更し、プロセスが再びトリガーされ、サイクルが継続します。
以下は、無限ループを引き起こすプロセスの簡単な例です。
PROCESS (count)
BEGIN
count <= not count;
END PROCESS;
反復制限に達した場合、それはシステムが安定していないことを意味します。ほとんどの場合、次のようなものです。
a <= b;
--- and then later...
b <= a;
ほとんどの人が VHDL やその他の HDL 言語で抱えている問題の 1 つは、これがシーケンシャル コードではないことを理解していないことです。プロセス内にあるすべてのものは並行して発生します。Ahmed の例は良い例です。
PROCESS (count)
BEGIN
count <= not count;
END PROCESS;
HDL シミュレーターは、各シミュレーション ティックの後にカウントの値を「カウントしない」に設定しようとします。カウントの値が変更され、クラッシュするか上記の状態になるまで継続するため、変更によって別のティックがトリガーされます。問題。
HDL が適切に機能するには、遅延をクロックの形式で使用するか、合成用でない場合は実際の値の遅延を使用する必要があります。
上記のコードを
PROCESS (count)
BEGIN
count <= not count after 1 ns;
END PROCESS;
シミュレーションは機能し、カウントは 1 ns ごとにトグルします。
ループが表示されるまで、コードとシングルステップにブレークポイントを追加する必要があります。もう1つの手法は、おそらくより生産的ですが、反復と感度リストを詳しく調べた優れたコードレビューです。
述べたように、問題は信号が安定していないことです。可能性のある問題は、2 つの組み合わせロジック信号が継続的に置き換えられることですが、後世のために強調したい他の可能性がいくつかあります。
ザイリンクスのアンサー レコード #19068に記載されているように、センシティビティ リストの信号を変更するプロセスが原因である可能性もあります。
ここで私の問題を最終的に解決したもう1つのチェックは、シミュレーションの解像度が十分に小さいことを確認することでした。私の場合は桁違いに高すぎ、テスト ベンチのクロックは 1 つのシミュレーション ステップで何度も実行されていました。