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 ケーブルとドライバー。Xilinx FPGA ボード用の Digilent® JTAG ケーブルとドライバー。

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

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

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

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

この例のレガシー HDL コードを検証する最初のステップは、設計のその部分の参照モデルを作成することです。FSM ではすでにそれが実行されています。behavioral_mimo.slx モデルを開きます。MIMO デコーダー サブシステムをダブルクリックすると、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 に「未使用」を選択し、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 Verifier のドキュメントを参照してください。前述のタイムスケールを設定し、「完了」をクリックします。

レガシー HDL コードを Simulink モデルにインポートするためのコシミュレーション ブロックが生成されます。新しく生成されたコシミュレーション ブロックと 2 つの便利なコマンド ブロックを、FSMSubsystem ブロック内の Simulink モデルにドラッグ アンド ドロップし、FSMSubsystem の出力ポートに接続できます。この例では、MIMO デコーダー サブシステム内のコンパレータとアサーション ブロックを備えたコシミュレーション モデルが提供されています。組み込みコントローラのリファレンス モデルの出力と従来の 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 コードのデバッグと検証が完了したので、FPGA インザループを使用して MIMODecoder 全体を検証することができます。

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

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

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

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

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

  2. HDL Coder ブラックボックスを使用して、レガシー HDL をコード生成モデルに組み込みます。

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

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

  • MIMOデコーダサブシステム内のEmbedded_Controller機能ブロックを削除します。

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

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

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

2. HDL Coder ブラックボックスを使用して、レガシー HDL をコード生成用のモデルに組み込む

  • 協調シミュレーションブロックを選択し、Ctrl+Gを押してサブシステムを作成します。

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

  • アーキテクチャ = BlackBox を選択

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

  • 実装レイテンシーパラメータに0を入力します

  • HDLブロックプロパティダイアログをOKします

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

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

  • Simulinkの再生ボタンをクリックしてコシミュレーションを開始します

  • モデルを保存する

3. HDL コードと FPGA インザループを生成する

このステップには HDL Coder が必要です。このソフトウェアをお持ちでない場合は、FIL シミュレーション用に事前に生成された HDL ファイルを使用できます。直接ステップ 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インザループシミュレーションによる設計の検証

生成された検証モデルには 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の残りのオプションについてはデフォルト値を受け入れます

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

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

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

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

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

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

これで、HDL コシミュレーションと FPGA インザループを使用して HDL 設計を検証する例が終了しました。