Main Content

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

Simulinkによる DPI コンポーネントの生成

DPI 生成の概要

Simulink® Coder™ライセンスをお持ちの場合は、2 つの方法のいずれかを使用して SystemVerilog DPI コンポーネントを生成できます。

メモ

この機能には、 ASIC Testbench for HDL Verifierアドオンが必要です。

サブシステムの SystemVerilog DPI コンポーネントのエクスポート

HDL Verifier™はSimulink Coderと統合し、ダイレクト プログラミング インターフェイス (DPI) を備えた SystemVerilog コンポーネント内でサブシステムを生成された C コードとしてエクスポートします。このコンポーネントを動作モデルとして HDL シミュレーションに統合できます。コーダーには、生成された SystemVerilog 構造をカスタマイズするためのオプションが用意されています。コンポーネント ジェネレーターは、テスト ポイント アクセスと調整可能なパラメーターをサポートします。コーダーはオプションで、生成された DPI コンポーネントをSimulinkサブシステムからのデータ ベクトルに対して検証する SystemVerilog テスト ベンチを生成します。この機能は、[モデル コンフィギュレーションパラメーター]ダイアログ ボックスのCode Generationの下で使用できます。SystemVerilog DPI コンポーネントの生成を参照してください。

HDL Coderでの SystemVerilog テストベンチの生成

HDL Coder™から、SystemVerilog DPI テストベンチを生成できます。テストベンチを使用して、DUT とデータ ソースを含むSimulinkモデル全体から生成された C コードを使用して、生成された HDL コードを検証します。この機能を使用するには、モデル全体がSimulink Coderによる C コード生成をサポートしている必要があります。この機能には、HDL ワークフロー アドバイザーのHDL Code GenerationSet Testbench Options、または [モデル コンフィギュレーションパラメーター]ダイアログ ボックスのHDL Code GenerationTest Benchでアクセスできます。あるいは、コマンドライン アクセスの場合は、 GenerateSVDPITestBenchmakehdltb (HDL Coder)プロパティを設定します。Verify HDL Design Using SystemVerilog DPI Test Bench (HDL Coder)を参照してください。

サポートされているSimulinkデータ型

サポートされているSimulinkデータ型は、次の表に示すように SystemVerilog データ型に変換されます。

ビット ベクトル、論理ベクトル、または互換性のある C タイプを選択できます。[コンフィギュレーションパラメーター]ダイアログ ボックスのCode GenerationSystemVerilog DPIセクションのSystemVerilog Ports Ports data typeの下で選択します。

生成された SystemVerilog タイプ

MATLAB®SystemVerilog
互換性のあるCタイプロジックベクトルビットベクトル
uint8byte unsignedlogic [7:0] bit [7:0]
uint16shortint unsignedlogic [15:0] bit [15:0]
uint32int unsignedlogic [31:0]bit [31:0]
uint64longint unsignedlogic [63:0]bit [63:0]
int8bytelogic signed [7:0]bit signed [7:0]
int16shortintlogic signed [15:0]bit signed [15:0]
int32intlogic signed [31:0]bit signed [31:0]
int64longintlogic signed [63:0]bit signed [63:0]
booleanbyte unsignedlogic [0:0]bit [0:0]
固定小数点

ポートは、 intint unsignedbytebyte unsignedなどの組み込み C タイプに符号拡張されています。 $$など

logic [n-1:0]

logic signed [n-1:0]

論理ベクトルの長さ (n) はwordlengthと同じです。符号は固定小数点型から継承されます。

bit [n-1:0]

bit signed [n-1:0]

ビット ベクトルの長さ (n) はwordlengthと同じです。符号は固定小数点型から継承されます。

singleshortreal
doublereal
complex

SystemVerilog インターフェイスでは、SystemVerilog structデータ型、または実数部と虚数部のフラット化ポートのいずれかを選択できます。これらのオプションのいずれかを選択するには、[コンフィギュレーションパラメーター]ダイアログ ボックスの左側のペインでCode GenerationSystemVerilog DPIを選択し、 Composite data typeパラメーターをstructureに設定します。 $$またはflattened

ベクトル、行列

SystemVerilog 配列またはスカラー ポートのいずれかを選択できます。これらのオプションのいずれかを選択するには、[コンフィギュレーションパラメーター]ダイアログ ボックスの左側のペインでCode GenerationSystemVerilog DPIを選択し、次にScalarize matrix and vector portsパラメーターを選択します。

たとえば、TG Simulink uint32型の 2 要素ベクトルは、次の SystemVerilog ベクトル ポートを生成します。

input logic [31:0] vecInput [0:1]

