Stateflow チャートを使用した HDL コード生成に関するガイドライン
以下のガイドラインでは、モデルで Stateflow® チャートを使用する場合の推奨設定を示します。Stateflow Chart ブロックは、[Stateflow] ブロック ライブラリで使用できます。Stateflow チャートを使用して、Simulink® モデルの遅延をモデル化できます。
各ガイドラインに準拠要件のレベルを示す重大度レベルが割り当てられています。詳細については、HDL モデリング ガイドラインの重大度レベルを参照してください。
HDL 実装要件に基づくステート マシン タイプの選択
ガイドライン ID
2.9.1
重大度
強く推奨
説明
HDL Coder™ は、Mealy および Moore Stateflow チャートでのコードの生成をサポートします。MATLAB Function ブロックも [Mealy]
または [Moore]
ステート マシンのモデル化に使用できます。
Mealy
または Moore
ステート マシンのいずれかが必要なことを指定する場合は、Chart (Stateflow)プロパティで、[ステート マシン タイプ] を指定します。生成された HDL コードの可読性に影響するため、[クラシック]
は使用しないでください。Stateflow セマンティックでハードウェア実装にマッピングする方法に応じて [ステート マシン タイプ] を選択します。Stateflow セマンティクスのハードウェアでの実現を参照してください。
Mealy
チャートを使用する場合、出力は現在のステートおよび入力に応じて異なります。Mealy
チャートを使用すると、これらのチャートの使用を柔軟にするステート遷移をより簡単に定義できます。Mealy
チャートから生成された HDL コードは可読性が低下する場合があります。
Moore
チャートの場合、出力は現在のステートにのみ依存します。Moore
チャートから生成された HDL コードは可読性が高くなります。Moore
チャートでは、ステート遷移を定義する際の柔軟性が制限されます。
Stateflow チャートのブロックの構成設定
ガイドライン ID
2.9.2
重大度
強く推奨
説明
HDL コード生成のモデルで Stateflow Chart (Stateflow)ブロックを使用する場合は、以下の推奨設定を使用します。
[アクション言語] には
[MATLAB]
を使用します。[更新方法] には
[離散]
または[継承]
を使用します。[連続]
は使用しないでください。
Moore チャート
[チャート実行ごとに出力を初期化] を無効にすると、生成される HDL コードにステート マシンの出力値のための追加のレジスタが含まれます。
[可変サイズの配列をサポート] を無効にします。
Mealy チャート
[チャート実行ごとに出力を初期化] を無効にすると、生成される HDL コードにステート マシンの出力値のための追加のレジスタが含まれます。
[スーパーステップのセマンティクスを有効にする] を無効にします。
[可変サイズの配列をサポート] を無効にします。
[初期化時に指定されたチャートを実行 (入力)] を有効にします。
これらの設定が Stateflow Chart に指定されている場合は、Stateflow チャートの設定をチェックチェックを実行できます。
HDL コードの else ステートメントに対する無条件遷移ステートの挿入
ガイドライン ID
2.9.3
重大度
推奨
説明
HDL コード生成に Stateflow® チャートを使用している場合、チャートに無条件ステートを挿入します。このようなチャートに対して生成される HDL コードでは、if ステートメントに else 分岐が含まれます。else 分岐がある場合、HDL コードの展開時にサードパーティ製ツールによってラッチが推測されることがなくなります。たとえば、モデル hdlcoder_chart_ifnelsecond
を開きます。
open_system('hdlcoder_chart_ifnelsecond') set_param('hdlcoder_chart_ifnelsecond', 'SimulationCommand', 'Update') open_system('hdlcoder_chart_ifnelsecond/dut_chart')
モデルには 2 つの Stateflow Moore チャートが含まれています。チャート onlyif_chart
は、n1 に基づいて out1 を出力する単純な条件を実装しています。
open_system('hdlcoder_chart_ifnelsecond/dut_chart/onlyif_chart')
Chart ブロック ifnelse_chart
は、onlyif_chart
と同じで、無条件遷移ステートをもちます。
open_system('hdlcoder_chart_ifnelsecond/dut_chart/ifnelse_chart')
DUT 用の HDL コードを生成するには、次のコマンドを実行します。
makehdl('hdlcoder_chart_ifnelsecond/dut_chart')
onlyif_chart
で生成された HDL コードには else 条件は含まれません。合成ツールはラッチを推測する場合があるため、このコードをターゲット デバイスに展開しないでください。
ifnelse_chart
で生成された HDL コードには、無条件遷移ステートの else ステートメントが含まれます。このコードは、ターゲット FPGA デバイスへの展開に推奨されます。
HDL コード生成での Stateflow チャートにおけるデータ型の設定とキャスト
ガイドライン ID
2.9.4
重大度
情報
説明
アクション言語として MATLAB
を使用する Stateflow チャートで状態変数と出力変数のデータ型を明示的に指定しない場合、データ型は double になります。データ型が異なる変数がこれらのチャート変数に割り当てられると、データ型の不一致が発生するため、シミュレーション エラーが発生する可能性があります。
シミュレーション エラーを回避するには、fi オブジェクトを使用してチャート変数のデータ型を明示的に初期化するか、モデル エクスプローラーでそのデータ型を指定します。型が異なる変数への代入を行う場合は、fi オブジェクトを使用してデータ型の変換と初期化を実行できます。
fi データ型を変更する場合は、型の語長と小数部の長さを指定しなければなりません。頻繁にデータ型を変換する場合は、代わりに添字 (:) を使用して fi データ型に型をキャストできます。この場合、モデル エクスプローラーでデータ型の変換を添字 (:) によるキャストに置換できます。その後、置換元の値が置換先変数の値に型変換されます。
メモ: 中間変数への代入の場合は、データ型をキャストする必要はありません。
異なるデータ型の初期化方法を示す例は、モデル hdlcoder_chart_datatype_casting
を開きます。
open_system('hdlcoder_chart_datatype_casting') set_param('hdlcoder_chart_datatype_casting', 'SimulationCommand', 'Update')
DUT
サブシステムには、出力変数 out1
および out2
と内部変数 var1
の定義方法を示す Moore チャートが含まれています。out1
型は fi オブジェクトを使用して明示的に指定されており、out2
型と var1
型はモデル エクスプローラーで定義されています。
open_system('hdlcoder_chart_datatype_casting/DUT/Chart')
DUT
サブシステムの HDL コードを生成するには、関数 makehdl
を実行します。
makehdl('hdlcoder_chart_datatype_casting/DUT')
Stateflow チャートにおける絶対時間の時相論理の使用
ガイドライン ID
2.9.5
重大度
必須
説明
HDL コード生成のモデルの Stateflow Chart (Stateflow) ブロックで絶対時間の時相論理を使用する場合は、以下の設定を使用します。
チャートのサンプルレートについて、次のようにします。
秒 (sec) を使用する場合、サンプル時間は 65535 以下の整数、または小数点以下 3 桁以内の 65.535 ~ 0.001 の小数でなければなりません。
ミリ秒 (msec) を使用する場合、サンプル時間は小数点以下 3 桁以内の 65.535 ~ 0.001 の小数、または小数点以下 6 桁以内の 0.065535 ~ 0.000001 の小数でなければなりません。
マイクロ秒 (usec) を使用する場合、サンプル時間は小数点以下 6 桁以内の 0.065535 ~ 0.000001 の小数、または小数点以下 9 桁以内の 0.000065535 ~ 0.000000001 の小数でなければなりません。
サンプル時間が 2^16 未満の整数である場合は、
'sec'
を使用します。1000 * サンプル時間が 2^16 未満の整数である場合は、
'sec'
または'msec'
を使用します。1000000 * サンプル時間が 2^16 未満の整数である場合は、
'msec'
または'usec'
を使用します。1000000000 * サンプル時間が 2^16 未満の整数である場合は、
'usec'
を使用します。
Stateflow チャートにおけるエラー (デフォルト) ステートのモデル化
ガイドライン ID
2.9.6
重大度
情報
説明
排他的ステート構造をもつ Stateflow チャートの HDL コードを生成する場合、ステートが case ステートメントで表されます。たとえば、A
、B
、および C
の 3 つのステートをもつチャートの switch case は次のようになります。
CASE is_Chart IS WHEN IN_A => is_Chart_next <= IN_B; y_tmp <= to_signed(16#00000002#, 32); WHEN IN_B => is_Chart_next <= IN_C; y_tmp <= to_signed(16#00000003#, 32); WHEN OTHERS => --case IN_C: y_tmp <= to_signed(16#00000003#, 32); END CASE;
switch の default ケースに対応するステートを制御すると便利です。たとえば、デフォルト ステートを使用してエラー動作をモデル化できます。名前がアルファベット順で最後になるステートが既定の分岐になります。このコード例では、既定の分岐は WHEN OTHERS=>
です。
バリアント遷移を使用している場合、到達不能なデフォルト ステートは HDL コードから除外されることがあります。これを回避するには、選択されるデフォルト ステートが到達可能でなければなりません。たとえば、到達可能な別のステートにデフォルト ステートを接続し、1 == 0
のような常に false になる遷移を提供できます。詳細については、バリアント条件を使用したインジケーター ランプ調光器の制御 (Stateflow)を参照してください。
Stateflow チャートのクロック駆動の出力の有効化 (Moore チャートのみ)
ガイドライン ID
2.9.7
重大度
情報
説明
Stateflow で、Moore チャートのクロック駆動の出力信号を持つ HDL コードを生成できます。クロック駆動の出力は、組み合わせ論理が出力を駆動するのを防ぎ、クロック信号とステートが変化したときにすぐに出力を更新できるようにします。Stateflow チャートの HDL ブロック プロパティ [ClockDrivenOutput] を使用して、Stateflow チャートのクロック駆動の出力を有効にできます。このオプションは、Moore チャートに対してのみ使用できます。
[ClockDrivenOutput] が [off]
の場合、Moore チャートから生成された HDL コードには次の構造体があります。
[ClockDrivenOutput] を [off]
に設定すると、HDL Coder は、ステート更新時に更新される出力レジスタを追加します。次に、HDL Coder は、最終的な出力変数にクロック駆動レジスタからの値を割り当てます。生成された HDL コードには次の構造体があります。
生成された HDL コードには、Moore チャートからの出力ごとに追加の出力レジスタが含まれます。
既定値のない Stateflow チャートでのアクティブ ステート監視に使用する列挙型
ガイドライン ID
2.9.8
重大度
情報
説明
デフォルト ステート None
、または子ステートを表さないデフォルト ステートを指定するための余分なリテラルを持たず、各ステートに対応するリテラルのみを含む Stateflow チャートのステート アクティビティを監視するための列挙型を指定できます。列挙型の既定値は、チャート内のいずれかのステートに対応できます。Stateflow チャート内のステートと同数のリテラルのみを指定する列挙型を使用すると、必要な領域が少ない HDL コードを生成できます。
Stateflow チャートのステート アクティビティを監視するには、アクティブ ステート データを有効にします。アクティブ ステート データの有効化 (Stateflow)を参照してください。列挙型の既定値をチャート内でステートとして定義するには、[手作業で列挙型を定義] を選択します。ステート アクティビティの列挙型の定義 (Stateflow)を参照してください。オプション [テンプレートから列挙型定義を作成する] を使用して列挙定義テンプレートを作成すると、そのテンプレートはデフォルト ステートを None
として作成します。None
ステートを削除します。
たとえば、デフォルト ステートが None
の列挙型は、次の定義を持つことができます。
classdef ChartModeType < Simulink.IntEnumType % MATLAB enumeration class definition generated from template % to track the active child state of none_state_question2/Subsystem/Chart. enumeration A(0), B(1), None(3) end methods (Static) function defaultValue = getDefaultValue() % GETDEFAULTVALUE Returns the default enumerated value. % If this method is not defined, the first enumeration is used. defaultValue = ChartModeType.None; end % Unchanged methods not shown end end
reg [1:0] ChartMode_reg; // enum type ChartModeType (3 enums) reg [1:0] ChartMode_reg_next; // enum type ChartModeType (3 enums)
ChartMode_reg
と ChartMode_reg_next
は、列挙型を格納するためにそれぞれ 2 ビット使用します。列挙定義と関数 getDefaultValue()
からデフォルト ステート None
を削除すると、列挙型になります。
classdef ChartModeType < Simulink.IntEnumType % MATLAB enumeration class definition generated from template % to track the active child state of none_state_question2/Subsystem/Chart. enumeration A(0), B(1), end methods (Static) % Unchanged methods not shown end end
ChartMode_reg
と ChartMode_reg_next
は、列挙型を格納するためにそれぞれ 1 ビットだけ使用するようになりました。reg ChartModeReg; // enum type ChartModeEnum (2 enums) reg ChartModeReg_next; // enum type ChartModeEnum (2 enums)
アクティブ ステートを監視するためのデフォルト ステート None
を持たない列挙型には、次の Stateflow 制限があります。
None
ステートのない列挙型のみを定義して、最上位のチャート レベルの子アクティビティを監視できます。Stateflow チャートのプロパティ [初期化時に指定されたチャートを実行 (入力)] を有効にしなければなりません。
既定の子ステートに対しては、
in
演算子を使用できません。ローカル イベントは許可されません。
コンフィギュレーション パラメーター [無条件のデフォルト遷移がない] を
[エラー]
に設定しなければなりません。
Stateflow チャートでのステート アクティビティの監視の詳細については、ステート アクティビティの列挙型の定義 (Stateflow)を参照してください。