私が最近行ったことは、シミュレーション環境とホスト システム間のインターフェイスを作成することです。異なる hdl シミュレーターには異なるインターフェイスがあり、シミュレーターを従来のシミュレーション モデルであるバッチ モードではなく、実際の設計のように永久に実行することが問題の半分です。
次に、C (または何でも) を使用してホストから抽象化を作成できます。これにより、どのターゲットに対してもアプリケーション ソフトウェアを作成できる場合とできない場合があります (使用している言語とコンパイラの機能によって異なります)。たとえば、一般的な poke と peek 関数を作成し、最終的なターゲットに実際に poke と peek メモリまたは I/O を持たせることができますが、抽象化によるシミュレーションでは、同じメモリ サイクルをシミュレートするシミュレーションでテストベンチと対話します。
さらに一歩進んで、ホストとテスト ベンチの間に (Berkeley) ソケットを使用して、ホスト アプリケーションが停止および開始している間もシミュレーションを実行し続けることができるようにしました。アプリケーションを起動し、それらを最後まで実行し、別のアプリケーションを起動する OS を備えた実際のプロセッサを持っているのと同じです。少なくともテスト アプリケーションの場合、配信用のアプリはおそらく 1 つだけです。
これらの抽象化レイヤーを作成することで、ビルド時にターゲットで使用される実際のアプリケーションを作成できます。最初にロジックのソフトウェア シミュレーションを使用する方法に沿って、抽象化インターフェイス (ロジックを捨てる) を使用して fpga を構築したい場合は、uart などを言います。アプリケーション抽象化レイヤーとシミュレーターの間のシムを uart インターフェイスなどに置き換えます。次に、プロセッサとロジックを同じチップまたは同じボードに結合するときは、抽象化レイヤーを、対話しているにもかかわらず常に持っているインターフェイスへの直接呼び出しに再度置き換えます。何かが壊れて抽象化レイヤーを保持している場合は、アプリケーションをシミュレーション モデルに戻して、すべてのロジック内部にアクセスできます。
具体的には、今回は sourceforge にある hdl 言語の循環 cdl を使用しています。ドキュメントには多少の助けが必要ですが、例を参照するとうまくいくかもしれません。また、合成可能な Verilog が生成されるため、さらに有利になります。私は、C シミュレーション モデルを接続して開始するために最低限必要なスクリプト以外のすべてのスクリプト バッチを破棄しました。したがって、私のテスト ベンチは C (技術的には C++) であり、ソケット レイヤーはそこで行われました。出力は、gtkwave が使用する .vcd ファイルにすることができます。基本的に、オープン ソース ソフトウェアを使用して HDL 設計の大部分をライセンスなしで行うことができます。CDL シミュレーション部分に 1 行または 2 行のコードを追加することで、無限ループとして実行することができました。これは機能していると言えます。まあ、メモリリークなどはないようです。
modelsim と cadence の両方が、ホスト C プログラムをシミュレーションの世界に接続する方法を標準化しており、そこから IPC を使用して、抽象化レイヤー API と通信するホスト アプリケーションにアクセスできます。
これはおそらく写真のやり過ぎです。とにかく、より高速でCフレンドリーなアームベースのマイクロのために、しばらく前に写真をあきらめました。ここでやろうとしていることではありませんが、シミュレーションに簡単に組み込むことができるオープンコアの写真があります/ありました。