Scalarize matrix and vector portsを選択すると、生成された SystemVerilog には、それぞれタイプlogic [31:0]の次の 2 つのポートが含まれます。

input logic [31:0] vecInput_0,
input logic [31:0] vecInput_1

ベクトルおよび配列ポートを生成するとき、コーダーは行列を列優先の順序で平坦化します。

非バーチャルバス

SystemVerilog インターフェイスでは、SystemVerilog structタイプまたは個別のコンポーネント信号用のフラット化ポートのいずれかを選択できます。これらのオプションのいずれかを選択するには、[コンフィギュレーションパラメーター]ダイアログ ボックスの左側のペインで、 Code GenerationSystemVerilog DPIセクションを選択し、 Composite data typestructureに設定します。またはflattened

列挙されたデータ型enum

生成された SystemVerilog ラッパー

生成される制御信号

SystemVerilog DPI ジェネレーターによって生成されるすべてのシーケンシャル SystemVerilog コードには、次の制御信号が含まれます。

  • clk – 同期クロック

  • clk_enable – クロックイネーブル

  • reset – 非同期リセット

組み合わせモデルの SystemVerilog ラッパーを生成する場合、ラッパーにはこれらのポートは含まれません。

生成された SystemVerilog モジュール インターフェイス

ポートリストまたはインターフェイス宣言のいずれかを選択します。このオプションは、 Code GenerationSystemVerilog DPISystemVerilog portsConnectionの下の [コンフィギュレーションパラメーター]で設定します。

  • Port list - インターフェイスを表すヘッダーにポート リストを含む SystemVerilog モジュールを生成します。

    以下に例を示します。

    module MyMod_dpi(
        input bit clk,
        input bit clk_enable,
        input bit reset,
        /* Simulink signal name: 'in1' */
        input real in1 ,
        /* Simulink signal name: 'out1' */
        output real out1 
    );
    
    ...
    endmodule

  • Interface - ヘッダーにインターフェイス名を含む SystemVerilog モジュールと、インターフェイスの別個の宣言を生成します。

    以下に例を示します。

    interface simple_if;
        bit clk;
        bit clk_enable;
        bit reset;
        /* Simulink signal name: 'in1' */
        real in1 ;
        /* Simulink signal name: 'out1' */
        real out1 ;
    endinterface
    
    module MyMod_dpi(
        simple_if vif
    );
    ...
    endmodule

コマンドラインによる代替方法: set_param (Simulink)関数を使用し、 DPIPortConnectionパラメーターを'Interface'または'Port List'に設定します。 $。

以下に例を示します。

set_param(bdroot, 'DPIPortConnection','Interface')

組み合わせ設計用の SystemVerilog ラッパー

左側のペインでCode GenerationSystemVerilog DPIを選択し、 Component TemplateComponent template typeをTGに設定することで、組み合わせモデルの SystemVerilog ラッパーを生成できます。 Combinational

組み合わせ SystemVerilog ラッパーを生成する場合、インターフェイスにはclkclk_enable、またはresetポートは含まれません。

以下に例を示します。

module MyMod_dpi(
    /* Simulink signal name: 'in1' */
    input real in1 ,
    /* Simulink signal name: 'out1' */
    output real out1 
);

...
endmodule

コマンドラインによる代替方法: set_param (Simulink)関数を使用し、 DPIComponentTemplateTypeパラメーターを'Sequential'またはCombinational'に設定します。 $。

Combinational SystemVerilog の制限事項

  • Simulinkモデルが純粋に組み合わせである場合にのみ、組み合わせテンプレートを選択してください。

  • Simulinkモデルがシーケンシャルの場合は、シーケンシャル コンポーネント テンプレート タイプを選択する必要があります。シーケンシャル モデルは、組み合わせテンプレートでは正しく機能しません。

  • モデルに遅延ブロックが含まれている場合、それはシーケンシャル デザインとみなされます。

  • 部分的にシーケンシャルであり、部分的に組み合わせであるモデルは、SystemVerilog DPI 生成ではサポートされていません。

生成されたコンポーネント関数

SystemVerilog DPI ジェネレーターによって生成された SystemVerilog コードには、次の関数が含まれています。

    // Declare imported C functions
    import "DPI" function chandle DPI_subsystemname_initialize(chandle existhandle);
    import "DPI" function void DPI_subsystemname_output(input chandle objhandle, 
            input real In1, inout real Out1);
    import "DPI" function void DPI_subsystemname_terminate(input chandle objhandle);

