Main Content

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

手書きの HDL コードと生成された HDL コードの組み合わせを検証する

この例では、HDL コシミュレーションと FPGA インザループ (FIL) シミュレーションを使用して、生成された HDL コードとレガシー HDL コードで構成される HDL デザインを検証します。ここでの「レガシー」という用語は、手書き、サードパーティから購入、または別のプロジェクト用に生成され、この設計で再利用するために保存されたコードを示すために使用されます。

この例のレガシー コードは、無線通信システムでの使用を目的とした多入力多出力 (MIMO) デコーダのサブモジュールである有限状態マシン (FSM) を実装しています。MIMO デコーダーの大部分はSimulinkで開発されており、その HDL コードはHDL Coderによって生成されます。FSM はSimulink設計の内部に属します。FSM のレガシー コードはSimulinkモデルと統合され、コード生成プロセスを通じて FPGA 実装に組み込まれます。

この例では、設計者または検証エンジニアがHDL Verifierコシミュレーション ウィザードを使用してレガシー FSM をSimulinkモデルと統合し、検証する方法を示します。HDL コシミュレーションは完全な可視性と制御を提供し、コードのデバッグと検証を可能にします。

レガシー FSM の統合が成功すると、 Simulinkモデルから HDL コードが生成されるときにコシミュレーション ブロックにレガシー コードが自動的に組み込まれ、MIMO デコーダーの完全な FPGA 実装が実現します。最後に、FPGA インザループを使用して、デザイン全体が実際の FPGA 上で検証されます。

例の概要

  1. 協調シミュレーション ウィザードを使用して従来の HDL コードをSimulinkモデルにインポートする

  2. 従来の HDL コードを協調シミュレーションし、結果を動作モデルと比較することで検証します。

  3. ブラックボックス内の協調シミュレーション ブロックを使用して、MIMO デコーダー全体の HDL コードを生成する

  4. FPGA インザループを使用して MIMO デコーダを検証する

要件と前提条件

協調シミュレーションと FPGA インザループには、次のソフトウェアとハ​​ードウェアが必要です。

  • サポートされている HDL シミュレーターの 1 つ。サポートされているシミュレータについては、 協調シミュレーションの要件を参照してください。

  • FPGA設計ソフトウェア

  • サポートされている FPGA 開発ボードの 1 つ。サポートされているハードウェアについては、 FPGA検証用にサポートされているFPGAデバイスを参照してください。

  • イーサネットを使用した接続の場合:ホスト コンピュータにインストールされたギガビット イーサネット アダプタ、ギガビット イーサネット クロスオーバー ケーブル

  • JTAGを使用した接続の場合:Intel FPGA ボード用の USB Blaster I または II ケーブルおよびドライバー。Digilent® JTAG ケーブルおよびザイリンクス FPGA ボード用ドライバー。

MATLAB®および FPGA 設計ソフトウェアは、ローカルのコンピューターにインストールすることも、ネットワークでアクセス可能なデバイスにインストールすることもできます。ネットワークからのソフトウェアを使用する場合は、FPGA 開発ボードにプライベート ネットワークを提供するために、コンピュータに 2 番目のネットワーク アダプタをインストールする必要があります。ネットワーク アダプターのインストール方法については、お使いのコンピューターのハードウェア ガイドとネットワーク ガイドを参照してください。

メモ: この例にはコード生成が含まれています。HDL Coderソフトウェアにアクセスできない場合は、この例のコード生成手順をスキップし、提供された HDL ファイルと FIL ウィザードを使用して、FPGA インザループでシミュレーションできます。

有限状態マシンの参照モデルを作成する

参照モデルは、実装に期待される動作のシミュレーション モデルです。通常、RTL 実装と並行してインスタンス化し、両方に同じ入力を与えて出力を比較することにより、HDL 検証で使用されます。検証における参照モデルの利点は、実装とは独立して (多くの場合、別の人によって) 開発でき、予想される動作を独立して検証できること、実際の実装よりも作成が簡単である (合成や実際のデバイスのタイミングが必要ない) ことです。 )、通常、シミュレーションでは高速に実行されます。

この例のレガシー HDL コードを検証する最初のステップは、設計のその部分の参照モデルを作成することです。それはFSMではすでに行われています。Behavioral_mimo.slx モデルを開きます。MIMO Decoder サブシステムをダブルクリックすると、FSM サブシステムに FSM の動作を実装するMATLAB関数ブロックが含まれていることがわかります。この参照モデルは、FSM のレガシー HDL コードを検証するために使用されます。

1. コシミュレーション ウィザードを使用してレガシー HDL コードをインポートする

