Main Content

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

HDL シミュレーターの競合状態

競合状態の回避

ハードウェア シミュレーションにおけるよく知られた問題は、競合状態が存在する場合、実行ごとに異なる結果が生じる可能性があることです。HDL シミュレーターは高度な並列実行環境であるため、結果がプロセスの実行順序に依存しないように HDL を作成する必要があります。

テスト対象のデザインの現実的なシミュレーションを実現するためのよく知られたコーディング手法がありますが、純粋な HDL 環境であっても、テストベンチ/DUT インターフェイスではスティミュラスを適用して結果を読み取る際には常に特別な注意を払う必要があります。Simulink®またはMATLAB®協調シミュレーション セッションなどの HDL/外国語インターフェイスの場合、次のような共通の同期信号がない場合、問題はさらに悪化します。データの流れを調整する時計。

Simulink協調シミュレーション セッションにおける潜在的な競合状態

HDL CosimulationライブラリのSimulinkブロックのインターフェイス上のすべての信号には、それらに関連付けられた固有のサンプル レートがあります。このサンプル レートは、値の変更が発生するシミュレーション時間を制御する暗黙的なクロックと考えることができます。この暗黙的なクロックは HDL エンジンにはまったく知られていない (つまり、HDL 信号ではない) ため、入力値が HDL にドライブされる時間、または出力値が HDL からサンプリングされる時間は、HDL でコーディングされたどのクロックとも非同期です。たとえ名目上同じ周波数であっても、直接。

特定のシミュレーション時間に発生するようにスケジュールされたSimulink値の変更の場合、HDL シミュレーターは、値の変更が他のブロッキング信号の割り当てに対して発生する順序については保証しません。したがって、 Simulink値が HDL のアクティブなクロック エッジと同時に駆動/サンプリングされる場合、競合状態が発生します。

アクティブな HDL クロック エッジと固有のSimulinkアクティブ クロック エッジが同じ周波数にある場合、これらのエッジの 1 つをオフセットすることで、目的のデータ伝播を促進できます。Simulinkサンプル レートは常に時間 0 と一致するため、HDL のアクティブなクロック エッジを時間 0 からシフトすることでこのオフセットを実現できます。HDL でクロック スティミュラスをコーディングしている場合は、遅延演算子 (「after」または「#」) を使用して、このオフセットを実現します。

Tcl の「force」コマンドを使用してクロック波形を記述する場合、最初のアクティブ エッジをゼロ以外の時間に置くだけで済みます。ゼロ以外の値を使用すると、HDL の基本クロック レートと同じSimulinkサンプル レートが許可されます。この例は、時間 0 から 2 ns オフセットされたアクティブな正のエッジを持つ 20 ns のクロック (つまり、 Simulink のサンプル レートも 20 ns ごとになります) を示しています ( で使用する例を示しています) $Xcelium™):

> force top.clk = 1'b0 -after 0 ns 1'b1 -after 2 ns 1'b0
             -after 12 ns -repeat 20 ns

Clock ペインのあるHDL Cosimulationブロックの場合、そのペインでクロック周期とアクティブ エッジを定義できます。波形定義では、時刻 0 に「非アクティブ」エッジが配置され、時刻 T/2 に「アクティブ」エッジが配置されます。この配置により、50% デューティ サイクルのクロックの最大セットアップ時間とホールド時間が設定されます。

Simulink のサンプル レートが HDL クロックとは異なる周波数である場合は、複数の時刻の場合と同様に、HDL とSimulinkの間で信号を同期する必要があります。 - 純粋な HDL のドメイン設計。たとえば、インターフェイスに 2 つの同期フリップフロップを配置できます。

協調シミュレーションにクロックが含まれていない場合は、 Simulinkと HDL コードのインターフェイスを非同期時間ドメイン間にあるものとして扱う必要もあります。すべてのデータ遷移がキャプチャされていることを確認するには、出力をオーバーサンプリングする必要がある場合があります。

MATLAB協調シミュレーション セッションの潜在的な競合状態

-sensitivity-rising_edge、または-falling_edgeスケジュール オプションをmatlabtbまたはに使用する場合matlabcpがMATLAB関数呼び出しをトリガーする場合、値の伝播は純粋な HDL デザインと同じセマンティクスに従います。結果を計算する前にトリガーが発生する必要があります。競合状態が存在する可能性はありますが、それらは HDL 内だけで分析できます。

ただし、 -timeスケジュール オプションをmatlabtbまたはmatlabcp内でtnextを使用する場合は、 MATLAB関数自体、信号値の駆動または信号値のサンプリングは、HDL 信号の変更に関連して保証されません。時間ベースのスケジューリングにおける潜在的な競合状態は、HDL エンジンにとって未知であり、HDL コードを見ただけでは見えない暗黙のクロックのようなものであるかのようです。

解決策はSimulink信号インターフェイスの場合と同じです。信号のサンプリングと駆動がMATLAB関数呼び出しと同じシミュレーション時間に発生しないようにしてください。 。

参考文献

純粋な HDL 環境での競合状態を含む、テストベンチや外国語から設計をインターフェースする際の問題はよく知られており、広範囲に文書化されています。これらの問題を説明するテキストには次のようなものがあります。

  • 各ベンダーの HDL シミュレータ製品のドキュメント

  • HDL標準仕様

  • テストベンチの作成:HDL モデルの機能検証、Janick Bergeron、第 2 版、© 2003

  • Verilog と SystemVerilog の注意事項、Stuart Sutherland および Don Mills、© 2007

  • 検証用の SystemVerilog:テストベンチの言語機能を学習するためのガイド、Chris Spear、© 2007

  • 「検証可能な RTL 設計の原則」、ライオネル ベニング、ハリー D. フォスター、© 2001