Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

サブシステムで再利用可能なコードの生成

HDL Coder™ は、モデルの階層構造のあらゆるレベルで同一の Atomic サブシステム、あるいはマスク パラメーターの値以外が同じ Atomic サブシステムを検出して、単一の再利用可能な HDL module または entity を生成できます。再利用可能な HDL コードは、単一のファイルとして生成され、複数回インスタンス化されます。

Atomic サブシステムで再利用可能なコードの生成の要件

Atomic サブシステムで再利用可能な HDL を生成するには、次の条件を満たす必要があります。

  • Simulink®DefaultParameterBehavior コンフィギュレーション パラメーターが Inlined でなければなりません。このパラメーターは、コマンド ラインで、関数 set_param または関数 hdlsetup を使用して設定できます。この設定を [コンフィギュレーション パラメーター] ダイアログ ボックスで指定するには、Simulink Coder™ が必要です。

    メモ

    hdlsetup を使用すると InlineParams プロパティが on に設定されません。このパラメーターの有効化は、DefaultParameterBehaviorInlined に設定するのと同じです。InlineParamsoff に設定すると、DefaultParameterBehavior の値が Tunable に変更されます。

  • 信号のログまたは To WorkspaceTo File などのブロックによるロギング機能を使用しないでください。

  • Atomic サブシステムは、同一またはマスク パラメーターの値を除いて同一でなければなりません。

    • MaskParameterAsGenericon でなければなりません。詳細については、マスクされたサブシステムからのパラメーター化された HDL コードの生成を参照してください。

    • マスク パラメーターが調整不可能でなければなりません。コード ジェネレーターは、調整可能なマスク パラメーターと Atomic サブシステムを共有しません。

    • マスク パラメーター データ型を double または single にすることはできません。

    • 調整可能なパラメーターを使用できるのは Constant または Gain ブロックのみです。

    • 端子データ型が一致しなければなりません。

      調整可能なマスク パラメーターの値を変更すると、出力端子のデータ型も変わる可能性があります。いずれかの Atomic サブシステムに異なる端子データ型があると、そのサブシステム用に生成されたコードも異なります。

バーチャル サブシステムで再利用可能なコードの生成の要件

バーチャル サブシステムで再利用可能な HDL コードを生成するには、以下を満たす必要があります。

  • Simulink の DefaultParameterBehavior コンフィギュレーション パラメーターが Inlined でなければなりません。このパラメーターは、コマンド ラインで、関数 set_param または関数 hdlsetup を使用して設定できます。この設定を [コンフィギュレーション パラメーター] ダイアログ ボックスで指定するには、Simulink Coder が必要です。

    メモ

    hdlsetup を使用すると InlineParams プロパティが on に設定されません。このパラメーターの有効化は、DefaultParameterBehaviorInlined に設定するのと同じです。InlineParamsoff に設定すると、DefaultParameterBehavior の値が Tunable に変更されます。

  • 信号のログまたは To WorkspaceTo File などのブロックによるロギング機能を使用しないでください。

  • バーチャル サブシステムは、同一またはマスク パラメーターの値を除いて同一でなければなりません。

    • SubsystemReuse'Atomic and Virtual' に設定されていなければなりません。

      • SubsystemReuse'Atomic and Virtual' に設定すると疑似代数エラーが削減され、設計の他の部分のトポロジに関係なく同一のサブシステムの認識が向上します。類似サブシステムの同定はリソース共有に役立ちます。

      • これらの値を必要な設定に設定するには、MATLAB コマンド ウィンドウで次のように入力します。

        hdlset_param('myHDLModel', 'SubsystemReuse', 'Atomic and Virtual')
      • あるいは、[コンフィギュレーション パラメーター] ダイアログ ボックスの最上位の [HDL コード生成] ペインからこのオプションを設定できます。[グローバル設定][コーディング スタイル] で、[コードの再利用] 設定を必要なオプションに変更できます。

      • 前述のコマンドでは、SubsystemReuse オプションがプロジェクトに対して設定されます。このオプションを現在のコード生成セッションのみに対して設定するには、次のように入力します。

        makehdl(<DUT system>, 'SubsystemReuse', 'Atomic and Virtual')
    • MaskParameterAsGenericon でなければなりません。詳細については、マスクされたサブシステムからのパラメーター化された HDL コードの生成を参照してください。

    • マスク パラメーターが調整不可能でなければなりません。コード ジェネレーターは、調整可能なマスク パラメーターと Atomic サブシステムを共有しません。

    • マスク パラメーター データ型を double または single にすることはできません。

    • 調整可能なパラメーターを使用できるのは Constant または Gain ブロックのみです。

    • 端子データ型が一致しなければなりません。

      調整可能なマスク パラメーターの値を変更すると、出力端子のデータ型も変わる可能性があります。いずれかの Atomic サブシステムに異なる端子データ型があると、そのサブシステム用に生成されたコードも異なります。