MATLABコマンド プロンプトで次のように入力して、協調シミュレーション ウィザードを呼び出します。

cosimWizard

ドロップダウン リストからSimulinkと好みの HDL シミュレーターを使用した HDL コシミュレーションを選択します。HDL シミュレーターがシステム パス上にない場合は、パスを指定して [次へ] をクリックします。

cosimWizard の [追加] ボタンを使用して FSMSubsystem.vhd、FSMSubsystem_pkg.vhd、および Embedded_Controller.vhd ファイル (「verify_legacy_hdlsrc」フォルダーにあります) を追加し、リストの順序を変更して、FSMSubsystem.vhd がリストの一番下に、FSMSubsystem_pkg.vhd がリストの一番上に配置されるようにします。 、正しいコンパイル順序のために。次に、「次へ」をクリックします。

次の 2 つのパネルで「次へ」をクリックしてデフォルト値を受け入れ、「入力/出力ポート」パネルに到達します。入力ポートのリストで、最初の 3 つのポートのドロップダウン リストから次のポート タイプの値を選択します。

clk        : Port Type = clock
reset      : Port Type = reset
clk_enable : Port Type = reset

このポート タイプの識別により、コシミュレーション ブロックは、これらの信号をSimulinkダイアグラムで駆動する必要がなく、HDL シミュレーターで強制的に実行します。この例では、clk_enable ポートを協調シミュレーション用の別のリセットとして扱います。次のステップに進む前に、同様に ce_out に "unused" を選択します。これにより、 Simulinkでは必要ないため、協調シミュレーション ブロックから除外されます。

協調シミュレーション ウィザードは、HDL コード内の入力と出力を自動的に識別し、そこで見つかったポートに基づいてSimulinkの協調シミュレーション ブロックを作成します。出力ポートについては、HDL コードから学習できない詳細がいくつかあります。HDL コードでは、出力は単なるビットのコレクションであり、 Simulinkでこれらのビットをどのように解釈するかについては示されていません。これらのビットを符号付きまたは符号なしの値として見なすかどうか、および固定小数点数として解釈する場合は基数点をどこに配置するかをコシミュレーション ウィザードに指示する必要があります。

[出力ポートの詳細] パネルで、各出力のデータ型を調整します。この設計の場合、出力ポートは次のように解釈されます。HDL コードにはベクトル ポート (out_1、out_6、out_9、out_10、out_11、out_12) の複数のスカラー ポートがあることに注意してください。

out_1  : Signed,   Fraction Length = 0 (4 scalar ports)
out_2  : Unsigned, Fraction Length = 0
out_3  : Unsigned, Fraction Length = 0
out_4  : Unsigned, Fraction Length = 0
out_5  : Signed,   Fraction Length = 10
out_6  : Signed,   Fraction Length = 10 (3 scalar ports)
out_7  : Signed,   Fraction Length = 2
out_8  : Unsigned, Fraction Length = 0
out_9  : Signed,   Fraction Length = 0 (4 scalar ports)
out_10 : Signed,   Fraction Length = 0 (4 scalar ports)
out_11 : Signed,   Fraction Length = 10 (4 scalar ports)
out_12 : Signed,   Fraction Length = 10 (4 scalar ports)
out_13 : Unsigned, Fraction Length = 0
out_14 : Signed,   Fraction Length = 0

[クロック/リセットの詳細] パネルで、次の値を設定します。

clk Period = 10 ns, Active Edge = Rising
reset Initial Value = 1, Duration = 27 ns
clk_enable Initial Value = 0, Duration = 37 ns

[次へ] をクリックして [開始時間調整] パネルに進み、[コシミュレーションを開始する HDL 時間 (ns)] を 40 に設定します。

最後のステップに進み、「シミュレーション開始時にタイムスケールを自動的に決定する」チェックボックスの選択を解除します。この例では、協調シミュレーションのタイムスケールがSimulinkでは 1 秒である必要があり、HDL シミュレーターでは 10 ns に相当することがわかります。前述のタイムスケールを設定し、「完了」をクリックします。

レガシー HDL コードをSimulinkモデルにインポートするために、コシミュレーション ブロックが生成されます。新しく生成されたコシミュレーション ブロックと 2 つの便利なコマンド ブロックをSimulinkモデルの FSMSubsystem ブロック内にドラッグ アンド ドロップし、FSMSubsystem の出力端子に接続できます。この例では、MIMO Decoder サブシステム内のコンパレーターとアサーション ブロックを備えた協調シミュレーション モデルが提供されています。コンパレーターとアサーション ブロックは、組み込みコントローラーの参照モデルの出力と従来の HDL 実装の間の不一致を警告するために追加されました。

