Main Content

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

HDL クロックおよびリセットとSimulinkサンプル時間の関係

この例では、 Simulink®サンプル時間と HDL クロックおよびリセットの関係を示します。この例では、 HDL Verifier™を使用して同期 Verilog パリティ チェック モジュールを協調シミュレーションします。この例には次のものも含まれています。

  • HDL シミュレーター (ModelSim® または Xcelium™) でのデルタ時間反復がコシミュレーション結果にどのように影響するかを説明します。

  • HDL でクロック信号を駆動するための HDL Cosimulation ブロックの [クロック] ペインの使用方法を示します。

  • HDL リセット ロジックの遅延を考慮して、協調シミュレーションの結果を正確に比較する方法を示します。

協調シミュレーションに使用される Verilog コード

パリティ チェックは、データのエラーをチェックするためにデータ ストリームにパリティ ビットを追加する方法です。この例では、「偶数パリティ ビット」スキームを使用します。HDL モジュールは同期するように設計されており、クロックの立ち上がりエッジごとにその状態を更新します。

同期パリティ チェッカー モジュール (paritychecker_clk_dut.v) は 8 ビット入力を受け入れ、1 つの偶数パリティ ビットを出力し、クロックの立ち上がりエッジごとに駆動されます。

協調シミュレーションにおけるSimulinkサンプル時間の変更の影響

ModelSim または QuestaSim を使用している場合は、モデルparity_check_clk.slxが開いている必要があります。Xcelium を使用している場合は、ModelSim モデルを閉じて、モデルparity_check_clk_in.slxを開きます。

このモデルでは、8 ビット カウンターを使用して、HDL Cosimulation ブロックおよび同等のSimulinkアルゴリズムを通じて HDL コードに入力データを提供します。スコープは、出力を表示し、結果を比較するために使用されます。このモデルは、 Simulink のサンプリング レートが HDL モジュールとのコシミュレーションにどのような影響を与えるかを示しています。クリック可能な注釈を使用して、HDL Cosimulation ブロックの出力端子 (Tout) のサンプル時間を変更できます。

テスト対象デザインのクロック入力とリセット入力は、HDL ドライバー モジュール (paritychecker_clk_driver.v) 内で生成されることに注意してください。リセットは最初の 16ns の間 High に保持され、その後 Low になります。クロックの周期は 8ns で、最初の立ち上がりエッジが 4ns で発生するように設定されています。したがって、モジュールは最大 8ns のレート、つまりクロックの立ち上がりエッジごとに出力を更新できます。

1.ModelSim または Xcelium を起動する

モデルを実行する前に、まず HDL シミュレーターを起動する必要があります。これには、モデル内で提供される起動コマンドを使用します。

2.HDL Cosimulation ブロックの [ポート] ペイン内の設定を確認します

HDL Cosimulation ブロックをダブルクリックして、コシミュレーションパラメーターを編集します。[ブロックパラメーター]ダイアログが表示されます。「ポート」タブを選択します。

  • 出力ポート (parity_out1) のサンプル時間は Tout に設定されます。Tout の値を指定するには、さまざまな方法があります。モデルのPreLoadFcnコールバック内から Ts の初期値を設定しました ( モデルのコールバックの作成 (Simulink)を参照)。モデルで提供されているクリック可能な注釈のいずれかを使用して、Tout の新しい値を設定します。Tout の値は、 MATLAB®コマンド プロンプトでも設定できます。

  • 直接フィードスルーを許可するオプションがチェックされていないことに注意してください。これは、Verilog コードが純粋に組み合わせではないためです。

このモデルには、HDL Cosimulation ブロックの出力端子のサンプリング時間 (Tout = 32ns、8ns、および 4ns) を設定するための 3 つのクリック可能な注釈が用意されています。

3.Tout の 3 つのバージョンすべてでモデルを実行する

Tout = 32ns

  • HDL モジュールの出力はSimulinkによって 32ns ごとにサンプリングされます

  • 出力ポートのサンプリング レートはクロック レートより低く、Tout = 4x(HDL クロック周期)

  • HDL Cosimulation ブロックの出力はアンダーサンプリングされており、その結果、HDL シミュレーター内のparity_out1信号はSimulinkスコープの結果と一致しません。

Tout = 8ns

  • HDL モジュールの出力はSimulinkによって 8ns ごとにサンプリングされます

  • 出力ポートのサンプリング レートはクロック レートと完全に一致します。Tout = (HDL クロック周期)

  • 出力の欠落はなく、比較波形は一致します。

Tout = 4ns

  • HDL モジュールの出力はSimulinkによって 2ns ごとにサンプリングされます

  • のサンプリング レートはクロック レートよりも高く、Ts = 0.5x(HDL クロック周期)

  • 出力はオーバーサンプリングされており、出力サンプリング レートが高くてもここでは利益が得られません。

したがって、HDL からの出力をオーバーサンプリングまたはアンダーサンプリングしたくない場合は、同期 HDL モジュールのクロック レートを理解することがコシミュレーションに有利になる可能性があります。

4.Tout = 8ns の場合のSimulinkスコープで結果を観察する

