Model Composer
ユーザー
ガイド
UG1262 (v2020.1) 2020 年 6 月 3 日 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資 料によっては英語版の更新に対応していないものがあります。日本語版は参考用としてご使用の上、最新情報 につきましては、必ず最新英語版をご参照ください。 すべてのバージョンを表示改訂履歴
次の表に、この文書の改訂履歴を示します。
セクション 改訂内容
2020 年 6 月 3 日 バージョン 2020.1
サポートされる MATLAB バージョンおよ
びオペレーティング システム
ザイリンクス Model Composer では、次のバージョンの MATLAB® がサポートされます。
• 2019a • 2019b • 2020a
x86 および x86-64 プロセッサ アーキテクチャでは、次のオペレーティング システムがサポートされます。 • Microsoft Windows 10.0 1809 Update、10.0 1903 Update、10.0 1909 Update (64 ビット)、英語版/日本語版 • Red Hat Enterprise Workstation/Server 7.4、7.5、7.6、7.7 (64 ビット)
• Ubuntu Linux 16.04.5 LTS、16.04.6 LTS、18.04.1 LTS、18.04.2 LTS、18.04.3 LTS、18.04.4 LTS (64 ビット) 注記: ザイリンクス Model Composer を MATLAB バージョン R2020a と共に使用する場合は、RHEL 7.4 OS はサポー トされません。
改訂履歴
サポートされる MATLAB バージョンおよびオペレーティング システム
...3第 1 章: 概要
... 6 Model Composer とは...6 新機能および制限... 8第 2 章: Model Composer デザインの作成
... 9 Model Composer の起動...10 新規モデルの作成... 10 モデルへのブロックの追加... 11 ブロックの接続... 13 データ型の使用... 14 最上位サブシステム モジュールの作成...23第 3 章: C/C++ コードのカスタム ブロックとしてのインポート
...24 概要...24 xmcImportFunction コマンドの使用... 24 Model Composer への C/C++ のインポート...27 関数テンプレートを使用したブロックの定義...31 xmcImportFunction のプラグマ...43 ライブラリ ブラウザーへのユーザー ライブラリの追加...48 インポートしたブロックのデバッグ... 49第 4 章: 出力の生成
...55 概要...55Model Composer Hub ブロックの追加...55
インプリメンテーションのスループットの制御...57 インターフェイス仕様の定義...63 Vivado 用 IP パッケージの生成... 67 System Generator IP の生成...71 C++ コードの生成... 75 Model Composer のログ ファイル... 77
第 5 章: デザインのシミュレーションおよび検証
...79 概要...79C++ コードの検証... 81 C/RTL コードの検証... 82
付録 A: ターゲット デバイスまたはボードの選択
... 83 [Device Chooser] ダイアログ ボックス...83付録 B: Model Composer ブロック ライブラリ
... 84 サポートされる Simulink ブロック... 84 Model Composer ブロックの分類... 85 RTL IP ベースのブロック...89 Model Composer ブロック... 91付録 C: その他のリソースおよび法的通知
...216 ザイリンクス リソース...216 Documentation Navigator およびデザイン ハブ... 216 参考資料... 216 お読みください: 重要な法的通知...217第 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 以上含むライブラリが含まれます。 これには、数学、線形代数、論理、ビット演算などのアルゴリズムを記述した基本的な論理ブロックが含まれます。 また、画像処理およびコンピューター ビジョン用の特定用途向けブロックも多く含まれます。Xilinx Model Composer ブロック ライブラリには、次のカテゴリのエレメントが含まれています。
表 1: Xilinx 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 など)。
表 1: Xilinx 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 との統合なし。 • アクセラレータ モードおよびラピッド アクセラレータ モード。
第 2 章
Model Composer デザインの作成
Model Composer デザインには、次のものが含まれます。 1. 入力を決定し、ソース信号を供給する Simulink® ブロック。これらのブロックは、デザインのシミュレーション に使用されますが、Model Composer で生成される出力には影響しません。 2. Model Composer モデルで定義されたアルゴリズムをカプセル化する最上位サブシステム ブロック (最上位サブ システム モジュールの作成 を参照)。このサブシステム モジュールには、次を含めることができます。 • アルゴリズムを定義する Model Composer ブロック ライブラリからのブロック (付録 B: Model Composer ブロック ライブラリ を参照)。
• カスタムのインポート関数 (第 3 章: C/C++ コードのカスタム ブロックとしてのインポートを参照)。 • ハードウェア インターフェイスを定義する Interface Spec ブロック (インターフェイス仕様の定義 を参照)。 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 の [Start Page] が表示されます。Model Composer の機能が Simulink プラットフォームに読み込まれます。 Model Composer では、最新リリースの MATLAB がサポートされます。サポートされる MATLAB バージョンおよび オペレーティング システムの詳細は、サポートされる MATLAB バージョンおよびオペレーティング システム を参照 してください。システムに複数バージョンの 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 のスタート ページの左側には、最近開いたモデルがリストされ、これらの 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] をクリックすると開くことができます。ライブラリ ブラウザーには、標 準的な Simulink ライブラリおよびザイリンクスの Model Composer ライブラリが表示されます。ヒント: ライブラリ ブラウザーは、コマンド プロンプトで slLibraryBrowser コマンドを入力しても開くことが できます。
Xilinx Model Composer ブロックは、機能別に分類されています。次の図に、ライブラリ ブラウザーの [Xilinx Model Composer] → [Computer Vision] ブロック ライブラリを示します。
図 3: ライブラリ ブラウザー ライブラリ ブラウザー内でブロックをダブルクリックすると、[Block Parameter] ダイアログ ボックスが開き、選択 したブロックで定義されるさまざまなパラメーターがデフォルト値で表示されます。ブロックはライブラリに含まれ ているので、パラメーターは表示しかできません。パラメーターを編集するには、ブロックをデザイン キャンバスに 追加する必要があります。 ブロックの詳細は、ライブラリ ブラウザーでブロックを右クリックして、[Help] をクリックすると確認できます。ま たは、ライブラリ ブラウザーでブロックをダブルクリックし、ダイアログ ボックスで [Help] をクリックしても確認 できます。ヘルプ ブラウザーが開き、ブロックの情報が表示されます。 ブロックをキャンバスにドラッグ アンド ドロップすると、定義済みのデフォルトのパラメーター値でブロックが追 加されます。 ヒント: Simulink エディターのデザイン キャンバスをクリックしてブロック名を入力しても、ブロックを現在 のモデルにすばやく追加できます。Simulink ではライブラリから入力した名前に一致するものが表示されるの で、該当するブロックを選択して追加します。
ブロックの接続
ブロックの出力ポートは、ほかのブロックの入力ポートに信号ラインで接続できます。信号ラインは、モデルを通過 するデータフローを定義します。信号には次のような複数の属性を含めることができます。 • データ型: 信号で運ばれるデータ型を定義します。整数、浮動小数点型、固定小数点型などのさまざまなデータ型 を使用できます。詳細は、データ型の使用 を参照してください。 • 信号の次元: 値をスカラー、ベクター、または行列として定義します。詳細は、Simulink 資料の「信号の次元」お よび「行列、ベクトル、およびスカラー」を参照してください。 • 複雑性: 値を複素数または実数として定義します。詳細は、Simulink 資料の「信号値」を参照してください。次の 図は、複素数がモデルを伝搬するところを示しています。 図 4: 複素信号値 信号ラインを追加するには、カーソルを Simulink ブロックの入力または出力ポートの上に置きます。カーソルがプラ ス (+) マークに変わります。クリックして、ポートからドラッグします。マウス ボタンを押したままにしてドラッグ して動かすと、接続ラインが点線で表示されます。点線は、完全に接続されていない信号を示します。 カーソルを接続する 2 つ目のポートまで移動したら、マウス ボタンを放します。入力ポートから開始する場合は出力 ポートで止めるか別の信号ラインに接続し、出力から開始する場合は入力で止めます。Simulink でポートが信号ライ ンで接続されます。矢印は、信号フローの方向を示します。 マウスを右クリックしてドラッグすると、既存のラインに接続できます。これにより、分岐ラインが作成され、既存 の信号ラインの指定した位置に接続されます。分岐ラインは、接続された信号によって、入力または出力に接続でき ます。 ヒント: ブロックは、Ctrl キーを押したまま順に選択しても接続できます。1 つ目のクロックの出力が 2 つ目の ブロックの入力に接続されます。Ctrl キーを押したまま別のブロックを接続すると、チェーン接続されます。 [Run] simulation] をクリックすると、Simulink のモデルがアップデートされます。モデルは、デザイン プロセスの任 意の段階で [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 の固定小数点型を倍精度の浮動小数点型に変換できないことを 示しています。
図 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 の場合は表示されません。 • nn: 2 進数小数点がワードの最下位ビットの左にある場合は n を表記し、最下位ビットの右にある場合は n は表記 しません。 • [fl]: 固定小数点型の小数部の長さを指定し、ワードの最下位ビットに対する 2 進数小数点の位置を示します。 たとえば、x_sfix16_En6 は符号付き 16 ビットの固定小数点で、2 進小数点の右側に 6 ビットが割り当てられてい ます。 また、固定小数点型では、データ オーバーフローが発生した場合の処理、丸めまたは切り捨ての有無も指定できま す。詳細は、Data Type Conversionを参照してください。
ザイリンクス Model Composer の固定小数点型は DTC ブロックを使用して Simulink の固定小数点型に変換する必要 がありますが、Model Composer の固定小数点型と Simulink の固定小数点型を直接変換することはできません。次の 方法を使用できます。
1. ライブラリ ブラウザーから [Xilinx Model Composer] ライブラリにある DTC ブロックを使用して、ザイリンクス Model Composer の固定小数点型を double 型に変換します。
ヒント: ザイリンクス 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 からは、モデルまたはブロックで使用する変数 を作成、編集、管理できます。
オーバーフローの管理
ブロックのデータ型定義で信号に入力されるデータ値がサポートされないことがあります。信号の値がブロックのデ ータ型で表現するには大きすぎるか小さすぎる場合、オーバーフローが発生することがあります。発生する可能性の あるオーバーフローのタイプには、折り返しオーバーフローと飽和オーバーフローがあります。 • [Wrap on Overflow]: デフォルトのオーバーフロー メカニズムで、ビット値がオーバーフロー ポイントで折り返さ れます。たとえば、2 つの値の乗算などの算術演算でデータ型の最大値よりも大きな結果が生成された場合、結果 が折り返されます。 • [Saturate on Overflow]: 加算および乗算などのすべての演算を、データ型でサポートされる最小値と最大値の固定 範囲に制限します。つまり、値が最大値または最小値に達すると停止します。 折り返しは、値がデータ型を超えると自然に発生するので、これがオーバーフロー処理のデフォルトです。チェック は必要ありません。[Saturate on 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] を選択すると、入力値が出力でサポートされる値の範囲よりも大きすぎたり小さすぎた りする場合や、単に最大値やサポートされる最小値に到達した場合に、飽和処理されることを意味します。値は飽和 したら、変更されません。
固定小数点のオーバーフロー モード
固定小数点データ型の場合、たとえば 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 にメッセージが表示されます。同じブロックに対する次の警告は無視され、シミュレ ーションは続行されます。
最上位サブシステム モジュールの作成
Model Composer モデルから出力を生成するには、Model Composer モデルの最上位に Model Composer Hub ブロッ ク (Model Composer Hub ブロックの追加を参照) とアプリケーション デザインを含むサブシステムを含める必要が あります。デザインの最上位にインスタンシエートされているサブシステムから出力を生成するには、サブシステム に含まれるのがザイリンクス Model Composer ブロックと一部の Simulink® ブロックのみであることが必要です。ザ
イリンクス 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 ブロックとしてインポ ートするものをリスト (セル配列) で指定します。{} のように空にすると、指定したヘッダー ファイル (hdrFile) で定義されているすべての 関数がインポートされます。名前空間内の関数には、完全な名前空間接頭辞を指定す る必要があります。たとえば、hls_math 内の 'sinf' 関数をインポートするには、完全な関数名 'hls::sinf' を指定する必要があります。
• hdrFile: 関数宣言または定義を含むヘッダー ファイル (.h) を指定します。現在の作業ディレクトリに含まれて いない場合は、ヘッダー ファイルへの完全パスを指定する必要があります。たとえば、hls_math.h から関数を インポートするには、完全な関数名 '$XILINX_VIVADO/include/hls_math.h' を指定する必要があります。
• 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 を再実行する必要はありません。 ブロック シンボルが作成されたら、そのシンボルをダブルクリックすると、インポートしたブロックのパラメーター を確認できます。パラメーターを表示すると、関数ポートが正しく定義されたかどうかを確認できます。
図 12: simple_add の [Block Parameters] ダイアログ ボックス
Model Composer への C/C++ のインポート
Model Composer では、C または C++ 関数をインポートしてブロックのライブラリを作成できますが、コードが正し く認識および処理されるようにするため、特別な要件に従う必要があります。関数ソースは、ヘッダー ファイル (.h)、C または C++ ソース ファイル (.c、.cpp) のいずれかで定義できますが、ヘッダー ファイルには関数シグネチ ャを含める必要があります。 関数引数が実数または複素型のスカラー、ベクター、または行列の関数をインポートできるほか、固定小数点型を含 む Model Composer でサポートされるすべてのデータ型を使用できます。Model Composer では、テンプレートとし て関数を定義することも可能です。テンプレート変数は入力信号で定義するか、ブロックをモデルに追加したときま たはシミュレーション前に指定する必要のあるカスタマイズ パラメーターとして定義します。コードで関数テンプ レートを使用すると、異なるアプリケーションをサポートする Model Composer ブロックを作成でき、ブロック ライ ブラリの再利用性が高まります。詳細は、関数テンプレートを使用したブロックの定義 を参照してください。 重要: 関数シグネチャはヘッダー ファイルで定義する必要があり、Model Composer (XMC) プラグマはヘッダ 第 3 章: C/C++ コードのカスタム ブロックとしてのインポートxmcImportFunction コマンドでは、std::complex<T> または hls::x_complex<T> 型を使用する C/C++ 関数 がサポートされます。詳細は、複素型の使用 を参照してください。
インポートした関数の入力が 1-D 配列の場合は、ツールで入力信号と関数引数を一部自動的にマップできます。たと えば、関数引数が 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 コマンドを使用してブロックを作成する と、次の図の [Function declaration] に示すように、SampleTime パラメーターが自動的に追加されます。デフ ォルト値は -1 で、サンプル時間はモデルから継承されます。モデルに追加するときにブロックをカスタマイズ することにより、サンプル時間を明示的に指定することもできます。図 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 を使用して記述されている場合、出力コードを生成すると、
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];
}
}
}
ほかにも、テンプレート パラメーターおよび整数定数の両方を使用した +、-、*、/、%、<<、>> などの単純な演算 がサポートされています。次に例を示します。
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] ダイアログ ボックス
テンプレート構文では、関数またはクラスのデータ型テンプレート パラメーターをほかのテンプレート パラメータ ーで指定できます。指定順序は重要ではありません。次に例を示します。
template <typename T1, int ROWS, int COLS, int W, int I>
T1 func(T1 x[ROW][COLS], ap_fixed<W, I> &y) {
...
}
重要: 上記の例では、T1 テンプレート パラメーターが関数の戻り値および入力 x のデータ型の両方を指定する のに使用されています。この場合、これは 1 つのテンプレート パラメーターなので、両方の引数が同じデータ 型になり、入力信号からブロックに伝搬されます。 第 3 章: C/C++ コードのカスタム ブロックとしてのインポートSUPPORTED_TYPES/UNSUPPORTED_TYPES プラグマ データ型 (typename) テンプレート パラメーター (または class) を定義する際、関数シグネチャの一部として SUPPORTED_TYPES または UNSUPPORTED_TYPES プラグマを使用して変数でサポートされるデータ型を定義でき ます。これを次のコード例に示します。
#pragma XMC INPORT x
#pragma XMC INPORT y
#pragma XMC SUPPORTED_TYPES T: int8, int16, int32, double, single, half
template <class T>
T max(T x, T y) {
return (x > y) ? x : y;
}
#pragma XMC UNSUPPORTED_TYPES T: boolean
#pragma XMC INPORT x, y
template <typename T>
T min(T x, T y) {
return (x < y) ? x : y;
}
Model Composer では、データ型の使用に示すデータ型がサポートされます。テンプレート パラメーターでサポート されるデータ型を指定するには、サポートされるデータ型またはサポートされないデータ型をリストします。 SUPPORTED_TYPES と UNSUPPORTED_TYPES プラグマは、同じものを反対の方法で指定します。 • SUPPORTED_TYPES: テンプレート パラメーター名 (param) を指定し、そのパラメーターでサポートされるデータ 型をリストします。リストされていないデータ型はサポートされません。#pragma XMC SUPPORTED_TYPES param: type1, type2, ...
• UNSUPPORTED_TYPES: テンプレート パラメーター名 (param) を指定し、そのパラメーターでサポートされない データ型をリストします。リストされていないデータ型すべてがサポートされます。
#pragma XMC UNSUPPORTED_TYPES param: type1, type2, ...
SUPPORTED_TYPES または UNSUPPORTED_TYPES プラグマの指定に基づいて、Model Composer でブロックに接続 されている入力信号のデータ型がサポートされているかどうかが確認されます。これらのプラグマを使用しない場 合、データ型テンプレート パラメーターで Model Composer でサポートされるデータ型がすべてサポートされます。 関数テンプレートの特殊化およびオーバーロード
xmcImportFunction コマンドでは、関数テンプレートの特殊化がサポートされています。Model Composer では、 複数のデータ型をサポートする汎用関数テンプレートのライブラリ ブロックが作成されますが、一致するデータ型の 入力信号に接続されたときに使用される特殊化関数も含まれます。汎用関数と特殊化関数の両方がブロック DLL に コンパイルされます。次に例を示します。