Main Content

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

HDL シミュレータにおける競合状態

競合状態を回避する

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

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

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

Simulink ライブラリの HDL Cosimulation ブロックのインターフェース上のすべての信号には、固有のサンプル レートが関連付けられています。このサンプル レートは、値の変更が発生するシミュレーション時間を制御する暗黙的なクロックと考えることができます。この暗黙的なクロックは 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

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

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

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

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

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

ただし、-time スケジューリング オプションを matlabtb または matlabcp に使用する場合、または MATLAB 関数自体内で tnext を使用する場合、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 設計の原則、Lionel Bening および Harry D. Foster、© 2001