また、シーケンシャル デザインの場合、コードには次の関数も含まれます。

    import "DPI" function chandle DPI_subsystemname_reset(input chandle objhandle,
            input real In1, inout real Out1);
    import "DPI" function void DPI_subsystemname_update(input chandle objhandle, 
            input real In1);

ここで、 subsystemname は、コードを生成したサブシステムの名前です。

モデルに調整可能なパラメーターも含まれている場合は、 パラメーター調整を参照してください。

  • 関数の初期化 — Initialize関数はシミュレーションの開始時に呼び出されます。

    たとえば、 dutというタイトルのサブシステムの場合:

        initial begin
            objhandle = DPI_dut_initialize(objhandle);
        end
    
  • リセット関数 — シミュレーションを既知のリセット状態にリセットする場合は、 reset関数を呼び出します。

    たとえば、 dutというタイトルのサブシステムの場合:

        initial begin
            objhandle = DPI_dut_reset(objhandle, 0, 0);
        end
    
  • 出力関数 — クロックの正のエッジで、 clk_enableが High の場合、出力関数が最初に呼び出され、次に更新関数が続きます。

    たとえば、 dutというタイトルのサブシステムの場合:

    if(clk_enable) begin
        DPI_dut_output(objhandle, dut_In1, dut_Out1);
        DPI_dut_update(objhandle, dut_In1);
    end
    
  • アップデート機能

    クロックの正のエッジで、 clk_enableが High の場合、出力関数の後に更新関数が呼び出されます。

    たとえば、 dutというタイトルのサブシステムの場合:

    if(clk_enable) begin
        DPI_dut_output(objhandle, dut_In1, dut_Out1);
        DPI_dut_update(objhandle, dut_In1);
    end
    
  • 終了関数

    シミュレーションを早期に終了するための特定の条件を設定します。

    たとえば、 dutというタイトルのサブシステムの場合:

    if (condition for termination) begin
       DPI_dut_terminate(objhandle);
    end

システムから生成される SystemVerilog コードの関数の詳細はさまざまです。生成されたコードの詳細を調べることができます。コンテキスト内で生成された関数の例については、 「 SystemVerilog DPI コンポーネントの生成を開始する 」を参照してください。

パラメーター調整

Simulinkモデルのパラメーターにさまざまな値を使用して、さまざまなシミュレーションを実行できます。システムに調整可能なパラメーターがある場合、生成された SystemVerilog コードには、調整可能なパラメーターごとに Set パラメーター関数も含まれます。

DPI コンポーネント ジェネレーターは、調整可能なパラメーターごとにDPI_subsystemname_setparam_tunableparametername形式でパラメーター設定関数を生成します。

この例では、調整可能なゲインパラメーターに独自のsetparam_gain関数があります。

import "DPI" function void DPI_dut_setparam_gain(input chandle objhandle, input real dut_P_gain);

生成された SystemVerilog コードは、この関数を呼び出しません。代わりに、デフォルトのパラメーターが使用されます。シミュレーション中にこれらのパラメーターを変更するには、特定のsetparam関数を明示的に呼び出します。たとえば、 dutというサブシステムでは、次の呼び出しを挿入することで、シミュレーション中のゲインを値 6 に変更できます。

DPI_dut_setparam_gain(objhandle, 6);

パラメーターを調整可能にするには、SystemVerilog コードを生成する前に、サブシステムからデータ オブジェクトを作成します。シミュレーション中のゲインパラメーターの調整を参照してください。

テストポイントアクセス機能

この機能を使用すると、HDL シミュレータで SystemVerilog DPI コンポーネントの内部信号にアクセスできるようになります。モデル内の内部信号をテスト ポイントとして指定し、SystemVerilog DPI ジェネレーターを構成して個別またはグループ化されたアクセス関数を作成できます。

テスト ポイントでのログ記録を有効にすることもできます。ログを有効にすると、生成されたテストベンチを使用して、 Simulinkからのログ データと SystemVerilog コンポーネントの実行中に観察された値を比較できます。

SystemVerilog DPI コンポーネント テスト ポイント アクセスおよびSystemVerilog DPI コンポーネントの生成を開始するを参照してください。

追加のサンプル遅延

オリジナルのSimulinkモデルと比較すると、生成された SystemVerilog モジュールでは出力に 1 つの追加サンプル遅延が導入されています。たとえば、次のSimulinkモデルでは、出力は入力信号の 1 サンプル遅延バージョンです。

生成された C コードではこの動作が維持され、出力は入力信号の 1 サンプル遅延バージョンで構成されます。ただし、SystemVerilog ラッパー ファイルでは、入力信号と出力信号を同期するためにクロック信号が使用されます。