次のコマンドを使用して、生成されたコシミュレーション ブロックのサイズを変更し、コシミュレーション モデルに挿入しやすくします。

set_param('untitled/fsmsubsystem', 'Position', [0 0 165 852]);

cosim_mimo.slx モデルを開きます。cosimWizard によって作成された新しいブロックとコンビニエンス コマンド ブロックを協調シミュレーション モデルにドラッグし、MIMODecoder サブシステム内のプレースホルダー サブシステムを置き換えます。

2.レガシー HDL コードを検証するためのコシミュレーション

コシミュレーション モデルで、[Launch HDL Simulator] ブロックをダブルクリックして、選択した HDL シミュレーターを起動します。Simulinkで [再生] ボタンをクリックして協調シミュレーションを開始し、 MATLABウィンドウに警告メッセージが表示されることを確認します。これらは、リファレンス FSM モデルと HDL 実装の間の不一致による出力信号の不一致を示しています。

Simulinkおよび HDL シミュレーターのデバッグ機能を使用して、問題を切り分けてバグを修正できるようになりました。この場合、HDL 実装で状態遷移アークが欠落しているためにエラーが発生します。HDL シミュレーターの波形表示では、FSM 状態がシミュレーションの非常に早い段階でスタックしていることに注目してください。

手書きの HDL コードを修正し、協調シミュレーションを再実行する

この例には、修正された HDL コードが提供されています。次のコマンドを使用して、新しいコードを作業ディレクトリにコピーし、不正なバージョンの Embedded_Controller.vhd を上書きします。

copyfile(fullfile('verify_legacy_hdlsrc', 'fixed_hdl', 'Embedded_Controller.vhd'), 'verify_legacy_hdlsrc', 'f');

[Compile HDL Design] ブロックをダブルクリックして、レガシー HDL コードを再コンパイルします。前回の協調シミュレーションの実行後に HDL シミュレーターがまだ開いている場合は、HDL シミュレーターを終了し、HDL シミュレーターを再起動して、協調シミュレーションを再実行します。今度は不一致が観察されないはずです。

組み込みコントローラーのレガシー HDL コードをデバッグして検証したので、FPGA インザループを使用して MIMODecoder 全体を検証することができます。

FPGA設計ソフトウェア環境の設定

FPGA インザループを使用する前に、FPGA 設計ソフトウェアにアクセスできるようにシステム環境が適切に設定されていることを確認してください。関数hdlsetuptoolpathを使用して、現在のMATLABセッションのシステムパスにFPGA設計ソフトウェアを追加できます。

HDL コード生成用のモデルを準備する

レガシー HDL コードを組み込み、MIMO デコーダーの残りの部分に新しい HDL コードを生成する FPGA インザループのモデルを準備するには、FPGA 実装を完了するために 2 つのことを行う必要があります。

  1. 協調シミュレーション モデルを編集して FSM リファレンス デザインを削除します

  2. HDL Coder Blackbox を使用して、レガシー HDL をコード生成用のモデルに組み込む

HDL ブラックボックスを使用して HDL コード生成用にモデルを準備するすべての手順を実行する場合は、コシミュレーション モデルを別の名前で保存し、次のようにモデルの準備の残りの部分に進みます。

1. 協調シミュレーション モデルを編集して FSM リファレンス デザインを削除します。

  • MIMO Decoder サブシステム内で Embedded_Controller 関数ブロックを削除します

  • Enablecoder 入力を除く Embedded_Controller 入力を駆動する「from」ブロックを削除します。

  • 出力上のコンパレータとアサーション ブロックを削除します。

  • コシミュレーション ブロックの出力を DelaySubsystem1 の入力に再接続します。

2. HDL Coder Blackbox を使用して、レガシー HDL をコード生成用のモデルに組み込む

  • コシミュレーション ブロックを選択し、control-G を入力してサブシステムを作成します。

  • 新しい協調シミュレーション サブシステムを右クリックし、HDL コードと HDL ブロック プロパティを選択します。

  • アーキテクチャ = ブラックボックスを選択します

  • EntityNameパラメーターに FSMSubsystem を入力します

  • ImplementationLatencyパラメーターに 0 を入力します

  • [OK] HDL ブロック プロパティ ダイアログ

3. シミュレーションを再実行して図を更新します。

  • 「Launch HDL Simulator」ブロックをダブルクリックして HDL シミュレーターを起動します。

  • Simulinkの [再生] ボタンをクリックして、協調シミュレーションを開始します。

  • モデルを保存する

