メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

正味傾きスケーリングのコード置換

固定小数点データ型に対する乗算演算と除算演算のコード置換エントリを、演算子の入力と出力間の正味傾きと一致するように定義できます。正味傾きエントリでは、一連の傾きおよびバイアス値を乗算または除算の置換関数に割り当てることができます。

この例では、divide 演算に対するコード置換の定義方法に関する情報を提供することで、固定小数点正味傾き演算のパフォーマンスを最適化するコード置換ライブラリを開発する方法を示します。コード置換ライブラリを開発するには、対話的な方法またはプログラムによる方法のいずれかを使用します。詳細については、コード置換ライブラリの開発を参照してください。

対話的なコード置換ライブラリの開発

  1. MATLAB コマンド ラインから次のコマンドを使用して コード置換ツール (crtool) を開きます。

    >>crtool
  2. table を作成します。

    1. crtool のコンテキスト メニューから、[ファイル][新しいテーブル] を選択します。

    2. 右側のペインで、table に crl_table_netslopeScaling と名前を付けます。[適用] をクリックします。

  3. エントリを作成します。crtool のコンテキスト メニューから、[ファイル][新しいエントリ][固定小数点正味傾き演算] を選択します。

  4. エントリ パラメーターを作成します。[演算] ドロップダウン リストで、[Divide] を選択します。

  5. 概念表現を作成します。概念表現は、置換する関数のシグネチャを記述します。crtool の [概念関数] サブセクションで、fixdt(true,16,*,*)[データ型] およびスカラーの [引数タイプ] をもつ戻り引数 y1 と入力引数 u1 および u2 を指定します。

  6. 実装表現を作成します。実装表現は最適化関数のシグネチャを記述します。crtool の [関数の引数] サブセクションで、int 16[データ型] をもつ戻り引数 y1 と入力引数 u1 および u2 を指定します。また、[正味傾き調整要素] を 1 に、[正味固定小数点指数] を 0 に設定します。

    [関数プロトタイプ] の下にある置換関数に対して [名前] を指定します。

  7. ビルド情報を指定します。[ビルド情報] タブをクリックして、ビルド要件のペインを開きます。コード ジェネレーターがコード置換に必要なファイル (ソース、ヘッダー、オブジェクト) を指定します。この例では、ビルド情報を指定する必要はありません。

  8. table を確認して保存します。[マッピング情報] タブで、[エントリの検証] をクリックします。crtool のコンテキスト メニューから、[ファイル][テーブルの保存][保存] を選択します。

  9. コード置換ライブラリを登録します。登録することにより、指定した table で構成されるライブラリが作成されます。[ファイル][登録ファイルの作成] を選択します。[登録ファイルの作成] ダイアログ ボックスで、以下のフィールドに入力します。

    コード置換ライブラリを使用するには、現在の MATLAB セッションを次のコマンドで更新します。

    >>sl_refresh_customizations

  10. コード置換ライブラリを確認します。MATLAB コマンド ラインから、コード置換ビューアーを使用してライブラリを開き、table およびエントリが正しく指定されていることを確認します。詳細については、Verify Code Replacement Libraryを参照してください。コード置換ライブラリを使用するようにモデルを構成し、コードを生成して、その置換が予期したとおりに行われることを確認します。予期しない動作が行われた場合、ヒット ログとミス ログを調べて問題のトラブルシューティングを行います。

