Model Composer
ユーザー
ガイド
UG1262 (v2019.1) 2019 年 5 月 22 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資 料によっては英語版の更新に対応していないものがあります。日本語版は参考用としてご使用の上、最新情報 につきましては、必ず最新英語版をご参照ください。改訂履歴
次の表に、この文書の改訂履歴を示します。 セクション 改訂内容 2019 年 5 月 22 日 バージョン 2019.1 第 1 章: 概要 • Model Composer にタイミングなしのビット精度の高いモ デルが含まれることを記述。 • 新機能と制限 を追加。 Model Composer への C/C++ のインポート • ソース ブロックと [Sample Time] パラメーターの説明を追 加。 • 複素数型の使用 を追加。 xmcImportFunction のプラグマ • SUPPORTS_STREAMING および BUFFER_DPETH プラグマ を編集。 • XMC THROUGHPUT_FACTOR を追加。 デバッグ ツールの起動 Visual Studio の例外に関する注記を追加。 第 4 章: 出力の生成 Model Composer のログ ファイル を追加。 付録 B: Model Composer ブロック ライブラリ RTL IP ベースのブロック を追加。Model Composer ブロック Model Composer ブロックに次の新規ブロックを追加。
• FIR • FFT • IFFT
目次
改訂履歴
...2第 1 章: 概要
... 5 Model Composer とは...5 新機能と制限...7第 2 章: Model Composer デザインの作成
... 8 Model Composer の起動... 9 新規モデルの作成... 9 モデルへのブロックの追加... 10 ブロックの接続... 12 データ型の使用... 13 最上位サブシステム モジュールの作成...22第 3 章: C/C++ コードのカスタム ブロックとしてのインポート
...23 概要...23 xmcImportFunction コマンドの使用... 23 Model Composer への C/C++ のインポート...26 関数テンプレートを使用したブロックの定義...30 xmcImportFunction のプラグマ...42 ライブラリ ブラウザーへのユーザー ライブラリの追加...47 インポートしたブロックのデバッグ... 48第 4 章: 出力の生成
...54 概要...54Model Composer Hub ブロックの追加...54
インプリメンテーションのスループットの制御...56 インターフェイス仕様の定義...62 Vivado 用 IP パッケージの生成... 66 System Generator IP の生成...70 C++ コードの生成... 74 Model Composer のログ ファイル... 76
第 5 章: デザインのシミュレーションおよび検証
...78 概要...78 Simulink のシミュレーション...78 Model Composer のキャッシュの管理...79 C++ コードの検証... 80 C/RTL コードの検証... 81付録 A: ターゲット デバイスまたはボードの選択
... 82 [Device Chooser] ダイアログ ボックス...82付録 B: Model Composer ブロック ライブラリ
... 83 サポートされる Simulink ブロック... 83 Model Composer ブロックの分類... 84 RTL IP ベースのブロック...87 Model Composer ブロック... 89付録 C: その他のリソースおよび法的通知
...215 ザイリンクス リソース...215 Documentation Navigator およびデザイン ハブ... 215 参考資料... 216 お読みください: 重要な法的通知...216第 1 章
概要
Model Composer とは
Model Composer は、MathWorks Simulink® 環境でデザインを短時間で試行できるモデル ベースのデザイン ツール で、自動コード生成により、ザイリンクスのプログラマブル デバイスのプロダクションまでの期間を短縮できます。 MATLAB® のアドオン製品である Simulink では、システム レベル デザインのモデリング、シミュレーション、解析、 および検証をインタラクティブなグラフィカル環境で実行できます。Model Composer は、MathWorks Simulink 環境 に合わせたザイリンクス ツールボックスとして構築されており、アルゴリズム開発者が Simulink のグラフィカル環境 のすべての機能を使用して、アルゴリズムの設計および検証できるようになっています。
アルゴリズムは、Model Composer ライブラリからのブロックやユーザーがインポートしたカスタム ブロックを使用 して Simulink で記述できます。Model Composer では、自動最適化機能と Vivado® HLS の高位合成テクノロジを使用
して、ユーザーのアルゴリズム仕様をプロダクション品質の IP インプリメンテーションに変換します。Vivado Design Suite の IP インテグレーター機能を使用すると、その IP をプラットフォーム (Zynq® デバイス、DDR3 DRAM、Arm® プロセッサで実行されるソフトウェア スタックなど) に統合できます。
Model Composer には、Simulink 環境内で使用可能な最適化済みのブロックを 80 以上含むライブラリが含まれます。 これには、数学、線形代数、論理、ビット演算などのアルゴリズムを記述した基本的な論理ブロックが含まれます。 また、画像処理およびコンピューター ビジョン用の特定用途向けブロックも多く含まれます。ザイリンクス Model Composer ブロック ライブラリには、次のカテゴリが含まれています。 表 1: ザイリンクス Model Composer ブロック ライブラリ ライブラリ 説明 Computer Vision デジタル化された画像の解析、操作、および最適化をサポート するブロック。
Logic and Bit Operations 論理演算とビット単位演算をサポートするブロック。
Lookup Tables 入力インデックスを使用して 1 次元のルックアップ演算を実行
するブロックセット。
Math Functions 数学関数をインプリメントするブロック。
Ports and Subsystems サブシステムと入力/出力ポートを作成できるようにするブロ
ック。 Relational Operations 2 つの入力間の関係 (数値等価および不等価) を定義するブロッ クセット。 Signal Attributes 入力型と出力型の互換性をサポートするためのブロック (型変 換など)。 Signal Operations 新しい信号を生成するために、信号の時間変数の単純な変更を サポートするブロック (Unit Delay など)。 Signal Routing 信号のソースおよびデスティネーションを監視するための設定 をサポートするブロック (Bus Selector など)。 Sinks ほかのブロックからの物理的な信号出力を受信するブロック。
表 1: ザイリンクス Model Composer ブロック ライブラリ (続き)
ライブラリ 説明
Source 信号データを生成またはインポートするブロック。
Tools モデルのインプリメンテーション/インターフェイスを制御す
るブロック。
ザイリンクス Model Composer ブロック ライブラリの特定のブロックに関する詳細は、付録 B: Model Composer ブ ロック ライブラリ を参照してください。
Model Composer ブロック ライブラリは、標準 Simulink ブロック ライブラリと互換性があり、Simulink でシミュレー ション可能なモデルを作成する際に一緒に使用できます。ただし、Model Composer によるコード生成がサポートさ れるのは、一部の Simulink ブロックのみです。Model Composer の出力生成と互換性のある Simulink ブロックは、ザ イリンクス Model Composer ブロック ライブラリに含まれます。
Model Composer では、既存の C/C++ コードからモデルで使用可能なカスタム ブロックを作成できます。詳細は、
第 3 章: C/C++ コードのカスタム ブロックとしてのインポート を参照してください。
Model Composer を使用すると、ハードウェアの最終インプリメンテーション (タイミングなし) でビット精度のデザ インになりますます。デザイン モデルを Vivado HLS で合成できるように C++ コードにコンパイルしたり、System Generator ブロックを作成したり、Vivado Design Suite で使用できる IP パッケージを作成したりできます。 次の図に、通常のツール フローを示します。
図 1: Model Composer ツール フロー
Model Composer について学ぶには、『Model Composer チュートリアル: Model Composer を使用したモデル ベース デザイン』 (UG1259) の演習およびデータを使用することをお勧めします。
この資料の残りの部分では、次について説明します。
• 既存の C コードを Model Composer ブロック ライブラリへインポートしてモデルで使用
• モデルをコンパイルしてダウンストリーム デザイン ツールで使用
• Model Composer モデル、C++、および RTL 出力の検証
新機能と制限
特定リリースの Model Composer の新機能については、https://japan.xilinx.com/products/design-tools/vivado/ integration/model-composer.html#newを参照してください。
また、Model Composer は MathWorks Simulink 環境に組み込まれたツールボックスですが、Model Composer でサポ ートされない特定の Simulink 機能もあります。サポートされない機能には、次のようなものがあります。
• Simulink Performance Advisor。 • モデル リファレンス。
• さまざまなサブシステム。
• Model Composer ブロックでは、Simulink の固定小数点型はサポートされず、ザイリンクスの固定小数点型のみを サポート。
• 固定小数点デザイナーと Model Composer との統合なし。 • [Accelerator] モードと [Rapid Accelerator] モード。
第 2 章
Model Composer デザインの作成
次の図に示すように、Model Composer デザインには次が含まれます。 1. 入力を決定し、ソース信号を提供する Simulink ブロック。これらのブロックは、デザインのシミュレーションに 使用されますが、Model Composer で生成される出力には影響しません。 2. Model Composer モデルで定義されたアルゴリズムをカプセル化した最上位サブシステム ブロック (最上位サブ システム モジュールの作成 を参照)。このサブシステム モジュールには、次を含めることができます。 • アルゴリズムを定義する Model Composer ブロック ライブラリからのブロック (付録 B: Model Composer ブロック ライブラリ を参照)。
• カスタムのインポート関数 (第 3 章: C/C++ コードのカスタム ブロックとしてのインポートを参照)。 • ハードウェア インターフェイスを定義する Interface Specification ブロック (インターフェイス仕様の定義 を
参照)。
3. デザインのスループットを制御し、さまざまなオプションを使用して出力を生成する Model Composer Hub ブロ ック (Model Composer Hub ブロックの追加 を参照)。
4. 出力信号、または Simulink で出力を処理するシンク。これらのブロックは、第 5 章: デザインのシミュレーショ ンおよび検証で説明されるように、デザインのシミュレーションに使用されますが、Model Composer で生成さ れる出力には影響しません。
図 2: Model Composer デザインの要素
Model Composer の起動
Model Composer はデスクトップ アイコンまたはコマンド ラインから起動できます。Model Composer アイコンを ダブルクリックするか、Windows オペレーティング システムの [スタート] メニューから起動するか、コマンド プロ ンプトから次のコマンドを使用します。
model_composer
ヒント: Model Composer でコマンド ラインを使用するには、コマンド シェルを次のように設定します。ディレクト リを <install_dir>/Model_Composer/<version> に変更し、settings64-Model_Composer.bat (また は .sh) ファイルを実行します。<install_dir> はインストール フォルダー、<version> はツールのバージョン です。MATLAB が開き、Model Composer ライブラリと機能がこの環境に読み込まれます。ここで、メイン ツールバー メ ニューから Simulink アイコンをクリックするか、MATLAB コマンド プロンプトから Simulink と入力します。
>> simulink
Simulink のスタート ページが表示されます。Model Composer の機能が Simulink プラットフォームに読み込まれま す。
Model Composer では、最新リリースの MATLAB がサポートされます。このリリースの Model Composer でサポート されている MATLAB リリースについては、『Vivado Design Suite ユーザー ガイド: リリース ノート、インストールお よびライセンス』 (UG973) の「互換性のあるサードパーティ ツール」を参照してください。システムに複数バージ ョンの MATLAB をインストールしている場合は、PATH で見つかった最初のバージョンが Model Composer で使用さ れます。特定のバージョンを使用するには、PATH をその MATLAB バージョンに変更しておきます。または、次のよ うに -matlab オプションを使用して、特定のバージョンを直接開くこともできます。
model_composer -matlab C:\Progra~1\MATLAB\R2018b
ヒント: MATLAB バージョンへのパスを指定する際は、実行ファイルへのフル パス (bin/MATLAB) を指定しないでく ださい。「C:\Progra~1\」文字列は「C:\Program Files\」へのショートカットで、コマンド パスからスペースを削除し ます。Model Composer でコマンド ラインを使用するには、コマンド シェルが先ほど説明したように設定されている 必要があります。
新規モデルの作成
新しいモデルを作成するには、ライブラリ ブラウザーから Simulink Editor にブロックを追加します。この後、これら のブロックを信号ラインに接続し、ブロック間の関係を構築します。Simulink Editor では、スマート ガイドおよびス マート信号配線を使用して接続が管理され、構築中のモデルの表示が制御されます。モデルに階層を追加するには、 ブロックおよび信号のグループを 1 つのブロック内のサブシステムとしてカプセル化します。Model Composer に は、定義済みのブロックセットが含まれており、これらを組み合わせてアプリケーションの詳細なモデルを作成でき ます。Simulink のスタート ページで [Blank Model] を選択して新しいモデルを開きます。
ヒント: Model Composer テンプレートが定義されている場合は、既存のテンプレートを開くこともできます。モデル テンプレートは、設定およびブロック コンフィギュレーションを再利用するための開始点として使用できます。テン プレートの詳細は、Simulink 資料の「モデルからのテンプレートの作成」を参照してください。 Simulink のスタート ページの左側には、最近開いたモデルがリストされ、これらの 1 つを開くこともできます。 空のモデルを開いたら、ブロックを追加して、ブロック パラメーターを指定し、信号ラインを使用してブロック間を 接続して、Model Composer モデルを作成します。 重要: Model Composer では、モデルに対して 1 サンプル時間しかサポートされず、複数のサンプル時間はサポートさ れません。すべての Model Composer ブロックに、モデルのソース ブロックからのサンプル時間が継承されます。詳 細は、Simulink 資料の「サンプル時間とは」を参照してください。
モデルを保存するには、メイン メニューから [File] → [Save] をクリックします。[Save As] ダイアログ ボックスが開き ます。正しいフォルダーまたはディレクトリを指定し、[File Name] フィールドにモデルの名前を入力します。[Save] をクリックします。モデルが .slx という拡張子のファイルに保存されます。
Model Composer のサンプル モデルには、[Help] メニューから表示可能なザイリンクス Model Composer 資料の 「Model Composer Examples」セクションからアクセスできるほか、MATLAB コマンド プロンプトから
xmcOpenExample コマンドを入力してもアクセスできます。
>> xmcOpenExample
このコマンドを実行すると、使用可能なサンプル モデルのリストが表示されます。xmcOpenExample コマンドで、 サンプル モデルを指定したターゲット ディレクトリ (ターゲット ディレクトリが指定されていない場合は temp デ ィレクトリ) にコピーし、Model Composer で開きます。次は、サンプルとターゲット ディレクトリを指定する方法 を示しています。xmcOpenExample('importing_c_code','C:\Data\importing_code')
ヒント: 指定したターゲット ディレクトリが存在しない場合は、Model Composer により自動的に作成されます。モデルへのブロックの追加
ブロックを現在のモデルに追加するには、ライブラリ ブラウザーを開いて、ブロックを Simulink エディターのデザイ ン キャンバスにドラッグ アンド ドロップします。ライブラリ ブラウザーは、 ボタンをクリックするか、メイ ン メニューから [View] → [Library Browser] をクリックすると開くことができます。ライブラリ ブラウザーには、標 準的な Sumulink ライブラリおよびザイリンクスの Model Composer ライブラリが表示されます。ヒント: ライブラリ ブラウザーは、コマンド プロンプトで slLibraryBrowser コマンドを入力しても開くことができま す。
Xilinx Model Composer ブロックは、機能別に分類されています。次の図は、ライブラリ ブラウザーの [Xilinx Model Composer] の [Computer Vision] ブロック ライブラリを示しています。
図 3: ライブラリ ブラウザー ライブラリ ブラウザー内でブロックをダブルクリックすると、[Block Parameter] ダイアログ ボックスが開き、選択 したブロックで定義されるさまざまなパラメーターがデフォルト値で表示されます。ブロックはライブラリに含まれ ているので、パラメーターは表示しかできません。パラメーターを編集するには、ブロックをデザイン キャンバスに 追加する必要があります。 ブロックの詳細は、ライブラリ ブラウザーでブロックを右クリックして、[Help] をクリックすると確認できます。ま たは、ライブラリ ブラウザーでブロックをダブルクリックし、ダイアログ ボックスで [Help] をクリックしても確認 できます。ヘルプ ブラウザーが開き、ブロックの情報が表示されます。 ブロックをキャンバスにドラッグ アンド ドロップすると、定義済みのデフォルトのパラメーター値でブロックが追 加されます。 ヒント: Simulink エディターのデザイン キャンバスをクリックしてブロック名を入力しても、ブロックを現在のモデ ルにすばやく追加できます。ライブラリから入力した名前に一致するものが表示されるので、該当するブロックを選 択して追加します。 Simulink モデルには、信号とパラメーターの両方が含まれます。信号はブロックに接続されるラインで表記されます。 パラメーターは、ブロックの主な特徴および動作を定義する係数です。 第 2 章: Model Composer デザインの作成
ブロックの接続
ブロックの出力ポートは、ほかのブロックの入力ポートに信号ラインで接続できます。信号ラインは、モデルを通過 するデータフローを定義します。信号には次のような複数の属性を含めることができます。 • データ型: 信号で運ばれるデータ型を定義します。整数、浮動小数点型、固定小数点型などのさまざまなデータ型 を使用できます。詳細は、データ型の使用を参照してください。 • 信号の次元: 値をスカラー、ベクター、または行列として定義します。詳細は、Simulink 資料の「信号の次元」お よび「行列、ベクトル、およびスカラー」を参照してください。 • 複雑性: 値を複素数または実数として定義します。詳細は、Simulink 資料の「信号値」を参照してください。次の 図は、複素数がモデルを伝搬するところを示しています。 図 4: 複素数信号値 信号ラインを追加するには、カーソルを Simulink ブロックの入力または出力ポートの上に置きます。カーソルがプラ ス (+) マークに変わります。クリックして、ポートからドラッグします。マウス ボタンを押したままにしてドラッグ して動かすと、接続ラインが点線で表示されます。点線は、完全に接続されていない信号を示します。 カーソルを接続する 2 つ目のポートまで移動したら、マウス ボタンを放します。入力ポートから開始する場合は出力 ポートで止めるか別の信号ラインに接続し、出力から開始する場合は入力で止めます。Simulink でポートが信号ライ ンで接続されます。矢印は、信号フローの方向を示します。 マウスを右クリックしてドラッグすると、既存のラインに接続できます。これにより、分岐ラインが作成され、既存 の信号ラインの指定した位置に接続されます。分岐ラインは、接続された信号によって、入力または出力に接続でき ます。 ヒント: ブロックは、Ctrl キーを押したまま順に選択しても接続できます。1 つ目のクロックの出力が 2 つ目のブロッ 第 2 章: Model Composer デザインの作成Simulink では、シミュレーションの [Run] をクリックすると、モデルがアップデートされます。モデルは、デザイン プロセスの任意の段階で [Simulation] → [Update Diagram] メニュー コマンドを使用するか、Ctrl+D キーを押しても アップデートできます。ソース ブロックからのデータ型、信号次元、サンプル時間がモデルに伝搬されるのを確認で きます。
ヒント: [Display] → [Signals and Ports] メニュー コマンドをクリックすると、[Signal Dimensions] および [Port Data Types] などのさまざまなデータがモデルで表示されます。
Xilinx Model Composer ブロック ライブラリの Source ライブラリの Constant ブロックを除き、Model Composer ブ ロックにはサンプル時間は指定できません。Model Composer では、モデルの入力に接続されたソース ブロックから サンプル時間が推論されるので、複数のサンプル時間はサポートされません。 ダイアグラムをアップデートすると、モデルの開発中に発生する可能性のある問題を発見して解決できます。頻繁に アップデートすることで、デザインへの最近のアップデートに範囲を絞れるので、問題の原因を見つけやすくなりま す。また、[Update Diagram] はシミュレーションを実行するよりも高速です。
データ型の使用
Model Composer では、次のデータ型がサポートされます。 表 2: Model Composer のデータ型 名前 説明 double 倍精度浮動小数点 single 単精度浮動小数点 half* 半精度浮動小数点 int8 符号付き 8 ビット整数 uint8 符号なし 8 ビット整数 int16 符号付き 16 ビット整数 uint16 符号なし 16 ビット整数 int32 符号付き 32 ビット整数 uint32 符号なし 32 ビット整数 fixed* 符号付きおよび符号なしの固定小数点boolean Simulink では 0 以外の実数値が TRUE (1) と表示されます。
重要: * の付いたデータ型は Model Composer 特有のもので、Simulink ではサポートされません。Simulink では固定小 数点データ型がサポートされていますが、Fixed-Point Designer™ をインストールしてライセンスを取得しておく必要 があります。また、Xilinx Model Composer でサポートされる固定小数点データ型は、表記は同様ですが、Simulink で サポートされる固定小数点データ型とは互換性がありません。
前述の表には、Model Composer ではサポートされても、Simulink ではデフォルトでサポートされないデータ型も含 まれています。fixed または half データ型を使用する Model Composer ブロック ライブラリからのブロックを Simulink ネイティブのブロックに接続すると、Simulink でシミュレーションを実行、[Update Diagram] コマンドを使 用、または Ctrl+D キーを押したときに、次のようなエラー メッセージが表示されます。
RelationalOperator does not accept signals of data type 'x_sfix16'.
'ConstRE_or_IMpartBug/Relational Operator' only accepts numeric and
enumerated data types.
このエラーは、Simulink では Xilinx Model Composer の固定小数点型を倍精度の浮動小数点型に変換できないことを 示しています。
データ型が一致しない場合は、Data Type Conversion ブロックを使用しモデルの動作を指定し、データ型の変換を指 定することをお勧めします。Data Type Conversion (DTC) ブロックは、Xilinx Model Composer ライブラリの Signal Attributes ライブラリに含まれています。
図 5: Data Type Conversion ブロック
DTC ブロックでは、出力データ型 ([Output data type]) を指定できますが、入力データ型は入力ポートに接続される信 号によって自動的に決まります。DTC ブロックを使用すると、たとえば単精度の浮動小数点を倍精度に変換したり、 倍精度を単精度に変換したりできます。
重要: 精度の高いデータ型を精度の低いデータ型に変換する場合は、精度の損失により、丸めまたは切り捨てが発生 し、データが損失する可能性があるので注意が必要です。
固定小数点データ型の使用
前述のように、Simulink では固定小数点データ型はサポートされていますが、Fixed-Point Designer™ 製品が必要とな ります。また、ザイリンクス Model Composer でサポートされる fixed データ型は Simulink のものと互換性があり 第 2 章: Model Composer デザインの作成
図 6: 固定小数点データ型
ザイリンクス Model Composer の固定小数点型を表示するのに使用されるフォーマットは x_[u/s]fix[wl]_E[n] [fl] です。 説明: • x_: ザイリンクスの固定データ型を示す接頭辞。 • [u/s]: 符号なしか符号ありを表記。 • fix: 固定小数点データ型であることを表記。 • [wl]: データのワード長を指定。 • E: 固定小数点データ型の分数部の接頭辞。分数長が 0 の場合は表示されません。 • n: 2 進数小数点がワードの最下位ビットの左にある場合は n を表示、最下位ビットの右にある場合は n の表示な し。 • [fl]: 固定小数点データ型の分数部の長さを指定して、ワードの最下位ビットに対する 2 進数小数点の位置を示す。 たとえば、'x_sfix16_En6' の場合、符号付き 16 ビットの固定小数点で、2 進数小数点の右側に 6 ビットが割り当てら れています。 また、固定小数点データ型では、データ オーバーフローが発生した場合にどうするか、丸めまたは切り捨てが必要か どうかも指定できます。詳細は、Data Type Conversionを参照してください。
Xilinx Model Composer の固定小数点データ型は DTC ブロックを使用して Simulink の固定小数点データ型に変換す る必要がありますが、Xilinx Model Composer の固定小数点データ型と Simulink の固定小数点データ型を直接変換す ることはできないので、次の方法を使用して変換してください。
1. ライブラリ ブラウザーの Xilinx Model Composer ライブラリにある DTC ブロックを使用して、ザイリンクス Model Composer の固定小数点型を double に変換します。
2. ライブラリ ブラウザーの Simulink の Signal Attributes ライブラリにある Simulink Data Type Conversion ブロッ クを使用して、double データ型を Simulink フォーマットの固定小数点データ型に変換します。
3. 2 つの固定小数点データ型間の符号の有無、ワード長、分数長を同じにします。
ヒント: Xilinx Model Composer の固定小数点データ型と Simulink の固定小数点データ型間の変換は、必要な場合以外 は実行することはお勧めしません。ほとんどのアプリケーションで、最初の手順の Model Composer の固定小数点デ ータ型を double に変換するだけで十分なはずです。 固定小数点データ型の操作には時間がかかりますが、FPGA にインプリメントするアプリケーションの場合は、固定 小数点データ型を使用する価値があります。これは通常、浮動小数点で設計した方がデザインの消費電力が大きくな るからです。FPGA には浮動小数点の DSP ブロックが搭載されており、DSP ブロックとその他のデバイス リソース を使用して浮動小数点ソリューションをインプリメントする必要があるので、消費電力が大きくなります。浮動小数 点のインプリメンテーションには、同等の固定小数点のソリューションよりも多くの FPGA リソースが必要になりま す。リソース使用量が多くなると、消費電力も大きくなるので、デザインのインプリメンテーションの全体的なコス トも高くなります。詳細は、ホワイト ペーパー 『浮動小数点から固定小数点への変換による消費電力およびコスト の削減』 (WP491) を参照してください。
half データ型の使用
ザイリンクス Model Composer では、半精度の half 浮動小数点データ型 (32 ビットではなく 16 ビット) もサポート されています。このデータ型を使用すると、FPGA にインプリメントする際にターゲット デバイスのリソース使用量 が少なくなります。Model Composer で設計する場合は、半精度データ型も考慮してみてください。ただし、Simulink では half データ型はサポートされていないので、シミュレーションでエラーが発生する可能性があります。この場 合、Model Composer サブモジュールに含まれず、生成される出力に含まれないデザイン部分に、Model Composer の DTC ブロックを使用して、half データ型を Simulink でサポートされる single データ型に変換します。
データ型式の使用
Model Composer では、データ型を式として指定できます。現在のところ、次の Model Composer ライブラリ ブロッ クでデータ型式がサポートされています。
• Constant
• Data Type Conversion • Gain
• Look-Up Table • Reinterpret
データ型式を指定するには、それをサポートするブロック タイプの 1 つを開いて、データ型と値を編集します。次の 図では、Constant ブロックにデータ型式を定義しています。[Output data type] に [data type expression] を選択し、 データ型の値を指定する文字列 (この例では 'uint32') を指定します。
図 7: データ型式 データ型の値は、データ型の使用 セクションの Model Composer のデータ型の表に示すサポートされるデータ型の文 字列表記で指定します。ただし固定小数点データ型は例外で、fixed 文字列で指定せず、固定小数点データ型の使用 で説明する表示フォーマット (例: 'x_sfix16_En8') に従って定義します。 データ型を式として定義する利点は、モデルからの変数を使用してデータ型の値をプログラムで決定できることです。 たとえば、次のように MATLAB® コマンド ラインから変数を定義します。
>> InputDataType = 'x_ufix8_En7';
この変数は、データ型式を定義する際に使用できます。 図 8: 変数データ型変数は、MATLAB コマンド ラインから定義するか、[Tools] → [Model Explorer] メニュー コマンドを使用してモデル内 で定義するか、Ctrl+H キーを押して指定できます。Model Explorer からは、モデルまたはブロックで使用する変数 を作成、編集、管理できます。
ヒント: [View] → [Property Inspector] をオンにすると、現在選択しているオブジェクトの変数が表示されます。 第 2 章: Model Composer デザインの作成
オーバーフローの管理
ブロックのデータ型定義で信号に入力されるデータ値がサポートされないことがあります。信号の値がブロックのデ ータ型で表現するには大きすぎるか小さすぎる場合、オーバーフローが発生することがあります。発生する可能性の あるオーバーフローのタイプには、折り返しオーバーフローと飽和オーバーフローがあります。 • [Wrap on Overflow]: デフォルトのオーバーフロー メカニズムで、ビット値がオーバーフロー ポイントで折り返さ れます。たとえば、2 つの値の乗算などの算術演算でデータ型の最大値よりも大きな結果が生成された場合、結果 が折り返されます。 • [Saturate on Overflow]: 加算および乗算などのすべての演算を、データ型でサポートされる最小値と最大値の固定 範囲に制限します。つまり、値が最大値または最小値に達すると停止します。 折り返しは、値がデータ型を超えると自然に発生するので、これがオーバーフロー処理のデフォルトです。チェック は必要ありません。[Saturate on Overflow] オプションを選択した場合、折り返されないように許容される最大値また は最小値に対してデータ値をチェックする追加ロジックが必要になります。この追加ロジックにより、ターゲット デ バイスで使用可能なリソースが消費されます。[Saturate on integer overflow] オプション
[Saturate on integer overflow] オプション
Model Composer では、現在のところ信号上の整数データ値のオーバーフロー検出がサポートされています。前述の ように、デフォルトのオーバーフロー メカニズムは折り返し ([Wrap on Overflow]) です。標準 Simulink ライブラリお よび Xilinx Model Composer ライブラリの一部のブロックには、[Block Parameters] ダイアログ ボックスに [Saturate on integer overflow] という整数のオーバーフローで飽和させるオプションがあります。このパラメーターは、出力が 整数 (int8、int16、int32、uint8、uint16、uint32) の場合にのみ適用されます。ブロックに特定の情報は、付録 B: Model Composer ブロック ライブラリを参照してください。
図 9: [Saturate on integer overflow] オプション
[Saturate on integer overflow] を選択すると、入力値が出力でサポートされる値の範囲よりも大きすぎたり小さすぎた りする場合や、単に最大値やサポートされる最小値に到達した場合に、飽和処理されることを意味します。値は飽和 したら、変更されません。
[Saturate on fixed point overflow] オプション
固定小数点データ型の場合、たとえば DTC (Data Type Conversion) ブロックでサポートされるように、オーバーフロ ー モードが [Saturate on integer overflow] オプションよりも詳細に制御できます。
図 10: 固定小数点のオーバーフロー
それぞれの固定小数点オーバーフロー モードの詳細は、次を参照してください。
表 3: 固定小数点のオーバーフロー モード モード 説明 グラフ Saturation 入力値が出力データ型でオーバー フローする場合、出力値がその最 小値または最大値で飽和に達した ら、変更されません。 Saturation to Zero 入力値が出力データ型でオーバー フローする場合、出力値がその最 小値または最大値で飽和に達した ら、0 に戻ります。 Symmetrical
Saturation [Saturation to Zero] と同じですが、最小値と最大値が対称だった り、値は反対ですがサイズが同じ であったりする点が違います。
表 3: 固定小数点のオーバーフロー モード (続き) モード 説明 グラフ Wrap around 入力値が出力データ型を超えた ら、出力値は最大値から最小値へ 折り返されるか、最小値から最大 値に折り返されるので、許容値の 範囲で循環します。 Sign-Magnitude Wrap Around 入力値が出力データ型を超える場合、出力値が最大値になったら、 値が減少し始めて、最小値に戻り ます。アンダーフローの場合は、 最小値になったら、値が増加し初 めて、最大値に戻ります。
オーバーフロー警告の設定
折り返しまたは飽和のどちらのオプションを選択している場合でも、オーバーフローがいつ発生するのかを知ってお くことが重要です。ツールバー メニューの [Model Configuration Parameters] コマンド ( ) をクリックするか Ctrl-E キーを押すと、これらの各オーバーフロー状態を Simulink でどのように処理するか指定できます。 [Configuration Parameters] ダイアログ ボックスの [Diagnostics] → [Data Validity] タブで [Wrap on Overflow] および [Saturate on Overflow] で値を指定します。これらのフィールドで指定可能な設定は、次のいずれかです。• [none]: Simulink でオーバーフローを処理またはレポートするための特別な操作は実行されません。
• [warning]: Diagnostic Viewer にメッセージが表示されます。同じブロックに対する次の警告は無視され、シミュレ ーションは続行されます。
• [error]: Diagnostic Viewer にエラー メッセージが表示され、シミュレーションが停止します。
ヒント: このダイアログ ボックスに関するヘルプ情報は、Simulink 資料の「モデル コンフィギュレーション パラメー ター: データ有効性の診断」を参照してください。
最上位サブシステム モジュールの作成
Model Composer モデルから出力を生成するには、Model Composer モデルの最上位に Model Composer Hub ブロッ ク (Model Composer Hub ブロックの追加を参照) とアプリケーション デザインを含むサブシステムが含まれている 必要があります。デザインの最上位にインスタンシエートされているサブシステムから出力を生成するには、Xilinx Model Composer ブロックと特定の Simulink ブロックのみがサブシステムに必要です。Xilinx Model Composer ブロ ックでは、関数を IP パッケージ用にコンパイルするか、C++ コード用にコンパイルするかが定義されます。最上位デ ザインには、シミュレーションなどの別の目的用にほかのブロックおよびサブシステム モジュールを含めることもで きますが、基本的なアプリケーションは指定したサブシステム内に完全に含まれるようにしておく必要があります。 ヒント: Model Composer サブシステムでサポートされる特定の Simulink ブロックは Xilinx Model Composer ブロッ ク ライブラリにも表示されます。リストの内容は、サポートされる Simulink ブロックを参照してください。 モデル内からサブシステムを作成するには、1 つまたは複数のブロックをモデル キャンバスに追加し、そのブロック をサブシステムに変更します。
1. モデルへのブロックの追加に説明されているように、Simulink Editor でブロックをモデル キャンバスにドラッグ アンド ドロップします。
2. 1 つまたは複数のブロックを選択して右クリックし、[Create Subsystem from Selection] をクリックします。 3. サブシステムに名前を付けます。名前は生成される出力アプリケーションまたは IP と同じ名前にします。 4. サブシステムをダブルクリックして Simulink Editor で開きます。 Simulink ヘルプのエクスプローラー バーおよびモデル ブラウザーを使用すると、モデルを探しやすくなります。 • エクスプローラー バー ( ) を使用すると、Simulink Editor 内のビュー間で階層を上下や前後に移動 できます。 • モデル ブラウザーの [Model Hierarchy] ビューからは、別のレベルを選択して開いて、階層内をすばやく移動でき ます。 第 2 章: Model Composer デザインの作成
第 3 章
C/C++ コードのカスタム ブロックとして
のインポート
概要
Model Composer では、C または C++ コードをインポートし、新しいブロックを作成できます。このブロックは、ラ イブラリに追加してほかの Model Composer ブロックと共にモデル内で使用できます。この機能を使用すると、カス タム ブロック ライブラリを構築して、それを Model Composer で使用できるようになります。 ヒント: import_function の例は、小さな一連の例を使用して C/C++ コードをインポートする機能のほとんどを示しま す。この例は、MATLAB のコマンド ウィンドウに「xmcOpenExample('import_function')」と入力すると開 くことができます。xmcImportFunction コマンドの使用
ザイリンクス Model Composer には MATLAB コマンド ラインから使用可能な xmcImportFunction コマンドが含 まれており、ソースおよびヘッダー ファイルで定義された関数を指定して、Model Composer ブロックまたはブロッ ク ライブラリ作成できます。xmcImportFunction コマンドには、次の構文を使用します。
xmcImportFunction('libName',{'funcNames'},'hdrFile',{'srcFiles'},
{'srchPaths'},'options')
説明:
• libName: 新しいブロックを追加する Model Composer ライブラリの名前を指定します。新しく作成するライブラ リの名前または既存のライブラリ名を指定できます。
• funcNames: ソースまたはヘッダー ファイルで定義された Model Composer ブロックとしてインポートする 1 つ または複数の関数名のリスト (セル配列) を指定します。{} のように空にすると、指定したヘッダー ファイル (hdrFile) で定義されているすべての 関数がインポートされます。名前空間内の関数には、完全な名前空間接頭 辞を指定する必要があります。たとえば、hls_math 内の 'sinf' 関数をインポートするには、完全な関数名 'hls::sinf' を指定する必要があります。 • hdrFile: 関数宣言または定義を含むヘッダー ファイル (.h) を指定します。現在の作業ディレクトリに含まれてい ない場合は、ヘッダー ファイルへの完全パスを指定する必要があります。たとえば、hls_math.h から関数をイ ンポートするには、完全な関数名 '$XILINX_VIVADO/include/hls_math.h' を指定する必要があります。 重要: 関数シグネチャはヘッダー ファイルで定義する必要があり、Model Composer (XMC) プラグマはヘッダー ファ イルの関数シグネチャの一部として指定する必要があります。
• srcFiles: 関数定義を検索する 1 つまたは複数のソース ファイルのリストを指定します。モデルで使用すると、ヘ ッダーおよびソース ファイルはモデルのメイン ヘッダー ファイル (headerFile) と共にシミュレーション用の 共有ライブラリにコンパイルされ、Model Composer Hub ブロックの追加に説明するように、Model Composer Hub ブロックで出力を生成するのに指定したターゲット ディレクトリにコピーされます。 • srchPaths: ヘッダーおよびソース ファイルの検索パスを 1 つまたは複数指定します。{} のように空にすると、検 索パスがないことを示し、MATLAB の現在のフォルダーが検索されます。HLS ヘッダー ファイルを含めるには、 '$XILINX_VIVADO/include' を使用します。 xmcImportFunction コマンドには次の options もあり、必須の引数の後に任意の順序で指定できます。 • 'unlock': 既存のライブラリがロックされている場合にロックを解除します。xmcImportFunction コマンドで既 存のライブラリにブロックを追加できますが、そのためにはまずロックを解除する必要があります。 • 'override': 指定したライブラリ内に存在する同じ名前のブロックを上書きします。
ヒント: xmcImportFunction のヘルプを表示するには、MATLAB コマンド ラインで「help xmcImportFunction」と入力します。前述の情報が表示されます。
たとえば、次の simple.h ヘッダー ファイルでは 2 つの倍精度浮動小数点の入力とポインター出力を含む
simple_add 関数が定義されています。この関数では、2 つの入力が加算され、その合計が出力として返されます。
void simple_add(const double in1, const double in2, double *out) {
*out = in1 + in2;
}
Model Composer ライブラリに simple_add 関数をブロックとしてインポートするには、MATLAB コマンド プロン プトに次のコマンドを入力します。
xmcImportFunction('SimpleLib',{'simple_add'},'simple.h',{},{})
説明:
• SimpleLib: ブロックを追加する Model Composer ライブラリの名前を指定します。 • simple_add: インポートする関数の名前を指定します。 • simple.h: 検索するヘッダー ファイルを指定します。 • C ソース ファイルおよび検索パスは指定されていません。この場合、関数定義が指定したヘッダー ファイルに含 まれている必要があり、指定したファイルは MATLAB の現在のフォルダーのみで検索されます。 ヒント: インポートするブロックと同じ関数名のブロックが指定したライブラリに既に存在する場合は、Model Composer で警告メッセージが表示されます。
xmcImportFunction が完了すると、作成された simple_add ブロックを含む SimpleLib ライブラリ モデルが開 きます。
図 11: simple_add ブロック シミュレーションでは、ライブラリ ブロックの C/C++ コードがコンパイルされ、ライブラリ ファイルが作成されて 読み込まれます。ライブラリ ファイルは、その後の実行でシミュレーションの初期化にかかる時間を短縮するために キャッシュされます。ライブラリ ブロックに含まれるソース コードは、ブロックをインポートし直したりライブラ リを作成し直さなくても変更できますが、キャッシュされたライブラリ ファイルは C/C++ ソース コードを変更する とアップデートされます。 ただし、関数シグネチャまたは関数へのパラメーターを変更した場合は、xmcImportFunction を再実行してブロ ックを作成し直す必要があります。この場合、override オプションを使用して、ライブラリ内の既存のブロック定 義を上書きする必要があります。 重要: インポートされた関数へのインターフェイスまたは関連の XMC プラグマを変更した場合は、 xmcImportFunction コマンドを再実行する必要があります。この場合、デザインからブロックを削除し、新しく 生成されたブロックをライブラリから追加してください。関数の内容を変更した場合は、xmcImportFunction を 再実行する必要はありません。 ブロック シンボルが作成されたら、そのシンボルをダブルクリックすると、インポートしたブロックのパラメーター を確認できます。パラメーターを表示すると、関数ポートが正しく定義されたかどうかを確認できます。 第 3 章: C/C++ コードのカスタム ブロックとしてのインポート
図 12: simple_add の [Block Parameters] ダイアログ ボックス
Model Composer への C/C++ のインポート
Model Composer では、C または C++ 関数をインポートしてブロックのライブラリを作成できますが、特別な要件に 従わないと、コードが正しく認識および処理されません。関数ソースは、ヘッダー ファイル (.h)、C または C++ ソ ース ファイル (.c、.cpp) のいずれかで定義できますが、ヘッダー ファイルには関数シグネチャを含める必要があり ます。 関数引数が実数または複素数型のスカラー、ベクター、または行列の関数をインポートできるほか、固定小数点型を 含む Model Composer でサポートされるすべてのデータ型を使用することもできます。Model Composer では、テン プレートとして関数を定義することも可能です。テンプレート変数は入力信号で定義するか、ブロックをモデルに追 加したときまたはシミュレーション前に指定する必要のあるカスタマイズ パラメーターとして定義します。コード で関数テンプレートを使用すると、異なるアプリケーションをサポートする Model Composer ブロックを作成でき、 ブロック ライブラリの再利用性が高まります。詳細は、関数テンプレートを使用したブロックの定義を参照してくだ さい。 第 3 章: C/C++ コードのカスタム ブロックとしてのインポート重要: 関数シグネチャはヘッダー ファイルで定義する必要があり、Model Composer (XMC) プラグマはヘッダー ファ イルの関数シグネチャの一部として指定する必要があります。
xmcImportFunction コマンドでは std::complex<T> または hls::x_complex<T> 型を使用した C/C++ 関数 がサポートされます。詳細は、複素数型の使用 を参照してください。
インポートされた関数の入力が 1D 配列の場合は、入力信号と関数引数間で自動マッピングを実行できます。たとえ ば、関数引数が a[10] の場合、Model Composer で接続される信号は、サイズ 10 のベクターか、1x10 または 10x1 サイズの行行列または列行列のいずれかにできます。 ただし、インポートした関数の入力および出力すべてがスカラー引数である場合、ベクター信号または行列信号をス カラー入力に接続できます。この場合、インポートした関数が入力信号のベクターの各値を処理するか、行列を別々 の値として処理することで、これらの値が出力信号のベクターまたは行列にまとめられます。たとえば、スカラー入 力に接続されるサイズが 10 のベクターの場合、ベクターの各要素が処理され、出力信号にサイズ 10 のベクターが返 されます。 入力を持たず、出力を生成するだけの関数をインポートできます。これはソース ブロックと呼ばれ、出力はスカラ ー、ベクター、複素数、行列のいずれかになります。複数出力を持つソース ブロックをインポートすることもできま す。次の関数例の場合、入力ポートがなく、y が出力です。
#include <stdint.h>
#include <ap_fixed.h>
#pragma XMC OUTPORT y
#pragma XMC PARAMETER Limit
template <typename T>
void counter(T &y, int16_t Limit)
{
static T count = 0;
count++;
if (count > Limit)
count =0;
y = count;
}
ヒント: ソース ブロックに入力がないので、次の図の関数宣言に示すように、ブロックが xmcImportFunction コ マンドで作成されると、SampleTime パラメーターが自動的に追加されます。デフォルト値は 1 なので、サンプル時 間はモデルから継承されます。このサンプル時間は、次に示すように、ブロックをモデルに追加する際にカスタマイ ズして、明示的に指定することもできます。 第 3 章: C/C++ コードのカスタム ブロックとしてのインポート図 13: ソース ブロックのサンプル時間の設定 関数引数のポートの方向は、xmcImportFunction コマンドで自動的に決定されるか、ヘッダー ファイルの関数シ グネチャでプラグマを使用して手動で指定できます。 • 入力および出力ポートの自動決定: ○ 関数の return 値は、戻り値が void の場合を除き、常に出力として定義されます。 ○ const 修飾子で宣言される仮関数引数は、入力として定義されます。 ○ 参照、ポインター型、または const 修飾子のない配列型で宣言された引数は、出力として定義されます。 ○ その他の引数 (値で読み込まれるスカラーなど) は、デフォルトで入力として定義されます。 • 入力および出力ポートの手動定義: ○ ヘッダー ファイルの関数宣言の直前に INPORT および OUTPORT プラグマを追加すると、入力および出力と して定義する関数引数を指定できます。
○ #pragma XMC INPORT <parameter_name> [, <parameter_name>...] ○ #pragma XMC OUTPORT <parameter_name> [, <parameter_name>...]
次の例では、const 修飾子があるので、in は自動的に入力として定義され、out は出力として定義されます。イン ポートされたブロックには、関数の return 整数値があるので、2 つ目の出力も含まれます。
次の関数では、in は自動的に入力として定義され、out は出力になりますが、return 値はありません。
void func(const in[512], int out[512]);
次の例では、ソース コードの関数宣言の直前にプラグマを追加することで、ポートが手動で指定されています。関数 を Model Composer にインポートする必要のある元の C++ コードに加えた変更はこれだけです。この例の場合、どの パラメーターをブロックの入力にするか、どのパラメーターをブロックの出力にするかをプラグマで指定しています。
#pragma XMC INPORT din
#pragma XMC OUTPORT dout
void fir_sym (ap_fixed<17,3,AP_TRN,AP_WRAP> din[100],
ap_fixed<17,3,AP_TRN,AP_WRAP> dout[100]);
ヒント: ap_fixed は Vivado HLS と互換性のある固定小数点を指定しています。 ヘッダー ファイルの関数シグネチャにプラグマを手動で追加して関数の入力および出力パラメーターを定義する方 法は、コードに const 修飾子が使用されておらず、関数に階層があり、const 修飾子を追加するためにソース コー ドを大幅に変更する必要のある場合に便利です。また、入力および出力をコード内で明示的に指定できるので、イン ポート ブロックとの関連をより明確にできます。 Model Composer にインポートする C または C++ コードを記述する際は、次の点にも注意する必要があります。 • ソース コードは 32 ビットおよび 64 ビット アーキテクチャ間で移植できるように開発する必要があります。 • ソース コードには、リソースおよびパフォーマンス最適化に Vivado HLS のプラグマを使用できます。これらのプラグマは Model Composer でも使用されますが、Model Composer により変更されたり追加されたりすることはあ りません。 • コードにスタティック変数がある場合、その関数をインポートするブロックのインスタンスすべてで 共有されま す。この変数をすべてのインスタンスで 共有しない場合は、スタティック変数を含む関数をコピーして名前を変 更し、xmcImportFunction コマンドを使用して新しいライブラリ ブロックをインポートします。 • C++ (.cpp ソース ファイル) ではなく C (.c) ソース ファイルを使用してライブラリ関数をモデリングする場合 は、Vivado HLS などのダウンストリーム ツールのために、.h ヘッダー ファイルに extern "C" 宣言を含める必 要があります。次に、ヘッダー ファイルでの extern "C" の宣言例を示します。
// c_function.h:
#ifdef __cplusplus
extern 'C' {
#endif
void c_function(int in, int &out);
#ifdef __cplusplus
}
#endif
複素数型の使用
Vivado HLS の C/C++ コードでは、std::complex<T> や hls::x_complex<T> を使用して xmcImportFunction ブ ロックの複素数信号を記述できますが、<T> が ap_fixed<..> または ap_int<..> でない限り、ストリーミング std::complex<T> 変数はサポートされません。ストリーミング以外の大きな配列変数は、かなりのハードウェア リソースを使用する可能性があります。
Model Composer で生成されるコードでは、hls::x_complex を使用して複素数信号を記述します。インポートし た C/C++ ブロック関数が std::complex を使用して記述される場合、出力コードを生成すると、
hls::x_complex-to-std::complex アダプターに自動的に挿入されて、そのブロック ポートの複素数型に変換さ れます。
std::complex を使用する関数のインポートもこれまで同様サポートされますが、インポートした関数に
std::complex<T> データ型のスカラー以外の引数が含まれる場合は、コード生成時に、hls::x_complex を使用 して関数を書き直すと、結果の質が改善されて複素数変数をストリーミングできるようになることを示す警告メッセ ージが表示されます。
C/C++ コードには、複素数型の宣言に必要なヘッダー ファイルも含める必要があります。hls::x_complex 型の場 合、xmcImportFunction コマンドに hls_x_complex.h ヘッダー ファイルの検索パス ‘$XILINX_VIVADO/ include’ も含める必要があります。たとえば、次は complex_mult 関数をインポートして、必要なインクルード パスを指定しています。
xmcImportFunction('my_lib',{'complex_mult'}, 'complex_mult.h', {},
{'$XILINX_VIVADO/include'});
複素数型を使用した関数の例#include "hls_x_complex.h"
hls::x_complex<double>
complex_mult(hls::x_complex<double> in1, hls::x_complex<double> in2)
{ return in1 * in2; }
#include <complex>
std::complex<double>
complex_mult2(std::complex<double> in1, std::complex<double> in2)
{ return in1 * in2; }
#include <complex>
void
complex_mult3(std::complex<double> in1, std::complex<double> in2,
std::complex<double> &out1)
{ out1.real(in1.real() * in2.real() - in1.imag() * in2.imag());
out1.imag(in1.real() * in2.imag() + in1.imag() * in2.real()); }
関数テンプレートを使用したブロックの定義
重要: テンプレート構文を使用するには、xmcImportFunction を実行したときに、関数シグネチャおよび定義がヘ ッダー ファイルで指定されている必要があります。 int32 のように定義したデータ型のみをサポートする関数を記述するのが一般的ですが、異なるサイズの入力または 異なるデータ型をサポートするブロックや、固定小数点長および小数部の長さが異なる信号をサポートするブロック を作成することが必要な場合もあります。これには、関数テンプレートを使用してさまざまな信号サイズ、データ型、 またはデータ次元をサポートするブロックを作成します。 ブロックは、次の例のように関数テンプレートを使用して定義できます。#include <stdint.h>
template <int ROWS, int COLS>
void simple_matrix_add(const int16_t in1[ROWS][COLS],
const int16_t in2[ROWS][COLS],
int16_t out[ROWS][COLS]) {
for (int i = 0; i<ROWS; i++) {
for (int j = 0; j<COLS; j++) {
out[i][j] = in1[i][j] + in2[i][j];
}
}
}
この例では、テンプレート パラメーター ROWS および COLS を使用しています。たとえば、入力配列および出力配列 の実際の次元 in1[ROWS][COLS] は、ブロックへの入力信号の次元によりシミュレーション時に決定されます。 ROWS および COLS は関数引数の次元を定義するのに使用されるテンプレート パラメーターで、i<ROWS のように関 数の本体でも使用されます。 関数を Model Composer にインポートするには、次のコマンドを使用します。
xmcImportFunction('SimpleLib',{'simple_matrix_add'},...
'template_example.h',{},{},'unlock')
ヒント: この例の省略記号 (...) は、コマンドが次の行に続いていることを示しています。詳細は、MATLAB 資料の「複 数行での長いステートメントの継続」を参照してください。 テンプレート パラメーターを使用して、単純な算術演算を実行できます。たとえば、次のコードでは入力行列の ROWS と COLS を乗算して出力を定義しています。#include <stdint.h>
#pragma XMC INPORT in
#pragma XMC OUTPORT out
template<int ROWS,int COLS>
void columnize(const int16_t in[ROWS][COLS], int16_t out[ROWS*COLS]) {
for (int i = 0; i<ROWS; i++) {
for (int j = 0; j<COLS; j++) {
out[i*COLS+j] = in[i][j];
}
}
}
図 14: columnize ファンクション 第 3 章: C/C++ コードのカスタム ブロックとしてのインポートほかにも、テンプレート パラメーターおよび整数定数の両方を使用した +、-、*、/、%、<<、>> などの単純な演算 がサポートされています。次に例を示します。
template<int M, int N>
void func(const int in[M][N], int out[M*2][M*N]);
template<int ROWS, int COLS>
void func(array[2 * (ROWS + 1) + COLS + 3]);
また、次に示すような関数テンプレートを使用し、可変ワード長および整数長の固定小数点データ型を使用する関数 テンプレートを定義することもできます。
#include <stdint.h>
#include <ap_fixed.h>
#pragma XMC OUTPORT out
template <int WordLen, int IntLen>
void fixed_add(const ap_fixed<WordLen,IntLen> in1,
const ap_fixed<WordLen,IntLen> in2,
ap_fixed<WordLen+1,IntLen> &out) {
out = in1+in2;
}
上記の例では、Vivado HLS からの固定小数点表記が使用され、ワード長および整数長が指定されています。Model Composer では、データ型の使用に説明するように、ユーザーがワード長と小数部の長さを指定します。この場合、 Model Composer の固定小数点データ型をインポートされた fixed_add ブロックに接続する際に注意が必要です。 たとえば、上記の関数で WordLen が 16、IntLen が 11 の場合、Model Composer の固定小数点型ではワード長が 16、小数部の長さが 5 になります。Vivado HLS での固定小数点の表記については、『Vivado Design Suite ユーザー ガ イド: 高位合成』 (UG902) を参照してください。
ヒント: 上記の例に示すように、固定小数点のテンプレート パラメーターでは単純な算術演算もサポートされていま す。
fixed_add 関数をインポートして Model Composer でブロックを作成するには、次のコマンドを使用します。
xmcImportFunction('SimpleLib',{'fixed_add'},fixed_example.h',{},...
{'$XILINX_VIVADO/include'})
データ型の関数テンプレート
データ型の関数テンプレートは、汎用データ型を使用可能な関数です。関数テンプレートを使用すると、複数のデー タ型をサポートするライブラリ関数を作成でき、各データ型をサポートするために Model Composer ブロック ライブ ラリでコードまたはブロックを複製する必要はありません。Model Composer の xmcImportFunction コマンドを 使用して、ブロックでサポートされるどのデータ型の信号にでも接続可能な汎用ライブラリ ブロックを作成します。 データ型 (typename) テンプレート パラメーターは、コードおよびシミュレーション ラッパーが生成されるシミュレ ーション実行時間に解決されます。パラメーターはシミュレーション中にライブラリ ブロックに接続されている信 号で指定された実際のデータ型に置き換えられます。置き換えられるデータ型は、データ型の使用に説明されている Model Composer でサポートされるデータ型である必要があります。 複数のデータ型をサポートするブロックをインポートするには、関数テンプレートを使用します。次に例を示します。
template <typename T>
T max(T x, T y) {
return (x > y) ? x : y;
第 3 章: C/C++ コードのカスタム ブロックとしてのインポートまたは、complex 関数引数を使用した関数の場合、この例は次のようになります。
#include <complex>
template <typename T>
void mult_by_two(std::complex< T > x, std::complex< T > *y)
{
*Out = In1 * 2;
}
データ型は Model Composer によりシミュレーション中に決定されます。typename (または class) パラメーター はブロックの入力信号から伝搬されるか、シミュレーション前にユーザーが定義する必要のあるカスタマイズ パラメ ーターです。 重要: 関数またはクラスのデータ型は、出力から伝搬させることはできません。 次の例では、関数テンプレートでパラメーター T をカスタマイズ パラメーターとして定義しています。入力引数 x ま たは y に関連付けられていないので、ブロックをモデルに追加したときにユーザーが値を指定する必要があります。
template <typename T>
T min(int x, int y) {
return (x < y) ? x : y;
}
生成された Library Function ブロックの [Block Parameters] ダイアログ ボックスには、次の図に示すように、テンプ レート引数を入力する編集フィールドがあります。
図 15: Library Function の [Block Parameters] ダイアログ ボックス
テンプレート構文では、関数またはクラスのデータ型テンプレート パラメーターをほかのテンプレート パラメータ ーで指定できます。指定順序は重要ではありません。次に例を示します。