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 コード生成][テスト ベンチ オプションを設定]、または [モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [HDL コード生成][テスト ベンチ] からアクセスできます。あるいは、コマンドライン アクセスの場合は、makehdltb (HDL Coder)GenerateSVDPITestBench プロパティを設定します。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 struct データ型、または SystemVerilog インターフェイスの実数部と虚数部のフラット化されたポートを選択できます。これらのオプションを選択するには、[構成パラメータ] ダイアログ ボックスの左側のペインで Code GenerationSystemVerilog DPI を選択し、Composite data type パラメータを structure または flattened に設定します。

ベクトル、行列

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

たとえば、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 Template の下で Component template typeCombinational に設定することで、組み合わせモデルの SystemVerilog ラッパーを生成できます。

組み合わせ 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' のいずれかに設定します。

組み合わせ 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 がハイの場合、出力関数が最初に呼び出され、その後に更新関数が呼び出されます。

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

    if(clk_enable) begin
        DPI_dut_output(objhandle, dut_In1, dut_Out1);
        DPI_dut_update(objhandle, dut_In1);
    end
    
  • 更新機能

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

    たとえば、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 Parameter 関数も含まれます。

DPI コンポーネント ジェネレーターは、DPI_subsystemname_setparam_tunableparametername 形式で各調整可能なパラメーターの Set Parameter 関数を生成します。

この例では、調整可能なゲイン パラメータには独自の 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 コンポーネント生成では、Xilinx® Vivado® シミュレータの single および double データ型はサポートされていません。

  • SystemVerilog DPI コンポーネント生成では、コード生成のみで次のサブシステムがサポートされます。これらのサブシステムにはテストベンチのサポートはありません。

    • トリガーサブシステム

    • 有効なサブシステム

    • アクションポート付きサブシステム

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

関連するトピック