Atomic サブシステムで再利用可能なコードの生成

設計に同一の Atomic サブシステムが含まれる場合は、そのサブシステムに対して 1 つの HDL module または entity を生成し、複数回インスタンス化します。

hdlcoder_reusable_code_identical_subsystem モデルは同一の 3 つの Atomic サブシステムを含む DUT サブシステムの例を示します。

HDL Coder は、3 つのサブシステムに対して、1 つの VHDL® ファイル vsum.vhd を生成します。

makehdl('hdlcoder_reusable_code_identical_subsystem/DUT')
### Generating HDL for 'hdlcoder_reusable_code_identical_subsystem/DUT'.
### Starting HDL check.
### Generating new validation model: gm_hdlcoder_reusable_code_identical_subsystem_vnl.
### Validation model generation complete.
### Begin VHDL Code Generation for 'hdlcoder_reusable_code_identical_subsystem'.
### Working on hdlcoder_reusable_code_identical_subsystem/DUT/vsum/Sum of Elements as 
    hdl_prj\hdlsrc\hdlcoder_reusable_code_identical_subsystem\Sum_of_Elements.vhd.
### Working on hdlcoder_reusable_code_identical_subsystem/DUT/vsum as 
    hdl_prj\hdlsrc\hdlcoder_reusable_code_identical_subsystem\vsum.vhd.
### Working on hdlcoder_reusable_code_identical_subsystem/DUT as 
    hdl_prj\hdlsrc\hdlcoder_reusable_code_identical_subsystem\DUT.vhd.
### Generating package file hdl_prj\hdlsrc\hdlcoder_reusable_code_identical_subsystem\DUT_pkg.vhd.
### Creating HDL Code Generation Check Report DUT_report.html
### HDL check for 'hdlcoder_reusable_code_identical_subsystem' complete with 0 errors, 0 warnings, and 0 messages.
### HDL code generation complete.

DUT サブシステム用に生成されたコード DUT.vhd には、vsum コンポーネントの 3 つのインスタンス化が含まれます。

ARCHITECTURE rtl OF DUT IS

  -- Component Declarations
  COMPONENT vsum
    PORT( In1                             :   IN    vector_of_std_logic_vector16(0 TO 9);  -- int16 [10]
          Out1                            :   OUT   std_logic_vector(19 DOWNTO 0)  -- sfix20
          );
  END COMPONENT;

  -- Component Configuration Statements
  FOR ALL : vsum
    USE ENTITY work.vsum(rtl);

  -- Signals
  SIGNAL vsum_out1                        : std_logic_vector(19 DOWNTO 0);  -- ufix20
  SIGNAL vsum1_out1                       : std_logic_vector(19 DOWNTO 0);  -- ufix20
  SIGNAL vsum2_out1                       : std_logic_vector(19 DOWNTO 0);  -- ufix20

BEGIN
  u_vsum : vsum
    PORT MAP( In1 => In1,  -- int16 [10]
              Out1 => vsum_out1  -- sfix20
              );

  u_vsum1 : vsum
    PORT MAP( In1 => In2,  -- int16 [10]
              Out1 => vsum1_out1  -- sfix20
              );

  u_vsum2 : vsum
    PORT MAP( In1 => In3,  -- int16 [10]
              Out1 => vsum2_out1  -- sfix20
              );

  Out1 <= vsum_out1;

  Out2 <= vsum1_out1;

  Out3 <= vsum2_out1;

END rtl;

調整可能なマスク パラメーターをもつ Atomic サブシステムで再利用可能なコードの生成

調整可能なマスク パラメーターの値を除いて同一の Atomic サブシステムが設計に含まれる場合は、そのサブシステムに対して 1 つの HDL module または entity を生成できます。生成されたコード内で、module または entity は複数回インスタンス化されます。

同一の Atomic サブシステムに対して再利用可能なコードを生成するには、モデルに対して MaskParameterAsGeneric を有効にします。既定の設定では MaskParameterAsGeneric は無効になっています。