always @(posedge clk) begin
    DPI_blk2_output(blk2_In1, blk2_Out1);
    DPI_blk2_update();
end

SystemVerilog モジュールの出力は、クロックの立ち上がりエッジでのみ更新できます。この要件により、余分なサンプル遅延が発生します。

マルチレートシステムの動作

デフォルトでは、 Simulinkサブシステムには、シミュレーション中にサブシステムがいつ出力を生成し、内部状態を更新するかを示す基本サンプル時間変数 (FundST) があります。マルチレート システムでは、ポートごとに異なるサンプル時間を指定できます。詳細については、 「サンプル時間とは (Simulink)」を参照してください。

マルチレート サブシステムが DPI コンポーネントを生成する場合、DPI コンポーネントはサブシステム内のすべてのサンプル時間の最大公約数に等しいサンプル時間で実行されます。

たとえば、サブシステムの基本サンプル時間が 0.01 (つまり、 FundST0.01)、サンプル時間がST1 であると仮定します。 ST2はそれぞれ 0.5 と 0.7。

ST1=0.5, ST2=0.7.DPI コンポーネントは、サンプル時間 0.1 で実行されます (0.1 は 0.5 と 0.7 の最大公約数であるため)。サンプル時間 0.5 (ST1) または 0.7 (ST2) の信号を正常に取得するには、HDL クロック信号がそれぞれ 5 回または 7 回トグルする必要があります。

DPI コンポーネントがトップレベルから生成される場合、コンポーネントは基本サンプル時間で実行されます。

この図は、HDL 入力クロックとサンプル時間ST1およびST2の関係を示しています。

カスタマイズ

HDL Verifier (svdpi_grt_template.vgt) に含まれるテンプレートを変更することで、生成された SystemVerilog ラッパーをカスタマイズできます。あるいは、独自のカスタム テンプレートを作成することもできます。テンプレートで生成されたコードのアンカーを指定して、テンプレートが有効な SystemVerilog コードを生成することを確認します。

HDL Verifierによって提供されるデフォルトの SystemVerilog テンプレートは、 svdpi_grt_template.vgtです。このテンプレートでは、特別なclken_inおよびclken_out制御信号が SystemVerilog モジュール インターフェイスに追加されます。

複数のサブシステムから SystemVerilog DPI コンポーネントを生成し、それらを HDL シミュレーターで接続できます。これを行うと、これらの制御信号によってコンポーネントの実行順序が決まります。また、Simulink信号と SystemVerilog 信号間の遅延も最小限に抑えられます。

次の条件で独自のテンプレート ファイルを指定することもできます。

  • ファイルはMATLABパス上にあり、検索可能である必要があります。

  • ファイルには.vgt拡張子が必要です。

これらのオプションのトークンをテンプレート全体のコメント ステートメント内に挿入することで、生成されたコードをカスタマイズできます。

  • %<FileName>

  • %<PortList>

  • %<EnumDataTypeDefinitions>

  • %<ImportInitFunction>

  • %<ImportOutputFunction>

  • %<ImportUpdateFunction>

  • %<ImportSetParamFunction>

  • %<CallInitFunction>

  • %<CallUpdateFunction>

  • %<CallOutputFunction>

  • %<IsLibContinuous>

  • %<ObjHandle>

コードのカスタマイズ手順については、 生成された SystemVerilog コードをカスタマイズするを参照してください。

メモ

SystemVerilog DPI コンポーネント ジェネレーターは、カスタマイズされたコンポーネントのテストベンチを生成しません。

制限

  • デフォルトでは、 HDL Verifier は、行列とベクトルを SystemVerilog の 1 次元配列に変換します。たとえば、 Simulinkの 4 行 2 列の行列は、SystemVerilog では 8 つの要素からなる 1 次元配列に変換されます。SystemVerilog インターフェイスで複数のスカラー ポートを生成するには、設定パラメーターでScalarize matrix and vector portsを選択します。

  • SystemVerilog DPI コンポーネントの生成では、single Xilinx®シミュレーターのdouble およびVivado® データ型はサポートされていません。

  • SystemVerilog DPI コンポーネント生成は、コード生成のみを目的として次のサブシステムをサポートします。これらのサブシステムに対するテストベンチのサポートはありません。

    • トリガーされたサブシステム

    • 有効なサブシステム

    • アクションポートを備えたサブシステム

最良の結果を得るには、正しい実行順序を達成することが困難になる可能性があるため、複数のサブシステムを個別にエクスポートすることは避けてください。代わりに、複数のサブシステムを 1 つに結合し、新しく作成した単一のサブシステムからコードを生成します。

関連するトピック