Simulinkアルゴリズムからの出力は、最初の 24ns (画像内で 1 とラベル付け) を除き、HDL Cosimulation ブロックから取得した出力 (画像内で 2 としてラベル付け) と一致していることがわかります。HDL 内で使用されるリセット ロジック ( Simulink は認識せず、アルゴリズムに組み込んでいない) が原因で、2 つの出力の初期値は一致しません。これについては、後の例で詳しく説明します。

HDL モジュールを駆動するクロックの影響と競合状態

Simulinkエンジンはデルタ時間サイクルでは動作しないため、 Simulink は明確な離散時間間隔で HDL Cosimulation ブロックの出力端子をクエリすることを理解することが重要です。一方、HDL シミュレータは、値の変更と他のブロッキング信号の割り当ての順序については保証しません。したがって、 Simulink値が HDL のアクティブなクロック エッジと同時に駆動/サンプリングされる場合、競合状態 が発生します。このような競合状態を回避するには、HDL のアクティブなクロック エッジと同時にSimulink値が駆動/サンプリングされないことが重要です。

Verilog コードparitychecker_clk_driver.vでは、潜在的な競合状態を回避するために、クロックのポジティブ エッジ (アクティブ エッジ) が周期の半分だけ意図的にオフセットされていることに注目してください。

24ns遅延の場合

Verilog コードは、モジュールが最初の 16ns でリセットされるように駆動されます。ただし、 Simulinkスコープで見られる出力の不一致は 24ns です。この遅延が発生する理由をよりよく理解するために、シミュレーションを Tout=8ns で実行したときの HDL シミュレーター波形 (デルタ時間遅延と拡張されたイベントを含む) のスナップショットをキャプチャしました。

16ns の時点で、HDL シミュレーター内の出力parity_out1 はまだ以前の状態を保持しています。これは、出力がクロックの立ち上がりエッジでのみ変化するようにスケジュールされているためです。したがって、 Simulink は16ns で出力の前の状態をサンプリングします。また、 Simulinkで Ts=Tout=8ns と設定したとしても、 Simulinkエンジンは HDL シミュレーターがデルタ時間反復をどのように実行するかを認識していないことにも注意してください。したがって、出力は、上の図に示されているデルタ時間範囲(1 のラベル) 内でSimulinkによってサンプリングできます。

「便利な時計」

HDL モジュール用に独自のドライバー コード (テストベンチ) を作成する代わりに、HDL Cosimulation ブロックのコンビニエンス クロックを使用してクロッキング入力を生成できます。HDL Cosimulation ブロックの Clocks ペインでクロック周期 (T) とそのアクティブ エッジを指定できます。HDL Cosimulation ブロックによって生成されるこのクロックには、競合状態を避けるために、最初のアクティブなクロック エッジ (指定) に意図的な T/2 遅延が適用されます。このクロックの使用方法を示すために、HDL コシミュレーション ブロックによって作成されたクロックを使用するモデルparity_check_convclk.slx (ModelSim) およびparity_check_convclk_in.slx (Xcelium) を提供しました。偶数パリティ チェッカー モジュールの修正バージョン (paritychecker_convclk.v) の駆動信号として使用されます。

HDL Cosimulation ブロックの [Clocks] ペインは、次の図のように設定されています。クロックのアクティブ エッジがどのように立ち上がりに設定されているかに注目してください。

モデルを実行して出力を観察する

結果は、例Timescales: Absolute, Relative and Automaticで得られたものと同じです。HDL シミュレーター波形の出力は、以下の画像にキャプチャされています。

T/2 の初期位相シフトがclkの最初のアクティブ エッジにどのように適用されるかに注目してください (画像内のラベル 1 で示されています)。

協調シミュレーション結果を比較するためのリセット遅延の考慮

Simulink は、 HDL モジュールが適切に備えているリセット ロジックについては認識しておらず、アルゴリズムにそのようなリセット ロジックを組み込んでいません。したがって、HDL コシミュレーションの結果は、 Simulinkアルゴリズム (サブシステム) と同期しません。

ここで、HDL Cosimulation ブロックの出力を Simulink のアルゴリズムから取得した結果と比較する必要がある場合は、これらの両方のシミュレーションが同期していることを確認する必要があります。これを実現するにはいくつかの方法があり、そのうちの 1 つをparity_check_reset.slx (ModelSim) およびparity_check_reset_in.slx (Xcelium) に示します。

ここでは、 tclstart引数を使用して、 HDL Verifier が協調シミュレーション リンクを設定した直後に HDL シミュレーターを 16ns (リセット期間) 実行します。したがって、HDL モジュールはSimulinkでシミュレーションを開始する前に 16ns 実行されます。

モデルを実行してスコープの出力を観察する

メモ:

  • すべての端子のサンプル時間とクロック仕様はSimulink時間です。たとえば、タイムスケールが「 Simulinkの 1 秒が HDL シミュレータの 1 秒に対応する」に設定されている場合、クロック周期は T=8ns である必要があります。ただし、タイムスケールが「 Simulinkの 1 秒が HDL シミュレーターの 1ns に対応する」に設定されている場合、クロック周期は T=8 秒である必要があります。これについては、 Timescales: Absolute, Relative and Automaticの例で説明します。

  • クロック ペインで生成されるクロックは、HDL コードのみを駆動することを目的としています。

  • Tcl ペインまたは HDL シミュレーターの起動コマンドのtclstartから駆動されるすべての信号は HDL 時間です

  • HDL コード内から駆動されるすべての信号は HDL 時間です