プログラムによるコード置換ライブラリの開発

  1. [新規][関数] を選択し、[MATLAB] メニューからプログラム インターフェイスを開きます。

  2. table を作成します。

    1. 引数をもたず table オブジェクトを返す、コード置換ライブラリ テーブルの名前をもつ関数を作成します。この関数を使用して、コード置換ライブラリ テーブルを呼び出すことができます。

    2. RTW.TflTable を呼び出して table オブジェクトを作成します。

    function hTable = crl_table_netslopeScaling
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
  3. エントリを作成します。この例では関数を置き換えるため、エントリ関数 RTW.TflCOperationEntryGenerator_NetSlope を呼び出して table にコード置換エントリを作成します。

    function hTable = crl_table_netslopeScaling
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntryGenerator_NetSlope;
    
  4. 関数 setTflCOperationEntryParameters を呼び出して演算子エントリ パラメーターを設定します。パラメーターは、演算のタイプを除算、飽和モードをオーバーフロー時のラップ、丸めモードを未指定、置換関数の名前を user_div_* と指定します。NetSlopeAdjustmentFactorNetFixedExponent は、正味傾き F2EFE の部分を指定します。

    function hTable = crl_table_netslopeScaling
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntryGenerator_NetSlope;
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters(...
       'Key',                      'RTW_OP_DIV', ...
       'Priority',                 90, ...
       'SaturationMode',           'RTW_WRAP_ON_OVERFLOW', ...
       'RoundingModes',            {'RTW_ROUND_CEILING'}, ...
       'NetSlopeAdjustmentFactor',   1.0, ...
       'NetFixedExponent',           0.0, ...
       'ImplementationName',       's16_div_s16_s16', ...
       'ImplementationHeaderFile', 's16_div_s16_s16.h', ...
       'ImplementationSourceFile', 's16_div_s16_s16.c');
  5. 概念引数 y1u1、および u2 を作成します。この例では、関数 createAndAddConceptualArg の呼び出しを使用して、1 回の関数呼び出しで引数を作成して追加します。各引数を固定小数点、16 ビット、および符号付きとして指定します。また、各引数について、コード置換要求処理で呼び出しサイトの傾きおよびバイアス値との完全一致をチェック "しない" ように指定します。

    function hTable = crl_table_netslopeScaling
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntryGenerator_NetSlope;
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters(...
       'Key',                      'RTW_OP_DIV', ...
       'Priority',                 90, ...
       'SaturationMode',           'RTW_WRAP_ON_OVERFLOW', ...
       'RoundingModes',            {'RTW_ROUND_CEILING'}, ...
       'NetSlopeAdjustmentFactor',   1.0, ...
       'NetFixedExponent',           0.0, ...
       'ImplementationName',       's16_div_s16_s16', ...
       'ImplementationHeaderFile', 's16_div_s16_s16.h', ...
       'ImplementationSourceFile', 's16_div_s16_s16.c');
    
    %% Create the conceptual representation
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
       'Name',           'y1', ...
       'IOType',         'RTW_IO_OUTPUT', ...
       'CheckSlope',     false, ...
       'CheckBias',      false, ...
       'DataType',       'Fixed', ...
       'IsSigned',       true, ...
       'WordLength',     16);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
       'Name',           'u1', ...
       'IOType',         'RTW_IO_INPUT', ...
       'CheckSlope',     false, ...
       'CheckBias',      false, ...
       'DataType',       'Fixed', ...
       'IsSigned',       true, ...
       'WordLength',     16);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
       'Name',           'u2', ...
       'IOType',         'RTW_IO_INPUT', ...
       'CheckSlope',     false, ...
       'CheckBias',      false, ...
       'DataType',       'Fixed', ...
       'IsSigned',       true, ...
       'WordLength',     16);
  6. 実装表現を作成します。実装表現は最適化関数のシグネチャを記述します。この例では、関数 createAndSetCImplementationReturn と関数 createAndAddImplementationArg の呼び出しを使用して、実装引数を作成してエントリに追加します。実装引数では、基本的な数値データ型 (固定小数点データ型ではなく) を記述する必要があります。この場合、出力引数と入力引数は 16 ビットで符号付きです (int16)。

    function hTable = crl_table_netslopeScaling
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCOperationEntryGenerator_NetSlope;
    
    %% Create entry parameters
    hEntry.setTflCOperationEntryParameters(...
       'Key',                      'RTW_OP_DIV', ...
       'Priority',                 90, ...
       'SaturationMode',           'RTW_WRAP_ON_OVERFLOW', ...
       'RoundingModes',            {'RTW_ROUND_CEILING'}, ...
       'NetSlopeAdjustmentFactor',   1.0, ...
       'NetFixedExponent',           0.0, ...
       'ImplementationName',       's16_div_s16_s16', ...
       'ImplementationHeaderFile', 's16_div_s16_s16.h', ...
       'ImplementationSourceFile', 's16_div_s16_s16.c');
    
    %% Create the conceptual representation
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
       'Name',           'y1', ...
       'IOType',         'RTW_IO_OUTPUT', ...
       'CheckSlope',     false, ...
       'CheckBias',      false, ...
       'DataType',       'Fixed', ...
       'IsSigned',       true, ...
       'WordLength',     16);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
       'Name',           'u1', ...
       'IOType',         'RTW_IO_INPUT', ...
       'CheckSlope',     false, ...
       'CheckBias',      false, ...
       'DataType',       'Fixed', ...
       'IsSigned',       true, ...
       'WordLength',     16);
    
    createAndAddConceptualArg(hEntry, 'RTW.TflArgNumeric', ...
       'Name',           'u2', ...
       'IOType',         'RTW_IO_INPUT', ...
       'CheckSlope',     false, ...
       'CheckBias',      false, ...
       'DataType',       'Fixed', ...
       'IsSigned',       true, ...
       'WordLength',     16);
    
    %% Create the Implementation Representation
    createAndSetCImplementationReturn(hEntry, 'RTW.TflArgNumeric', ...
                                  'Name',           'y1', ...
                                  'IOType',         'RTW_IO_OUTPUT', ...
                                  'IsSigned',       true, ...
                                  'WordLength',     16, ...
                                  'FractionLength', 0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumeric',...
                                  'Name',           'u1', ...
                                  'IOType',         'RTW_IO_INPUT', ...
                                  'IsSigned',       true, ...
                                  'WordLength',     16, ...
                                  'FractionLength', 0);
    
    createAndAddImplementationArg(hEntry, 'RTW.TflArgNumeric',...
                                  'Name',           'u2', ...
                                  'IOType',         'RTW_IO_INPUT', ...
                                  'IsSigned',       true, ...
                                  'WordLength',     16, ...
                                  'FractionLength', 0);
    
    %% Add the entry to the table
    addEntry(hTable, hEntry);
    
  7. ビルド情報を指定します。エントリ パラメーターで、コード ジェネレーターがコード置換に必要なファイル (ソース、ヘッダー、オブジェクト) を指定します。この例では、ビルド情報は必要ありません。

  8. カスタマイズ ファイルを確認して保存します。[MATLAB] メニューから、[ファイル][保存] を選択して、このカスタマイズ ファイルを保存します。コマンド ラインから、次のようにしてコード置換ライブラリ テーブルを呼び出し、確認します。

    >> hTable = crl_table_netslopeScaling
  9. コード置換ライブラリを登録します。登録では、ライブラリ名、コード置換テーブル、その他の情報を定義することにより、コード置換ライブラリが作成されます。以下の仕様を使用して登録ファイルを作成します。

    function rtwTargetInfo(cm)
     
    cm.registerTargetInfo(@loc_register_crl);
    end
     
    function this = loc_register_crl 
     
    this(1) = RTW.TflRegistry; 
    this(1).Name = 'CRL for net slope scaling’;
    this(1).TableList = {'crl_table_netslopeScaling.m'}; % table created in this example
    this(1).TargetHWDeviceType = {'*'};
    this(1).Description = 'Example code replacement library';
    
    end
    

    コード置換ライブラリを使用するには、現在の MATLAB セッションを次のコマンドで更新します。

    >>sl_refresh_customizations

  10. コード置換ライブラリを確認します。MATLAB コマンド ラインから、コード置換ビューアーを使用してライブラリを開き、table およびエントリが正しく指定されていることを確認します。詳細については、Verify Code Replacement Libraryを参照してください。コード置換ライブラリを使用するようにモデルを構成し、コードを生成して、その置換が予期したとおりに行われることを確認します。予期しない動作が行われた場合、ヒット ログとミス ログを調べて問題のトラブルシューティングを行います。

参考

トピック