このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
HDL クロックとリセットを Simulink サンプル時間と関連付ける
この例では、Simulink® サンプル時間と HDL クロックおよびリセットの関係を示します。この例では、HDL Verifier™ を使用して同期 Verilog パリティ チェック モジュールをコシミュレートします。例には次の内容も含まれています。
HDLシミュレータ(ModelSim®またはXcelium™)のデルタタイム反復がコシミュレーション結果にどのように影響するかを説明します。
HDL コシミュレーション ブロックのクロック ペインを使用して HDL でクロック信号を駆動する方法を示します。
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 コシミュレーション ブロックとそれと同等の Simulink アルゴリズムを通じて HDL コードに入力データを提供します。スコープは、出力を表示し、結果を比較するために使用されます。このモデルは、Simulink サンプリング レートが HDL モジュールとのコシミュレーションにどのように影響するかを示しています。クリック可能な注釈を使用して、HDL コシミュレーション ブロックの出力ポート (Tout) のサンプル時間を変更できます。
テスト対象の設計のクロックとリセット入力は、HDL ドライバ モジュール (paritychecker_clk_driver.v) 内で生成されることに注意してください。リセットは最初の 16ns の間はハイに保持され、その後はローになります。クロックの周期は 8ns で、最初の立ち上がりエッジが 4ns で発生するように設定されています。したがって、モジュールは最大 8ns の速度、つまりクロックの立ち上がりエッジごとに出力を更新できます。
1.ModelSimまたはXceliumを起動します
モデルを実行する前に、まず HDL シミュレーターを起動する必要があります。これには、モデル内で提供される起動コマンドを使用します。
2. HDLコシミュレーションブロックのポートペイン内の設定を確認します
HDL コシミュレーション ブロックをダブルクリックして、コシミュレーション パラメータを編集します。ブロック パラメータ ダイアログが表示されます。[ポート] タブを選択します。
出力ポート(
parity_out1
)のサンプル時間はToutに設定されます。Tout の値を指定する方法は多数あります。モデルのPreLoadFcn
コールバック内から Ts の初期値を設定しました (モデルのコールバックの作成 (Simulink) を参照)。モデルで提供されるクリック可能な注釈のいずれかを使用して、Tout の新しい値を設定します。Tout の値は、MATLAB® コマンド プロンプトでも設定できます。
直接フィードスルーを許可するオプションがチェックされていないことに注意してください。これは、Verilog コードが純粋な組み合わせではないためです。
モデルには、HDL コシミュレーション ブロックの出力ポートのサンプリング時間 (Tout = 32ns、8ns、4ns) を設定するための 3 つのクリック可能な注釈が用意されています。
3. Tout の3つのバージョンすべてでモデルを実行します。
Tout = 32ns
HDLモジュールの出力は32nsごとにSimulinkでサンプリングされます。
出力ポートのサンプリングレートはクロックレートよりも低く、Tout = 4x(HDLクロック周期)
HDLコシミュレーションブロックの出力はアンダーサンプリングされており、その結果、HDLシミュレータ内の
parity_out1
信号はSimulinkスコープ結果と一致しません。
Tout = 8ns
HDLモジュールの出力は8nsごとにSimulinkでサンプリングされる
出力ポートのサンプリングレートはクロックレートと完全に一致します。Tout = (HDLクロック周期)
出力は欠落しておらず、比較波形は一致している
Tout = 4ns
HDLモジュールの出力は2nsごとにSimulinkでサンプリングされる
のサンプリングレートはクロックレートよりも高く、Ts = 0.5x(HDLクロック周期)
出力はオーバーサンプリングされており、出力サンプリングレートを高くしてもここでは何の利益も得られません。
したがって、HDL からの出力をオーバーサンプリングまたはアンダーサンプリングしたくない場合は、同期 HDL モジュールのクロック レートを理解しておくと、コシミュレーションに有利になります。
4.Tout = 8ns のときの Simulink スコープで結果を観察する
Simulink アルゴリズムからの出力は、最初の 24ns (画像では 1 と表示) を除いて、HDL コシミュレーション ブロックから取得された出力 (画像では 2 と表示) と一致していることがわかります。2 つの出力の初期値は、HDL 内で使用されるリセット ロジック (Simulink はこれを認識せず、アルゴリズムに組み込んでいません) が原因で一致しません。これについては、後ほど例の中で詳しく説明します。
HDL モジュールを駆動するクロックの影響と競合状態
Simulink エンジンはデルタ時間サイクルでは動作しないため、Simulink は一定の離散時間間隔で HDL コシミュレーション ブロックの出力ポートを照会することを理解することが重要です。一方、HDL シミュレーターは、値の変更と他のブロッキング信号の割り当ての順序については保証しません。したがって、Simulink 値が HDL のアクティブ クロック エッジと同時に駆動/サンプリングされると、競合状態 が発生します。このような競合状態を回避するには、Simulink 値が HDL のアクティブ クロック エッジと同時に駆動/サンプリングされないことが重要です。
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 コシミュレーション ブロックの便利なクロックを使用してクロッキング入力を生成できます。HDL コシミュレーション ブロックの クロック ペインで、クロック周期 (T) とそのアクティブ エッジを指定できます。HDL コシミュレーション ブロックによって生成されるこのクロックには、競合状態を回避するために、最初のアクティブ クロック エッジ (指定) に意図的な T/2 遅延が適用されます。このクロックの使用方法を示すために、HDL コシミュレーション ブロックによって作成されたクロックを、偶数パリティ チェッカー モジュール (paritychecker_convclk.v) の修正バージョンの駆動信号として使用するモデル parity_check_convclk.slx (ModelSim) と parity_check_convclk_in.slx (Xcelium) を用意しました。
HDL コシミュレーション ブロックのクロック ペインは、次の図のように設定されています。クロックのアクティブ エッジが上昇するように設定されていることに注意してください。
モデルを実行して出力を観察する
結果は例 タイムスケール:絶対的、相対的、自動的 で得られた結果と同じです。HDL シミュレータ波形の出力は、以下の画像に示されています。
clk
の最初のアクティブ エッジに T/2 の初期位相シフトがどのように適用されるかに注目してください (画像ではラベル 1 で示されています)。
リセット遅延を考慮したコシミュレーション結果の比較
Simulink は、HDL モジュールに存在する可能性のあるリセット ロジックを認識しておらず、そのようなリセット ロジックをアルゴリズムに組み込んでいません。したがって、HDL 協調シミュレーションの結果は、Simulink アルゴリズム (サブシステム) に関して同期しなくなります。
ここで、HDL コシミュレーション ブロックの出力を Simulink のアルゴリズムから取得した結果と比較する必要がある場合は、これらのシミュレーションの両方が同期されていることを確認する必要があります。これを実現する方法はいくつかありますが、そのうちの 1 つが parity_check_reset.slx (ModelSim) と parity_check_reset_in.slx (Xcelium) に示されています。
ここでは、HDL Verifier がコシミュレーション リンクをセットアップした直後に、tclstart
引数を使用して HDL シミュレータを 16ns (リセット期間) 実行します。したがって、Simulink でシミュレーションを開始する前に、HDL モジュールは 16ns 実行されます。
モデルを実行し、スコープの出力を観察します
注目すべきポイント:
すべてのポートのサンプル時間とクロック仕様は Simulink 時間です。たとえば、タイムスケールが「Simulink の 1 秒は HDL シミュレータの 1 秒に対応する」に設定されている場合、クロック周期は T = 8ns になります。ただし、タイムスケールが「Simulink の 1 秒は HDL シミュレータの 1ns に対応する」に設定されている場合、クロック周期は T = 8 秒にする必要があります。これは例タイムスケール:絶対的、相対的、自動的で説明されています
クロックペインで生成されたクロックはHDLコードのみを駆動することを目的としています。
TclパネルまたはHDLシミュレータの起動コマンドの
tclstart
から駆動されるすべての信号はHDL時間です。HDLコード内から駆動されるすべての信号はHDL時間内である