3.HDL コードと FPGA インザループの生成

この手順にはHDL Coderが必要です。このソフトウェアをお持ちでない場合は、事前に生成された HDL ファイルを FIL シミュレーションに使用できます。ステップ 5 に直接ジャンプします。filWizard を使用した FIL シミュレーション。

HDL ファイルを生成するプロセスに従ってモデルの最上位に戻りたい場合は、MIMODecoder サブシステムを右クリックし、[HDL コード] でHDL Coderワークフロー アドバイザーを起動します。

  • ステップ 1.1: FPGA インザループ ターゲット ワークフローを選択し、ドロップダウン リストから希望の FPGA 開発ボードを選択し、生成された HDL コードを保持する書き込み可能なディレクトリを特定します。

  • ステップ 4.1: [FPGA オプションの設定] で [追加] を選択し、ブラウザを使用して、ステップ 1 で作業フォルダーにコピーし、ステップ 3 で修正された HDL コードで変更した EmbeddedController HDL ファイルに移動します。

  • ステップ4.2:左側のナビゲーション ツリーでワークフローのステップ 4.2 を右クリックし、[このタスクまで実行] を選択します。このステップには、FPGA デバイスのデザインを合成、マップ、配線するステップが含まれるため、数分かかる場合があります。

結果は、MIMO デコーダ サブシステムの FPGA インザループ シミュレーション用の FPGA プログラミング ファイルと、FPGA インザ ループとともにデコーダの元のモデル (FSM のレガシー HDL を含む) を含む新しいモデルになります。ループブロック。また、協調シミュレーション モデルで見られたものと同様の不一致信号を識別するためのアサーション ブロックを備えたコンパレーターも備えています。

4.FPGA-in-the-Loop シミュレーションによるデザインの検証

生成された検証モデルには FSMSubsystem の協調シミュレーションが含まれているため、FIL モデル全体を実行するには HDL シミュレーターを使用する必要があります。以前の協調シミュレーションの HDL シミュレーターがシャットダウンされていることを確認し、HDL シミュレーターを再起動します。

手順 3 で生成した FPGA インザループ モデルで、FIL ブロックを開きます。

「ロード」を選択して、FPGA プログラミング ファイルをボード上のデバイスにダウンロードします。

Simulinkモデルで [再生] をクリックして、FPGA インザループ シミュレーションを実行します。

比較スコープの結果とモデルの ErrorRate 計算を観察します。FIL シミュレーションの結果は、参照モデルと正確に一致する必要があります。

5.FIL ウィザードを使用した FIL シミュレーション

この手順は、HDL Coderソフトウェアを持っていない人にとっては、手順 4 の代わりになります。ステップ 4 を完了している場合は、このステップを続行する必要はありません。

事前に生成された HDL ファイルは、「verify_legacy_gen_hdlsrc」フォルダーにあります。FIL ウィザードを使用して、FPGA インザループ用の FPGA プログラミング ファイルを作成できます。 FIL ウィザードは FIL ブロックも作成しますが、この例で提供された FIL モデルにはすでに FIL ブロックが含まれているため、このブロックは破棄できます。

次のコマンドを入力して、FIL ウィザードを開きます。

filWizard
  • FIL オプション で、リストから FPGA 開発ボードを選択します。

  • 「ソース ファイル」で「追加」を選択し、フォルダー verify_legacy_gen_hdlsrc 内のすべてのファイルを選択し、最上位ファイルとして「MIMODecoder.vhd」を特定します。

  • filWizard オプションの残りの部分はデフォルト値を受け入れます。

  • FI1 ブロックと FPGA プログラミング ファイルが作成されるまで待ちます。FPGA 実装の合成と配線に時間がかかるため、これには数分かかる場合があります。

  • gm_fil_codegen_mimo_fil.slx モデルを開き、新しく生成された FIL ブロックをモデル内の指定された場所にドラッグします。

  • FIL ブロック マスクを開き、[信号属性] タブをクリックします。動作ブロックのデータ型と一致するように、各 rx_decoded 出力のデータ型を fixdt(1,6,0) に変更します。

  • FIL ブロック マスクを開き、[Main] タブをクリックし、[Load] を選択して、FPGA プログラミング ファイルがデバイスにダウンロードされるまで待ちます。

  • Simulinkモデルで [Play] を押して、FPGA インザループを実行します。

比較スコープの結果とモデルの ErrorRate 計算を観察します。FIL シミュレーションの結果は、参照モデルと正確に一致する必要があります。

これで、HDL コシミュレーションと FPGA インザループを使用した HDL デザインの検証の例は終了です。