たとえば、hdlcoder_reusable_code_parameterized_subsystem モデルで調整可能なパラメーターをもつ Atomic サブシステムに対して再利用可能なコードの生成を有効にするには、次のように入力します。

hdlset_param('hdlcoder_reusable_code_parameterized_subsystem','MaskParameterAsGeneric','on')

または、[コンフィギュレーション パラメーター] ダイアログ ボックスで、[HDL コード生成][グローバル設定][コーディング スタイル] タブを選択し、[マスクされたサブシステムからのパラメーター化された HDL コードの生成] オプションを有効にします。

hdlcoder_reusable_code_parameterized_subsystem モデルは、調整可能なマスク パラメーター値以外は同一の Atomic サブシステムを含む DUT サブシステムの例を示しています。

hdlcoder_reusable_code_parameterized_subsystem/DUT 内で、ゲイン モジュールは調整可能なマスク パラメーターで表されるゲイン値をもつサブシステムです。それぞれのゲイン値は、gain_module は 4、gain_module1 は 5、gain_module2 は 7 です。

MaskParameterAsGeneric が有効な場合、HDL Coder は単一のソース ファイル gain_module.v を 3 つのゲイン モジュールのサブシステムに対して生成します。

makehdl('hdlcoder_reusable_code_parameterized_subsystem/DUT','MaskParameterAsGeneric','on',...
        'TargetLanguage','Verilog')
### Generating HDL for 'hdlcoder_reusable_code_parameterized_subsystem/DUT'.
### Starting HDL check.
### Begin Verilog Code Generation for 'hdlcoder_reusable_code_parameterized_subsystem'.
### Working on hdlcoder_reusable_code_parameterized_subsystem/DUT/gain_module as 
    hdlsrc\hdlcoder_reusable_code_parameterized_subsystem\gain_module.v.
### Working on hdlcoder_reusable_code_parameterized_subsystem/DUT as 
    hdlsrc\hdlcoder_reusable_code_parameterized_subsystem\DUT.v.
### Creating HDL Code Generation Check Report DUT_report.html
### HDL check for 'hdlcoder_reusable_code_parameterized_subsystem' complete with 0 errors, 0 warnings, and 0 messages.
### HDL code generation complete.

DUT サブシステム用に生成されたコード DUT.v には、gain_module コンポーネントの 3 つのインスタンス化が含まれます。

module DUT
          (
           In1,
           In2,
           In3,
           Out1,
           Out2,
           Out3
          );


  input   [7:0] In1;  // uint8
  input   [7:0] In2;  // uint8
  input   [7:0] In3;  // uint8
  output  [31:0] Out1;  // uint32
  output  [31:0] Out2;  // uint32
  output  [31:0] Out3;  // uint32


  wire [31:0] gain_module_out1;  // uint32
  wire [31:0] gain_module1_out1;  // uint32
  wire [31:0] gain_module2_out1;  // uint32


  gain_module   #  (.myGain(4)
                    )
                u_gain_module   (.In1(In1),  // uint8
                                 .Out1(gain_module_out1)  // uint32
                                 );

  assign Out1 = gain_module_out1;

  gain_module   #  (.myGain(5)
                    )
                u_gain_module1   (.In1(In2),  // uint8
                                  .Out1(gain_module1_out1)  // uint32
                                  );

  assign Out2 = gain_module1_out1;

  gain_module   #  (.myGain(7)
                    )
                u_gain_module2   (.In1(In3),  // uint8
                                  .Out1(gain_module2_out1)  // uint32
                                  );

  assign Out3 = gain_module2_out1;

endmodule  // DUT

gain_module.v 内で、myGain Verilog® parameter は調整可能なマスク パラメーター用に生成されます。

module gain_module
          (
           In1,
           Out1
          );


  input   [7:0] In1;  // uint8
  output  [31:0] Out1;  // uint32

  parameter [31:0] myGain = 4;  // ufix32

  wire [31:0] kconst;  // ufix32
  wire [39:0] Gain_mul_temp;  // ufix40
  wire [31:0] Gain_out1;  // uint32


  assign kconst = myGain;

  assign Gain_mul_temp = kconst * In1;
  assign Gain_out1 = Gain_mul_temp[31:0];



  assign Out1 = Gain_out1;

endmodule  // gain_module

関連するトピック