高位合成 - Xilinx

Vivado Design Suite ユー
ザー ガ イ ド
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
Notice of Disclaimer
The information disclosed to you hereunder (the “Materials”) is provided solely for the selection and use of Xilinx products.To the maximum
extent permitted by applicable law:(1) Materials are made available "AS IS" and with all faults, Xilinx hereby DISCLAIMS ALL WARRANTIES
AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY,
NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether in contract or tort, including
negligence, or under any other theory of liability) for any loss or damage of any kind or nature related to, arising under, or in connection with,
the Materials (including your use of the Materials), including for any direct, indirect, special, incidental, or consequential loss or damage
(including loss of data, profits, goodwill, or any type of loss or damage suffered as a result of any action brought by a third party) even if such
damage or loss was reasonably foreseeable or Xilinx had been advised of the possibility of the same.Xilinx assumes no obligation to correct
any errors contained in the Materials or to notify you of updates to the Materials or to product specifications.You may not reproduce, modify,
distribute, or publicly display the Materials without prior written consent.Certain products are subject to the terms and conditions of the
Limited Warranties which can be viewed at http://www.xilinx.com/warranty.htm; IP cores may be subject to warranty and support terms
contained in a license issued to you by Xilinx.Xilinx products are not designed or intended to be fail-safe or for use in any application
requiring fail-safe performance; you assume sole risk and liability for use of Xilinx products in Critical
Applications:http://www.xilinx.com/warranty.htm#critapps.
© Copyright 2012 - 2013 Xilinx, Inc. Xilinx, the Xilinx logo, Artix, ISE, Kintex, Spartan, Virtex, Vivado, and other designated brands included
herein are trademarks of Xilinx in the United States and other countries.All other trademarks are the property of their respective owners.
本資料は英語版 (v2013.4) を翻訳 し た も ので、 内容に相違が生 じ る 場合には原文を優先 し ます。
資料に よ っ ては英語版の更新に対応 し ていない も のがあ り ます。
日本語版は参考用 と し て ご使用の上、 最新情報につ き ま し ては、 必ず最新英語版を ご参照 く だ さ い。
こ の資料に関す る フ ィ ー ド バ ッ ク お よ び リ ン ク な ど の問題につ き ま し ては、[email protected] ま でお知 ら せ く だ さ
い。 いただ き ま し た ご意見を参考に早急に対応 さ せていただ き ます。 なお、 こ の メ ール ア ド レ スへのお問い合わせは受け付け
てお り ません。 あ ら か じ めご了承 く だ さ い。
改訂履歴
次の表に、 こ の文書の改訂履歴を示 し ます。
日付
バージ ョ ン
改訂内容
2013/03/20
2013.1
内容全般を ア ッ プデー ト
2013/06/19
2013.2
内容全般を ア ッ プデー ト し 、 第 3 章の 「高位合成コ ーデ ィ ン グ ス タ イ ル」 に詳細を追加
2013/10/02
2013.3
内容全般を ア ッ プデー ト し 、 第 3 章の 「高位合成コ ーデ ィ ン グ ス タ イ ル」 に詳細を追加
2013/12/19
2013.4
全体的に内容の構造を ア ッ プデー ト し 、 HLS リ フ ァ レ ン ス セ ク シ ョ ン を新 し く 追加
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
2
目次
改訂履歴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
第 1 章 : 高位合成の概要
概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
高位合成 (HLS) の コ ン セプ ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Vivado HLS の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
高位合成フ ロ ー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
チ ュ ー ト リ アル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
C の検証 と コ ーデ ィ ン グ ス タ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
C デザ イ ンのシ ミ ュ レーシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
任意精度デー タ 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
浮動小数点型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
イ ン タ ーフ ェ イ ス の管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
イ ン タ ーフ ェ イ ス合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
ポー ト イ ン タ ーフ ェ イ ス の指定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
SystemC の イ ン タ ーフ ェ イ ス合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
手動の イ ン タ ーフ ェ イ ス仕様 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
デザ イ ン最適化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
チ ェ ッ ク リ ス ト お よ びガ イ ド ラ イ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
ク ロ ッ ク 、 タ イ ミ ン グ、 お よ び RTL 出力 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
関数の最適化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
関数の再利用、 イ ン ラ イ ン化、 お よ び イ ン ス タ ン シエーシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
関数のパ イ プ ラ イ ン処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
レ イ テ ン シ制約 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
関数の イ ン タ ーフ ェ イ ス プ ロ ト コ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
ループの最適化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
ループの展開 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
ループの結合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
ネ ス ト 化 さ れたループの フ ラ ッ ト 化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
ループのデー タ フ ロ ー パ イ プ ラ イ ン処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
ループのパ イ プ ラ イ ン処理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
ループ キ ャ リ ー依存性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
ループ反復の制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
ループの レ イ テ ン シ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
ア レ イ の最適化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
ア レ イ の初期化 と リ セ ッ ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
メ モ リ リ ソ ース の選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
ア レ イ のマ ッ プ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
ア レ イ のパーテ ィ シ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
ア レ イ の変更 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
ア レ イ の ス ト リ ー ミ ン グ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
ロ ジ ッ ク 構造の最適化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
演算子選択 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
ハー ド ウ ェ ア リ ソ ース の制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
構造体パ ッ キ ン グ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
演算調整 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
3
検証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RTL の自動検証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RTL デザ イ ンのエ ク ス ポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
RTL 合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IP カ タ ロ グ形式でのエ ク ス ポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
System Generator へのエ ク ス ポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Pcore フ ォーマ ッ ト でのエ ク ス ポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
合成済みチ ェ ッ ク ポ イ ン ト のエ ク ス ポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
132
133
138
139
140
140
142
144
第 2 章 : 高位合成演算子および コ ア
演算子お よ び コ ア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
合成の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ス ケジ ュー リ ング と は . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
バ イ ンデ ィ ン グ と は . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
演算子、 コ ア、 指示子について . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
演算子お よ び コ アの制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
演算子の制限 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
リ ソ ース の制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ス ケ ジ ュ ールの制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
バ イ ンデ ィ ン グの制御 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
高位合成の演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
高位合成の コ ア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
フ ァ ン ク シ ョ ン ユニ ッ ト コ ア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ス ト レージ コ ア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
コネ ク ター コ ア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
アダプ タ ー コ ア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
浮動小数点 コ ア . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
145
145
145
146
147
148
148
148
149
150
151
153
153
154
154
155
155
第 3 章 : 高位合成 コ ーデ ィ ング ス タ イル
構文の表記規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
は じ めに . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
コー ド 例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C の合成. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
最上位デザ イ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
テ ス ト ベンチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デザ イ ン フ ァ イ ル と テ ス ト ベンチ フ ァ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
最上位の引数 : RTL イ ン タ ーフ ェ イ ス ポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デー タ 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
アレ イ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
assert の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
サポー ト さ れない C コ ン ス ト ラ ク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C++ の合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C++ ク ラ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
テ ンプ レー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デー タ 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
サポー ト さ れない C++ コ ン ス ト ラ ク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SystemC の合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デザ イ ンの記述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
最上位 SystemC ポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
サポー ト さ れない SystemC コ ン ス ト ラ ク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C ラ イブラ リ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Vivado HLS の math ラ イ ブ ラ リ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Vivado HLS の video ラ イ ブ ラ リ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
HLS FFT ラ イ ブ ラ リ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
157
157
158
158
158
160
162
166
181
199
200
208
213
216
219
219
225
226
232
232
233
243
247
250
250
257
263
4
FFT の static パ ラ メ ー タ ー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FFT の ラ ン タ イ ム コ ン フ ィ ギ ュ レーシ ョ ン と ラ ン タ イ ム ス テー タ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FFT 関数. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
HLS FIR ラ イ ブ ラ リ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FIR の static パ ラ メ ー タ ー. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
FIR 関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ンの FIR ラ ン タ イ ム コ ン フ ィ ギ ュ レーシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ハー ド ウ ェ アの コ ー ド 記述方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C++ でのユーザー定義の レ ジ ス タ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
DSP48 への加算器お よ び減算器の イ ンプ リ メ ン ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SRL リ ソ ースへの直接マ ッ プ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ス ト リ ー ミ ン グ デー タ を使用 し た設計 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C の任意精度型. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
[u]int#W 型の コ ンパ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
[u]int#W 変数の宣言/定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
定数 ( リ テ ラ ル) か ら の初期化お よ び代入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
コ ン ソ ール I/O (出力) のサポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
[u]int#W 型を使用 し た式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ビ ッ ト レベル演算 :サポー ト さ れ る 関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C++ の任意精度型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ap_[u]<> 型の コ ンパ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ap_[u] 変数の宣言/定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
定数 ( リ テ ラ ル) か ら の初期化お よ び代入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
コ ン ソ ール I/O (出力) のサポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ap_[u]<> 型を使用 し た式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ク ラ ス演算子お よ び メ ソ ッ ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
その他の ク ラ ス メ ソ ッ ド お よ び演算子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C++ の任意精度 (AP) 固定小数点型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ap_[u]fixed 表現 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
量子化モー ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オーバーフ ロ ー モー ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ap_[u]fixed<> 型の コ ンパ イ ル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ap_[u]fixed<> 変数の宣言 と 定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
定数 ( リ テ ラ ル) か ら の初期化お よ び代入 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
コ ン ソ ール I/O (出力) のサポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ap_[u]fixed<> 型を使用 し た式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ク ラ ス演算子お よ び メ ソ ッ ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SystemC 型 と Vivado HLS 型の比較. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デフ ォ ル ト コ ン ス ト ラ ク タ ー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
整数除算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
整数係数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
負のシ フ ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
シ フ ト レ フ ト のオーバーフ ロ ー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
range 演算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
固定小数点型の除算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
固定小数点型の右シ フ ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
固定小数点型の左シ フ ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
265
267
268
269
271
274
275
276
276
278
278
279
285
285
286
286
288
289
293
296
296
296
297
298
299
300
306
311
311
312
313
315
316
316
316
318
318
329
329
330
331
331
332
333
333
334
334
第 4 章 : 高位合成 コ マ ン ド
高位合成 コ マ ン ド の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ロ ジ ェ ク ト の管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
高位合成の最適化の ロ ケーシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
コ マ ン ド お よ びプ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
add_files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
336
336
337
339
342
342
342
5
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
cosim_design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
csynth_design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
close_project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
close_solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
config_array_partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
config_bind . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
config_dataflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
config_interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
config_rtl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
config_schedule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
342
342
342
344
344
344
344
345
346
347
347
347
347
347
348
348
348
348
348
349
349
349
349
349
350
350
350
350
350
351
352
352
352
352
352
353
354
354
354
354
354
354
356
356
356
356
356
356
357
357
357
357
358
358
359
359
359
6
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
create_clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
csim_design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .例363
delete_project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
delete_solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
export_design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
pragma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
例 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
list_core. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
list_part . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
open_project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374
open_solution . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
7
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_clock_uncertainty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_allocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_array_map. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_array_partition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_array_reshape . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_clock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_dataflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_data_pack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_dependence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_expression_balance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
376
376
376
376
378
378
378
378
378
380
380
380
380
381
381
382
382
382
382
383
383
384
384
384
384
385
385
386
386
386
386
387
387
388
388
388
388
388
389
389
389
389
389
390
390
390
390
390
390
392
392
392
392
393
393
395
395
8
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_function_instantiate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_inline. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_latency . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_loop_flatten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_loop_merge. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_loop_tripcount . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_occurrence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
395
395
395
395
396
396
396
396
396
398
398
398
398
398
398
400
400
400
401
403
403
405
405
405
405
405
406
407
407
407
407
407
408
409
409
409
409
409
410
411
411
411
411
411
412
413
413
413
413
413
414
415
415
415
415
416
416
9
set_directive_protocol. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_reset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_top. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_directive_unroll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_part . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
pragma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
set_top. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プ ラ グマ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
例...........................................................................................
-tool. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
説明 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
構文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
リ フ ァ レ ン ス コ マン ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
イ ン タ ーフ ェ イ ス合成 リ フ ァ レ ン ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C ド ラ イ バー リ フ ァ レ ン ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
C ラ イブラ リ リ フ ァ レンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
AXI4-Stream I/O 関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ビデオ プ ロ セ ッ シ ン グ関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
417
417
417
417
417
418
419
419
419
419
419
419
420
420
420
421
421
421
422
422
422
422
423
424
424
424
424
424
424
425
425
425
425
426
426
427
427
427
427
427
428
429
429
429
429
429
430
430
430
430
430
443
446
454
455
10
付録 5 : その他の リ ソ ース
ザ イ リ ン ク ス リ ソ ース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ソ リ ュ ーシ ョ ン セ ン タ ー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ト レーニ ン グ ビデオ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
参照資料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
495
495
495
495
11
第 1章
高位合成の概要
概要
本書では、 高位合成 (HLS) に関す る コ ン セプ ト と 、 ザ イ リ ン ク ス の高位合成ツールについて説明 し ます。
•
Vivado 高位合成 (HLS) では、 C、 C++、 ま たは SystemC デザ イ ン仕様が レ ジ ス タ ト ラ ン ス フ ァ ー レベル (RTL)
イ ンプ リ メ ン テーシ ョ ンに変換 さ れ、 ザ イ リ ン ク ス フ ィ ール ド プ ロ グ ラ マブル ゲー ト ア レ イ (FPGA) に合成
•
Vivado HLS と 最適化を使用 し て高い QoR (結果の品質) を提供す る 方法
•
ザ イ リ ン ク ス FPGA デバ イ ス の イ ンプ リ メ ン テーシ ョ ン用に C コ ー ド (C++ お よ び SystemC も 含む) を記述す る
方法を示 し た コ ーデ ィ ン グ ス タ イ ル
•
高位合成の リ フ ァ レ ン ス情報
本章では、 高位合成 (HLS) に関す る さ ま ざ ま な コ ン セプ ト と 、 高位合成お よ びザ イ リ ン ク ス の
の基本的な概要について説明 し ます。
Vivado HLS ツール
高位合成 (HLS) の コ ン セ プ ト
C の RTL への合成では、 デザ イ ン エ リ ア と パフ ォーマ ン ス の さ ま ざ ま な面を考慮 し た高度な変換が多数実行 さ れま
す。 Vivado HLS では、 C、 C++、 お よ び SystemC の 3 つの C 入力すべてがサポー ト さ れ、 C コ ー ド を最小限の変更で
合成で き ます。
Vivado HLS は、 デザ イ ンに対 し て主に 2 種類の合成を実行 し ます。
•
アルゴ リ ズ ム合成 : 機能文を複数 ク ロ ッ ク サ イ ク ル数で RTL 文に合成 し ます。
•
イ ン タ ーフ ェ イ ス合成 : 関数引数 (ま たはパ ラ メ ー タ ー ) を特定の タ イ ミ ン グ プ ロ ト コ ルを使用 し て RTL ポー ト
に変換 し 、 デザ イ ンがシ ス テ ム上のほかのデザ イ ン と 通信で き る よ う に し ます。
手動の RTL デザ イ ン と 同様に、 可能な イ ン プ リ メ ン テーシ ョ ンお よ び最適化は数多 く あ り 、 その組み合わせ も 非常
に多数です。 Vivado HLS を使用す る と 、 ユーザーが こ の よ う な詳細を考慮する 必要はな く 、 短時間で最適なデザ イ ン
を得 る こ と がで き ます。
Vivado HLS に よ り こ の よ う な詳細が ど の よ う に処理 さ れ る か を理解す る ため、こ のセ ク シ ョ ンの残 り の部分では高位
合成の基本的な概念 と Vivado HLS で実行 さ れ る 最適化について説明 し ます。
制御 と デー タ パスの抽出
Vivado HLS で まず最初に実行 さ れ る のは、 コ ー ド に よ り 推論 さ れ る 制御お よ びデー タ パ ス の抽出です。 図 1-1 に、 こ
れが ど の よ う に実行 さ れ る かの例を示 し ます。
制御機能は、 コ ー ド ではループお よ び条件分岐で示 さ れます。 図 1-1 は、 コ ー ド か ら 制御動作を ど の よ う に抽出で き
る か を示 し てい ます。 関数がループに出入 り す る のは、 RTL 有限ス テー ト マシ ン (FSM) のいずれかの ス テー ト に出
入 り す る のに対応 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
12
概要
図 1-1 では、 すべての演算が 1 ク ロ ッ ク サ イ ク ル (ス テー ト ) で実行 さ れ る と 想定 し てい ます。 実際には、 タ イ ミ ン グ
遅延お よ び ク ロ ッ ク 周波数に よ り 演算を完了す る のに こ れ以上のサ イ ク ルが必要な場合 も あ り ま す。 た と えば、 ス
テー ト 1 が ス テー ト 11、 12、 お よ び 13 に拡張 さ れ、 制御 ロ ジ ッ ク は イ ン タ ーフ ェ イ ス合成で推論 さ れ る I/O プ ロ ト
コ ルに影響 さ れ る 場合があ り ます。
デー タ パ ス の抽出は も う 少 し 簡単で、 ループ を展開 し 、 デザ イ ンの条件文を評価す る こ と に よ り 決定で き ます。
X-Ref Target - Figure 1-1
図 1‐1 : 制御およびデー タ の抽出
RTL の最終的なデー タ パ ス イ ンプ リ メ ン テーシ ョ ンは、 通常図 1-1 に示す よ う な単純な も のではあ り ません。 Vivado
HLS では、 最初の加算器は 0 の加算なので必要な く 、 最後のシ フ ト 操作は 2 のべ き 乗であ り 、 ハー ド ウ ェ ア を必要 と
し ない と 判断で き ます。 複数の最適化は、 最適化指示子で指定す る と 実行で き ます。
スケジ ュ ー リ ングおよびバイ ンデ ィ ング
ス ケ ジ ュ ー リ ン グお よ びバ イ ンデ ィ ン グは、 高位合成の中心 と な る プ ロ セ ス です。 Vivado HLS では、 ス ケ ジ ュ ー リ ン
グ プ ロ セ ス中に、 ど の ク ロ ッ ク サ イ ク ルで演算が実行 さ れ る かが決定 さ れます。 ス ケ ジ ュ ー リ ン グ中の決定には、 ク
ロ ッ ク 周波数、 ク ロ ッ ク のば ら つ き 、 デバ イ ス テ ク ノ ロ ジ ラ イ ブ ラ リ か ら の タ イ ミ ン グ情報、 ユーザー指定の最適
化指示子な ど が考慮 さ れます。
図 1-1 に示す コ ー ド 例の場合、複数の RTL イ ンプ リ メ ン テーシ ョ ンが可能です。図 1-2 に、その う ちの 3 つを示 し ます。
•
オプシ ョ ン 1 : Vivado HLS では複数の ク ロ ッ ク サ イ ク ルで加算器 と 乗算期を共有で き る ので、4 ク ロ ッ ク サ イ ク
ルを使用す る と い う こ と は、 加算器を 1 つ と 乗算器 1 つを使用で き る と い う こ と です。 加算器 1 つ、 乗算器 1 つ
を使用 し て、 4 ク ロ ッ ク サ イ ク ルで完了 し ます。
•
オプシ ョ ン 2 : タ ーゲ ッ ト テ ク ノ ロ ジの タ イ ミ ン グの解析に よ り 加算器のチ ェーン を 1 ク ロ ッ ク で完了で き る と
判断 さ れた場合、 加算器 3 つ と 乗算器 4 つが使用 さ れますが、 演算を 1 ク ロ ッ ク サ イ ク ルで完了で き ます。 つま
り 、 オプシ ョ ン 1 よ り も 高速ですが、 大型にな り ます。
•
オプシ ョ ン 3 : 加算器 2 つ と 乗算器 2 つを使用 し て、 2 ク ロ ッ ク サ イ ク ルで完了 し ます。 つま り 、 オプシ ョ ン 2
よ り も 小型で、 オプシ ョ ン 1 よ り 高速です。
Vivado HLS では、 ツールのデフ ォ ル ト と ユーザーが指定 し た制約や指示子に基づいて、最適な イ ンプ リ メ ン テーシ ョ
ン を短時間で作成で き ます。 こ の後の章で、 特定の要件において最 も 理想的な ソ リ ュ ーシ ョ ン を短時間で達成で き る
よ う 制約お よ び指示子を設定す る 方法を示 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
13
概要
X-Ref Target - Figure 1-2
図 1‐2 : スケジ ュ ー リ ング
バ イ ンデ ィ ン グは、ス ケ ジ ュ ー リ ン グ さ れた各演算に使用する ハー ド ウ ェ ア リ ソ ース ま たは コ ア を決定す る プ ロ セ ス
です。 た と えば、 加算器 と 減算器を 1 つずつ使用す る か、 加減算器 1 つを両方の演算に使用す る か を Vivado HLS が
判断 し ます。
通常の組み合わせ乗算器の代わ り にパ イ プ ラ イ ン乗算器を使用す る な ど の、バ イ ンデ ィ ン グ プ ロ セ ス での決定は演算
の ス ケ ジ ュ ー リ ン グに影響す る ので、 バ イ ンデ ィ ン グに関す る 決定は ス ケ ジ ュ ー リ ン グ中に考慮 さ れます。
最適化 と パ フ ォ ーマ ン スの測定
高位合成では、 デザ イ ンに複数の最適化を実行 し 、 パフ ォ ーマ ン スお よ びエ リ アの要件を満たす質の高い RTL を生
成で き ます。 こ のセ ク シ ョ ンでは、 最適化手法のい く つかを紹介 し 、 その機能の概要を示 し ます。
パフ ォーマ ン ス の改善について説明す る 前に、 まず、 高位合成で作成 さ れ る デザ イ ンのパフ ォーマ ン ス測定に使用 さ
れ る メ ト リ ッ ク ス について説明 し ます。
•
エリア
•
レ イ テンシ
•
開始間隔 (II)
「エ リ ア」 は、 最 も 理解 し やすいパフ ォーマ ン ス メ ト リ ッ ク ス で、 デザ イ ン を イ ンプ リ メ ン ト す る のに必要なハー ド
ウ ェ ア リ ソ ース数が測定 さ れます。 レ イ テ ン シお よ び開始間隔 (II) は、 それに比較す る と 理解 し に く いので、 次に進
む前に まず説明 し てお き ます。 エ リ アは、 FPGA:LUT、 フ リ ッ プ フ ロ ッ プ、 ブ ロ ッ ク RAM お よ び DSP4 で使用可能
な リ ソ ース に よ っ て測定 さ れます。 .
図 1-3 は、 C プ ロ グ ラ ムに含まれ る 典型的な タ ス ク の 2 例 (関数お よ びループ) で、 図 1-3 は両方の タ ス ク のビヘ イ ビ
ア ま たは潜在的な RTL イ ン プ リ メ ン テーシ ョ ン を示 し てい ま す。 ど ち ら の イ ン プ リ メ ン テーシ ョ ン のパ フ ォ ーマ ン
ス も レ イ テ ン シ と 開始間隔を理解す る こ と で、 わか る よ う にな っ てい ます。 ど ち ら の例で も 操作がシーケ ン シ ャ ルに
実行 さ れ る よ う に擬似 コ ー ド が書 き 込まれてい ます。
•
こ の関数の例の場合、 下位関数の func_C は func_B が完了す る ま で実行を開始で き ません。 同様に、 func_B は
func_A が完了す る ま で待機す る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
14
概要
•
ループの例では、 読み出 し 操作が実行 さ れ、 計算 さ れてか ら 、 書 き 込み操作が実行 さ れてい ます。
X-Ref Target - Figure 1-3
図 1‐3 : パイ プ ラ イ ン処理を使用 し ない関数およびループ
「レ イ テ ン シ」 は、 出力値を生成す る のに必要な ク ロ ッ ク サ イ ク ル数です。 関数の例では、 デザ イ ンの レ イ テ ン シは
8 ク ロ ッ ク サ イ ク ルなので、関数 top の開始か ら TMC に書 き 込まれ る ま で 8 ク ロ ッ ク サ イ ク ル サ イ ク ルかか り ます。
ループの例では、 各ループ を繰 り 返すのに 3 ク ロ ッ ク サ イ ク ルかか る ので、 すべてのループの繰 り 返 し を実行す る の
に合計 6 ク ロ ッ ク サ イ ク ルかか り ます。
単に イ ン タ ーバルや II と 呼ばれ る こ と が よ く あ る 「開始間隔 (II)」 は、 タ ス ク が新 し い入力デー タ を受信 し 始め る ま
での ク ロ ッ ク サ イ ク ル数です。 こ の関数の例の場合、 func_A は func_C が終了する ま で再実行で き ません。 func_C が
終了す る のに 8 ク ロ ッ ク サ イ ク ルかか る ので、 関数 top の II は 8 ク ロ ッ ク サ イ ク ルです。 つま り 、 新 し い入力デー タ
の処理が開始 さ れ る 前に 8 ク ロ ッ ク サ イ ク ルかか り ます。 ループはすべての ト ラ ンザ ク シ ョ ン を実行す る のに 6 ク
ロ ッ ク サ イ ク ルかか り ますが、 新 し い入力は 3 ク ロ ッ ク サ イ ク ルご と に受信 さ れ る ので、 ループの II は 3 ク ロ ッ ク
サ イ ク ルです。
こ れ ら の例の ど ち ら で も 、 C コ ー ド の よ う にすべてがシーケ ン シ ャ ルに実行 さ れます。 並列処理は さ れないので、 レ
イ テ ン シ と II はど ち ら の タ ス ク で も 同 じ にな り ます。
ソ フ ト ウ ェ アに比べたハー ド ウ ェ アの主なパフ ォーマ ン ス利点の 1 つは、ハー ド ウ ェ アでは同時処理 (並列処理) が実
行可能な点です。 パ イ プ ラ イ ン処理は、 シーケ ン シ ャ ルの C 記述を並列のハー ド ウ ェ ア イ ン プ リ メ ン テーシ ョ ン と
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
15
概要
し て イ ンプ リ メ ン ト 可能な最適化です。 図 1-4 は、 Vivado HLS で関数 top 内の下位関数お よ びループ内の演算が自動
的にパ イ プ ラ イ ン処理 さ れた場合の結果を示 し てい ます。
X-Ref Target - Figure 1-4
図 1‐4 : パイ プ ラ イ ン処理を使用 し た関数およびループ
パ イ プ ラ イ ン処理が さ れ る と 、 ど ち ら の タ ス ク も よ り 優れたパフ ォーマ ン ス にな り ます。 関数レベルでは、 デー タ フ
ロ ー最適化に よ り デー タ が到着す る と す ぐ に下位関数 (func_A、 func_B、 お よ び func_C) が実行 さ れます。
•
func_A 関数が完全に終了す る 前にデー タ を出力 し 始め る 場合、 func_B は準備がで き 次第、 デー タ を受信 し 始め
る こ と がで き 、 func_A の終了を待つ必要があ り ません。
•
同様に、 func_C は func_B か ら のデー タ が使用可能にな り 次第、 実行開始で き ます。
•
さ ら に、 func_A は func_C が現在の ト ラ ンザ ク シ ョ ン を終了する 前に次の ト ラ ンザ ク シ ョ ン を開始で き ます。
並列で実行 さ れ る ハー ド ウ ェ ア を作成す る と 、 デザ イ ン のパ フ ォ ーマ ン ス が改善で き ま す。 レ イ テ ン シ と 開始間隔
(II) の メ ト リ ッ ク ス は、 パフ ォーマ ン ス改善を示 し ます。 図 1-3の関数の場合、 レ イ テ ン シ と II は両方 と も 8 ク ロ ッ
ク サ イ ク ルです。 こ のパ イ プ ラ イ ン を使用 し たデザ イ ン では、 レ イ テ ン シは 5 ク ロ ッ ク サ イ ク ルのみで、 II が 3 ク
ロ ッ ク サ イ ク ルです。 パ イ プ ラ イ ン処理 さ れたデザ イ ンは、 デー タ を よ り 短い時間で出力 し 、 よ り 高速の レー ト (ほ
ぼ 3 倍) でデー タ を受信 し ます。
同様に、 ループをパ イ プ ラ イ ンで イ ンプ リ メ ン テーシ ョ ン し て も パフ ォーマ ン ス は改善 さ れます。 読み出 し が終了次
第、 次の読み出 し が開始で き ます。 ループのパフ ォーマ ン ス に よ り 、 II が 3 ク ロ ッ ク サ イ ク ルか ら 1 ク ロ ッ ク サ イ
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
16
Vivado HLS の使用
ク ルに改善 さ れます。 ま た、 重複ループの繰 り 返 し を実行す る こ と で、 全体的なループ レ イ テ ン シが 4 に削減で き ま
す (各繰 り 返 し の レ イ テ ン シは 3 の ま ま)。
デフ ォ ル ト では、Vivado HLS で こ れ ら の演算を並列実行する 方法が検索 さ れ、デザ イ ンの レ イ テ ン シが削減 さ れ最小
限に抑え ら れます。 パ イ プ ラ イ ン処理は、 パフ ォーマ ン ス を改善す る ためにユーザーが適用する 最適化です。
パ イ プ ラ イ ン処理は、 デザ イ ンに実行 さ れ る 最 も 典型的な最適化ですが、 さ ら に多 く の最適化を適用す る こ と も で き
ます。 こ れについては、 後で説明 し ます。
シーケ ン シ ャ ル C 記述の場合、 最適化を使用す る と ハー ド ウ ェ アで さ ら に多 く の並列処理がで き 、 パフ ォーマ ン ス の
改善を レ イ テ ン シ と 開始間隔 (II) を確認する こ と で測定で き ます。
デザイ ン制約の使用
Vivado HLS では、 ク ロ ッ ク 周期、 ク ロ ッ ク のば ら つ き 、選択デバ イ ス のほかに、次の よ う な制約を複数使用で き ます。
•
関数、 ループ、 お よ び領域の レ イ テ ン シ を指定
•
使用 さ れ る リ ソ ース の数を制限
•
コ ー ド に固有の ま たは コ ー ド で暗示 さ れ る 依存性を変更 し た演算を可能にす る ( メ モ リ に書 き 込む前に読み出す
な ど)
こ れ ら の制約を Vivado HLS 指示子を使用 し て適用 し 、 必要な特性を持つデザ イ ン を作成で き ます。
Vivado HLS で設計す る と 、 コ ー ド 内の依存度お よ び Vivado HLS のデフ ォ ル ト の C 言語 コ ン ス ト ラ ク ト の変換で定義
さ れ る 初期アーキ テ ク チ ャ を素早 く イ ンプ リ メ ン ト で き 、 指示子を使用す る こ と で、 目標の高パフ ォーマ ン ス イ ンプ
リ メ ン テーシ ョ ンに近づけてい く こ と がで き ます。
Vivado HLS の使用
図 1-5 に示す よ う に、Vivado HLS には C 言語ベース のデザ イ ン記述のほか、Vivado Integrated Design Environment (IDE)
ま たは Tcl バ ッ チ ス ク リ プ ト を使用 し て指定 し た指示子お よ び制約を入力で き ます。
出力は Verilog、 VHDL、 お よ び SystemC 形式の RTL デザ イ ン フ ァ イ ルです。 Vivado HLS では C お よ び RTL の検証
が実行で き ます。 ま た、 ザ イ リ ン ク ス デザ イ ン フ ロ ーのほかの部分で使用で き る よ う に、 デザ イ ンは IP と し て処理
す る こ と も で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
17
Vivado HLS の使用
j こ のセ ク シ ョ ンでは、 Vivado HLS デザ イ ンの使用モデルについて説明 し ます。
X-Ref Target - Figure 1-5
図 1‐5 : 高位合成の使用モデル
Vivado HLS ラ イ セ ン ス付き デバイ ス
Vivado® HLS には、 VIVADO_HLS ま たは HLS のいずれかの名前が付いた ラ イ セ ン ス が提供 さ れます。
•
HLS ラ イ セ ン ス は、Vivado HLS ソ フ ト ウ ェ ア を含む Vivado System Edition 用で、タ ーゲ ッ ト テ ク ノ ロ ジに Vivado
RTL 合成でサポー ト さ れ る デバ イ ス (7 シ リ ーズ ま たは Zynq デバ イ ス) が指定で き ます。
•
VIVADO_HLS ラ イ セ ン ス は、 Vivado HLS の ス タ ン ド ア ロ ン オプシ ョ ン を購入 し た場合に提供 さ れ、 タ ーゲ ッ ト
テ ク ノ ロ ジには Vivado ま たは ISE® でサポー ト さ れ る すべてのデバ イ ス が指定で き ます。
•
Vivado HLS は Vivado Design Suite の System Edition を イ ン ス ト ールす る と イ ン ス ト ール さ れます。
デザイ ン フ ァ イルの使用
C ま たは C ベース デザ イ ン と 言っ た場合、 次の規格すべてが含まれてい ます。
•
ANSI-C (GCC 4.6)
•
C++ (G++ 4.6)
•
SystemC (IEEE 1666-2006 -Version 2.2-)
Vivado HLS では C お よ びC ベース デザ イ ンの ど ち ら に も 任意精度デー タ 型が提供 さ れてい ます。
こ のガ イ ド では、 入力仕様のシ ミ ュ レーシ ョ ン方法を、 任意精度の拡張 も 含めて説明 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
18
Vivado HLS の使用
C ベース入力には、 テ ス ト ベンチを含め る こ と がで き ます。 C テ ス ト ベンチを入力 し た場合、 出力 RTL の自動検証に
再利用で き 、 RTL 検証用に RTL テ ス ト ベンチを別に作成する 必要がな く な る ので、 生産性が向上 し ます。 Vivado HLS
では複数の入力フ ァ イ ルがサポー ト さ れてい る ので、 テ ス ト ベンチを合成す る デザ イ ン と は別の フ ァ イ ルに分離す る
こ と をお勧め し ます。 ただ し 、 こ れは必須ではあ り ません。
デバイ ス テ ク ノ ロ ジ ラ イ ブ ラ リ
デバ イ ス テ ク ノ ロ ジ ラ イ ブ ラ リ は、 サポー ト さ れ る 各ザ イ リ ン ク ス デバ イ ス のエ リ アお よ び タ イ ミ ン グ を モデ リ ン
グ し た も ので、 最適化エン ジ ンに よ り ト レー ド オ フ を考慮 し た適切な選択が実行 さ れ る よ う にな っ てい ます。 デバ イ
ス テ ク ノ ロ ジ ラ イ ブ ラ リ は Vivado HLS に組み込まれてお り 、 供給する 必要はあ り ません。
指示子お よび制約
指示子お よ び制約は Vivado HLS の GUI ま たは Tcl ベース の コ マ ン ド で指定 し 、 目標のパフ ォーマ ン スお よ び RTL
アーキ テ ク チ ャ を達成で き る よ う 最適化エン ジ ンが実行 さ れ る よ う に し ます。
RTL 出力
合成が正常に完了す る と 、 RTL 出力が記述 さ れます。 Vivado HLS では、 次の 3 つのハー ド ウ ェ ア記述言語 (HDL) が
サポー ト さ れてい ます。
•
VHDL (IEEE 1076-2000)
•
Verilog (IEEE 1364-2001)
•
SystemC (IEEE 1666-2006 -Version 2.2-)
注記 : Vivado HLS か ら の SystemC 出力は、 レ ジ ス タ ト ラ ン ス フ ァ ー レ ベル (RTL) でのデザ イ ン イ ン プ リ メ ン テー
シ ョ ンです。
シ ミ ュ レーシ ョ ン出力 (RTL 協調シ ミ ュ レーシ ョ ン)
Vivado HLS では、 生成 し た RTL を元のテ ス ト ベンチ と RTL を使用 し て協調シ ミ ュ レーシ ョ ンで検証で き ます。 次の
RTL シ ミ ュ レー タ がサポー ト さ れてい ます。
•
Questa SIM
•
VCS
•
Open SystemC Initiative (OSCI)
•
NCSim
•
Vivado シ ミ ュ レー タ
•
ISim
•
Riviera
SystemC 出力はビル ト イ ン の SystemC カーネルを使用 し て検証で き る ので、 サー ド パーテ ィ の RTL シ ミ ュ レー タ や
ラ イ セ ン ス は必要あ り ません。 シ ミ ュ レーシ ョ ンに Verilog ま たは VHDL を選択する と 、 その HDL シ ミ ュ レー タ が使
用 さ れます。 サポー ト さ れてい る HDL シ ミ ュ レー タ を使用す る には、 そのシ ミ ュ レー タ のベン ダーか ら ラ イ セ ン ス
を取得す る 必要があ り ます (ISim お よ び Vivado シ ミ ュ レー タ の ラ イ セ ン ス は既に含まれてい ます)。 VCS、 NCSim お
よ び Riviera HLD シ ミ ュ レー タ は Linux OS でのみサポー ト さ れます。
イ ン プ リ メ ン テーシ ョ ン出力
RTL エ ク ス ポー ト 機能を使用す る と 、 最終的な RTL 出力フ ァ イ ルを IP と し て作成で き ます。 IP は、 次の 4 つのザ イ
リ ン ク ス IP フ ォーマ ッ ト のいずれかでパ ッ ケージで き ます。
•
IP カ タ ロ グ フ ォーマ ッ ト (Vivado IP カ タ ロ グに イ ン ポー ト 可能)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
19
Vivado HLS の使用
•
Pcore フ ォーマ ッ ト (Xilinx Platform Studio に イ ン ポー ト 可能)
•
System Generator フ ォーマ ッ ト (System Generator for DSP に イ ン ポー ト 可能) (ISE ま たは Vivado 用)
•
Vivado デザ イ ン チ ェ ッ ク ポ イ ン ト フ ォーマ ッ ト
RTL エ ク ス ポー ト プ ロ セ ス では、 オプシ ョ ンで Vivado HLS 環境内か ら 論理合成を実行 し て、 RTL 合成の結果を評価
す る こ と も で き ます。 Vivado HLS では、 エ ク ス ポー ト フ ォーマ ッ ト お よ びデバ イ ス テ ク ノ ロ ジに よ っ て、 RTL 合成
に ISE ま たは Vivado が選択 さ れます。
こ の手順に関す る 詳細は、 「RTL デザ イ ンのエ ク ス ポー ト 」 を参照 し て く だ さ い。
高位合成 フ ロー
こ のセ ク シ ョ ン では、 Vivado HLS の起動、 プ ロ ジ ェ ク ト の作成、 RTL イ ン プ リ メ ン テーシ ョ ン の管理、 最適化用の
指示子の適用な ど について説明 し ます。 詳細は、 『Vivado Design Suite チ ュ ー ト リ アル : 高位合成』 (UG871) を参照 し
て く だ さ い。
Vivado HLS は、 Vivado IDE ま たは Tcl コ マ ン ド を対話型ま たはバ ッ チ モー ド で使用可能な コ マ ン ド ラ イ ン イ ン タ ー
フ ェ イ ス (CLI) で起動で き ます。
高位合成の GUI
Windows
PC Windows プ ラ ッ ト フ ォームで
リ ッ ク し ます。
Vivado HLS を起動す る には、 デス ク ト ッ プで [Vivado HLS] ア イ コ ン (図 1-6) を ク
X-Ref Target - Figure 1-6
図 1‐6 : Vivado HLS の GUI ア イ コ ン
Linux
Linux プ ラ ッ ト フ ォームで
Vivado HLS を起動する には、 Linux コ マ ン ド プ ロ ンプ ト で次の コ マ ン ド を入力 し ます。
$ vivado_hls
図 1-7 に示す
Vivado HLS
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
の GUI が開き ます。
japan.xilinx.com
Send Feedback
20
Vivado HLS の使用
X-Ref Target - Figure 1-7
図 1‐7 : GUI モー ド
図 1-7 の [Getting Started] の下には、 次の タ ス ク が リ ス ト さ れてい ます。
•
[Create New Project] : プ ロ ジ ェ ク ト 設定ウ ィ ザー ド が起動 し ます。
•
[Open Project] : 既存プ ロ ジ ェ ク ト を選択する か、 最近使用 し たプ ロ ジ ェ ク ト の リ ス ト か ら 選択 し ます。
•
[Open Example Project] : 高位合成例を開 き ます。 例は、 Vivado HLS の イ ン ス ト ール デ ィ レ ク ト リ 内の examples
デ ィ レ ク ト リ か ら 開 く こ と も で き ます。
図 1-7 の [Documentation] の下には、 次の タ ス ク が リ ス ト さ れてい ます。
•
[Tutorials] : 『Vivado Design Suite チ ュ ー ト リ アル : 高位合成』 (UG871) を開き ます。 Vivado HLS のチ ュ ー ト リ ア
ル デザ イ ン フ ァ イ ル例はすべて同 じ 箇所か ら ダ ウ ン ロ ー ド で き ます。
•
[User Guide] : Vivado ユーザー ガ イ ド ページか ら 、Vivado HLS の コ マ ン ド お よ びオプシ ョ ンに関す る 詳細を示す
『Vivado Design Suite ユーザー ガ イ ド : 高位合成』 (UG902) を開 き ます。
•
[Release Note Guide] : 最新の ソ フ ト ウ ェ ア バージ ョ ンの『Vivado Design Suite ユーザー ガ イ ド : リ リ ース ノ ー ト 、
イ ン ス ト ール、 お よ び ラ イ セ ン ス』 (UG973) を開 き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
21
Vivado HLS の使用
高位合成の コ マ ン ド ラ イ ン イ ン タ ー フ ェ イ スの使用
Windows の場合、 高位合成の コ マ ン ド ラ イ ン イ ン タ ー フ ェ イ ス (CLI) は、 [ ス タ ー ト ] → [すべて のプ ロ グ ラ ム] →
[Xilinx Design Tools] → [Vivado 2013.4] → [Vivado HLS Command Prompt] を ク リ ッ ク する と 開き ます。
Windows お よ び Linux の両方で、 vivado_hls コ マ ン ド を –i オプシ ョ ン を使用 し て実行す る と 、 Vivado HLS が対話
型モー ド で開 き ます。 Vivado HLS コ マ ン ド プ ロ ンプ ト が表示 さ れ、 Tcl コ マ ン ド を入力で き る よ う にな り ます。
$ vivado_hls -i [-l <log_file>]
vivado_hls>
デフ ォ ル ト では、現在のデ ィ レ ク ト リ に vivado_hls.log フ ァ イ ルが作成 さ れます。別の フ ァ イ ルを指定す る には、
-1 <log_file> オプシ ョ ン を使用 し ます。
Vivado HLS コ マ ン ド にはビル ト イ ンのヘルプがあ り 、 help コ マ ン ド を使用 し て表示で き ます。
vivado_hls> help <command>
すべての コ マ ン ド ま たは コ マ ン ド オプシ ョ ンは、 auto-complete 機能を使用す る と 終了で き ます。 1 文字を指定 し
て Tab キーを押す と 、その コ マ ン ド ま たは コ マ ン ド オプシ ョ ン を完了す る ために可能性のあ る オプシ ョ ンすべてが リ
ス ト さ れます。 さ ら に多 く の文字を入力す る と 、フ ィ ル タ ー機能に よ り 可能性のあ る 選択肢を狭め る こ と がで き ます。
た と えば、 open と 入力 し て Tab キーを押す と 、 open で始ま る すべての コ マ ン ド が リ ス ト さ れます。
open
open_project
open_solution
vivado_hls> open <press tab key>
open_p と 入力 し て Tab キーを押す と 、 open_project 以外の選択肢はないので、 open_project コ マ ン ド が自動的に実行 さ
れます。
exit コ マ ン ド を入力 し て対話型モー ド を終了 し 、 シ ェ ル プ ロ ンプ ト に戻 り ます。
vivado_hls> exit
$
コ マ ン ド プ ロ ンプ ト に次のオプシ ョ ン を追加で使用する こ と も で き ます。
•
-m : マシ ンのアーキ テ ク チ ャ (例 : x86、 x86_64) を表示 し ます。
•
-n : Vivado HLS の ス プ ラ ッ シ ュ 画面な し に GUI を開き ます。
•
-p : <string>
•
-r : イ ン ス ト ール ルー ト デ ィ レ ク ト リ へのパ ス を表示 し ます。
•
-s : シ ス テ ムの タ イ プ (例 : Linux、 Win) を表示 し ます。
•
-v : リ リ ース バージ ョ ン番号を表示 し ます。
コ マ ン ド を Tcl ス ク リ プ ト に記述 し 、 -f <script_file> オプシ ョ ン を使用 し てバ ッ チ モー ド で実行す る こ と も で
き ます。
$ vivado_hls -f script.tcl
ス ク リ プ ト に よ る 自動化を支援す る ため、 Vivado HLS には実行 さ れてい る 環境の詳細を返すオプシ ョ ンがあ り ます。
•
-v オプシ ョ ン : Vivado HLS のバージ ョ ン番号が返 さ れます。
•
-s オプシ ョ ン : Vivado HLS が実行 さ れてい る OS が返 さ れます。
•
-m オプシ ョ ン : 現在のマシ ン アーキ テ ク チ ャ が返 さ れます。
•
-r オプシ ョ ン : Vivado HLS が イ ン ス ト ール さ れてい る デ ィ レ ク ト リ 名が返 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
22
Vivado HLS の使用
Windows CLI シ ェ ル
Windows OS では、 CLI シ ェ ルは Minimalist GNU for Windows (minGW) 環境を使用 し て イ ンプ リ メ ン ト さ れてい ます。
こ の環境では、 標準 Windows DOS コ マ ン ド と Linux コ マ ン ド のサブセ ッ ト の両方を使用で き ます。
図 1-8 では、Linux の ls コ マ ン ド と DOS の dir コ マ ン ド の ど ち ら で も デ ィ レ ク ト リ の内容を リ ス ト で き る こ と を示
し てい ます。
X-Ref Target - Figure 1-8
図 1‐8 : 高位合成 CLI ア イ コ ン
minGW 環境では、すべての Linux コ マ ン ド と その動作がサポー ト さ れてい る わけではないので注意 し て く だ さ い。次
に、 サポー ト の違いのい く つか を示 し ます。
•
Linux の which コ マ ン ド はサポー ト さ れてい ません。
•
makefile の Linux パ ス は、 minGW パス に変換 さ れます。 すべての makefile に含まれ る Linux 形式のパ ス名の代入
(FOO := :/ な ど) は、 パ ス が置換 さ れない よ う に、 パ ス名に ク ォーテーシ ョ ンが付いた も の (FOO := “:/”) に変換 さ
れます。
高位合成プ ロ ジ ェ ク ト の作成
Vivado HLS を使用す る には、 まず新規プ ロ ジ ェ ク ト を作成す る か、 既存のプ ロ ジ ェ ク ト を開き ます (図 1-7)。 こ れ ら
の コ マ ン ド は、 [Create New Project] お よ び [Open Project] を ク リ ッ ク する と 実行で き ます。
[Create New Porject] を ク リ ッ ク す る と 、高位合成プ ロ ジ ェ ク ト ウ ィ ザー ド が開 き ます。ウ ィ ザー ド の 1 ページ目では、
プ ロ ジ ェ ク ト の仕様を指定 し ます (図 1-9)。
次を指定 し ます。
•
[Project name] : プ ロ ジ ェ ク ト 名を指定 し ます。 こ の名前は、 プ ロ ジ ェ ク ト が保存 さ れ る デ ィ レ ク ト リ 名 と し て も
使用 さ れます。 図 1-9 の例の よ う に .prj な ど の拡張子を指定 し てお く と 、 デ ィ レ ク ト リ をプ ロ ジ ェ ク ト の も の と
判断 し やす く な り ますが、 こ れは必須ではあ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
23
Vivado HLS の使用
•
[Location] : プ ロ ジ ェ ク ト の保存先を指定 し ます。
X-Ref Target - Figure 1-9
図 1‐9 : プ ロ ジ ェ ク ト 仕様
[Next] を ク リ ッ ク し て次のページに進む と 、 プ ロ ジ ェ ク ト の C ソ ース を追加する ページ (図 1-10) が表示 さ れます。
[Top Function] には合成す る 最上位関数の名前を指定 し ます。
注記 : プ ロ ジ ェ ク ト を SystemC と し て指定する 場合は こ れは不要です。
[Add Files] を ク リ ッ ク し 、 ソ ース コ ー ド フ ァ イ ルをプ ロ ジ ェ ク ト に追加 し ます。 ヘ ッ ダー フ ァ イ ルは [Add Files] ボ
タ ン ま たはそれに対応す る Tcl コ マ ン ド の add_files を使用 し て追加する 必要はあ り ません。
[Edit CFLAGS] を ク リ ッ ク す る と 、 ソ ース フ ァ イ ルを正 し く コ ンパ イ ルす る ために必要な C コ ンパ イ ラ フ ラ グ を プ
ロ ジ ェ ク ト に追加で き ます。
C コ ンパ イ ラ フ ラ グの例には、 マ ク ロ 仕様が含まれます。
•
–DMACRO_1 : コ ンパ イ ル中に MACRO_1 を定義
•
–fnested/–functions : ネ ス ト さ れた関数を含むデザ イ ンに必要
•
–I/project/source/headers : 関連す る ヘ ッ ダー フ ァ イ ルの検索パ ス を指定
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
24
Vivado HLS の使用
ロ ーカル デ ィ レ ク ト リ にあ る ヘ ッ ダー フ ァ イ ルはすべて自動的に検出 さ れます。 任意精度整数値ま たは C ラ イ ブ ラ
リ な ど を定義す る Vivado HLS ヘ ッ ダー フ ァ イ ル も 含ま れます。 別のデ ィ レ ク ト リ にヘ ッ ダー フ ァ イ ルがあ る 場合、
CFLAGS オプシ ョ ン を使用 し てそのデ ィ レ ク ト リ 位置を指定 し ます。
X-Ref Target - Figure 1-10
図 1‐10 : プ ロ ジ ェ ク ト のソ ース フ ァ イル
ウ ィ ザー ド の次のページでは、 テ ス ト ベンチに関連す る フ ァ イ ルを プ ロ ジ ェ ク ト に追加 し ます。
C アルゴ リ ズ ム を検証す る のに使用 し た C テ ス ト ベンチを、 出力 RTL を検証する のに使用で き ます。 Vivado HLS で
は、 RTL デザ イ ン を C テ ス ト ベンチに イ ン ス タ ン シエー ト する ア ダプ タ ー と ラ ッ パーが生成 さ れ、 C と HDL の協調
シ ミ ュ レーシ ョ ンに よ り RTL が検証 さ れます。 RTL テ ス ト ベンチを作成する 必要はあ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
25
Vivado HLS の使用
X-Ref Target - Figure 1-11
図 1‐11 : プ ロ ジ ェ ク ト のテ ス ト ベン チ フ ァ イル
C ソ ース フ ァ イ ル と 同様に、 [Add Files] を ク リ ッ ク し て C テ ス ト ベンチを追加 し 、 [Edit CFLAGS] を ク リ ッ ク し て C
コ ンパ イ ラ オプシ ョ ン を含め ます。
C ソ ース フ ァ イ ル と 共に、 テ ス ト ベンチで読み込まれ る すべての フ ァ イ ルを プ ロ ジ ェ ク ト に追加 し ます。 図 1-11 の
例では、 テ ス ト ベンチで入力ス テ ィ ミ ュ ラ ス を供給す る in.dat フ ァ イ ル と 、 予測 さ れ る 結果を読み込む out.golden.dat
フ ァ イ ルが使用 さ れます。 テ ス ト ベンチが こ れ ら のフ ァ イ ルにア ク セ スする ので、 こ れ ら も プ ロ ジ ェ ク ト に追加す る
必要があ り ます。
テ ス ト ベンチ フ ァ イ ルがデ ィ レ ク ト リ にあ る 場合は、 個々の フ ァ イ ルではな く デ ィ レ ク ト リ 全体を追加で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
26
Vivado HLS の使用
C テ ス ト ベンチがない場合は、 こ こ で何 も 入力す る 必要はあ り ません。[Next] を ク リ ッ ク する と 、最初の ソ リ ュ ーシ ョ
ンの詳細を入力す る ウ ィ ザー ド の最後のページが表示 さ れます (図 1-12)。
X-Ref Target - Figure 1-12
図 1‐12 : 最初のソ リ ュ ーシ ョ ンの設定
図 1-12 では、 次を指定 し ます。
•
[Solutioin Name] :デフ ォ ル ト では ソ リ ュ ーシ ョ ン名に 「solution1」 が指定 さ れますが、 変更で き ます。
•
[Clock] : ク ロ ッ ク 周期を ns で指定 し ます。 合成で使用 さ れ る ク ロ ッ ク 周期は、 ク ロ ッ ク 周期か ら ク ロ ッ ク のば ら
つ き を引いた値にな り ます。 Vivado HLS でテ ク ノ ロ ジ ラ イ ブ ラ リ の タ イ ミ ン グ情報が使用 さ れ、 RTL デザ イ ン
が作成 さ れます。 [Uncertainty] に入力す る ク ロ ッ ク のば ら つ き の値は、 RTL 合成、 配置配線に よ る ネ ッ ト 遅延の
増加を考慮す る ためのマージ ン を ns で指定で き ます。 指定 し ない場合、 ク ロ ッ ク のば ら つ き は ク ロ ッ ク 周期の
12.5% に設定 さ れます。
•
[Part] : 適切なパーツ を選択 し ます (図 1-13)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
27
Vivado HLS の使用
X-Ref Target - Figure 1-13
図 1‐13 : パーツ選択
[RTL Tool] は [auto]、 [ISE]、 [Vivado] に設定で き ます。 2013.2 リ リ ース の ISE お よ び Vivado RTL 合成ーツールか ら は
浮動小数点 コ アに対 し て別のモデルを使用 し てい ます。 こ の設定に よ り 、 タ ーゲ ッ ト 合成ツールに対 し て正 し い浮動
小数点 コ アが使用 さ れます。 こ の設定がデフ ォ ル ト の [auto] の ま ま にな っ てい る と 、 7 シ リ ーズお よ び Zynq® パーツ
の RTL 合成が Vivado で実行 さ れ、 それ以外のデバ イ スは ISE で合成 さ れます。 こ れ以外の設定の場合は、 RTL 合成
には指定 し た ツールが使用 さ れます。
[Finish] を ク リ ッ ク す る と 、 プ ロ ジ ェ ク ト が開 き ます (図 1-14)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
28
Vivado HLS の使用
X-Ref Target - Figure 1-14
図 1‐14 : 新規プ ロ ジ ェ ク ト
プ ロ ジ ェ ク ト を作成 し た Tcl コ マ ン ド は、 solution デ ィ レ ク ト リ の script.tcl フ ァ イ ルに保存 さ れてい ます。 [Explorer]
タ ブ (図 1-14 の左側) で script.tcl フ ァ イ ルを ダブル ク リ ッ ク する と 、 フ ァ イ ルが情報エ リ アに開き ます (図 1-14)。
Tcl バ ッ チ ス ク リ プ ト を作成す る 場合、 script.tcl フ ァ イ ルを開始点 と し て使用する と 便利です。 [Explorer] タ ブに表示
さ れ る コ ン テナーは、 プ ロ ジ ェ ク ト デ ィ レ ク ト リ にあ り ます。 solution デ ィ レ ク ト リ か ら フ ァ イ ルを コ ピー し て く だ
さ い。
Vivado HLS の主要な コ マ ン ド は、 ツールバーか ら 実行で き ます (図 1-15)。 現在実行可能な コ マ ン ド 以外は、 淡色表示
さ れ ま す。 た と えば、 RTL シ ミ ュ レーシ ョ ン を実行す る 前に合成を実行す る 必要があ る ので、 合成が完了す る ま で
[RTL Simulation] ボ タ ンは淡色表示にな り ます。
図 1-15 で赤い四角で囲まれてい る コ マ ン ド は、 次の と お り です (左か ら 右)。
•
[New Project] : 新規プ ロ ジ ェ ク ト を作成 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
29
Vivado HLS の使用
•
[Project Settings] : 既存のプ ロ ジ ェ ク ト 設定を変更 し ます。
•
[New Solution] : 新規 ソ リ ュ ーシ ョ ン を作成 し ます。
•
[Solution Settings] : 既存の ソ リ ュ ーシ ョ ンの設定を変更 し ます。
•
[Index C Source] : C ソ ース コ ー ド に イ ンデ ッ ク ス を付け ます。
•
[Run C/C++/SystemC Project] : C/C++/SystemC 実行フ ァ イ ルを実行 し ます。
•
[Run Synthesize] : 合成を実行 し ます。
•
[RTL Simulation] : RTL シ ミ ュ レーシ ョ ン を実行 し ます。
•
[Export RTL] : RTL デザ イ ン を エ ク ス ポー ト し ます。
•
[Compare Reports] : ソ リ ュ ーシ ョ ン レ ポー ト を比較 し ます。
X-Ref Target - Figure 1-15
図 1‐15 : ツールバー
ツールバーの各ボ タ ンには、 それに対応す る メ ニ ュ ー コ マ ン ド があ り ます。
プ ロ ジ ェ ク ト を作成 し た後の最初の手順は、 C 関数の確認です。 [Run C Simulation] ツールバー ボ タ ン を ク リ ッ ク す
る と 、 図 1-16 の よ う な [C Simulation Dialog] ダ イ ア ロ グ ボ ッ ク ス が開 き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
30
Vivado HLS の使用
X-Ref Target - Figure 1-16
図 1‐16 : [C Simulation Dialog] ダ イ ア ログ ボ ッ ク ス
ダ イ ア ロ グ ボ ッ ク ス でオプシ ョ ン を選択 し ない場合、 デザ イ ンはデバ ッ グ モー ド で コ ンパ イ ル さ れ、 C シ ミ ュ レー
シ ョ ンで実行 さ れます。 結果は、 図 1-17 の よ う にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
31
Vivado HLS の使用
X-Ref Target - Figure 1-17
図 1‐17 : C デザイ ンのコ ンパイル結果
[C Simulation Dialog] ダ イ ア ロ グ ボ ッ ク ス のオプシ ョ ンは、 次の と お り です。
•
[Debug] :デフ ォ ル ト のデバ ッ グ モー ド で C が コ ンパ イ ル さ れ、 デバ ッ グ用表示で開 き ます。 デバ ッ グ表示か ら 、
左上の [Synthesis] 表示ボ タ ン を ク リ ッ ク す る と 、 合成モー ド に表示が戻 り ます。
•
[Build Only] : C コ ー ド が コ ンパ イ ル さ れますが、 シ ミ ュ レーシ ョ ンは実行 さ れません。
•
[Clean Build] : 既存の実行フ ァ イ ル と オブジ ェ ク ト フ ァ イ ルがプ ロ ジ ェ ク ト か ら 削除 さ れます。
•
[Optimized Compile] : デザ イ ンはデバ ッ グ情報な し で リ リ ース モー ド で コ ンパ イ ル さ れます。 こ の場合、 デザ イ
ンの コ ンパ イ ルには よ り 高い レベルの最適化エ フ ォー ト が使用 さ れます。 こ れに よ り 、 コ ンパ イ ル時間は増加す
る 可能性があ り ますが、 シ ミ ュ レーシ ョ ン実行時間は削減 さ れます。 こ のオプシ ョ ンがオンの場合、 デバ ッ グ環
境は使用で き ません。
[Debug] ツールバー ボ タ ン を ク リ ッ ク す る と 、 デバ ッ グ環境 (図 1-18) が開 き 、 [Step] ボ タ ン (図 1-18 の赤で囲まれた
ボ タ ン) を使用 し て コ ー ド を 1 行ずつ実行 し てその動作を解析で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
32
Vivado HLS の使用
X-Ref Target - Figure 1-18
図 1‐18 : C デバ ッ グ環境
次に、 合成を合成 し ます。 合成が完了す る と 、 情報エ リ アに合成レ ポー ト が表示 さ れ、 結果を解析で き ます (図 1-19)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
33
Vivado HLS の使用
X-Ref Target - Figure 1-19
図 1‐19 : 合成レポー ト
レ ポー ト には、 RTL デザ イ ンのパフ ォーマ ン ス と エ リ アに関す る 詳細が記述 さ れてい ます。 [Outline] タ ブ を使用す る
と 、 レ ポー ト をナビ ゲー ト で き ます。 レ ポー ト は、 関数が イ ン ラ イ ン化 さ れていなければ、 階層の各関数に対 し て作
成 さ れます (最適化の 1 つであ る イ ン ラ イ ン化については後の章で説明)。 最上位関数の レ ポー ト には、 デザ イ ン全体
の詳細が表示 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
34
Vivado HLS の使用
表 1-1 は、 合成レ ポー ト のカ テ ゴ リ について説明 し てい ます。
表 1‐1 : 合成レポー ト のカ テ ゴ リ
カ テゴ リ
サブ カ テ ゴ リ
説明
---
結果が生成 さ れ る タ イ ミ ン グ、使用 さ れ
た ソ フ ト ウ ェ ア バージ ョ ン、 プ ロ ジ ェ
ク ト 名、 ソ リ ュ ーシ ョ ン名、 デバ イ ス の
詳細です。
General Information
Performance Estimates
Timing: Summary
タ ーゲ ッ ト ク ロ ッ ク 周波数、 ク ロ ッ ク
のば ら つ き 、達成可能な最大 ク ロ ッ ク 周
波数の概算です。
Latency: Summary
こ のブ ロ ッ ク と こ のブ ロ ッ ク に イ ン ス
タ ン シ エー ト さ れた下位ブ ロ ッ ク の レ
イ テ ン シ と 開始間隔 (II) が レ ポー ト さ
れます。C ソ ース の こ の レベルで呼び出
さ れ る 下位関数は イ ン ラ イ ン 化 し な い
限 り 、 それぞれ こ の RTL ブ ロ ッ ク の イ
ン ス タ ン ス にな り ます。
レ イ テ ン シは、出力値を生成する のに必
要な ク ロ ッ ク サ イ ク ル数です。 開始間
隔は、 新 し い入力が適用 さ れ る 前の ク
ロ ッ ク サ イ ク ル数です。
パ イ プ ラ イ ン指示子がない場合、レ イ テ
ン シ と 開始間隔は同 じ にな り ます (次の
入力は最後の出力が書 き 込 ま れ る と 読
み出 さ れます)。
Latency: Detail
こ のブ ロ ッ ク の イ ン ス タ ン ス (下位関数)
お よ び ループの レ イ テ ン シ と 開始間隔
(II) についての レ ポー ト で、 ループに下
位ループが含まれる場合は、 ループ階層
が表示 さ れます。
最小お よ び最大レ イ テ ン シの値は、ルー
プのすべて の繰 り 返 し を 実行す る た め
の レ イ テ ン シです。 Iteration Latency は、
ループ を 1 回実行す る 際の レ イ テ ン シ
です。
tripcount は、 ループの繰 り 返 し の総数を
表示 し ます。
ループに可変 レ イ テ ン シ が含 ま れ る 場
合、 レ イ テ ン シ値は決定で き ず、 ク エ ス
チ ョ ン マー ク で表示 さ れ ま す。 レ ポー
ト に意味の あ る 値 を 指定す る 方法につ
い て は、 Tripcount 指示子 を 参照 し て く
だ さ い。
指定 し た タ ーゲ ッ ト 開始間隔は、達成 さ
れた実際の開始間隔の横に (ループがパ
イ プ ラ イ ン処理 さ れたか ど う か と し て)
表示 さ れます
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
35
Vivado HLS の使用
表 1‐1 : 合成レポー ト のカ テ ゴ リ
カ テゴ リ
Utilization Estimates
サブ カ テ ゴ リ
説明
デザ イ ン を イ ン プ リ メ ン ト す る た めに
使用 さ れ る リ ソ ース (LUT、 フ リ ッ プ フ
ロ ッ プ、 DSP48) が レ ポー ト さ れます。
Summary
サ ブ カ テ ゴ リ に つ い て は、 こ の 表 の
「Details」 で説明 し ます。
Details: Instance
こ こ に リ ス ト さ れ る リ ソ ース は、こ の階
層 レ ベルに イ ン ス タ ン シ エー ト さ れた
下位ブ ロ ッ ク に使用 さ れ る も のです。
イ ン ス タ ン ス がない場合は、RTL 階層は
1 レベル し かあ り ません。
イ ン ス タ ン ス があ る 場合は、その イ ン ス
タ ン ス の名前を ク リ ッ ク す る と 、その イ
ン ス タ ン ス の合成レ ポー ト が開 き ます。
Details: Memory
こ の階層 レ ベルで メ モ リ の イ ン プ リ メ
ン テーシ ョ ン に使用 さ れ る リ ソ ー ス を
リ ス ト し ます。
Details: FIFO
こ こ に リ ス ト さ れ る リ ソ ース は、こ の階
層 レ ベルに FIFO を イ ン プ リ メ ン テ ー
シ ョ ンす る ために使用 さ れ る も のです。
Details: Shift Register
ザ イ リ ン ク ス SRL コ ン ポ ー ネ ン ト に
マ ッ プ さ れたすべてのシ フ ト レ ジ ス タ
のサマ リ を示 し ます。
SRL コ ン ポーネ ン ト への追加マ ッ プは
RTL 合成中に発生 し ます。
Details: Expression
現在の階層レベルで乗算器、 加算器、 コ
ン パ レ ー タ な ど の演算で使用 さ れ る リ
ソ ース を示 し ます。
演算に対す る 入力ポー ト の ビ ッ ト 幅が
表示 さ れます。
Details: Multiplexors
こ こ に リ ス ト さ れ る リ ソ ース は、こ の階
層 レ ベルの マルチプ レ ク サ を イ ン プ リ
メ ン ト す る ために使用 さ れ る も のです。
マルチプ レ ク サの入力幅が表示 さ れ ま
す。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
36
Vivado HLS の使用
表 1‐1 : 合成レポー ト のカ テ ゴ リ
カ テゴ リ
Interface Summary
サブ カ テ ゴ リ
説明
Details: Registers
こ の階層 レ ベルの レ ジ ス タ すべて の リ
ス ト が表示 さ れ ま す。 こ の レ ポー ト に
は、レ ジ ス タ の ビ ッ ト 幅が含まれてい ま
す。
Interface
関数引数が ど の よ う に RTL ポー ト に合
成 さ れ る かが示 さ れます。
RTL ポー ト 名は、 プ ロ ト コ ル と ソ ー ス
オブジ ェ ク ト でグループ分け さ れ ます。
こ れ ら は、 ソ ー ス オブ ジ ェ ク ト が記述
さ れた IO プ ロ ト コ ルで合成 さ れ る と 作
成 さ れ る RTL ポー ト です。
I/O プ ロ ト コ ルが指示子を使用 し て指定
さ れない場合は、 こ の C 型の関数引数
のデ フ ォ ル ト I/O プ ロ ト コ ルが示 さ れ
ます。
Vivado HLS の最 も 一般的な使用方法は、 まず初期デザ イ ン を作成 し 、 その後エ リ アお よ びパフ ォーマ ン ス を満たすた
めに最適化を実行す る 方法です。 ソ リ ュ ーシ ョ ンに よ り 、 初期の合成を保持 し 、 比較で き ます。
レ ポー ト 結果の解析には、 合成 レ ポー ト だけで な く 、 [Analysis] 表示を使用す る こ と も で き ま す。 [Analysis] 表示は
[Analysis] を ク リ ッ ク す る と 開 く こ と がで き ます (図 1-20)。 [Synthesis] ボ タ ン を ク リ ッ ク す る と 、 合成ビ ュ ーに戻 り ま
す。
X-Ref Target - Figure 1-20
図 1‐20 : [Analysis] ボ タ ン
[Analysis] 表示には、 表形式 と 画像形式の両方でデザ イ ンのパ フ ォ ーマ ン スお よ び リ ソ ー ス が表示 さ れ、 ど ち ら の表
示 も 連動す る よ う にな っ てい ま す。 図 1-21 は、 [Analysis] 表示を最初に開いた と き のデフ ォ ル ト の ウ ィ ン ド ウ コ ン
フ ィ ギ ュ レーシ ョ ンです。
[Module Hierarchy] ビ ュ ーには、 RTL デザ イ ン全体の概要が表示 さ れます。
•
こ のビ ュ ーは、 デザ イ ン階層をナビ ゲーシ ョ ンす る ために使用 し ます。
•
[Module Hierarchy] タ ブには、 RTL 階層の各ブ ロ ッ ク の リ ソ ースお よ びレ イ テ ン シ貢献が表示 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
37
Vivado HLS の使用
図 1-20 に表示 さ れ る 結果を確認す る こ と で、 提供 さ れてい る 情報がわか り やす く な り ます。 こ の drc デザ イ ン全体で
は、 ブ ロ ッ ク RAM 6 つ と 約 300 個の LUT が使用 さ れ、 約 3900 ク ロ ッ ク サ イ ク ルの レ イ テ ン シがあ り ます。 その中
の下位ブ ロ ッ ク の dct_2b ではブ ロ ッ ク RAM 4 つ、 LUT 約 250 が使用 さ れ、 約 3600 ク ロ ッ ク サ イ ク ルの レ イ テ ン シ
があ り ます。 こ のため、 こ のデザ イ ンの リ ソ ース と レ イ テ ン シはほ と ん ど こ の下位ブ ロ ッ ク の dct_2b か ら の も のなの
がわか り ます。
X-Ref Target - Figure 1-21
図 1‐21 : [Analysis] ボ タ ン
[Performance Profile] ビ ュ ーには、 [Module Hierarchy] ビ ュ ーで現在選択 さ れてい る ブ ロ ッ ク ( こ の場合、 dct ブ ロ ッ ク )
のパフ ォーマ ン ス の詳細が表示 さ れます。
•
ブ ロ ッ ク のパフ ォーマ ン ス は、 含まれ る 下位ブ ロ ッ ク の関数 と こ の階層レベルに含まれ る ロ ジ ッ ク すべてに よ っ
て決ま り ます。 [Performance Profile] ビ ュ ーには、 パフ ォーマ ン ス全体に貢献す る こ の階層レベルのア イ テ ムが表
示 さ れます。
•
パフ ォーマ ン ス は、 レ イ テ ン シ と 開始間隔 (II) に よ っ て測定 さ れます。 こ のビ ュ ーには、 ブ ロ ッ ク のパ イ プ ラ イ
ン処理の有無 も 表示 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
38
Vivado HLS の使用
•
こ の例では、 2 つのループが こ の階層レベルに ロ ジ ッ ク と し て イ ンプ リ メ ン ト さ れ、 ど ち ら も レ イ テ ン シに対 し
て 144 ク ロ ッ ク サ イ ク ル貢献 し てい る こ と がわか り ます。
[Schedule Viewer] ビ ュ ーには、 こ の特定のブ ロ ッ ク の演算が ク ロ ッ ク サ イ ク ルに ど の よ う に ス ケ ジ ュ ール さ れてい る
かが表示 さ れます。 デフ ォ ル ト のビ ュ ーは、 [Performance] です。
•
•
•
左側の列には、 リ ソ ース が表示 さ れます。
°
下位ブ ロ ッ ク は緑で表示 さ れます。
°
ソ ース内のループの結果であ る 演算は黄色で表示 さ れます。
°
標準的な演算は紫色で表示 さ れます。
dct には次の 3 つの主な リ ソ ース が含まれます。
°
RD_Loop_Row と い う ループ。 図 1-21 では、 RD_Loop_Row ループの階層が展開 さ れてい ます。
°
dct_2d と い う 下位ブ ロ ッ ク 。
°
WR_Loop_Row と い う ループ。 プ ラ ス マー ク (+) は、 そのループに階層が含まれ、 展開 し て表示可能であ る
こ と を示 し てい ます。
一番上の行には、 デザ イ ン の制御 ス テー ト が リ ス ト さ れ ま す。 制御 ス テー ト は、 高位合成で使用 さ れ る 内部 ス
テー ト の こ と で、 ク ロ ッ ク サ イ ク ルに対 し て演算を ス ケ ジ ュ ール し ます。 制御ス テー ト と RTL の有限ス テー ト
マシ ン (FSM) 間は密に関係 し てい ますが、 1:1 では対応 し てい ません。
[Schedule Viewer] ビ ュ ーの情報は、 最初に実行 さ れ る リ ソ ース のセ ッ ト (RD_Loop_Row ループ) を確認す る と わか り
ます。
•
デザ イ ンは、 C0 ス テー ト で開始 さ れます。
•
次に RD_Loop_Row ループの ロ ジ ッ ク を実行 し 始め ます。
°
ループの最初の ス テー ト では、 exit 条件がチ ェ ッ ク さ れ、 加算演算が実行 さ れます。
•
ループは、 C1、 C2、 C3 の 3 つの ス テー ト 間実行 さ れます。
•
[Performance Profile] ビ ュ ーには、 こ のループの ト リ ッ プ カ ウ ン ト が 8 で、 こ れ ら の 3 ス テー ト が約 8 回繰 り 返 さ
れ る こ と が示 さ れます。
•
[Performance Profile] ビ ュ ーには、 RD_Loop_Row ループが実行 さ れ る のに 144 ク ロ ッ ク サ イ ク ルかか る こ と も 表
示 さ れます。
•
°
RD_Loop_Row ループの開始に 1 サ イ ク ルかか り ます。
°
[Performance Profile] ビ ュ ーには、 RD_Loop_Col ループのすべての演算が実行 さ れ る のに 16 ク ロ ッ ク サ イ ク
ルかか る こ と が示 さ れます。
°
RD_Loop_Row ループの開始に戻る のに 1 ク ロ ッ ク サ イ ク ル余分にかか り ます。
°
18 サ イ ク ルが 8 回繰 り 返 さ れ る ので、 終了には 144 ク ロ ッ ク サ イ ク ルかか り ます。
RD_Loop_Col ループには、 複数の加算、 2 サ イ ク ルの読み出 し 、 1 つの書 き 込みがあ る のがわか り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
39
Vivado HLS の使用
図 1-22 は、 書 き 込みま たはその他の演算を右 ク リ ッ ク し た と こ ろ を示 し てい ます。 [Goto Source] を ク リ ッ ク す る と 、
ソ ース コ ー ド ビ ュ ーに関連 し た変数が開 き ます。 こ の書 き 込みに よ り 、 input 変数か ら のア レ イ にデー タ の書 き 込み
が イ ンプ リ メ ン ト さ れます。
X-Ref Target - Figure 1-22
図 1‐22 : 関連する C ソ ース コ ー ド
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
40
Vivado HLS の使用
[Analysis] 表示では、 リ ソ ース使用量 も 解析で き ます。 図 1-23 は、 [Resource Profile] お よ び [Resource Sharing] ビ ュ ー
を示 し てい ます。
X-Ref Target - Figure 1-23
図 1‐23 : 関連する C ソ ース コ ー ド
[Resource Profile] ビ ュ ーには、 こ の階層レベルで使用 さ れた リ ソ ース が表示 さ れ ます。 こ の例の場合、 ほ と ん ど のエ
リ アが イ ン ス タ ン ス ( こ のブ ロ ッ ク 内に イ ン ス タ ン シエー ト さ れたブ ロ ッ ク ) で使用 さ れてい ます。 [Expressions] を展
開す る と 、 こ の階層レベルのほ と ん ど の リ ソ ース が加算器を イ ンプ リ メ ン ト す る ために使用 さ れてい る のがわか り ま
す。
[Resource Sharing] タ ブには、 使用 さ れた演算の制御ス テー ト が示 さ れます。 こ の例の場合、 すべての加算演算が別の
加算器 リ ソ ース に関連付け ら れ、 共有 さ れてい る 加算器がないのがわか り ます (ま たは、 複数の加算演算が水平方向
の各行にあ る 場合、 同 じ リ ソ ース の複数の演算が別の ス テー ト ま たは ク ロ ッ ク サ イ ク ルにあ る こ と を示 し ます)。
メ モ リ ア ク セ ス さ れ る 同 じ サ イ ク ルの加算器は、 各 メ モ リ 専用です。 こ れは、 関連す る C コ ー ド を連動 さ せ る と 確認
で き ます。
[Analysis] 表示の機能は、 かな り イ ン タ ラ ク テ ィ ブです。 [Analysis] 表示の詳細は、 『Vivado Design Suite チ ュ ー ト リ ア
ル : 高位合成』 (UG871) の 「デザ イ ン解析」 セ ク シ ョ ン を参照 し て く だ さ い。 Tcl フ ロ ーがデザ イ ン を作成す る のに使
用 さ れていて も 、 プ ロ ジ ェ ク ト は GUI で開いて、 [Analysis] ビ ュ ーでデザ イ ン を解析で き ます。
[Synthesis] ボ タ ン を ク リ ッ ク す る と 、 合成ビ ュ ーに戻 り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
41
Vivado HLS の使用
アー カ イ ブ
Vivado HLS プ ロ ジ ェ ク ト は、 [File] → [Archive] を ク リ ッ ク す る と 業界標準の ZIP フ ァ イ ルに アーカ イ ブで き ま す。
[Archive Name] では、 ZIP フ ァ イ ルの名前を指定で き ます。
デフ ォ ル ト では、 現在のア ク テ ィ ブ ソ リ ュ ーシ ョ ンのみがアーカ イ ブ さ れます。 [Active Solution Only] を オ フ にす る
と 、 すべての ソ リ ュ ーシ ョ ンがアーカ イ ブ さ れます。
新規 ソ リ ュ ーシ ョ ンの作成
新 し い ソ リ ュ ーシ ョ ン を作成す る には、 [New Solution] ツ ールバー ボ タ ン (図 1-15) を ク リ ッ ク す る か、 [Project] →
[New Solution] を ク リ ッ ク し ます。 [Solution Wizard] ダ イ ア ロ グ ボ ッ ク ス が開 き ます (図 1-24)。
X-Ref Target - Figure 1-24
図 1‐24 : [Solution Wizard] ダ イ ア ログ ボ ッ ク ス
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
42
Vivado HLS の使用
こ のダ イ ア ロ グ ボ ッ ク ス には、 New Vivado HLS Project ウ ィ ザー ド の最後のページ (図 1-14) と 同 じ オプシ ョ ン と 、 既
存の指示子やカ ス タ ム コ マ ン ド を コ ピーする オプシ ョ ンがあ り ます。次のセ ク シ ョ ンで、 ソ リ ューシ ョ ンに指示子を
追加す る 方法を説明 し ます。
X-Ref Target - Figure 1-25
図 1‐25 : ヘ ッ ダー フ ァ イルの解析を イ ネーブル
注記 : [Parse all header files] をオンにする と 、すべてのヘ ッ ダー フ ァ イ ルが継続的にポー リ ン グ さ れ、変更がないか ど
う かがチ ェ ッ ク さ れます。 CPU サ イ ク ルではヘ ッ ダー フ ァ イ ルのチ ェ ッ ク は通常の動作なので、 こ れに よ り GUI の
応答時間が削減 さ れ る 場合があ り ます。
ソ ース コ ー ド の コ メ ン ト の解決
言語環境に よ っ ては、 英語以外の言語の コ メ ン ト が文字化けす る こ と があ り ます。 こ れを修正す る には、 次の手順に
従い ます。
1.
[Explorer] タ ブでプ ロ ジ ェ ク ト を選択 し ます。
2.
右 ク リ ッ ク し て [Properties] を ク リ ッ ク し 、 [Resource] ページで適切な言語エン コ ー ド を選択 し ます。 [Text file
encoding] で [Other] を オンに し 、 ド ロ ッ プダ ウ ン リ ス ト か ら 適切なエン コ ーデ ィ ン グ を選択 し ます。
GUI のカ ス タ マ イ ズ
Vivado HLS の
ます。
GUI の動作を カ ス タ マ イ ズす る には、 [Windows] → [Preferences] を ク リ ッ ク し てオプシ ョ ン を設定 し
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
43
Vivado HLS の使用
[Preferences] ダ イ ア ロ グ ボ ッ ク ス では さ ま ざ ま な詳細な設定が可能です。 た と えば、 キーの組み合わせ Ctrl + Tab は、
デフ ォ ル ト では情報エ リ アのア ク テ ィ ブ タ ブ を ソ ース コ ー ド と ヘ ッ ダー フ ァ イ ルで切 り 替え ますが、 各 タ ブが順に
ア ク テ ィ ブにな る よ う に変更で き ます。
•
[Preferences] ダ イ ア ロ グ ボ ッ ク ス の左側のボ ッ ク ス で [General] → [Keys] を ク リ ッ ク し 、 表の [Command] 列で
[Toggle Source/Header] を選択 し て、 [Unbind Command] を ク リ ッ ク し て Ctrl + Tab の組み合わせを削除 し ます。
•
[Command] 列で [Next Tab] を選択 し 、 下の [Binding] ボ ッ ク ス を ク リ ッ ク し て Ctrl キーを押 し てか ら Tab キーを
押す と 、 Ctrl + Tab キーを押 し た と き に次の タ ブがア ク テ ィ ブにな る よ う 設定で き ます。
[Preferences] ダ イ ア ロ グ ボ ッ ク ス の左側のボ ッ ク ス で さ ま ざ ま な項目を選択する こ と に よ り 、Vivado HLS の
境を詳細にカ ス タ マ イ ズで き 、 生産性を向上す る こ と がで き ます。
GUI 環
[Cosole] ビ ュ ーのカ ス タ マ イ ズ
[Console] ビ ュ ーには、 合成お よ び検証な ど の操作中の メ ッ セージがすべて表示 さ れます。
こ のビ ュ ーのデフ ォ ル ト のバ ッ フ ァ ー サ イ ズは 80,000 語ですが、 こ れは変更で き ます。 ま たは、 すべての メ ッ セージ
が表示 さ れ る よ う に制限をはずす こ と も で き ます。 こ れは、 [Preferences] → [Run/Debug] → [Console] か ら 設定で き ま
す。
Vivado HLS GUI の使用
Vivado HLS の GUI のデフ ォ ル ト 設定では、 一部の情報が表示 さ れない こ と があ り ます。 こ のセ ク シ ョ ン では、 次
のカ ス タ マ イ ズ方法について説明 し ます。
•
ヘ ッ ダー フ ァ イ ルに定義 さ れてい る 情報
•
英語以外の言語で記述 さ れた ソ ース の コ メ ン ト
•
[Console] ビ ュ ーのバ ッ フ ァ ー サ イ ズ
•
デフ ォ ル ト のビヘ イ ビ ア
ヘ ッ ダー フ ァ イル情報の解決
デフ ォ ル ト の Vivado HLS の GUI では、 ヘ ッ ダー フ ァ イ ルを解析 し てすべての コ ーデ ィ ン グ コ ン ス ト ラ ク ト が解
決 さ れ る わけではあ り ません。 こ のため、 次の よ う な状況が発生す る こ と があ り ます。
•
コ ー ド ビ ュ ーアーに変数ま たは値が不明ま たは定義で き ない と 表示 さ れ る 。
•
コ ー ド の変数が指示子 ウ ィ ン ド ウ に表示 さ れない。
ど ち ら の場合 も 、 不明の値お よ び表示 さ れていない変数はヘ ッ ダー フ ァ イ ル (拡張子が .h ま たは .hpp) で定義 さ れま
す。 C コ ー ド を最初に Vivado HLS の GUI で開 く と 、 ほかの フ ァ イ ルで定義 し たオブジ ェ ク ト への リ フ ァ レ ン ス が未
定義 と 表示 さ れ る こ と があ り ます。 こ の例は、 図 1-26 の左側を参照 し て く だ さ い。 サ イ ド バーに未定義の リ フ ァ レ ン
ス が表示 さ れてい ます。
[Index C] ツールバー ボ タ ン を ク リ ッ ク す る と 、 すべての C フ ァ イ ルに イ ンデ ッ ク ス を付けて、 すべてのオブジ ェ ク
ト 定義 を 解決 で き ま す。 こ の操作の結果は、 図 1-26 の右側に表示 さ れ て い ま す。 [Project] → [Project Settings] →
[General] を ク リ ッ ク し て [Parse All Header Files] を オンに し てプ ロ ジ ェ ク ト 設定を変更す る と (図 1-25)、別の ソ リ ュ ー
シ ョ ンで イ ンデ ッ ク ス がずっ と ついた ま ま にで き ます (CPU サ イ ク ルを使用する ので、GUI の リ フ レ ッ シ ュ レー ト に
影響す る こ と があ り ます)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
44
Vivado HLS の使用
X-Ref Target - Figure 1-26
図 1‐26 : C フ ァ イルのイ ンデ ッ ク ス
指示子を使用 し て イ ン プ リ メ ン テーシ ョ ンの最適化
指示子は、 デザ イ ンの さ ま ざ ま な最適化を実行す る ために使用で き ます。 こ のセ ク シ ョ ンでは、 ソ リ ュ ーシ ョ ンに最
適化を追加す る 方法を説明 し ます。 さ ま ざ ま な最適化の詳細は、 こ のユーザー ガ イ ド の後の方の章で説明 し ます。
最適化指示子を追加す る には、 まず情報エ リ アに ソ ース コ ー ド を開 き ます。
[Explorer] タ ブで [Source] を展開 し 、 ソ ース コ ー ド を ダブル ク リ ッ ク し て情報エ リ アに開 き ます (図 1-27)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
45
Vivado HLS の使用
X-Ref Target - Figure 1-27
図 1‐27 : ソ ース と 指示子
情報エ リ アで ソ ース コ ー ド を ア ク テ ィ ブにする と 、 右側で [Directive] タ ブがア ク テ ィ ブにな り ます。
[Directive] タ ブ
[Directive] タ ブには、 開いてい る ソ ース コ ー ド の指示子が適用 さ れてい る オブジ ェ ク ト が表示 さ れます。
•
関数 (Functions)
•
イ ン タ ーフ ェ イ ス (Interfaces)
°
イ ン タ ーフ ェ イ ス は、 最上位関数への引数で、 RTL デザ イ ンのポー ト と な り ます。 指示子を使用 し て、 イ ン
タ ーフ ェ イ ス に I/O プ ロ ト コ ル ポー ト を指定で き ます。
•
ア レ イ (Arrays)
•
ループ (Loops)
•
領域 (Regions)
°
領域 と は、 中か っ こ { } で囲まれてい る 名前が付け ら れた領域です。
注記 : [Directive] タ ブに表示 さ れ る のは、 現在情報エ リ アに表示 さ れてい る フ ァ イ ル (現在ア ク テ ィ ブな フ ァ イ ル) の
オブジ ェ ク ト のみです。 デザ イ ンに含まれ る すべての フ ァ イ ルか ら のオブジ ェ ク ト ではあ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
46
Vivado HLS の使用
次の例では、 あ る ソ ース コ ー ド のア ウ ト ラ イ ン を示 し 、 指示子を指定 し て最適化を実行可能な各オブジ ェ ク ト をハ イ
ラ イ ト し てい ます。
int foo_sub_A (int mem_1[64],..){
for_A: for (int n = 0; n < 3; ++n) {
...
}
...
}
int foo_sub_B (int mem_1[64], int i) {
for_B:for (int n = 0; n < 4; ++n) {
...
}
...
}
void foo_top (int mem_1[64], int mem_2[64]) {
...
for_top: for (int i = 0; i < 64; ++i) {
my_label:{
...
}
}
}
図 1-28 に、 こ の コ ー ド 例が ど の よ う に [Directive] タ ブに表示 さ れ る か を示 し ます。
X-Ref Target - Figure 1-28
図 1‐28 : [Directive] タ ブのオブ ジ ェ ク ト
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
47
Vivado HLS の使用
指示子の適用
指示子を適用す る には、 [Directive] タ ブでオブ ジ ェ ク ト を右 ク リ ッ ク し 、 [Insert Directive] を ク リ ッ ク し て、 [Vivado
HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス (図 1-29) を開 き ます。
[Directive] ド ロ ッ プダ ウ ン リ ス ト で、 追加す る 指示子を選択 し ます。 図 1-29 の例では、 [DATAFLOW] が選択 さ れて
お り 、 デー タ フ ロ ー指示子が追加 さ れます。 指示子のオプシ ョ ン (後の章で詳細に説明) のほかに、 指示子を Tcl コ マ
ン ド と し て指示子フ ァ イ ルに挿入す る か、 プ ラ グマ と し て コ ー ド に直接挿入す る かを選択で き ます。
注記 : 指示子を グ ロ ーバル変数に適用す る には、 オブジ ェ ク ト が使用 さ れ る 関数にその指示子を適用 し ます。 その変
数を使用す る 関数の [Directives] タ ブ を開 き 、 関数自体に指示子を適用 し 、 [Vivado HLS Directive Editor] ダ イ ア ロ グ
ボ ッ ク ス に手動で変数名を直接入力 し ます。
指示子を ク ラ ス で定義 し たオブジ ェ ク ト に適用す る には、 ク ラ ス が定義 さ れてい る フ ァ イ ル (通常はヘ ッ ダー フ ァ イ
ル) を開 き 、 [Directives] タ ブ を使用 し て指示子を適用 し ます。 関数 と 同様、 1 つの ク ラ ス の イ ン ス タ ン ス はすべて同
じ 最適化が適用 さ れます。
X-Ref Target - Figure 1-29
図 1‐29 : 指示子の追加
[Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス で [Directive File] を オ ン にす る と 、 指示子が solution デ ィ レ ク ト リ
の directives.tcl フ ァ イ ルに記述 さ れます。 指示子フ ァ イ ルに指示子を記述する と 、 次の よ う な利点があ り ます。
•
各 ソ リ ュ ーシ ョ ンにそれぞれ異な る 指示子を指定で き ます。
•
Tcl バ ッ チ フ ァ イ ルを作成す る 場合、 directives.tcl フ ァ イ ルか ら 指示子を コ ピーで き ます。
図 1-30 に、 指示子を directives.tcl フ ァ イ ルに記述す る よ う に設定 し 、 その結果の directives.tcl フ ァ イ ルを情報エ リ ア
に開いた と こ ろ を示 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
48
Vivado HLS の使用
X-Ref Target - Figure 1-30
図 1‐30 : Tcl 指示子の追加
も う 1 つのオプシ ョ ンは、 プ ラ グマ を コ ー ド に追加す る 方法です。 こ の方法の利点は、 指示子が恒久的に コ ー ド に適
用 さ れ、 ほかの フ ァ イ ルは必要あ り ません。 こ れは、 IP を リ リ ースす る 場合や、 TRIPCOUNT 指示子な ど テ ク ノ ロ ジ
タ ーゲ ッ ト に よ っ て変化 し ない指示子に適 し てい ます。
図 1-31 に、 [Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス の [Destination] で [Source File] を オンに し て前述の例の
指示子をプ ラ グマ と し て適用 し 、 その結果の ソ ース コ ー ド を情報エ リ アに表示 し た と こ ろ を示 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
49
Vivado HLS の使用
X-Ref Target - Figure 1-31
図 1‐31 : プ ラ グマ指示子の追加
ど ち ら の場合 も 、 指示子が適用 さ れ、 合成を実行す る と 最適化が実行 さ れます。
プ ラ グマ を使用す る 唯一の欠点は、 指示子が恒久的に ソ ース コ ー ド に組み込まれ、 すべての ソ リ ュ ーシ ョ ンに使用 さ
れ る こ と です。
チ ュ ー ト リ アル
『Vivado Design Suite チ ュ ー ト リ アル : デザ イ ン フ ロ ーの概要』 に、 [Help] メ ニ ュ ーか ら ア ク セ ス で き ます。
こ のチ ュ ー ト リ アルは、 Vivado HLS の使用に関す る 次の ト ピ ッ ク を理解す る のに役立ち ます。
•
C デザ イ ンの検証
•
高位合成プ ロ ジ ェ ク ト の作成
•
合成お よ びデザ イ ン解析
•
ビ ッ ト 精度デザ イ ンの処理
•
デザ イ ン最適化
•
RTL 検証お よ びエ ク ス ポー ト の実行方法の理解
•
Tcl ス ク リ プ ト を使用 し た
Vivado HLS ツールの使用
こ のチ ュ ー ト リ アルで使用す る サンプル デザ イ ンは、Vivado HLS の イ ン ス ト ール デ ィ レ ク ト リ 内の examples デ ィ レ
ク ト リ にあ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
50
C の検証 と コ ーデ ィ ング ス タ イル
C の検証 と コ ーデ ィ ング ス タ イル
HLS フ ロ ーでの検証には、 2 つのプ ロ セ ス があ り ます。 合成前の検証では C プ ロ グ ラ ム で必要な機能が正 し く イ ンプ
リ メ ン ト さ れ る か ど う か検証 し 、 合成後の検証では RTL が正 し いか ど う か を検証 し ま す。 こ れ ら のプ ロ セ ス は、 そ
れぞれ C シ ミ ュ レーシ ョ ンお よ び RTL シ ミ ュ レーシ ョ ン と 呼ばれ る こ と も あ り ます。
C デザイ ンのシ ミ ュ レーシ ョ ン
合成前に、 合成す る 関数を テ ス ト ベンチを使用 し て検証す る 必要があ り ます。 理想的なテ ス ト ベンチには、 次の よ う
な特徴があ り ます。
•
セルフチ ェ ッ ク 機能があ る 。
•
デザ イ ン と は別の フ ァ イ ルに記述 さ れてい る ( こ れは必須ではあ り ませんが、 推奨 さ れます)。
テ ス ト ベンチ と 合成す る 関数を別フ ァ イ ルに し てお く と 、 シ ミ ュ レーシ ョ ン と 合成のプ ロ セ ス を分離で き ます。 テ ス
ト ベンチが合成す る 関数 と 同 じ フ ァ イ ルに含まれてい る 場合、Vivado HLS フ ロ ーを少 し 変更する 必要があ り ます。 テ
ス ト ベンチ と 合成す る 関数が含ま れ る フ ァ イ ルを、 Vivado HLS プ ロ ジ ェ ク ト に ソ ース フ ァ イ ル と し て、 かつテ ス ト
ベンチ と し て追加す る 必要があ り ます。
テ ス ト ベンチの詳細は、 「テ ス ト ベンチ要件」 を参照 し て く だ さ い。
合成前の検証用に C デザ イ ン を コ ンパ イ ルす る プ ロ セ ス は、Vivado HLS で図 1-17 お よ び図 1-18 に示す よ う に実行で
き ま す。 ただ し 、 C 検証は、 CSM デザ イ ン コ マ ン ド を Tcl フ ァ イ ルに含め る と 、 CCI を使用 し た高位合成 コ マ ン ド
プ ロ ンプ ト の コ マ ン ド ラ イ ンで も 実行で き ます。
Vivado HLS 以外での検証
注記 : Vivado 以外で実行す る 場合は、 Vivado HLS ラ イ ブ ラ リ を指定す る 必要があ り ます。 例 :
gcc -o foo_to
最上位デザ イ ン フ ァ イ ルが foo_top.c、 テ ス ト ベンチ フ ァ イ ルが tb_foo_top.c であ る 場合、 次の コ マ ン ド を使用 し てテ
ス ト ベンチを コ ンパ イ ルお よ び実行で き ます。
$ gcc -o foo_top foo_top.c tb_foo_top.c
$ ./foo_top
C++ デザ イ ン フ ァ イ ルが foo_top.cpp、 テ ス ト ベンチ フ ァ イ ルが tb_foo_top.cpp であ る 場合、 次の コ マ ン ド を使用 し て
テ ス ト ベンチを コ ンパ イ ルお よ び実行で き ます。
$ g++ -o foo_top foo_top.cpp tb_foo_top.cpp
$ ./foo_top
SystemC デザ イ ンの場合、 次の コ マ ン ド を使用 し てテ ス ト ベンチを コ ンパ イ ルお よ び実行で き ます。 最初の g++ コ マ
ン ド はわか り やすい よ う に複数行に分離 し てい ますが、 実際には 1 行に記述 し ます。
$ g++ -o foo_top foo_top.cpp tb_foo_top.cpp
-I$vivado_hls_ROOT/Linux_x86_64/tools/systemc/include/
-lsystemc
-L$vivado_hls_ROOT/Linux_x86_64/tools/systemc/lib-linux64
$ ./foo_top
SystemC が使用 さ れてい る ので、 systemc.h ヘ ッ ダー フ ァ イ ルをすべての コ ンパ イ ルに含め る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
51
C の検証 と コ ーデ ィ ング ス タ イル
サポー ト さ れるバージ ョ ン以外の GCC の使用
合成前の C コ ー ド の コ ンパ イ ルには、 サポー ト さ れ る gcc (ま たは g++) バージ ョ ン を使用 し て く だ さ い。 Vivado HLS
では、 こ のバージ ョ ンの GCC の機能に一致する RTL が生成 さ れ、 RTL と C テ ス ト ベンチの協調シ ミ ュ レーシ ョ ン を
実行す る 場合に こ のバージ ョ ンが使用 さ れます。
Vivado HLS を起動す る 前に AP_SIM_GCC 環境変数を設定する と 、RTL シ ミ ュ レーシ ョ ンに異な る バージ ョ ンの GCC
を使用で き ます。 こ の変数は、 ロ ーカル バージ ョ ンの GCC を含むデ ィ レ ク ト リ へのパ ス と 共に定義す る 必要があ り
ます。
Visual Studio コ ンパイ ラ
Vivado HLS を使用す る 前に、 Microsoft Visual Studio コ ンパ イ ラ (MVSC) を使用 し て コ ー ド を コ ンパ イ ルで き ます。
任意精度整数を使用す る 場合な ど、 関数を Vivado HLS ヘ ッ ダー フ ァ イ ル と 共に コ ンパ イ ルす る 場合、 特別な考慮
事項があ り ます (任意精度整数については 「任意精度デー タ 型」 を参照)。
C の コ ンパイル
「C 言語での任意精度デー タ 型」 に説明す る よ う に、 Vivado HLS ヘ ッ ダー フ ァ イ ル ap_cint.h で定義 さ れ る 任意精度整
数を使用す る C 関数を含め る 必要があ り ます。 Vivado HLS の任意精度型を使用する C デザ イ ンには、 MVSC は使用
で き ません。
C++ の コ ンパイル
Vivado HLS ヘ ッ ダー フ ァ イ ルを含む C++ 関数では、 MVSC でヘ ッ ダー フ ァ イ ルの場所を指定する 必要があ り ます。
MVSC で
Vivado HLS ヘ ッ ダー フ ァ イ ルの場所を指定する には、 次の手順に従い ます。
1.
[Project] を ク リ ッ ク し ます。
2.
[Properties] を ク リ ッ ク し ます。
3.
開いたパネルで、 [C/C++] を選択 し ます。
4.
[General] を選択 し ます。
5.
[Additional Include Directories] を ク リ ッ ク し 、 図 1-32 に示す よ う にパス を追加 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
52
C の検証 と コ ーデ ィ ング ス タ イル
X-Ref Target - Figure 1-32
図 1‐32 : Visual Studio での
Vivado HLS イ ン クルー ド パスの設定
任意精度デー タ 型
ネ イ テ ィ ブ C デー タ 型は、 8 ビ ッ ト 境界 (8、 16、 32、 64 ビ ッ ト ) にあ り ます。 RTL バ ス (ハー ド ウ ェ アに対応) では、
任意の幅がサポー ト さ れ ま す。 HLS では、 任意精度の ビ ッ ト 幅の仕様を使用で き る よ う に し 、 ネ イ テ ィ ブ C デー タ
型の制限に依存ない よ う にす る 機構が必要です。 た と えば、 17 ビ ッ ト 乗算器が必要な場合、 32 ビ ッ ト 乗算器に イ ン
プ リ メ ン ト し なければな ら ない よ う な制限はあ る べ き ではあ り ません。
Vivado HLS では、 C お よ び C++ の任意精度デー タ 型が提供 さ れてお り 、 SystemC の一部であ る 任意精度デー タ 型が
サポー ト さ れます。
任意精度デー タ 型の利点は、 C コ ー ド を ビ ッ ト 幅の狭い変数を使用する よ う ア ッ プデー ト し 、 C シ ミ ュ レーシ ョ ン を
再実行 し て機能が同一ま たは使用可能であ る こ と を検証で き る 点です。
Vivado HLS では、 整数お よ び固定小数点の両方のデー タ 型を使用で き ます。
整数デー タ 型
Vivado HLS では、 任意精度の整数デー タ 型が提供 さ れてい ます (表 1-2)。 こ れ ら の整数デー タ 型に よ り 、 指定の幅の
制限内の整数値を制御で き ます。
表 1‐2 : 整数デー タ 型
言語
整数デー タ 型
必要なヘ ッ ダー
C
[u]int<precision> (1024 ビ ッ ト )
gcc #include “ap_cin.h”
C++
ap_[u]int<W> (1024 ビ ッ ト )
#include “ap_int.h”
System C
sc_[u]int<W> (64 ビ ッ ト )
sc_[u]bigint<W> (512 ビ ッ ト )
#include “systemc.h”
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
53
C の検証 と コ ーデ ィ ング ス タ イル
注記 : Vivado HLS には、任意精度型を定義す る ヘ ッ ダー フ ァ イ ル も ス タ ン ド ア ロ ン パ ッ ケージ と し て含まれてお り 、
ソ ース コ ー ド で使用で き る よ う にな っ てい ます。Vivado HLS イ ン ス ト ール デ ィ レ ク ト リ の イ ン ク ルー ド デ ィ レ ク ト
リ には xilinx_hls_lib_<release_number>.tgz パ ッ ケージが含まれます。
C 言語での任意精度デー タ 型
C 言語では、 ヘ ッ ダー フ ァ イ ル ap_cint.h に よ り 任意精度の整数デー タ 型 [u]int が定義 さ れます。 ap_cint.h フ ァ イ
ルは、 Vivado HLS の イ ン ス ト ール デ ィ レ ク ト リ にあ り ます。
注記 : xilinx_hls_lib_<release_number>.tgz パ ッ ケージには、ap_cint.h で定義 さ れた C 任意精度デー タ 型は含まれてい ま
せん。 こ れ ら のデー タ 型は、 標準 C コ ンパ イ ラ ー と は一緒に使用で き ず、 Vivado HLS cpcc コ ンパ イ ラ ーでのみ使用
で き る よ う にな っ てい ます。 詳細は、 「C 言語での任意精度デー タ 型の検証」 を参照 し て く だ さ い。
C 関数で任意精度の整数デー タ 型を使用する には、 次の手順に従い ます。
•
ソ ース コ ー ド にヘ ッ ダー フ ァ イ ル ap_cint.h を追加 し ます。
•
ビ ッ ト 型を intN ま たは uintN (N はビ ッ ト サ イ ズ を表す 1 ~ 1024 の値) に変更 し ます。
°
コ マ ン ド プ ロ ンプ ト で C シ ミ ュ レーシ ョ ン を実行する 場合、 gcc の代わ り に apcc を使用 し ます。
C++ 言語での任意精度デー タ 型
C++ 言語では、 ヘ ッ ダー フ ァ イ ル ap_int.h に よ り 任意精度の整数デー タ 型 ap_[u]int が定義 さ れます (表 1-3)。 ap_int.h
フ ァ イ ルは、 $VIVADO_HLS_ROOT/include ($VIVADO_HLS_ROOT は Vivado HLS の イ ン ス ト ール デ ィ レ ク ト リ ) に
あ り ます。
C++ 関数で任意精度の整数デー タ 型を使用する には、 次の手順に従い ます。
•
ソ ース コ ー ド にヘ ッ ダー フ ァ イ ル ap_int.h を追加 し ます。
•
ビ ッ ト 型を ap_int<N> ま たは ap_uint<N> (N はビ ッ ト サ イ ズ を表す 1 ~ 1024 の値) に変更 し ます。
次の例に、 ヘ ッ ダー フ ァ イ ルの追加方法 と 、 2 つの変数を 9 ビ ッ ト 整数型お よ び 10 ビ ッ ト の符号な し 整数型を使用
し て イ ンプ リ メ ン ト す る 方法を示 し ます。
#include ap_int.h
void foo_top (…) {
ap_int<9> var1;
ap_uint<10> var2;
// 9-bit
// 10-bit unsigned
任意精度整数を使用す る 場合、 シ ミ ュ レーシ ョ ンにヘ ッ ダー フ ァ イ ル ap_int.h へのパ ス を含め る 必要があ り ます。
$ g++ -o foo_top foo_top.cpp tb_foo_top.cpp -I$VIVADO_HLS_ROOT/include
SystemC 言語での任意精度デー タ 型
SystemC で使用 さ れ る 任意精度型は、 ヘ ッ ダー フ ァ イ ル systemc.h で定義 さ れてい ます。 こ のヘ ッ ダー フ ァ イ ルは、
す べ て の SystemC デ ザ イ ン に 含 め る 必 要 が あ り ま す。 ヘ ッ ダ ー フ ァ イ ル に は、 SystemC sc_int<>、 sc_uint<>、
sc_bigint<>、 お よ び sc_biguint<> 型が含まれます。
固定小数点デー タ 型
固定小数点デー タ 型を使用 し て実行 さ れた C++/SystemC シ ミ ュ レーシ ョ ンの動作は、合成で作成 さ れたハー ド ウ ェ ア
の結果 と 一致 し 、 ビ ッ ト 精度、 量子化、 お よ びオーバーフ ロ ーの影響を高速の C レベル シ ミ ュ レーシ ョ ン で解析で
き る ので、 HLS を使用す る 場合、 固定小数点デー タ 型の使用は特に重要です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
54
C の検証 と コ ーデ ィ ング ス タ イル
Vivado HLS では、 C++ お よ び SystemC に任意精度の固定小数点デー タ 型を使用で き ます (表 1-3)。
表 1‐3 : 固定小数点デー タ 型
言語
固定小数点デー タ 型
必要なヘ ッ ダー
C
-- な し --
-- な し --
C++
ap_[u]fixed<W,I,Q,O,N>
#include “ap_fixed.h”
System C
sc_[u]fixed<W,I,Q,O,N>
#define SC_INCLUDE_FX
[#define SC_FX_EXCLUDE_OTHER]
#include “systemc.h”
こ れ ら のデー タ 型は、 指定の合計幅お よ び整数幅の制限内での浮動小数点値を制御 し ます (図 1-33)。
X-Ref Target - Figure 1-33
図 1‐33 : 固定小数点デー タ 型
表 1-4 に、 固定小数点でサポー ト さ れ る 演算の概要を示 し ます。
表 1‐4 : 固定小数点の識別子
識別子
説明
W
ワー ド 長を ビ ッ ト 数で指定
I
整数値を ビ ッ ト 数で指定 (整数部のビ ッ ト 数)
Q
量子化モー ド を指定。量子化モー ド
は、結果の保存に使用 さ れ る 変数の
最小の小数 ビ ッ ト で定義で き る よ
り も 大 き い精度が生成 さ れた場合
の動作を指定 し ます。
SystemC 型
SC_RND
SC_RND_ZERO
SC_RND_MIN_INF
AP_RND_INF
AP_RND_CONV
AP_TRN
AP_TRN_ZERO
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
AP_Fixed 型
AP_RND
AP_RND_ZERO
AP_RND_MIN_INF
AP_RND_INF
AP_RND_CONV
AP_TRN
AP_TRN_ZERO
japan.xilinx.com
説明
正の無限大への丸め
0 への丸め
負の無限大への丸め
無限大への丸め
収束丸め
負の無限大への切 り 捨て
0 への切 り 捨て (デフ ォ ル ト )
Send Feedback
55
C の検証 と コ ーデ ィ ング ス タ イル
表 1‐4 : 固定小数点の識別子
識別子
説明
折 り 返 し モー ド での飽和ビ ッ ト 数
O
SystemC 型
AP_SAT
AP_SAT_ZERO
AP_SAT_SYM
AP_WRAP
AP_WRAP_SM
SC_SAT
SC_SAT_ZERO
SC_SAT_SYM
SC_wrapper.h
SC_WRAP_SM
飽和
0 への飽和
対称飽和
折 り 返 し (デフ ォ ル ト )
符号絶対値の折 り 返 し
折 り 返 し モー ド での飽和ビ ッ ト 数
N
ap_fixed
次の例では、 Vivado HLS の ap_fixed 型を使用 し て、 18 ビ ッ ト 変数 (6 ビ ッ ト が整数部、 12 ビ ッ ト が小数部を表す) を
定義 し てい ます。 変数は符号付 き 、 量子化モー ド は丸め、 オーバーフ ロ ー モー ド はデフ ォ ル ト の折 り 返 し に指定 さ れ
てい ます。
#include <ap_fixed.h>
...
ap_fixed<18,6,AP_RND > my_type;
...
sc_fixed
次の sc_fixed 型の例では、 22 ビ ッ ト 変数が整数部 21 ビ ッ ト で定義 さ れてお り 、 最小精度は 0.5 です。 0 への丸めが使
用 さ れてい る ので 0.5 未満の結果はすべて 0 に丸め ら れ、 飽和が指定 さ れてい ます。
#define SC_INCLUDE_FX
#define SC_FX_EXCLUDE_OTHER
#include <systemc.h>
...
sc_fixed<22,21,SC_RND_ZERO,SC_SAT> my_type;
...
浮動小数点型
デザ イ ン を合成す る ために、 Vivado HLS ではすべての演算が C コ ー ド で抽出 さ れ、 それ ら が内部デー タ ベース に演
算子 と し て渡 さ れます。 RTL イ ンプ リ メ ン テーシ ョ ン段階中は、 こ れ ら の演算子がハー ド ウ ェ アに演算を イ ンプ リ メ
ン ト す る コ アにマ ッ プ さ れます。
こ のプ ロ セ ス の詳細 と コ アの リ ス ト については、 第 2 章 「高位合成演算子お よ び コ ア」 を参照 し て く だ さ い。
浮動小数点型の場合、 次の 2 つの演算 タ イ プがあ り ます。
•
標準演算 (+、 *、 - な ど)
•
math ラ イ ブ ラ リ 関数 (sin()、 cos()、 sqrt() な ど)
標準演算はザ イ リ ン ク ス浮動小数 IP コ ア を使用 し て イ ンプ リ メ ン ト さ れ、 すべての演算がサポー ト さ れます。
浮動小数点の math 演算は、 C/C++ math ら いぶ ら り を使用 し て C/C++ で イ ンプ リ メ ン ト さ れます。 こ の場合、 合成は
次のいずれかの方法でサポー ト さ れます。
•
適切なザ イ リ ン ク ス IP コ アがあ る 場合は、 それが イ ンプ リ メ ン テーシ ョ ンに使用 さ れます。
•
ま たは、 その関数が HLS math ラ イ ブ ラ リ を使用 し て提供 さ れ る 必要があ り ます。 高位合成では C++ ラ イ ブ ラ リ
が提供 さ れてお り 、 最 も よ く 使用 さ れ る math 関数の完全で合成可能な記述が含まれます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
56
C の検証 と コ ーデ ィ ング ス タ イル
Vivado HLS math ラ イ ブ ラ リ の使用方法 と サポー ト さ れ る math 関数の リ ス ト については、 第 3 章 「高位合成 コ ーデ ィ
ン グ ス タ イ ル」 の 「C ラ イ ブ ラ リ 」 を参照 し て く だ さ い。
注記 : 高位合成で適切な浮動小数点 コ アや演算を イ ンプ リ メ ン ト す る HLS ラ イ ブ ラ リ がが検出で き なかっ た場合は、
エ ラ ー メ ッ セージが表示 さ れ、 ツールは停止 し ます。
浮動小数点演算
ラ イ ブ ラ リ か ら の浮動小数点 コ ア を使用す る には、 演算のすべての引数が浮動小数点引数であ る 必要があ り ます。 次
の よ う な コ ー ド があ る と し ます。
A = B/2;
こ れは、 次の よ う に変更す る 必要があ り ます。
A =B * 0.5;
浮動小数点のシ ミ ュ レーシ ョ ン
RTL の浮動小数点 コ アの精度が C ソ ース の演算に よ っ て異な る こ と があ り ます。 表 3-7 は、 そのわずかな精度の違い
について リ ス ト し てい ます。
こ の精度の違いは、 C シ ミ ュ レーシ ョ ン と RTL シ ミ ュ レーシ ョ ン間で違いがあ る 可能性を示 し てい ます。 こ れを確認
す る には、 次の 2 つの方法を使用で き ます。
•
C テ ス ト ベンチでのチ ェ ッ ク 結果が 1 対 1 の比較を使用 し て実行 さ れない よ う に し 、 許容可能な違い ま たは差分
に対す る 比較が実行 さ れ る よ う に し ます。
•
C シ ミ ュ レーシ ョ ンには、 ビ ッ ト 精度 C モデルが使用で き ます。 こ れ ら のモデルは、 RTL イ ンプ リ メ ン テーシ ョ
ン と 同 じ ビヘ イ ビ アにな り ま す。 こ れに よ り 、 C シ ミ ュ レーシ ョ ン が RTL シ ミ ュ レーシ ョ ン と 同 じ にな り ます
が、 こ れ ら のビ ッ ト 精度モデルを使用す る C シ ミ ュ レーシ ョ ン と 標準 C デー タ 型お よ び math 関数を使用す る C
シ ミ ュ レーシ ョ ン間で違いが出て し ま い ます。 こ れ ら の違いが許容可能か ど う かは、 C シ ミ ュ レーシ ョ ン中に解
析で き ます。
ど ち ら の手法 も 具体例については、 「シ ミ ュ レーシ ョ ンの違い」 セ ク シ ョ ン を参照 し て く だ さ い。
最後に、 RTL シ ミ ュ レーシ ョ ン を実行す る には、 浮動小数点 コ アの ビ ッ ト 精度モデルが RTL シ ミ ュ レー タ で使用で
き る よ う にな っ てい る 必要があ り ます。 こ れは、 次を使用 し て RTL シ ミ ュ レーシ ョ ン が実行 さ れた場合は、 自動的
に設定 さ れます。
•
SystemC RTL
•
ザ イ リ ン ク ス Vivado シ ミ ュ レー タ を使用 し た Verilog お よ び VHDL
•
ザ イ リ ン ク ス ISim シ ミ ュ レー タ を使用 し た Verilog お よ び VHDL
•
Mentor Graphics 社の Questa SIM シ ミ ュ レー タ を使用 し た Verilog お よ び VHDL
その他のサポー ト さ れ る HDL シ ミ ュ レー タ の場合、 ザ イ リ ン ク ス浮動小数点 ラ イ ブ ラ リ がプ レ コ ンパ イ ル さ れ、 シ
ミ ュ レー タ の ラ イ ブ ラ リ に追加 さ れてい る 必要があ り ます。浮動小数点シ ミ ュ レーシ ョ ン ラ イ ブ ラ リ を コ ンパ イ ルす
る 方法については、 Vivado HLS ではな く Vivado Design Suite の資料を参照す る か、 -help オプシ ョ ン を使用 し て く だ
さ い。 こ れ に は、 Vivado Design Suite の GUI ま た は Vivado Tcl シ ェ ル を 開 い て、 Tcl コ マ ン ド プ ロ ン プ ト に
compile_simlib –help と 入力 し ます。
cosim_design で RTL を検証す る ため、 Vivado HLS で RTL にアダプ タ ーを含む SystemC ラ ッ パーが作成 さ れ、 こ の (C
コ ー ド ) ラ ッ パーが既存の C テ ス ト ベンチに イ ン ス タ ン シエー ト さ れます (図 1-34)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
57
C の検証 と コ ーデ ィ ング ス タ イル
X-Ref Target - Figure 1-34
図 1‐34 : cosim_design ラ ッ パーの概要
Vivado HLS で作成 さ れ る ラ ッ パーは、 RTL イ ン タ ーフ ェ イ ス にハン ド シ ェ イ ク が必要な場合はそれがモデ リ ン グ さ
れ、 テ ス ト ベンチか ら 供給 さ れ る DUT への入力値が RTL デザ イ ン で必要な と き に準備 さ れてい る こ と を確実にす る
必要があ り ます。 こ れには、 ス ト レージが必要です。
Vivado HLS では、こ の よ う なポ イ ン タ ーを使用す る 関数 イ ン タ ーフ ェ イ ス で読み出 し ま たは書 き 込みが何回実行 さ れ
る か を判断で き ません。 関数 イ ン タ ーフ ェ イ ス の引数では、 値がい く つ読み出 さ れ る か、 ま たは書 き 込まれ る かは
Vivado HLS に示 さ れません。
void foo ( volatile int *d_o,
volatile int *d_i)
ア レ イ の最大サ イ ズな ど、 イ ン タ ーフ ェ イ ス に値がい く つ必要か を示す よ う な も のがない限 り 、Vivado HLS では 1 つ
の値であ る と 想定 さ れ、 1 つの入力お よ び 1 つの出力用のシ ミ ュ レーシ ョ ン ラ ッ パーが作成 さ れます。
RTL ポー ト が実際には複数の値を読み出 し ま たは書き 込みする 場合、こ れに よ り RTL cosim_design シ ミ ュ レーシ ョ ン
が停止す る 可能性があ り ます。 ラ ッ パーは RTL デザ イ ン に接続 さ れ る 送信ブ ロ ッ ク と 受信ブ ロ ッ ク がモデ リ ン グ さ
れ る ため、 RTL デザ イ ンで次の値の読み出 し ま たは書 き 込みが試み ら れますが、 読み出す値がないか書 き 込むスペー
ス がないため、 ハン ド シ ェ イ ク イ ン タ ーフ ェ イ ス に よ り デザ イ ンに待機する よ う 指示 さ れます。
イ ン タ ーフ ェ イ ス でマルチア ク セ ス ポ イ ン タ ーが使用 さ れ る 場合、イ ン タ ーフ ェ イ ス での読み出 し ま たは書 き 込みの
最大回数を Vivado HLS に示す必要があ り ます。 イ ン タ ーフ ェ イ ス を指定する 場合、 [Vivado HLS Directive Editor] ダ
イ ア ロ グ ボ ッ ク ス の [Directive] で [INTERFACE] を選択 し 、 [depth] オプシ ョ ン を設定 し ます (図 1-37)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
58
C の検証 と コ ーデ ィ ング ス タ イル
X-Ref Target - Figure 1-35
図 1‐35 : [Vivado HLS Directive Editor] ダ イ ア ログ ボ ッ ク ス : [depth] オプ シ ョ ン
上記の例では、 引数お よ びポー ト d_i の (FIFO イ ン タ ーフ ェ イ ス の) 深 さ が 4 に設定 さ れてお り 、 cosim_design で RTL
を正 し く 検証す る のに十分な値が供給 さ れます。
シ ミ ュ レーシ ョ ンの不一致 と C モデ リ ング
ポー ト の最大深 さ が定義 さ れ、 cosim_design で関数か ら 作成 さ れた RTL を検証で き る よ う にな っ た ら 、 次の問題はシ
ミ ュ レーシ ョ ンの不一致です。
RTL 入力 イ ン タ ーフ ェ イ ス では、 テ ス ト ベンチの よ う に、 各 ト ラ ンザ ク シ ョ ンで同 じ 値が 4 回供給 さ れ る わけではあ
り ません。 RT レベルでは、 デザ イ ンが最終的に接続 さ れ る RTL 送信ブ ロ ッ ク をモデ リ ン グする ラ ッ パーに よ り 、 ハ
ン ド シ ェ イ ク イ ン タ ーフ ェ イ ス で要求 さ れ る たびに新 し い値が供給 さ れます。 こ の例では、 最初の ト ラ ンザ ク シ ョ ン
で 4 つの値が供給 さ れ ます。 テ ス ト ベンチで供給 さ れ る 0 と 、 テ ス ト ベンチで RTL ラ ッ パーに供給 さ れ る のは 1 つ
の値のみであ る ため、 未定義の値 x、 y、 お よ び z です。
C と RTL の間でシ ミ ュ レーシ ョ ンが一致 し ません。
注記 : 問題は、 C コ ー ド お よ びテ ス ト ベンチで複数の読み出 し ま たは書き 込みが必要な状況を正 し く モデ リ ン グで き
ない こ と です。
こ の例の冒頭で、 テ ス ト ベンチか ら の同 じ 値を 4 回読み出 し て関数を検証 し ま し た。 こ れは、 RT レベルではデー タ
はア ッ プデー ト さ れ る が何 と か う ま く い く と い う 想定の下に実行 さ れま し たが、 それは間違いです。
こ の例は非現実的な も のではな く 、 C 関数をハー ド ウ ェ アに合成す る 場合に よ く 見 ら れます。 コ ー ド を記述 し て合成
し て も 、 意図 し た動作が得 ら れず、 RTL のデバ ッ グに時間を費やす結果にな る こ と が多々あ り ます。
注記 : C コ ー ド を合成す る 前に、 必ず C シ ミ ュ レーシ ョ ンで検証 し て く だ さ い。
こ の コ ーデ ィ ン グ ス タ イ ルの制限は、 コ ー ド を記述 し なおす こ と で克服で き ます。
次の例は、 テ ス ト ベンチか ら 4 つの異な る 値が読み出 さ れ る よ う にア ッ プデー ト し た コ ー ド です。 こ れは、 テ ス ト ベ
ンチで明示的に定義 さ れてい る 値にア ク セ ス す る よ う にす る こ と に よ り 達成 し てい ま す。 ポ イ ン タ ーのア ク セ ス は
シーケ ン シ ャ ルで ロ ケーシ ョ ン 0 か ら 開始す る ので、 合成では ス ト リ ー ミ ン グ イ ン タ ーフ ェ イ ス が使用 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
59
C の検証 と コ ーデ ィ ング ス タ イル
#include "foo.h"
void foo ( volatile int *d_o,
static int acc = 0;
int cnt;
volatile int *d_i) {
acc += *d_i;
acc += *(d_i+1);
*d_o = acc;
acc += *(d_i+2);
acc += *(d_i+3);
*(d_o+1) = acc;
}
関数が各 ト ラ ンザ ク シ ョ ンで 4 つの固有の値を読み出す こ と を モデ リ ン グす る よ う に、 テ ス ト ベンチがア ッ プデー ト
さ れます。
注記 : こ のテ ス ト ベンチは、 わか り やす く 短 く す る ため、1 つの ト ラ ンザ ク シ ョ ンのみを モデ リ ン グ し 、 セルフチ ェ ッ
ク コ ー ド は省かれてい ます。
#include "foo.h"
int main () {
int d_o[4], d_i[4];
int i;
for (i=0;i<4;i++) {
d_i[i]=i;
}
foo(d_o,d_i);
printf("Di Do\n");
for (i=0;i<4;i++) {
if (i<2)
printf("%d %d\n", d_i[i], d_o[i]);
else
printf("%d\n", d_i[i]);
}
return 0;
}
こ のテ ス ト ベンチに よ り 、 次の よ う な結果が得 ら れ ます。 1 つの ト ラ ンザ ク シ ョ ンか ら 2 つの出力が生成 さ れ、 1 つ
目の出力は最初の 2 つの入力読み出 し を加算 し た も の、 2 つ目の出力は次の 2 つの入力読み出 し と 最初の出力を加算
し た も のにな り ます。
Di Do
0 1
1 6
2
3
こ のデザ イ ン を 合成 し 、 ポ ー ト イ ン タ ー フ ェ イ ス の ポ ー ト d_i の 深 さ を 4、 ポ ー ト d_o の深 さ を 2 に設定 し て
cosim_design で RTL を検証で き ますが、
こ の ア ッ プデー ト さ れた例には制限が あ り ま す。 関数が呼び出 さ れ る たびに外部ア レ イ の位置 0 (テ ス ト ベン チの
d_i[0]) か ら デー タ の読み出 し が開始 し ます。 こ の関数では、 関数が呼び出 さ れた と き にすべてのデー タ が準備 さ れて
い る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
60
イ ン タ ー フ ェ イ スの管理
こ の例では、 ス ト リ ー ミ ン グ デー タ の記述 (ハー ド ウ ェ ア デザ イ ンのパフ ォーマ ン ス では必須な こ と がほ と ん ど) が
C を使用す る 場合は重要であ る こ と を示 し てい ます。 Vivado HLS に よ り 提供 さ れてい る hls::stream<> ク ラ ス を使用す
る と 、 ス ト リ ー ミ ン グ デー タ お よ びス ト リ ー ミ ン グ デー タ を使用する アプ リ ケーシ ョ ン を よ り 簡単に C で記述で き
る よ う に し ます。
hls::stream<> ク ラ スは、ハー ド ウ ェ ア デザ イ ン (ビデオお よ び通信) で使用 さ れ る 典型的な アルゴ リ ズ ム を記述す る の
に便利です。 こ れ ら については、 「ス ト リ ー ミ ン グ デー タ を使用 し た設計」 セ ク シ ョ ン を参照 し て く だ さ い。
イ ン タ ー フ ェ イ スの管理
C ベース デザ イ ン では、 すべての入力お よ び出力操作が、 0 時間で、 正式な関数引数に よ り 実行 さ れます。 RTL デザ
イ ンでは、 同 じ 入力お よ び出力操作をデザ イ ン イ ン タ ーフ ェ イ ス のポー ト で実行 し 、 特定の I/O (入出力) プ ロ ト コ ル
を使用 し て実行す る 必要があ り ます。
Vivado HLS では、 使用す る I/O プ ロ ト コ ルを指定する のに 2 つの方法がサポー ト さ れます。
•
イ ン タ ーフ ェ イ ス合成 : 効率的で安全な標準 イ ン タ ーフ ェ イ ス に基づいてポー ト イ ン タ ーフ ェ イ ス が作成 さ れ
ます。
•
手動 イ ン タ ーフ ェ イ ス指定 : イ ン タ ーフ ェ イ ス の動作を入力 ソ ース コ ー ド で明示的に指定 し ます。 こ れに よ り 、
任意の I/O プ ロ ト コ ルが使用で き る よ う にな り ます。
°
SystemC デザ イ ンでは、 I/O 制御信号が イ ン タ ーフ ェ イ ス宣言で指定 さ れ、 その動作が コ ー ド で指定 さ れ る
ので、 こ の方法を使用す る のが一般的です。
°
Vivado HLS では、 こ の イ ン タ ーフ ェ イ ス指定方法を C お よ び C++ デザ イ ン で も サポー ト し てい ます。 こ れ
については、 こ の章の後半で説明 し ます。
イ ン タ ー フ ェ イ ス合成
C プ ロ グ ラ ム を RTL デザ イ ンに合成す る と 、 C 引数は RTL デー タ ポー ト に合成 さ れます。 イ ン タ ーフ ェ イ ス合成で
は、 イ ン タ ーフ ェ イ ス プ ロ ト コ ルを RTL デー タ ポー ト に自動的に追加で き ます。 イ ン タ ーフ ェ イ ス プ ロ ト コ ルは、
出力の準備がで き た こ と を示す出力 Valid 信号な ど の単純な も のか ら 、 ブ ロ ッ ク RAM に対 し て読み出 し ま たは書 き
込みを実行す る ために必要なすべてのポー ト を含め る こ と がで き ます。
イ ン タ ーフ ェ イ ス合成で作成可能な イ ン タ ーフ ェ イ ス の タ イ プは、 C 引数に よ っ て異な り ます。 た と えば、 イ ン タ ー
フ ェ イ ス合成で出力 Valid 信号を作成す る 場合、 値渡 し ス カ ラ ーは入力に し かで き ないので、 C 引数はポ イ ン タ ーま
たは C++ 参照にす る 必要があ り ます。 図 1-36 に、 各 C 関数引数でサポー ト さ れ る イ ン タ ーフ ェ イ ス の タ イ プ を示 し
ます。
通常 SystemC デザ イ ンでは イ ン タ ーフ ェ イ ス合成はサポー ト さ れません。
SystemC デザ イ ンでは、 I/O プ ロ ト コ ル信号は イ ン タ ーフ ェ イ ス宣言で宣言 さ れ、 その動作が コ ー ド で完全に指定 さ
れます。
ただ し 、 「SystemC の イ ン タ ーフ ェ イ ス合成」 に説明する メ モ リ イ ン タ ーフ ェ イ ス では例外です。
ポー ト に イ ン タ ーフ ェ イ ス タ イ プ を指定 し ない場合、 デフ ォ ル ト の イ ン タ ーフ ェ イ ス で イ ンプ リ メ ン ト さ れます
(図 1-36)。 サポー ト さ れない イ ン タ ーフ ェ イ ス タ イ プ を指定 し た場合、 Vivado HLS で警告 メ ッ セージが表示 さ れ、 デ
フ ォ ル ト イ ン タ ーフ ェ イ ス タ イ プが使用 さ れます (図 1-36)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
61
イ ン タ ー フ ェ イ スの管理
X-Ref Target - Figure 1-36
図 1‐36 : デー タ 型 と イ ン タ ー フ ェ イ ス合成のサポー ト
図 1-36 の情報について、 説明 し ます。
1.
入力お よ び出力の概念は、 C 関数 と RTL ブ ロ ッ ク では若干異な り ます。 イ ン タ ーフ ェ イ ス合成を説明す る ため、
こ こ では次の規則が使用 さ れます。
•
RTL 入力ポー ト の よ う に、 読み出 し が実行 さ れ る が書き 込みは実行 さ れない関数引数は、 入力 (I) と 示 し ます。
•
RTL 入出力ポー ト の よ う に、 読み出 し と 書き 込みの両方が実行 さ れ る 関数引数は、 入出力 (I/O) と 示 し ます。
•
RTL 出力ポー ト の よ う に、 書 き 込みが実行 さ れ る が読み出 し は実行 さ れない関数引数は、 出力 (O) と 示 し ます。
2.
標準の値渡 し 引数は、 呼び出 し 関数に値を出力で き ません。 こ の よ う な引数の値は、 関数の return 文で返す (ま
たは関数か ら 出力す る ) こ と のみが可能です。
•
RTL 出力ポー ト の よ う に、 書 き 込みが実行 さ れ る が読み出 し は実行 さ れない値渡 し 関数引数は、 フ ァ ン ア ウ ト の
ない RTL 入力ポー ト に合成 さ れます。
•
RTL 入出力ポー ト の よ う に、 書 き 込み と 読み出 し の両方が実行 さ れ る 値渡 し 関数引数は、 RTL 入力ポー ト のみに
合成 さ れます。
3.
イ ン タ ーフ ェ イ ス タ イ プap_ovld は、 出力ポー ト のみに使用可能です。
4.
イ ン タ ーフ ェ イ ス タ イ プ ap_ctrl_none お よ び ap_ctrl_hs は、 関数レベルの イ ン タ ーフ ェ イ ス プ ロ ト コ ルの合成を
制御す る ために使用 し ます。 こ れ ら の イ ン タ ーフ ェ イ ス タ イ プは、 関数自体に指定 し ます。 ほかの イ ン タ ーフ ェ
イ ス タ イ プは、 関数引数に指定 し ます。
イ ン ターフ ェ イス タ イプ
イ ン タ ー フ ェ イ ス合成の制御
イ ン タ ーフ ェ イ ス合成は、 INTERFACE 指示子を使用する か、 コ ン フ ィ ギ ュ レーシ ョ ン設定を使用 し て制御 し ます。
コ ン フ ィ ギ ュ レーシ ョ ン設定を使用す る と 、 次を実行で き ます。
•
RTL デザ イ ンにグ ロ ーバル ク ロ ッ ク イ ネーブルを追加 し ます。
•
すべてのグ ロ ーバル変数に RTL ポー ト を作成 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
62
イ ン タ ー フ ェ イ スの管理
•
デザ イ ンで使用 さ れない struct のエ レ メ ン ト に よ っ て作成 さ れた よ う な、 絡ま っ たポー ト を削除 し ます。
コ ン フ ィ ギ ュ レ ーシ ョ ン を 設定す る には、 GUI で [Solution] → [Solution Settings] を ク リ ッ ク し 、 左側のボ ッ ク ス で
[General] を選択 し て [Add] を ク リ ッ ク し 、 [Command] ド ロ ッ プダ ウ ン リ ス ト か ら [config_interface] を選択 し ます
(図 1-37)。
X-Ref Target - Figure 1-37
図 1‐37 : コ ン フ ィ ギ ュ レーシ ョ ンの設定
[clock_enable] をオンにする と 、 RTL デザ イ ンにグ ロ ーバル ク ロ ッ ク イ ネーブル (CE) が追加 さ れます。 こ れに よ り 最
上位ポー ト に ap_ce ポー ト が追加 さ れます。 ap_ce が Low の場合、 デザ イ ン内のすべての レ ジ ス タ で ク ロ ッ ク がオ フ
にな り ます。
ど の C 関数で も グ ロ ーバル変数を使用で き ま す。 グ ロ ーバル変数は、 関数外で定義 さ れ ま す。 デフ ォ ル ト では、 グ
ロ ーバル変数に よ り RTL ポー ト は作成 さ れません。 Vivado HLS では、 グ ロ ーバル変数は最終デザ イ ン内にあ る と 想
定 さ れます。 [expose_global] をオンにする と 、 グ ロ ーバル変数が関数/デザ イ ン外に イ ンプ リ メ ン ト さ れ、 RTL ポー ト
が作成 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
63
イ ン タ ー フ ェ イ スの管理
グ ロ ーバル変数の合成に関す る 詳細は、 「任意精度デー タ 型」 セ ク シ ョ ンで説明 さ れてい ます。
ポー ト イ ン タ ー フ ェ イ スの指定
イ ン タ ーフ ェ イ ス タ イ プは、 個々のポー ト に設定で き ます。 GUI の [Directive] タ ブでポー ト を右 ク リ ッ ク し て [Insert
Directive] を ク リ ッ ク し て、 [Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス を開き ます (図 1-38)。
X-Ref Target - Figure 1-38
図 1‐38 : ポー ト イ ン タ ー フ ェ イ スの指定
イ ン タ ーフ ェ イ ス は Tcl コ マ ン ド フ ァ イ ルで も 指定で き ます。 次の例では、 図 1-38 と 同様に関数 foo の x ポー ト を
ap_hs に設定 し てい ます。
set_directive_interface -mode ap_hs fir x
サポー ト さ れていないポー ト イ ン タ ーフ ェ イ ス を選択 し た場合、 メ ッ セージが表示 さ れ、 図 1-36 に示すデフ ォ ル ト
のポー ト タ イ プが イ ンプ リ メ ン ト さ れます。
ポー ト オプ シ ョ ンの指定
INTERFACE 指示子には 2 つのオプシ ョ ンがあ り ます。 ポー ト に レ ジ ス タ を付け る か付けないか を指定する オプシ ョ
ン と 、 ポー ト か ら 読み出す値ま たはポー ト に書 き 込む値の数を指定す る オプシ ョ ンです。
デフ ォ ル ト では、 ポー ト に レ ジ ス タ は付け ら れません。 デー タ が必要な と き に入力ポー ト が読み出 さ れ、 レ ジ ス タ に
よ る エ リ アの増加が回避 さ れます。 レ ジ ス タ を付け る オプシ ョ ン を選択する と 、 操作の最初のサ イ ク ルの値渡 し 読み
出 し すべてに レ ジ ス タ が付け ら れます。 ポ イ ン タ ー読み出 し では読み出 し に レ ジ ス タ が付け ら れますが、 デー タ が必
要なサ イ ク ル よ り 1 サ イ ク ル早 く 読み出 し が実行 さ れます。 出力ポー ト では、 レ ジ ス タ を付け る オプシ ョ ン を選択す
る と 、 出力に必ずレ ジ ス タ が付 き ます。 メ モ リ 、 FIFO、 お よ びバ ス イ ン タ ーフ ェ イ ス では、 レ ジ ス タ オプシ ョ ン を
設定 し て も 変化はあ り ません。
1 つの ト ラ ンザ ク シ ョ ンでポ イ ン タ に対 し て読み出 し ま たは書き 込みが複数回実行 さ れ る 場合は、 [depth] オプシ ョ ン
を使用 し て読み出 し ま たは書 き 込みの値の最大数を指定す る 必要があ り ま す。 こ のオプシ ョ ン を正 し く 指定 し ない
と 、 cosim_design 機能を使用 し て RTL を検証 し た と き に検証エ ラ ーが発生する こ と があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
64
イ ン タ ー フ ェ イ スの管理
AXI4‐Master、 AXI4‐Slave、 および AXI4‐Lite イ ン タ ー フ ェ イ スの指定
Vivado HLS では 「 イ ン タ ーフ ェ イ ス合成」 セ ク シ ョ ンで説明 さ れ る 標準 イ ン タ ーフ ェ イ ス だけでな く 、バ ス イ ン タ ー
フ ェ イ ス を RTL デザ イ ンに追加す る こ と も で き ます。
AXI4-Master、 AXI4-Slave、 AXI4-Lite ポー ト と イ ン タ ーフ ェ イ ス合成 (ap_none、 ap_hs な ど) で作成 さ れた RTL ポー ト
の主な違いは、 バ ス イ ン タ ーフ ェ イ ス が [Export RTL] プ ロ セ ス中にデザ イ ン に追加 さ れ る 点です。 RTL エ ク ス ポー
ト プ ロ セ ス の詳細は、 「RTL デザ イ ンのエ ク ス ポー ト 」 セ ク シ ョ ン を参照 し て く だ さ い。
バ ス イ ン タ ーフ ェ イ ス には、 次の よ う に処理 さ れます。
•
バ ス イ ン タ ーフ ェ イ ス は合成レ ポー ト にはレ ポー ト さ れません。
•
バ ス イ ン タ ーフ ェ イ ス は、 合成後に記述 さ れた RTL には含まれません。
次のバ ス イ ン タ ーフ ェ イ ス を使用で き ます。
•
AXI4-Lite Slave
•
AXI4 Master
図 1-39 は、 Vivado HLS で作成 さ れ る RTL イ ン タ ーフ ェ イ ス ポー ト と それ ら に接続で き る バ ス イ ン タ ーフ ェ イ ス を
リ ス ト し てい ます。
X-Ref Target - Figure 1-39
図 1‐39 : バス イ ン タ ー フ ェ イ ス
た と えば、 RTL ポー ト プ ロ ト コ ルの タ イ プが ap_fifo の場合、 こ れは AXI4-Stream に接続で き ますが、 RTL ポー ト
の タ イ プが ap_ovld ま たは ap_memory の場合は、 ど のバ ス イ ン タ ーフ ェ イ ス に も 接続で き ません。
•
ap_memory イ ン タ ーフ ェ イ ス には、 イ ン タ ーフ ェ イ ス は必要な く 、直接 EDK の メ モ リ (ブ ロ ッ ク RAM) に接続で
き ます。
•
ap_ovld イ ン タ ーフ ェ イ ス を使用 し たポー ト はすべてサポー ト さ れ る タ イ プの 1 つ (た と えば、 ap_hs) に変更 さ れ
る か、 イ ン タ ーフ ェ イ ス には接続で き ないかにな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
65
イ ン タ ー フ ェ イ スの管理
バス イ ン タ ー フ ェ イ スの追加
バ ス イ ン タ ーフ ェ イ ス を既存の RTL イ ン タ ーフ ェ イ ス に追加す る には、 RESOURCE 指示子を使用 し て ポー ト に リ
ソ ー ス を指定 し ま す(同 じ プ ロ セ ス お よ び指示子で ど の メ モ リ リ ソ ース タ イ プ を ア レ イ ポー ト に接続す る か を指定
で き ます)。
RESOURCE 指示子は コ ア を指定 し ない と 使用で き ません。 表 1-5 は、 AXI4 イ ン タ ーフ ェ イ ス コ ア をすべて リ ス ト し
てい ます。
表 1‐5 : バス イ ン タ ー フ ェ イ ス
バス イ ン タ ー フ ェ イ ス
コア
説明
AXI4-Lite ス レーブ
AXI4LiteS
AXI4 ス レーブの イ ン タ ーフ ェ イ ス
AXI4 マ ス タ ー
AXI4M
AXI4 マ ス タ ーの イ ン タ ーフ ェ イ ス
バ ス イ ン タ ーフ ェ イ ス を作成す る プ ロ セ ス は、 次の 2 つの手順で成 り 立っ てい ます。
•
RTL イ ン タ ーフ ェ イ ス の作成
•
バ ス イ ン タ ーフ ェ イ ス リ ソ ース の指定
次は、 ポー ト の出力 (out) を AXI4 Master バ ス イ ン タ ーフ ェ イ スへ接続する 方法を示 し てい ます。
バ ス イ ン タ ーフ ェ イ ス を作成す る には、まず必要なバ ス イ ン タ ーフ ェ イ ス をサポー ト する RTL ポー ト を作成 し ます。
AXI4 Master バ ス イ ン タ ーフ ェ イ ス が必要なので、 表 1-5 に示す よ う に、 RTL ポー ト は ap_bus プ ロ ト コ ルを使用 し
て イ ンプ リ メ ン ト す る 必要があ り ます。
図 1-40 では、 関数引数の out が選択 さ れ、 指示子が右 ク リ ッ ク で適用 さ れてい ます。 ド ロ ッ プダ ウ ン メ ニ ュ ーか ら
[INTERFACE] を選択 し 、 イ ン タ ーフ ェ イ ス モー ド は ap_bus と 指定 し ます。
X-Ref Target - Figure 1-40
図 1‐40 : [Vivado HLS Directive Editor] ダ イ ア ログ ボ ッ ク ス
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
66
イ ン タ ー フ ェ イ スの管理
バス イ ン タ ー フ ェ イ スの選択
AXI4 Master バ ス イ ン タ ーフ ェ イ ス (た と えば、 AXI4 Master バス イ ン タ ーフ ェ イ ス) を指定する には、 図 1-41 の よ う
に RESOURCE 指示子を使用 し て、 AXI4M リ ソ ース を ポー ト /引数 out へ追加 し ます。
RESOURCE 指示子に関連す る オプ シ ョ ン を 使用す る と 、 特定のバ ス イ ン タ ー フ ェ イ ス に複数ポー ト を 含め た り 、
AXI4 イ ン タ ーフ ェ イ ス のサ イ ド チ ャ ネルを使用 し た り で き ます。
X-Ref Target - Figure 1-41
図 1‐41 : バス イ ン タ ー フ ェ イ スの リ ソ ース指示子
SystemC バス イ ン タ ー フ ェ イ ス
SystemC デザ イ ン にはバ ス イ ン タ ーフ ェ イ ス を追加で き ます。 こ れを実行す る プ ロ セ ス は、 C ま たは C++ デザ イ ン
への イ ン タ ーフ ェ イ ス を追加す る プ ロ セ ス と は少 し 異な り ま す。 バ ス イ ン タ ーフ ェ イ ス を SystemC デザ イ ン に追加
す る 例は、 次に各 AXI4 イ ン タ ーフ ェ イ ス別 (Lite、 Stream、 Master) に示 し ます。
ま た、 AXI4 バ ス イ ン タ ーフ ェ イ ス の SystemC デザ イ ンへ追加す る 際は、 指示子の追加方法 も C ま たは C++ デザ イ
ン と 異な り ます。
指示子をプ ラ グマ と し て ソ ース コ ー ド に追加する 場合、 指示子は SC_MODULE と 呼ばれ る 関数の中に追加す る 必要
があ り ます。 プ ラ グマ指示子は、 ポー ト が指定 さ れた SC_MODULE 宣言内には追加で き ません。 こ の例を次に示 し
ます。
GUI を使用 し て指示子を追加す る 場合 :
•
[Project] → [Project Settings] を ク リ ッ ク し 、 [Parse All Header Files] を オンに し ます。
•
C ソ ース コ ー ド と [Directives] タ ブを開 き ます。 関数 と その関数への指示子を選択 し ます。
•
ま たは、 C ソ ース コ ー ド か ら 、 Ctrl キーを押 し なが ら SystemC ヘ ッ ダー フ ァ イ ルを選択 し ます。 ポー ト が
[Directives] タ ブに表示 さ れ る よ う にな り ます。
AXI4‐Lite ス レーブ イ ン タ ー フ ェ イ ス
AXI4 の ス レーブ イ ン タ ーフ ェ イ ス は、デザ イ ン を CPU やマ イ ク ロ プ ロ セ ッ サーな ど の フ ォーム で制御で き る よ う に
す る ために使用 さ れ、
•
複数の RTL ポー ト を同 じ バ ス イ ン タ ーフ ェ イ ス に ま と め る こ と がで き ます。
•
デザ イ ンが IP カ タ ロ グ ま たは EDK 環境用の PCore と し てエ ク ス ポー ト さ れ る と 、 出力には C 関数 と ヘ ッ ダー
フ ァ イ ルが含ま れ、 プ ロ セ ッ サで実行 さ れ る コ ー ド で使用 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
67
イ ン タ ー フ ェ イ スの管理
次の例は、複数の RTL ポー ト が共通の AXI4 ス レーブ イ ン タ ーフ ェ イ ス に ま と め ら る と こ ろ を示 し てい ます。 複数の
RTL ポー ト が 1 つのバ ス イ ン タ ーフ ェ イ ス を介 し て ア ク セ ス さ れ る よ う にな り ます。 コ ー ド 例の後には、作成 さ れた
C フ ァ イ ルを確認 し ます。
int foo_top (int *a, int *b, int *c, int *d) {
// Define the RTL interfaces
#pragma HLS interface ap_hs port=a
#pragma HLS interface ap_none port=b
#pragma HLS interface ap_vld port=c
#pragma HLS interface ap_ack port=d
#pragma HLS interface ap_ctrl_chain port=return register
// Define the pcore interfaces and group into AXI4 slave “slv0”
#pragma HLS resource core=AXI4LiteS metadata="-bus_bundle slv0" variable=a
#pragma HLS resource core=AXI4LiteS metadata="-bus_bundle slv0" variable=b
// Define the pcore interfaces and group into AXI4 slave “slv1”
#pragma HLS resource core=AXI4LiteS metadata="-bus_bundle slv1" variable=return
#pragma HLS resource core=AXI4LiteS metadata="-bus_bundle slv1" variable=c
#pragma HLS resource core=AXI4LiteS metadata="-bus_bundle slv1" variable=d
*a += *b;
return (*c + *d);
}
上記の例でポー ト a お よ び b は共通の AXI4-Lite ス レーブ イ ン タ ーフ ェ イ ス に ま と め ら れてい ます (図 1-42)。
ブ ロ ッ ク レベルの I/O プ ロ ト コ ルは、 ap_ctrl_hs イ ン タ ーフ ェ イ ス モー ド を return 関数に適用す る と 設定 さ れ
ます。 こ れは、 デフ ォ ル ト ですが、 こ の例では明示的に指定 し てい ます。 return ポー ト にポー ト c と d を ま と め る
こ と で、 すべてのブ ロ ッ ク レベルの I/O プ ロ ト コ ル信号 (ap_start、 ap_done) が AXI4-Lite ス レーブ イ ン タ ー
フ ェ イ ス の slv1 に割 り 当て ら れます。
RESOURCE 指示子が GUI を使用 し て適用 さ れ る 場合は、そのグループ を作成す る ために使用 さ れたバ ス バン ド ル ス
ト リ ン グ全体 (例 : "-bus_bundle slv1") を metadata オプシ ョ ン ボ ッ ク ス に入力する 必要があ り ます。 slv1 の よ う に同 じ
bus_bundle 名を使用 し 、 各 RTL ポー ト が ま と め ら れ る よ う に し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
68
イ ン タ ー フ ェ イ スの管理
X-Ref Target - Figure 1-42
図 1‐42 : RTL ポー ト がま と め られた AXI4 Lite ス レーブ イ ン タ ー フ ェ イ ス
デザ イ ンがエ ク ス ポー ト さ れ る と 、 RTL デザ イ ンに加えて次の C フ ァ イ ルが出力 さ れます。 「RTL デザ イ ンのエ ク ス
ポー ト 」 セ ク シ ョ ン を参照 し て く だ さ い (表示 さ れ る フ ァ イ ルお よ びフ ァ イ ル名は こ の例用です)。
•
xfoo_top_hw.h
•
xfoo_top_linux.c
•
xfoo_top_sinit.c
•
xfoo_top.h
•
xfoo_top.c
xfoo_top_hw.h フ ァ イ ルには、 slv0 お よ び slv1 イ ン タ ーフ ェ イ ス に ま と め ら れた RTL ポー ト の メ モ リ マ ッ プ ロ ケー
シ ョ ンが含まれます。 こ の フ ァ イ ルの コ メ ン ト には、RTL ポー ト デー タ と 制御信号がど の よ う に AXI4 バ ス イ ン タ ー
フ ェ イ ス にマ ッ プ さ れたかが示 さ れてい ます。 アダプ タ ー slv0 の場合 :
•
ポー ト a は読み出 し /書 き 込み信号なので、 別々の入力お よ び出力ポー ト と し て イ ンプ リ メ ン ト さ れます。
•
ポー ト a には、 Valid 信号 と ACK (acknowledge) 信号が接続 さ れます。
•
ポー ト b は ap_none タ イ プで、 接続 さ れ る 制御信号はあ り ません。
//
//
//
//
//
//
//
//
//
//
//
//
//
0x00
0x04
0x08
0x0c
0x10
: reserved
: reserved
: reserved
: reserved
:Control signal of a_i
bit 0 - a_i_ap_vld (Read/Write/COH)
bit 1 - a_i_ap_ack (Read)
others - reserved
0x14 :Data signal of a_i
bit 31~0 - a_i[31:0] (Read/Write)
0x18 :Control signal of a_o
bit 0 - a_o_ap_vld (Read)
bit 1 - a_o_ap_ack (Read/Write/COH)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
69
イ ン タ ー フ ェ イ スの管理
//
others - reserved
// 0x1c :Data signal of a_o
//
bit 31~0 - a_o[31:0] (Read)
// 0x20 : reserved
// 0x24 :Data signal of b
//
bit 31~0 - b[31:0] (Read/Write)
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on
Handshake)
#define
#define
#define
#define
#define
#define
#define
#define
XFOO_TOP_SLV0_ADDR_A_I_CTRL
XFOO_TOP_SLV0_ADDR_A_I_DATA
XFOO_TOP_SLV0_BITS_A_I_DATA
XFOO_TOP_SLV0_ADDR_A_O_CTRL
XFOO_TOP_SLV0_ADDR_A_O_DATA
XFOO_TOP_SLV0_BITS_A_O_DATA
XFOO_TOP_SLV0_ADDR_B_DATA
XFOO_TOP_SLV0_BITS_B_DATA
0x10
0x14
32
0x18
0x1c
32
0x24
32
xfoo_top_hw.h に も slv1 イ ン タ ーフ ェ イ ス用に同 じ よ う な情報が含ま れ ます。 slv1 イ ン タ ーフ ェ イ ス にはブ ロ ッ ク レ
ベルの IO プ ロ ト コ ル信号 (return 関数に関連) が含ま れ る ので、 ブ ロ ッ ク 割 り 込みの設定お よ び制御の機能 も 含ま れ
ます。
ブ ロ ッ ク 開始のサポー ト だけでな く 、 ブ ロ ッ ク 制御レ ジ ス タ で も auto-start の繰 り 返 し がサポー ト さ れ ます。 ap_start
信号の制御レ ジ ス タ を ロ ジ ッ ク 1 に設定す る と 、 1 ト ラ ンザ ク シ ョ ン間ブ ロ ッ ク を実行 さ せ る こ と はで き ますが、 次
の ト ラ ンザ ク シ ョ ン を開始 さ せ る には、 ap_ready が High にな っ た後、 ロ ジ ッ ク 1 に再び設定する 必要があ り ます。 ま
た、 削除 さ れ る ま で ap_start 信号が logic 1 に設定 さ れ る よ う に auto_restart レ ジ ス タ を設定で き ます。
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
0x00 :Control signals
bit 0 - ap_start (Read/Write/COH)
bit 1 - ap_done (Read/COR)
bit 2 - ap_idle (Read)
bit 3 - ap_ready (Read)
bit 7 - auto_restart (Read/Write)
others - reserved
0x04 :Global Interrupt Enable Register
bit 0 - Global Interrupt Enable (Read/Write)
others - reserved
0x08 :IP Interrupt Enable Register (Read/Write)
bit 0 - Channel 0 (ap_done)
bit 1 - Channel 1 (ap_ready)
others - reserved
0x0c :IP Interrupt Status Register (Read/TOW)
bit 0 - Channel 0 (ap_done)
bit 1 - Channel 1 (ap_ready)
others - reserved
0x10 :Control signal of c
bit 0 - c_ap_vld (Read/Write/SC)
others - reserved
0x14 :Data signal of c
bit 31~0 - c[31:0] (Read/Write)
0x18 :Control signal of d
bit 1 - d_ap_ack (Read/COR)
others - reserved
0x1c :Data signal of d
bit 31~0 - d[31:0] (Read/Write)
0x20 :Data signal of ap_return
bit 31~0 - ap_return[31:0] (Read)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
70
イ ン タ ー フ ェ イ スの管理
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on
Handshake)
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
XFOO_TOP_SLV1_ADDR_AP_CTRL
XFOO_TOP_SLV1_ADDR_GIE
XFOO_TOP_SLV1_ADDR_IER
XFOO_TOP_SLV1_ADDR_ISR
XFOO_TOP_SLV1_ADDR_C_CTRL
XFOO_TOP_SLV1_ADDR_C_DATA
XFOO_TOP_SLV1_BITS_C_DATA
XFOO_TOP_SLV1_ADDR_D_CTRL
XFOO_TOP_SLV1_ADDR_D_DATA
XFOO_TOP_SLV1_BITS_D_DATA
XFOO_TOP_SLV1_ADDR_AP_RETURN
XFOO_TOP_SLV1_BITS_AP_RETURN
0x00
0x04
0x08
0x0c
0x10
0x14
32
0x18
0x1c
32
0x20
32
xfoo_top_hw.h フ ァ イ ルの各レ ジ ス タ /ア ド レ ス には、 それにア ク セ スする ために関連する C 関数が含まれます。 こ れ
ら の関数に よ り 、 残 り の C ド ラ イ バー フ ァ イ ル (xfoo_top.c、 xfoo_sinit.c、 xfoo_linux.c、 xfoo_top.h.)
が提供 さ れます。
こ れ ら の フ ァ イ ルは、 ス タ ン ド ア ロ ン環境 と Linux 環境の両方を サポー ト す る ために提供 さ れてい ま す。 ヘ ッ ダー
フ ァ イ ルでは Linux 環境の場合それが検出 さ れ、 すべての フ ァ イ ルが ソ フ ト ウ ェ ア プ ロ ジ ェ ク ト に追加 さ れ、 正 し い
関数が使用 さ れ る よ う にな り ます。
次を参照 し て く だ さ い。
•
ス タ ン ド ア ロ ン シ ス テ ムの場合、 xfoo_top.c、 xfoo_sinit.c、 お よ び xfoo_top.h フ ァ イ ルが使用 さ れま
す。
•
Linux OS の場合、 xfoo_top.c、 xfoo_linux.c、 お よ び xfoo_top.h フ ァ イ ルが使用 さ れます。
ど ち ら の場合 も 関数は、 次に示すヘ ッ ダー フ ァ イ ルの xfoo_top.h で定義 さ れます。
int XFoo_top_Initialize(XFoo_top *InstancePtr, XFoo_top_Config *ConfigPtr);
void XFoo_top_Start(XFoo_top *InstancePtr);
u32 XFoo_top_IsDone(XFoo_top *InstancePtr);
u32 XFoo_top_IsIdle(XFoo_top *InstancePtr);
u32 XFoo_top_IsReady(XFoo_top *InstancePtr);
void XFoo_top_Continue(XFoo_top *InstancePtr);
u32 XFoo_top_GetReturn(XFoo_top *InstancePtr);
void XFoo_top_EnableAutoRestart(XFoo_top *InstancePtr);
void XFoo_top_DisableAutoRestart(XFoo_top *InstancePtr);
void XFoo_top_SetC(XFoo_top *InstancePtr, u32 Data);
u32 XFoo_top_GetC(XFoo_top *InstancePtr);
void XFoo_top_SetCVld(XFoo_top *InstancePtr);
u32 XFoo_top_GetCVld(XFoo_top *InstancePtr);
void XFoo_top_SetD(XFoo_top *InstancePtr, u32 Data);
u32 XFoo_top_GetD(XFoo_top *InstancePtr);
u32 XFoo_top_GetDAck(XFoo_top *InstancePtr);
void XFoo_top_SetA_i(XFoo_top *InstancePtr, u32 Data);
u32 XFoo_top_GetA_i(XFoo_top *InstancePtr);
void XFoo_top_SetA_iVld(XFoo_top *InstancePtr);
u32 XFoo_top_GetA_iVld(XFoo_top *InstancePtr);
u32 XFoo_top_GetA_iAck(XFoo_top *InstancePtr);
u32 XFoo_top_GetA_o(XFoo_top *InstancePtr);
u32 XFoo_top_GetA_oVld(XFoo_top *InstancePtr);
void XFoo_top_SetA_oAck(XFoo_top *InstancePtr);
u32 XFoo_top_GetA_oAck(XFoo_top *InstancePtr);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
71
イ ン タ ー フ ェ イ スの管理
void XFoo_top_SetB(XFoo_top *InstancePtr, u32 Data);
u32 XFoo_top_GetB(XFoo_top *InstancePtr);
void XFoo_top_InterruptGlobalEnable(XFoo_top *InstancePtr);
void XFoo_top_InterruptGlobalDisable(XFoo_top *InstancePtr);
void XFoo_top_InterruptEnable(XFoo_top *InstancePtr, u32 Mask);
void XFoo_top_InterruptDisable(XFoo_top *InstancePtr, u32 Mask);
void XFoo_top_InterruptClear(XFoo_top *InstancePtr, u32 Mask);
u32 XFoo_top_InterruptGetEnabled(XFoo_top *InstancePtr);
u32 XFoo_top_InterruptGetStatus(XFoo_top *InstancePtr);
こ れ ら の関数名はデザ イ ン名お よ びデザ イ ンのポー ト タ イ プに よ っ て異な り ます。
た と えば、 ブ ロ ッ ク は まずプ ロ グ ラ ム スペース に イ ン ス タ ン シエーシ ョ ン さ れます。 次に割 り 込みが設定 さ れます。
ブ ロ ッ ク が開始 さ れ る と 、 ポー ト 値がア ク セ ス さ れ、 最後に結果が読み出 さ れます。
まず、 こ の関数を使用 し てプ ロ グ ラ ム スペース に XFoo_Top の イ ン ス タ ン ス を イ ン ス タ ン シエー ト し ます。
int XFoo_top_Initialize(XFoo_top *InstancePtr, XFoo_top_Config *ConfigPtr);
割 り 込みが使用 さ れ る 場合は、 まずそれ ら をプ ロ セ ッ サで イ ネーブルにする 必要があ り ます。 こ の タ ス ク の実行方法
については、 プ ロ セ ッ サの資料を参照 し て く だ さ い。 割 り 込みがプ ロ セ ッ サで イ ネーブルにな っ ていない と 、 こ こ で
示す割 り 込み関数は動作 し ません。
後に示す よ う に、 割 り 込みサービ ス ルーチン を使用す る のではな く 、 デバ イ ス を ポー リ ン グする こ と も 可能です。 た
だ し 、 次の関数では、 割 り 込みサービ ス ルーチン を使用 し てい ます。 AXI-Lite ス レーブ イ ン タ ーフ ェ イ ス をサポー
ト す る 割 り 込みには、 次の 2 つがあ り ます。
•
1 つ目は、 ap_done 信号の ス テー タ ス で、 ロ ケーシ ョ ン 1 で使用で き ます。
•
2 つ目は、 タ ス ク レベルの割 り 込みで、 ロ ケーシ ョ ン 2 で使用で き ます。 タ ス ク レベルの割 り 込みでは、 新規 タ
ス ク がいつ開始で き る かが示 さ れ、 ポー ト の動作がパ イ プ ラ イ ン 処理で き る よ う に さ れ ま す。 新規 タ ス ク は
ap_done 信号/割 り 込みが最初の タ ス ク の終了を示す よ り も 前に開始で き ます。
こ れ ら の関数を こ の順序で使用す る と 、 次の割 り 込みサービ ス タ ス ク が C コ ー ド で実行で き る よ う にな り ます。
•
すべての割 り 込み ソ ース の ス テー タ ス を戻す
•
ど の割 り 込みが イ ネーブルか を表示
•
ク リ ア さ れ る 個々の割 り 込みを許容
u32 XFoo_top_InterruptGetEnabled(XFoo_top *InstancePtr);
u32 XFoo_top_InterruptGetStatus(XFoo_top *InstancePtr);
void XFoo_top_InterruptClear(XFoo_top *InstancePtr, u32 Mask);
次の タ ス ク は、 割 り 込みを イ ネーブルに し ます。 グ ロ ーバル割 り 込み関数を使用す る と 、 ハー ド ウ ェ ア ブ ロ ッ ク か ら
のすべての割 り 込みが イ ネーブルにな り ます。
void XFoo_top_InterruptGlobalEnable(XFoo_top *InstancePtr);
個々の割 り 込みは、 次の関数を使用す る と イ ネーブルにで き ま す。 マ ス ク 値 1 で ap_done 信号か ら の割 り 込みが、
マ ス ク 値 2 で タ ス ク レベルの割 り 込みが イ ネーブルにな り 、マ ス ク 値 3 で ど ち ら の タ イ プの割 り 込み も イ ネーブルに
な り ます。
void XFoo_top_InterruptEnable(XFoo_top *InstancePtr, u32 Mask);
こ の段階では、 ブ ロ ッ ク の開始前に、 入力ハン ド シ ェ イ ク を使用 し ないポー ト すべて (例 : ap_none ま たは ap_ack) が
コ ン フ ィ ギ ュ レーシ ョ ン さ れてい る 必要があ り ます ( コ ン フ ィ ギ ュ レーシ ョ ン さ れていない と 、 ブ ロ ッ ク の開始直後
に イ ン タ ーフ ェ イ ス レ ジ ス タ にデフ ォ ル ト 値が読み込まれます)。 こ の例では、 ポー ト b お よ び d に こ の よ う なプ ロ
ト コ ルが含まれます。 こ れ ら のポー ト に値を設定す る には、 次の関数を使用 し ます。
void XFoo_top_SetB(XFoo_top *InstancePtr, u32 Data);
void XFoo_top_SetD(XFoo_top *InstancePtr, u32 Data);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
72
イ ン タ ー フ ェ イ スの管理
必須ではあ り ませんが、 次の関数を使用す る と 、 ポー ト b お よ び d か ら デー タ を読み戻 し 、 正 し い値が書 き 込まれた
ど う か を検証で き ます。
u32 XFoo_top_GetB(XFoo_top *InstancePtr);
u32 XFoo_top_GetD(XFoo_top *InstancePtr);
ブ ロ ッ ク は開始関数を呼び出す と 開始で き ます (まずア イ ド リ ン グ信号の ス テー タ ス を確認 し 、 最後のプ ロ セ ス が本
当に終了 し たか ど う か を確認す る こ と をお勧め し ます)。
u32 XFoo_top_IsIdle(XFoo_top *InstancePtr);
void XFoo_top_Start(XFoo_top *InstancePtr);
ハン ド シ ェ イ ク を使用す る 入力ポー ト には、 ブ ロ ッ ク の開始前ま たは開始後に値を設定で き ます。 ブ ロ ッ ク が既に開
始 さ れたのに入力に有効な値がない場合、 有効なデー タ が入っ て く る ま でブ ロ ッ ク は停止 し ます。
こ れ ら の書 き 込みはハー ド ウ ェ ア プ ロ ト コ ル (デー タ 値を書 き 込んでか ら 有効ビ ッ ト を設定 し てデー タ が有効か ど う
か を指定) と 同 じ よ う に実行す る 必要があ り ます。 デー タ がブ ロ ッ ク で読み出 さ れ る と 、 ア ダプ タ ーの有効ビ ッ ト が
ク リ ア さ れます。
こ の例の場合、 ポー ト a (入力側) と c はブ ロ ッ ク の開始後に設定 さ れてい ます。 こ れ ら の値を設定す る には、 次の関
数を使用 し ます。
void XFoo_top_SetA_i(XFoo_top *InstancePtr, u32 Data);
void XFoo_top_SetA_iVld(XFoo_top *InstancePtr);
void XFoo_top_SetC(XFoo_top *InstancePtr, u32 Data);
void XFoo_top_SetCVld(XFoo_top *InstancePtr);
ポー ト a お よ び c の値は、 ポー ト b お よ び d と 同 じ よ う に、 次の関数を使用 し て読み戻す と 、 値が正 し いか ど う か を
確認で き ます。
u32 XFoo_top_GetA_i(XFoo_top *InstancePtr);
u32 XFoo_top_GetC(XFoo_top *InstancePtr);
ま た、 有効フ ラ グの ス テー タ ス を読み出す こ と がで き ます。 ブ ロ ッ ク が既に開始 さ れてい る 場合は、 有効フ ラ ッ グは
デー タ がハー ド ウ ェ アで読み出 さ れ る と すぐ に ク リ ア さ れます。
u32 XFoo_top_GetA_iVld(XFoo_top *InstancePtr);
u32 XFoo_top_GetCVld(XFoo_top *InstancePtr);
こ の例では、 ポー ト b お よ び d にその I/O プ ロ ト コ ルに関連する 出力 ACK (acknowledge) 信号が含まれます。 こ の出
力 ACK 信号の ス テー タ ス も 読み出す こ と がで き ます。 こ れが High の場合、 読み出 し デー タ はハー ド ウ ェ アで認識 さ
れてい ます。
次の関数は、 ACK ポー ト の ス テー タ ス を取得す る ために使用で き 、 こ れ ら の レ ジ ス タ が関数呼び出 し に よ っ て読み
込まれ る と 、 す ぐ に レ ジ ス タ ビ ッ ト が ク リ ア さ れ、 ハー ド ウ ェ アでのみ設定で き る よ う にな り ます。
u32 XFoo_top_GetA_iAck(XFoo_top *InstancePtr);
u32 XFoo_top_GetDAck(XFoo_top *InstancePtr);
こ の例では、 ブ ロ ッ ク がポー ト a (出力側) で実行 さ れてい る 間は、 リ タ ーン ポー ト (ap_return) だけがデー タ を戻す
ポー ト にな り ます。 次の関数では、 ポー ト a に有効な出力デー タ があ る か ど う か をチ ェ ッ ク で き ます。
u32 XFoo_top_GetA_oVld(XFoo_top *InstancePtr);
有効なデー タ が出力ポー ト にあ る と 、 それが読み出 さ れます。
u32 XFoo_top_GetA_o(XFoo_top *InstancePtr);
問題な く 読み出 し さ れれば、 次の関数を使用 し て読み出 し を認識 (acknowledge) さ せ る こ と がで き ます。 ハー ド ウ ェ
アは書 き 込み出力が認識 さ れ る ま で停止 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
73
イ ン タ ー フ ェ イ スの管理
void XFoo_top_SetA_oAck(XFoo_top *InstancePtr);
ハー ド ウ ェ アが AXI4-Lite Slave イ ン タ ーフ ェ イ ス の ACK (acknowledge) レ ジ ス タ を読み出す と 、 その ACK レ ジ ス タ
は ク リ ア さ れます。 こ れは、 次の関数を使用す る と 確認で き ます。
u32 XFoo_top_GetA_oAck(XFoo_top *InstancePtr);
最後に、 その他すべてのポー ト が使用 さ れれば、 関数か ら の戻 り 値を読み出す こ と がで き ます。 割 り 込みが使用 さ れ
ない場合は、 終了 し たか ど う か をチ ェ ッ ク す る ためにデバ イ ス を ポー リ ン グで き ます。
u32 XFoo_top_IsDone(XFoo_top *InstancePtr);
ap_done 信号を ポー リ ン グす る に し て も 、 割 り 込みサービ ス ルーチン を使用する に し て も 、 次の関数を使用す る と 戻
り 値を読み出す こ と がで き ます。
u32 XFoo_top_GetReturn(XFoo_top *InstancePtr);
最後に、 割 り 込みが使用 さ れ る 場合は、 ブ ロ ッ ク の割 り 込みを個別ま たはグ ロ ーバルにデ ィ ス エーブルにで き ます。
void XFoo_top_InterruptDisable(XFoo_top *InstancePtr, u32 Mask);
void XFoo_top_InterruptGlobalDisable(XFoo_top *InstancePtr);
注記 : ap_ctrl_chain イ ン タ ーフ ェ イ ス プ ロ ト コ ルが こ の例の よ う に関数 と し て使用 さ れ る と 、 ap_continue 信
号が High にアサー ト さ れ る 場合、 割 り 込みを駆動す る ap_done 信号がア ク テ ィ ブな ま ま にな り ます。 こ の場合、 割
り 込みをデ ィ ス エーブルにす る には、 XFoo_top_Continue 関数を使用 し て ap_continue を アサー ト す る 必要が
あ り ます。
メ モ リ イ ン ターフ ェ イス
メ モ リ イ ン タ ーフ ェ イ ス は、 次の方法で AXI4-Lite Slave イ ン タ ーフ ェ イ ス に含め る こ と がで き ます
•
RESOUCE 指示子を使用 し て メ モ リ コ ア を指定
•
同 じ グループ名 (-bus_bundle オプシ ョ ン) を AXI4-Lite Slave イ ン タ ーフ ェ イ ス と し て使用
AXI4-Lite Slave イ ン タ ーフ ェ イ ス にグループ化 さ れ る 残 り のポー ト と 違い、 ア レ イ 引数は AXI4 コ ア を タ ーゲ ッ ト に
し ない よ う に し て く だ さ い。 ア レ イ は、 メ モ リ コ ア を明確に タ ーゲ ッ ト に指定する 必要があ り (デフ ォ ル ト を メ モ リ
コ アにはで き ないので)、こ の メ モ リ コ ア を AXI4-Lite Slave イ ン タ ーフ ェ イ ス にグループ化する には -bus_bundle オプ
シ ョ ン を使用 し ます。
こ の例の場合、 ブ ロ ッ ク 制御信号は メ モ リ ポー ト coeff と 同 じ AXI4-Lite Slave イ ン タ ーフ ェ イ ス にグループ分け さ れ
てい ます。
void fir (
data_t *y,
data_t x,
coeff_t coeff[N+1]
) {
// The following are the default interfaces for these ports: added here to be
explicit
#pragma HLS interface ap_ctrl_hs port=return
#pragma HLS interface ap_mem port=coeff
//
// Define the AXI4 interfaces and group into AXI4 slave COEFF_CONTROL
#pragma HLS RESOURCE core=AXI4LiteS metadata="-bus_bundle COEFF_CONTROL"
variable=return
#pragma HLS RESOURCE core=RAM_1P metadata="-bus_bundle COEFF_CONTROL" variable=c
...
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
74
イ ン タ ー フ ェ イ スの管理
}
メ モ リ ポー ト が AXI4 Lite Slave イ ン タ ーフ ェ イ ス に追加 さ れ る と 、次の C 関数が追加で提供 さ れます。 こ の場合、関
数は fir を呼び出すので、 xfir.c フ ァ イ ルには CPU か ら メ モ リ イ ン タ ーフ ェ イ ス を管理す る ために、 次の関数が含ま
れ る よ う にな り ます。
u32
u32
u32
u32
u32
XFir_GetCBaseAddress(XFir *InstancePtr);
XFir_GetCHighAddress(XFir *InstancePtr);
XFir_GetCTotalBytes(XFir *InstancePtr);
XFir_GetCBitWidth(XFir *InstancePtr);
XFir_GetCDepth(XFir *InstancePtr);
SystemC AXI4‐Lite Slave イ ン タ ー フ ェ イ ス
AXI4-Lite Slave イ ン タ ーフ ェ イ ス は、 sc_in ま たは sc_out 型の SystemC ポー ト に追加で き ます。
AXI4-Lite イ ン タ ーフ ェ イ ス を SystemC デザ イ ン に適用す る には、 指定 し た AXI4-Lite リ ソ ース にポー ト を割 り 当て
る の と 同 じ 方法を使用で き ますが、 SystemC デザ イ ンの場合は、 前述の 「SystemC バ ス イ ン タ ーフ ェ イ ス」 で説明 し
た よ う に、 デザ イ ン への指示子の適用方法に違いが あ り ま す (GUI を 使用 し た場合)。 ポー ト のプ ラ グ マ指示子は
SC_MODULE と い う デザ イ ン関数内にのみ適用で き ます。 こ れを示す最適な例は、 次の よ う にな り ます。
次は、 典型的な SystemC デザ イ ン の最上位です。 こ の場合、 典型的な例なので、 SC_MODULE と ポー ト はヘ ッ ダー
フ ァ イ ルで定義 さ れてい ます。
SC_MODULE(sc_sequ_cthread){
//Ports
sc_in <bool> clk;
sc_in <bool> reset;
sc_in <bool> start;
sc_in<sc_uint<16> > a;
sc_in<bool> en;
sc_out<sc_uint<16> > sum;
sc_out<bool> vld;
//Variables
sc_uint<16> acc;
//Process Declaration
void accum();
//Constructor
SC_CTOR(sc_sequ_cthread){
//Process Registration
SC_CTHREAD(accum,clk.pos());
reset_signal_is(reset,true);
}
};
RESOURCE 指示子は ソ ース フ ァ イ ルに直接追加で き ます。 指示子は、 SC_MODULE の ど の関数にで も 適用で き ます
が、 こ こ では変数が使用 さ れ る 関数に追加 し ます。
こ の例の場合、 start、 a、 en、 sum、 valid な ど のポー ト が 1 つの AXI4-Lite イ ン タ ーフ ェ イ ス に ま と め ら れてい ます (
各指示子に同 じ 名前 slv0 を使用す る こ と で、 すべてのポー ト が同 じ イ ン タ ーフ ェ イ ス に ま と め ら れます)。
#include "sc_sequ_cthread.h"
void sc_sequ_cthread::accum(){
//Group ports into AXI4 slave slv0
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
75
イ ン タ ー フ ェ イ スの管理
#pragma
#pragma
#pragma
#pragma
#pragma
HLS
HLS
HLS
HLS
HLS
resource
resource
resource
resource
resource
core=AXI4LiteS
core=AXI4LiteS
core=AXI4LiteS
core=AXI4LiteS
core=AXI4LiteS
metadata="-bus_bundle
metadata="-bus_bundle
metadata="-bus_bundle
metadata="-bus_bundle
metadata="-bus_bundle
slv0"
slv0"
slv0"
slv0"
slv0"
variable=start
variable=a
variable=en
variable=sum
variable=vld
//Initialization
acc=0;
sum.write(0);
vld.write(false);
wait();
// Process the data
while(true) {
// Wait for start
wait();
while (!start.read()) wait();
// Read if valid input available
if (en) {
acc = acc + a.read();
sum.write(acc);
vld.write(true);
} else {
vld.write(false);
}
}
}
注記 : SystemC デザ イ ンの メ モ リ ポー ト は、 AXI4-Lite イ ン タ ーフ ェ イ ス に ま と め る こ と はで き ません。
AXI4 Master イ ン タ ー フ ェ イ スの使用
AXI4 Master イ ン タ ーフ ェ イ ス を作成す る には、 RTL ポー ト に ap_bus イ ン タ ーフ ェ イ ス が必要です (表 1-5)。 こ の例
では、 ポー ト m が ap_bus と し て設定 さ れ、 それが AXI4M リ ソ ース に接続 さ れ る よ う に指定 さ れてい ます。
ブ ロ ッ ク レ ベルの イ ン タ ーフ ェ イ ス プ ロ ト コ ルは I/O プ ロ ト コ ルを ap_ctrl_none に設定す る こ と で削除 さ れてい ま
す。 こ れに よ り 、 こ の例にはその他の イ ン タ ーフ ェ イ ス がな く な り ます (ブ ロ ッ ク レベルのハン ド シ ェ イ ク 信号な し 、
リ タ ーン ポー ト な し )。
#include "ap_cint.h"
#define N 256
typedef uint32 DT;
void foo_top (volatile DT *m) {
// Define the RTL interfaces
#pragma HLS interface ap_ctrl_none port=return
#pragma HLS interface ap_bus port=m
// Define the pcore interface as an AXI4 master
#pragma HLS resource core=AXI4M variable=m
DT buff[N], tmp;
int i, j;
memcpy(buff, m, N * sizeof(DT));
for (i = 0, j = N - 1; i < j; i++, j--) {
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
76
イ ン タ ー フ ェ イ スの管理
tmp = buff[i];
buff[i] = buff[j];
buff[j] = tmp;
}
memcpy(m, buff, N * sizeof(DT));
}
pcore が生成 さ れ る と 、AXI4 マ ス タ ー
接続で き ます (図 1-43)。
イ ン タ ーフ ェ イ ス がポー ト m に接続 さ れます。 こ れは AXI4 シ ス テ ム バ ス に
X-Ref Target - Figure 1-43
図 1‐43 : AXI4 マス タ ー イ ン タ ー フ ェ イ ス
SystemC の AXI4 マス タ ー イ ン タ ー フ ェ イ ス
AXI4 マ ス タ ー イ ン タ ーフ ェ イ ス を SystemC デザ イ ンに追加す る 方法は、 C/C++ と 類似 し てい ます。
•
ap_bus I/O プ ロ ト コ ルを使用 し て RTL イ ン タ ーフ ェ イ ス を作成 し ます。
•
AXI4M リ ソ ース を ポー ト に割 り 当て ます。
こ のプ ロ セ ス全体は、 Vivado HLS SystemC ポー ト の AXI4M_bus_port ク ラ ス を使用す る と 単純にで き ます。 こ のポー
ト ク ラ ス の詳細については、 「SystemC の イ ン タ ーフ ェ イ ス合成」 セ ク シ ョ ン を参照 し て く だ さ い。 バ ス ポー ト を使
用す る 際の コ ー ド 例 も 記述 さ れてい ます。
こ のポー ト ク ラ ス が使用 さ れ る と 、 結果の RTL デザ イ ンに ap_bus イ ン タ ーフ ェ イ ス が使用 さ れ、 export_rtl コ マ ン ド
が使用 さ れ る と 、 AXI4 マ ス タ ー ポー ト が使用 さ れます。 ap_bus プ ロ ト コ ルを定義す る 、 ま たは AXI4 リ ソ ース を指
定す る 指示子を必ず使用す る 必要はあ り ません。
AXI4‐Stream イ ン タ ー フ ェ イ スの使用
AXI4-Stream イ ン タ ーフ ェ イ ス は、 AXI4-Stream のマ ス タ ー /ス レーブ イ ン タ ーフ ェ イ ス です。 こ の イ ン タ ーフ ェ イ ス
は、 すべての ap_fifo RTL ポー ト に適用で き ます。
注記 : AXI4 Stream イ ン タ ーフ ェ イ ス を使用す る Vivado HLS ブ ロ ッ ク を EDK で接続す る 場合は、 こ のセ ク シ ョ ン最
後の 「AXI4 Stream の EDK での接続」 を参照 し て く だ さ い。
ス ト リ ーム イ ン タ ーフ ェ イ ス を適用す る 場合、 通常は構造体 (struct) を定義 し ます。 こ の構造体を構成す る メ ン
バーはそれぞれ AXI4-Stream バ ス信号に対応 し てい ます。 こ の例では、 DATA 構造体が定義 さ れ、 data と strb の 2 つ
の メ ンバーが含まれ、 ポー ト マ ッ プ と グループ オプシ ョ ンの両方を使用す る 必要があ り ます。 デー タ 変数が 1 つ し
かない場合は、 その他のオプシ ョ ンは必要あ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
77
イ ン タ ー フ ェ イ スの管理
Vivado HLS に 含 ま れ る AXI4-Stream イ ン タ ー フ ェ イ ス は、 バ ス 規格 の 柔軟性 に 合 う よ う に 設計 さ れ て い ま す。
AXI4-Stream 規格のほ と ん ど の信号 (例 : TREADY、 TKEEP、 TSTRB) はオプシ ョ ン です。 必須なのは TVALID お よ び
TREADY の 2 つの信号のみです (TREADY はバ ス規格ではオプシ ョ ンですが、Vivado HLS の AXI4-Stream イ ン タ ー
フ ェ イ ス で使用 さ れます)。
こ の例では、 構造体 メ ンバーの data を TDATA 信号に、 strb を TSTRB 信号にマ ッ プ し ます。
port_map={{data_i_data TDATA} {data_i_strb TSTRB}}
port_map={{data_o_data TDATA} {data_o_strb TSTRB}}
構造体を使用す る と 、 複数の変数を 1 つの AXI4-Stream にマ ッ プで き ますが、 Vivado HLS のデフ ォ ル ト 動作では、 構
造体の各 メ ンバーが別々の RTL イ ン タ ーフ ェ イ ス ポー ト を作成 し ます。 すべての メ ンバーを同 じ AXI4 グループに
マ ッ プす る には、 バ ス バン ド ル オプシ ョ ン を使用す る 必要があ り ます。
複数の RTL ポー ト は AXI4 ス レーブ イ ン タ ーフ ェ イ ス と 同 じ よ う に 1 つの AXI4-Stream イ ン タ ーフ ェ イ ス に ま と め
る こ と がで き ます。 ただ し 、 AXI4-Stream イ ン タ ーフ ェ イ ス に ま と め ら れ る RTL ポー ト は、 すべて入力ポー ト かすべ
て出力ポー ト であ る 必要があ り ます。 双方向 イ ン タ ーフ ェ イ ス は、 グループ化ではサポー ト さ れてい ません。
出力 イ ン タ ーフ ェ イ ス は AXI4-Stream マ ス タ ー イ ン タ ーフ ェ イ ス を、入力 イ ン タ ーフ ェ イ ス は AXI4-Stream ス レーブ
イ ン タ ーフ ェ イ ス を イ ンプ リ メ ン ト し ます。
こ の例では、 I/O プ ロ ト コ ルを ap_ctrl_none に設定す る こ と で、 ブ ロ ッ ク レベルの イ ン タ ーフ ェ イ ス プ ロ ト コ ルが削
除 さ れてい ます。 こ れに よ り 、 こ の例にはその他の イ ン タ ーフ ェ イ ス がな く な り ます (ブ ロ ッ ク レベルのハン ド シ ェ
イ ク 信号な し 、 リ タ ーン ポー ト な し )。
#include "ap_cint.h"
#define N 256
typedef struct {
uint32 data;
uint4 strb;
} DATA;
void foo_top (DATA data_i[N], DATA data_o[N]) {
// Define the RTL interfaces
#pragma HLS interface ap_ctrl_none port=return
#pragma HLS interface ap_fifo port=data_i
#pragma HLS interface ap_fifo port=data_o
// Define the pcore interfaces AXI4 slave
#pragma HLS resource core=AXI4Stream variable=data_i metadata="-bus_bundle
AXI4Stream_S" port_map={{data_i_data TDATA} {data_i_strb TSTRB}}
// Define the pcore interfaces AXI4 master
#pragma HLS resource core=AXI4Stream variable=data_o metadata="-bus_bundle
AXI4Stream_M" port_map={{data_o_data TDATA} {data_o_strb TSTRB}}
int i;
DATA buf[N];
for (i = 0; i < N; i++) {
buf[i] = data_i[i];
}
for (i = 0; i < N; i++) {
data_o[i] = buf[N-1-i];
}
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
78
イ ン タ ー フ ェ イ スの管理
}
ポー ト マ ッ プ を GUI で適用す る 場合、 各ポー ト マ ッ プは波括弧で囲み、 すべてのマ ッ プ を波括弧で さ ら に囲む必要
があ り ます。 文字列全体を port_map オプシ ョ ン ボ ッ ク ス に入力する 必要があ り ます。 次はその例です。
{{data_o_data TDATA} {data_o_strb TSTRB}}
図 1-44 は、前述の例か ら 作成 さ れた イ ン タ ーフ ェ イ ス を示 し てお り 、 RTL 入力お よ び出力が別々の イ ン タ ーフ ェ イ ス
に ま と め ら れてい ます。
X-Ref Target - Figure 1-44
図 1‐44 : Pcore : AXI4‐Stream イ ン タ ー フ ェ イ ス
こ の例では、 独自の構造体を使用 し てい ます。 Vivado HLS イ ン ス ト ール デ ィ レ ク ト リ の イ ン ク ルー ド デ ィ レ ク ト リ
にあ る ヘ ッ ダー フ ァ イ ル ap_axi_sdata.h では、AXI4 イ ン タ ーフ ェ イ ス規格のすべての可能性のあ る 信号に対 し て符号
付 き お よ び符号な し の構造体が定義 さ れてい ます。 こ れ ら を使用すれば、 ユーザー自身が構造体を作成す る 必要はあ
り ません。
•
ap_axi_s : AXI4-Stream の符号付 き 構造
•
ap_axi_s : AXI4-Stream の符号な し 構造
template<int D,int U,int TI,int TD>
struct ap_axis{
ap_int<D>
data;
ap_uint<D/8> keep;
ap_uint<D/8> strb;
ap_uint<U>
user;
ap_uint<1>
last;
ap_uint<TI> id;
ap_uint<TD> dest;
};
template<int D,int U,int TI,int TD>
struct ap_axiu{
ap_uint<D>
data;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
79
イ ン タ ー フ ェ イ スの管理
ap_uint<D/8>
ap_uint<D/8>
ap_uint<U>
ap_uint<1>
ap_uint<TI>
ap_uint<TD>
};
keep;
strb;
user;
last;
id;
dest;
AXI4‐Stream の EDK での接続
AXI4-Stream を含む Vivado HLS ブ ロ ッ ク を EDK の GUI 内で接続する 場合、ス ト リ ーム プ ロ ト コ ルを ア ッ プデー ト し
て、 AXI4 Stream の接続 さ れ る ブ ロ ッ ク の ス ト リ ーム プ ロ ト コ ル と 同 じ に し てお く 必要があ り ます。
デフ ォ ル ト では、 Vivado HLS で作成 さ れ る Pcore ブ ロ ッ ク には、 次の ス ト リ ーム プ ロ ト コ ルが含まれます ( こ れ ら に
は EDK 内の コ アの コ ン フ ィ ギ ュ レーシ ョ ン設定か ら ア ク セ ス で き ます)。
•
C_INPUT_STREAM_PROTOCOL = GENERIC
•
C_OUTPUT_STREAM_PROTOCOL = GENERIC
た と えば、 AXI DMA ブ ロ ッ ク には次の よ う な ス ト リ ーム プ ロ ト コ ルが含まれます。
•
C_INPUT_STREAM_PROTOCOL = XIL_AXI_STREAM_ETH_DATA
•
C_OUTPUT_STREAM_PROTOCOL = XIL_AXI_STREAM_ETH_DATA
EDK の GUI で 2 つの AXI4-Stream イ ン タ ーフ ェ イ ス に接続で き る よ う にす る には、 それぞれの イ ン タ ーフ ェ イ ス の
ス ト リ ーム プ ロ ト コ ルは同 じ であ る 必要があ り ます。
1.
まず、 接続す る ブ ロ ッ ク の コ ア コ ン フ ィ ギ ュ レーシ ョ ン設定を確認 し 、 接続する ポー ト の ス ト リ ーム プ ロ ト コ
ルを確認 し ます。
2.
Vivado HLS ブ ロ ッ ク の コ ア コ ン フ ィ ギ ュ レーシ ョ ン を編集 し 、 ス ト リ ーム コ ン フ ィ ギ ュ レーシ ョ ン設定を接続
す る ポー ト と 同 じ にな る よ う に変更 し ます。
つま り 、 Vivado HLS コ ア を上記の AXI DMA の例に接続する には、 Vivado HLS コ アの コ ア コ ン フ ィ ギ ュ レーシ ョ ン
設 定 を 編 集 し 、 出 力 ス ト リ ー ム ポ ー ト を デ ス テ ィ ネ ー シ ョ ン プ ロ ト コ ル と 合 う よ う に GENERIC か ら
C_INPUT_STREAM_PROTOCOL に 変 更 し 、 入力 ポ ー ト を ソ ー ス プ ロ ト コ ル に 合 う よ う に GENERIC か ら
C_OUTPUT_STREAM_PROTOCOL に変更 し ます。
こ れ ら の変更に よ り 、 EDK の GUI で Vivado HLS ブ ロ ッ ク と AXI DMA 間の接続が イ ネーブルにな り ます。
SystemC の AXI4‐Stream イ ン タ ー フ ェ イ ス
AXI4-Stream イ ン タ ーフ ェ イ ス は、 sc_fifo_in ま たは sc_fifo_out 型の SystemC ポー ト に追加で き ます。 AXI4-Stream リ
ソ ースへのポー ト 割 り 当て方法 と 同 じ 方法が使用 さ れます。
前述の 「SystemC バ ス イ ン タ ーフ ェ イ ス」 で説明 し た よ う に、 デザ イ ンへの指示子の適用方法に違いがあ り ます (GUI
を使用 し た場合)。 ポー ト のプ ラ グマ指示子は SC_MODULE と い う デザ イ ン関数内にのみ適用で き ます。 こ れを示す
最適な例は、 次の よ う にな り ます。
次は、 典型的な SystemC デザ イ ン の最上位です。 こ の場合、 典型的な例なので、 SC_MODULE と ポー ト はヘ ッ ダー
フ ァ イ ルで定義 さ れてい ます。
SC_MODULE(sc_FIFO_port)
{
//Ports
sc_in <bool> clock;
sc_in <bool> reset;
sc_in <bool> start;
sc_out<bool> done;
sc_fifo_out<int> dout;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
80
イ ン タ ー フ ェ イ スの管理
sc_fifo_in<int> din;
//Variables
int share_mem[100];
bool write_done;
//Process Declaration
void Prc1();
void Prc2();
//Constructor
SC_CTOR(sc_FIFO_port)
{
//Process Registration
SC_CTHREAD(Prc1,clock.pos());
reset_signal_is(reset,true);
SC_CTHREAD(Prc2,clock.pos());
reset_signal_is(reset,true);
}
};
RESOURCE 指示子は ソ ース フ ァ イ ルに直接追加で き ます。 指示子は、 SC_MODULE の ど の関数にで も 適用で き ます
が、 こ こ では変数が使用 さ れ る 関数に追加 し ます。
こ の例では、 指示子は ソ ース コ ー ド に表示 さ れ、 din お よ び dout ポー ト が指定 さ れ AXI4 Stream リ ソ ース が使用 さ れ
てい ます。
#include "sc_FIFO_port.h"
void sc_FIFO_port::Prc1()
{
//Initialization
write_done = false;
wait();
while(true)
{
while (!start.read()) wait();
write_done = false;
for(int i=0;i<100; i++)
share_mem[i] = i;
write_done = true;
wait();
} //end of while(true)
}
void sc_FIFO_port::Prc2()
{
#pragma HLS resource core=AXI4Stream variable=din
#pragma HLS resource core=AXI4Stream variable=dout
//Initialization
done = false;
wait();
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
81
イ ン タ ー フ ェ イ スの管理
while(true)
{
while (!start.read()) wait();
wait();
while (!write_done) wait();
for(int i=0;i<100; i++)
{
dout.write(share_mem[i]+din.read());
}
done = true;
wait();
} //end of while(true)
}
SystemC のイ ン タ ー フ ェ イ ス合成
通常 SystemC デ ザ イ ン で は、 イ ン タ ー フ ェ イ ス 合成は サ ポ ー ト さ れ ま せ ん。 SystemC デザ イ ン の I/O ポ ー ト を
SC_MODULE イ ン タ ーフ ェ イ ス に記述 し 、 ポー ト の動作を ソ ース コ ー ド に完全に記述す る 必要があ り ます。
例外は メ モ リ ポー ト (ap_memory プ ロ ト コ ル) と バ ス ポー ト (ap_bus プ ロ ト コ ル) です。 Vivado HLS には、 こ れ ら の
ポー ト タ イ プの イ ン タ ーフ ェ イ ス合成をサポー ト する ための ク ラ ス が提供 さ れてい ます。
メ モ リ ポー ト
た と えば、 標準 SystemC ア レ イ ポー ト を含む次の よ う なデザ イ ンがあ る と し ます。
SC_MODULE(my_design) {
//”RAM” Port
sc_uint<20> my_array[256];
…
my_array ポー ト は、 内部 RAM に合成 さ れます。
Vivado HLS ヘ ッ ダー フ ァ イ ル ap_mem_if.h を含め る と 、 ポー ト を ap_mem_port<data_width, address_bits> ポー ト と し
て指定で き ます。 ap_mem_port は、 ap_memory I/O プ ロ ト コ ルを使用す る と 、 指定のデー タ お よ びア ド レ ス バ ス幅の
標準 RAM イ ン タ ーフ ェ イ ス ポー ト に合成 さ れます。
上記の コ ー ド 例は、 次の よ う に変換で き ます。
#include "ap_mem_if.h"
SC_MODULE(my_design) {
//”RAM” Port
ap_mem_port<sc_uint<20>,sc_uint<8>, 256> my_array;
…
こ れに よ り 、 イ ン タ ーフ ェ イ ス ポー ト my_array が確実に RAM イ ン タ ーフ ェ イ ス と し て イ ンプ リ メ ン ト さ れます。
SystemC デザ イ ンに ap_mem_port を追加 し た場合、 SystemC テ ス ト ベンチに ap_mem_port を駆動する ap_mem_chn を
追加す る 必要があ り ます。 テ ス ト ベンチでは、 次の よ う に ap_mem_chn を定義 し て イ ン ス タ ン ス に接続 し ます。
#include "ap_mem_if.h"
ap_mem_chn<int,int, 68> bus_mem;
…
// Instantiate the top-level module
my_design U_dut (“U_dut”)
U_dut.my_array.bind(bus_mem);
…
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
82
イ ン タ ー フ ェ イ スの管理
ヘ ッ ダー フ ァ イ ル ap_mem_if.h は、$VIVADO_HLS_ROOT\include \ap_sysc\ap_mem_if.h にあ り 、SystemC のシ ミ ュ レー
シ ョ ンに含め る 必要があ り ます。
バス ポー ト
最 も 標準的な SystemC デザ イ ン の場合、 Vivado HLS の ap_bus I/O プ ロ ト コ ルの ビヘ イ ビ ア を使用 し てポー ト を指定
す る 必要はあ り ませんが、 デザ イ ンに AXI4 マ ス タ ー バ ス イ ン タ ーフ ェ イ ス が必要な場合は、 ap_bus I/O プ ロ ト コ ル
が必要です。
RTL I/O プ ロ ト コ ルの ap_bus と AXI4 イ ン タ ーフ ェ イ スは、 Vivado HLS の AXI4M_bus_port ポー ト ク ラ ス を使用す る
と SystemC デザ イ ンに追加で き ます。
次の例は、 bus_if と い う AXI4M_bus_port を SystemC デザ イ ンに追加する 方法を示 し てい ます。
•
ヘ ッ ダー フ ァ イ ルの AXI4_if.h を プ ロ ジ ェ ク ト に追加する 必要があ り ます。
•
ポー ト は AXI4M_bus_port<type> と 定義 し 、 <type> には使用 さ れ る デー タ 型 ( こ の場合 sc_fixed) を指定 し ます。
注記 : AXI4M_bus_port で使用 さ れ る デー タ 型は、 8 ビ ッ ト の倍数であ る 必要があ り ます。 ま た、 struct は こ のデー タ
型ではサポー ト さ れません。
#include "systemc.h"
#include "AXI4_if.h"
#include "tlm.h"
using namespace tlm;
#define DT sc_fixed<32, 8>
SC_MODULE(dut)
{
//Ports
sc_in<bool> clock; //clock input
sc_in<bool> reset;
sc_in<bool> start;
sc_out<int> dout;
AXI4M_bus_port<sc_fixed<32, 8> > bus_if;
//Variables
//Constructor
SC_CTOR(dut)
//:bus_if ("bus_if")
{
//Process Registration
SC_CTHREAD(P1,clock.pos());
reset_signal_is(reset,true);
}
}
次は、 変数 bus_if が SystemC 関数で ど の よ う にア ク セ ス さ れて、 標準ま たはバース ト 読み出 し お よ び書 き 込み演算が
生成 さ れ る のか を示 し てい ます。
//Process Declaration
void P1()
{
//Initialization
dout.write(10);
int addr = 10;
DT tmp[10];
wait();
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
83
イ ン タ ー フ ェ イ スの管理
while(1)
{
tmp[0]=10;
tmp[1]=11;
tmp[2]=12;
while (!start.read()) wait();
// Port read
tmp[0] = bus_if->read(addr);
// Port burst read
bus_if->burst_read(addr,2,tmp);
// Port write
bus_if->write(addr, tmp);
// Port burst write
bus_if->burst_write(addr,2,tmp);
dout.write(tmp[0].to_int());
addr+=2;
wait();
}
}
AXI4M_bus_port ポー ト ク ラ ス がデザ イ ンで使用 さ れ る と 、 次に示す よ う に、 テ ス ト ベンチにそれ と 一致す る HLS バ
ス イ ン タ ーフ ェ イ ス チ ャ ネルの hls_bus_chn<start_addr> が含まれ る 必要があ り ます。
#include <systemc.h>
#include "tlm.h"
using namespace tlm;
#include "hls_bus_if.h"
#include "AE_clock.h"
#include "driver.h"
#ifdef __RTL_SIMULATION__
#include "dut_rtl_wrapper.h"
#define dut dut_rtl_wrapper
#else
#include "dut.h"
#endif
int sc_main (int argc , char *argv[])
{
sc_report_handler::set_actions("/IEEE_Std_1666/deprecated", SC_DO_NOTHING);
sc_report_handler::set_actions( SC_ID_LOGIC_X_TO_BOOL_, SC_LOG);
sc_report_handler::set_actions( SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, SC_LOG);
sc_report_handler::set_actions( SC_ID_OBJECT_EXISTS_, SC_LOG);
// hls_bus_chan<type>
// bus_variable(“name”, start_addr, end_addr)
//
hls_bus_chn<sc_fixed<32, 8> > bus_mem("bus_mem",0,1024);
sc_signal<bool>
sc_signal<bool>
sc_signal<bool>
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
s_clk;
reset;
start;
japan.xilinx.com
Send Feedback
84
イ ン タ ー フ ェ イ スの管理
sc_signal<int>
AE_Clock
dut
driver
dout;
U_AE_Clock("U_AE_Clock", 10);
U_dut("U_dut");
U_driver("U_driver");
U_AE_Clock.reset(reset);
U_AE_Clock.clk(s_clk);
U_dut.clock(s_clk);
U_dut.reset(reset);
U_dut.start(start);
U_dut.dout(dout);
U_dut.bus_if(bus_mem);
U_driver.clk(s_clk);
U_driver.start(start);
U_driver.dout(dout);
int end_time = 8000;
cout << "INFO:Simulating " << endl;
// start simulation
sc_start(end_time, SC_NS);
return U_driver.ret;
};
合成 さ れた RTL デザ イ ンには、 ap_bus I/O プ ロ ト コ ルを使用 し た イ ン タ ーフ ェ イ ス が含まれます。
手動のイ ン タ ー フ ェ イ ス仕様
Vivado HLS には、 特定の I/O プ ロ ト コ ルを定義す る コ ー ド ブ ロ ッ ク を特定す る 機能があ り ます。 こ の機能を使用す
る と 、 イ ン タ ーフ ェ イ ス合成ま たは SystemC を使用せずに I/O プ ロ ト コ ルを指定で き ます (SystemC では、 下に説明
す る プ ロ ト コ ル指示子を使用 し て I/O を よ り 厳密に制御可能)。
次の例は、 次の よ う な コ ー ド です。
•
入力 response[0] が読み出 さ れます。
•
出力 request が書 き 込まれます。
•
入力 response[1] が読み出 さ れます。
•
最終的なデザ イ ンで、 こ の順序で I/O ア ク セ ス を実行する 必要があ り ます。
void test (
int
*z1,
int
a,
int
b,
int
*mode,
volatile int
volatile int
int
*z2
) {
int
int
int
*request,
response[2],
read1, read2;
opcode;
i;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
85
イ ン タ ー フ ェ イ スの管理
P1:{
read1
opcode
*request
read2
}
C1:{
*z1
*z2
}
=
=
=
=
response[0];
5;
opcode;
response[1];
= a + b;
= read1 + read2;
}
Vivado HLS で こ の コ ー ド を イ ンプ リ メ ン ト し た場合に、 request への書 き 込みを response に対す る 2 つの読み出 し の
間にす る 必要はあ り ません。 コ ー ド は こ の よ う に I/O が動作す る よ う 記述 さ れてい ますが、 こ の依存性を強制す る も
のは コ ー ド にあ り ません。 Vivado HLS では、 I/O ア ク セ ス が コ ー ド 記述 と 同様に ス ケ ジ ュ ール さ れ る 場合 と 、 ほかの
順序が使用 さ れ る 場合があ り ます。
こ の場合、特定の I/O プ ロ ト コ ル動作を強制す る ためにプ ロ ト コ ル ブ ロ ッ ク を使用で き ます。ア ク セ ス はブ ロ ッ ク P1
で定義 さ れた範囲内で実行 さ れ る ので、 プ ロ ト コ ルを次の よ う に適用で き ます。
•
ap_wait() を定義す る ap_utils.h ヘ ッ ダー フ ァ イ ルを含め ます。
•
request への書 き 込みの後、 response[1] の読み出 し の前に、 ap_wait() 文を追加 し ます。
°
•
ap_wait() 文に よ り シ ミ ュ レーシ ョ ンの動作が変わ る こ と はあ り ませんが、合成中に こ こ に ク ロ ッ ク が挿入 さ
れ る よ う にな り ます。
ブ ロ ッ ク P1 をプ ロ ト コ ル領域に指定 し ます。
°
こ の よ う にす る と 、 こ の領域内の コ ー ド がその ま ま ス ケ ジ ュ ー リ ン グ さ れます。 I/O と ap_wait() 文の順序が
変更 さ れ る こ と はあ り ません。
次の よ う に指示子を適用 し ます。
set_directive_protocol test P1 -mode floating
コ ー ド を次の よ う に変更 し ます。
#include "ap_utils.h"// Added include file
void test (
int
*z1,
int
a,
int
b,
int
*mode,
volatile int
volatile int
int
*z2
) {
int
int
int
*request,
response[2],
read1, read2;
opcode;
i;
P1:{
read1
= response[0];
opcode
= 5;
ap_wait();// Added ap_wait statement
*request
= opcode;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
86
デザイ ン最適化
read2
}
C1:{
= response[1];
*z1
*z2
= a + b;
= read1 + read2;
}
}
こ れに よ り 、 コ ー ド に指定 さ れた と お り の I/O 動作が得 ら れます。
•
入力 response[0] が読み出 さ れます。
•
出力 request が書 き 込まれます。
•
入力 response[1] が読み出 さ れます。
-mode floating オプシ ョ ン を使用す る と 、 デー タ の依存性で許容 さ れ る 場合は、 ほかの コ ー ド を こ のブ ロ ッ ク と 並列実
行で き ます。 こ のオプシ ョ ン を fixed に設定す る と 、 並列実行 さ れません。
デザイ ン最適化
こ の章では、 Vivado HLS でパフ ォーマ ン ス、 エ リ ア、 消費電力の目標を満たすマ イ ク ロ アーキ テ ク チ ャ が生成 さ れ
る よ う にす る ための、 さ ま ざ ま な最適化お よ び手法を説明 し ます。
こ の章の ト ピ ッ ク は、 適用す る 正 し い最適化をすばや く 見つけ ら れ る よ う に構成 さ れてお り 、 生産性を向上 し ます。
ト ッ プ を次の順に参照 し 、 デザ イ ン最適化を実行す る こ と をお勧め し ます。
•
チ ェ ッ ク リ ス ト お よ びガ イ ド ラ イ ン
•
ク ロ ッ ク 、 タ イ ミ ン グ、 お よ び RTL 出力
•
任意精度デー タ 型
•
最適化の実行
「チ ェ ッ ク リ ス ト お よ びガ イ ド ラ イ ン」 では、 こ の章で説明す る 最適化を適用す る ための ス ト ラ テ ジ を示 し ます。 エ
リ ア、 スループ ッ ト 、 レ イ テ ン シ、 消費電力な ど、 さ ま ざ ま なデザ イ ンの目標の最適化ス ト ラ テジが提供 さ れてい ま
す。デザ イ ンの全体的な目標が こ れ ら の一般的な目標 と は異な る 場合でで も 、 こ のセ ク シ ョ ン を参照す る こ と に よ り 、
デザ イ ンの目標を満たすために Vivado HLS の機能を適用す る ための基礎を学ぶ こ と がで き ます。
論理合成な ど の高位合成では、 入力 ソ ース コ ー ド や制約を ほんの少 し 変更 し ただけで も 、 出力デザ イ ンが異な る も の
にな り ます。 最初か ら や り 直 さ なければな ら ない よ う な状況を避け る ため、 「 ク ロ ッ ク 、 タ イ ミ ン グ、 お よ び RTL 出
力」 お よ び 「任意精度デー タ 型」 を参照 し て、 複雑な最適化を適用する 前に、 基本的なデザ イ ン パ ラ メ ー タ ーお よ び
デザ イ ン記述が正 し く 、 で き る だけ理想に近い こ と を確認 し て く だ さ い。
複雑で高度な最適化を適用す る 段階にな っ た ら 、 ト ッ プダ ウ ンお よ びボ ト ム ア ッ プ手法を使用で き ます。
•
デザ イ ン で レ イ テ ン シ ま たは ス ループ ッ ト が目標か ら かな り 離れてい る 場合は、 ト ッ プダ ウ ン手法を使用 し ま
す。 抽象度の高い レ ベルで最適化を適応 し た方が、 大 き く 向上 し ま す。 デザ イ ン を機能 レ ベルか ら 開始 し て ロ
ジ ッ ク レベルに向か っ て見直 し ます。 こ のユーザー ガ イ ド で も 、 こ の順序で情報を提供 し てい ます。
•
デザ イ ンが目標をほぼ達成 し てい る 場合は、ク ロ ッ ク サ イ ク ルま たは リ ソ ース をい く つか削減す る こ と に焦点を
置 き ます。 こ の場合、 ロ ジ ッ ク 構造の レベルか ら 開始 し 、 別の コ ン ポーネ ン ト を選択す る こ と に よ り 1 サ イ ク ル
で実行 さ れ る 操作が増加す る か、 ア レ イ ア ク セ ス が障害 と な っ ていないかな ど を確認 し て、 機能レベルに向か っ
て作業 し ます。
チ ェ ッ ク リ ス ト およびガ イ ド ラ イ ン
こ のセ ク シ ョ ンでは、 最適化の目標を短時間で達成す る ための基本的な ス ト ラ テジの概要を示 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
87
デザイ ン最適化
デザイ ンの基礎
「 ク ロ ッ ク 、 タ イ ミ ン グ、 お よ び RTL 出力」 に説明 さ れてい る 基本的なデザ イ ン パ ラ メ ー タ ーを見直 し 、 RTL が次の
も ので作成 さ れてい る こ と を確認 し ます。
•
正 し い ク ロ ッ ク と ク ロ ッ ク のば ら つ き
•
正しい リ セ ッ ト ス タ イル
•
ス テー ト エン コ ー ド
イ ン タ ー フ ェ イ ス合成
アルゴ リ ズ ム と イ ン タ ーフ ェ イ ス 合成の両方に注目す る こ と が重要です。 イ ン タ ーフ ェ イ ス はデー タ を供給す る の
で、 必要な スループ ッ ト レー ト を達成する のの障害 と な っ てい る 可能性があ り ます。
デザ イ ン最適化を実行す る 前に、 正 し い イ ン タ ーフ ェ イ ス が使用 さ れてい る こ と を確認 し て く だ さ い。
•
デザ イ ン上の現在の イ ン タ ーフ ェ イ ス が、 通信す る デザ イ ン と 互換性があ る こ と を確認 し ます。
•
「 イ ン タ ーフ ェ イ ス の管理」 を参照 し 、 正 し い イ ン タ ーフ ェ イ ス を選択 し て定義 し ます。
•
選択 し た イ ン タ ーフ ェ イ ス を合成後の検証方法で使用で き る こ と を確認 し ます。 イ ン タ ーフ ェ イ ス を後で変更す
る と 、 ス ケ ジ ュ ールが こ と な る も のにな る 可能性があ り ます。検証フ ロ ーの詳細は、「検証」 を参照 し て く だ さ い。
最後に、 パフ ォーマ ン ス要件を満たすためには、 イ ン タ ーフ ェ イ ス の イ ンプ リ メ ン ト 方法ま たは イ ン タ ーフ ェ イ ス の
タ イ プ を変更す る 必要があ る と い う こ と を認識す る こ と が必要です。 た と えば、 ア レ イ イ ン タ ーフ ェ イ ス を次の よ う
に変更す る と 有益な場合があ り ます。
•
シ ン グル ポー ト か ら デ ュ アル ポー ト の RAM イ ンプ リ メ ン テーシ ョ ンに変更す る 。
•
RAM か ら ス ト リ ー ミ ン グ FIFO イ ンプ リ メ ン テーシ ョ ンに変更する 。
こ の よ う な決定お よ び変更は、 手動で最適化を実行す る 場合 と 同 じ です。 デザ イ ンの上の レベルを考慮 し 、 イ ン タ ー
フ ェ イ ス プ ロ ト コ ルを変更す る のが、デザ イ ン を向上 さ せる 唯一の方法であ る 場合があ り ます。Vivado HLS では、 こ
の よ う な変更に よ り 有益なアーキ テ ク チ ャ が得 ら れ る か ど う かを簡単に判断で き ます。
デー タ 型 と ビ ッ ト 幅
Vivado HLS では、 演算特性に基づいてデー タ 型が伝搬 さ れますが、 明示的に指定す る 方が確実です。
C 関数での変数の ビ ッ ト 幅は、RTL イ ンプ リ メ ン テーシ ョ ンで使用 さ れ る ス ト レージ エ レ メ ン ト のサ イ ズ と 演算子に
直接影響 し ます。 変数に 8 ビ ッ ト のみが必要なのに整数型 (32 ビ ッ ト ) で指定 さ れてい る と 、 大型で低速の 32 ビ ッ ト
演算子が使用 さ れ、 1 ク ロ ッ ク サ イ ク ルで実行で き る 演算の数が削減 し 、 レ イ テ ン シお よ びスループ ッ ト が増加す る
可能性があ り ます。
•
デー タ 型には、 適切な精度を使用 し ます。 詳細は、 本章の 「任意精度デー タ 型」 セ ク シ ョ ン を参照 し て く だ さ い。
•
RAM ま たは レ ジ ス タ と し て イ ンプ リ メ ン ト さ れ る ア レ イ のサ イ ズ を確認 し ます。 各ア レ イ には複数の要素があ
る ので、 ア レ イ に必要以上に大 き い要素があ る と 、 そのエ リ アへの影響は拡大 し ます。
•
乗算、 除算、 対数演算、 その他の複雑な算術演算に特に注目 し ます。 こ れ ら の変数が必要以上に大き い場合、 エ
リ アお よ びパフ ォーマ ン ス の両方に悪影響を与え ます。
エ リ ア を最小限に抑えたデザイ ン
デザ イ ンのエ リ ア を最小限に抑え る には、 関数お よ びループ を再利用す る よ う に し ます。 関数お よ びループは、 実行
さ れ る たびに同 じ ハー ド ウ ェ ア リ ソ ース で繰 り 返 さ れます。 こ れに よ り 、 演算 よ り も 上の レベルで共有を最大化で き
ます。
•
エ リ ア を縮小す る 作業を始め る 前に、 デザ イ ンがパフ ォーマ ン ス要件を満た し てい る か、 ほぼ満た し てい る こ と
を確認 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
88
デザイ ン最適化
•
関数が複数回呼び出 さ れてい る 場合は、 同 じ ハー ド ウ ェ アが供給 さ れます。 こ れは、 コ ー ド 記述方法に よ り エ リ
ア を節約す る 最良の方法です。 関数 イ ン ラ イ ン化に よ り 、 よ り 多 く の関数が共有 さ れ る か ど う か を確認 し て く だ
さ い ( 「関数の再利用、 イ ン ラ イ ン化」 を参照)。
•
ループ も 関数 と 同様に同 じ ハー ド ウ ェ アで繰 り 返 さ れます。 こ れに よ り ループ機能が小 さ いエ リ アに イ ンプ リ メ
ン ト さ れますが、 レ イ テ ン シが大 き く な り ます。 for ループが展開 さ れていない こ と を確認 し て く だ さ い。 デフ ォ
ル ト では展開 さ れません。 詳細は、 「ループの最適化」 を参照 し て く だ さ い。
•
デザ イ ンがパ イ プ ラ イ ン処理 さ れてい る 場合は、 開始間隔を変え た場合で も 、 コ ン ポーネ ン ト を再利用 し なが ら
スループ ッ ト 要件が満た さ れ る こ と を確認 し ます。 詳細は 「関数の最適化」 お よ び 「ループの最適化」 を参照 し
て く だ さ い。
•
ア レ イ が既存の RAM に最適に イ ンプ リ メ ン ト さ れてい る か、 ア レ イ をパーテ ィ シ ョ ン し た り 変更す る こ と で使
用可能な RAM リ ソ ース が よ り 効率的に使用 さ れ、 並列ア ク セ ス が実行で き る よ う にな る か を確認 し ます。 詳細
は、 「ア レ イ の最適化」 を参照 し て く だ さ い。
最小開始間隔のデザイ ン
開始間隔が最小のデザ イ ンでは、 最小のサ イ ク ル数でで き る だけ多 く のデー タ を処理す る よ う に し ます。
•
関数レベルか ら 開始 し 、 特に C お よ び C++ デザ イ ンの場合は 「関数のデー タ フ ロ ー パ イ プ ラ イ ン処理」 を参照
し て く だ さ い。 SystemC では、 並列処理がサポー ト さ れます。
•
「ループのパ イ プ ラ イ ン処理」 を参照 し て、 パ イ プ ラ イ ン処理をループに適用で き る か ど う かを判断 し ます。
可能なパ イ プ ラ イ ン処理がすべて適用 さ れてい る 場合や、 パ イ プ ラ イ ン処理が不可能な場合は、 各関数お よ びループ
で レ イ テ ン シ を最小に し ます。 演算を完了する のに必要なサ イ ク ル数が少なければ、 次の入力を早 く 読み込む こ と が
で き ます。 レ イ テ ン シ を削減す る 手法は次のセ ク シ ョ ンで説明 し ますが、 デザ イ ン スループ ッ ト を考慮する 場合、 次
の点が重要です。
•
•
レ ポー ト のサマ リ セ ク シ ョ ン を確認 し ます。 階層の各関数で最 も 影響す る ク リ テ ィ カル ループ を調べ、 「レ イ テ
ン シ を最小限に抑えたデザ イ ン」 の手法を使用 し て ク リ テ ィ カル ループの レ イ テ ン シ を削減 し ます。
°
25 ク ロ ッ ク で実行可能なループが 2 回実行 さ れ る 場合、 影響は 50 サ イ ク ルです。
°
4 ク ロ ッ ク で実行可能なループが 256 回実行 さ れ る 場合、 影響は 1024 サ イ ク ルであ り 、 よ り ク リ テ ィ カルで
あ る と 考え る 必要があ り ます。
デザ イ ン ポー ト が制限 と な っ てい る 場合は、 イ ン タ ーフ ェ イ ス タ イ プ を変更する こ と を考慮 し ます。 こ の場合、
イ ン タ ーフ ェ イ ス タ イ プの変更がシ ス テ ムのほかのデザ イ ンでサポー ト さ れ る か を確認する 必要があ り ます。
レ イ テ ン シ を最小限に抑えたデザイ ン
デザ イ ンの レ イ テ ン シ を削減す る 方法は、 次の と お り です。
•
関数お よ びループ レベルか ら 開始 し 、 特に C お よ び C++ デザ イ ンの場合は 「関数のデー タ フ ロ ー パ イ プ ラ イ ン
処理」 お よ び 「ループのデー タ フ ロ ー パ イ プ ラ イ ン処理」 を参照 し て並列処理を向上 し ます。 SystemC では、 並
列処理がサポー ト さ れます。
•
for ループがあ る 場合は、 「ループの展開」 に説明 さ れてい る よ う に一部ま たはすべて を展開 し 、 レ イ テ ン シが削
減 さ れ る か ど う か を確認 し ます。 展開する と 、 よ り 多 く の演算を少ないサ イ ク ル数で並列実行で き る よ う にな り
ますが、 リ ソ ースお よ びエ リ アが増加 し ます。
•
複数のループがあ る 場合は、 1 つのループ本体か ら 別のループに移動す る のに 1 ク ロ ッ ク サ イ ク ル必要であ る こ
と を考慮 し ます。 「ループの結合」 お よ び 「ネ ス ト さ れたループの フ ラ ッ ト 化」 を参照 し てループのオーバーヘ ッ
ド を削減 し て く だ さ い。
•
ア レ イ には注意 し ます。 ア レ イ は通常 メ モ リ にマ ッ プ さ れますが、 ア ク セ ス は制限 さ れます (読み出 し ポー ト お
よ び書 き 込みポー ト )。 こ れに よ り 、 レ イ テ ン シ を増加す る ハー ド ウ ェ アの依存性が発生す る 可能性があ り ます。
た と えば、 デ ュ アル ポー ト RAM ま たは 「ア レ イ の最適化」 で説明 さ れてい る リ コ ン フ ィ ギ ュ レーシ ョ ン さ れた
RAM では、 同 じ ク ロ ッ ク サ イ ク ルで読み出 し お よ び書き 込みを も っ と 実行で き る 場合があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
89
デザイ ン最適化
消費電力を最小限に抑えたデザイ ン
高位合成では、 複数の消費電力最適化が実行 さ れます。 こ れ ら の最適化には、 ス ケ ジ ュ ー リ ン グ中に実行 さ れ る 演算
子のゲーテ ィ ン グや、 パ イ プ ラ イ ンの開始へのパ イ プ ラ イ ン イ ネーブルの追加な ど があ り ます。 すべての消費電力最
適化は、 パフ ォーマ ン ス制限に悪影響を与え なければ適用 さ れます。
Vivado HLS では、 パフ ォーマ ン ス を犠牲に し て消費電力が削減 さ れ る こ と はあ り ませんが、 さ ま ざ ま な手法を使用 し
て さ ら に消費電力を削減で き ます。
•
エ リ ア を削減す る と 消費電力に大 き く 影響す る ので、 「エ リ ア を最小限に抑え たデザ イ ン」 を参照 し ます。
•
Vivado HLS のアーキ テ ク チ ャ 探索機能を活用 し てみて く だ さ い。 ク ロ ッ ク 周期を変更 し 、 新 し いマ イ ク ロ アー
キ テ ク チ ャ をすばや く 再生成で き ます。
ク ロ ッ ク 、 タ イ ミ ング、 および RTL 出力
C お よ び C++ デザ イ ンでは、 ク ロ ッ ク 1 つのみがサポー ト さ れます。 デザ イ ン内のすべての関数に、 同 じ ク ロ ッ ク が
適用 さ れます。 SystemC デザ イ ンでは、 各 SC_MODULE に異な る ク ロ ッ ク を指定で き ます。
SystemC デザ イ ンで複数の ク ロ ッ ク を指定する には、create_clock コ マ ン ド の -name オプシ ョ ン を使用 し て名前を指定
し て ク ロ ッ ク を 作 成 し 、 set_directive_clock コ マ ン ド ま た は プ ラ グ マ を 使用 し て、 指定 の ク ロ ッ ク で 合成す る
SC_MODULE を含む関数を指定 し ます。 各 SC_MODULE の合成には、 1 つの ク ロ ッ ク のみを使用で き ます。 複数の
ク ロ ッ ク を最上位ポー ト か ら 個々のブ ロ ッ ク に接続 し てい る 場合な ど、 複数の ク ロ ッ ク を関数を介 し て分配で き ます
が、 各 SC_MODULE は 1 つの ク ロ ッ ク にのみ応答 し ます。
ク ロ ッ ク 周期は、GUI の [Solution Settings] ダ イ ア ロ グ ボ ッ ク ス で ns で指定 し ます。SystemC デザ イ ンの場合、CLOCK
指示子を使用す る と デザ イ ンに複数の ク ロ ッ ク を追加で き ます。ク ロ ッ ク のば ら つき を指定 し て タ イ ミ ン グ マージ ン
を定義す る こ と も 可能です。
Vivado HLS ではデザ イ ンの操作の タ イ ミ ン グ を予測で き ますが、最終的な コ ン ポーネ ン ト の配置お よ びネ ッ ト 配線は
わか っ ていないので、 正確な遅延は算出で き ません。 実際の ク ロ ッ ク 周期は、 ク ロ ッ ク のば ら つ き か ら ク ロ ッ ク 周期
か ら 差 し 引いた値です (図 1-45)。Vivado HLS は使用可能な ク ロ ッ ク 周期を使用 し て、デザ イ ンの操作を ス ケ ジ ュ ー リ
ン グ し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
90
デザイ ン最適化
X-Ref Target - Figure 1-45
図 1‐45 : ク ロ ッ ク周期 と マージ ン
こ れに よ り 、 ユーザー指定の ス ラ ッ ク が使用 さ れ、 論理合成や配置配線な ど のダ ウ ン ス ト リ ーム プ ロ セ ス で操作を完
了す る ために十分な タ イ ミ ン グ マージ ンが供給 さ れ、 タ イ ミ ン グ ク ロ ージ ャ を達成す る ためのデザ イ ンの反復回数
を削減で き ます。
デフ ォ ル ト では ク ロ ッ ク のば ら つ き はサ イ ク ル時間の 12.5% に設定 さ れ ますが、 [Solutions Settings] ダ イ ア ロ グ ボ ッ
ク ス の [Synthesis] ページでユーザーが指定で き ます。 自動設定を使用す る と 、 ク ロ ッ ク 周期を変更 し た場合に ク ロ ッ
ク のば ら つ き も ア ッ プデー ト さ れます。 ク ロ ッ ク のば ら つき を手動で設定 し た場合は、 ク ロ ッ ク 周期を変更 し た と き
に ク ロ ッ ク のば ら つ き も 手動でア ッ プデー ト す る 必要があ り ます。
タ イ ミ ング
RTL 演算子お よ びレ ジ ス タ に使用 さ れ る タ イ ミ ン グ情報は、 ラ イ ブ ラ リ で定義 さ れてい ます。 ラ イ ブ ラ リ はすべて事
前に特性化 さ れてお り 、 Vivado HLS に格納 さ れてい ます。
Vivado HLS では、 レ イ テ ン シ、 スループ ッ ト (開始間隔)、 お よ び タ イ ミ ン グ制約を満たす こ と を目的 と し て処理が実
行 さ れますが、 制約が満た さ れない場合で も 、 RTL デザ イ ンが出力 さ れます。
•
デー タ の依存性に よ り スループ ッ ト 制約を満たす こ と がで き ない場合は (スループ ッ ト 要件は 1 であ る が メ モ リ
か ら 値を読み出すのに 2 サ イ ク ル必要な ど)、 タ イ ミ ン グが満た さ れ る ま で開始間隔が改善 さ れます。
•
ク ロ ッ ク 周期に よ り 推論 さ れ る タ イ ミ ン グ制約を満たす こ と がで き ない場合は、 Vivado
HLS
で次の よ う な
SCHED-644 と い う メ ッ セージが表示 さ れ、 達成可能な最良のパフ ォーマ ン ス のデザ イ ンが出力 さ れます。
@W [SCHED-644] Max operation delay (<operation_name> 2.39ns) exceeds the effective
cycle time
特定のパ ス で タ イ ミ ン グ要件が満た さ れない場合で も 、 ほかのすべてのパ ス では タ イ ミ ン グが満た さ れ る よ う に処理
が実行 さ れます。 こ れに よ り 、 ダ ウ ン ス ト リ ーム プ ロ セ ス に よ り 最適化を実行 し た り タ イ ミ ン グが満た さ れないパ ス
を特別処理す る こ と に よ り 、 タ イ ミ ン グ を満たす こ と がで き る かを ユーザーが評価で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
91
デザイ ン最適化
重要 : 合成後に制約レ ポー ト を確認 し て、 すべての制約が満た さ れたか ど う か (高位合成で生成 さ れた出力デザ イ ン
がすべてのパフ ォーマ ン ス制約を満たすわけではない と い う 事実) を確認する こ と が重要です。 デザ イ ン レ ポー ト の
「Performance Estimates」 セ ク シ ョ ン を確認 し て く だ さ い。
デザ イ ン レ ポー ト は、 合成が完了 し た と き に階層の各関数に対 し て生成 さ れ、 [Explorer] タ ブの [syn] → [report] フ ォ
ルダーか ら 参照で き 、 solution デ ィ レ ク ト リ の ./syn/report/<function name>.rpt に保存 さ れます。
デザ イ ン全体の ワ ース ト ケー ス タ イ ミ ン グは、 各関数レ ポー ト に レ ポー ト さ れ ます。 階層の各レ ポー ト をすべて参
照す る 必要はあ り ません。 タ イ ミ ン グ違反が最適化やダ ウ ン ス ト リ ーム プ ロ セ ス で修正で き ないほ ど大 き い場合は、
よ り 高速のテ ク ノ ロ ジ を タ ーゲ ッ ト す る 前に、 こ の章の こ の後に説明す る 手法を試 し てみて く だ さ い。
RTL 出力
Vivado HLS の RTL 出力の さ ま ざ ま特性は、 config_rtl コ マ ン ド を使用 し て制御で き ます。 config_rtl コ マ ン ド を使用す
る と 、 次が実行で き ます。
•
RTL ス テー ト マシ ン で使用 さ れ る FSM エン コ ー ド を指定
•
–header オプシ ョ ン を使用 し て、 すべての RTL フ ァ イ ルに著作権情報な ど の コ メ ン ト 文字列を追加
•
–prefix オプシ ョ ン を使用 し て、 すべての出力フ ァ イ ルに固有の接頭辞を追加 し 、 同 じ 最上位関数か ら 生成 さ れた
RTL フ ァ イ ル (デフ ォ ル ト では同 じ 名前) を簡単に同 じ デ ィ レ ク ト リ に ま と め る
デフ ォ ル ト の FSM コ ーデ ィ ン グ ス タ イ ルは auto です。 Vivado HLS の自動エン コ ーデ ィ ン グ を使用す る と 、 コ ーデ ィ
ン グ ス タ イ ルが決定 さ れますが、 ザ イ リ ン ク ス合成ツール (Vivado お よ び ISE) で ロ ジ ッ ク 合成中に FSM ス タ イ ルを
抽出 し て再 イ ン プ リ メ ン ト す る こ と がで き ます。 それ以外のエ ン コ ーデ ィ ン グ ス タ イ ル (bin、 onehot) が選択 さ れ る
場合は、 エン コ ーデ ィ ン グ ス タ イ ルはザ イ リ ン ク ス ロ ジ ッ ク 合成ツールでは最適化 し 直す こ と がで き ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
92
デザイ ン最適化
RTL コ ン フ ィ ギ ュ レ ー シ ョ ン を 定義す る に は、 [Solution] → [Solution Settings] を ク リ ッ ク し 、 左側の ボ ッ ク ス で
[General] を 選択 し て [Add] を ク リ ッ ク し 、 [Command] ド ロ ッ プ ダ ウ ン リ ス ト か ら [config_interface] を 選択 し ま す (
図 1-46)。
X-Ref Target - Figure 1-46
図 1‐46 : RTL コ ン フ ィ ギ ュ レーシ ョ ン
RTL コ ン フ ィ ギ ュ レーシ ョ ン設定で最 も 重要なのは、 通常 リ セ ッ ト 動作の選択です。
RTL リ セ ッ ト 動作の選択
リ セ ッ ト 動作について説明す る 前に、 初期化 と リ セ ッ ト の違いを理解 し てお く こ と が重要です。
C では、 変数は static 修飾子で定義 さ れ、 グ ロ ーバルに定義 さ れた変数はデフ ォ ル ト で 0 に初期化 さ れ ます。 こ れ ら
の変数に初期値を指定す る こ と も 可能です。 変数の初期値を指定 し た場合、 C コ ー ド の初期値は コ ンパ イ ル時 (時間
0) に割 り 当て ら れ、 その後再び割 り 当て ら れ る こ と はあ り ません。 RTL では、 ど ち ら の場合 も 、 同 じ 初期値が合成後
に イ ンプ リ メ ン ト さ れ る ので、 FPGA ビ ッ ト ス ト リ ームでデバ イ ス が同 じ 初期値で初期化 さ れ る よ う にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
93
デザイ ン最適化
ス タ テ ィ ッ ク 変数ま たはグ ロ ーバル変数でない変数に初期値が設定 さ れてい る 場合、 関数が実行 さ れ る たびに初期値
が割 り 当て ら れ ます。 つま り 、 こ の よ う な変数の初期化は RTL デザ イ ン が開始す る たびに実行 さ れ、 通常の動作の
一部 と な り ま す。 こ の よ う な初期化の例は、 ア キ ュ ム レー タ です。 新 し いデー タ サ ン プルが到着す る と 、 ア キ ュ ム
レー タ が 0 に設定 さ れ、 計算お よ び累積が実行 さ れます。 結果が次の ト ラ ンザ ク シ ョ ンに繰 り 越 さ れ る こ と はあ り ま
せん。 次のサンプルが到着す る と 、 ア キ ュ ム レー タ が再び 0 に設定 さ れます。
ス タ テ ィ ッ ク 変数お よ びグ ロ ーバル変数の初期値が RTL で も 割 り 当て ら れ る こ と に加え、 オプ シ ョ ン で RTL に リ
セ ッ ト を適用す る こ と も で き ます。 デフ ォ ル ト では リ セ ッ ト が追加 さ れます。
注記 : リ セ ッ ト は初期化 と は別であ り 、 初期化に加えて設定 さ れます。
リ セ ッ ト の コ ン フ ィ ギ ュ レーシ ョ ンに よ っ ては、 リ セ ッ ト 信号が適用 さ れた と き に、 変数が電源投入時の初期ス テー
ト に初期化 さ れない場合 も あ り ます。 その場合、 初期値は電源投入時にのみ適用 さ れます。
現在の と こ ろ、 デフ ォ ル ト では ス タ テ ィ ッ ク 変数お よ びグ ロ ーバル変数は リ セ ッ ト 時に再初期化 さ れません。
RTL の リ セ ッ ト 動作は、 図 1-46 に示す RTL コ ン フ ィ ギ ュ レーシ ョ ン設定ダ イ ア ロ グ ボ ッ ク ス で指定 し ます。
リ セ ッ ト の極性、 リ セ ッ ト が同期ま たは非同期の ど ち ら か (ザ イ リ ン ク ス テ ク ノ ロ ジでは同期 リ セ ッ ト の使用を推奨
)、 お よ び [reset] オプシ ョ ンで リ セ ッ ト 信号を適用 し た と き に リ セ ッ ト する レ ジ ス タ を指定で き ます。
[reset] オプシ ョ ンには、 次の 4 つの設定があ り ます。
•
[none] : デザ イ ンに リ セ ッ ト は追加 さ れません。
•
[control] : ス テー ト マシ ンに使用 さ れ る レ ジ ス タ や I/Oプ ロ ト コ ル信号を生成す る ために使用 さ れ る レ ジ ス タ な
ど の レ ジ ス タ を リ セ ッ ト に よ り 制御 し ます。
•
[state] : C コ ー ド の ス タ テ ィ ッ ク 変数ま たはグ ロ ーバル変数か ら 生成 さ れた レ ジ ス タ お よ びレ ジ ス タ / メ モ リ を リ
セ ッ ト に よ り 制御 し ます。 C コ ー ド で初期化 さ れ る ス タ テ ィ ッ ク 変数ま たはグ ロ ーバル変数は、 初期値に リ セ ッ
ト さ れます。
•
[all] : デザ イ ン内の レ ジ ス タ お よ び メ モ リ をすべて リ セ ッ ト し ます。 C コ ー ド で初期化 さ れ る ス タ テ ィ ッ ク 変数
ま たはグ ロ ーバル変数は、 初期値に リ セ ッ ト さ れます。
デフ ォ ル ト 設定は [control] です。
注記 : [state] に設定す る と 、 RAM で イ ン プ リ メ ン ト さ れ る ア レ イ が リ セ ッ ト 時に初期化 さ れます。 RAM と し て イ ン
プ リ メ ン ト さ れ る 多 く のア レ イ は ス タ テ ィ ッ ク と し て定義 さ れ る ので、 要素が明示的に初期化 さ れな く て も 、 すべて
の要素が 0 に初期化 さ れます。
大型 メ モ リ の場合、 リ セ ッ ト に何 ク ロ ッ ク サ イ ク ル も かか る こ と があ り 、 イ ンプ リ メ ン ト す る のに よ り エ リ アお よ び
リ ソ ース が必要です。
RESET 指示子 を 使用す る と 、 さ ら に詳細に リ セ ッ ト を 制御で き ま す。 変数が ス タ テ ィ ッ ク か グ ロ ーバルの場合、
RESET 指示子を使用 し てそれを明示的に リ セ ッ ト で き ます。 -off オプシ ョ ン を使用す る と 、 リ セ ッ ト さ れない よ う に
変数の リ ス ト か ら それが削除 さ れます。
リ セ ッ ト ロ ジ ッ ク が RAM に配置 さ れない よ う にす る に し て、 サ イ ク ル オーバーヘ ッ ド を追加 し て、 RAM のすべて
のエ レ メ ン ト が リ セ ッ ト さ れ る よ う にす る には、 次の手順に従っ て く だ さ い。
•
デフ ォ ル ト の制御モー ド を使用 し 、 ス タ テ ィ ッ ク ま たはグ ロ ーバル変数がそれぞれ RESET 指示子で リ セ ッ ト さ
れ る よ う に指定 し ます。
•
ス テー ト モー ド を使用 し 、 RESET 指示子を使用 し て特定の ス タ テ ィ ッ ク ま たはグ ロ ーバル変数か ら リ セ ッ ト を
削除 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
94
関数の最適化
関数の最適化
関数を指定す る には、 GUI で指定可能な最適化の リ ス ト (図 1-47) を参照 し て く だ さ い。
1.
[Explorer] タ ブで ソ ース コ ー ド を ダブル ク リ ッ ク し て開 き ます。
2.
補足エ リ アで [Directive] タ ブ を ク リ ッ ク し ます。
3.
関数を右 ク リ ッ ク し て [Insert Directives] を ク リ ッ ク し ます。
4.
[Directive] ド ロ ッ プダ ウ ン リ ス ト か ら 適切な指示子を選択 し 、 オプシ ョ ン を設定 し ます。
X-Ref Target - Figure 1-47
図 1‐47 : 関数の指示子
ヒ ン ト : 関数レベルで適用で き る 指示子すべてが関数の最適化に関連 し てい る わけではあ り ません。
た と えば、 Array_Reshape 指示子は関数を選択す る と 適用で き ますが、 関数の ス コ ープ内の特定の変数に適用 さ れ、 関
数自体は最適化 さ れません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
95
関数の最適化
表 1-6 に、 関数自体の動作お よ び最適化に影響す る 指示子を、 こ の章で説明す る 順に示 し ます。
表 1‐6 : 関数の最適化
GUI 指示子
説明
INLINE
関数を イ ン ラ イ ン化 し 、 関数の階層をすべて削除 し ます。 関数
呼び出 し のオーバーヘ ッ ド を削減する こ と に よ り 、 レ イ テ ン シ
お よ びスループ ッ ト を向上 し ます。
INSTANTIATE
関数を ロ ーカルで最適化で き る よ う に し ます。
DATAFLOW
関数レベルでの同時実行を イ ネーブルに し 、 スループ ッ ト お よ
び」 レ イ テ ン シ を向上 し ます。
PIPELINE
関数内での演算を同時実行で き る よ う に し 、 関数の開始間隔を
削減 し ます。
LATENCY
関数に最小お よ び最大レ イ テ ン シ制約を指定 し ます。
INTERFACE
関数 レ ベルのハ ン ド シ ェ イ ク を 適用 し ま す。 合成 さ れた制御
ポー ト start、 done、 お よ び idle に よ り 、 テ ス ト ベンチを再利用
で き ま す。 こ のオプシ ョ ン については、 「 イ ン タ ーフ ェ イ ス の
管理」 で詳細に説明 し ます。
関数の再利用、 イ ン ラ イ ン化、 および イ ン ス タ ン シ エーシ ョ ン
Vivado HLS では、 関数呼び出 し の階層の合成がサポー ト さ れ ま す。 デフ ォ ル ト では、 各関数が特定のハー ド ウ ェ ア
イ ンプ リ メ ン テーシ ョ ンにマ ッ プ さ れます。 関数内で同 じ 関数を複数回呼び出す と 、 RTL デザ イ ンにブ ロ ッ ク を イ ン
ス タ ン シエー ト す る よ う に、 同 じ ハー ド ウ ェ アが再利用 さ れます。
関数の再利用では、 関数内のすべての演算が共有 さ れ る ので、 リ ソ ース を共有 し 、 デザ イ ン を小型にす る のに効果的
です。 関数の階層を削除す る と 、 個々の演算が複数の場所で作成 さ れ、 同様の リ ソ ース共有は実行 さ れ ません (異な
る 場所での ロ ーカル最適化に よ り 共有が制限 さ れ る )。
関数のイ ン ラ イ ン化
関数に入っ た り 出た り す る には 1 サ イ ク ルかか る ので、 関数の階層を削除する と 、 レ イ テ ン シお よ びスループ ッ ト が
向上す る こ と があ り ます。
関数を イ ン ラ イ ン化す る と 、 関数の階層を削除で き ますが、 通常エ リ アが増加 し ます。 ただ し 、 関数が数回呼び出 さ
れ る だけで あ っ た り 小型の場合は、 関数を イ ン ラ イ ン化す る こ と に よ り 関数内の コ ン ポーネ ン ト を共有 し やす く な
り 、 エ リ アが向上す る こ と があ り ます。 こ のほかに も 、 関数を イ ン ラ イ ン化す る こ と が有益な場合があ り ます。
•
関数の共有を向上
•
アーキ テ ク チ ャ 探索機能を使用可能
関数のすべての イ ン ス タ ン ス に同 じ イ ンプ リ メ ン テーシ ョ ンが使用 さ れますが、 関数が確実に共有 さ れ る よ う にす る
には、 同 じ 関数内か ら 同 じ 階層レベルで呼び出す必要があ り ます。 こ れには、 ほかの関数を イ ン ラ イ ン化す る 必要が
あ る 場合 も あ り ます。
次の コ ー ド 例では、 関数呼び出 し foo_1 と foo_2 は共有で き ますが、 foo_3 は別の階層レベルにあ る ので共有で き ませ
ん。
foo {x,y} {
...
}
foo_sub (p, q) {
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
96
関数の最適化
int q1 = q + 10;
foo(p1,q);// foo_3
...
}
void foo_top { a, b, c, d} {
...
foo(a,b);//foo_1
foo(a,c);//foo_2
foo_sub(a,d);
...
}
上記の例では、 イ ン ラ イ ン化を適用 し て関数 foo_sub に よ り 作成 さ れた階層を削除する こ と に よ り 、 共有を向上で き
ます。 こ れには、 GUI では 図 1-47 に示す [Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス で [Directive] ド ロ ッ プダ
ウ ン リ ス ト か ら [INLINE] を選択す る か、 set_directive_inline コ マ ン ド を使用 し ます。
set_directive_inline foo_sub
イ ン ラ イ ン化指示子は、-recursive オプシ ョ ン を使用 し て指定の関数の下位にあ る すべての関数 も イ ン ラ イ ン化す る よ
う 指定で き ます。 上記の例で こ のオプシ ョ ン を使用す る と 、 関数 foo_sub と 関数呼び出 し foo_3 が イ ン ラ イ ン化 さ れ
ます。 -recursive オプシ ョ ン を最上位関数に使用する と 、 デザ イ ンのすべての関数階層が削除 さ れます。
-off オプシ ョ ン を使用す る と 、 関数が イ ン ラ イ ン化 さ れな く な り ます。 上記の例に次の コ マ ン ド を適用す る と し ます。
set_directive_inline -region -recursive foo_top
set_directive_inline -off foo_sub
foo_top の下位にあ る すべての関数が イ ン ラ イ ン化 さ れ、関数呼び出 し foo_1 お よ び foo_2 は イ ン ラ イ ン化 さ れますが、
foo_sub に -off オプシ ョ ンが使用 さ れてい る ので、 foo_3 は イ ン ラ イ ン化 さ れません。
関数の イ ン ラ イ ン化を使用す る と 、 ソ ース に変更を加えずに コ ー ド の構造を大き く 変更で き る ので、 アーキ テ ク チ ャ
探索の効果的な手法 と し て使用で き ます。
関数のイ ン ス タ ン シ エーシ ョ ン
関数の イ ン ス タ ン シエーシ ョ ンは、 関数階層を保持 し なが ら 、 関数の特定の イ ン ス タ ン ス に対 し て ロ ーカル最適化を
実行す る 最適化手法です。 こ れに よ り 関数呼び出 し 周辺の制御 ロ ジ ッ ク が簡略化 さ れ、 レ イ テ ン シお よ びスループ ッ
ト が向上す る こ と があ り ます。
関数 イ ン ス タ ン シエーシ ョ ンでは、 関数が呼び出 さ れた と き に関数の一部の入力が定数であ る こ と があ る と い う 事実
を利用 し て、 周辺の制御構造 (通常定数を生成) を簡略化 し 、 最適化 さ れた よ り 小型の関数ブ ロ ッ ク を作成 し ます。 こ
れを例を使用 し て説明 し ます。
次の よ う な コ ー ド があ る と し ます。
void A(){
B(true);
B(false);
B(true);
B(false);
}
void B(bool mode){
if (mode) {
// code segment 1
} else {
// code segment 2
}
}
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
97
関数の最適化
関数 B は複数回実行 さ れますが、 mode が ture であ る か false であ る かに よ っ て、 排他的であ る 場合 と ない場合があ り
ます。 関数 B の各 イ ン ス タ ン スは同 じ よ う に イ ンプ リ メ ン ト さ れます。 こ れは関数の再利用お よ びエ リ ア最適化の面
では有益ですが、 関数内の制御 ロ ジ ッ ク が必要以上に複雑にな り ます。
関 数 の イ ン ス タ ン シ エ ー シ ョ ン を 実 行す る に は、 GUI の [Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス の
[Directive] ド ロ ッ プダ ウ ン リ ス ト か ら [INSTANTIATE] を選択す る か、 コ ー ド にプ ラ グマ を挿入する か、 次の Tcl コ マ
ン ド を使用 し ます。
set_directive_function_instantiate -variable mode=true B
関数の イ ン ス タ ン シエーシ ョ ン を実行す る と 、 次に示す よ う に、 コ ー ド が 2 つの関数を含む も のに変更 さ れ、 それぞ
れがモー ド 値用に最適化 さ れます。
void A(){
B1();
B2();
B1();
B2();
}
void B1() {
// code segment 1
}
void B2() {
// code segment 2
}
関数 B か ら 作成 さ れた 2 つの新 し い関数 B1 と B2 では、 制御構造が簡略化 さ れてい ます。
関数が異な る 階層レベルで呼び出 さ れ、 イ ン ラ イ ン化をい く つ も 適用 し た り コ ー ド を変更 し た り し ない と 関数共有が
困難な場合、 関数の イ ン ス タ ン シエーシ ョ ンに よ り エ リ アが向上する こ と があ り ます。 ロ ーカルで最適化 さ れた小型
の関数の方が、 共有で き ない大型の関数が多数あ る よ り も 効率的です。
関数のデー タ フ ロー パイ プ ラ イ ン処理
デー タ フ ロ ー パ イ プ ラ イ ン処理は、 順次に記述 さ れた関数 (図 1-48) か ら 、 並列処理アーキ テ ク チ ャ (図 1-49) を作成
し ます。 デー タ フ ロ ー パ イ プ ラ イ ン処理は、 デザ イ ンの スループ ッ ト を向上する のに優れた方法です。
X-Ref Target - Figure 1-48
図 1‐48 : 順次関数記述
X-Ref Target - Figure 1-49
図 1‐49 : 並列処理アーキテ ク チ ャ
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
98
関数の最適化
図 1-49 に示すチ ャ ネルに よ り 、 前の関数がすべての演算を完了す る ま で待機す る よ う にな っ てい ま す。 図 1-50 に、
デー タ フ ロ ー パ イ プ ラ イ ン処理に よ り 関数が ど の よ う に並列実行 さ れ、デザ イ ン全体の スループ ッ ト を向上 し て レ イ
テ ン シ を削減す る か を示 し ます。
デー タ フ ロ ー パ イ プ ラ イ ン処理が使用 さ れていない 図 1-50 の (A) では、func_A が開始 し てか ら 再び新 し い入力を処
理で き る よ う にな る のに 8 サ イ ク ルかか り 、 func_C に よ り 出力が書 き 込まれ る ま でに 8 サ イ ク ルかか り ます (出力は
func_C の最後に書 き 込まれ る )。
図 1-50 (B) では、 func_A が開始 し てか ら 3 ク ロ ッ ク サ イ ク ル後に新 し い入力を処理で き (ス ループ ッ ト が向上)、 最
終的な値が出力に書 き 込まれ る ま でに 5 サ イ ク ルかか り ます (レ イ テ ン シが短縮)。
X-Ref Target - Figure 1-50
図 1‐50 : デー タ フ ロー パイ プ ラ イ ン処理
処理間のチ ャ ネルは、 デー タ の送信側 と 受信側のア ク セ ス パ タ ーンに よ っ て、 ピ ン ポ ン バ ッ フ ァ ーま たは FIFO で イ
ンプ リ メ ン ト さ れます。
•
関数パ ラ メ ー タ ー (送信側ま たは受信側) がア レ イ の場合、 チ ャ ネルはピ ン ポ ン バ ッ フ ァ ー と し て、 標準 メ モ リ
ア ク セ ス を使用 し てア ド レ ス信号 と 制御信号 と 共に イ ンプ リ メ ン ト さ れます。
•
ス カ ラ ー、 ポ イ ン タ ー、 参照パ ラ メ ー タ ー、 お よ び関数 リ タ ーンの場合は、 チ ャ ネルは FIFO と し て イ ンプ リ メ
ン ト さ れます。こ の場合、使用 さ れ る ハー ド ウ ェ ア リ ソ ース は少な く な り ますが (ア ド レ スは生成 さ れない)、デー
タ にシーケ ン シ ャ ルにア ク セ スす る 必要があ り ます。
重要 : デー タ フ ロ ー パ イ プ ラ イ ン処理を使用す る には、 引数を各関数で 2 回 し か使用で き ません。 1 回は送信側で 1
つの関数呼び出 し か ら (戻 り 引数を含む)、 も う 1 回は受信側で別の関数引数で使用 し ます。
デー タ フ ロ ー パ イ プ ラ イ ン処理は、 GUI の [Vivado HLSL Directive Editor] ダ イ ア ロ グ ボ ッ ク ス で [Directive] ド ロ ッ プ
ダ ウ ン リ ス ト か ら [DATAFLOW] を選択す る か、 set_directive_dataflow コ マ ン ド を使用 し ます。 関数に対 し て こ の指示
子を設定す る と 、 Vivado HLS でその関数内の関数の並列処理を向上す る よ う 処理 さ れ ま す。 図 1-50 に示す例では、
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
99
関数の最適化
次の コ マ ン ド を使用す る と 関数 func_A、 func_B、 お よ び func_C に対 し てデー タ フ ロ ー パ イ プ ラ イ ン処理が実行 さ れ
ます。
set_directive_dataflow top
デー タ フ ロ ー パ イ プ ラ イ ン処理を使用する と 、デフ ォ ル ト では Vivado HLS で各 RTL ブ ロ ッ ク を同 じ ク ロ ッ ク エ ッ
ジで開始で き る か ど う かが試み ら れます。 デー タ の依存性に よ り 前の関数か ら デー タ が供給 さ れ る ま で次の関数を実
行で き ない場合 (図 1-50 の (B) では func_B は func_A が i1 を生成す る ま で 1 ク ロ ッ ク サ イ ク ル待つ必要があ る )、1 つ
のブ ロ ッ ク の開始 と 次のブ ロ ッ ク の開始間隔が可能な最小サ イ ク ル数に調整 さ れます。
ス カ ラ ー値の場合、 最大チ ャ ネル サ イ ズは 1 で、 1 つの関数か ら 別の関数に渡す こ と ので き る 値は 1 つのみです。 関
数引数 と し てア レ イ を使用す る と 、チ ャ ネル ( メ モ リ ) の要素数は受信側ア レ イ ま たは送信側ア レ イ の最大サ イ ズで定
義 さ れます。 Vivado HLS では、 デフ ォ ル ト のチ ャ ネル ワ ー ド 数を指定で き ます (次の 「デー タ フ ロ ー メ モ リ の設定」
セ ク シ ョ ン を参照)。
関数にデー タ フ ロ ー パ イ プ ラ イ ン処理を適用す る と 、 現在の階層 レベルの下位関数のみがパ イ プ ラ イ ン処理 さ れ ま
す。 下位関数に別の関数が含まれてお り 、 デー タ フ ロ ー パ イ プ ラ イ ン処理が有益であ る 場合、 下位関数を イ ン ラ イ ン
化 し て、 すべての関数が同 じ 階層レベルにな る よ う に し ます。
デー タ フ ロー メ モ リ の設定
関数 イ ン タ ーフ ェ イ ス間で使用 さ れ る デフ ォ ル ト のチ ャ ネルは、 config_dataflow コ マ ン ド を使用 し て指定で き ます。
こ の コ マ ン ド を使用す る と 、 ソ リ ュ ーシ ョ ンのデフ ォ ル ト 操作を設定で き ます。 デザ イ ンのすべてのチ ャ ネルに対す
る デフ ォ ル ト のチ ャ ネル サ イ ズお よ び イ ンプ リ メ ン テーシ ョ ン を指定可能です。
config_dataflow -default_channel (fifo | *pingpong*) -fifo_depth <FIFO size>
チ ャ ネルのサ イ ズは、 受信側ア レ イ ま たは送信側ア レ イ の最大サ イ ズで定義 さ れます。 こ れに よ り 、 チ ャ ネルに常に
損失な し にサンプルすべて を維持で き る よ う にな り ますが、 場合に よ っ ては、 こ れは控えめすぎ る 設定であ る こ と が
あ り ます。 こ れは、 ビデオ ス ト リ ームや通信ス ト リ ーム な ど のデー タ 間隔が 1 のデザ イ ンに よ く 見 ら れます。 こ の場
合、 生成側ブ ロ ッ ク ま たはループが新 し いデー タ 値を出力する と 、 消費側ブ ロ ッ ク ま たはループでそれが読み出 さ れ
る ので、 チ ャ ネルは 1 つの値のみを維持す る 必要があ り ます。 こ の場合、 元のア レ イ サ イ ズで定義 さ れた メ モ リ は無
駄にな り ます。
チ ャ ネ ル で 使 用 さ れ る メ モ リ サ イ ズ を 削減す る に は、 FIFO を 使用 で き ま す。 FIFO を 使用す る と 、 前述 の
config_dataflow コ マ ン ド の よ う に、-fifo_depth オプシ ョ ン を使用 し て深 さ (FIFO のエ レ メ ン ト 数) を明確に指定で き ま
す。
FIFO のサ イ ズ を指定す る と 、 デフ ォ ル ト の設定が上書 き さ れます。 指定 し た FIFO サ イ ズ よ り も デザ イ ンのブ ロ ッ ク
が高い レー ト でサ ン プルを生成ま たは消費す る 場合は、 FIFO が空ま たはフルにな っ て、 デザ イ ン が停止 し 、 読み出
し (ま たは書き 込み) がで き な く な り 、 停止 し た ま ま回復で き ない状態にな り ます。 こ れは、 協調シ ミ ュ レーシ ョ ン を
実行す る 場合、 ま たは こ のブ ロ ッ ク が完全なシ ス テ ムで使用 さ れ る 場合にのみ発生 し ます。
こ の よ う な場合、 デフ ォ ル ト の深 さ で FIFO を使用 し て、 RTL 協調シ ミ ュ レーシ ョ ン で問題がなか っ たか ど う か を確
認 し てか ら 、 FIFO のサ イ ズ を削減 し て、 RTL 協調シ ミ ュ レーシ ョ ン がそれで も 問題ないか ど う か を確認す る こ と を
お勧め し ます。 RTL 協調シ ミ ュ レーシ ョ ンがエ ラ ーにな る 場合は、 FIFO のサ イ ズが小 さ すぎ て、 停止を回避で き な
か っ た可能性があ り ます。
こ の場合、 レ ジ ス タ を い く つか戻 し て、 停止 し た RTL シ ミ ュ レーシ ョ ン をデバ ッ グ し て原因を探 る よ り も 、 デフ ォ
ル ト の FIFO サ イ ズ を予想 さ れ る 最小の値 よ り も 大 き い値に設定 し て、 RTL 協調シ ミ ュ レーシ ョ ンの終了を確認 し て
か ら 、 次に進む方が生産的です。
デフ ォ ル ト のチ ャ ネル タ イ プが FIFO で、 set_directive_stream コ マ ン ド を使用 し て ア レ イ が ス ト リ ー ミ ン グ以外に設
定 さ れてい る 場合、そのア レ イ のチ ャ ネル イ ンプ リ メ ン テーシ ョ ンはデフ ォ ル ト で pingpong チ ャ ネルにな り ます (明
示的なデ ィ レ ク ト リ に よ り コ ン フ ィ ギ ュ レーシ ョ ンが変更 さ れ る )。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
100
関数の最適化
関数のパイ プ ラ イ ン処理
デー タ フ ロ ー パ イ プ ラ イ ン処理では関数間の通信が最適化 さ れて スループ ッ ト が向上 し ますが、関数のパ イ プ ラ イ ン
処理では関数内の操作が最適化 さ れ、 スループ ッ ト が向上 さ れます。
図 1-51 に、 関数のパ イ プ ラ イ ン処理に よ る ス ループ ッ ト の向上を示 し ます。 関数のパ イ プ ラ イ ン処理では、 操作が
同時に実行 さ れます。 関数が次の操作を開始す る 前にすべての操作を完了す る 必要はあ り ません。
X-Ref Target - Figure 1-51
図 1‐51 : 関数のパイ プ ラ イ ン処理
パ イ プ ラ イ ン処理 さ れていない場合、 関数で入力が 3 ク ロ ッ ク サ イ ク ルご と に読み出 さ れ、 値が 2 サ イ ク ルご と に出
力 さ れます。 パ イ プ ラ イ ン処理を実行す る と 、 新 し い入力は各サ イ ク ルで読み出 さ れ、 出力レ イ テ ン シ ま たは使用 さ
れ る リ ソ ース に変化はあ り ません。
関数のパ イ プ ラ イ ン処理は、 パ イ プ ラ イ ン処理の妨げ と な る リ ソ ース の競合やデー タ の依存性がない場合にのみ可能
です。 た と えば、 図 1-52 でア レ イ m[2] がシ ン グル ポー ト RAM に イ ン プ リ メ ン ト さ れてい る と す る と 、 図 1-52 の
(A) に示す よ う に、 入力 m[2] に対す る 2 つの読み出 し (op_Read_m[0] お よ び op_Read_m[1]) を同 じ ク ロ ッ ク サ イ ク ル
で実行す る こ と はで き ないので、 関数はパ イ プ ラ イ ン処理で き ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
101
関数の最適化
X-Ref Target - Figure 1-52
図 1‐52 : パイ プ ラ イ ン処理によ る リ ソ ースの競合
こ の関数は、 図 1-53 の (B) に示す よ う にパ イ プ ラ イ ンの開始間隔を増加する と 、 パ イ プ ラ イ ン処理で き ます。 開始間
隔は、 入力の読み出 し 間のサ イ ク ル数です。
図 1-52 の (A) では新 し い操作が各 ク ロ ッ ク サ イ ク ルで実行 さ れ る ので、 開始間隔は 1 です。 図 1-52 の (B) では開始
間隔 2 が使用 さ れてお り 、 入力ポー ト で リ ソ ース の競合が発生する こ と はな く な り 、 関数が正 し く パ イ プ ラ イ ン処理
さ れてい ます。
注記 : リ ソ ース の競合は、ポー ト に対す る 読み出 し お よ び書 き 込み、使用可能な乗算器が 1 つのみな ど限 ら れた リ ソ ー
スへのア ク セ ス、 ま たは RAM ま たは FIFO にマ ッ プ さ れた ア レ イ の読み出 し お よ び書 き 込みに よ り 発生す る こ と が
あ り ます。
パ イ プ ラ イ ン処理で適切な開始間隔が達成で き なか っ た場合の リ ソ ース競合については、 「ア レ イ の最適化」 お よ び
「ハー ド ウ ェ ア リ ソ ー ス の制御」 を参照 し て く だ さ い。 図 1-52 の リ ソ ー ス 競合は、 ア レ イ m[2] にデ ュ アル ポー ト
RAM を使用 し て、 同 じ ク ロ ッ ク サ イ ク ルで 2 つの読み出 し を実行で き る よ う に し て も 解決で き ます。
関数のパ イ プ ラ イ ン処理は、 次の Tcl コ マ ン ド を使用 し て適用で き ます。
set_directive_pipeline function_foo
ま たは、GUI の [Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス で [Directive] ド ロ ッ プダ ウ ン リ ス ト か ら [PIPELINE]
を選択 し ます。 パ イ プ ラ イ ン処理は、 指定の関数の階層に適用 さ れます。 その階層の下にあ る すべての下位関数はす
べて イ ン ラ イ ン化 さ れ、 階層内のループは展開 さ れます。
デフ ォ ル ト では、 関数のパ イ プ ラ イ ン処理に よ り 恒久的に実行 さ れ る パ イ プ ラ イ ンが作成 さ れ ます。 -flush オプシ ョ
ン を使用す る と 、 パ イ プ ラ イ ン を フ ラ ッ シ ュ し て空にす る こ と がで き ます。 パ イ プ ラ イ ン を フ ラ ッ シ ュ す る と 、 パ イ
プ ラ イ ンの開始時にデー タ Valid 信号に よ り デー タ がない こ と が示 さ れた と き に、 新 し い入力の読み出 し は停止 さ れ
ますが、 処理は継続 さ れ、 最後の入力が処理 さ れて出力 さ れ る ま で、 1 段ずつパ イ プ ラ イ ン段を閉鎖 し てい き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
102
ループの最適化
レ イ テ ン シ制約
Vivado HLS では、 関数に レ イ テ ン シ制約を使用で き ます。 関数に最大制約ま たは最小制約を設定する と 、 Vivado HLS
で関数のすべての操作が指定の ク ロ ッ ク サ イ ク ル内に完了する よ う 処理 さ れます。
レ イ テ ン シ制約は、 図 1-47 に示す [Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス で [Directive] ド ロ ッ プダ ウ ン リ
ス ト か ら [LATENCY] を選択す る か、 set_directive_latency コ マ ン ド を使用 し ます。
set_directive_latency -min 3 -max 5 function_foo
次は、 レ イ テ ン シ制約を満たす こ と がで き ない イ ベン ト があ る 場合の Vivado HLS の ビヘ イ ビ アーについて説明 し ま
す。
レ イ テ ン シ を満たす こ と がで き ない原因が タ イ ミ ン グ違反にあ る 場合、 Vivado HLS では ロ ーカル タ イ ミ ン グ違反を
使用 し て制約を維持す る こ と がで き ます。使用可能な ロ ーカル タ イ ミ ン グ違反は Vivado HLS で制御 さ れ る ので、ユー
ザーが制御す る 必要はあ り ません。
こ の場合の最適化 ス ト ラ テ ジは、 レ イ テ ン シ制約を満た し て、 タ イ ミ ン グ違反が RTL ロ ジ ッ ク 合成中に修正 さ れ る
か ど う か を確認す る ための も のです。 タ イ ミ ン グ違反が論理合成で満たすには大 き すぎ る 場合は、 「 ロ ジ ッ ク 構造の
最適化」 の手法を使用 し て ロ ジ ッ ク 遅延を削減 し てみて く だ さ い。
デー タ の依存性や複数の タ イ ミ ン グ制約があ る ため、 ま たは タ イ ミ ン グ違反が大き すぎ る な ど の原因で、 Vivado HLS
で レ イ テ ン シ制約を満たす こ と がで き ない場合は、Vivado HLS で レ イ テ ン シ制約が緩め ら れ、可能な限 り 最適な結果
を達成 し よ う と さ れます。
最小の レ イ テ ン シ制約が設定 さ れ、Vivado HLS で必要 と さ れ る 最小値 よ り も 小 さ い レ イ テ ン シでデザ イ ンが生成 さ れ
る 場合は、 単にダ ミ ー ク ロ ッ ク サ イ ク ルを挿入 し て最小レ イ テ ン シ を満たそ う と し ます。
すべての レ イ テ ン シ制約が満た さ れてい る か ど う かを確認す る には、 制約レ ポー ト を参照 し て く だ さ い。
関数のイ ン タ ー フ ェ イ ス プ ロ ト コ ル
Vivado HLS には、 関数の イ ン タ ーフ ェ イ ス プ ロ ト コ ルを作成す る 機能があ り ます。 関数を合成す る と 、 各関数パ ラ
メ ー タ ー、 関数の戻 り 値、 お よ び関数に よ り ア ク セ ス さ れ る グ ロ ーバル変数が、 最終的な RTL デザ イ ン では入力ポー
ト ま たは出力ポー ト と し て イ ン プ リ メ ン ト さ れ ます。 グ ロ ーバル変数の合成に関す る 詳細は、 「デー タ 型」 セ ク シ ョ
ン で説明 さ れてい ます。 こ れ ら のポー ト に加え、 Vivado HLS では関数の制御ポー ト を合成で き 、 RTL イ ン プ リ メ ン
テーシ ョ ン を周辺のシ ス テ ムに統合で き る よ う に し ます。
イ ン タ ーフ ェ イ ス プ ロ ト コ ルでは、 1 に設定する こ と に よ り 関数の実行を開始する 入力信号 (ap_start)、 関数がすべて
の操作を完了 し た こ と を示す出力信号 (ap_done)、 お よ び関数で操作が実行 さ れていない こ と を示すア イ ド ル出力信
号 (ap_idle) が供給 さ れます。
関数レベルの イ ン タ ーフ ェ イ ス プ ロ ト コ ルが追加 さ れので、 プ ロ ト コ ルの イ ン プ リ メ ン テーシ ョ ン の詳細を ソ ース
コ ー ド に記述す る 必要はな く 、 アルゴ リ ズ ムの高位仕様を保つ こ と がで き ます。
イ ン タ ーフ ェ イ ス プ ロ ト コ ルは階層の関数に適用で き ますが、 最上位関数にのみ適用 し 、 Vivado HLS に よ り 下位関
数間の最適な通信が ス ケ ジ ュ ー リ ン グ さ れ る よ う にす る こ と をお勧め し ます。
関数の イ ン タ ーフ ェ イ ス プ ロ ト コ ルについては、 「 イ ン タ ーフ ェ イ ス の管理」 を参照 し て く だ さ い。
ループの最適化
関数内の C 言語記述は、 一般的に複数のループに よ り 構成 さ れ ます。 HLS でループが ど の よ う に イ ン プ リ メ ン ト お
よ び最適化 さ れ る か、 ループ階層が ど の よ う に影響す る か を理解す る こ と は、 には、 RT レベルで最良のパフ ォーマ
ン ス を達成す る ために重要です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
103
ループの最適化
ループに指定可能な指示子は、 GUI に リ ス ト さ れます (図 1-53)。
1.
[Explorer] タ ブで ソ ース コ ー ド を ダブル ク リ ッ ク し て開 き ます。
2.
補足エ リ アで [Directive] タ ブ を ク リ ッ ク し ます。
3.
ループ を右 ク リ ッ ク し て [Insert Directives] を ク リ ッ ク し ます。
4.
[Directive] ド ロ ッ プダ ウ ン リ ス ト か ら 適切な指示子を選択 し 、 オプシ ョ ン を設定 し ます。
X-Ref Target - Figure 1-53
図 1‐53 : ループの指示子
重要 : ループに適用で き る 指示子すべてがループの最適化に関連 し てい る わけではあ り ません。
た と えば、 BALANCE 指示子をループに適用する と 、 ループで作成 さ れた ロ ジ ッ ク 構造に適用 さ れます。 ロ ジ ッ ク 最
適化については、 別の章で説明 し ます。
表 1-7 に、 ループに適用可能な最適化を、 こ の章で説明す る 順に示 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
104
ループの最適化
表 1‐7 : ループ レ ベルの最適化
GUI 指示子
説明
UNROLL
for ループ を展開 し 、 複数の操作を 1 つに ま と めた も のではな
く 、 複数の個別の操作を作成 し ます。
MERGE
連続す る ループ を結合 し て、 全体的な レ イ テ ン シ を削減 し 、 共
有お よ び最適化を向上 し ます。
FLATTEN
ネ ス ト さ れたループ を 1 つのループに し 、 レ イ テ ン シお よ び ロ
ジ ッ ク 最適化を向上 し ます。
DATAFLOW
シーケ ン シ ャ ル ループ を同時に実行で き る よ う に し ます。
PIPELINE
並列演算を実行する こ と に よ り 開始間隔を改善 し ます。
DEPENDENCE
ループ キ ャ リ ー依存性を解決す る た めの追加情報を供給 し ま
す。
TRIPCOUNT
反復解析を設定 し ます。
LATENCY
ループ操作のサ イ ク ル レ イ テ ン シ を指定 し ます。
ループの展開
Vivado HLS のデ フ ォ ル ト では、 ループは展開 さ れ ま せん。 つ ま り 、 ループは 1 つのエ ン テ ィ テ ィ と し て処理 さ れ、
ループのすべての操作は同 じ ハー ド ウ ェ ア リ ソ ース を使用 し て イ ンプ リ メ ン ト さ れます。
Vivado HLS には、 for ループの一部ま たは全体を展開す る 機能があ り ます。
図 1-54 に、 ループ展開の利点 と 、 ループ を展開す る 際の考慮事項を示 し ま す。 図 1-54 の例では、 ア レ イ a[i]、 b[i]、
お よ び c[i] は RAM にマ ッ プ さ れ る と 想定 さ れてい ます。 ア レ イ が順次エ レ メ ン ト にマ ッ プ さ れない場合、 サ イ ク ル
数は乗算器の組み合わせ遅延に よ り 決ま り ます。
図 1-54 か ら まず最初にわか る こ と は、 ループの展開を適用 し ただけで多数の イ ン プ リ メ ン テーシ ョ ン を作成で き る
と い う こ と です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
105
ループの最適化
X-Ref Target - Figure 1-54
図 1‐54 : ループの展開
•
未展開のループ : ループが展開 さ れていない場合、 各反復は異な る ク ロ ッ ク サ イ ク ルで実行 さ れます。 こ の イ ン
プ リ メ ン テーシ ョ ンは 4 ク ロ ッ ク サ イ ク ルかか り 、1 つの乗算器のみが必要で、各 RAM はシ ン グル ポー ト RAM
にで き ます。
•
部分的に展開 さ れた ループ : こ の例では、 ループが係数 2 で部分的に展開 さ れてい ます。 こ の イ ンプ リ メ ン テー
シ ョ ンには、 各 RAM に対 し て 2 つの読み出 し ま たは書き 込みを同 じ ク ロ ッ ク サ イ ク ルで実行する ため乗算器 2
つ と デ ュ アル ポー ト RAM が必要ですが、 2 ク ロ ッ ク サ イ ク ルで完了 し 、 未展開のループ と 比較す る と 開始間隔
は 1/2、 レ イ テ ン シは 1/2 にな り ます。
•
完全に展開 さ れた ループ : ループ操作全体を完全に展開 し た例は、 1 ク ロ ッ ク サ イ ク ルで実行で き ますが、 乗算
器が 4 つ必要で、 4 つの読み出 し 操作 と 4 つの書 き 込み操作を同 じ ク ロ ッ ク サ イ ク ルで実行す る 必要があ り ま
す。 ク ワ ッ ド ポー ト RAM は一般的ではないので、 ア レ イ を RAM ではな く レ ジ ス タ のア レ イ で イ ンプ リ メ ン ト
す る か、 ア レ イ のパーテ ィ シ ョ ン ま たはア レ イ の構成の変更が必要にな り ます。
ア レ イ の イ ンプ リ メ ン ト 方法 (一部ま たはすべて を RAM にマ ッ プ)、 乗算器の遅延に よ っ ては、 こ の単純な例にはほ
かに も 多数の イ ンプ リ メ ン テーシ ョ ンが可能です。
ループの展開は、 GUI の 図 1-47 に示す [Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス で [Directive] ド ロ ッ プダ ウ
ン リ ス ト か ら [UNROLL] を選択 し て、 個々のループに指示子を適用 し ます。 ま たは、 関数自体に UNROLL 指示子を
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
106
ループの最適化
設定 し 、 関数内のすべての for ループに適用で き ます (図 1-47)。 特定のループ を展開す る には、 次の Tcl コ マ ン ド を
使用 し ます。
set_directive_unroll -skip_exit_check -factor 2 top/for_mult
set_directive_unroll コ マ ン ド は、 指示子を プ ラ グマ と し て ソ ー ス コ ー ド に挿入 し てい る 場合以外は、 ラ ベルの付け ら
れたループにのみ適用可能です (図 1-54)。 指示子を プ ラ グ マ と し て ソ ース コ ー ド に挿入す る と 、 コ ー ド のすべての
バージ ョ ンに適用 さ れます。
ループ を部分的に展開す る 場合、 展開係数を最大反復回数の整数倍にす る 必要はあ り ません。 Vivado HLS では、 部分
的に展開 さ れたループが元のループ と 同 じ よ う に動作す る こ と を確認す る チ ェ ッ ク が追加 さ れます。 た と えば、 次の
よ う な コ ー ド があ る と し ます。
for(int i = 0; i < N; i++) {
a[i] = b[i] + c[i];
}
ループ を係数 2 で展開す る と 、 RTL に イ ンプ リ メ ン ト し た と き に機能が同 じ にな る よ う に、 コ ー ド が break コ ン ス ト
ラ ク ト を使用 し た次の よ う な も のにな り ます。
for(int i = 0; i < N; i += 2) {
a[i] = b[i] + c[i];
if (i+1 >= N) break;
a[i+1] = b[i+1] + c[i+1];
}
N は変数なので、 Vivado HLS で最大値を特定で き ない場合があ り ます (入力ポー ト で駆動 さ れてい る 可能性あ り )。 展
開係数 ( こ の例の場合は 2) が最大反復数 N の整数倍であ る こ と がわかっ てい る 場合は、-skip_exit_check オプシ ョ ン を
使用 し て終了時のチ ェ ッ ク を削除で き ます。 展開の結果は、 次の よ う にな り ます。
for(int i = 0; i < N; i += 2) {
a[i] = b[i] + c[i];
a[i+1] = b[i+1] + c[i+1];
}
こ れに よ り エ リ アが最小限に抑え ら れ、 制御 ロ ジ ッ ク が簡略化 さ れます。
C++ ク ラ スのループの展開
ループ を C++ ク ラ ス で使用す る 場合、 ループ帰納変数が ク ラ ス のデー タ メ ンバーにな ら ない よ う に注意す る 必要が
あ り ます。 ループ帰納変数が ク ラ ス のデー タ メ ンバーにな る と 、 ループ を展開で き な く な り ます。
こ の例では、 ループ帰納変数 k が ク ラ ス foo_class の メ ンバーです。
template <typename T0, typename T1, typename T2, typename T3, int N>
class foo_class {
private:
pe_mac<T0, T1, T2> mac;
public:
T0 areg;
T0 breg;
T2 mreg;
T1 preg;
T0 shift[N];
int k;
// Class Member
T0 shift_output;
void exec(T1 *pcout, T0 *dataOut, T1 pcin, T3 coeff, T0 data, int col)
{
Function_label0:;
#pragma HLS inline off
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
107
ループの最適化
SRL:for (k = N-1; k >= 0; --k) {
#pragma HLS unroll// Loop will fail UNROLL
if (k > 0)
shift[k] = shift[k-1];
else
shift[k] = data;
}
*dataOut = shift_output;
shift_output = shift[N-1];
}
*pcout = mac.exec1(shift[4*col], coeff, pcin);
};
UNROLL プ ラ グマ指示子で指定 し た よ う に Vivado HLS でループ を展開で き る よ う にす る には、 コ ー ド を記述 し 直
し て k を ク ラ ス メ ンバーか ら はずす必要があ り ます。
template <typename T0, typename T1, typename T2, typename T3, int N>
class foo_class {
private:
pe_mac<T0, T1, T2> mac;
public:
T0 areg;
T0 breg;
T2 mreg;
T1 preg;
T0 shift[N];
T0 shift_output;
void exec(T1 *pcout, T0 *dataOut, T1 pcin, T3 coeff, T0 data, int col)
{
Function_label0:;
int k;
// Local variable
#pragma HLS inline off
SRL:for (k = N-1; k >= 0; --k) {
#pragma HLS unroll// Loop will unroll
if (k > 0)
shift[k] = shift[k-1];
else
shift[k] = data;
}
*dataOut = shift_output;
shift_output = shift[N-1];
}
*pcout = mac.exec1(shift[4*col], coeff, pcin);
};
ループの結合
展開 さ れたループか ら は、少な く と も 1 つの ス テー ト を持つ有限ス テー ト マシ ン (FSM) が作成 さ れます。複数のシー
ケ ン シ ャ ル ループがあ る 場合、 こ れに よ り 余分な ク ロ ッ ク サ イ ク ルが追加 さ れ、 こ れ以上の最適化がで き な く な り
ます。
図 1-55 に、 簡潔に見え る コ ー ド 記述が RTL デザ イ ンのパフ ォーマ ン ス に悪影響を与えてい る 例を示 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
108
ループの最適化
X-Ref Target - Figure 1-55
図 1‐55 : ループの指示子
図 1-55 (A) は、 デフ ォ ル ト では展開 さ れた各ループか ら 、 FSM3 に最低 1 つ (実行 さ れ る 操作の回数に よ り こ れ以上)
の ス テー ト が作成 さ れます。 こ れ ら の ス テー ト 間の遷移に よ り 、 ク ロ ッ ク サ イ ク ルが浪費 さ れます。 各ループの反復
に 1 ク ロ ッ ク サ イ ク ルかか る と す る と 、 両方のループを実行する のに 11 サ イ ク ルかか り ます。
•
Add ループに入る のに 1 ク ロ ッ ク サ イ ク ル
•
Add ループ を実行す る のに 4 ク ロ ッ ク サ イ ク ル
•
Add ループ を抜けて Sub ループに入る のに 1 ク ロ ッ ク サ イ ク ル
•
Sub ループ を実行す る のに 4 ク ロ ッ ク サ イ ク ル
•
Sub ループ を抜け る のに 1 ク ロ ッ ク サ イ ク ル
•
合計 11 ク ロ ッ ク サ イ ク ル
こ の単純な例では、 Add ループに else 分岐を追加す る こ と に よ り 問題を解決で き る こ と は簡単にわか り ますが、 よ り
複雑な コ ー ド ではそ う 簡単にはわか ら ない可能性 も あ り 、同 じ デザ イ ン チームのほかの設計者が複雑なアルゴ リ ズ ム
を簡単に理解で き る よ う に、 よ り わか り やすい コ ー ド 記述を使用 し た方が有益か も し れません。 同 じ 結合操作を実行
す る のに、 複数の if-else 文を追加す る な ど、 文を追加する と 、 コ ー ド が理解 し に く く な る 可能性があ り ます。
Vivado HLS には、ループ を結合す る 機能があ り ます。関数 (ま たは両方のループ を含む領域) に対 し て、GUI の [Vivado
HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス で [Directive] ド ロ ッ プダ ウ ン リ ス ト か ら [MERGE] を選択す る と 、 Vivado
HLS でループが結合 さ れ、 図 1-55 (B) に示す 6 ク ロ ッ ク サ イ ク ルで完了す る も の と 同様の制御構造が作成 さ れます。
現在の と こ ろ、 Vivado HLS のループの結合には次の制限があ り ます。
•
ループの範囲がすべて変数であ る 場合は、 同 じ 値であ る 必要があ り ます。
•
ループの範囲が定数であ る 場合は、 最大定数値が結合 さ れたループの範囲 と し て使用 さ れます。
•
変数範囲 と 定数範囲の両方を使用す る ループは結合で き ません。
•
結合 さ れ る ループの間の コ ー ド に よ る 影響がない こ と を確認 し ます。 つま り 、 こ の コ ー ド を複数回実行 し た と き
に、 同 じ 結果が得 ら れ る よ う に し ます。 た と えば、 a=b は使用で き ますが、 a=a+1 は使用で き ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
109
ループの最適化
•
ループに FIFO の読み出 し が含まれてい る 場合は結合で き ません。 FIFO か ら の読み出 し ま たは FIFO イ ン タ ー
フ ェ イ ス は常に正 し い順序であ る 必要があ り ますが、 FIFO の読み出 し が含ま れてい る ループ を結合す る と 、 読
み出 し の順序が変更 さ れます。
ループの結合は、 コ マ ン ド ラ イ ン で set_directive_loop_merge コ マ ン ド を 使用す る か、 GUI の [Vivado HLS Directive
Editor] ダ イ ア ロ グ ボ ッ ク ス で [Directive] ド ロ ッ プダ ウ ン リ ス ト か ら [MERGE] を選択 し ます。
set_directive_loop_merge top
ネス ト 化 さ れたループの フ ラ ッ ト 化
前のセ ク シ ョ ンで説明 し た連続す る ループ と 同 じ よ う に、展開 さ れていないネ ス ト (入れ子) にな っ たループ間を移動
す る のに も 追加の ク ロ ッ ク サ イ ク ルが必要です。外側のループか ら 内側のループに、 内側のループか ら 外側のループ
に移動す る のに 1 ク ロ ッ ク サ イ ク ルかか り ます。
次に示す例では、 ループ Outer を実行す る のに 200 ク ロ ッ ク サ イ ク ル余分にかか る こ と にな り ます。
void foo_top { a, b, c, d} {
...
Outer: while(j<100)
Inner: while(i<6)// 1 cycle to enter inner
...
LOOP_BODY
...
}
// 1 cycle to exit inner
}
...
}
ま た、 ループがネ ス ト にな っ てい る と 、 「ループのデー タ フ ロ ー パ イ プ ラ イ ン処理」 に説明す る よ う に、 外側のルー
プ をパ イ プ ラ イ ン処理で き ません。
Vivado HLS では set_directive_loop_flatten コ マ ン ド が提供 さ れてお り 、 ラ ベル付 き の完全なネ ス ト ループお よ びほぼ
完全なネ ス ト ループ を フ ラ ッ ト 化で き 、 最高のハー ド ウ ェ ア パフ ォ ーマ ン ス を得 る ために コ ー ド を記述 し 直す必要
はな く 、 ループ内の操作を実行す る のにかか る サ イ ク ル数を削減 し ます。
•
完全なループ ネ ス ト : 最内側のループのみにループ本体があ り 、 ループ文の間に ロ ジ ッ ク は指定 さ れてお ら ず、
すべてのループ範囲が定数
•
ほぼ完全なループ ネ ス ト : 最内側のループのみにループ本体があ り 、ループ文の間に ロ ジ ッ ク は指定 さ れていな
いが、 最外側ループの範囲が変数
内側のループの範囲が変数であ っ た り 、 ループ本体が最内側のループにのみ含まれてい る と は限 ら ない不完全ループ
ネ ス ト は、 コ ー ド の構造を変更す る か、 ループ本体の中のループ を展開 し て、 完全ループ ネ ス ト を作成 し てみて く だ
さ い。
ネ ス ト さ れた ループに指示子を適用す る 際は、 ループ本体を含む最内側のループに適用する 必要があ り ます。
set_directive_loop_flatten top/Inner
ループの フ ラ ッ ト 化は、 GUI の [Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス を使用 し て も 指定で き ます。 個々の
ループに、 ま たは関数レベルで指示子を適用 し て関数に含まれ る すべてのループに設定で き ます。
ループのデー タ フ ロー パイ プ ラ イ ン処理
ループに も 、 関数 と 同様にデー タ フ ロ ー パ イ プ ラ イ ン処理を適用で き ます。 デー タ フ ロ ー パ イ プ ラ イ ン処理を適用
す る と 、 通常順次に実行 さ れ る ループ を RTL で同時実行で き ます。 デー タ フ ロ ー パ イ プ ラ イ ン処理は、 関数、 ルー
プ、 あ る いは関数ま たはループのみを含む領域に適用する 必要があ り ます。 ループ と 関数が混合 し てい る 領域には適
用 し ないで く だ さ い。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
110
ループの最適化
図 1-56 に、 ループにデー タ フ ロ ー パ イ プ ラ イ ン処理を適用 し た場合の利点を示 し ます。
X-Ref Target - Figure 1-56
図 1‐56 : ループのデー タ フ ロー パイ プ ラ イ ン処理
デー タ フ ロ ー パ イ プ ラ イ ン処理を適用 し ない場合、 ループ N のすべての反復が実行 さ れて完了す る ま で、 ループ M
は開始で き ません。 同様に、 ループ P も ループ M が完了す る ま で実行で き ません。 こ の例では、 ループ N が次の値
の処理を開始す る ま でに 8 サ イ ク ル、 出力が書 き 込まれ る ま でに 8 サ イ ク ルかか り ます (出力はループ P が完了 し て
か ら 書 き 込まれ る )。
デー タ フ ロ ー パ イ プ ラ イ ン処理を適用す る と 、 こ れ ら のループ を並列実行で き る よ う にな り 、 同 じ ハー ド ウ ェ ア リ
ソ ース を使用 し て、 新 し い値を 3 サ イ ク ルご と に処理で き 、 出力は 5 サ イ ク ルご と に書 き 込まれます。 Vivado HLS で
は、 ループの間にチ ャ ネルが挿入 さ れ、 デー タ が 1 つのループか ら 次のループに非同期に流れ る よ う に し ます。
ループ間のチ ャ ネルは、 ピ ン ポ ン バ ッ フ ァ ーま たは FIFO と し て イ ンプ リ メ ン ト さ れます。
•
変数がア レ イ の場合、 チ ャ ネルはピ ン ポ ン バ ッ フ ァ ー と し て、 標準 メ モ リ ア ク セ ス を使用 し てア ド レ ス信号 と
制御信号 と 共に イ ンプ リ メ ン ト さ れます。
•
その他すべての変数型お よ びス ト リ ー ミ ン グ ア レ イ の場合は、 チ ャ ネルは FIFO と し て イ ンプ リ メ ン ト さ れま
す。 こ の場合、 使用 さ れ る ハー ド ウ ェ ア リ ソ ース は少な く な り ますが (ア ド レ ス は生成 さ れない)、 デー タ にシー
ケ ン シ ャ ルにア ク セ スす る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
111
ループの最適化
重要 : デー タ フ ロ ー パ イ プ ラ イ ン処理を使用す る には、 変数が 1 つのループで生成 さ れ、 別の 1 つのループでのみ使
用 さ れ る よ う にす る こ と が必要です。
デー タ フ ロ ー パ イ プ ラ イ ン処理は、 GUI の [Vivado HLSL Directive Editor] ダ イ ア ロ グ ボ ッ ク ス で [Directive] ド ロ ッ プ
ダ ウ ン リ ス ト か ら [DATAFLOW] を選択す る か、 set_directive_dataflow コ マ ン ド を使用 し ます。 領域に対 し て こ の指示
子を設定す る と 、 Vivado HLS でその領域内のループの並列処理を向上す る よ う 処理 さ れます。 図 1-56 に示す例では、
次の コ マ ン ド を使用す る と 、 ループ Loop_N、 Loop_M、 お よ び Loop_P に対 し てデー タ フ ロ ー パ イ プ ラ イ ン処理が実
行 さ れます。
set_directive_dataflow top
Vivado HLS は、 で き る だけ最大の レー ト ( ク ロ ッ ク サ イ ク ルご と に新 し いサンプル) にす る ため、 ループ間のデー タ
フ ロ ーを常にパ イ プ ラ イ ン処理 し よ う と し ますが、 デー タ フ ロ ー パ イ プ ラ イ ン のループが毎 ク ロ ッ ク サ イ ク ルに 1
サ ン プルの レー ト では動作で き ない こ と があ り ま す。 こ の よ う な場合、 Vivado HLS では ス ループ ッ ト 1 が達成で き
ず、 達成可能な最小開始間隔でデザ イ ンが作成 さ れ る こ と を示す メ ッ セージが表示 さ れます。
チ ャ ネル ( メ モ リ ) の要素数は受信側ア レ イ ま たは送信側ア レ イ の最大サ イ ズで定義 さ れ ますが、 Vivado HLS ではデ
フ ォ ル ト のチ ャ ネル ワ ー ド 数を指定で き ます (次の 「デフ ォ ル ト のチ ャ ネルの設定」 セ ク シ ョ ン を参照)。
デ フ ォル ト のチ ャ ネルの設定
ループ間で使用 さ れ る デフ ォ ル ト のチ ャ ネルは、 config_dataflow コ マ ン ド を使用 し て指定で き ます。 こ の コ マ ン ド を
使用す る と 、 ソ リ ュ ーシ ョ ンのデフ ォ ル ト 操作を設定で き ます。 デザ イ ンのすべてのチ ャ ネルに対す る デフ ォ ル ト の
チ ャ ネル サ イ ズお よ び イ ンプ リ メ ン テーシ ョ ン を指定可能です。
config_dataflow -default_channel (fifo | *pingpong*) -size <FIFO size>
チ ャ ネルのサ イ ズは、 受信側ア レ イ ま たは送信側ア レ イ の最大サ イ ズで定義 さ れます。 場合に よ っ ては、 こ れは控え
めすぎ る 設定であ る こ と があ り ます。 -size オプシ ョ ン を使用する と 、 こ のデフ ォ ル ト を変更で き ます。
ア レ イ パ ラ メ ー タ ーが FIFO チ ャ ネルを使用す る よ う 指定 さ れてい る 場合、 ア レ イ は ス ト リ ー ミ ン グ型ア レ イ に変換
さ れます。 ス ト リ ー ミ ン グについては、 「ア レ イ の ス ト リ ー ミ ン グ」 を参照 し て く だ さ い。 デフ ォ ル ト のチ ャ ネル タ
イ プが FIFO で、 set_directive_stream コ マ ン ド を使用 し て ア レ イ が ス ト リ ー ミ ン グ以外に設定 さ れてい る 場合、 そのア
レ イ のチ ャ ネル イ ン プ リ メ ン テーシ ョ ンはデフ ォ ル ト で ピ ン ポ ン チ ャ ネルにな り ます (明示的なデ ィ レ ク ト リ に よ
り コ ン フ ィ ギ ュ レーシ ョ ンが変更 さ れ る )。
ループのパイ プ ラ イ ン処理
C 言語記述では、ループ内の操作は順次実行 さ れ、ループ内の最後の操作が完了す る ま で次の反復を実行で き ません。
RTL デザ イ ンでは複数の操作を同時に実行で き 、 RTL を その よ う に イ ンプ リ メ ン ト す る こ と が望まれます。
ループのパ イ プ ラ イ ン処理では、 図 1-57 に示す よ う に、 ループが同時処理 さ れ る よ う に イ ン プ リ メ ン ト さ れ ま す。
図 1-57 (A) には、 デフ ォ ル ト の順次操作を示 し ます。 各入力は 3 ク ロ ッ ク サ イ ク ルご と に処理 さ れ、 最後の出力が書
き込まれ る ま でに 8 ク ロ ッ ク サ イ ク ルかか り ます。
図 1-57 (B) に示すパ イ プ ラ イ ン処理 さ れたループでは、 入力サンプルが各 ク ロ ッ ク サ イ ク ルで読み出 さ れ、 最終的な
出力は 4 ク ロ ッ ク サ イ ク ル後に書 き 込まれます。デザ イ ンの変更は制御 ロ ジ ッ ク のみに加え ら れ る ので、 同 じ ハー ド
ウ ェ ア リ ソ ース で スループ ッ ト と レ イ テ ン シの両方を向上で き ます。
入力読み出 し 間の ク ロ ッ ク サ イ ク ル数はパ イ プ ラ イ ン開始間隔 と 呼ばれ、 ユーザーが指定で き ます。 デフ ォ ル ト では
1 に設定 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
112
ループの最適化
X-Ref Target - Figure 1-57
図 1‐57 : ループのパイ プ ラ イ ン処理
ループのパ イ プ ラ イ ン処理が、 図 1-52 に示 し た よ う に、 リ ソ ース の競合お よ びデー タ の依存性のため、 実行で き な
い場合があ り ます。
ネ ス ト さ れたループでは、 最内側のループのみをパ イ プ ラ イ ン処理で き ます。 ただ し 、 パ イ プ ラ イ ン処理 さ れ る と 、
パ イ プ ラ イ ン処理 さ れ る 領域の下位の階層にあ る ループはすべて フ ラ ッ ト 化 さ れます。
デー タ の依存性は解消す る のが よ り 困難で、 通常 ソ ース コ ー ド の変更が必要にな り ます。 ス カ ラ ー デー タ の依存性
は、 次の よ う にな り ます。
while (a != b) {
if (a > b) a -= b;
else b -= a;
}
こ のループの次の反復は、 現在の反復が完了 し て a と b の値がア ッ プデー ト さ れ る ま で開始で き ません (図 1-58)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
113
ループの最適化
X-Ref Target - Figure 1-58
図 1‐58 : ス カ ラ ー デー タ の依存性
デー タ の依存性は、 メ モ リ ア ク セ ス で も よ く 見 ら れます。
for (i = 1; i < N; i++)
mem[i] = mem[i-1] + i;
こ の場合、 ループの次の反復は、 現在の反復が完了 し て ア レ イ の内容が ア ッ プデー ト さ れ る ま で開始で き ま せん (
図 1-59)。
X-Ref Target - Figure 1-59
図 1‐59 : メ モ リ ア ク セスの依存性
ループの反復を始め る のに前のループ反復の結果が必要な場合、 ループのパ イ プ ラ イ ン処理は不可能です。 Vivado
HLS では、 指定の開始間隔でパ イ プ ラ イ ン処理で き ない場合、 開始間隔が増加 さ れ、 結果的に次の反復が現在の反復
に引 き 込まれて依存性が削除 さ れます。 図 1-58 お よ び図 1-59 に示す よ う にパ イ プ ラ イ ン処理が ま っ た く 不可能な場
合は、 パ イ プ ラ イ ン処理が停止 さ れ、 スループ ッ ト の低いパ イ プ ラ イ ン処理 さ れていないデザ イ ンが出力 さ れます。
ループのパ イ プ ラ イ ン処理を指定す る には、指定 し たループに対 し て GUI の [Vivado HLS Directive Editor] ダ イ ア ロ グ
ボ ッ ク ス で [Directive] ド ロ ッ プダ ウ ン リ ス ト か ら [PIPELINE] を選択す る か、ラ ベル付き のループに対 し て次の Tcl コ
マ ン ド を使用 し ます。
set_directive_pipeline -II 5 -enable_flush foo/sum_loop
こ の例では、 パ イ プ ラ イ ン処理の開始間隔が 5 に設定 さ れてお り 、 新 し い入力が 5 ク ロ ッ ク サ イ ク ルご と に読み出 さ
れ、 フ ラ ッ シ ュ が イ ネーブルにな っ てい ます。 フ ラ ッ シ ュ を イ ネーブルにす る と 、 パ イ プ ラ イ ンが閉鎖 し て空にで き
る よ う に構成 さ れます。 デフ ォ ル ト では、 フ ラ ッ シ ュ はデ ィ ス エーブルにな っ てお り 、 デザ イ ンが リ セ ッ ト さ れ る ま
で継続的に実行 さ れ る パ イ プ ラ イ ンが作成 さ れます。
ループ キ ャ リ ー依存性
「ループのパ イ プ ラ イ ン処理」 に説明す る よ う に、 ループ キ ャ リ ー依存性に よ り ループ をパ イ プ ラ イ ン処理で き ない
場合があ り ます。 ただ し 、 状況に よ っ ては、 自動依存性解析で、 依存性があ る よ う に見え る が実際には依存性がない
よ う な も のを除去で き ない場合があ り ます。
次はその例です。
void foo(int A[3*N], int x)
{
LF: for (i = 0; i < N; i++)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
114
ループの最適化
A[i+x] = A[i] + i; // User knows that 2*N > x >= N
}
こ の例では、 Vivado HLS で入力パ ラ メ ー タ ー x の範囲を判断で き ず、 A[i+x] への書 き 込み と A[i] か ら の読み出 し に
常に依存性があ る と 判断 さ れ、 ループ反復を順次ス ケ ジ ュ ー リ ン グ し ます。
こ の依存性を解消す る には、 DEPENDENCE 指示子を指定 し て、 1 つま たは複数の変数のループ キ ャ リ ー依存性に関
す る 情報を入力 し ます。 上記の例では、 x が N 以上 2*N 以下であ る こ と がわか っ てい る ので、 ループ キ ャ リ ー依存
性はない と い う こ と を ツールに指示で き ます。
set_directive_dependence -variable x -type inter -dependent false foo/LF
注記 : 実際に依存性が false ではないのに false に指定す る と 、 ハー ド ウ ェ アが不正にな る 可能性があ り ます。 依存性
(true ま たは false) は指定す る 前に正 し い こ と を確認 し て く だ さ い。
依存性を指定す る 場合、 主に二種類あ り ます。
•
反復間 : 同 じ ループの異な る 反復の間の依存性を指定 し ます。 こ の タ イ プの依存性を false に設定する と 、 ループ
が展開 さ れていない場合ま たは部分的に展開 さ れていない場合に並列実行が可能にな り 、 true に設定す る と 並列
実行は不可能にな り ます。
•
反復内 : ループの同 じ 反復内での依存性を指定 し ます。 た と えば、 同 じ 反復の最初 と 最後にア レ イ にア ク セ スす
る よ う な場合です。 こ の タ イ プの依存性を false に設定する と 、 Vivado HLS に よ り ループ内で操作を自由に移動
で き 、 パフ ォーマ ン ス ま たはエ リ ア を向上で き る 可能性が高 く な り ます。 true に設定す る と 、 操作は指定の順序
で実行す る 必要があ り ます。
ループ反復の制御
Vivado HLS では、 解析が実行 さ れ、 ループの可能な最大反復回数が予測 さ れますが、 実際の最大反復回数を判断す る
こ と はで き ません。
次の例では、 for ループの最大反復回数は num_samples 入力に よ っ て決ま り ます。 Vivado HLS では、 こ の変数の最大
値は 15 であ る と 判断 さ れますが ( こ の変数は uint4 型)、 num_samples の実際の値が、 た と えばほかの要因に よ り 8 以
下であ っ た と し て も 、 それを判断す る こ と はで き ません。
void foo (uint4 num_samples, ...);
void foo (num_samples, ...){
int i;
...
loop_1: for(i=0;i< num_samples;i++) {
...
result = a + b;
}
}
デザ イ ンの レ イ テ ン シ ま たは スループ ッ ト が変数 イ ンデ ッ ク ス を含むループに よ っ て決ま る 場合、Vivado HLS で実際
の正 し い ス ループ ッ ト ま たは レ イ テ ン シは算出で き ず、 ループの レ イ テ ン シは不明 ( ク エ ス チ ョ ン マー ク (?)) と レ
ポー ト さ れます。
ループの反復回数 (TRIPCOUNT) を指定す る と 、 レ ポー ト に有効な数値が含まれます。 ループの反復回数を指定す る
には、GUI の [Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス で [Directive] ド ロ ッ プダ ウ ン リ ス ト か ら [TRIPCOUNT]
を選択す る か、 ラ ベル付 き のループに対 し て次の Tcl コ マ ン ド を使用 し ます。
set_directive_loop_tripcount -min 3 -max 8 -avg 5 foo/loop_1
-max オプシ ョ ンはループの最大反復回数、 -min オプシ ョ ンは最小反復回数、 -avg オプシ ョ ンは平均反復回数を指定
し ます。 こ れに よ り 、 Vivado HLS でデザ イ ンの最大/最小スループ ッ ト が正 し く レ ポー ト さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
115
ア レ イの最適化
TRIPCOUNT 指示子は、 合成結果には影響 し ません。 TRIPCOUNT の値はレ ポー ト 目的のみに使用 さ れ、 Vivado HLS
で レ ポー ト に意味のあ る レ イ テ ン シお よ びスループ ッ ト が示 さ れ る よ う に し ます。 C の assert マ ク ロ を コ ー ド 内で使
用す る と 、 ループの制限を指定す る の と 、 こ れ ら の制限 と 同 じ サ イ ズのハー ド ウ ェ ア を作成す る のに使用で き ます。
詳細は、 「assert の使用」 セ ク シ ョ ン を参照 し て く だ さ い。
ループのレ イ テ ン シ
ループの最大お よ び最小レ イ テ ン シは、 制約 と し て指定で き ます。 レ イ テ ン シ制約は、 GUI で各ループに個別に設定
す る か、 ループ ラ ベル と 共に set_directive_latency コ マ ン ド を使用 し て設定 し ます。
レ イ テ ン シ指示子は、 ほかの指示子 と 同様、 領域 (C コ ー ド の波か っ こ { } で囲ま れた部分) に適用 さ れます。 ループ
に適用 さ れた レ イ テ ン シ指示子は、 ループの 1 回の繰 り 返 し に必要な レ イ テ ン シ を指定 し ます。 つま り 、 次の例の よ
う に、 ループ ボデ ィ の レ イ テ ン シ を指定 し ます。
Loop_A: for (i=0; i<N; i++)
{
#pragma HLS latency max=10
..Loop Body...
}
すべてのループの繰 り 返 し の レ イ テ ン シ合計を制限す る 目的の場合は、 次の例の よ う にループ全体を含む領域に レ イ
テ ン シ指示子を指定す る 必要があ り ます。
Region_All_Loop_A:{
#pragma HLS latency max=10
Loop_A: for (i=0; i<N; i++)
{
..Loop Body...
}
}
こ の場合、 ループが展開 さ れていた と し て も 、 レ イ テ ン シ指示子はすべてのループ演算の最大制限を設定 し ます。
次は、 レ イ テ ン シ制約を満たす こ と がで き ない イ ベン ト があ る 場合の Vivado HLS の ビヘ イ ビ アーについて説明 し ま
す。
レ イ テ ン シ を満たす こ と がで き ない原因が タ イ ミ ン グ違反にあ る 場合、 Vivado HLS では ロ ーカル タ イ ミ ン グ違反を
使用 し て制約を維持す る こ と がで き ます。使用可能な ロ ーカル タ イ ミ ン グ違反は Vivado HLS で制御 さ れ る ので、ユー
ザーが制御す る 必要はあ り ません。
こ の場合の最適化 ス ト ラ テ ジは、 レ イ テ ン シ制約を満た し て、 タ イ ミ ン グ違反が RTL ロ ジ ッ ク 合成中に修正 さ れ る
か ど う か を確認す る ための も のです。 タ イ ミ ン グ違反が論理合成で満たすには大 き すぎ る 場合は、 「 ロ ジ ッ ク 構造の
最適化」 の手法を使用 し て ロ ジ ッ ク 遅延を削減 し てみて く だ さ い。
デー タ の依存性や複数の タ イ ミ ン グ制約があ る ため、 ま たは タ イ ミ ン グ違反が大き すぎ る な ど の原因で、 Vivado HLS
で レ イ テ ン シ制約を満たす こ と がで き ない場合は、Vivado HLS で レ イ テ ン シ制約が緩め ら れ、可能な限 り 最適な結果
を達成 し よ う と さ れます。
最小の レ イ テ ン シ制約が設定 さ れ、Vivado HLS で必要 と さ れ る 最小値 よ り も 小 さ い レ イ テ ン シでデザ イ ンが生成 さ れ
る 場合は、 単にダ ミ ー ク ロ ッ ク サ イ ク ルを挿入 し て最小レ イ テ ン シ を満たそ う と し ます。
ア レ イの最適化
デザ イ ンの メ モ リ コ ン フ ィ ギ ュ レーシ ョ ンは、 デザ イ ン全体のパフ ォーマ ン スお よ びエ リ アに大 き く 影響 し ます。 C
言語記述のア レ イ は通常 メ モ リ にマ ッ プ さ れ る ので、 ア レ イ に最適化を実行する と 、 エ リ ア と パフ ォーマ ン ス に大 き
く 影響 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
116
ア レ イの最適化
ア レ イ に指定可能な指示子は、 GUI に リ ス ト さ れます (図 1-60)。
1.
[Explorer] タ ブで ソ ース コ ー ド を ダブル ク リ ッ ク し て開 き ます。
2.
補足エ リ アで [Directive] タ ブ を ク リ ッ ク し ます。
3.
ア レ イ を右 ク リ ッ ク し て [Insert Directives] を ク リ ッ ク し ます。
4.
[Directive] ド ロ ッ プダ ウ ン リ ス ト か ら 適切な指示子を選択 し 、 オプシ ョ ン を設定 し ます。
X-Ref Target - Figure 1-60
図 1‐60 : ア レ イの指示子
表 1-8 に、 ア レ イ に適用可能な最適化を、 こ の章で説明す る 順に示 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
117
ア レ イの最適化
表 1‐8 : ア レ イの最適化
GUI 指示子
説明
RESOURCE
ア レ イ を マ ッ プす る ハー ド ウ ェ ア リ ソ ー ス (RAM コ ン ポーネ
ン ト ) を指定 し ます。
Array_Map
複数の小型のア レ イ を 1 つの大型のア レ イ に結合 し て ア レ イ の
サ イ ズ を変更 し 、 RAM リ ソ ースお よ びエ リ ア を削減 し ます。
Array_Partition
大型のア レ イ を複数の小型のア レ イ にパーテ ィ シ ョ ン し 、RAM
ア ク セ ス の障害を取 り 除 き ます。 ア レ イ を RAM ではな く レ ジ
ス タ と し て イ ンプ リ メ ン ト する ために も 使用 さ れます。
Array_Reshape
ア レ イ を多数の要素を含む も のか ら ワ ー ド 幅の広い も のに変更
し ます。 多数の RAM を使用せずに RAM ア ク セ ス を向上す る
のに有益です。
STREAM
ア レ イ を RAM ではな く FIFO と し て イ ンプ リ メ ン ト し ます。
C 言語記述のア レ イ は、RTL では通常 メ モ リ を使用 し て イ ンプ リ メ ン ト さ れます。 こ の章では、 ア レ イ を特定の RAM
ま たは ROM に イ ンプ リ メ ン ト す る 方法、 使用可能な メ モ リ リ ソ ース に効率的にマ ッ プす る ために変換す る 方法 (水
平に分割、 垂直に分割、 こ れ ら の操作の組み合わせ)、 個々の レ ジ ス タ に分割す る 方法を説明 し ます。
最上位関数に引数 と し て指定 さ れてい る ア レ イ は、 多少異な る 方法で合成 さ れます。 こ の場合、 メ モ リ リ ソ ース はデ
ザ イ ンの外にあ る と 想定 さ れ、 その リ ソ ース にア ク セ スす る ポー ト と し て合成 さ れます。 その よ う なア レ イ に も 、 同
様の変換を実行で き ます。 変換 さ れた ア レ イ にア ク セ スす る ポー ト に合成 さ れます。
注記 : 最上位 イ ン タ ーフ ェ イ ス で実行 さ れ る ア レ イ 最適化お よ び最適化の組み合わせに よ っ ては、 cosim_design の使
用を RTL の検証のみに制限す る も のがあ り ます。 サポー ト さ れない最適化については、 「RTL の自動検証」 セ ク シ ョ
ンの制限を確認 し て く だ さ い。
ア レ イの初期化 と リ セ ッ ト
Vivado HLS では、 ソ ース コ ー ド でのア レ イ の初期化がサポー ト さ れてい ます。 ア レ イ の初期値は RTL お よ び FPGA
で も 複製 さ れ、ビ ッ ト ス ト リ ームに よ り デバ イ ス に電源を投入 し た と き に RAM (ア レ イ がパーテ ィ シ ョ ン さ れてい る
場合はレ ジ ス タ ) が同 じ 値で初期化 さ れ る よ う に指定 さ れます。
下の コ ー ド 例は、 次の よ う な も のです。
•
ア レ イ が fir_coef.h フ ァ イ ルか ら 初期化 さ れます。
•
const 修飾子に よ り 、 ア レ イ が ROM と し て イ ンプ リ メ ン ト さ れ る よ う 指定 さ れてい ます。
const 修飾子を使用 し ない場合、 ア レ イ が読み出 さ れ る だけの場合はVivado HLS で ROM に イ ンプ リ メ ン ト す る べ き
であ る こ と が自動的に判断 さ れますが、ア レ イ を イ ンプ リ メ ン ト する のに ど の メ モ リ リ ソ ース を使用す る べ き であ る
か を明示的に指定す る のが理想的です。 リ ソ ース の選択については、 次のセ ク シ ョ ンで説明 し ます。
typedef intcoef_t;
typedef intdata_t;
typedef intacc_t;
data_t fir (
data_t x
) {
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
118
ア レ イの最適化
static data_t shift_reg[N];
acc_t acc;
int i;
const coef_t c[N+1]={
#include "fir_coef.h"
};
acc=0;
mac_loop: for (i=N-1;i>=0;i--) {
if (i==0) {
acc+=x*c[0];
shift_reg[0]=x;
} else {
shift_reg[i]=shift_reg[i-1];
acc+=shift_reg[i]*c[i];
}
}
return=acc;
}
ア レ イ は、 電源投入時に ソ ー ス コ ー ド で指定 さ れた値に初期化 さ れ ますが、 その後デバ イ ス に リ セ ッ ト を適用 し て
も 、 電源投入時の ス テー ト には初期化 さ れ ません。 Vivado HLS で追加 さ れ る リ セ ッ ト を使用 し た ア レ イ の リ セ ッ ト
は、 サポー ト さ れません。
ア レ イ を初期 ( リ セ ッ ト ) ス テー ト に戻す必要があ る 場合は、 外部信号を供給する 必要があ り ます。 こ れは、 コ ー ド に
明示的に記述 し ます。 こ の コ ー ド 例は、 次の と お り です。
...
const coef_t c_temp[N+1]={
#include "fir_coef.h"
};
coef_t c[N+1];
if (rst_array==1) {
for (i=0;i<N;i++) {
c[i] = c_temp[i];
}
}
...
こ の コ ー ド に よ り 、 RTL デザ イ ンが次の よ う にな っ て し ま う 可能性があ り ます。
•
電源投入時の初期化 と は異な り 、 こ の よ う な明示的な リ セ ッ ト では RTL デザ イ ンでア レ イ /RAM 内の各ア ド レ ス
に反復的に値を設定す る 必要があ り 、 N が大 き い場合は多数の ク ロ ッ ク サ イ ク ルがかか り ます。
•
最上位関数 イ ン タ ーフ ェ イ ス に追加の変数 rst_array が必要です。 こ のポー ト は、 合成中に追加 さ れ る リ セ ッ ト 信
号に も 追加 さ れます。
メ モ リ リ ソ ースの選択
ア レ イ に メ モ リ リ ソ ー ス が指定 さ れていない場合、 Vivado HLS に よ り 使用す る メ モ リ リ ソ ース (シ ン グル ポー ト 、
デ ュ アル ポー ト な ど) が判断 さ れ ま す。 こ れは、 最上位関数の関数引数に指定 さ れた ア レ イ で も 同 じ です。 Vivado
HLS で、 開始間隔を小 さ く で き る と い う 理由でデ ュ アル ポー ト メ モ リ への イ ン タ ーフ ェ イ ス が作成 さ れ る こ と があ
り ます。 こ れが必ず し も 最適であ る と はかぎ ら ないので、 各ア レ イ を マ ッ プする メ モ リ リ ソ ース を明示的に指定す る
こ と をお勧め し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
119
ア レ イの最適化
ア レ イ を特定の RAM リ ソ ース にマ ッ プす る には、 次の例の よ う に set_directive_resource コ マ ン ド を使用す る か、 GUI
の [Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス の [Directive] ド ロ ッ プダ ウ ン リ ス ト か ら [RESOURCE] を選択す
る か (図 1-61)、 コ ー ド にプ ラ グマ を挿入 し ます。
次の例には 3 つのア レ イ が含まれてお り 、 1 つは関数パ ラ メ ー タ ー と し て、 2 つは関数内で定義 さ れてい ます。
void foo (in[16], ...){
int8 array1[16];
int12 array2[48];
...
loop_1: for(i=0;i<8;i++) {
array1[i] = in[i];
...
}
}
イ ン タ ー フ ェ イ ス リ ソ ース
次を使用す る と 、 デー タ を ポー ト in[16] に供給す る RAM の タ イ プが指定 さ れます。
set_directive_resource -core RAM_1P foo in
-core オプシ ョ ンは、 RAM コ ア を指定 し ます。 使用可能な RAM コ アの リ ス ト は、 「高位合成演算子お よ び コ ア ガ イ
ド 」 の章 に リ ス ト さ れてお り 、 [Vivodo HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス で選択で き ます。
パ ラ メ ー タ ー in[16] の イ ン タ ーフ ェ イ ス が ap_memory に指定 さ れてい る 場合、作成 さ れ る ポー ト は RAM_1P 上のポー
ト に一致 し ます。 RAM_1P にチ ッ プ イ ネーブル (CE) ポー ト があ る 場合、 CE ポー ト を持つ イ ン タ ーフ ェ イ ス が作成
さ れます。 RAM_1P に読み出 し 用 と 書 き 込み用に別のア ド レ ス ポー ト があ る 場合は、 RAM を読み出すア ド レ ス ポー
ト と RAM に書 き 込むア ド レ ス ポー ト が作成 さ れます。読み出 し と 書き 込みの両方にア ド レ ス ポー ト が 1 つ使用 さ れ
る 場合は、 読み出 し と 書 き 込みの両方に使用 さ れ る ア ド レ ス ポー ト が 1 つ作成 さ れます。
ポー ト in[16] が ap_fifo に指定 さ れてい る 場合、 ap_fifo は常に同 じ なので (読み出 し お よ び書 き 込み用のデー タ ポー
ト 、 Empty ポー ト 、 Full ポー ト )、 メ モ リ リ ソ ース タ イ プはそれほ ど重要ではあ り ません。
イ ン タ ーフ ェ イ ス の選択の詳細は、 「 イ ン タ ーフ ェ イ ス の管理」 の章を参照 し て く だ さ い。
デザイ ン リ ソ ース
上記の同 じ コ ー ド 例を使用 し た場合、次の コ マ ン ド に よ り ア レ イ array1 お よ び array2 を イ ンプ リ メ ン ト す る のに使用
さ れ る RAM の タ イ プが指定 さ れます。
set_directive_resource -core RAM_1P foo array1
set_directive_resource -core RAM_2P foo array2
こ の場合、 array1 は RAM_1P コ アに、 array2 は RAM_2P コ アにマ ッ プ さ れます。 こ の時点で、 次を満たす必要があ り
ます。
•
RAM_1P では、 int8 は 8 ビ ッ ト デー タ 型なので、 要素 (ア ド レ ス) が 17 個以上、 各要素が 9 ビ ッ ト 以上であ る 必
要があ り ます。
•
RAM_2P では、 int12 は 12 ビ ッ ト デー タ 型なので、 要素 (ア ド レ ス) が 28 個以上、 各要素が 13 ビ ッ ト 以上であ
る 必要があ り ます。
ポー ト in1 が関数外の RAM_1P コ ン ポーネ ン ト と 通信する よ う 指定 さ れていた と し て も 、array1 を同 じ タ イ プの RAM
コ ン ポーネ ン ト にマ ッ プす る と い う 要件はあ り ません。 Vivado HLS に よ り 、 あ る タ イ プの RAM ま たは RAM ポー ト
か ら 読み出 し 、 別の タ イ プの RAM ま たは RAM ポー ト に書き 出すために必要な変換が実行 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
120
ア レ イの最適化
ア レ イのマ ッ プ
ほ と ん ど のテ ク ノ ロ ジ ラ イ ブ ラ リ では、 RAM のサ イ ズはあ ら か じ め定義 さ れてい ま す (2 のべ き 乗の ワ ー ド 数、 1、
8、 16 ビ ッ ト ワー ド な ど)。 元の仕様に小型のア レ イ が多数あ る 場合は、 タ ーゲ ッ ト リ ソ ース を指定す る 前にそれ ら
のア レ イ を 1 つの大型のア レ イ に ま と め る と 、 ス ト レージのオーバーヘ ッ ド を削減で き ます。 小型のア レ イ それぞれ
が個別の メ モ リ にマ ッ プ さ れ る と 、 多数の メ モ リ 空間が無駄にな り 、 デザ イ ンが必要以上に大 き く な る 可能性があ り
ます。
Vivado HLS の set_directive_array_map コ マ ン ド では、 複数の小型のア レ イ を 1 つの大型のア レ イ にマ ッ プす る 2 つの
方法がサポー ト さ れてい ます。
•
水平マ ッ プ : 元のア レ イ を連結 し て、 新 し いア レ イ を作成 し ます。 物理的には、 要素数の多い 1 つのア レ イ に イ
ンプ リ メ ン ト さ れます。
•
垂直マ ッ プ : 元のア レ イ の ワー ド を連結 し て、 新 し いア レ イ を作成 し ます。 物理的には、 ビ ッ ト 幅の広い 1 つの
ア レ イ に イ ンプ リ メ ン ト さ れます。
水平マ ッ プ
次の コ ー ド 例には 2 つのア レ イ が含まれてお り 、 2 つの RAM コ ン ポーネ ン ト にマ ッ プ さ れます。
void foo (...){
int8 array1[M];
int12 array2[N];
...
loop_1: for(i=0;i<M;i++) {
array1[i] = ...;
array2[i] = ...;
...
}
...
}
ア レ イ array1 お よ び array2 は、 次の例の よ う に array3 と い う ア レ イ に結合で き ます。
set_directive_array_map -instance array3 -mode horizontal foo array1
set_directive_array_map -instance array3 -mode horizontal foo array2
MAP 指示子は、 個々のア レ イ に対 し て GUI の [Vivado HLS Directive Editor] ダ イ ア ロ グ ボ ッ ク ス で指定す る こ と も で
き ます。 こ れに よ り 、 ア レ イ が 図 1-61 に示す よ う に変換 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
121
ア レ イの最適化
X-Ref Target - Figure 1-61
図 1‐61 : 水平マ ッ プ
水平マ ッ プ を使用す る と 、 複数の小型のア レ イ を 1 つの大型のア レ イ に ロ ケーシ ョ ン 0 か ら コ マ ン ド の順序でマ ッ プ
さ れます (GUI では、 ア レ イ を指定 し た順序)。 –offset オプシ ョ ン を使用す る と 、 ア レ イ 間に要素を追加で き ます。
上記の例で array2 を追加 し てか ら array1 を追加 し 、 オ フ セ ッ ト を追加す る 場合は、 次の コ マ ン ド を使用 し ます。
set_directive_array_map -instance array3 -mode horizontal foo array2
set_directive_array_map -instance array3 -mode horizontal -offset 2 foo array1
結果は図 1-62 に示す よ う にな り ます。
X-Ref Target - Figure 1-62
図 1‐62 : オ フ セ ッ ト を使用 し た水平マ ッ プ
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
122
ア レ イの最適化
上記の例の新 し いア レ イ array3 は、 新 し い イ ン ス タ ン ス にマ ッ プ さ れた変数のいずれかに RESOURCE 指示子を適用
す る と 、 特定の RAM コ ン ポーネ ン ト にマ ッ プで き ます。
set_directive_resource -core RAM_1P foo array1
図 1-63 に示す RAM イ ンプ リ メ ン テーシ ョ ンは、 オ フ セ ッ ト を使用 し ない図 1-61 のマ ッ プに対応 し ます。
X-Ref Target - Figure 1-63
図 1‐63 : 水平マ ッ プの メ モ リ
水平マ ッ プに よ り RAM コ ン ポーネ ン ト の数を削減で き 、 エ リ アが向上 し ますが、 スループ ッ ト お よ びパフ ォーマ ン
ス に影響す る 可能性があ り ます。 上記の例では、 loop_1 の array1 お よ び array2 へのア ク セ ス を同 じ ク ロ ッ ク サ イ ク
ルで実行で き ますが、 両方のア レ イ が同 じ RAM にマ ッ プ さ れ る と 、 それぞれの読み出 し に個別のア ク セ ス と ク ロ ッ
ク サ イ ク ルが必要にな り ます。
こ の制限を解消す る ため、 Vivado HLS では垂直マ ッ プがサポー ト さ れてい ます。
垂直マ ッ プ
垂直マ ッ プでは、 ビ ッ ト 幅が広いア レ イ が生成 さ れ る よ う ア レ イ が連結 さ れ ます。 図 1-64 に、 水平マ ッ プの説明で
使用 し た例に垂直マ ッ プ を適用 し た結果を示 し ます。
set_directive_array_map -instance array3 -mode vertical foo array2
set_directive_array_map -instance array3 -mode vertical foo array1
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
123
ア レ イの最適化
X-Ref Target - Figure 1-64
図 1‐64 : 垂直マ ッ プ
垂直マ ッ プでは、 コ マ ン ド で指定 さ れた順にア レ イ がマ ッ プ さ れ、 最初のア レ イ が LSB か ら 開始 し 、 最後のア レ イ
が MSB で終了 し ます。
注記 : 上記の set_directive_array_map コ マ ン ド では、 array2 が先に指定 さ れてい ます。 Vivado HLS の
イ を指定 し た順序にな り ます。
GUI では、 ア レ
上記の例で新 し いア レ イ array3 がマ ッ プ さ れた ら 、 1 つの RAM コ ン ポーネ ン ト にマ ッ プで き ます (図 1-65)。
set_directive_resource -core RAM_1P foo array3
X-Ref Target - Figure 1-65
図 1‐65 : 垂直マ ッ プの メ モ リ
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
124
ア レ イの最適化
マ ッ プお よびグ ローバルア レ イ
グ ロ ーバル ア レ イ も マ ッ プで き ますが、 結果のア レ イ イ ン ス タ ン ス はグ ロ ーバルにな り 、 同 じ ア レ イ イ ン ス タ ン ス
にマ ッ プ さ れた ロ ーカル ア レ イ も すべて グ ロ ーバルにな り ます。
異な る 関数の ロ ーカル ア レ イ が同 じ タ ーゲ ッ ト ア レ イ にマ ッ プ さ れ る と 、 その タ ーゲ ッ ト ア レ イ イ ン ス タ ン ス はグ
ロ ーバルにな り ます。
ア レ イ 関数パ ラ メ ー タ ーを マ ッ プす る 場合、 同 じ 関数のパ ラ メ ー タ ーであ る 必要があ り ます。
ア レ イのパーテ ィ シ ョ ン
ア レ イ を小型のア レ イ にパーテ ィ シ ョ ンで き ます。 メ モ リ の読み出 し ポー ト と 書 き 込みポー ト の量は限 ら れてい る の
で、 ロ ー ド /ス ト アが多数実行 さ れ る アルゴ リ ズ ムでは、 スループ ッ ト が制限 さ れます。 元のア レ イ (1 つの メ モ リ リ
ソ ース) を複数の小型のア レ イ (複数の メ モ リ ) に分割す る こ と に よ り 、 ポー ト 数が増加 し 、 バン ド 幅を向上で き る こ
と があ り ます。
そのため、 set_directive_array_partition コ マ ン ド を使用 し て 1 つの大型のア レ イ を複数の小型のア レ イ にパーテ ィ シ ョ
ンす る と 、 スループ ッ ト を向上で き ます。
Vivado HLS には、 3 タ イ プのア レ イ パーテ ィ シ ョ ンがあ り ます (図 1-66)。 さ ま ざ ま な タ イ プを -type オプシ ョ ン で指
定で き ます。
•
block : 元のア レ イ の連続 し たエ レ メ ン ト が同 じ サ イ ズのブ ロ ッ ク にパーテ ィ シ ョ ン さ れます。
•
cyclic : 元のア レ イ の交互のエ レ メ ン ト が同 じ サ イ ズのブ ロ ッ ク にパーテ ィ シ ョ ン さ れます。
•
complete : デフ ォ ル ト ではア レ イ がその個別エ レ メ ン ト にパーテ ィ シ ョ ン さ れます。 1 つの メ モ リ は複数の レ ジ
ス タ に分解 さ れます。
X-Ref Target - Figure 1-66
図 1‐66 : ア レ イのパーテ ィ シ ョ ン
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
125
ア レ イの最適化
block お よ び cyclic パーテ ィ シ ョ ンの場合は、 -factor を使用す る と 作成 さ れ る ア レ イ 数を指定で き ます。 図 1-66 では、
-factor オプシ ョ ン 2 が使用 さ れ、 ア レ イ が 2 つの小 さ いア レ イ に分割 さ れてい ます。 ア レ イ のエ レ メ ン ト 数が こ の係
数の整数倍ではない場合、 最終的な ア レ イ に含まれ る エ レ メ ン ト は少な く な り ます。
多次元ア レ イ をパーテ ィ シ ョ ンす る 際は、 -dim オプシ ョ ン を使用する と 、 ど の次元を分割す る か指定で き ます。 こ の
例の場合、 次の よ う にな り ます。
void foo (...){
int array1[L][M][N];
...
}
array1 はそれぞれが 1 次元の L/3 サ イ ズの 3 つのア レ イ に分け ら れます。
set_directive_array_partition -type block -dim 1 -factor 3 foo array1
次元に 0 が指定 さ れ る と (-dim 0)、 すべての次元が分割 さ れます。
ア レ イの変更
set_directive_array_reshape コ マ ン ド を使用す る と 、 垂直マ ッ プでア レ イ パーテ ィ シ ョ ン を ま と め る こ と がで き ま す。
こ れに よ り 元のア レ イ の 1 つの次元か ら 異な る エ レ メ ン ト を取 り 出 し 、 1 つのエ レ メ ン ト に ま と めて変更 し た ア レ イ
に入れ る こ と がで き ます。
次の よ う な コ ー ド があ る と し ます。
void foo (...){
int array1[N];
int array2[N];
int array3[N];
...
}
次の コ マ ン ド は、 デ フ ォ ル ト の係数 2 を 使用 し て array1、 array2、 array3 ア レ イ を 3 つの新 し い ア レ イ に変更 し て、
block、 cyclic、 complete タ イ プを作成 し てい ます。
set_directive_array_reshape -type block -instance array4 foo array1
set_directive_array_reshape -type cyclic -instance array5 foo array2
set_directive_array_reshape -type complete -instance array6 foo array3
図 1-67 は、 上記の コ マ ン ド の結果です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
126
ア レ イの最適化
X-Ref Target - Figure 1-67
図 1‐67 : ア レ イの変更
ア レ イのス ト リ ー ミ ング
complete パーテ ィ シ ョ ンでア レ イ を レ ジ ス タ に削減 し ておかない限 り 、デフ ォ ル ト ではすべてのア レ イ が メ モ リ エ レ
メ ン ト と し て イ ンプ リ メ ン ト さ れます。 つま り 、 すべてのア レ イ は RAM リ ソ ース に割 り 当て ら れ、 そのテ ク ノ ロ ジ
の ラ イ ブ ラ リ の RAM コ アで指定 さ れたデー タ 、 ア ド レ ス、 デバ イ スお よ び イ ネーブル信号を使用 し てア ク セ ス さ れ
ます。
RAM ではな く FIFO を使用す る には、 ア レ イ を ス ト リ ー ミ ン グ と し て指定す る 必要があ り ます。 次のア レ イ は、 ス ト
リ ー ミ ン グ と し て指定 さ れます。
イ ン タ ーフ ェ イ ス のア レ イ が ap_fifo イ ン タ ーフ ェ イ ス タ イ プに設定 さ れ る と 、 ス ト リ ー ミ ン グ と し て設定 さ れ
ます。
その他すべてのア レ イ は、 FIFO イ ン タ ーフ ェ イ ス が必要な場合は、 ス ト リ ー ミ ン グ と し て指定す る 必要があ り ます。
こ れには、 デー タ フ ロ ー パ イ プ ラ イ ン処理が指定 さ れた と き に関数ま たはループ間に ス ト リ ー ミ ン グ イ ン タ ーフ ェ
イ ス が必要な場合 も 含ま れます。
ア レ イ は、 次の コ マ ン ド で ス ト リ ー ミ ン グに指定で き ます。
set_directive_stream
foo array1
デー タ フ ロ ー チ ャ ネルに含まれ る ア レ イ に コ マ ン ド を使用する 場合は、 こ の コ マ ン ド に対 し て -only オプシ ョ ン を使
用 し ます。 -depth オプシ ョ ン を使用す る と デフ ォ ル ト の FIFOの深 さ (最大ア レ イ のサ イ ズ) が上書 き さ れ、 -off オプ
シ ョ ン を使用す る と config_dataflow コ マ ン ド が上書 き さ れます。デフ ォ ル ト のチ ャ ネルが FIFO に指定 さ れ る 場合は、
set_directive_array_stream -off オ プ シ ョ ン を 使用 し て、 ア レ イ が ス ト リ ー ミ ン グ さ れ な い よ う に し 、 ピ ン ポ ン バ ッ
フ ァ ーが使用 さ れ る よ う に し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
127
ロ ジ ッ ク構造の最適化
ロ ジ ッ ク構造の最適化
Vivado HLS で作成 さ れ る ロ ジ ッ ク 構造は、 最 も 重要です。 関数お よ びループが並列操作のために最適化 さ れ、 最小レ
イ テ ン シのために結合、 イ ン ラ イ ン化、 平坦化 さ れ、 開始間隔を最小にす る ためにパ イ プ ラ イ ン処理 さ れ、 障害を削
減す る ためにア レ イ ア ク セ ス が解析 さ れ る と 、デザ イ ン パフ ォーマ ン スお よ びその改善方法を検出ま たは制限す る の
は最終的には ロ ジ ッ ク 構造だけにな り ます。
デザ イ ンに イ ンプ リ メ ン ト さ れた ロ ジ ッ ク 構造の タ イ プを検出す る には、 次の よ う な項目があ り ます。
•
ク ロ ッ ク レー ト
•
タ ーゲ ッ ト デバ イ ス
•
演算子選択
•
ハー ド ウ ェ ア リ ソ ース の制御
•
構造体パ ッ キ ン グ
•
演算調整
ク ロ ッ ク 、 タ ーゲ ッ ト デバ イ ス、 ス テー ト マシ ン エン コ ーデ ィ ン グお よ び リ セ ッ ト の影響については、 「デザ イ ン最
適化」 を参照 し て く だ さ い。 こ れ ら の項目の詳細は、 こ こ で説明す る その他の最適化手法を適用す る 前に確認 し て く
だ さ い。
演算子選択
合成中、 Vivado HLS ではデバ イ ス テ ク ノ ロ ジ ラ イ ブ ラ リ か ら 演算子 (+、 -、 *、 /、 %) の イ ン プ リ メ ン テーシ ョ ンが
選 択 さ れ ま す。 デ フ ォ ル ト で は タ イ ミ ン グ お よ び エ リ ア 間 で 最適 な バ ラ ン ス に な る 演算子 が 選択 さ れ ま す。
config_bind コ マ ン ド を使用す る と 、ど の演算子が使用 さ れ る かが決ま り 、演算子の数 も 最小に抑え る こ と がで き ます。
config_bind -effort [low | medium | high] -min_op <list> -reset
config_bind コ マ ン ド は、 ア ク テ ィ ブ ソ リ ュ ーシ ョ ン内でのみ実行で き ます。 コ マ ン ド を実行す る と 、 その ソ リ ュ ー
シ ョ ンで実行 さ れ る すべての合成操作に適用 さ れます。 ソ リ ュ ーシ ョ ン を一旦閉 じ てか ら 開 き 直 し て も 、 指定 し た コ
ン フ ィ ギ ュ レーシ ョ ンが新 し い合成操作すべてに適用 さ れます。
config_bind コ マ ン ド で適用 さ れた コ ン フ ィ ギ ュ レーシ ョ ンはすべて -reset オプシ ョ ン を使用す る と 削除で き ます。
open_solution -reset を使用す る と ソ リ ュ ーシ ョ ン を開いた と き に リ セ ッ ト で き ます。
こ のバ イ ンデ ィ ン グ操作のデフ ォ ル ト の run ス ト ラ テジは medium です。
•
[Low Effort] : 共有にかけ る 時間を少な く し ます。 ラ ン タ イ ムは高速にな り ますが、 最終的な RTL は大 き く な る 可
能性があ り ます。 共有の可能性がほ と ん ど ない と わか っ てい る 場合や、 必要がな く 、 可能性を探すためにCPU サ
イ ク ルを無駄に し た く ない場合な ど に便利です。
•
[Medium Effort] : デフ ォ ル ト で、 高位合成は操作を共有 し よ う と し ますが、 合理的な時間で終了す る よ う に し ま
す。
•
[High Effort] : 最大限に共有 し よ う と し ます。 ラ ン タ イ ムに制限はあ り ません。 高位合成は、 共有のすべての可能
性のあ る 組み合わせが確認 さ れ る ま で続行 さ れます。
run ス ト ラ テ ジは最上位関数のすべての演算子に影響を与え ます。 バ イ ンデ ィ ン グはデザ イ ン全体に対 し て設定 さ れ
ます。
-min_op を使用す る と 、 特定の操作が RTL で最小化 さ れます。 た と えば、 デザ イ ンに 12 個の乗算器が含まれ る 場合、
次の コ マ ン ド に よ り 、 こ のデザ イ ンに最小限必要な乗算器数が検索 さ れます。
config_bind -min_op mul
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
128
ロ ジ ッ ク構造の最適化
使用可能な演算子の リ ス ト については、 「高位合成 リ フ ァ レ ン ス ガ イ ド 」 の章の 「config_bind コ マ ン ド 」 を参照 し て
く だ さ い。
ハー ド ウ ェ ア リ ソ ースの制御
RTL を イ ンプ リ メ ン ト す る のに使用 さ れ る リ ソ ース は、 合成中に明示的に指定で き ます。 ま たは、 合成で使用で き る
リ ソ ース に一般的な制限を付け る こ と がで き ます。 こ れ ら の方法は、 タ イ ミ ン グ (つま り レ イ テ ン シ と スループ ッ ト )
と エ リ アの両方を改善す る ために使用で き ます。
特定操作に使用 さ れ る リ ソ ース は直接指定で き ます。 リ ソ ースは、 GUI を使用 し て (ま たは pragma と し て) 指定で き 、
set_directive_resource コ マ ン ド を使用す る 関数の ど の変数にで も 適用で き ます。
高位合成では、 こ の例に示す よ う に コ ー ド が読み出 さ れます。
int foo (
int a,
int b
) {
int c, d;
c = a*b;
d = a*c;
return d;
}
変数 c お よ び d に使用 さ れ る 乗算は、 標準的な mul (乗算器) 演算子 と し て内部デー タ ベース に イ ンプ リ メ ン ト さ れま
す。 すべての演算子の リ ス ト は、 第 2 章 「高位合成演算子お よ び コ ア」 を参照 し て く だ さ い。
合成が実行 さ れ る と 、 Vivado HLS では ク ロ ッ ク で指定 さ れた タ イ ミ ン グ制約、 タ ーゲ ッ ト デバ イ ス で指定 さ れた遅
延、 お よ びその演算子を指定す る のに ど の コ ア を使用する か決定する ユーザー制約すべてが使用 さ れます。 使用 さ れ
る コ アは、 組み合わせ コ アの multiplier だ っ た り 、 Mul2S と い う パ イ プ ラ イ ン乗算器 コ アだ っ た り し ます。 すべての
使用可能な コ アの リ ス ト は、 第 2 章 「高位合成演算子お よ び コ ア」 を参照 し て く だ さ い
ど の コ ア を使用す る 必要があ る か明示的に指定す る には、 RESOURCE 指示子を使用 し ます。 次の コ マ ン ド を使用す
る と 、 Vivado HLS で変数 c に対 し て 2 段のパ イ プ ラ イ ン乗算器が使用 さ れます。
set_directive_resource -core Mul2S foo c
注記 : 変数が複数回使用 さ れ る 場合、 制御 さ れ る 演算直後の行にプ ラ グマ と し て resource 指示子を使用す る 必要があ
り ます。
タ イ ミ ン グ ま たはエ リ ア を改善す る ために特定の演算子を選択す る だけでな く 、 デザ イ ン で使用 さ れ る 演算子の総数
を制限 し て、 演算子を共有 し 、 エ リ ア を改善 ( タ イ ミ ン グ ま たはレ イ テ ン シが増加する こ と が多い) す る こ と も で き ま
す。 上記 と 同 じ コ ー ド 例で、 次の コ マ ン ド を実行す る と し ます。
set_directive_allocation -limit 1 -type operation foo mul
こ れは イ ンプ リ メ ン テーシ ョ ン を mul 操作 1 つに制限 し ます (デフ ォ ル ト は制限な し )。 こ れに よ り 、 Vivado HLS で関
数 foo に対 し て 1 つの乗算器が使用 さ れ る よ う にな り ます。
構造体パ ッ キング
構造体の メ ンバーを 1 つの幅の ワー ド にパ ッ キ ン グす る と 、 各エ レ メ ン ト にそれぞれ関連す る 制御オーバーヘ ッ ド を
削減で き る ので、 デザ イ ンの小型化お よ び高速化の両方を達成で き ます。
1 つの構造体に含まれ る エ レ メ ン ト を 1 つの幅の ワ ー ド のエ レ メ ン ト にパ ッ ク す る には、 DATA_PACK 指示子を使用
で き ます。 新 し い ワー ド では、 構造体の最初のエ レ メ ン ト が最下位ビ ッ ト (LSB) を、 最後のエ レ メ ン ト が最上位ビ ッ
ト (MSB) を占領 し ます。 構造体にア レ イ が含ま れ る 場合、 ア レ イ が complete パーテ ィ シ ョ ン で変更 さ れ、 ほかの ス
カ ラ ー と 一緒にパ ッ ク さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
129
ロ ジ ッ ク構造の最適化
my_data 構文体が foo 関数で使用 さ れてい る と し ます。
typedef struct{
unsigned char A;
unsigned char B[320];
unsigned char C;
}my_data;
my_data foo(my_data a_in)
{
int i;
my_data b_out;
b_out.A = (a_in.A >> 1) + 10;
b_out.C = (a_in.C >> 3) + 100;
for(i=0; i <= 319; i++){
b_out.B[i] = (a_in.B[i] + a_in.A + a_in.C);
}
return b_out;
}
こ のデザ イ ンには、 合成す る と 次のポー ト が含まれます。
•
a_in 引数には、 構造体エ レ メ ン ト A の 8 ビ ッ ト 入力、 構造体エ レ メ ン ト B の メ モ リ イ ン タ ーフ ェ イ ス ポー ト 、
お よ び構造体エ レ メ ン ト C の 8 ビ ッ ト 入力ポー ト が含まれます。
•
関数か ら は、 構造体エ レ メ ン ト A の 8 ビ ッ ト 出力お よ び出力バ リ ッ ド 、 構造体エ レ メ ン ト B の メ モ リ イ ン タ ー
フ ェ イ ス ポー ト 、 構造体エ レ メ ン ト C の 8 ビ ッ ト 出力 と 該当す る 出力バ リ ッ ド ポー ト が戻 さ れます。
•
関数の結果 と b_in : A には 8 ビ ッ ト ポー ト 、 B いは メ モ リ ポー ト 、 p には 8 ビ ッ ト ポー ト
次の コ マ ン ド は、 メ ンバーの a-in を a-in と いい う 新 し い変数にパ ッ ク し (–instance オプシ ョ ンが使用 さ れない場合は
同 じ 名前が使用 さ れます)、 構造体 b_in の メ ンバーを新 し い new_var にパ ッ ク し てい ます。
set_directive_data_pack foo a_in
set_directive_data_pack -instance new_var foo return
こ のデザ イ ンには、 合成す る と 次のポー ト が含まれます。
•
引数 a_in は 2576 ビ ッ ト 幅のポー ト にな り ます。 最小位の 8 ビ ッ ト は、 構造体エ レ メ ン ト A の 8 ビ ッ ト にな り ま
す。 構造体エ レ メ ン ト B は、 2560 ビ ッ ト (320*8) の ス カ ラ ーに形が変更 さ れ、 最終 8 ビ ッ ト は構造体エ レ メ ン ト
C にな り ます。
•
関数 return は同 じ よ う なサ イ ズで構築 さ れた new_var と い う 名前のベ ク タ ーに合成 さ れます。 ま た、 出力バ リ ッ
ド 信号が含ま れ る よ う にな り ます。
注記 : デー タ パ ッ キ ン グで作成 さ れたポー ト ま たはバ ス の最大ビ ッ ト 幅は 8192 です。
演算調整
合成中は、駆動電流の削減やビ ッ ト 幅の最小化な ど、複数の最適化が実行 さ れます。 こ の よ う な自動最適化の中には、
演算調整 も 含まれます。
演算調整は、 直接制御可能な最適化の 1 つです。 こ の最適化では、 バ ラ ン ス の取れた ツ リ ーを構築 し て レ イ テ ン シ を
削減す る よ う に、 演算子が並び替え ら れます。 演算調整はデフ ォ ル ト でオンにな っ てい ますが、 オ フ にな っ てい る こ
と も あ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
130
ロ ジ ッ ク構造の最適化
ソ フ ト ウ ェ ア プ ロ グ ラ マーは、代入演算子を使用 し てシーケ ン シ ャ ルな コ ー ド を記述する こ と が よ く あ り ますが、 こ
のシーケ ン シ ャ ル コ ー ド はレ イ テ ン シには悪影響を与え る こ と があ り ます。
次の例を確認 し て く だ さ い。
int foo_top (short a, short b, short c, short d)
{
int i;
int sum;
sum = 0;
sum += a;
sum += b;
sum += c;
sum += d;
return sum;
}
コ ー ド はシーケ ン シ ャ ルに実行 さ れ る はずです。 加算にはそれぞれ 1 ク ロ ッ ク サ イ ク ルかか る と する と 、 sum の計算
が終了す る のに 4 ク ロ ッ ク サ イ ク ルかか り ます (図 1-68)。
X-Ref Target - Figure 1-68
図 1‐68 : 加算器ツ リ ー
ただ し 、 加算 (a+b) と (c+d) は並列で実行で き る ので、 レ イ テ ン シ を削減で き ます。 こ の よ う に計算が調整 さ れ る と 、
計算は 2 ク ロ ッ ク サ イ ク ルで終了 し ます (図 1-69)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
131
検証
X-Ref Target - Figure 1-69
図 1‐69 : 調整後の加算器ツ リ ー
通常、 演算調整を使用す る と 共有はで き ず、 エ リ アは増加 し ます。 図 1-68 か ら の例では、 各 ク ロ ッ ク サ イ ク ルに必
要な加算器は 1 つだけなので、 デザ イ ンがパ イ プ ラ イ ン処理 さ れていない限 り 、 1 つの加算器がデザ イ ン全体に使用
さ れます。 図 1-69 か ら の例では、 最低 2 つ (デザ イ ンがパ イ プ ラ イ ン処理 さ れ る 場合は 3 つ) の加算器が必要です。
次の コ マ ン ド では、 関数 foo で演算調整をオ フ に し てい ます。
set_directive_expression_balance -off foo
検証
合成後の検証は、 cosim_design 機能を使用する と 自動化で き る ので、 合成前のテ ス ト ベンチを再利用 し て出力 さ れた
RTL で検証を ス ムーズに実行で き ます。
合成が終了す る と 、 Vivado HLS は結果の RTL を syn デ ィ レ ク ト リ に書 き 出 し ます (図 1-70)。 こ れ ら の フ ァ イ ルを適
切に作成 さ れた RTL テ ス ト ベンチ と 共に使用す る と 、 デザ イ ン を検証で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
132
検証
X-Ref Target - Figure 1-70
図 1‐70 : 出力デ ィ レ ク ト リ 構造
ただ し 、 Vivado HLS では、 RTL デザ イ ン を検証する さ ら に生産的な手法であ る cosim_design が提供 さ れてい ます。
RTL の自動検証
cosim_design 機能を使用す る と 、 合成前の検証で作成 し た既存の C レベルのテ ス ト ベンチを再利用 し 、 ビル ト イ ンの
SystemC RTL シ ミ ュ レー タ ま たはサー ド パーテ ィ の HDL シ ミ ュ レー タ を使用 し て RTL を検証する こ と がで き ます。
cosim_design 機能を使用す る には、 次が必要です。
•
正 し い イ ン タ ーフ ェ イ ス合成オプシ ョ ンが選択 さ れてい る 必要あ り
•
テ ス ト ベンチがセルフチ ェ ッ ク で、 問題がなか っ た場合は 0 を、 問題があ っ た場合は 0 以外の値を戻す必要あ り
•
サー ド パーテ ィ シ ミ ュ レー タ が検索パス で指定 さ れてい る 必要あ り
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
133
検証
イ ン タ ー フ ェ イ ス合成要件
cosim_design を使用 し て RTL デザ イ ン を検証す る には、 次の条件の中か ら 1 つま たは複数の条件が満た さ れてい
る 必要があ り ます。
•
最上位関数が ap_ctrl_hs ア ッ プデー ト ま たは ap_ctrl_chain 関数レベル イ ン タ ーフ ェ イ ス を使用 し て合
成 さ れてい る
•
最上位関数の開始間隔 (II) が 1 にな っ てい る
•
最上位関数の各ポー ト が次ぎのいずれかの イ ン タ ーフ ェ イ ス を使用 し てい る
°
ap_vld
°
ap_ovld
°
ap_hs
°
ap_memory
°
ap_fifo
°
ap_bus
SystemC デザ イ ンでは イ ン タ ーフ ェ イ ス合成が使用 さ れないので、 SystemC デザ イ ンの場合は こ の よ う な要件はあ り
ません。
サポー ト さ れない最適化
イ ン タ ーフ ェ イ ス のア レ イ ま たは struct 内のア レ イ ご と に複数の変換が実行 さ れ る よ う な場合、 自動 RTL 検証はサ
ポー ト さ れません。
自動検証が実行 さ れ る よ う にす る には、 関数 イ ン タ ーフ ェ イ ス のア レ イ 、 ま たは関数 イ ン タ ーフ ェ イ ス の構造体内の
ア レ イ で次の最適化のいずれか を使用す る 必要があ り ます (複数は使用で き ません)。
•
同 じ サ イ ズのア レ イ の垂直マ ッ プ
•
RESHAPE
•
PARTITION
•
構造体の DATA_PACK
次の最適化が最上位関数 イ ン タ ーフ ェ イ ス で使用 さ れ る と 、 cosim_design に よ る 検証は実行で き ません。
•
水平マ ッ プ
•
異な る サ イ ズのア レ イ の垂直マ ッ プ
•
ほかの構造体を メ ンバー と し て含む構造体の DATA_PACK
テ ス ト ベ ン チ要件
RTL デザ イ ンが元の C コ ー ド と 同 じ 結果にな る か ど う かを検証する には、検証を実行す る ために使用す る テ ス ト ベン
チでセルフ チ ェ ッ ク が可能にな っ てい る 必要があ り ます。 テ ス ト ベンチのセルフ チ ェ ッ ク の重要な機能については、
次の例で説明 し ます。
int main () {
int ret=0;
…
// Execute (DUT) Function
…
// Write the output results to a file
…
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
134
検証
// Check the results
ret = system("diff --brief
-w output.dat output.golden.dat");
if (ret != 0) {
printf("Test failed !!!\n");
ret=1;
} else {
printf("Test passed !\n");
}
…
return ret;
}
•
関数か ら の出力を フ ァ イ ルに書 き 出 し ます。
•
結果を既存の既知の問題のない結果 と 比較 し ます。
•
結果が正 し い場合は値 0 を戻 し ます。
•
結果が正 し く ない場合は 0 以外の値を戻 し ます。
°
ど の よ う な値で も 戻 さ れ る 可能性があ り ます。 洗練 さ れたテ ス ト ベンチであれば、 相違点やエ ラ ーの タ イ プ
に よ っ て異な る 値を戻す可能性があ り ます。
上記の よ う なテ ス ト ベンチでは、 結果をチ ェ ッ ク する こ と で生産性が改善 さ れ る ので、 ユーザーが手動で検証す る 必
要がな く な り ます。
最上位テ ス ト ベンチの main() 関数で 0 が戻 さ れ る と 、 検証が問題な く 終わ っ た こ と を示す メ ッ セージが表示 さ れ ま
す。
@I [SIM-1] *** cosim_design finished:PASS ***
注記 : テ ス ト ベンチが 0 を戻 し て も 、 RTL 結果がセルフチ ェ ッ ク さ れなか っ た場合 も 、 上記の よ う な SIM-1 メ ッ セー
ジが表示 さ れ、結果が実際にチ ェ ッ ク さ れたわけでな く て も 、シ ミ ュ レーシ ョ ン テ ス ト をパス し た こ と が示 さ れます。
テ ス ト ベンチでは、 予測動作に対 し て結果がチ ェ ッ ク さ れ る よ う に し て く だ さ い。
0 以外の値が戻 さ れ る と 、 戻 さ れた値を示す メ ッ セージ と 、 RTL 検証がエ ラ ーにな っ た こ と を示す メ ッ セージの、 2
つの メ ッ セージが表示 さ れます。
注記 : 20 が戻 さ れ る 場合は、 テ ス ト ベンチに戻 り 値がない こ と を意味 し ます。 テ ス ト ベンチには、 必ず結果を セルフ
チ ェ ッ ク す る 機能を含め、 正 し い場合は 0 を戻す よ う にす る 必要があ り ます。
シ ミ ュ レーシ ョ ン不一致のデバ ッ グ
テ ス ト ベンチがセルフチ ェ ッ ク さ れ、 RTL か ら の結果が C コ ー ド と は異な る こ と が示 さ れ場合は、 次の方法を使用す
る と 、 その差異をデバ ッ グ し て、 それが RTL のバグであ る こ と を確認で き ます。
1.
C 検証段階か ら の結果が double 型ま たは float 型か ら 作成 さ れた も のではない こ と を確認 し ます。 double 型ま た
は float 型の結果を比較す る 場合、 テ ス ト ベンチでは絶対値ではな く 範囲で比較 さ れ る よ う にす る 必要があ り ま
す。 こ れは、 C コ ンパ イ ルお よ び合成で適用 さ れた最適化レベルに よ っ て、 操作の順番が結果に影響す る か ら で
す。
2.
必要な場合は、 ど のサンプル/サ イ ク ルで違いが最初に観測 さ れ る かを表示する よ う に、 テ ス ト ベンチを変更 し ま
す。
3.
シ ミ ュ レーシ ョ ン を実行す る 際に、 [Dump Trace] オプシ ョ ン を オンに し て ト レース フ ァ イ ルを作成 し ます。 ト
レ ー ス フ ァ イ ルの形式は、 使用 さ れ る RTL シ ミ ュ レ ーシ ョ ン に よ っ て異な り ま す (た と えば、 SystemC シ ミ ュ
レ ーシ ョ ン では VCD フ ァ イ ルが、 Questa Sim では WLF フ ァ イ ルが、 Vivado シ ミ ュ レ ー タ ーでは WDB お よ び
WCFG フ ァ イ ルが作成 さ れます)。 ト レース フ ァ イ ルは、 こ れ ら の形式をサポー ト する アプ リ ケーシ ョ ン で表示
で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
135
検証
4.
CDT お よ び RTL ト レース フ ァ イ ルのデバ ッ ガーを使用 し て C お よ び RTL の共通点を探 し 、 いつど の段階で こ
の 2 つが異な っ たのか を見つけ ます。
デバ ッ グ段階には、 C ソ ース に printf 文の追加や特定結果の フ ァ イ ルへの書 き 込みが含まれますが、 違い をデバ ッ グ
す る 基本的な方法は上記の方法にな り ます。
RTL シ ミ ュ レー タ のサポー ト
上記の要件が満た さ れれば、 有効な言語お よ びシ ミ ュ レー タ の組み合わせ (表 1-9) を使用 し て、 cosim_design で RTL
デザ イ ン を検証で き ます。
表 1‐9 : cosim_design シ ミ ュ レーシ ョ ン サポー ト
OSCI
シ ミ ュ レー タ
Questa Sim
VCS
SystemC
サポー ト あ り
サポー ト な し
サポー ト な し
Verilog
サポー ト な し
サポー ト あ り
サポー ト あ り
VHDL
サポー ト な し
サポー ト あ り
サポー ト あ り
SystemC RTL 出力を検証す る 際、 Vivado HLS ではビル ト イ ンの SystemC カーネルで RTL が検証 さ れます。 こ れには
ラ イ セ ン ス は必要な く 、 合成で使用 さ れ る の と 同 じ バージ ョ ン の SystemC が使用 さ れ る ので、 RTL デザ イ ンは常に
Vivado HLS を使用 し て検証で き ます。
RTL HDL デザ イ ン (Verilog ま たは VHDL) のいずれかを検証する には、 表 1-9 に示すサー ド パーテ ィ シ ミ ュ レー タ の
いずれか を使用で き ます。
RTL 検証
シ ミ ュ レーシ ョ ンは、 GUI の [Cosimulation] ツールバー ボ タ ンか ら 起動で き ます。
X-Ref Target - Figure 1-71
図 1‐71 : [Cosimulation] ツールバー ボ タ ン
次の よ う なダ イ ア ロ グ ボ ッ ク ス が表示 さ れます (図 1-72)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
136
検証
X-Ref Target - Figure 1-72
図 1‐72 : [Co‐simulation Dialog] ダ イ ア ログ ボ ッ ク ス
シ ミ ュ レーシ ョ ンす る RTL (SystemC、 Verilog ま たは VHDL) を選択で き ます。
Verilog ま たは VHDL が選択 さ れ る と 、 HDL シ ミ ュ レー タ を一番上の ド ロ ッ プダ ウ ン メ ニ ュ ーか ら 選択で き ます。
注記 : SystemC を選択す る と 、 サー ド パーテ ィ の HDL シ ミ ュ レー タ は必要あ り ません。 Verilog ま たは VHDL を選択
す る と 、 サー ド パーテ ィ の HDL シ ミ ュ レー タ と ラ イ セ ン ス が検索パ ス で指定 さ れてい る 必要があ り ます。
設定で き る オプシ ョ ンは次の と お り です。
•
[Setup Only] :シ ミ ュ レーシ ョ ン を実行す る のに必要な フ ァ イ ル ( ラ ッ パー、 アダプ タ ー、 ス ク リ プ ト な ど) がすべ
て作成 さ れ ますが、 シ ミ ュ レー タ は実行 さ れ ません。 シ ミ ュ レーシ ョ ンは、 後で コ マ ン ド ラ イ ン シ ェ ルで実行
で き ます。 Tcl コ マ ン ド では、 cosim_design に -setup オプシ ョ ン を付け る と 、 こ れが実行で き ます。
•
[Dump Trace] :すべての関数の ト レース フ ァ イ ルが <solution>/sim/<RTL> デ ィ レ ク ト リ に生成 さ れます。 Tcl コ マ
ン ド では、 cosim_design に -trace_all オプシ ョ ン を付け る と 、 こ れが実行で き ます。
•
[Optimizing Compile] :高位最適化が使用 さ れて C テ ス ト ベンチが コ ンパ イ ル さ れます。 SystemC を選択 し た場合
は、 こ の高位最適化を使用 し て RTL デザ イ ン も コ ンパ イ ル さ れ ます。 こ のオプシ ョ ン を使用す る と 、 コ ンパ イ
ル時間は増加 し ますが、 シ ミ ュ レーシ ョ ンの実行は高速にな り ます。 Tcl コ マ ン ド では、 cosim_design に -O オプ
シ ョ ン を付け る と 、 こ れが実行で き ます。
シ ミ ュ レー タ はVivado HLS コ マ ン ド ラ イ ン イ ン タ ーフ ェ イ ス か ら Tcl コ マ ン ド の cosim_design を使用 し て も 実行で
き ます。
# Simulate VHDL RTL using the QuestaSim simulator
cosim_design -tool modelsim -rtl vhdl
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
137
RTL デザイ ンのエ ク スポー ト
#Simulate systemc RTL using the OSCI simulator
cosim_design -rtl systemc
検証が実行 さ れ る と 、 シ ミ ュ レーシ ョ ン フ ァ イ ル と テ ス ト ベンチ内で使用 さ れた ア ダプ タ ーに よ り 、 図 1-70 に示す
の よ う な sim デ ィ レ ク ト リ が生成 さ れます。 こ れ ら はユーザーが確認す る こ と を目的には作成 さ れてい ませんが、 エ
ン コ ー ド や保護は さ れてい ません。
[Setup Only] を オ ン にす る と 、 デザ イ ン を検証す る ための ス ク リ プ ト 、 ア ダプ タ ー、 ラ ッ パーが作成 さ れ ますが、 シ
ミ ュ レー タ は実行 さ れません。 [Dump Trace] を オンにす る と 、 デザ イ ンの各関数に対 し て ト レース フ ァ イ ルが書 き 出
さ れます。 こ れ ら のフ ァ イ ルは、 sim デ ィ レ ク ト リ (図 1-70) の下の該当する HDL デ ィ レ ク ト リ に保存 さ れます。
[Optimizing Compiler] を オ ンにす る と 、 C テ ス ト ベンチお よ び SystemC ア ダプ タ ーを コ ンパ イ ルす る ための最適化オ
プシ ョ ンが使用 さ れます。 こ れに よ り 、 コ ンパ イ ル時間は長 く な り ますが、 ラ ン タ イ ム パフ ォーマ ン ス は改善 さ れま
す。
[Input Arguments] では、 テ ス ト ベン チで必要 と さ れ る 引数を指定で き ま す。 ア ク テ ィ ブな コ ンパ イ ル コ ン フ ィ ギ ュ
レーシ ョ ンは、 こ のダ イ ア ロ グ ボ ッ ク ス の [Active Configuration] に表示 さ れます。
RTL デザイ ンのエ ク スポー ト
Vivado HLS フ ロ ーの最後の段階では、 ザ イ リ ン ク ス デザ イ ン フ ロ ーのその他の ツールで使用で き る よ う に、 RTL デ
ザ イ ン を IP (Intellectual Property) のブ ロ ッ ク と し てエ ク ス ポー ト し ます。 RTL デザ イ ンは、 次の出力形式にパ ッ ケー
ジで き ます。
•
IP カ タ ロ グ フ ォーマ ッ ト の IP (Vivado Design Suite で使用)
•
System Generator for DSP IP (Vivado System Generator for DSP で使用)
•
System Generator for DSP (ISE) IP (ISE System Generator for DSP で使用)
•
EDK IP 用の Pcore (EDK で使用)
•
合成済みデザ イ ン チ ェ ッ ク ポ イ ン ト (.dcp)
Vivado デザ イ ン フ ロ ーにエ ク ス ポー ト で き る のは、 7 シ リ ーズお よ び Zynq® デバ イ ス を タ ーゲ ッ ト にす る デザ イ ン
のみです。 た と えば、 タ ーゲ ッ ト が Virtex-6® デバ イ ス の場合、 Vivado デザ イ ン フ ロ ーで使用す る ための Vivado IP
カ タ ロ グ、System Generator for DSP ま たは合成済みデザ イ ン チ ェ ッ ク ポ イ ン ト (.dsp) な ど のパ ッ ケージ オプシ ョ ンは
使用で き ません。
パ ッ ケージ さ れた出力形式のほか、 RTL フ ァ イ ルを <project_name>/<solution_name>/impl デ ィ レ ク ト リ の
下にあ る verilog お よ び vhdl デ ィ レ ク ト リ か ら ス タ ン ド ア ロ ン フ ァ イ ル (パ ッ ケージ済みフ ォーマ ッ ト の一部ではな
く ) と し て入手で き ます。
RTL フ ァ イ ル以外に も 、 こ れ ら のデ ィ レ ク ト リ には Vivado Design Suite 用のプ ロ ジ ェ ク ト フ ァ イ ルが含 ま れ ま す。
project.xpr フ ァ イ ルを開 く と 、 デザ イ ン (Verilog ま たは VHDL) がデザ イ ン の解析 さ れ る Vivado プ ロ ジ ェ ク ト に開 き
ま す。 Vivado HLS プ ロ ジ ェ ク ト で協調シ ミ ュ レ ーシ ョ ン が実行 さ れ る と 、 その RTL シ ミ ュ レ ーシ ョ ン フ ァ イ ルが
Vivado プ ロ ジ ェ ク ト 内に表示 さ れます。
デザ イ ンで AXI4-Master ま たは AXI4-Slave Lite ポー ト が使用 さ れ る 場合は、 次の よ う にな り ます。
•
AXI 4 イ ン タ ーフ ェ イ ス は ス タ ン ド ア ロ ン Verilog ま たは VHDL フ ァ イ ルの一部ではな く 、 パ ッ ケージ済みの IP
か ら のみ入手で き ます。
•
パ ッ ケージ済み IP には、 Verilog RTL し か含まれません。
AXI イ ン タ ーフ ェ イ ス が使用 さ れ る と 、 最上位の リ セ ッ ト ポー ト AXI4 規格 と 互換性のあ る ア ク テ ィ ブ Low に変換
さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
138
RTL デザイ ンのエ ク スポー ト
RTL 合成
Vivado HLS での合成結果の レ ポー ト には、 ク ロ ッ ク 周波数、 レ ジ ス タ 数、 LUT お よ び ブ ロ ッ ク RAM 数な ど のRTL
合成後に予測 さ れ る 結果の概算が含ま れます。 Vivado HLS ではダ ウ ン ス ト リ ーム RTL 合成での正確な最適化結果が
わか ら ず、 実際の配線遅延 も わか ら ず、 配置配線後の最終的な タ イ ミ ン グ も わか ら ないので、 こ れ ら の結果はあ く ま
で も 概算です。
デザ イ ン を エ ク ス ポー ト す る 前には、 ロ ジ ッ ク 合成を実行 し て、 概算の正確 さ を確認する こ と がで き ます。 図 1-73 の
[Evaluate] オプシ ョ ン を オンに し てお く と 、 エ ク ス ポー ト プ ロ セ ス中に RTL 合成が開始 さ れ、 RTL デザ イ ンがゲー ト
に合成 さ れます。
注記 : RTL 合成オプシ ョ ンはレ ポー ト さ れ る 概算を確認す る ために提供 さ れてい ます。 ほん ど の場合、 こ れ ら の RTL
結果はパ ッ ケージ さ れ る IP には含まれません。
X-Ref Target - Figure 1-73
図 1‐73 : [Export RTL Dialog] ダ イ ア ログ ボ ッ ク ス
ほ と ん ど のエ ク ス ポー ト 形式では、 RTL 合成が verilog ま たは vhdl デ ィ レ ク ト リ (図 1-73 の ド ロ ッ プダ ウ ン メ ニ ュ ー
を使用 し て RTL 合成用に選択 さ れた方の HDL いずれか) で実行 さ れますが、 その RTL 合成の結果はパ ッ ケージ さ れ
る IP には含まれません。
ただ し 、 次のエ ク ス ポー ト 形式を使用す る と 、 合成済み RTL がパ ッ ケージ さ れ る IP に含まれ る よ う にで き ます。
•
[Pcore for EDK] : デザ イ ンの一部ま たはすべて を合成済み RTL と し てエ ク ス ポー ト で き ます。詳細は、次の「PCore
形式でのエ ク ス ポー ト 」 セ ク シ ョ ン を参照 し て く だ さ い。
•
[Synthesized Checkpoint (.dcp)] : デザ イ ン チ ェ ッ ク ポ イ ン ト は常に合成済み RTL と し てエ ク ス ポー ト さ れます。こ
の形式を使用す る 場合、 [Evaluate] オプシ ョ ンは使用で き ません。 RTL は常に実行 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
139
RTL デザイ ンのエ ク スポー ト
IP カ タ ログ形式でのエ ク スポー ト
合成お よ び RTL 検証が終了 し た ら 、 [Export RTL] ツールバー ア イ コ ン (図 1-74) を ク リ ッ ク し て、 [Export RTL Dialog]
ダ イ ア ロ グ ボ ッ ク ス を開 き ます。
X-Ref Target - Figure 1-74
図 1‐74 : [Export RTL] ツールバー ボ タ ン
[Format Selection] セ ク シ ョ ンで [IP Catalog] を選択 し ます (図 1-74)。
[Configuration] を ク リ ッ ク す る と 、 エ ク ス ポー ト さ れ る パ ッ ケージに次の ID タ グ を埋め込む こ と がで き ます。 こ れ ら
の フ ィ ール ド を使用す る と 、 Vivado IP カ タ ロ グ内でパ ッ ケージ さ れた RTL が識別 し やす く な り ます。 値を指定 し な
い場合は、 次の値が使用 さ れます。
•
[Vendor] : xilinx.com
•
[Library] : hls
•
[Version] : 1.0
•
[Description] : An IP generated by Vivado HLS
•
[Display Name] : こ のフ ィ ール ド はデフ ォ ル ト では空白にな り ます。
•
[Taxonomy] : こ の フ ィ ール ド はデフ ォ ル ト では空白にな り ます。
[Evaluate] を オンに し た場合は、 RTL 合成が実行 さ れ、 最終的な タ イ ミ ン グお よ び リ ソ ース が レ ポー ト さ れますが、 IP
パ ッ ケージには含ま れません。 詳細については、 前述の 「RTL 合成」 を参照 し て く だ さ い。
エ ク ス ポー ト プ ロ セ ス が終了 し た後 <project_name>/<solution_name>/impl/ip デ ィ レ ク ト リ の ZIP フ ァ イ
ル アーカ イ ブ を Vivado IP カ タ ロ グに イ ン ポー ト する と 、 ほかの Vivado デザ イ ン (RTL ま たは IP イ ン テ グ レー タ ー )
で使用で き ます。
ソ フ ト ウ ェ ア ド ラ イバー フ ァ イル
AXI4-Slave-Lite イ ン タ ーフ ェ イ ス を含むデザ イ ンの場合、 エ ク ス ポー ト プ ロ セ ス で ソ フ ト ウ ェ ア ド ラ イ バー フ ァ イ
ルのセ ッ ト が作成 さ れます。 こ れ ら の C ド ラ イ バー フ ァ イ ルは SDK C プ ロ ジ ェ ク ト に含めて、 AXI4-Slave-Lite ポー
ト にア ク セ スす る ために使用で き ます。
ソ フ ト ウ ェ ア ド ラ イ バー フ ァ イ ルは、 <project_name>/<solution_name>/impl/ip/drivers デ ィ レ ク ト リ
に書 き 込ま れ、 パ ッ ケージの ZIP アーカ イ ブに含め ら れ ます。 こ れ ら の フ ァ イ ルの使用については、 「 イ ン タ ーフ ェ
イ ス の管理」 の 「バ ス イ ン タ ーフ ェ イ ス の指定」 を参照 し て く だ さ い。
System Generator へのエ ク スポー ト
合成お よ び RTL 検証が終了 し た ら 、 [Export RTL] ツールバー ア イ コ ン (図 1-75) を ク リ ッ ク し て、 [Export RTL Dialog]
ダ イ ア ロ グ ボ ッ ク ス を開 き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
140
RTL デザイ ンのエ ク スポー ト
System Generator for DSP にエ ク ス ポー ト す る プ ロ セ ス は、 System Generator for DSP の ISE バージ ョ ン を使用 し てい る
か、 Vivado バージ ョ ン を使用す る かで異な り ます。 デザ イ ン フ ロ ーに最適な ツールを ど ち ら か選択 し て く だ さ い。 次
の例では、 Vivado バージ ョ ンが使用 さ れます (図 1-75)。
X-Ref Target - Figure 1-75
図 1‐75 : System Generator への RTL のエ ク スポー ト
IP ブ ロ ッ ク の配置配線後の リ ソ ースお よ び タ イ ミ ン グ統計が必要な場合は、 [Evaluate] を オンに し 、 必要な RTL 言語
を指定 し ます。
[OK]
をク リ ッ クして
IP
パ ッ ケ ー ジ を 生成 し ま す。 こ の パ ッ ケ ー ジ は、
<project_name>/<solution_name>/impl/sysgen デ ィ レ ク ト リ に書 き 込 ま れ ま す。 こ のデ ィ レ ク ト リ には、
System Generator へデザ イ ン を イ ン ポー ト す る ために必要な も のがすべて含まれます。
[Evaluate] を オンに し た場合は、 RTL 合成が実行 さ れ、 最終的な タ イ ミ ン グお よ び リ ソ ース が レ ポー ト さ れますが、 IP
パ ッ ケージには含ま れません。 詳細については、 前述の 「RTL 合成」 を参照 し て く だ さ い。
System Generator への RTL のイ ンポー ト
Vivado HLS で生成 さ れた System Generator パ ッ ケージは、 次の手順で System Generator に イ ン ポー ト で き ます。
1.
System Generator デザ イ ン内で右 ク リ ッ ク し 、 XilinxBlockAdd オプシ ョ ン を使用 し て新 し いブ ロ ッ ク を イ ン ス タ
ン シエー ト し ます。
2.
ダ イ ア ロ グ ボ ッ ク ス の リ ス ト を ス ク ロ ールダ ウ ン し 、 [Vivado HLS] を選択 し ます。
3.
新 し く イ ン ス タ ン シエー ト し た Vivado HLS ブ ロ ッ ク を ダブル ク リ ッ ク し 、 [Block Parameters] ダ イ ア ロ グ ボ ッ ク
ス を開 き ます。
4.
Vivado HLS ブ ロ ッ ク がエ ク ス ポー ト さ れた solution デ ィ レ ク ト リ を参照 し ます。 上記の例の
<project_name>/<solution_name>/impl/sysgen の場合、 <project_name>/<solution_name>
デ ィ レ ク ト リ を参照 し 、 [apply] を ク リ ッ ク し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
141
RTL デザイ ンのエ ク スポー ト
ポー ト の最適化
最上位関数の引数が合成プ ロ セ ス中に 1 つの複合ポー ト に ま と め ら れ る と 、 そのポー ト の タ イ プ情報はわか ら ないの
で、 System Generator IP ブ ロ ッ ク には含まれません。
こ のため、 ポー ト で再形成、 マ ッ ピ ン グ、 デー タ パ ッ キ ン グ最適化な ど を使用 し た場合は、 こ れ ら の複合ポー ト に対
し てポー ト タ イ プ情報を System Generator で指定す る 必要があ り ます。
System Generator で タ イ プ情報を手動で指定す る には、 まず複合ポー ト が ど の よ う に作成 さ れたか理解 し ておいてか
ら 、 Vivado HLS ブ ロ ッ ク を シ ス テ ムのほかのブ ロ ッ ク に接続する 際に System Generator 内で ス ラ イ スお よ び再変換ブ
ロ ッ ク を使用 し ます。
例:
•
R、 G、 B の 3 つの 8 ビ ッ ト 入出力ポー ト が 24 ビ ッ ト 入力ポー ト (RGB_in) と 24 ビ ッ ト 出力ポー ト (RGB_out) に
パ ッ ク さ れてい る と し ます。
IP ブ ロ ッ ク が System Generator に含ま れ る 際には、 次の よ う にな っ てい る 必要があ り ます。
•
24 ビ ッ ト 入力ポー ト (RGB_in) は、 3 つの 8 ビ ッ ト 入力信号 (Rin、 Gin、 Bin) を正 し く ま と めた System Generator
ブ ロ ッ ク で駆動 さ れ る 必要があ り ます。
•
24 ビ ッ ト 出力ポー ト (RGB_out) は、 3 つの 8 ビ ッ ト 入力信号 (Rout、 Bout、 Gout) に正 し く 分割 さ れ る 必要があ り
ます。
複合 タ イ プ の ポ ー ト に接続す る た め の ス ラ イ ス お よ び再変換ブ ロ ッ ク の使用方法に の詳細につい て は、 System
Generator の資料を参照 し て く だ さ い。
Pcore フ ォ ーマ ッ ト でのエ ク スポー ト
合成お よ び RTL 検証が終了 し た ら 、 [Export RTL] ツールバー ア イ コ ン (図 1-76) を ク リ ッ ク し て、 [Export RTL Dialog]
ダ イ ア ロ グ ボ ッ ク ス を開 き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
142
RTL デザイ ンのエ ク スポー ト
[Format Selection] セ ク シ ョ ンで [Pcore for EDK] を選択 し ます (図 1-76)。
X-Ref Target - Figure 1-76
図 1‐76 : RTL を Pcore と し て エ ク スポー ト
[Configuration] ダ イ ア ロ グ ボ ッ ク ス を使用する と 、IP の設定お よ び イ ンプ リ メ ン テーシ ョ ン を カ ス タ マ イ ズで き ます。
Pcore パ ッ ケージのバージ ョ ン情報フ ィ ール ド も そ こ でカ ス タ マ イ ズで き る こ と があ り ます。何 も 指定 し ない場合、デ
フ ォ ル ト は、 1.00.a です。
[Configuration] ダ イ ア ロ グ ボ ッ ク ス では、 pcore の一部ま たはすべてに対 し てネ ッ ト リ ス ト (.ngc フ ァ イ ル) が生成で
き る よ う にで き ます。 デザ イ ン のネ ッ ト リ ス ト を生成す る 利点は、 デザ イ ン が XPS 内でエ ラ ボ レー ト さ れた と き に
同 じ ネ ッ ト リ ス ト が使用 さ れ る こ と にあ り ます。 次の よ う なネ ッ ト リ ス ト オプシ ョ ンがあ り ます。
none : デフ ォ ル ト の設定で、 ネ ッ ト リ ス ト は生成 さ れません。 IP には RTL フ ァ イ ルのみが含まれます。
ip : ザ イ リ ン ク ス IP があ る 場合はそのネ ッ ト リ ス ト が生成 さ れ ます。 ザ イ リ ン ク ス IP のネ ッ ト リ ス ト が生成 さ れ ま
す。 こ れに よ り 、 すべてのザ イ リ ン ク ス IP が合成 さ れ、 IP パ ッ ケージに含まれ る よ う にな り ます。
top : 最上位デザ イ ンのネ ッ ト リ ス ト が生成 さ れ ます。 デザ イ ン全体が合成 さ れ、 結果がパ ッ ケージ さ れた IP に含ま
れます。
IP ブ ロ ッ ク の配置配線後の リ ソ ースお よ び タ イ ミ ン グ統計が必要な場合は、 [Evaluate] を オンに し 、 必要な RTL 言語
を指定 し ます。 [OK] を ク リ ッ ク し て Pcore パ ッ ケージ を生成 し ます。 こ のパ ッ ケージは、
<project_name>/<solution_name>/impl/pcores デ ィ レ ク ト リ に書き 込まれます。
[Evaluate] を オンに し た場合は、 RTL 合成が実行 さ れ、 最終的な タ イ ミ ン グお よ び リ ソ ース が レ ポー ト さ れますが、 IP
パ ッ ケージには含ま れません。 詳細については、 前述の 「RTL 合成」 を参照 し て く だ さ い。
Vivado HLS 生成の Pcore パ ッ ケージは、 pcore デ ィ レ ク ト リ の内容を EDK プ ロ ジ ェ ク ト の pcore デ ィ レ ク ト リ に コ
ピーす る と 、 EDK 環境に イ ン ポー ト で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
143
RTL デザイ ンのエ ク スポー ト
ソ フ ト ウ ェ ア ド ラ イバー フ ァ イル
AXI4-Slave-Lite イ ン タ ーフ ェ イ ス を含むデザ イ ンの場合、 エ ク ス ポー ト プ ロ セ ス で ソ フ ト ウ ェ ア ド ラ イ バー フ ァ イ
ルのセ ッ ト が作成 さ れます。 こ れ ら の C ド ラ イ バー フ ァ イ ルは SDK C プ ロ ジ ェ ク ト に含めて、 AXI4-Slave-Lite ポー
ト にア ク セ スす る ために使用で き ます。
ソ フ ト ウ ェ ア ド ラ イ バー フ ァ イ ルは、 pcore 内の include デ ィ レ ク ト リ
(例 : <project_name>/<solution_name>/impl/pcores/<design_name_version>/inlcude) に書 き 込まれます。 こ れ ら の フ ァ イ ル
の使用については、 「 イ ン タ ーフ ェ イ ス の管理」 の 「バ ス イ ン タ ーフ ェ イ ス の指定」 を参照 し て く だ さ い。
合成済みチ ェ ッ ク ポ イ ン ト のエ ク スポー ト
合成お よ び RTL 検証が終了 し た ら 、 [Export RTL] ツールバー ア イ コ ン (図 1-77) を ク リ ッ ク し て、 [Export RTL Dialog]
ダ イ ア ロ グ ボ ッ ク ス を開 き ます。
X-Ref Target - Figure 1-77
図 1‐77 : RTL の合成済みチ ェ ッ ク ポ イ ン ト へのエ ク スポー ト
デザ イ ンがデザ イ ン チ ェ ッ ク ポ イ ン ト IP と し てパ ッ ケージ さ れ る 場合、 パ ッ ケージ よ り も 前に まず合成を実行す る
必要があ り ます。 IP をパ ッ ケージす る 際は、 [Evaluate] オプシ ョ ンはオ フ に し ます。
[OK] を ク リ ッ ク し てデザ イ ン チ ェ ッ ク ポ イ ン ト パ ッ ケージ を生成 し ます。 こ のパ ッ ケージは、
<project_name>/<solution_name>/impl/ip デ ィ レ ク ト リ に書 き 込まれます。 デザ イ ン チ ェ ッ ク ポ イ ン ト フ ァ イ ルは、 そ
の他のデザ イ ン チ ェ ッ ク ポ イ ン ト と 同 じ よ う に Vivado プ ロ ジ ェ ク ト で使用で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
144
第 2章
高位合成演算子および コ ア
演算子および コ ア
Vivado 高位合成 (HLS) は、 C、 C++、 ま たは SystemC デザ イ ン仕様を レ ジ ス タ ト ラ ン ス フ ァ ー レベル (RTL) イ ンプ
リ メ ン テーシ ョ ンに変換 し 、 それをザ イ リ ン ク ス フ ィ ール ド プ ロ グ ラ マブル ゲー ト ア レ イ (FPGA) に合成す る こ と
がで き ます。
こ のために、 Vivado HLS では次の作業が実行 さ れます。
•
まず、 C、 C++、 ま たは SystemC の ソ ース コ ー ド が演算子を含む内部デー タ ベース にエ ラ ボ レー ト さ れます。
°
•
演算子は、 加算、 乗算、 配列読み出 し お よ び書 き 込みな ど C コ ー ド の演算を表 し ます。
合成中、 Vivado HLS に よ り 、 Vivado HLS ラ イ ブ ラ リ か ら の コ アに演算子がマ ッ プ さ れます。
°
コ アは、 デザ イ ン作成のために使用 さ れ る 特定ハー ド ウ ェ ア コ ン ポーネ ン ト です (加算器、 乗算器、 パ イ プ
ラ イ ン乗算器、 ブ ロ ッ ク RAM な ど)。
°
各ザ イ リ ン ク ス テ ク ノ ロ ジ (Spartan®-6、 Virtex®-7 な ど のザ イ リ ン ク ス デバ イ ス®) の ラ イ ブ ラ リ が提供 さ
れてい ます。
本章では、 Vivado HLS でサポー ト さ れてい る 演算子お よ びその ラ イ ブ ラ リ について説明 し ます。
合成の概要
C ソ ース コ ー ド を レ ジ ス タ ト ラ ン ス フ ァ ー レベル (RTL) 記述に変換する ためVivado HLS を実行する と 、ソ ース コ ー
ド は演算子を含む内部デー タ ベース にエ ラ ボ レー ト さ れます。
演算子は本章で説明 さ れてい ますが、 基本的には、 加算、 シ フ ト 、 乗算、 ビ ッ ト ス ラ イ ス、 ア レ イ ア ク セ ス な ど、 C
ソ ース コ ー ド の演算で構成 さ れてい ます。
Vivado HLS でデザ イ ンが合成 さ れ る と き こ の内部デー タ ベース が使用 さ れます。 合成は 「ス ケ ジ ュ ー リ ン グ」 と 「バ
イ ンデ ィ ン グ」 と い う 2 つのプ ロ セ ス か ら 成 り 立っ てい ます。
スケジ ュ ー リ ング と は
ス ケ ジ ュ ー リ ン グ と は、 ど のサ イ ク ルで演算を実行す る かがVivado HLS で決定 さ れ る プ ロ セ ス です。
た と えば、 同 じ ク ロ ッ ク サ イ ク ルで 2 つの加算が ス ケ ジ ュ ール さ れてい る と 、 こ の 2 つの加算が同 じ ハー ド ウ ェ ア加
算器を使用す る こ と はで き ません。 し か し 、 異な る ク ロ ッ ク サ イ ク ルで ス ケ ジ ュ ール さ れてい る 場合、 同 じ 加算器を
使用で き 、 リ ソ ース を節約す る こ と がで き ます。 合成指示子がなければ、 Vivado HLS では タ ーゲ ッ ト ク ロ ッ ク 周波
数を満たす よ う にパフ ォーマ ン スお よ び使用量のバ ラ ン ス が調整 さ れたデザ イ ンが生成 さ れ、 デザ イ ンの並列処理が
検索 さ れ、 タ ーゲ ッ ト FPGA の利点を生か さ れ る よ う にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
145
合成の概要
バイ ンデ ィ ング と は
ス ケ ジ ュ ー リ ン グが完了 し た ら 、 次はバ イ ンデ ィ ン グ プ ロ セ ス です。 こ のプ ロ セ ス では、 テ ク ノ ロ ジ ラ イ ブ ラ リ か
ら の特定ハー ド ウ ェ ア イ ンプ リ メ ン テーシ ョ ン (ま たは コ ア) に ス ケ ジ ュ ール済みの演算が関連付け ら れます。
た と えば、 ソ ース コ ー ド のあ る 乗算は標準の組み合わせ乗算器で イ ンプ リ メ ン ト する こ と がで き る 一方で、 別の乗算
はパ イ プ ラ イ ン 乗算器で イ ン プ リ メ ン ト す る こ と がで き ま す。 パ イ プ ラ イ ン 乗算には 2 段必要 と な る ので、 ス ケ
ジ ュ ー リ ン グ中に こ の点が考慮 さ れてい る はずです。
Vivado HLS では、バ イ ンデ ィ ン グの影響 (演算の イ ンプ リ メ ン テーシ ョ ンに使用 さ れ る 特定コ アの情報) は ス ケ ジ ュ ー
リ ン グ プ ロ セ ス中に考慮 さ れ ま す。 図 2-1 には ス ケ ジ ュ ー リ ン グお よ びバ イ ンデ ィ ン グのプ ロ セ ス が示 さ れてい ま
す。 こ う し てバ イ ンデ ィ ン グ中の決定事項に よ っ てデザ イ ンが再ス ケ ジ ュ ール さ れ る こ と がない、 つま り 、 際限な く
繰 り 返 し が実行 さ れ る こ と がない よ う にな っ てい ます。
バ イ ンデ ィ ン グ中に使用可能な コ アの種類は選択 さ れてい る デバ イ ス に よ っ て異な り ます。Vivado HLS では、 ザ イ リ
ン ク ス デバ イ ス ご と に ラ イ ブ ラ リ が提供 さ れてい る ので、異な る ラ イ ブ ラ リ の コ アには異な る 遅延お よ び タ イ ミ ン グ
が設定 さ れてい ます。 各 コ アに関連付け ら れてい る 遅延は、 1 つの ク ロ ッ ク サ イ ク ルに ど の コ ア を ス ケ ジ ュ ールで き
る かに影響を及ぼ し ます。
作成 さ れ る ス ケ ジ ュ ールはど の コ アに演算子が関連付け ら れてい る かに よ っ て異な り ます。 こ のため、 ス ケ ジ ュ ー リ
ン グ プ ロ セ ス ではバ イ ンデ ィ ン グのデザ イ ンへの影響が考慮 さ れます。
X-Ref Target - Figure 2-1
図 2‐1 : 合成プ ロ セス
デバ イ ス の選択に加え、 Vivado HLS では ス ケ ジ ュ ー リ ン グお よ びバ イ ンデ ィ ン グ プ ロ セ ス を制御す る ための さ ま ざ
ま な コ マ ン ド お よ び指示子が提供 さ れてい ます。
合成プ ロ セ ス は イ ンプ リ メ ン テーシ ョ ンにおいて複雑で、 デザ イ ン作成にあ た り 次の よ う な多 く の要素が考慮 さ れま
す。
•
コ ー ド の演算子
•
デザ イ ン ス ケ ジ ュ ール
•
コ アの タ イ ミ ン グ遅延
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
146
合成の概要
•
ユーザー制約お よ び指示子
•
バ イ ンデ ィ ン グ プ ロ セ ス
RTL イ ンプ リ メ ン テーシ ョ ン で使用可能な コ ア を理解す る こ と は、 ハ イ パフ ォーマ ン ス デザ イ ン を達成する ために
は重要です。 次のセ ク シ ョ ンでは、 Vivado HLS の演算お よ び コ アについて説明 し ます。
演算子、 コ ア、 指示子について
高位合成中、 C、 C++、 ま たは SysytemC の ソ ース コ ー ド の演算子が内部デー タ ベース で識別お よ び表示 さ れます。 内
部デー タ ベース の リ ス ト ま たはア ク セ ス用の コ マ ン ド はあ り ませんが、 演算は Vivado HLS の GUI にあ る [Analysis]
表示で確認す る こ と がで き ます。 図 2-2 は [Analysis] 表示の例です。
X-Ref Target - Figure 2-2
図 2‐2 : [Analysis] 表示の演算
図 2-2 で複数の演算が確認で き ます。 た と えば、 加算は add、 乗算は mul、 配列読み出 し は load、 比較は cmp、 ブ レー
ク は br で表 さ れてい ます。
図 2-2 は、 [Analysis] 表示での演算子バ イ ンデ ィ ン グの結果がど の よ う に表示 さ れ る か を示 し てい ます。
ブ ロ ッ ク [bb2] の [mul] 演算が [Schedule] (図の右側) で選択 さ れてい る と 、[Resource] (図の左側) で も ハ イ ラ イ ト さ れ、
mul 演算がハー ド ウ ェ ア乗算器 リ ソ ー ス お よ び イ ン ス タ ン ス [grp_fu_133] に関連付け ら れてい る こ と が分か り ま す。
イ ン ス タ ン ス [grp_fu_133] (RTL で も 同 じ 名前が使用 さ れ る ) も ま た、2 つ目の乗算用に使用 さ れ る こ と が分か り ます。
[grp_fu_133] 内に [tmp2] お よ び [tmp3] の 2 つの演算があ り 、 こ の 1 つのハー ド ウ ェ ア イ ン ス タ ン ス が 2 つの mul 演
算に対 し て使用 さ れてい る こ と にな り ます。
•
乗算な ど の演算は、 特定 コ ア を使用 し て、 特定ハー ド ウ ェ ア乗算器で RTL デザ イ ンに イ ンプ リ メ ン ト さ れます。
すべての演算が コ アにマ ッ プ さ れ る わけではあ り ません。
•
ループやス イ ッ チ文か ら のブ レー ク な ど の演算は制御フ ロ ー動作であ り 、 ラ イ ブ ラ リ か ら の コ アではな く ロ ジ ッ
ク を使用 し て イ ンプ リ メ ン ト さ れます。 こ の よ う な演算はユーザー指示子で制御す る こ と はで き ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
147
演算子および コ アの制御
演算子および コ アの制御
Vivado HLS では次の よ う な方法で演算お よ び コ アの使用が制御 さ れます。
•
演算の割 り 当てプ ロ セ ス を指示
•
演算の特定 リ ソ ース を指示
•
ス ケ ジ ュ ー リ ン グ エ フ ォー ト
•
演算子を コ アにバ イ ン ド す る プ ロ セ ス を制御
•
コ アの詳細を リ ス ト
演算子の制限
Vivado HLS ではデザ イ ン で使用 さ れ る 演算子の数を制限す る こ と がで き ます。 た と えば、 foo と い う デザ イ ンには乗
算が 317 あ る のに FPGA には乗算器が 256 し かない場合、 次の割 り 当て コ マ ン ド を使用する と 、 乗算 (mul) 演算子の
最大数を 256 に設定 し てデザ イ ン ス ケ ジ ュ ールを作成す る こ と がで き ます。
set_directive_allocation -limit 256 -type operation foo mul
こ の割 り 当て指示子は、 コ アお よ び特定下位関数の イ ン ス タ ン ス数を制限す る のに も 同 じ よ う に使用す る こ と がで き
る ため、 –type オプシ ョ ンに operation を指定 し てい ます。
デフ ォ ル ト では Vivado HLS はパフ ォーマ ン ス を最大限に し よ う と す る ため、 場合に よ っ ては、 エ リ ア低減のため明
示的に演算子の数を制限す る 必要があ り ます。
•
合成指示子がなければ、 Vivado HLS では タ ーゲ ッ ト ク ロ ッ ク 周波数を満たす よ う にパフ ォーマ ン スお よ び使用
量のバ ラ ン ス が調整 さ れたデザ イ ンが生成 さ れ、 デザ イ ンの並列処理が検索 さ れ、 タ ーゲ ッ ト FPGA の利点を生
か さ れ る よ う にな り ます。
•
最大ま たは最小レ イ テ ン シ を指定す る ため指示子が適用 さ れ る と 、Vivado HLS は こ れ ら の レ イ テ ン シ制約を満た
そ う と し ます。
•
パ イ プ ラ イ ンのために指示子が適用 さ れ る と 、Vivado HLS は まず こ れ ら の制約を満たそ う と し 、次に任意の レ イ
テ ン シ制約を最小限に抑え る か、 ま たは満たそ う と し ます。
レ イ テ ン シ を最小限に抑え る と い う こ と は最終デザ イ ン で よ り 多 く の コ アが使用 さ れ る こ と を意味 し ま す。 た と え
ば、 2 ク ロ ッ ク サ イ ク ルかけて同 じ 加算器を共有す る のではな く 、 同 じ ク ロ ッ ク サ イ ク ルで 2 つの加算器を使用 し ま
す。
演算子の数を制限す る と 、 最終デザ イ ンで使用 さ れ る コ アが少な く な り ますが、 レ イ テ ン シ を増加 さ せ る こ と にな る
可能性があ り ます。
表 2-1 には set_directive_allocation コ マ ン ド を使用 し て制御で き る 演算がすべて リ ス ト さ れてい ます。
リ ソ ースの制御
set_directive_resource コ マ ン ド は演算に対 し ど の コ ア を使用す る か を指定 し ます。 こ の指示子は ス ケ ジ ュ ー
リ ン グ プ ロ セ ス中に コ ア を特定 し 、 明示的にバ イ ンデ ィ ン グ を指定 し ます。
テ ク ノ ロ ジ ラ イ ブ ラ リ の詳細を リ ス ト す る と 、 各 コ ア ( リ ソ ース) で ど の演算を イ ン プ リ メ ン ト で き る かが表示 さ れ
ます。 詳細は 「 コ アの詳細」 を参照 し て く だ さ い。
set_directive_resource は、 配列の イ ンプ リ メ ン ト 用の メ モ リ エ レ メ ン ト を指定する のに通常使用 さ れます。
Vivado HLS は解析を実行 し て、 各演算に ど の コ ア を使用で き る のか、 ま た使用すべき か を決定する こ と がで き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
148
演算子および コ アの制御
配列の場合、 各配列に対 し テ ク ノ ロ ジ ラ イ ブ ラ リ か ら 特定 メ モ リ を指定する 必要があ り ます。 何 も 指定 さ れていない
場合、 最小開始間隔お よ び最小レ イ テ ン シ を提供す る メ モ リ (シ ン グルま たはデ ュ アル ポー ト ) が高位合成 (HLS) で
自動的に選択 さ れます。
こ の リ ソ ー ス 指 示 子 は、 リ ソ ー ス の タ ー ゲ ッ ト と し て 割 り 当 て ら れ て い る 変数 を 使用 し ま す。 関 数 foo に
Result=A*B と い う コ ー ド があ る と し ます。 こ の例では、 Mul2S と い う 2 段のパ イ プ ラ イ ン乗算器 コ ア を使用 し て
乗算が イ ンプ リ メ ン ト さ れ る よ う に指定 し ます。
set_directive_resource -core Mul2S foo Result
変数が複数の演算子で使用 さ れてい る 場合、 各演算子に対 し 変数は 1 つ と な る よ う に コ ー ド を変更す る 必要があ り ま
す。 た と えば、
Result = (A*B) + C;
こ れを次の よ う に変更 し ます。
Result_tmp = (A*B);
Result = Result_tmp + C;
Result_tmp の指示子は乗算 リ ソ ース を制御 し 、 Result は加算 リ ソ ース を制御 し ます。
スケジ ュ ールの制御
config_schedule コ マ ン ド は、 ス ケ ジ ュ ー リ ン グ中のエ フ ォー ト を制御 し 、 デザ イ ン で制約を満たす こ と がで き な
か っ たパ ス を正確に識別 し ます。
スケジ ュ ー リ ング エ フ ォ ー ト
Vivado HLS での run ス ト ラ テジ を制御す る 、 high、 low、 お よ び medium の概要を説明 し ます。
Vivado HLS で run ス ト ラ テジが high に設定 さ れてい る 場合、 制約が満た さ れた後で も 、 さ ら に小型ま たは高速なデ
ザ イ ン が作成で き る か ど う か を判断す る ため、 追加 CPU サ イ ク ルお よ び メ モ リ が使用 さ れ ます。 こ の作業に よ り さ
ら に質の高いデザ イ ンが作成 さ れ る 可能性があ り ますが、 完了ま でに時間がかか り 、 ま た よ り 多 く の メ モ リ が必要に
な り ます。 僅差で目標を満たす こ と がで き ないデザ イ ンや、 いろいろ な最適化の組み合わせが可能なデザ イ ン であれ
ば、 こ の ス ト ラ テジは有益 と いえ る で し ょ う 。
デザ イ ンに よ っ ては、 コ ー ド の記述方法に よ り あ ま り 最適化で き ない も のがあ り ます。 た と えば、 あ る 変数か ら 別の
変数にデー タ を移動 さ せ る よ う に コ ー ド が記述 さ れてい る 場合、 ほかの作業を行 う 必要はな く 、 ただその コ ー ド を イ
ンプ リ メ ン ト す る 必要だけがあ り ます。
•
Vivado HLS では、 時間を費や し て改善 さ れ る か ど う かは判断 さ れません。
•
Vivado HLS は改善の余地があ る か ど う か を検討す る ための ソ フ ト ウ ェ アです。こ の よ う なデザ イ ンの場合は、run
ス ト ラ テジ を low に設定 し てお く と 、 時間をかけずに同 じ 結果を得 る こ と がで き ます。
つま り 、 run ス ト ラ テジはデフ ォ ル ト の medium の ま ま に し てお く のがベス ト です。
ヒ ン ト : 演算子 と コ ア をいろいろ組み合わせた り する 余地があ ま り ないデザ イ ンや、 実行に時間がかか る デザ イ ンの
場合は、 エ フ ォー ト レベルを low に し てお く と 、 あ ま り 時間を かけずに同 じ 結果が得 ら れ る 可能性があ り ます。
ヒ ン ト : エ リ アや タ イ ミ ン グにおいてパフ ォーマ ン ス要件を僅差で満たす こ と がで き ないデザ イ ンの場合は、 さ ら に
改善の余地があ る か ど う か を確認す る ため、 エ フ ォー ト レベルを high に設定す る と よ いで し ょ う 。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
149
演算子および コ アの制御
ク リ テ ィ カル パス解析
config_schedule コ マ ン ド には –verbose オプシ ョ ン も あ り ます。 こ のオプシ ョ ン を指定す る と 、 ス ケ ジ ュ ー
リ ン グで制約を満たす こ と がで き ない場合、 Vivado HLS に よ り フル ク リ テ ィ カル パ ス が出力 さ れます。
バイ ンデ ィ ングの制御
config_bind コ マ ン ド はバ イ ンデ ィ ン グ プ ロ セ ス を制御 し ます。 こ の コ マ ン ド は、 コ ア を演算子に関連付け る と
き のエ フ ォー ト レベルを指定 し 、ま たエ リ ア要件の厳 し いデザ イ ン で演算子を最小限に抑え る ために直接制御がで き
る よ う に し ます。
バイ ンデ ィ ン グ エ フ ォ ー ト
ス ケ ジ ュ ー リ ン グ エ フ ォー ト の一般ガ イ ド ラ イ ンがバ イ ンデ ィ ン グに も 当ては ま り ます。 こ の場合、 演算に対 し 使用
可能な コ アが多 く あ る デザ イ ンは、 あ ま り 選択肢のないデザ イ ン よ り も 、 エ フ ォー ト レベルを高 く す る と 利点があ り
ます。
各演算子を イ ンプ リ メ ン ト す る こ と がで き る コ アの数を確認する には、 list_core コ マ ン ド を使用す る こ と がで き
ます。 こ の コ マ ン ド の詳細は 「 コ アの詳細」 を参照 し て く だ さ い。
演算子を最小限に抑え る
デザ イ ンで も っ と リ ソ ース が共有 さ れ る よ う にす る には config_bind コ マ ン ド を使用す る こ と がで き ます。
•
config_bind コ マ ン ド に –min_op オプシ ョ ン を設定す る と 、 Vivado HLS で最小数の指定演算子でデザ イ ンが作
成 さ れます。
た と えば、 次の よ う に コ マ ン ド を入力す る と 、 最小数の add 演算子でデザ イ ンが作成 さ れます。
config_bind -min_op add
こ の コ マ ン ド はバ イ ンデ ィ ン グ プ ロ セ ス に影響す る ので、 異な る ク ロ ッ ク サ イ ク ルで演算子が ス ケ ジ ュ ール さ れて
い る と き にのみ効果があ り ます。 ほかの制約を満たすため (レ イ テ ン シお よ びスループ ッ ト )、 同 じ ク ロ ッ ク サ イ ク ル
に演算子が ス ケ ジ ュ ール さ れてい る 場合、 config_bind コ マ ン ド は こ れ ら の演算子には効果が あ り ま せん。 ス ケ
ジ ュ ー リ ン グの結果に影響を及ぼす割 り 当て指示子を まずは使用 し て演算子の数を制限 し て く だ さ い。
こ の コ マ ン ド オプシ ョ ンは MUX の使用率を変更す る のに通常使用 さ れ ます。 同 じ コ アで演算が共有 さ れてい る と 、
LUT に イ ンプ リ メ ン ト さ れてい る 追加 MUX が タ イ ミ ン グ と エ リ アの両方に著 し く 影響を及ぼす可能性があ り ます。
タ イ ミ ン グ違反の可能性があ る 場合は、 Vivado HLS では通常 MUX の使用に保守的な措置を取る のが一般的です。
コ アの詳細
list_core コ マ ン ド は、 ラ イ ブ ラ リ で使用可能な コ アの詳細を表示する のに使用 さ れます。
list_core を使用す る には、 set_part コ マ ン ド を使用 し てデバ イ ス を選択す る 必要があ り ます。 デバ イ ス が選
択 さ れていない場合は、 コ マ ン ド の影響はあ り ません。
•
list_core コ マ ン ド の –operation オプシ ョ ンは、 ラ イ ブ ラ リ にあ る コ アの う ち、 指定 さ れた演算で イ ンプ リ メ ン
ト で き る も のをすべて リ ス ト し ます。
表 2-1 には、 使用可能な演算が リ ス ト さ れてい ます。 オプシ ョ ン を指定せずに こ の コ マ ン ド を使用する と 、 タ ーゲ ッ
ト デバ イ ス に対 し て使用可能な コ アがすべて リ ス ト さ れます。
•
–type オプシ ョ ンは、 カ テ ゴ リ 別に コ ア を リ ス ト し たい場合に使用 し ます。
°
Function Units - 標準 RTL 演算 (加算、 乗算、 比較な ど) を イ ンプ リ メ ン ト す る コ ア
°
Storage - レ ジ ス タ や メ モ リ な ど の ス ト レージ エ レ メ ン ト を イ ンプ リ メ ン ト す る コ ア
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
150
高位合成の演算子
Adapter - IP 生成時に最上位デザ イ ン を接続す る ために使用す る イ ン タ ーフ ェ イ ス を イ ンプ リ メ ン ト す る コ
ア。 こ れ ら の イ ン タ ーフ ェ イ ス は、 エンベデ ッ ド 開発キ ッ ト (EDK) な ど の IP 生成フ ロ ーで使用 さ れ る RTL
ラ ッ パーに イ ンプ リ メ ン ト さ れます。
°
°
IP Blocks - 使用可能な IP コ ア
°
Connectors - デザ イ ン内の接続を イ ンプ リ メ ン ト す る コ ア。直接接続やス ト リ ー ミ ン グ ス ト レージ エ レ メ ン
ト が こ れに含ま れます。
「高位合成の コ ア」 にあ る 表にザ イ リ ン ク ス デバ イ ス で使用 さ れ る 標準 コ アが リ ス ト さ れてい ます。
高位合成の演算子
表 2-1 には高位合成 (HLS) で使用 さ れ る 演算子が リ ス ト さ れてい ます。
こ の表の各列には各演算についての次の情報が記載 さ れてい ます。
•
[Analysis] 表示で表示可能か ど う か
•
set_directive_allocation お よ び set_directive_resource の指示子ま たは、config_bind コ マ ン ド
で制御可能か ど う か
•
関連付け ら れてい る コ ア を ラ イ ブ ラ リ か ら リ ス ト で き る か ど う か
表 2‐1 : 高位合成の演算子
演算子
説明
[Analysis] 表示
指示子によ る制御 ラ イ ブ ラスリトコ アの リ
add
加算
X
X
X
ashr
四則演算右シ フ ト
X
X
X
br
ブ レー ク
X
dadd
倍精度浮動小数点の加算
X
X
X
dcmp
倍精度浮動小数点の比較
X
X
X
ddiv
倍精度浮動小数点の除算
X
X
X
dmul
倍精度浮動小数点の乗算
X
X
X
dptosi
倍精度浮動小数点の符号付 き 整
数への変換
X
X
X
dptoui
倍精度浮動小数点の符号な し 整
数への変換
X
X
X
drecip
倍精度浮動小数点の逆数
X
X
X
drem
倍精度浮動小数点の剰余
X
X
X
drsqrt
倍精度浮動小数点の逆数平方根
X
X
X
dsub
倍精度浮動小数点の減算
X
X
X
dsqrt
倍精度浮動小数点の平方根
X
X
X
fadd
単精度浮動小数点の加算
X
X
X
fcmp
単精度浮動小数点の比較
X
X
X
fdiv
単精度浮動小数点の除算
X
X
X
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
151
高位合成の演算子
表 2‐1 : 高位合成の演算子 (続き)
演算子
説明
[Analysis] 表示
指示子によ る制御 ラ イ ブ ラスリトコ アの リ
fiforead
FIFO 読み出 し
X
X
fifowrite
FIFO 書 き 込み
X
X
fifonbread
非ブ ロ ッ キ ン グ FIFO 読み出 し
X
X
fifonbwrite
非ブ ロ ッ キ ン グ FIFO 書き 込み
X
X
fmul
単精度浮動小数点の乗算
X
X
X
fpext
単精度浮動小数点の符号拡張
X
X
X
fptosi
単精度浮動小数点か ら 符号付 き
整数への変換
X
X
X
fptoui
単精度浮動小数点か ら 符号な し
整数への変換
X
X
X
fptrunc
単精度浮動小数点の切 り 捨て
X
X
X
frecip
単精度浮動小数点の逆数
X
X
X
frem
単精度浮動小数点の剰余
X
X
X
frsqrt
単精度浮動小数点の逆数平方根
X
X
X
fsub
単精度浮動小数点の減算
X
X
X
fsqrt
単精度浮動小数点の平方根
X
X
X
icmp
整数比較
X
X
X
load
メ モ リ 読み出 し
X
lshr
論理演算右シ フ ト
X
X
X
mul
乗算
X
X
X
mux
マルチプ レ ク サ
X
phi
マルチプ レ ク サ
X
sdiv
符号付 き 除算
shl
左シ フ ト
X
X
X
sitodp
単精度か ら 倍精度浮動小数点へ
の変換
X
X
X
sitofp
符号付 き 整数か ら 単精度浮動小
数点への変換
X
X
X
srem
符号付 き 剰余
X
X
store
メ モ リ 書 き 込み
X
X
sub
減算
X
X
X
udiv
符号な し 除算
X
X
X
uitodp
符号な し 整数か ら 倍精度浮動小
数点への変換
X
X
X
uitofp
符号な し 整数か ら 単精度浮動小
数点への変換
X
X
X
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
X
X
X
japan.xilinx.com
Send Feedback
152
高位合成のコ ア
表 2‐1 : 高位合成の演算子 (続き)
演算子
説明
[Analysis] 表示
urem
符号な し 剰余
X
wireread
I/O 読み出 し
X
wirewrite
I/O 書 き 込み
X
指示子によ る制御 ラ イ ブ ラスリトコ アの リ
X
高位合成の コ ア
Vivado HLS コ アは次のカ テ ゴ リ で リ ス ト す る こ と がで き ます (list_core コ マ ン ド で も 使用可能)。
•
「フ ァ ン ク シ ョ ン ユニ ッ ト コ ア」
•
「ス ト レージ コ ア」
•
「 コ ネ ク タ ー コ ア」
•
「ア ダプ タ ー コ ア」
•
「浮動小数点 コ ア」
•
IP ブ ロ ッ ク
こ れ ら の コ アの詳細は、 表 2-2 か ら 表 2-6 を参照 し て く だ さ い。
フ ァ ン ク シ ョ ン ユニ ッ ト コ ア
表 2-2 には標準 RTL 演算 (加算、 乗算、 比較な ど) を イ ンプ リ メ ン ト す る コ アが リ ス ト さ れてい ます。
表 2‐2 : フ ァ ン ク シ ョ ン コ ア
コア
AddSub
説明
加算器お よ び減算器の両方を イ ンプ リ メ ン ト す る のに使用 し ます。
AddSubnS
N 段のパ イ プ ラ イ ン加算器ま たは減算器です。 Vivado HLS で必要なパ イ プ ラ イ ン段数が決定
さ れます。
AddSub_DSP
DSP48 を使用 し て add ま たは sub 演算が イ ンプ リ メ ン ト さ れ る よ う に し ます (DSP48 内の加算
器ま たは減算器が使用 さ れます)。
Cmp
コ ンパレー タ
Div
除算器
Mul
組み合わせ乗算器
Mul2S
2 段パ イ プ ラ イ ン乗算器
Mul3S
3 段パ イ プ ラ イ ン乗算器
Mul4S
4 段パ イ プ ラ イ ン乗算器
Mul5S
5 段パ イ プ ラ イ ン乗算器
Mul6S
6 段パ イ プ ラ イ ン乗算器
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
153
高位合成のコ ア
表 2‐2 : フ ァ ン ク シ ョ ン コ ア (続き)
MulnS
Sel
N 段パ イ プ ラ イ ン乗算器Vivado HLS で必要なパ イ プ ラ イ ン段数が決定 さ れます。
ジ ェ ネ リ ッ ク な選択演算子。 通常、 マルチプ レ ク サ と し て イ ンプ リ メ ン ト さ れます。
ス ト レージ コ ア
表 2-3 には レ ジ ス タ や メ モ リ な ど の ス ト レージ エ レ メ ン ト を イ ンプ リ メ ン ト す る コ アが リ ス ト さ れてい ます。
表 2‐3 : ス ト レージ コ ア
コア
説明
FIFO
FIFO。 Vivado HLS でブ ロ ッ ク RAM ま たは分散 RAM のいずれかで RTL に イ ンプ リ メ
ン ト す る かが決定 さ れます。
FIFO_BRAM
ブ ロ ッ ク RAM で イ ンプ リ メ ン ト さ れ る FIFO。
FIFO_LUTRAM
分散 RAM と し て イ ンプ リ メ ン ト さ れ る FIFO。
FIFO_SRL
RAM_1P
RAM_1P_BRAM
RAM_1P_LUTRAM
SRL で イ ンプ リ メ ン ト さ れ る FIFO。
シ ン グル ポー ト RAM。 Vivado HLS でブ ロ ッ ク RAM ま たは分散 RAM のいずれかで
RTL に イ ンプ リ メ ン ト す る かが決定 さ れます。
シ ン グル ポー ト RAM で、 ブ ロ ッ ク RAM を使用 し て イ ンプ リ メ ン ト さ れます。
シ ン グル ポー ト RAM で、 分散 RAM と し て イ ンプ リ メ ン ト さ れます。
RAM_2P
読み出 し ポー ト と 書き 込みポー ト を別々に使用する デュ アル ポー ト RAM。Vivado HLS
でブ ロ ッ ク RAM ま たは分散 RAM のいずれかで RTL に イ ン プ リ メ ン ト す る かが決定
さ れます。
RAM_2P_BRAM
読み出 し ポー ト と 書き 込みポー ト を別々に使用する デュ アル ポー ト RAMで、ブ ロ ッ ク
RAM を使用 し て イ ンプ リ メ ン ト さ れます。
RAM_2P_LUTRAM
読み出 し ポー ト と 書 き 込みポー ト を 別々に使用す る デ ュ ア ル ポー ト RAMで、 分散
RAM と し て イ ンプ リ メ ン ト さ れます。
RAM_T2P_BRAM
入力お よ び出力の両方で読み出 し ポー ト と 書 き 込みポー ト の両方を サポー ト す る デ ュ
アル ポー ト RAM で、 ブ ロ ッ ク RAM を使用 し て イ ンプ リ メ ン ト さ れます。
RAM_2P_1S
ROM_1P
ROM_1P_BRAM
ROM_1P_LUTRAM
ROM_1P_1S
ROM_2P
ROM_2P_BRAM
RAM_2P_LUTRAM
デ ュ アル ポー ト 非同期 RAM で、 LUT に イ ンプ リ メ ン ト さ れます。
シ ン グル ポー ト ROM。 Vivado HLS でブ ロ ッ ク RAM ま たは LUT のいずれか を使用 し
て RTL に イ ンプ リ メ ン ト する かが決定 さ れます。
シ ン グル ポー ト ROM で、 ブ ロ ッ ク RAM を使用 し て イ ンプ リ メ ン ト さ れます。
シ ン グル ポー ト ROM で、 分散 ROM と し て イ ンプ リ メ ン ト さ れます。
デ ュ アル ポー ト 非同期 ROM で、 LUT に イ ンプ リ メ ン ト さ れます。
デ ュ アル ポー ト ROM。 Vivado HLS でブ ロ ッ ク RAM ま たは分散 ROM のいずれか を使
用 し て RTL に イ ンプ リ メ ン ト する かが決定 さ れます。
デ ュ アル ポー ト ROM で、 ブ ロ ッ ク RAM を使用 し て イ ンプ リ メ ン ト さ れます。
デ ュ アル ポー ト ROM で、 分散 ROM と し て イ ンプ リ メ ン ト さ れます。
コネク ター コア
表 2-4 にはデザ イ ン内の接続を イ ンプ リ メ ン ト す る コ アが リ ス ト さ れてい ます。直接接続やス ト リ ー ミ ン グ ス ト レー
ジ エ レ メ ン ト が こ れに含まれます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
154
高位合成のコ ア
表 2‐4 : コ ネ ク タ ー コ ア
コア
Mux
説明
マルチプ レ ク サ
アダプ タ ー コ ア
表 2-5 には生成時に最上位デザ イ ン を接続す る ために使用す る イ ン タ ーフ ェ イ ス を イ ン プ リ メ ン ト す る コ ア が リ ス
ト さ れてい ます。 こ れ ら の イ ン タ ーフ ェ イ ス は、 EDK での IP 生成フ ロ ーで使用 さ れ る RTL ラ ッ パーに イ ンプ リ メ ン
ト さ れます。
表 2‐5 : アダプ タ ー コ ア
コア
AXI4LiteS
説明
AXI4-Lite Slave イ ン タ ーフ ェ イ ス
AXI4M
AXI4-Master イ ン タ ーフ ェ イ ス
AXI4Stream
AXI4-Stream イ ン タ ーフ ェ イ ス
浮動小数点 コ ア
Vivado HLS では各ザ イ リ ン ク ス デバ イ ス に対 し 次の浮動小数点 コ アがサポー ト さ れてい ます。 演算子ま たは関数に
浮動小数点 コ アがない場合、 Vivado HLS ではその浮動小数点演算子を合成で き ず、 合成が停止 し ます。
表 2‐6 : 浮動小数点 コ ア
7 シ リ ーズ
Virtex‐6
Virtex‐5
Virtex‐4
Spartan‐6
Spartan‐3
FAddSub
X
X
X
X
X
X
FAddSub_nodsp
X
X
X
-
-
-
FAddSub_fulldsp
X
X
X
-
-
-
FCmp
X
X
X
X
X
X
FDiv
X
X
X
X
X
X
FMul
X
X
X
X
X
X
FMul_nodsp
X
X
X
-
X
X
FMul_meddsp
X
X
X
-
X
X
FMul_fulldsp
X
X
X
-
X
X
FMul_maxdsp
X
X
X
-
X
X
FRSqrt
X
X
X
-
-
-
FRSqrt_nodsp
X
X
X
-
-
-
FRSqrt_fulldsp
X
X
X
-
-
-
FRecip
X
X
X
-
-
-
FRecip_nodsp
X
X
X
-
-
-
FRecip_fulldsp
X
X
X
-
-
-
FSqrt
X
X
X
X
X
X
DAddSub
X
X
X
X
X
X
コア
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
155
高位合成のコ ア
表 2‐6 : 浮動小数点 コ ア (続き)
7 シ リ ーズ
Virtex‐6
Virtex‐5
Virtex‐4
Spartan‐6
Spartan‐3
DAddSub_nodsp
X
X
X
-
-
-
DAddSub_fulldsp
X
X
X
-
-
-
DCmp
X
X
X
X
X
X
DDiv
X
X
X
X
X
X
DMul
X
X
X
X
X
X
DMul_nodsp
X
X
X
-
X
X
DMul_meddsp
X
X
X
-
-
-
DMul_fulldsp
X
X
X
-
X
X
DMul_maxdsp
X
X
X
-
X
X
DRSqrt
X
X
X
X
X
X
DRecip
X
X
X
-
-
-
DSqrt
X
X
X
-
-
-
コア
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
156
第 3章
高位合成 コ ーデ ィ ング ス タ イル
構文の表記規則
表 3‐1 : 構文の表記規則
表記規則
説明
コ マン ド
コ マ ン ド 構文、 メ ニ ュ ー、 ま たはキーボー ド キーを示 し ます。
<variable>
ユーザー定義の値を示 し ます。
choice1 | choice2
選択可能な複数の項目を示 し ます。 下線が付いてい る も のがデフ ォ ル ト です。
[option]
オプシ ョ ンで入力す る オブジ ェ ク ト を示 し ます。
{repeat}
オブジ ェ ク ト が 0 回以上繰 り 返 さ れ る こ と を示 し ます。
Ctrl + c
キーボー ド キーの組み合わせを示 し ます。 こ の例の場合は、 Ctrl キーを押 し な
が ら c キーを押す こ と を示 し ます。
[Menu] → [Item]
メ ニ ュ ー コ マ ン ド へのパ ス を示 し ます。 [Item] は、 [Menu] を ク リ ッ ク し た と き
に ド ロ ッ プダ ウ ンで表示 さ れ る メ ニ ュ ー コ マ ン ド です。
RMB
Right Mouse Button (右マ ウ ス ボ タ ン) の略で、 文脈依存 コ マ ン ド を表示 し ます。
<variable> ::= choice
$ bash_command
% tcl_command
構文お よ びス ク リ プ ト の例を示 し ます (bash シ ェ ル、 Perl ス ク リ プ ト 、 Tcl ス ク
リ プ ト な ど)。
は じ めに
こ のガ イ ド には、 ザ イ リ ン ク ス FPGA デバ イ ス の イ ンプ リ メ ン テーシ ョ ン用に C コ ー ド (C++ お よ び SystemC も 含む
) を記述す る 方法を示 し ます。 まず、 Vivado™ 高位合成 (HLS) で、 C コ ー ド が レ ジ ス タ ト ラ ン ス フ ァ ー レベル (RTL)
記述に合成 さ れます。 こ の後、 RTL デザ イ ンがザ イ リ ン ク ス のゲー ト レベルのプ リ ミ テ ィ ブに合成 さ れます。
Vivado HLS の詳細お よ びザ イ リ ン ク ス FPGA に イ ン プ リ メ ン テ ー シ ョ ン す る た め の ツ ール フ ロ ーについ て は、
第 1 章 「高位合成の概要」 を参照 し て く だ さ い。
前章では、 Vivado HLS を使用 し た C プ ロ グ ラ ミ ン グの基礎 と 、 Vivado HLS ツールでの C プ ロ グ ラ ミ ン グ言語の さ ま
ざ ま な コ ン ス ト ラ ク ト を ハー ド ウ ェ ア イ ン プ リ メ ン テーシ ョ ンへ合成す る 方法について説明 し ま し た。 本章には、
C++ お よ び SystemC な ど の拡張 さ れた C 言語のガ イ ド ラ イ ンが含ま れ ます。 ハー ド ウ ェ ア動作の記述に使用 さ れ る
C++ ルーチンの ク ラ ス ラ イ ブ ラ リ は、 www.accellera.org か ら 入手で き ます。
重要 : 本書で C コ ー ド と 記述 さ れてい る 場合は、特に記述のない限 り 、C だけでな く C++、SystemC に も 該当 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
157
C の合成
C コ ー ド で記述 さ れ る アルゴ リ ズ ムは多 く のアプ リ ケーシ ョ ンで広 く 使用 さ れてお り 、 次を含む多 く の タ ーゲ ッ ト で
実行 さ れます。
•
標準マ イ ク ロ プ ロ セ ッ サ (CPU)
•
グ ラ フ ィ ッ ク プ ロ セ ッ サ (GPU)
•
リ アル タ イ ム オペレーテ ィ ン グ シ ス テ ム (RTOS) で使用 さ れ る マ イ ク ロ コ ン ト ロ ー ラ ー
•
デジ タ ル シ グナル プ ロ セ ッ サ (DSP)
ど の場合 も 、 コ ンパ イ ル さ れた C コ ー ド が適切なパフ ォ ーマ ン ス で実行 さ れ ます。 C コ ー ド はその タ ーゲ ッ ト デバ
イ ス用に最適化 さ れ、 ハ イ パフ ォーマ ン ス の動作にな り ます。 こ の章では、 コ ー ド を ど の よ う に変更す る と ハー ド
ウ ェ アの質お よ びパフ ォーマ ン ス が改善で き る かについて説明 し ます。
コー ド例
本書の コ ー ド 例はそれぞれ Vivado HLS リ リ ース の一部 と し て含ま れてい ます。 コ ー ド 例には、 次の方法でア ク セ ス
で き ます。
•
Vivado HLS の開始ページの [Browse Examples] リ ン ク
•
Vivado HLS イ ン ス ト ール デ ィ レ ク ト リ の examples/coding デ ィ レ ク ト リ
コ ー ド 例のデ ィ レ ク ト リ 名は、 合成の最上位関数 と 同 じ 名前にな り ます。
コ ー ド 例は Vivado HLS イ ン タ ーフ ェ イ ス ま たは コ マ ン ド プ ロ ンプ ト で提供 さ れてい る Tcl ス ク リ プ ト を使用す る と
開 く こ と がで き ます。
こ のガ イ ド の例には、 関連す る ヘ ッ ダー フ ァ イ ルについて記述 さ れてい る こ と が よ く あ り ま す。 例に含 ま れ る ヘ ッ
ダー フ ァ イ ルは、 examples デ ィ レ ク ト リ か ら 表示で き ます。
ヒ ン ト : ヘ ッ ダー フ ァ イ ルでは、 通常最上位関数お よ びテ ス ト ベンチのデー タ 型が定義 さ れます。
C の合成
すべての C プ ロ グ ラ ム の最上位は main() 関数です。 Vivado HLS では、 main() よ り も 下位にあ る 関数がすべて合
成で き ます。 合成 さ れ る 関数は 「最上位関数」 ま たは 「デザ イ ン フ ァ イ ル」、 こ れ よ り も 上位の関数は 「テ ス ト ベン
チ」 と 記述 さ れます。 テ ス ト ベンチは、 合成 さ れ る 最上位関数の動作を有効にす る ために使用 さ れます。
最上位デザイ ン
合成用の最上位関数はテ ス ト ベンチ と は分けて記述 し 、 ヘ ッ ダー フ ァ イ ルを使用す る よ う にす る 方法が推奨 さ れ ま
す。
•
テ ス ト ベンチには、 デ ィ ス ク への フ ァ イ ル I/O のア ク セ ス と いっ た、 通常ハー ド ウ ェ アに合成で き ない動作が含
まれます。
•
ヘ ッ ダー フ ァ イ ルを使用す る こ と で、テ ス ト ベンチ と デザ イ ン フ ァ イ ルで使用 さ れ る 定義を共有 し 、ア ッ プデー
ト で き ます。
階層デザイ ンの コ ー ド 例
例 3-1 は、 hier_func 関数が次の 2 つの関数を呼び出すデザ イ ン を示 し てい ます。
•
sumsub_func : 加算お よ び減算を実行
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
158
C の合成
•
shift_func : シ フ ト を実行
次の型はヘ ッ ダー フ ァ イ ル (hier_func.h) で定義 さ れてい ます。
•
din_t
•
dint_t
•
dout_t
#include hier_func.h
int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub)
{
*outSum = *in1 + *in2;
*outSub = *in1 - *in2;
}
int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB)
{
*outA = *in1 >> 1;
*outB = *in2 >> 2;
}
void hier_func(din_t A, din_t B, dout_t *C, dout_t *D)
{
dint_t apb, amb;
sumsub_func(&A,&B,&apb,&amb);
shift_func(&apb,&amb,C,D);
}
例 3‐1 : 階層デザ イ ン の コ ー ド 例
最上位関数には複数の下位関数を含め る こ と がで き ますが、 合成で き る のは 1 つの最上位関数のみです。 複数の関数
を合成す る には、 それ ら を 1 つの最上位関数に ま と め ます。
hier_func 関数を合成す る 方法は、 次の と お り です。
1.
例 3-1 に示す よ う に フ ァ イ ルをデザ イ ン フ ァ イ ル と し て Vivado HLS プ ロ ジ ェ ク ト に追加 し ます。
2.
その最上位関数を hier_func と 指定 し ます。
次の詳細は、 後のセ ク シ ョ ンに説明 し ます。
•
最上位関数に対す る 引数 (例 3-1 では A、 B、 C, お よ び D) は RTL ポー ト に合成 さ れます。
•
最上位に含ま れ る 関数 (例 3-1 では sumsub_func お よ び shift_func) は階層ブ ロ ッ ク に合成 さ れます。
例 3-1 のヘ ッ ダー フ ァ イ ル (hier_func.h) には、 マ ク ロ の使用方法が記述 さ れてお り 、 typedef 文を使用す る こ
と で、 コ ー ド が さ ら にポー タ ブルにな り 、 読みやす く な り ます。 次は、 typedef 文でデー タ 型を許可 し 、 最終的な
FPGA イ ンプ リ メ ン テーシ ョ ンでエ リ ア と パフ ォーマ ン ス の両方が改善 さ れ る よ う にデー タ パ ス のビ ッ ト 幅を指定 し
てい ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
159
C の合成
#ifndef _HIER_FUNC_H_
#define _HIER_FUNC_H_
#include <stdio.h>
#define NUM_TRANS 40
typedef int din_t;
typedef int dint_t;
typedef int dout_t;
void hier_func(din_t A, din_t B, dout_t *C, dout_t *D);
#endif
例 3‐2 : 階層デザ イ ン例のヘ ッ ダー フ ァ イ ル
ヘ ッ ダー フ ァ イ ルには、 デザ イ ン フ ァ イ ルでは必須でない NUM_TRANS の よ う な定義がい く つか含ま れ ます。 こ れ
ら の定義は同 じ ヘ ッ ダー フ ァ イ ルを含むテ ス ト ベンチで使用 さ れます。
テ ス ト ベン チ
ブ ロ ッ ク の合成では、 まず C 関数が正 し いか ど う かが検証 さ れます。 こ の手順は、 テ ス ト ベンチで実行 さ れます。 テ
ス ト ベンチが良い と 、 生産性がかな り あが り ます。
C 関数は、 RTL シ ミ ュ レーシ ョ ン よ り も かな り 速 く 実行 さ れ る ので、 合成 よ り も 前に C を使用 し てアルゴ リ ズ ム を開
発お よ び検証 し た方が、 RTL を開発す る よ り も 生産性が向上 し ます。
•
C の開発時間を効率的に使用す る には、 既知の良い結果に対 し て関数の結果をチ ェ ッ ク す る テ ス ト ベンチを用意
す る こ と が重要にな り ます。 アルゴ リ ズ ムが正 し い こ と がわか っ てい る ので、 合成前に コ ー ド 変更を検証で き ま
す。
•
Vivado HLS では C テ ス ト ベンチを再利用 し て、 RTL デザ イ ン を検証で き ます。 Vivado HLS を使用す る 場合は
RTL テ ス ト ベンチを作成す る 必要はあ り ません。 テ ス ト ベンチで最上位関数か ら の結果がチ ェ ッ ク さ れ る と 、 そ
の RTL がシ ミ ュ レーシ ョ ン で検証で き ます。
例 3-3 「テ ス ト ベンチの例」 は、 例 3-1 「階層デザ イ ンの コ ー ド 例」 のデザ イ ンのテ ス ト ベンチを示 し てい ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
160
C の合成
テ ス ト ベン チの例
#include hier_func.h
int main() {
// Data storage
int a[NUM_TRANS], b[NUM_TRANS];
int c_expected[NUM_TRANS], d_expected[NUM_TRANS];
int c[NUM_TRANS], d[NUM_TRANS];
//Function data (to/from function)
int a_actual, b_actual;
int c_actual, d_actual;
// Misc
int
retval=0, i, i_trans, tmp;
FILE *fp;
// Load input data from files
fp=fopen(tb_data/inA.dat,r);
for (i=0; i<NUM_TRANS; i++){
fscanf(fp, %d, &tmp);
a[i] = tmp;
}
fclose(fp);
fp=fopen(tb_data/inB.dat,r);
for (i=0; i<NUM_TRANS; i++){
fscanf(fp, %d, &tmp);
b[i] = tmp;
}
fclose(fp);
// Execute the function multiple times (multiple transactions)
for(i_trans=0; i_trans<NUM_TRANS-1; i_trans++){
//Apply next data values
a_actual = a[i_trans];
b_actual = b[i_trans];
hier_func(a_actual, b_actual, &c_actual, &d_actual);
//Store outputs
c[i_trans] = c_actual;
d[i_trans] = d_actual;
}
// Load expected output data from files
fp=fopen(tb_data/outC.golden.dat,r);
for (i=0; i<NUM_TRANS; i++){
fscanf(fp, %d, &tmp);
c_expected[i] = tmp;
}
fclose(fp);
fp=fopen(tb_data/outD.golden.dat,r);
for (i=0; i<NUM_TRANS; i++){
fscanf(fp, %d, &tmp);
d_expected[i] = tmp;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
161
C の合成
}
fclose(fp);
// Check outputs against expected
for (i = 0; i < NUM_TRANS-1; ++i) {
if(c[i] != c_expected[i]){
retval = 1;
}
if(d[i] != d_expected[i]){
retval = 1;
}
}
// Print Results
if(retval == 0){
printf(
printf(
printf(
} else {
printf(
printf(
printf(
}
*** *** *** *** \n);
Results are good \n);
*** *** *** *** \n);
*** *** *** *** \n);
Mismatch: retval=%d \n, retval);
*** *** *** *** \n);
// Return 0 if outputs are corre
return retval;
}
例 3‐3 : テ ス ト ベ ン チの例
生産的な テ ス ト ベ ン チの作成
例 3-3 は、 次の よ う な生産的なテ ス ト ベンチの属性をい く つか示 し てい ます。
•
合成 さ れ る 最上位関数 (hier_func) は、 NUM_TRANS マ ク ロ の定義 (ヘ ッ ダー フ ァ イ ル 例 3-2 で指定) どお り 、
ト ラ ンザ ク シ ョ ン複数回分実行 さ れ る ので、多 く の異な る デー タ 値が適用お よ び検証で き ます。テ ス ト ベンチは、
実行 さ れ る さ ま ざ ま なテ ス ト でのみ有効です。
•
関数出力は、既知の良い値に対 し て比較 さ れます。既知の良い値は、 こ の例ではフ ァ イ ルか ら 読み込まれますが、
テ ス ト ベンチの一部 と し て計算 さ せ る こ と も で き ます。
•
main() 関数の戻 り 値は、 次の よ う に設定 さ れます。
°
結果が正 し い と 確認 さ れた場合は 0
°
結果が既知の良い値 と 一致 し なか っ た場合は 0 以外の値
ヒ ン ト : テ ス ト ベンチが 0 を返 さ ない場合、Vivado HLS で実行 さ れ る RTL 検証ではシ ミ ュ レーシ ョ ン エ ラ ーが レ ポー
ト さ れ ます。 自動 RTL 検証を利用す る には、 結果が正 し い と 確認 さ れた と き に 0 を返す よ う にテ ス ト ベンチ を記述
し てお き ます。
こ れ ら の属性を含むテ ス ト ベンチを使用す る と 、 合成前の C 関数への変更を素早 く テ ス ト し て検証で き 、 RTL で再利
用で き る ので、 RTL の検証が簡単にな り ます。
デザイ ン フ ァ イル と テ ス ト ベン チ フ ァ イル
Vivado HLS では RTL 検証に C テ ス ト ベンチが再利用 さ れ る ので、テ ス ト ベンチお よ び関連フ ァ イ ルを Vivado HLS に
追加す る と き にテ ス ト ベンチ と し て指定す る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
162
C の合成
テ ス ト ベンチに関連付け ら れた フ ァ イ ルは、 次の よ う な フ ァ イ ルです。
•
テ ス ト ベンチに よ り ア ク セ ス さ れ る フ ァ イ ル
•
テ ス ト ベンチが正 し く 動作す る ために必要な フ ァ イ ル
こ の よ う な フ ァ イ ルの例は、 例 3-3 に示す inA.dat や inB.dat な ど で、 こ れ ら は Vivado HLS プ ロ ジ ェ ク ト にテ ス
ト ベンチ フ ァ イ ル と し て追加す る 必要があ り ます。
Vivado HLS プ ロ ジ ェ ク ト でテ ス ト ベンチを指定す る ために、デザ イ ン と テ ス ト ベンチを別々の フ ァ イ ルに分け る 必要
はあ り ませんが、 推奨は さ れます。
例 3-1 は、 例 3-4 と 同 じ デザ イ ンですが、 最上位関数の名前が 2 つの例の区別を付け る ため、 hier_func2 に変更 さ
れてい る 点のみが違い ます。
hier_func が hier_func2 に変更 さ れてい る 点を除 く と 、 同 じ ヘ ッ ダー フ ァ イ ル と テ ス ト ベンチが使用 さ れてい
る ので、 sumsum_func 関数を最上位関数 と し て合成す る ためには Vivado HLS で次を変更する 必要があ り ます。
•
Vivado HLS で sumsub_func を最上位関数 と し て設定 し ます。
•
例 3-4
のフ ァ イ ルをデザ イ ン
フ ァ イル と プロ ジ ェ ク ト
フ ァ イ ルの両方 と し て追加 し ます。 こ れに よ り 、
sumsub_func よ り も 上位にあ る hier_func2 関数はテ ス ト ベンチの一部にな る ので、 RTL シ ミ ュ レーシ ョ ン
に含め る 必要があ り ます。
sumsub_func 関数は main() 関数内に イ ン ス タ ン シ エー ト さ れて い な く て も 、 残 り の関数 (hier_func2 お よ び
shift_func) に よ り 、 正 し く 動作 し ていて、 テ ス ト ベンチの一部であ る こ と が確認 さ れます。
#include hier_func2.h
int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub)
{
*outSum = *in1 + *in2;
*outSub = *in1 - *in2;
}
int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB)
{
*outA = *in1 >> 1;
*outB = *in2 >> 2;
}
void hier_func2(din_t A, din_t B, dout_t *C, dout_t *D)
{
dint_t apb, amb;
sumsub_func(&A,&B,&apb,&amb);
shift_func(&apb,&amb,C,D);
}
例 3‐4 : 新 し い最上位
テ ス ト ベ ン チ と デザイ ン フ ァ イルの結合
デザ イ ン フ ァ イ ル と テ ス ト ベンチを 1 つのデザ イ ン フ ァ イ ルに含め る こ と も で き ます。例 3-5 は例 3-1 ~ 例 3-3 と 同
じ 機能 を 持 ち ま す が、 すべ て が 1 つ の フ ァ イ ル に ま と め ら れ て い る 点 が 異 な り ま す。 他 の例 と 区別す る た め、
hier_func 関数の名前は hier_func3 に変更 し てい ます
重要 : テ ス ト ベンチ と デザ イ ンが 1 つの フ ァ イ ルにな っ てい る 場合は、 フ ァ イ ルをデザ イ ン フ ァ イ ル と テ ス ト ベンチ
フ ァ イ ルの両方 と し て Vivado HLS プ ロ ジ ェ ク ト に追加する 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
163
C の合成
テ ス ト ベン チおよび最上位デザイ ンの コ ー ド 例
#include <stdio.h>
#define NUM_TRANS 40
typedef int din_t;
typedef int dint_t;
typedef int dout_t;
int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub)
{
*outSum = *in1 + *in2;
*outSub = *in1 - *in2;
}
int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB)
{
*outA = *in1 >> 1;
*outB = *in2 >> 2;
}
void hier_func3(din_t A, din_t B, dout_t *C, dout_t *D)
{
dint_t apb, amb;
sumsub_func(&A,&B,&apb,&amb);
shift_func(&apb,&amb,C,D);
}
int main() {
// Data storage
int a[NUM_TRANS], b[NUM_TRANS];
int c_expected[NUM_TRANS], d_expected[NUM_TRANS];
int c[NUM_TRANS], d[NUM_TRANS];
//Function data (to/from function)
int a_actual, b_actual;
int c_actual, d_actual;
// Misc
int retval=0, i, i_trans, tmp;
FILE *fp;
// Load input data from files
fp=fopen(tb_data/inA.dat,r);
for (i=0; i<NUM_TRANS; i++){
fscanf(fp, %d, &tmp);
a[i] = tmp;
}
fclose(fp);
fp=fopen(tb_data/inB.dat,r);
for (i=0; i<NUM_TRANS; i++){
fscanf(fp, %d, &tmp);
b[i] = tmp;
}
fclose(fp);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
164
C の合成
// Execute the function multiple times (multiple transactions)
for(i_trans=0; i_trans<NUM_TRANS-1; i_trans++){
//Apply next data values
a_actual = a[i_trans];
b_actual = b[i_trans];
hier_func3(a_actual, b_actual, &c_actual, &d_actual);
//Store outputs
c[i_trans] = c_actual;
d[i_trans] = d_actual;
}
// Load expected output data from files
fp=fopen(tb_data/outC.golden.dat,r);
for (i=0; i<NUM_TRANS; i++){
fscanf(fp, %d, &tmp);
c_expected[i] = tmp;
}
fclose(fp);
fp=fopen(tb_data/outD.golden.dat,r);
for (i=0; i<NUM_TRANS; i++){
fscanf(fp, %d, &tmp);
d_expected[i] = tmp;
}
fclose(fp);
// Check outputs against expected
for (i = 0; i < NUM_TRANS-1; ++i) {
if(c[i] != c_expected[i]){
retval = 1;
}
if(d[i] != d_expected[i]){
retval = 1;
}
}
// Print Results
if(retval == 0){
printf(
printf(
printf(
} else {
printf(
printf(
printf(
}
*** *** *** *** \n);
Results are good \n);
*** *** *** *** \n);
*** *** *** *** \n);
Mismatch: retval=%d \n, retval);
*** *** *** *** \n);
// Return 0 if outputs are correct
return retval;
}
例 3‐5 : テ ス ト ベ ン チ お よ び最上位デザ イ ン
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
165
C の合成
最上位の引数 : RTL イ ン タ ー フ ェ イ ス ポー ト
最上位関数が合成 さ れ る と 、 関数への引数 ( ま たはパ ラ メ ー タ ー ) は RTL ポー ト に合成 さ れ ま す。 こ のプ ロ セ ス は、
イ ン タ ーフ ェ イ ス合成 と 呼ばれます。
イ ン タ ー フ ェ イ ス合成
図 3-6 に示す コ ー ド は、 イ ン タ ーフ ェ イ ス合成の概要を示 し てい ます。 こ の例には、 次が含ま れます。
•
値渡 し 入力 2 つ (in1 お よ び in2)
•
読み出 し お よ び書 き 込み両方のポ イ ン タ ー (sum)
•
関数の戻 り 値 (temp の値)
#include sum_io.h
dout_t sum_io(din_t in1, din_t in2, dio_t *sum) {
dout_t temp;
*sum = in1 + in2 + *sum;
temp = in1 + in2;
return
temp;
}
例 3‐6 : イ ン タ ー フ ェ イ ス合成の例
デフ ォ ル ト では、 デザ イ ンは 図 3-1 に示すポー ト を使用 し て RTL ブ ロ ッ ク に合成 さ れます。
X-Ref Target - Figure 3-1
図 3‐1 : デ フ ォル ト のイ ン タ ー フ ェ イ ス合成後の RTL ポー ト
Vivado HLS では、 ポー ト に対 し て次が実行 さ れます。
•
ク ロ ッ ク お よ び リ セ ッ ト ポー ト をデザ イ ンに追加 し ます。
•
デザ イ ン レベルのハン ド シ ェ イ ク 信号をデフ ォ ル ト で次のポー ト に追加 し ます。
°
ap_start
°
ap_done
°
ap_idle
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
166
C の合成
•
関数に戻 り 値がない場合、 ap_return 出力ポー ト を RTL イ ン タ ーフ ェ イ ス に追加 し ます。
注記 : 最上位関数の戻 り 値はポ イ ン タ ーにはで き ません。
•
Vivado HLS は関数引数か ら の読み出 し お よ び関数引数への書 き 込みを し た後、 それ ら を別々の入力お よ び出力
ポー ト (図 3-1 の sum_i お よ び sum_o) に合成 し ます。
•
Vivado HLS は、 デフ ォ ル ト で入力の値渡 し 引数 と ポ イ ン タ ーを単純な ワ イ ヤ ポー ト と し て合成 し ます。 ハン ド
シ ェ イ ク 信号は関連付け ら れません。
•
デフ ォ ル ト では、 出力ポ イ ン タ ーは関連す る 出力 Valid 信号を使用 し て合成 さ れ、 出力デー タ が有効にな る タ イ
ミ ン グ を示 し ます。
Vivado HLS が RTL ポー ト を合成す る と 、 単一サ イ ク ルなのか複数サ イ ク ルなのかに よ っ て、 ポー ト の読み出 し お よ
び書 き 込みに必要なハー ド ウ ェ アが作成 さ れます。 例 3-6 の コ ー ド は、 図 3-2 の タ イ ミ ン グ ビヘ イ ビ ア を示 し てい ま
す ( ク ロ ッ ク サ イ ク ルご と に 1 つの加算が可能な タ ーゲ ッ ト テ ク ノ ロ ジ と ク ロ ッ ク 周波数であ る と 仮定 し てい ます)。
X-Ref Target - Figure 3-2
図 3‐2 : デ フ ォル ト 合成での RTL ポー ト の タ イ ミ ン グ
•
デザ イ ンは ap_start が High にアサー ト さ れ る と 開始 さ れます。
•
ap_idle 信号が Low にアサー ト さ れ る と 、 デザ イ ンが動作 し てい る こ と を示 し ます。
•
入力デー タ は最初のサ イ ク ル後の ど の ク ロ ッ ク で も 読み出 さ れます。 読み出 し の タ イ ミ ン グは Vivado HLS で自
動的に ス ケ ジ ュ ール さ れます。
•
sum 出力が計算 さ れ る と 、 デー タ が有効であ る こ と が関連す る 出力ハン ド シ ェ イ ク (sum_o_ap_vld) で示 さ れ
ます。
•
関数が終了 し た ら 、 ap_done がアサー ト さ れます。 こ れは ap_return のデー タ が有効か ど う か も 示 し ます。
•
ap_idle ポー ト が High にアサー ト さ れ る と 、 デザ イ ンが再び開始 さ れ る のを待っ てい る 状態であ る こ と を示 し
ます。
イ ン タ ーフ ェ イ ス合成お よ びその さ ま ざ ま なオプシ ョ ンについては、第 1 章 「高位合成の概要」 を参照 し て く だ さ い。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
167
C の合成
•
イ ン タ ーフ ェ イ ス合成では、 デザ イ ンのデー タ シーケ ン ス が自動的に処理 さ れ る ので、 ユーザーは適切な イ ン
タ ーフ ェ イ ス を選択す る だけです。
•
次の よ う な多 く の タ イ プの イ ン タ ーフ ェ イ ス は合成で き ます。
•
°
ワ イ ヤ ポー ト
°
単一方向お よ び双方向のハン ド シ ェ イ ク
°
RAM ア ク セ ス ポー ト
°
FIFO ポー ト
イ ン タ ーフ ェ イ ス は、 タ イ プが違っ て も 同 じ ソ ース コ ー ド か ら 合成で き る こ と が多 く あ り ます。 同 じ コ ー ド が双
方向ハン ド シ ェ イ ク と し て指定 さ れ、 in1、 in2、 お よ び sum を使用 し て合成 さ れ る と 、 RTL ポー ト は図 3-3 の
よ う にな り ます。
X-Ref Target - Figure 3-3
図 3‐3 : イ ン タ ー フ ェ イ ス合成を指定 し た後の RTL ポー ト
こ こ か ら は、 コ ー ド 形式が RTL ポー ト に与え る 影響について説明 し ます。
ポイ ン ター
ポ イ ン タ ーは、 最上位関数への引数 と し て使用で き ま す。 ポ イ ン タ ーは目標どお り の RTL イ ン タ ーフ ェ イ スお よ び
デザ イ ン を合成後に達成す る 際、 問題の原因 と な る こ と があ る ので、 合成中にポ イ ン タ ーが ど の よ う に イ ンプ リ メ ン
ト さ れ る か理解す る のが重要にな り ます。
基本的なポ イ ン タ ー
例 3-7 の よ う な、 最上位 イ ン タ ーフ ェ イ ス に基本的なポ イ ン タ ーを含む関数は、 Vivado HLS では問題 と な り ません。
ポ イ ン タ ーは単純な ワ イ ヤ イ ン タ ーフ ェ イ ス かハン ド シ ェ イ ク を使用 し た イ ン タ ーフ ェ イ ス プ ロ ト コ ルのいずれか
に合成で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
168
C の合成
ヒ ン ト : FIFO イ ン タ ーフ ェ イ ス と し て合成する には、ポ イ ン タ ーを読み出 し 専用ま たは書 き 込み専用にす る 必要があ
り ます。
#include pointer_basic.h
void pointer_basic (dio_t *d) {
static dio_t acc = 0;
acc += *d;
*d = acc;
}
例 3‐7 : 基本的なポ イ ン タ ー イ ン タ ー フ ェ イ ス
テ ス ト ベンチで使用す る 例は、 例 3-8 に示 し ます。
#include pointer_basic.h
int main () {
dio_t d;
int i, retval=0;
FILE
*fp;
// Save the results to a file
fp=fopen(result.dat,w);
printf( Din Dout\n, i, d);
// Create input data
// Call the function to operate on the data
for (i=0;i<4;i++) {
d = i;
pointer_basic(&d);
fprintf(fp, %d \n, d);
printf( %d
%d\n, i, d);
}
fclose(fp);
// Compare the results file with the golden results
retval = system(diff --brief -w result.dat result.golden.dat);
if (retval != 0) {
printf(Test failed!!!\n);
retval=1;
} else {
printf(Test passed!\n);
}
// Return 0 if the test
return retval;
}
例 3‐8 : 基本的な ポ イ ン タ ー イ ン タ ー フ ェ イ スのテ ス ト ベ ン チ
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
169
C の合成
C 関数お よ び RTL シ ミ ュ レーシ ョ ンでは、 こ の単純なデー タ セ ッ ト を使用 し て正 し い操作が (可能性のあ る 操作すべ
てではあ り ませんが) 検証 さ れます。
Din Dout
0
0
1
1
2
3
3
6
Test passed!
ポ イ ン タ ー演算
ポ イ ン タ ー演算 (pointer_arith) を使用す る と 、RTL に合成可能な イ ン タ ーフ ェ イ ス が制限 さ れます。例 3-9 は同 じ コ ー
ド ですが、 デー タ 値を 2 つ目の値か ら 累積す る ために、 単純なポ イ ン タ ー演算が使用 さ れてい る 点が異な り ます。
#include pointer_arith.h
void pointer_arith (dio_t *d) {
static int acc = 0;
int i;
for (i=0;i<4;i++) {
acc += *(d+i+1);
*(d+i) = acc;
}
}
例 3‐9 : ポ イ ン タ ー演算 を使用 し た イ ン タ ー フ ェ イ ス
例 3-10 は、 こ の例をサポー ト す る テ ス ト ベンチです。 累積を実行する ためのループが pointer_arith 関数内に含
ま れ る よ う にな っ た ため、 テ ス ト ベンチに よ り 、 d[5] ア レ イ で指定 さ れた ア ド レ ス空間が適切な値を使用 し て生成
さ れます。
#include pointer_arith.h
int main () {
dio_t d[5], ref[5];
int i, retval=0;
FILE
*fp;
// Create input data
for (i=0;i<5;i++) {
d[i] = i;
ref[i] = i;
}
// Call the function to operate on the data
pointer_arith(d);
// Save the results to a file
fp=fopen(result.dat,w);
printf( Din Dout\n, i, d);
for (i=0;i<4;i++) {
fprintf(fp, %d \n, d[i]);
printf( %d
%d\n, ref[i], d[i]);
}
fclose(fp);
// Compare the results file with the golden results
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
170
C の合成
retval = system(diff --brief -w result.dat result.golden.dat);
if (retval != 0) {
printf(Test failed!!!\n);
retval=1;
} else {
printf(Test passed!\n);
}
// Return 0 if the test
return retval;
}
例 3‐10 : ポ イ ン タ ー演算関数のテ ス ト ベ ン チ
こ れは、 シ ミ ュ レーシ ョ ンす る と 、 次の よ う な出力にな り ます。
Din Dout
0
1
1
3
2
6
3
10
Test passed!
ポ イ ン タ ー演算では、 ポ イ ン タ ー デー タ へ順番どお り にア ク セ ス さ れません。 ワ イ ヤ、 ハン ド シ ェ イ ク ま たは FIFO
イ ン タ ーフ ェ イ ス の場合は、 順序どお り にア ク セ ス さ れます。
•
ワ イ ヤ イ ン タ ーフ ェ イ ス はデザ イ ンがデー タ を消費す る か、 書 き 込む準備がで き た と き にデー タ を読み出 し ま
す。
•
ハン ド シ ェ イ ク お よ び FIFO イ ン タ ーフ ェ イ スは、 制御信号が処理を進め る 許可を し た と き に読み出 し お よ び書
き 込み し ます。
ど ち ら の場合 も 、 デー タ は順序通 り にエ レ メ ン ト 0 か ら 到着する (書 き 込まれ る ) 必要があ り ます。 例 3-9 では、 最初
のデー タ 値が イ ンデ ッ ク ス 1 か ら 読み出 さ れ る よ う に記述 さ れてい ます (i が 0 で開始 さ れ、 0+1=1)。 こ れは、 テ ス
ト ベンチの d[5] ア レ イ か ら 2 つ目のエ レ メ ン ト です。
こ れがハー ド ウ ェ アに イ ン プ リ メ ン ト さ れ る 際には、 何 ら かのデー タ イ ンデ ッ ク ス 形式が必要にな り ま す。 Vivado
HLS では、 ワ イ ヤ、 ハン ド シ ェ イ ク ま たは FIFO イ ン タ ーフ ェ イ ス を使用す る と こ れはサポー ト さ れ ません。 例 3-9
の コ ー ド は、 ap_bus イ ン タ ーフ ェ イ ス を使用 し てのみ合成で き ます。 こ の イ ン タ ーフ ェ イ ス では、 デー タ がア ク セ
ス (読み出 し ま たは書 き 込み) さ れた と き にデー タ に イ ンデ ッ ク ス を付け る ためのア ド レ ス が提供 さ れます。
ま たは、 ポ イ ン タ ーではな く 、 イ ン タ ー フ ェ イ ス の ア レ イ を 使用 し て コ ー ド を 変更す る 必要が あ り ま す。 詳細は、
例 3-11を参照 し て く だ さ い。 こ れは RAM イ ン タ ーフ ェ イ ス (ap_memory) を使用す る と 、 合成で き ます。 こ の イ ン
タ ーフ ェ イ ス は、 ア ド レ ス を付けてデー タ の イ ンデ ッ ク ス を作成で き る ので、 順序どお り でな く て も 実行で き ます。
ワ イ ヤ、 ハン ド シ ェ イ ク 、 FIFO イ ン タ ーフ ェ イ ス は、 ス ト リ ー ミ ン グ デー タ でのみ使用で き 、 ポ イ ン タ ー演算 と 一
緒には使用で き ません (0 か ら デー タ の イ ンデ ッ ク ス を作成 し て、 順番に進め る 場合は例外)。
ap_bus お よ び ap_memory イ ン タ ーフ ェ イ ス タ イ プについては、 次を参照 し て く だ さ い。
•
第 1 章 「高位合成の概要」
•
第 4 章 「高位合成 コ マ ン ド 」
#include array_arith.h
void array_arith (dio_t d[5]) {
static int acc = 0;
int i;
for (i=0;i<4;i++) {
acc += d[i+1];
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
171
C の合成
d[i] = acc;
}
}
例 3‐11 : ア レ イ 演算
マルチ ア ク セス ポ イ ン タ ー イ ン タ ー フ ェ イ ス : ス ト リ ー ミ ング デー タ
最上位関数の引数 リ ス ト にポ イ ン タ ーが使用 さ れ る デザ イ ンの場合、 ポ イ ン タ ーを使用 し て複数ア ク セ ス を実行す る
際に特に注意す る 必要があ り ます。 複数ア ク セ ス は、 同 じ 関数でポ イ ン タ ーが複数回読み出 さ れた り 書 き 込まれた り
す る こ と です。
•
複数ア ク セ ス さ れ る 関数の引数には、 volatile 修飾子を使用す る 必要があ り ます。
•
Vivado HLS 内で協調シ ミ ュ レーシ ョ ン を使用 し て RTL を検証す る 場合、 最上位関数では、 こ の よ う な引数に指
定 し たポー ト イ ン タ ーフ ェ イ ス のア ク セ ス数を含め る 必要があ り ます。
•
合成の前に C を検証 し 、 目的を確認 し 、 C 記述が正 し い こ と を確認 し て く だ さ い。
関数の引数が複数回ア ク セ ス さ れ る 必要があ る 場合は、 ス ト リ ーム を使用 し てデザ イ ン を記述す る こ と をお勧め し ま
す。 詳細は、 279 ページの 「ス ト リ ー ミ ン グ デー タ を使用 し た設計」 を参照 し て く だ さ い。 ス ト リ ーム を使用す る と 、
こ のセ ク シ ョ ン で示す よ う な問題は発生 し ません。 サ ン プル デザ イ ン を使用 し た場合、 表 3-2 「サ ンプル デザ イ ン
のシナ リ オ」 は279 ページの 「ス ト リ ー ミ ン グ デー タ を使用 し た設計」 に説明 さ れてい ます。
表 3‐2 : サン プル デザイ ンのシナ リ オ
サン プル デザイ ン
表示
pointer_stream_bad
同 じ 関数内でポ イ ン タ ーに複数回ア ク セ スする 場合に volatile 修
飾子が必要な理由
pointer_stream_better
こ の よ う な ポ イ ン タ ーが最上位 イ ン タ ー フ ェ イ ス に含 ま れ る デ
ザ イ ン で目的どお り の動作が正 し く 記述 さ れてい る か ど う か を
確認する ために、C テ ス ト ベンチを使用 し てデザ イ ン を検証する
必要があ る 理由
例 3-12 では、 入力ポ イ ン タ ーの d_i が 4 回読み出 さ れ、 出力ポ イ ン タ ーの d_o が 2 回書き 込まれ、 ア ク セ ス が FIFO
イ ン タ ーフ ェ イ ス に よ り イ ン プ リ メ ン ト (最終的な RTL イ ン プ リ メ ン テーシ ョ ン か ら ス ト リ ー ミ ン グ デー タ を読み
出 し お よ び書 き 込み) さ れ る よ う に し てい ます 。
#include pointer_stream_bad.h
void pointer_stream_bad ( dout_t *d_o,
din_t acc = 0;
acc +=
acc +=
*d_o =
acc +=
acc +=
*d_o =
din_t *d_i) {
*d_i;
*d_i;
acc;
*d_i;
*d_i;
acc;
}
例 3‐12 : マルチ ア ク セ ス ポ イ ン タ ー イ ン タ ー フ ェ イ ス
例 3-13 は、 こ のデザ イ ン を検証す る テ ス ト ベンチを示 し てい ます。
#include pointer_stream_bad.h
int main () {
din_t d_i;
dout_t d_o;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
172
C の合成
int retval=0;
FILE *fp;
// Open a file for the output results
fp=fopen(result.dat,w);
// Call the function to operate on the data
for (d_i=0;d_i<4;d_i++) {
pointer_stream_bad(&d_o,&d_i);
fprintf(fp, %d %d\n, d_i, d_o);
}
fclose(fp);
// Compare the results file with the golden results
retval = system(diff --brief -w result.dat result.golden.dat);
if (retval != 0) {
printf(Test failed !!!\n);
retval=1;
} else {
printf(Test passed !\n);
}
// Return 0 if the test
return retval;
}
例 3‐13 : マルチ ア ク セ ス ポ イ ン タ ーのテ ス ト ベ ン チ
揮発性デー タ の理解
例 3-12 の コ ー ド は、 入力ポ イ ン タ ー d_i お よ び出力ポ イ ン タ ー d_o を、 RTL で FIFO (ま たはハン ド シ ェー ク ) イ ン
タ ーフ ェ イ ス と し て イ ンプ リ メ ン ト す る こ と を意図 し て記述 さ れてい ます。 こ れに よ り 、次の こ と が確実にな り ます。
•
ア ッ プ ス ト リ ームの送信ブ ロ ッ ク は、 RTL ポー ト d_i で読み出 し が実行 さ れ る たびに新 し いデー タ を供給 し ま
す。
•
ダ ウ ン ス ト リ ームの受信ブ ロ ッ ク は、 RTL ポー ト d_o で書 き 込みが実行 さ れ る たびに新 し いデー タ を受信 し ま
す。
こ の コ ー ド が標準 C コ ンパ イ ラ で コ ンパ イ ル さ れ る 場合、各ポ イ ン タ ーへの複数ア ク セ ス が 1 つのア ク セ ス に削減 さ
れ ま す。 コ ンパ イ ラ については、 d_i 上のデー タ が関数の実行中に変化す る こ と が示 さ れないので、 関係あ る のは
d_o への最終の書 き 込みのみです。 ほかの書 き 込みは、 関数が完了する ま でに上書き さ れます。
Vivado HLS での処理は、 gcc コ ンパ イ ラ の動作 と 一致 し てお り 、 複数の読み出 し お よ び書 き 込みは 1 つの読み出 し
操作お よ び 1 つの書 き 込み操作に最適化 さ れます。 RTL が検証 さ れ る と 、 各ポー ト では 1 つの読み出 し お よ び書 き 込
み操作のみが実行 さ れます。
こ のデザ イ ン の基本的な問題は、 テ ス ト ベンチ と デザ イ ン で RTL ポー ト の イ ン プ リ メ ン ト 方法が設計者の意図どお
り に記述 さ れていない こ と にあ り ます。
•
RTL ポー ト は、 ト ラ ンザ ク シ ョ ン中に複数回読み出 し お よ び書き 込み (デー タ 入力お よ び出力が ス ト リ ー ミ ン グ
) さ れ る はずです。
•
テ ス ト ベンチは 1 つの入力値だけ を提供 し 、1 つの出力値だけ を戻 し ます。例 3-12 の C シ ミ ュ レーシ ョ ンの結果
は次の よ う にな り ます。 各入力が 4 回累積 さ れ ますが、 読み出 さ れて各回で累積 さ れ る のは同 じ 値で、 4 回別の
読み出 し があ る わけではあ り ません。
Din
0
1
2
Dout
0
4
8
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
173
C の合成
3
12
こ のデザ イ ンは volatile 修飾子を使用す る と 、 RTL ポー ト に複数回読み出 し お よ び書 き 込みがで き る よ う にな り
ます。 詳細は、 例 3-14を参照 し て く だ さ い。
volatile キーワ ー ド を使用す る と 、 C コ ンパ イ ラ (お よ び Vivado HLS) でポ イ ン タ ー ア ク セ ス に関す る 仮定が さ れ
ないので、 デー タ が揮発性であ り 変化す る 可能性があ る と 解釈 さ れます。
ヒ ン ト : ポ イ ン タ ー ア ク セ ス は最適化 し ないで く だ さ い。
#include pointer_stream_better.h
void pointer_stream_better ( volatile dout_t *d_o,
din_t acc = 0;
acc +=
acc +=
*d_o =
acc +=
acc +=
*d_o =
volatile din_t *d_i) {
*d_i;
*d_i;
acc;
*d_i;
*d_i;
acc;
}
例 3‐14 : マルチ ア ク セ ス volatile ポ イ ン タ ー イ ン タ ー フ ェ イ ス
例 3-14 は 例 3-12 と 同 じ よ う にシ ミ ュ レーシ ョ ン さ れますが、volatile 修飾子に よ り 、次の よ う な状態にな り ます。
•
ポ イ ン タ ー ア ク セ ス の最適化が さ れな く な り ます。
•
意図 し た と お り 、入力ポー ト d_i で読み出 し が 4 回実行 さ れ、出力ポー ト d_o で書 き 込みが 2 回実行 さ れ る RTL
デザ イ ンにな り ます。
volatile キーワ ー ド を使用 し て も 、 こ の コ ー ド 形式 (ポ イ ン タ ーに複数回ア ク セ スす る ) には、 関数 と テ ス ト ベンチ
に読み出 し お よ び書 き 込みが明示的に記述 さ れていない と い う 問題が ま だあ り ます。
こ の場合、読み出 し は 4 回実行 さ れますが、同 じ デー タ が 4 回読み込まれて し ま い ます。書 き 込みは 2 回別々にあ り 、
それぞれ正 し いデー タ で実行 さ れますが、 テ ス ト ベンチは最後の書 き 込みのデー タ のみを取 り 込みます。
ヒ ン ト : 中間ア ク セ ス を 表示す る には、 cosim_design を イ ネーブルに し て RTL シ ミ ュ レ ーシ ョ ン中に ト レ ー ス
フ ァ イ ルを作成 し 、 適切な ビ ュ ーアーでその ト レース フ ァ イ ルを確認 し ます。
例 3-14 は、 ワ イ ヤ イ ン タ ーフ ェ イ ス を使用 し て イ ンプ リ メ ン ト で き ます。 FIFO イ ン タ ーフ ェ イ ス が指定 さ れ る 場合
は、 Vivado HLS で各読み出 し ご と に新 し いデー タ を ス ト リ ー ミ ン グする RTL テ ス ト ベンチが作成 さ れます。 テ ス ト
ベンチか ら 使用で き る 新 し いデー タ はないので、 RTL の検証はエ ラ ーにな り ます。 テ ス ト ベンチでは、 正 し く 読み出
し お よ び書 き 込みが記述 さ れません。
ス ト リ ー ミ ング デー タ イ ン タ ー フ ェ イ スの記述
ハー ド ウ ェ ア シ ス テ ムには並列処理機能があ る ので、 ソ フ ト ウ ェ ア と 違っ て ス ト リ ー ミ ン グ デー タ の利点を生かす
こ と がで き ます。 デー タ はデザ イ ンに連続 し て提供 さ れ、 デザ イ ンか ら デー タ は連続 し て出力 さ れます。 RTL デザ イ
ンは既存デー タ を処理 し 終わ る 前に新 し いデー タ を受信で き ます。
例 3-14 に示す よ う に、 ソ フ ト ウ ェ ア での ス ト リ ー ミ ン グ デー タ の記述は、 特に既存のハー ド ウ ェ ア イ ン プ リ メ ン
テーシ ョ ン (既に並列/ス ト リ ー ミ ン グ処理機能が存在 し 、 記述す る 必要あ り ) を表す ソ フ ト ウ ェ ア を記述す る 際に重
要です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
174
C の合成
こ れには、 次の よ う な複数の方法があ り ます。
•
volatile 修飾子を追加 し ます (例 3-14)。 テ ス ト ベンチには一意の読み出 し お よ び書 き 込みが記述 さ れないの
で、 元の C テ ス ト ベンチを使用 し た RTL シ ミ ュ レーシ ョ ンはエ ラ ーにな り ますが、 ト レース フ ァ イ ルの波形を
確認す る と 、 正 し い読み出 し お よ び書 き 込みが実行 さ れた こ と がわか り ます。
•
一意の読み出 し お よ び書 き 込みを明示的に記述す る よ う に コ ー ド を変更 し ます。 詳細は、 例 3-15を参照 し て く だ
さ い。
•
ス ト リ ー ミ ン グ デー タ 型を使用す る よ う に コ ー ド を変更 し ます。 ス ト リ ー ミ ン グ デー タ 型を使用す る と 、 ス ト
リ ー ミ ン グ デー タ を使用 し てハー ド ウ ェ アが適切に記述 さ れ る よ う にな り ます。 詳細は、 第 1 章 「高位合成の概
要」 を参照 し て く だ さ い。
例 3-15 の コ ー ド は、 テ ス ト ベンチか ら 4 つの異な る 値が読み出 さ れ、 2 つの異な る 値が書 き 込ま れ る よ う にア ッ プ
デー ト し た コ ー ド です。 ポ イ ン タ ーのア ク セ ス はシーケ ン シ ャ ルで ロ ケーシ ョ ン 0 か ら 開始する ので、 合成では ス ト
リ ー ミ ン グ イ ン タ ーフ ェ イ ス が使用 さ れます。
#include pointer_stream_good.h
void pointer_stream_good ( volatile dout_t *d_o,
din_t acc = 0;
volatile din_t *d_i) {
acc += *d_i;
acc += *(d_i+1);
*d_o = acc;
acc += *(d_i+2);
acc += *(d_i+3);
*(d_o+1) = acc;
}
例 3‐15 : 明示的な マルチ ア ク セ スの volatile ポ イ ン タ ー イ ン タ ー フ ェ イ ス
関数が各 ト ラ ンザ ク シ ョ ンで 4 つの固有の値を読み出す こ と を モデ リ ン グす る よ う に、 テ ス ト ベンチがア ッ プデー ト
さ れます。 こ のテ ス ト ベンチは、 1 つの ト ラ ンザ ク シ ョ ンのみを記述 し てい ます。 複数の ト ラ ンザ ク シ ョ ン を記述す
る には、 入力デー タ セ ッ ト を増加 し 、 関数を複数回呼び出す必要があ り ます。
#include pointer_stream_good.h
int main () {
din_t d_i[4];
dout_t d_o[4];
int i, retval=0;
FILE
*fp;
// Create input data
for (i=0;i<4;i++) {
d_i[i] = i;
}
// Call the function to operate on the data
pointer_stream_good(d_o,d_i);
// Save the results to a file
fp=fopen(result.dat,w);
for (i=0;i<4;i++) {
if (i<2)
fprintf(fp, %d %d\n, d_i[i], d_o[i]);
else
fprintf(fp, %d \n, d_i[i]);
}
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
175
C の合成
fclose(fp);
// Compare the results file with the golden results
retval = system(diff --brief -w result.dat result.golden.dat);
if (retval != 0) {
printf(Test failed !!!\n);
retval=1;
} else {
printf(Test passed !\n);
}
// Return 0 if the test
return retval;
}
例 3‐16 : 明示的な マルチ ア ク セ スの volatile
ポ イ ン タ ーのテ ス ト ベ ン チ
こ のテ ス ト ベンチに よ り 、 次の よ う な結果のアルゴ リ ズ ムが検証 さ れます。
•
1 つの ト ラ ンザ ク シ ョ ンか ら 2 つの出力が生成 さ れます。
•
出力は最初の 2 つの入力読み出 し が累算 さ れた も の と 、 次の 2 つの入力読み出 し と 最初の出力が累算 さ れた も の
にな り ます。
Din Dout
0
1
1
6
2
3
ポ イ ン タ ーが関数 イ ン タ ーフ ェ イ ス で複数回ア ク セ ス さ れ る 際に注意すべ き 最後の問題は、RTL シ ミ ュ レーシ ョ ンの
記述です。
マルチ ア ク セス ポ イ ン タ ーおよび RTL シ ミ ュ レーシ ョ ン
cosim_design で RTL を検証す る ため、 Vivado HLS では次が実行 さ れます。
•
RTL 周辺にアダプ タ ーを含む SystemC ラ ッ パーが作成 さ れます。
•
こ の ラ ッ パーが既存の C テ ス ト ベンチに イ ン ス タ ン シエー ト さ れます。 詳細は、 図 3-4を参照 し て く だ さ い。
X-Ref Target - Figure 3-4
図 3‐4 : cosim_design ラ ッ パーの概要
Vivado HLS で作成 さ れ る ラ ッ パーには、 RTL イ ン タ ーフ ェ イ ス にハン ド シ ェ ー ク が必要な場合はそれが記述 さ れ ま
す。 テ ス ト ベンチか ら 供給 さ れ る DUT への入力値が RTL デザ イ ン で必要な と き に準備 さ れ る よ う にす る 必要があ り
ます。 こ れには、 ア ダプ タ ーに ス ト レージが必要です。
イ ン タ ーフ ェ イ ス のポ イ ン タ ーが複数回ア ク セ ス さ れた場合、Vivado HLS では関数 イ ン タ ーフ ェ イ ス か ら 何度読み出
し お よ び書 き 込みが実行 さ れたか判別で き ません。値がい く つ読み出 さ れ る か、 ま たは書 き 込まれ る か を Vivado HLS
に示す よ う な関数 イ ン タ ーフ ェ イ ス の引数はあ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
176
C の合成
void pointer_stream_good ( volatile dout_t *d_o,
volatile din_t *d_i)
例 3‐17 : volatile ポ イ ン タ ー イ ン タ ー フ ェ イ ス
ア レ イ の最大サ イ ズな ど、 イ ン タ ーフ ェ イ ス に値がい く つ必要か を示す よ う な も のがない限 り 、Vivado HLS では 1 つ
の値が仮定 さ れ、 1 つの入力お よ び 1 つの出力用のみのシ ミ ュ レーシ ョ ン ラ ッ パーが作成 さ れます。
RTL ポー ト が実際には複数の値を読み出 し ま たは書 き 込みす る 場合、 RTL cosim_design シ ミ ュ レーシ ョ ンが停止
し ます。 ラ ッ パーには RTL デザ イ ンに接続 さ れ る 送信ブ ロ ッ ク と 受信ブ ロ ッ ク が記述 さ れます。 1 つの値のみが記述
さ れ る と 、 複数の値が読み出 し ま たは書 き 込み さ れ る 場合に RTL デザ イ ンは停止 し ます (読み出す値がないか書 き 込
むスペース がないため)。
イ ン タ ーフ ェ イ ス でマルチア ク セ ス ポ イ ン タ ーが使用 さ れ る 場合、イ ン タ ーフ ェ イ ス での読み出 し ま たは書 き 込みの
最大回数を Vivado HLS に示す必要があ り ます。 イ ン タ ーフ ェ イ ス を指定す る 場合、 [Vivaod HLS Directive Editor] ダ イ
ア ロ グ ボ ッ ク ス の [Directive] で [INTERFACE] を選択 し 、 [depth] オプシ ョ ン を設定 し ます (図 3-5)。
X-Ref Target - Figure 3-5
図 3‐5 : [Vivado HLS Directive Editor] ダ イ ア ログ ボ ッ ク ス :[depth] オプ シ ョ ン
上記の例では、 引数ま たはポー ト d_i が 深 さ 4 の FIFO イ ン タ ーフ ェ イ ス にな る よ う に設定 さ れてい ます。 こ れに よ
り 、 cosim_design で RTL を正 し く 検証す る のに十分な値が供給 さ れます。
イ ン タ ー フ ェ イ スのア レ イ
Vivado HLS では、 ア レ イ が メ モ リ エ レ メ ン ト にデフ ォ ル ト で合成 さ れ ます。 ア レ イ が最上位関数への引数 と し て使
用 さ れ る と 、 メ モ リ はオ フチ ッ プであ る と 仮定 さ れ、 イ ン タ ーフ ェ イ ス ポー ト が メ モ リ にア ク セ スす る ために合成 さ
れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
177
C の合成
Vivado HLS には、 こ れ ら のポー ト の作成方法を設定す る 機能があ り ます。
•
メ モ リ は、 シ ン グルま たはデ ュ アル ポー ト RAM と し て指定で き ます。
•
イ ン タ ーフ ェ イ ス は、 FIFO イ ン タ ーフ ェ イ ス と し て指定で き ます。
•
イ ン タ ーフ ェ イ ス は、 ap_bus イ ン タ ーフ ェ イ ス と し て指定で き ます。
•
Vivado HLS のア レ イ 最適化指示子 (Array_Partition、 Array_Map お よ び Array_Reshape) を使用す る と 、
ア レ イ の構造を設定 し 直せ、 I/O ポー ト の数 も 変更で き ます。
デー タ へのア ク セ ス が メ モ リ (RAM ま たは FIFO) ポー ト か ら に制限 さ れ る ため、 イ ン タ ーフ ェ イ ス のア レ イ に よ り パ
フ ォーマ ン ス に障害が出 る こ と があ り ます。 こ れ ら の障害は、 通常指示子を使用す る と 回避で き ます。
合成可能な コ ー ド でア レ イ を使用す る 場合は、 ア レ イ を必ずサ イ ズ指定す る 必要があ り ます。 た と えば、 例 3-18 の
宣言 d_i[4] が d_i[] に変更 さ れ る と 、 Vivado HLS でデザ イ ンが合成で き ない こ と を示す メ ッ セージが表示 さ れま
す。
@E [SYNCHK-61] array_RAM.c:52: unsupported memory access on variable 'd_i' which is
(or contains) an array with unknown size at compile time.
ア レ イ最適化指示子
ど の タ イ プの RAM を使用す る か (シ ン グル ポー ト と デ ュ アル ポー ト の ど ち ら の RAM ポー ト を作成す る か) を明示
的に指定す る には、 resource 指示子を使用 し ます。 resource 指示子が指定 さ れない場合、 Vivado HLS では次が使用 さ
れます。
•
シ ン グル ポー ト RAM (デフ ォ ル ト )
•
開始間隔やレ イ テ ン シが削減 さ れ る 場合はデ ュ アル ポー ト RAM
イ ン タ ーフ ェ イ ス でア レ イ を リ コ ン フ ィ ギ ュ レーシ ョ ンす る には、 partition、 map お よ び reshape 指示子を指定
し ます。 ア レ イ は複数の小 さ いア レ イ にパーテ ィ シ ョ ンで き 、 それぞれに別の イ ン タ ーフ ェ イ ス を使用で き ます。 こ
れには、 ア レ イ のすべてのエ レ メ ン ト を ス カ ラ ー エ レ メ ン ト にパーテ ィ シ ョ ン で き る 機能 も 含ま れ ます。 関数 イ ン
タ ーフ ェ イ ス の場合は、 ア レ イ のすべてのエ レ メ ン ト に対 し てそれぞれ別のポー ト が作成 さ れます。 こ れに よ り 並列
ア ク セ ス は最大にな り ますが、 さ ら にポー ト が作成 さ れ る ため、 上の階層で配線問題が発生する こ と があ り ます。
同様に、 小 さ いア レ イ は 1 つの大 き な ア レ イ に ま と め ら れ、 1 つの イ ン タ ーフ ェ イ ス にな っ て し ま う こ と があ り ます。
こ の場合、 オ フチ ッ プ ブ ロ ッ ク RAM へのマ ッ プは改善 さ れますが、 パフ ォーマ ン ス に障害が出 る 可能性があ る こ と
に注意 し て く だ さ い。 こ れ ら の ト レー ド オ フは Vivado HLS の最適化指示子を使用す る と 発生す る ので、 コ ー ド 自体
には影響 し ません。
RAM イ ン タ ー フ ェ イ ス
例 3-18 に示す関数のア レ イ 引数は。 デフ ォ ル ト でシ ン グル ポー ト RAM イ ン タ ーフ ェ イ ス に合成 さ れます。
#include array_RAM.h
void array_RAM (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
int i;
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];
}
}
例 3‐18 : RAM イ ン タ ー フ ェ イ ス
シ ン グル ポー ト RAM イ ン タ ーフ ェ イ ス が使用 さ れ る のは、 for-loop で各 ク ロ ッ ク サ イ ク ルの読み出 し お よ び書
き 込みがで き る のは 1 エ レ メ ン ト のみであ る ため、デ ュ アル ポー ト RAM イ ン タ ーフ ェ イ ス を使用す る 利点がないか
ら です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
178
C の合成
for-loop が展開 さ れ る と 、 Vivado HLS ではデ ュ アル ポー ト が使用 さ れます。 こ れに よ り 、 同時に複数エ レ メ ン ト
を読み出す こ と がで き 、 開始間隔を改善す る こ と がで き ます。 RAM イ ン タ ーフ ェ イ ス の タ イ プは、 resource 指示子を
適用す る と 設定で き ます。
イ ン タ ーフ ェ イ ス でア レ イ に関す る 問題があ る 場合は、 通常スループ ッ ト に関係 し てお り 、 最適化指示子で処理で き
ま す。 た と えば、 例 3-18 のア レ イ が個別エ レ メ ン ト にパーテ ィ シ ョ ン さ れ、 for-loop が展開 さ れていれば、 各ア
レ イ の 4 つのエ レ メ ン ト すべてが同時にア ク セ ス さ れます。
FIFO イ ン タ ー フ ェ イ ス
Vivado HLS では、 ア レ イ 引数を RTL で FIFO ポー ト と し て イ ンプ リ メ ン ト で き ます。 FIFO ポー ト を使用す る 予定が
あ る 場合は、 ア レ イ のア ク セ ス がシーケ ン シ ャ ルにな っ てい る こ と を確認 し て く だ さ い。
Vivado HLS では、 ア ク セ ス がシーケ ン シ ャ ルであ る か ど う かが判断 さ れます。
表 3‐3 : Vivado HLS のシーケ ン シ ャ ル ア ク セス解析
シーケ ン シ ャル ア ク セス
Vivado HLS の動作
○
• FIFO ポー ト を イ ンプ リ メ ン ト
×
• エ ラ ー メ ッ セージ を表示
• 合成を停止
中間
• 警告を表示
• FIFO ポー ト を イ ンプ リ メ ン ト
注記 : ア ク セ ス が実際にシーケ ン シ ャ ルではなか っ た場合、 RTL シ ミ ュ レーシ ョ ン不一致にな り ます。
例 3-19 は、 Vivado HLS がア ク セ ス がシーケ ン シ ャ ルか ど う か判断で き ない例を示 し てい ます。 こ の例では、 d_i と
d_o の両方が合成中にFIFO イ ン タ ーフ ェ イ ス を使用 し て イ ンプ リ メ ン ト さ れ る よ う に指定 さ れてい ます。
#include array_FIFO.h
void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {
int i;
// Breaks FIFO interface d_o[3] = d_i[2];
For_Loop: for (i=0;i<4;i++) {
d_o[i] = d_i[idx[i]];
}
}
例 3‐19 : FIFO イ ン タ ー フ ェ イ スのス ト リ ー ミ ン グ
こ の例の場合、 FIFO イ ン タ ーフ ェ イ ス が問題な く 作成で き る か ど う かを判断する idx が使用 さ れてい ます。
•
idx がシーケ ン シ ャ ルに増加すれば、 FIFO イ ン タ ーフ ェ イ ス が作成で き ます。
•
idx に ラ ン ダ ム な値が使用 さ れ る と 、FIFO イ ン タ ーフ ェ イ ス が RTL に イ ンプ リ メ ン ト さ れ る 際にエ ラ ーにな り ま
す。
こ の イ ン タ ーフ ェ イ ス は問題があ る 可能性 も あ る ため、 Vivado HLS は合成中に次の よ う な警告 メ ッ セージ を表示 し 、
FIFO イ ン タ ーフ ェ イ ス を作成 し ます。
@W [XFORM-124] Array 'd_i': may have improper streaming access(es).
例 3-19 の コ メ ン ト (“//Breaks FIFO interface”) が削除 さ れ る と 、 Vivado HLS ではア レ イ へのア ク セ ス がシー
ケ ン シ ャ ルではない と 判断 さ れ、 FIFO イ ン タ ーフ ェ イ ス が指定 さ れてい る 場合はエ ラ ー メ ッ セージが表示 さ れて停
止 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
179
C の合成
注記 : FIFO ポー ト は読み出 し お よ び書 き 込みア レ イ 用には合成 さ れません。 入力ア レ イ と 出力ア レ イ は 例 3-19 の よ
う に別々に作成す る 必要があ り ます。
次の一般的な規則は、 ス ト リ ー ミ ン グ さ れ る (FIFO イ ン タ ーフ ェ イ ス で イ ンプ リ メ ン ト さ れた) ア レ イ に適用 さ れま
す。
•
ア レ イ は、 1 ループ ま たは関数でのみ読み出 さ れ、 書 き 込まれ る 必要があ り ます。 こ れは FIFO リ ン ク の特性 と
一致す る ポ イ ン ト ツー ポ イ ン ト の接続に変換 さ れ る 可能性があ り ます。
•
ア レ イ の読み出 し は、 ア レ イ の書 き 込み と 同 じ 順序であ る 必要があ り ます。 FIFO チ ャ ネルでは ラ ン ダ ム ア ク セ
ス がサポー ト さ れないので、 ア レ イ は先入れ先出 し (First In First Out) 動作に従っ たプ ロ グ ラ ム で使用 さ れ る 必要
があ り ます。
•
FIFO か ら の読み出 し お よ び書 き 込みに使用 さ れ る イ ンデ ッ ク ス は、 コ ンパ イ ル時に解析 さ れ る 必要があ り ます。
ラ ン タ イ ム計測に基づいた ア レ イ のア ド レ ス指定は、 FIFO 動作用には解析で き ないので、 ア レ イ が FIFO に変換
さ れな く な り ます。
最上位 イ ン タ ーフ ェ イ ス にア レ イ を イ ン プ リ メ ン ト ま たは最適化す る のに、 コ ー ド を変更す る 必要は通常あ り ま せ
ん。 イ ン タ ーフ ェ イ ス のア レ イ の コ ー ド を変更す る 必要があ る のは、 ア レ イ が構造体 (struct) の一部であ る 場合のみ
です。
イ ン タ ー フ ェ イ スの構造体
構造体が最上位関数への引数 と し て使用 さ れ る と 、 合成で作成 さ れ る ポー ト はその構造体の メ ンバーを直接反映 し た
も のにな り ます。 ス カ ラ ー メ ンバーは標準的な ス カ ラ ー ポー ト と し て、 ア レ イ はデフ ォ ル ト で メ モ リ ポー ト と し て
イ ンプ リ メ ン ト さ れます。
例 3-20 の場合、 struct data_t がヘ ッ ダー フ ァ イ ルで定義 さ れてい ます。 こ の構造体には、 次の 2 つのデー タ メ
ンバーが含まれます。
•
short 型
(16 ビ ッ ト ) の符号な し ベ ク タ ー A
•
4 つの unsigned char 型 (8 ビ ッ ト ) のア レ イ B
typedef struct {
unsigned short A;
unsigned char B[4];
} data_t;
data_t struct_port(data_t i_val, data_t *i_pt, data_t *o_pt);
例 3‐20 : ヘ ッ ダー フ ァ イ ルの構造体宣言
例 3-21 では、 構造体が渡 し 値引数 (i_val か ら o_val の戻 り 値) と ポ イ ン タ ー (*i_pt か ら *o_pt) の両方 と し て使
用 さ れてい ます。
#include struct_port.h
data_t struct_port(
data_t i_val,
data_t *i_pt,
data_t *o_pt
) {
data_t
int i;
o_val;
// Transfer pass-by-value structs
o_val.A = i_val.A+2;
for (i=0;i<4;i++) {
o_val.B[i] = i_val.B[i]+2;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
180
C の合成
}
// Transfer pointer structs
o_pt->A = i_pt->A+3;
for (i=0;i<4;i++) {
o_pt->B[i] = i_pt->B[i]+3;
}
return o_val;
}
例 3‐21 : 渡 し 値お よ びポ イ ン タ ー と し ての構造体
すべての関数引数お よ び関数戻 し 値は次の よ う にポー ト に合成 さ れます。
•
struct エ レ メ ン ト A は 16 ビ ッ ト ポー ト にな り ます。
•
struct エ レ メ ン ト B は 4 つのエ レ メ ン ト にア ク セ スす る RAM ポー ト にな り ます。
Vivado HLS で合成で き る 構造体のサ イ ズや複雑 さ に制限はあ り ません。構造体には必要なだけのア レ イ 次元お よ び メ
ンバーを含め る こ と がで き ます。 構造体の イ ンプ リ メ ン テーシ ョ ンでの唯一の制限は、 ス ト リ ー ミ ン グ と し て (た と
えばア レ イ が FIFO イ ン タ ーフ ェ イ ス と し て) イ ンプ リ メ ン ト さ れ る 場合にあ り ます。 こ の場合、 その イ ン タ ーフ ェ イ
ス のア レ イ に適用す る の と 同 じ 一般規則に従 う 必要があ り ます。
構造体のエ レ メ ン ト は、 デー タ パ ッ キ ン グ最適化に よ り 1 つのベ ク タ ーにパ ッ ク で き ます。 こ の最適化の実行に関
す る 詳細は、 set_directive_data_pack コ マ ン ド を参照 し て く だ さ い。 ま た、 config_interface コ マ ン ド に
-trim_dangling_ports オプシ ョ ン を使用す る と 、構造体の未使用のエ レ メ ン ト を イ ン タ ーフ ェ イ ス か ら 削除で き
ます。
デー タ 型
実行フ ァ イ ルへ コ ンパ イ ル さ れ る C 関数で使用 さ れ る デー タ 型は、 結果の精度、 メ モ リ 要件、 パフ ォーマ ン ス に影響
し ます。
•
32 ビ ッ ト 整数の int デー タ 型には、 さ ら に多 く のデー タ を保持で き る ので、 8 ビ ッ ト の char 型 よ り も 精度が高 く
な り ますが、 さ ら に多 く の ス ト レージが必要 と な り ます。
•
64 ビ ッ ト の long long 型が 32 ビ ッ ト シ ス テ ムで使用 さ れ る と 、 こ の よ う な値を読み出 し お よ び書 き 込みす る
ために通常複数ア ク セ ス が必要にな る ので、 ラ ン タ イ ムに影響がで ます。
同様に、 C 関数が RTL イ ン プ リ メ ン テーシ ョ ンに合成 さ れ る 場合 も 、 デー タ 型が RTL デザ イ ンの精度、 エ リ ア、 パ
フ ォーマ ン ス に影響 し ます。 変数に使用 さ れ る デー タ 型に よ り 、 必要な演算子のサ イ ズが決ま る ので、 RTL のエ リ ア
お よ びパフ ォーマ ン ス も 決ま り ます。
Vivado HLS では、 固定長整数型を含むすべての標準 C デー タ 型の合成がサポー ト さ れます。
•
(unsigned) char、 (unsigned) short、 (unsigned) int
•
(unsigned) long、 (unsigned) long long
•
(unsigned) intN_t (N は stdint.h で定義 さ れ る 8、 16、 32 お よ び 64)
•
float、 double
固定長整数型を使用す る と 、 デザ イ ン を シ ス テ ムのすべてのデー タ 型間でポー タ ブルにで き ます。
整数型 (unsigned) long は 64 ビ ッ ト を 64 ビ ッ ト OS、 32 ビ ッ ト を 32 ビ ッ ト OS と し て イ ン プ リ メ ン ト し ま す。
合成では こ のビヘ イ ビ アが比較 さ れ、 Vivado HLS が実行 さ れ る OS タ イ プに よ っ て、 異な る サ イ ズの演算子が生成 さ
れ る ので、 異な る RTL デザ イ ンが生成 さ れます。
•
32 ビ ッ ト の場合、 (unsigned) long デー タ 型の代わ り に、 (unsigned) int ま たは (unsigned)int32_t
を使用す る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
181
C の合成
•
64 ビ ッ ト の場合、 (unsigned)long デー タ 型の代わ り に、 (unsigned)long long ま たは
(unsigned)int64_t を使用す る 必要があ り ます。
すべての変数のデー タ 型を 1 つの共通のヘ ッ ダー フ ァ イ ルで定義する こ と をお勧め し ます。 こ の フ ァ イ ルは、 すべて
の ソ ース フ ァ イ ルに含め る こ と がで き ます。
•
通常の高位合成プ ロ ジ ェ ク ト フ ロ ー中には、た と えばサ イ ズ を削減 し た り 、ハー ド ウ ェ ア イ ンプ リ メ ン テーシ ョ
ン を も っ と 効率的にで き る よ う にす る ために、 変更可能なデー タ 型があ り ます。
•
抽象度の高い レベルで変更を し てお く 利点の 1 つは、新 し いデザ イ ン イ ンプ リ メ ン テーシ ョ ン を素早 く 作成で き
る 点にあ り ます。 通常同 じ フ ァ イ ルが後のプ ロ ジ ェ ク ト で使用 さ れ ますが、 別の ( よ り 小型、 よ り 大型、 ま たは
よ り 正確な) デー タ 型を使用す る こ と も で き ます。
こ れ ら の タ ス ク はど ち ら も 、デー タ 型が 1 つの箇所で変更で き る 場合は、 よ り 簡単に達成で き ます。 ま たは、複数フ ァ
イ ルを編集 し ます。
ヒ ン ト : ヘ ッ ダー フ ァ イ ルでマ ク ロ を使用す る 場合は、 常に独自の名前を使用 し て く だ さ い。 た と えば、 _TYPES_H
と い う 名前のマ ク ロ がヘ ッ ダー フ ァ イ ルで定義 さ れてい る 場合、よ く あ る 名前なのでほかの フ ァ イ ルで定義 さ れてい
る 可能性があ り 、 ほかの コ ー ド を イ ネーブルま たはデ ィ ス エーブル し て し ま っ て、 予測で き ない問題が発生す る こ と
も あ り ます。
標準デー タ 型
例 3-22 は、 実行 さ れ る 基本的な演算子のい く つか を示 し てい ます。
#include types_standard.h
void types_standard(din_A inA, din_B inB, din_C inC, din_D inD,
dout_1 *out1, dout_2 *out2, dout_3 *out3, dout_4 *out4
){
// Basic arithmetic operations
*out1 = inA * inB;
*out2 = inB + inA;
*out3 = inC / inA;
*out4 = inD % inA;
}
例 3‐22 : 基本的演算
例 3-22 のデー タ 型はヘ ッ ダー フ ァ イ ル cpp_ap_int_arith.h で定義 さ れてい ます (例 3-23)。 こ れには、 次のデー
タ 型を ど の よ う に使用す る かが示 さ れてい ます。
•
標準符号付 き 型
•
符号な し 型
•
固定長整数型 (stdint.h ヘ ッ ダー フ ァ イ ルを含有)
#include <stdio.h>
#include <stdint.h>
#define N 9
typedef
typedef
typedef
typedef
char din_A;
short din_B;
int din_C;
long long din_D;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
182
C の合成
typedef
typedef
typedef
typedef
int dout_1;
unsigned char dout_2;
int32_t dout_3;
int64_t dout_4;
void types_standard(din_A inA,din_B inB,din_C inC,din_D inD,dout_1
*out1,dout_2 *out2,dout_3 *out3,dout_4 *out4);
例 3‐23 : 基本的な演算デー タ 型定義
こ れ ら のデー タ 型は、 合成後、 次の演算子お よ びポー ト サ イ ズにな り ます。
•
out1 結果を計算す る ために使用 さ れ る 乗算器は 24 ビ ッ ト 乗算器にな り ます。 こ れは 8 ビ ッ ト の char 型が 16
ビ ッ ト の short で乗算 さ れ る には、 24 ビ ッ ト 乗算器が必要だか ら です。 結果は、 出力ポー ト 幅 と 一致す る よ う
に 32 ビ ッ ト ま で符号拡張 さ れます。
•
out2 に使用 さ れ る 加算器は 8 ビ ッ ト です。 出力が 8 ビ ッ ト の unsigned char 型なので、 inB (16 ビ ッ ト の
short) の下位 8 ビ ッ ト のみが 8 ビ ッ ト の char 型の inA へ追加 さ れます。
•
out3 (32 ビ ッ ト の固定幅型) 出力の場合、 8 ビ ッ ト の char 型の inA が 32 ビ ッ ト 値に拡張 さ れ、 32 ビ ッ ト (int
型) の inC 入力を使用 し て 32 ビ ッ ト の除算演算が実行 さ れます。
•
64 ビ ッ ト モジ ュ ールの演算は 64 ビ ッ ト の long long 型 inD と 64 ビ ッ ト に符号拡張 さ れた 8 ビ ッ ト の char
型 inA を使用 し て実行 さ れ、 64 ビ ッ ト の出力結果 out4 が作成 さ れます。
out1 結果が示す よ う に、 Vivado HLS では可能な限 り 最小の演算子が使用 さ れ、 結果が拡張 さ れて、 必要な出力ビ ッ
ト 幅に一致す る よ う に さ れます。 out2 結果の場合、 入力の 1 つが 16 ビ ッ ト であ っ て も 、 8 ビ ッ ト 出力 し か必要でな
いため、 8 ビ ッ ト 加算器が使用で き ます。 out3 お よ び out4 結果が示す よ う に、 すべてのビ ッ ト が必要であれば、 フ
ルサ イ ズの演算子が合成 さ れます。
float および double 型
Vivado HLS では、 合成で float お よ び double 型がサポー ト さ れ ます。 ど ち ら のデー タ 型 も IEEE-754 規格に従っ
て合成 さ れます。
•
•
単精度 32 ビ ッ ト
°
仮数部 24 ビ ッ ト
°
指数部 8 ビ ッ ト
単精度 64 ビ ッ ト
°
仮数部 53 ビ ッ ト
°
指数部 11 ビ ッ ト
float お よ び double 型は、 標準演算 (+、 -、 * な ど) に使用す る だけでな く 、 math.h (C++ の場合は cmath.h) で も よ
く 使用 さ れます。 こ のセ ク シ ョ ンでは、 標準演算のサポー ト について説明 さ れます。 C お よ び C++ の math ラ イ ブ ラ
リ を合成す る 方法の詳細は、 250 ページの 「Vivado HLS の math ラ イ ブ ラ リ 」 を参照 し て く だ さ い。
例 3-24 は、 例 3-22 で使用 さ れたヘ ッ ダー フ ァ イ ルに double お よ び float デー タ 型を定義 し た も のです。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
183
C の合成
#include <stdio.h>
#include <stdint.h>
#include <math.h>
#define N 9
typedef
typedef
typedef
typedef
double din_A;
double din_B;
double din_C;
float din_D;
typedef
typedef
typedef
typedef
double dout_1;
double dout_2;
double dout_3;
float dout_4;
void types_float_double(din_A inA,din_B inB,din_C inC,din_D inD,dout_1
*out1,dout_2 *out2,dout_3 *out3,dout_4 *out4);
例 3‐24 : float お よ び double 型
こ のア ッ プデー ト さ れたヘ ッ ダー フ ァ イ ルは、 sqrtf() 関数が使用 さ れ る 例 3-25 で使用 さ れます。
#include types_float_double.h
void types_float_double(
din_A inA,
din_B inB,
din_C inC,
din_D inD,
dout_1 *out1,
dout_2 *out2,
dout_3 *out3,
dout_4 *out4
) {
// Basic arithmetic & math.h sqrtf()
*out1 = inA * inB;
*out2 = inB + inA;
*out3 = inC / inA;
*out4 = sqrtf(inD);
}
例 3‐25 : float お よ び double 型の使用
例 3-25 が合成 さ れ る と 、 64 ビ ッ ト の倍精度乗算、 加算、 除算演算子にな り ます。 こ れ ら の演算子は適切な浮動小数
点のザ イ リ ン ク ス CORE Generator コ アで イ ンプ リ メ ン ト さ れます。
sqrtf() を使用す る 平方根は、 32 ビ ッ ト の単精度浮動小数点 コ ア を使用 し て イ ンプ リ メ ン ト さ れます。
倍精度の平方根関数 sqrt() が使用 さ れ る と 、inD で使用 さ れ る 単精度 float 型の型変換のために ロ ジ ッ ク が追加 さ れ
ます。 out4: sqrt() は倍精度 (double) 関数、 sqrtf() は単精度 (float) 関数です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
184
C の合成
C 関数では、 float-to-double お よ び double-to-float 変換ユニ ッ ト がハー ド ウ ェ アで推論 さ れ る ので、 float 型 と double 型
を混合す る 場合には注意が必要です。
次の よ う な コ ー ド があ る と し ます。
float foo_f
= 3.1459;
float var_f = sqrt(foo_f);
こ れは次の よ う なハー ド ウ ェ アにな り ます。
wire(foo_t)
→ Float-to-Double Converter unit
→ Double-Precision Square Root unit
→ Double-to-Float Converter unit
→ wire (var_f)
sqrtf() 関数を使用す る と 、 次が可能にな り ます。
•
ハー ド ウ ェ アで型 コ ンバー タ ーの必要がな く な る
•
エ リ アが節約 さ れ る
•
タ イ ミ ン グが改善 さ れ る
float 型お よ び double 型の演算は、 浮動小数点演算子の LogicCORE コ アに合成 さ れます。 表 3-4 は、 各ザ イ リ ン ク ス
フ ァ ミ リ で使用可能な コ ア を示 し てい ます。
テ ク ノ ロ ジで特定の LogiCORE エ レ メ ン ト がサポー ト さ れない (表 3-4 で X で表示 さ れ る ) 場合は、デザ イ ンが合成で
き ず、 エ ラ ー メ ッ セージが表示 さ れて、 エ ラ ー メ ッ セージが表示 さ れて Vivado HLS が停止 し ます。
表 3‐4 : 浮動小数点 コ ア
コア
Virtex‐6
7 シ リ ーズ
Virtex‐5
Virtex‐4
Spartan‐6
Spartan‐3
FAddSub
X
X
X
X
X
X
FAddSub_nodsp
X
X
X
-
-
-
FAddSub_fulldsp
X
X
X
-
-
-
FCmp
X
X
X
X
X
X
FDiv
X
X
X
X
X
X
FMul
X
X
X
X
X
X
FExp_nodsp
X
FExp_meddsp
X
FExp_fulldsp
X
FMul_nodsp
X
X
X
-
X
X
FMul_meddsp
X
X
X
-
X
X
FMul_fulldsp
X
X
X
-
X
X
FMul_maxdsp
X
X
X
-
X
X
DAddSub
X
X
X
X
X
X
DAddSub_nodsp
X
X
X
-
-
-
DAddSub_fulldsp
X
X
X
-
-
-
DCmp
X
X
X
X
X
X
DDiv
X
X
X
X
X
X
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
185
C の合成
表 3‐4 : 浮動小数点 コ ア (続き)
コア
Virtex‐6
7 シ リ ーズ
DMul
X
DExp_nodsp
X
DExp_meddsp
X
DExp_fulldsp
X
DMul_nodsp
Virtex‐5
Virtex‐4
Spartan‐6
Spartan‐3
X
X
X
X
X
X
X
X
-
X
X
DMul_meddsp
X
X
X
-
-
-
DMul_fulldsp
X
X
X
-
X
X
DMul_maxdsp
X
X
X
-
X
X
表 3-4 の コ ア で は、 多数の DSP48 が 使用 さ れ る か、 1 つ も 使用 さ れ な い よ う な コ ア (例 : DMul_nodsp お よ び
DMul_maxdsp) で演算が イ ンプ リ メ ン ト さ れ る こ と があ り ます。 Vivado HLS はデフ ォ ル ト では最大数の DSP48 を
含む コ ア を使用 し て演算を イ ンプ リ メ ン ト し ます。 ま たは、 resource 指示子を使用 し て ど の コ ア を使用す る べ き か明
示的に指定す る こ と も で き ます。
float お よ び double 型を合成す る 際には、Vivado HLS が C コ ー ド で実行 さ れ る 演算順序を維持 し て、C シ ミ ュ レーシ ョ
ン と 結果が同 じ にな る よ う に し ます。 飽和お よ び切 り 捨てのため、 次は単精度お よ び倍精度演算で必ず し も 同 じ にな
る わけではあ り ません。
A=B*C;
D=E*F;
O1=A*D
A=B*F;
D=E*C;
O2=A*D;
float お よ び double 型を使用す る 場合、 O1 と O2 は必ず し も 同 じ にな る わけではあ り ません。
ヒ ン ト : デザ イ ンに よ っ ては、 ループの展開や部分展開な ど の最適化に よ り 、 並列計算の利点を生かす こ と ので き な
い場合 も あ り ます。 こ れは、float お よ び double 型を合成する 際に Vivado HLS で演算順序が厳 し く 守 ら れ る か ら です。
C++ デザ イ ンの場合は、 Vivado HLS の最 も よ く 使用 さ れ る 数学関数の ビ ッ ト を概算する 機能を使用で き ます。
復号デー タ 型
Vivado HLS では、 合成で復号デー タ 型がサポー ト さ れます。
•
array
•
enum
•
struct
•
union
enum、 struct お よ び複雑な定義の コ ー ド 例
例 3-26 のヘ ッ ダー フ ァ イ ルでは、 enum 型を い く つか定義 し 、 それ ら を struct で使用 し てい ま す。 こ の struct
が別の struct で使用 さ れ る と 、 複雑なデー タ 型がわか り やす く 記述で き ます。
例 3-26 は、 複雑な定義文 (MAD_NSBSAMPLES) の指定お よ び合成方法を示 し てい ます。
#include <stdio.h>
enum mad_layer {
MAD_LAYER_I
MAD_LAYER_II
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
= 1,
= 2,
japan.xilinx.com
Send Feedback
186
C の合成
MAD_LAYER_III = 3
};
enum mad_mode {
MAD_MODE_SINGLE_CHANNEL = 0,
MAD_MODE_DUAL_CHANNEL = 1,
MAD_MODE_JOINT_STEREO = 2,
MAD_MODE_STEREO = 3
};
enum mad_emphasis {
MAD_EMPHASIS_NONE = 0,
MAD_EMPHASIS_50_15_US = 1,
MAD_EMPHASIS_CCITT_J_17 = 3
};
typedef
signed int mad_fixed_t;
typedef struct mad_header {
enum mad_layer layer;
enum mad_mode mode;
int mode_extension;
enum mad_emphasis emphasis;
unsigned long long bitrate;
unsigned int samplerate;
unsigned short crc_check;
unsigned short crc_target;
int flags;
int private_bits;
} header_t;
typedef struct mad_frame {
header_t header;
int options;
mad_fixed_t sbsample[2][36][32];
} frame_t;
# define MAD_NSBSAMPLES(header) \
((header)->layer == MAD_LAYER_I ?12 :\
(((header)->layer == MAD_LAYER_III &&
((header)->flags & 17)) ?18 :36))
\
void types_composite(frame_t *frame);
例 3‐26 : enum 、 struct お よ び複雑な定義
例 3-26 では、 例 3-27 で定義 さ れた struct お よ び enum 型が使用 さ れてい ます。 enum が最上位関数への引数で使
用 さ れ る と 、 標準の C コ ンパ イ ル ビヘ イ ビ アに準拠す る ために 32 ビ ッ ト 値 と し て合成 さ れ ます。 enum 型がデザ イ
ン内部に対 し て指定 さ れ る 場合、 Vivado HLS で必要な ビ ッ ト 数ま で最適化で減 ら さ れます。
復号デー タ 型の コ ー ド 例
例 3-27 は、 合成中に printf 文が無視 さ れ る よ う に記述 し てい ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
187
C の合成
#include types_composite.h
void types_composite(frame_t *frame)
{
if (frame->header.mode != MAD_MODE_SINGLE_CHANNEL) {
unsigned int ns, s, sb;
mad_fixed_t left, right;
ns = MAD_NSBSAMPLES(&frame->header);
printf(Samples from header %d \n, ns);
for (s = 0; s < ns; ++s) {
for (sb = 0; sb < 32; ++sb) {
left = frame->sbsample[0][s][sb];
right = frame->sbsample[1][s][sb];
frame->sbsample[0][s][sb] = (left + right) / 2;
}
}
frame->header.mode = MAD_MODE_SINGLE_CHANNEL;
}
}
例 3‐27 : 複雑な デー タ 型の使用
union の コ ー ド 例
例 3-28 では、 double お よ び struct を使用 し て union が作成 さ れてい ます。 C コ ンパ イ ル と 異な り 、 union のすべ
ての フ ィ ール ド に合成で必ず同 じ メ モ リ (合成の場合、 レ ジ ス タ ) が使用 さ れ る と は限 り ません。 Vivado HLS では、
最 も 適 し たハー ド ウ ェ ア を提供す る よ う に、 最適化が実行 さ れます。
#include types_union.h
dout_t types_union(din_t N, dinfp_t F)
{
union {
struct {int a; int b; } intval;
double fpval;
} intfp;
unsigned long long one, exp;
// Set a floating-point value in union intfp
intfp.fpval = F;
// Slice out lower bits and add to shifted input
one = intfp.intval.a;
exp = (N & 0x7FF);
return ((exp << 52) + one) & (0x7fffffffffffffffLL);
}
例 3‐28 : union
注記 : Vivado HLS では、合成でのポ イ ン タ ー再変換がサポー ト さ れません。 こ の結果、union はポ イ ン タ ーを別のデー
タ 型 (ま たは別のデー タ 型のア レ イ ) に保持で き ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
188
C の合成
コー ド例
union の合成では、 ネ イ テ ィ ブ C 型 と ユーザー定義の型間のキ ャ ス ト がサポー ト さ れてい ません。 次の union には、 ネ
イ テ ィ ブ型の long long と ユーザー定義の struct が含まれ ます。 こ の union は、 ネ イ テ ィ ブ方か ら ユーザー定義型
へのキ ャ ス ト が必要 と な る ので、 合成で き ません。
typedef union {
long long raw[6];
struct {
int b;
int c;
int a[10];
};
} data_t;
例 3‐29 : コ ー ド 例
型修飾子
型修飾子は、 高位合成で作成 さ れ る ハー ド ウ ェ アに直接影響 し ます。 通常、 修飾子は次に示す よ う に合成結果に影響
を与え ますが (予測可能)、 Vivado HLS は、 修飾子の解釈に よ っ てのみ制限 さ れ ま す。 こ れは、 修飾子が関数の動
作に影響を与え、 最適化を実行 し て よ り 最適なハー ド ウ ェ ア デザ イ ン を作成で き る か ら です。 こ の例は、 各修飾子
の概要の後に示 し ます。
volatile
volatile 修飾子は、 ポ イ ン タ ーが関数 イ ン タ ーフ ェ イ ス で複数回ア ク セ ス さ れ る と き の、 読み出 し ま たは書 き 込み
の実行回数に影響 し ます。 volatile 修飾子は、 階層内のすべての関数に影響を与え ます。 volatile 修飾子につい
ては、 最上位 イ ン タ ーフ ェ イ ス に関す る セ ク シ ョ ンで主に説明 し てい ます。 詳細は、 173 ページの 「揮発性デー タ の
理解」 を参照 し て く だ さ い。
任意精度型では、 算術演算での volatile 修飾子はサポー ト さ れません。 volatile 修飾子を使用 し た任意精度デー タ 型は、
演算式で使用す る よ り も 前に、 volatile 以外のデー タ 型に割 り 当て る 必要があ り ます。
static
関数内の static は、 関数呼び出 し 間の値を保持 し ます。 ハー ド ウ ェ ア デザ イ ンの同等のビヘ イ ビ アは、 レ ジ ス タ 付 き
の変数 (フ リ ッ プ フ ロ ッ プ ま たは メ モ リ ) です。 正 し く 実行 さ れ る ために変数を C 関数の static 型にす る 必要があ る 場
合、 最終 RTL デザ イ ン では確実に レ ジ ス タ にな り ます。 値は、 関数お よ びデザ イ ン の起動中維持 さ れてい る 必要が
あ り ます。
static 型だけが合成後に レ ジ ス タ にな る と い う わけではあ り ません。 RTL デザ イ ン で ど の変数が レ ジ ス タ と し て イ
ンプ リ メ ン ト さ れ る 必要があ る かは、 Vivado HLS で判断 さ れます。 た と えば、 変数引数が複数サ イ ク ル間保持 さ れ る
必要があ る 場合、 C 関数の元の変数が static 型でな く て も 、 Vivado HLS ではその値を保持す る ために レ ジ ス タ が作成
さ れます。
Vivado HLS は static の初期化動作に従っ て、 初期化中に レ ジ ス タ へ値 0 を割 り 当て る か、 指定 さ れた初期化値に割 り
当て ます。 つま り 、 static 変数は RTL コ ー ド と FPGA ビ ッ ト ス ト リ ームで初期化 さ れます。 リ セ ッ ト 信号がアサー
ト さ れ る たびに変数が初期化 し 直 さ れ る わけではあ り ません。
static 初期 化値 を シ ス テ ム リ セ ッ ト 時 に イ ン プ リ メ ン ト す る 方法 に つ い て は、 RTL コ ン フ ィ ギ ュ レ ー シ ョ ン
(config_rtl コ マ ン ド ) を参照 し て く だ さ い。
const
const 型では、 変数の値がア ッ プデー ト さ れない こ と を指定 し ます。 変数は読み出 さ れますが、 書 き 込まれ る こ と は
ないので、 初期化 さ れ る 必要があ り ます。 ほ と ん ど の const 変数は、 通常 RTL デザ イ ン では定数に削減 さ れ ます。
Vivado HLS は定数伝搬を実行 し て、 不必要なハー ド ウ ェ ア を削除 し ます
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
189
C の合成
ア レ イ の場合、 const 変数は最終 RTL デザ イ ン で ROM と し て イ ン プ リ メ ン ト さ れ ま す (小 さ いア レ イ では Vivado
HLS で自動パーテ ィ シ ョ ンが実行 さ れないため)。 const 修飾子で指定 さ れた ア レ イ は、 static の場合 と 同様、 RTL お
よ び FPGA ビ ッ ト ス ト リ ーム で初期化 さ れます。 こ れ ら は書き 込まれ る こ と がないため、 リ セ ッ ト す る 必要はあ り ま
せん。
Vivado HLS の最適化
例 3-30 では、 ア レ イ が static ま たは const 修飾子で指定 さ れていな く て も 、 Vivado HLS で ROM が イ ンプ リ メ ン
ト さ れ る 例を示 し てい ます。 こ れは、 Vivado HLS で ど の よ う にデザ イ ンが解析 さ れ、 最適な イ ンプ リ メ ン テーシ ョ ン
が判断 さ れ る か を示 し てい ます。 修飾子の有無に よ る 影響はあ り ますが、 最終的な RTL は こ れに よ っ て決定は さ れ
ません。
#include array_ROM.h
dout_t array_ROM(din1_t inval, din2_t idx)
{
din1_t lookup_table[256];
dint_t i;
for (i = 0; i < 256; i++) {
lookup_table[i] = 256 * (i - 128);
}
return (dout_t)inval * (dout_t)lookup_table[idx];
}
例 3‐30 : static ま たは const を使用 し な い ROM イ ン プ リ メ ン テ ーシ ョ ンの コ ー ド 例
例 3-30 の場合、 Vivado HLS で lookup_table 変数が最終 RTL で メ モ リ エ レ メ ン ト にな る のが最適な イ ンプ リ メ ン
テーシ ョ ン で あ る と 判断で き ま す。 ア レ イ で こ れを達成す る 方法については、 212 ページの 「ROM の イ ン プ リ メ ン
ト 」 を参照 し て く だ さ い。
グ ローバル変数
グ ロ ーバル変数は コ ー ド 内で自由に使用で き 、完全に合成可能です。デフ ォ ル ト ではグ ロ ーバル変数は RTL イ ン タ ー
フ ェ イ ス のポー ト と し ては公開 さ れません。
グ ロ ーバル変数の コ ー ド 例
例 3-31 では、 グ ロ ーバル変数のデフ ォ ル ト の合成ビヘ イ ビ アが示 さ れ、 3 つのグ ロ ーバル変数が使用 さ れてい ます。
こ の例ではア レ イ が使用 さ れますが、Vivado HLS ではすべての タ イ プのグ ロ ーバル変数 タ イ プがサポー ト さ れてい ま
す。
•
値はア レ イ Ain か ら 読み出 さ れます。
•
ア レ イ Aint は Ain か ら の値を変換 し て Aout に渡すために使用 さ れます。
•
出力はア レ イ Aout に書 き 込まれます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
190
C の合成
din_t Ain[N];
din_t Aint[N];
dout_t Aout[N/2];
void types_global(din1_t idx) {
din_t i,lidx;
// Move elements in the input array
for (i=0; i<N; ++i) {
lidx=i;
if(lidx+idx>N-1)
lidx=N-1;
Aint[lidx] = Ain[lidx+idx] + Ain[lidx];
}
// Sum to half the elements
for (i=0; i<(N/2); i++) {
Aout[i] = (Aint[i] + Aint[i+1])/2;
}
}
例 3‐31 : グ ロ ーバル変数の コ ー ド 例
デフ ォ ル ト では、合成後、RTL デザ イ ンのポー ト は idx だけにな り ます。グ ロ ーバル変数はデフ ォ ル ト では RTL ポー
ト と し ては使用可能にな り ません。 デフ ォ ル ト では、 次の よ う にな り ます。
•
ア レ イ Ain は読み出 し 元の内部 RAM
•
ア レ イ Aout は書 き 込み先の内部 RAM
I/O ポー ト と し てのグ ローバル変数の使用
グ ロ ーバル変数はデフ ォ ル ト では IO ポー ト と し ては使用可能にな り ませんが、 次の 3 つのいずれかの方法で使用可
能にで き ます。
•
グ ロ ーバル変数が外部修飾子を使用 し て定義 さ れ る と 、 変数 ise が I/O ポー ト と し て使用可能にな り ます。
•
I/O プ ロ ト コ ルが INTERFACE 指示子を使用 し て グ ロ ーバル変数に指定 さ れ る と 、 こ の変数は指定 し た イ ン タ ー
フ ェ イ ス プ ロ ト コ ルの I/O ポー ト に合成 さ れます。
•
イ ン タ ーフ ェ イ ス コ ン フ ィ ギ ュ レーシ ョ ンで expose_global オプシ ョ ン を使用す る と 、 すべてのグ ロ ーバル
変数が RTL イ ン タ ーフ ェ イ ス でポー ト と し て使用可能にな り ます。 イ ン タ ーフ ェ イ ス コ ン フ ィ ギ ュ レーシ ョ ン
は、 次のいずれかか ら 設定で き ます。
°
[Solution Settings] → [General]
°
config_interface Tcl コ マ ン ド
グ ロ ーバル変数が イ ン タ ーフ ェ イ ス コ ン フ ィ ギ ュ レーシ ョ ンに よ り 使用可能にな る と 、デザ イ ン内でのみア ク セ ス さ
れ る よ う な も の も 含め、 デザ イ ンのグ ロ ーバル変数がすべて I/O ポー ト と し て使用可能にな り ます。
ま た、 グ ロ ーバル変数が ス タ テ ィ ッ ク 修飾子を使用 し て指定 さ れ る と 、 I/O ポー ト には合成で き ません。
グ ロ ーバル変数は合成でサポー ト さ れますが、 グ ロ ーバル変数を広範囲に使用す る コ ー ド はお勧め し ません。
ポイ ン ター
ポ イ ン タ ーは C コ ー ド で広範囲に使用 さ れ、 合成で も サポー ト さ れます。 ポ イ ン タ ーを使用する 際は、 次に注意 し て
く だ さ い。
•
ポ イ ン タ ーが同 じ 関数内で複数回ア ク セ ス (読み出 し ま たは書き 込み) さ れ る 場合
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
191
C の合成
詳細は、 172 ページの 「マルチア ク セ ス ポ イ ン タ ー イ ン タ ーフ ェ イ ス : ス ト リ ー ミ ン グ デー タ 」 を参照 し て く だ
さ い。
•
ポ イ ン タ ーのア レ イ を使用す る 場合、 各ポ イ ン タ ーが別のポ イ ン タ ーではな く 、 ス カ ラ ーま たは ス カ ラ ー ア レ イ
を指定す る 必要あ り
•
ポ イ ン タ ーの型変換は標準 C 型間の変換の場合にのみサポー ト あ り
複数のポ イ ン タ ー タ ーゲ ッ ト の コ ー ド 例
前述の例の多 く は、 Vivado HLS を使用 し て C ポ イ ン タ ーが合成で き る こ と を示 し てい ま し た。 ポ イ ン タ ーのサポー
ト さ れ る 合成には、 ポ イ ン タ ーが複数のオブジ ェ ク ト を指定す る 場合 も 含まれます (例 3-32)。
#include pointer_multi.h
dout_t pointer_multi (sel_t sel, din_t pos) {
static const dout_t a[8] = {1, 2, 3, 4, 5, 6, 7, 8};
static const dout_t b[8] = {8, 7, 6, 5, 4, 3, 2, 1};
dout_t* ptr;
if (sel)
ptr = a;
else
ptr = b;
return ptr[pos];
}
例 3‐32 : 複数のポ イ ン タ ー タ ーゲ ッ ト
ダ ブルポ イ ン タ ーの コ ー ド 例
ダブルポ イ ン タ ー も 合成でサポー ト さ れます。 詳細は、 例 3-33を参照 し て く だ さ い。 ダブルポ イ ン タ ーが複数の関数
で使用 さ れ る と 、Vivado HLS ではすべての関数を それが使用 さ れ る 箇所で イ ン ラ イ ン化 し ます。複数の関数を イ ン ラ
イ ン化す る と 、 ラ ン タ イ ムが増加 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
192
C の合成
#include pointer_double.h
data_t sub(data_t ptr[10], data_t size, data_t**flagPtr)
{
data_t x, i;
x = 0;
// Sum x if AND of local index and double-pointer index is true
for(i=0; i<size; ++i)
if (**flagPtr & i)
x += *(ptr+i);
return x;
}
data_t pointer_double(data_t pos, data_t x, data_t* flag)
{
data_t array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
data_t* ptrFlag;
data_t i;
ptrFlag = flag;
// Write x into index position pos
if (pos >=0 & pos < 10)
*(array+pos) = x;
// Pass same index (as pos) as pointer to another function
return sub(array, 10, &ptrFlag);
}
例 3‐33 : ダ ブルポ イ ン タ ー
ポ イ ン タ ー ア レ イの コ ー ド 例
ポ イ ン タ ーのア レ イ も 合成で き ます。 例 3-34 では、 ポ イ ン タ ーのア レ イ がグ ロ ーバルア レ イ の 2 次元の開始位置を
格納す る ために使用 さ れてい ます。
ポ イ ン タ ーのア レ イ 内のポ イ ン タ ーは、 ス カ ラ ーま たは ス カ ラ ーのア レ イ のみを指定で き 、 ほかのポ イ ン タ ーを指定
す る こ と はで き ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
193
C の合成
#include pointer_array.h
data_t A[N][10];
data_t pointer_array(data_t B[N*10]) {
data_t i,j;
data_t sum1;
// Array of pointers
data_t* PtrA[N];
// Store global array locations in temp pointer array
for (i=0; i<N; ++i)
PtrA[i] = &(A[i][0]);
// Copy input array using pointers
for(i=0; i<N; ++i)
for(j=0; j<10; ++j)
*(PtrA[i]+j) = B[i*10 + j];
// Sum input array
sum1 = 0;
for(i=0; i<N; ++i)
for(j=0; j<10; ++j)
sum1 += *(PtrA[i] + j);
return sum1;
}
例 3‐34 : ポ イ ン タ ー ア レ イ の コ ー ド 例
ポ イ ン タ ーの型変換は、ネ イ テ ィ ブ C 型が使用 さ れ る 場合に合成でサポー ト さ れます。例 3-35 では、data_t (char)
型が ‘ 型に変換 さ れてい ます。
#define N 1024
typedef int data_t;
typedef char dint_t;
data_t pointer_cast_native (data_t index,
dint_t* ptr;
data_t i =0, result = 0;
ptr = (dint_t*)(&A[index]);
data_t A[N]) {
// Sum from the indexed value as a different type
for (i = 0; i < 4*(N/10); ++i) {
result += *ptr;
ptr+=1;
}
return result;
}
例 3‐35 : ネ イ テ ィ ブ型 を使用 し たポ イ ン タ ー型変換
Vivado HLS では、 一般的なデー タ 型間のポ イ ン タ ー キ ャ ス テ ィ ン グはサポー ト さ れ ません。 た と えば、 符号付 き の
値の struct 複合型が作成 さ れ る と 、 ポ イ ン タ ーを型変換 し て符号な し の値を代入する こ と はで き ません。
struct {
short first;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
194
C の合成
short second;
} pair;
// Not supported for synthesis
*(unsigned*)pair = -1U;
こ の よ う な場合、 値はネ イ テ ィ ブ型を使用 し て代入す る 必要があ り ます。
struct {
short first;
short second;
} pair;
// Assigned value
pair.first = -1U;
pair.second = -1U;
C の任意精度整数型
C のネ イ テ ィ ブ デー タ 型は、 8 ビ ッ ト 境界 (8、 16、 32、 64 ビ ッ ト ) にあ り ま す。 RTL 信号お よ び演算では、 任意の
ビ ッ ト 長がサポー ト さ れ ます。 Vivado HLS では C++ の任意精度デー タ 型が提供 さ れてお り 、 C コ ー ド の変数お よ び
演算を任意のビ ッ ト 幅 (6 ビ ッ ト 、 17 ビ ッ ト 、 234- ビ ッ ト な ど、 最大 1024 ビ ッ ト ま で) で指定で き ます。
Vivado HLS では、 C++ の任意精度デー タ 型 も 提供 さ れてお り 、 SystemC の一部であ る 任意精度デー タ 型がサポー ト さ
れます。 こ れ ら のデー タ 型については、 C++ お よ び SystemC コ ー ド 記述方法でそれぞれ説明 し ます。
任意精度デー タ 型の利点
任意精度デー タ 型を使用す る 利点は、 次の と お り です。
•
ハー ド ウ ェ アの質の改善
た と えば 17 ビ ッ ト の乗算器が必要な場合、 計算で調度 17 ビ ッ ト が使用 さ れ る よ う に指定す る ために任意精度型
を使用で き ます。
任意精度デー タ 型を使用 し ない場合、 こ の よ う な乗算 (17 ビ ッ ト ) は 32 ビ ッ ト の整数デー タ 型を使用 し て イ ンプ
リ メ ン ト す る 必要があ る ので、 複数の DSP48 コ ン ポーネ ン ト を使用 し て乗算が イ ン プ リ メ ン ト さ れ る こ と にな
り ます。
•
正確な C シ ミ ュ レーシ ョ ンお よ び解析
C コ ー ド の任意精度デー タ 型を使用する と 、 正確な ビ ッ ト 幅を使用 し て C シ ミ ュ レーシ ョ ン を実行で き 、 合成前
にアルゴ リ ズ ムの機能 (お よ び精度) を検証で き ます。
任意精度型の使用
こ のセ ク シ ョ ンの残 り の部分では、 任意精度型の使用方法 と 注意すべ き 問題点について記述 し ます。 詳細は、 それぞ
れの言語の 「任意精度型」 セ ク シ ョ ン を参照 し て く だ さ い。 こ のセ ク シ ョ ンには、 次の情報が含まれます。
•
任意精度の整数に (64 ビ ッ ト を超え る 値 も h 組めて) 定数お よ び初期値を代入す る 方法
•
表示、 連結、 ビ ッ ト ス ラ イ ス、 範囲選択な ど の Vivado HLS のヘルパー関数の詳細
•
シ フ ト 演算 (負のシ フ ト 値は反対方向でシ フ ト にな る ) の記述 も 含めた演算子の動作の詳細
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
195
C の合成
C 言語での任意精度デー タ 型の使用
C 言語では、 ヘ ッ ダー フ ァ イ ル ap_cint.h に よ り 任意精度の整数デー タ 型 [u]int#W が定義 さ れ ます。 次に例を
示 し ます。
•
int8は 8 ビ ッ ト の符号付 き 整数デー タ 型を表 し ます。
•
uint234は 234 ビ ッ ト の符号な し 整数デー タ 型を表 し ます。
ap_cint.h フ ァ イ ルは、 次のデ ィ レ ク ト リ に含まれます。
$HLS_ROOT/includ
説明 :
•
$HLS_ROOT は Vivado HLS の イ ン ス ト ール デ ィ レ ク ト リ です。
例 3-36 の コ ー ド は、 前述の基本的な演算例 (例 3-22) の コ ー ド を繰 り 返 し た も のです。 ど ち ら の例で も 合成 さ れ る 最
上位関数のデー タ 型は dinA_t、 dinB_t な ど と 指定 さ れてい ます。
#include apint_arith.h
void apint_arith(din_A inA, din_B inB, din_C inC, din_D inD,
out_1 *out1, dout_2 *out2, dout_3 *out3, dout_4 *out4
) {
// Basic arithmetic operations
*out1 = inA * inB;
*out2 = inB + inA;
*out3 = inC / inA;
*out4 = inD % inA;
}
例 3‐36 : 基本的演算
2 つの例の違いは、デー タ 型の定義方法です。C 関数で任意精度の整数デー タ 型を使用す る には、次の手順に従い ます。
•
ソ ース コ ー ド にヘ ッ ダー フ ァ イ ル ap_cint.h を追加 し ます。
•
ネ イ テ ィ ブ C 型を次の任意精度に変更 し ます。
°
intN
ま たは
°
uintN
説明 :
-
N は 1 ~ 1024 のビ ッ ト サ イ ズ を表 し ます。
デー タ 型はヘ ッ ダー フ ァ イ ル apint_arith.h で定義 さ れます。 詳細は、 例 3-37を参照 し て く だ さ い。 例 3-22 と 比
較す る と 、 次の こ と がわか り ます。
•
入力デー タ 型は単に実際の入力デー タ の最大サ イ ズ を表すために削減 さ れてい ます。た と えば、8 ビ ッ ト 入力 inA
は 6 ビ ッ ト 入力に削減 さ れてい ます。
•
出力は さ ら に正確に改良 さ れてい ます。 た と えば inA と inB の合計であ る out2 は 32 ビ ッ ト ではな く 13 ビ ッ
ト だけであ る 必要があ り ます。
#include <stdio.h>
#include ap_cint.h
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
196
C の合成
// Previous data types
//typedef char dinA_t;
//typedef short dinB_t;
//typedef int dinC_t;
//typedef long long dinD_t;
//typedef int dout1_t;
//typedef unsigned int dout2_t;
//typedef int32_t dout3_t;
//typedef int64_t dout4_t;
typedef
typedef
typedef
typedef
int6 dinA_t;
int12 dinB_t;
int22 dinC_t;
int33 dinD_t;
typedef
typedef
typedef
typedef
int18 dout1_t;
uint13 dout2_t;
int22 dout3_t;
int6 dout4_t;
void apint_arith(dinA_t inA,dinB_t inB,dinC_t inC,dinD_t inD,dout1_t
*out1,dout2_t *out2,dout3_t *out3,dout4_t *out4);
例 3‐37 : 基本演算 APINT 型
例 3-37 が合成 さ れ る と 、 例 3-22 と 同 じ 機能のデザ イ ン (デー タ は 例 3-37 で指定 さ れた範囲内) にな り ます。 ビ ッ ト
幅が少ない と ロ ジ ッ ク も 削減 さ れ る ので、最終 RTL デザ イ ンでは、エ リ アは小 さ く 、ク ロ ッ ク 速度は高速にな り ます。
関数は、 合成前に コ ンパ イ ルお よ び検証 さ れ る 必要があ り ます。
C 言語での任意精度デー タ 型の検証
任意精度型を作成す る には、 ap_cint.h フ ァ イ ルの ビ ッ ト サ イ ズ を定義す る ための属性を追加 し ます。 gcc な ど の
標準 C コ ンパ イ ラ では、 ヘ ッ ダー フ ァ イ ルで使用 さ れ る 属性が コ ンパ イ ル さ れ ますが、 その属性の意味は解釈で き
ません。 標準 C コ ンパ イ ラ で最終的な実行フ ァ イ ルが作成 さ れ る と 、 次の よ う な メ ッ セージが表示 さ れます。
$HLS_ROOT/include/etc/autopilot_dt.def:1036: warning: bit-width attribute directive
Ignored
こ の後、 シ ミ ュ レーシ ョ ンにネ イ テ ィ ブ C デー タ 型が使用 さ れますが、 コ ー ド のビ ッ ト 精度動作は結果に反映 さ れま
せん。 た と えば、 2 進数記述 100 の 3 ビ ッ ト の整数値は gcc (ま たはその他のサー ド パーテ ィ C コ ンパ イ ラ ) に よ り -4
ではな く 、 10 進数値の 4 と し て処理 さ れます。
注記 : こ の問題は、 C 任意精度型を使用す る 場合にのみ発生 し 、 C++ ま たは SystemC の任意精度型を使用す る 場合は
発生 し ません。
高位合成では、 任意精度型が使用 さ れてい る と 認識 さ れ る と 、 独自の C コ ンパ イ ラ の apcc を使用す る こ と で こ の問
題が自動的に回避 さ れます。apcc コ ンパ イ ラ は gcc と 互換性があ り ますが、任意精度型 と 演算は正 し く 解釈 さ れます。
apcc コ ンパ イ ラ は、 csim_design コ マ ン ド で自動的に使用 さ れ、 コ マ ン ド プ ロ ンプ ト で gcc を apcc に置 き 換え る と 使
用で き ます。
$ apcc -o foo_top foo_top.c tb_foo_top.c
$ ./foo_top
C コ ー ド で任意精度型を使用す る と 、 Cデザ イ ン を Vivado HLS の C デバ ッ ガーで解析で き な く な り ます。
デザ イ ン をデバ ッ グす る 必要があ る 場合は、 次のいずれかの方法に従っ て く だ さ い。
•
printf ま たは fprintf 関数を使用 し て解析用にデー タ 値を出力 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
197
C の合成
•
任意精度型を ネ イ テ ィ ブ C 型 (int、 char、 short な ど) に置 き 換え ます。 こ の方法を使用す る と 、 アルゴ リ ズ ム自
体の演算はデバ ッ グ し やす く な り ますが、 そのアルゴ リ ズ ムの ビ ッ ト 精度結果の解析には役立ち ません。
•
C 関数を C++ に変更 し 、 デバ ッ ガーの制限がない C++ 任意精度型を使用 し ます。
整数拡張
任意精度演算の結果がネ イ テ ィ ブ ビ ッ ト 値の 8、 16、 32、 64 ビ ッ ト 境界を越え る 場合は、 注意が必要です。 次の例で
は、 2 つの 18 ビ ッ ト 値が乗算 さ れ、 結果が 36 ビ ッ ト に格納 さ れてい ます。
#include ap_cint.h
int18
int36
a,b;
tmp;
tmp = a * b;
整数拡張は、 次の方法を使用す る と 発生 し ます。 結果は、 予測 と 異な る 可能性があ り ます。
整数拡張では、 C コ ンパ イ ラ で次が実行 さ れます。
•
乗算結果を 18 ビ ッ ト か ら 次のネ イ テ ィ ブ ビ ッ ト サ イ ズ (32 ビ ッ ト ) に拡張 し ます。
•
その結果を 32 ビ ッ ト 変数の tmp に代入 し ます。
こ れに よ り 、 動作 と 不正な結果が 図 3-6 に示す よ う にな り ます。
X-Ref Target - Figure 3-6
図 3‐6 : 整数拡張
Vivado HLS では、 C シ ミ ュ レーシ ョ ン同 じ 結果にな る ので、 32 ビ ッ ト の乗算結果が 36 ビ ッ ト の結果に符号拡張 さ れ
る ハー ド ウ ェ アが作成 さ れます。
整数拡張問題は、 演算子入力を出力サ イ ズの型に変更す る と 回避で き ます。 図 3-38 は、 乗算前に乗算器への入力を
36 ビ ッ ト 値に変換す る 例を示 し てい ます。 こ れで C シ ミ ュ レーシ ョ ン中に正 し い (予測どお り の) 結果にな り 、 RTL
で予測 さ れた 36 ビ ッ ト 乗算にな り ます。
#include ap_cint.h
typedef int18 din_t;
typedef int36 dout_t;
dout_t apint_promotion(din_t a,din_t b) {
dout_t tmp;
tmp = (dout_t)a * (dout_t)b;
return tmp;
}
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
198
C の合成
例 3‐38 : 整数拡張 を回避す る ための型変換
整数拡張を避け る ための型変換は、 演算結果が次のネ イ テ ィ ブ境界 (8、 16、 32 ま たは 64) よ り も 大 き い場合にのみ必
要です。 こ れは、 加算お よ び減算 よ り も 乗算で よ く 発生 し ます。
整数拡張問題は、 C++ ま たは SystemC の任意精度型を使用する 場合は発生 し ません。
関数
最上位関数は、 合成後に最上位 RTL デザ イ ンにな り 、 下位関数は RTL デザ イ ン ではブ ロ ッ ク に合成 さ れます。
重要 : 最上位関数は、 static 関数にはで き ません。
合成後、 デザ イ ンの各関数に対 し て独自の合成レ ポー ト と RTL HDL フ ァ イ ル (Verilog、 VHDL、 SystemC) が作成 さ れ
ます。
関数のイ ン ラ イ ン化
下位関数は、 オプシ ョ ン で イ ン ラ イ ン化 し て、 その ロ ジ ッ ク と 周囲の関数の ロ ジ ッ ク と を統合で き ます。 イ ン ラ イ ン
化す る 関数に よ り 最適化が改善 さ れ る こ と はあ り ますが、 ラ ン タ イ ムは増加 し ます。 よ り 多 く の ロ ジ ッ ク と 可能性が
メ モ リ に保持 さ れて解析 さ れます。
ヒ ン ト : Vivado HLS では、 小 さ い関数の イ ン ラ イ ン化が自動的に実行 さ れます。 小 さ い関数の自動 イ ン ラ イ ン化を オ
フ にす る には、 その関数に対す る inline 指示子を off に設定 し ます。
関数が イ ン ラ イ ン化 さ れ る と 、 その関数に対す る レ ポー ト お よ び別の RTL フ ァ イ ルは作成 さ れ ません。 ロ ジ ッ ク お
よ びループは 1 つ上の階層の関数 と 統合 さ れます。
コ ー ド 形式の影響
関数の コ ー ド 記述方法は、 主に関数の引数お よ び イ ン タ ーフ ェ イ ス に影響 し ます。
関数への引数サ イ ズが正確に記述 さ れていれば、Vivado HLS で こ の情報がデザ イ ンに伝搬 さ れます。すべての変数に
対 し て任意精度型を作成す る 必要はあ り ません。 次の例では、 2 つの整数が乗算 さ れますが、 下位の 24 ビ ッ ト のみが
結果に使用 さ れます。
#include ap_cint.h
int24 foo(int x, int y) {
int tmp;
tmp = (x * y);
return tmp
}
こ の コ ー ド が合成 さ れ る と 、 出力が 24 ビ ッ ト に切 り 捨て ら れた 32 ビ ッ ト 乗算器にな り ます。
例 3-39 の よ う に入力のサ イ ズが正 し く 12 ビ ッ ト 型 (int12) にな っ ていれば、 最終 RTL では 24 ビ ッ ト 乗算器が使用 さ
れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
199
C の合成
#include ap_cint.h
typedef int12 din_t;
typedef int24 dout_t;
dout_t func_sized(din_t x, din_t y) {
int tmp;
tmp = (x * y);
return tmp
}
例 3‐39 : サ イ ズの正 し い関数引数
2 つの関数入力に任意精度型を使用す る だけで、Vivado HLS では 24 ビ ッ ト 乗算器を使用す る デザ イ ンが作成 さ れ、12
ビ ッ ト 型がデザ イ ンに伝搬 さ れます。 階層内のすべての関数の引数のサ イ ズ を正 し く 記述す る こ と をお勧め し ます。
通常は、 変数が関数 イ ン タ ーフ ェ イ ス か ら 、 特に最上位関数 イ ン タ ーフ ェ イ ス か ら 直接駆動 さ れ る と 、 最適化の中に
実行 さ れない も のがでて く る こ と があ り ます。 典型的な例は、 入力がループ イ ンデ ッ ク ス の上位制限 と し て使用 さ れ
る 場合です。
ループ
ループはアルゴ リ ズ ムの動作を示す簡単な方法で、 C コ ー ド で よ く 使用 さ れます。 ループは合成でサポー ト さ れ、 パ
イ プ ラ イ ン化、 展開、 部分展開、 統合、 平坦化で き ます。
最適化の展開、 部分展開、 平坦化、 統合に よ り 、 コ ー ド を変更 し たかの よ う にループ構造を効率的に変更で き る ので、
ループの最適化に必要な コ ー ド 変更を最小限に抑え る こ と がで き ます。 ただ し 、 特定の状況に し か適用で き ない最適
化 も あ り 、 そのために コ ー ド を変更す る 必要のあ る こ と も あ り ます。
推奨 : ループ イ ンデ ッ ク ス変数にグ ロ ーバル変数を使用す る と 、 実行 さ れない最適化があ る ため、 使用 し ないで く だ
さ い。
可変ループ境界
Vivado HLS で適用で き る 最適化の中には、 ループに可変境界があ る と 実行 さ れない も のがあ り ま す。 例 3-40 では、
ループ境界が可変幅で決定 さ れ、 最上位入力か ら 駆動 さ れます。 こ の例の場合、 Vivado HLS ではループがいつ終了す
る のか判断で き ないので、 ループには可変境界があ る と 考え ら れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
200
C の合成
#include ap_cint.h
#define N 32
typedef int8 din_t;
typedef int13 dout_t;
typedef uint5 dsel_t;
dout_t code028(din_t A[N], dsel_t width) {
dout_t out_accum=0;
dsel_t x;
LOOP_X:for (x=0;x<width; x++) {
out_accum += A[x];
}
return out_accum;
}
例 3‐40 : 可変ルー プ境界
例 3-40 のデザ イ ン を最適化 し よ う と す る と 、 可変ループ境界に よ る 問題がわか り ます。
可変ループ境界に関す る 最初の問題は、 Vivado HLS でループの レ イ テ ン シが決定で き な く な る 点です。 Vivado HLS
はループの一巡目が終了す る ま での レ イ テ ン シは決定で き ますが、 可変幅の正確な値は ス タ テ ィ ッ ク に決定で き ない
ので、 何度繰 り 返 さ れ る のかは判断で き ず、 ループ レ イ テ ン シ (ループの繰 り 返 し すべて を完全に実行す る ま でのサ
イ ク ル数) はレ ポー ト で き ません。
可変ループ境界があれば、 Vivado HLS ではその レ イ テ ン シが正確な値ではな く 、 疑問符 (?) で レ ポー ト さ れます。 次
は、 例 3-40 の合成後の結果を示 し てい ます。
+ Summary of overall latency (clock cycles):
* Best-case latency:
?
* Average-case latency:?
* Worst-case latency:
?
+ Summary of loop latency (clock cycles):
+ LOOP_X:
* Trip count:?
* Latency:
?
こ の よ う に、 可変ループ境界の最初の問題は、 デザ イ ンのパフ ォーマ ン ス が未知にな る と い う 点にあ り ます。
こ の問題は次の 2 つの方法で回避で き ます。
•
tripcout 指示子を使用 し ます。 こ の方法の詳細は、 次に説明 し ます。
•
C コ ー ド で assert マ ク ロ を コ ー ド 内で使用 し ます (213 ページの 「assert の使用」 )。
tripcount 指示子を使用す る と 、 ループに指定す る 最小、 平均、 最大の tripcount を指定で き ま す。 tripcount は
ループの繰 り 返 し 回数を意味 し ます。例 3-40 の よ う に最大の tripcount の 32 が LOOP_X に適用 さ れ る と 、 レ ポー ト は
次の よ う にア ッ プデー ト さ れます。
+ Summary of overall latency (clock cycles):
* Best-case latency:
2
* Average-case latency:18
* Worst-case latency:
34
+ Summary of loop latency (clock cycles):
+ LOOP_X:
* Trip count:0 ~ 32
* Latency:
0 ~ 32
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
201
C の合成
tripcount 指示子を使用 し て も 、 合成結果には影響はあ り ま せん。 tripcount 指示子に対 し てユーザーが指定 し た値は、
レ ポー ト にのみ使用 さ れ ます。 tripcount の値は Vivado HLS で数が レ ポー ト さ れ る よ う にす る だけですが、 さ ま ざ ま
な ソ リ ュ ーシ ョ ン か ら の レ ポー ト を比較す る こ と がで き ま す。 こ の同 じ ループ境界情報を合成に使用す る には、 C
コ ー ド を ア ッ プデー ト す る 必要があ り ます。 詳細は、 213 ページの 「assert の使用」 を参照 し て く だ さ い。
tripcount 指示子を使用 し て も 、 合成結果には影響あ り ません。
次は、 よ り 低い開始間隔の 例 3-40 を最適化する 手順を示 し てい ます。
•
ループ を展開 し 、 並列累算が行われ る よ う に し ます。
•
ア レ イ 入力をパーテ ィ シ ョ ン し ない と 、 並列累算が
1 つの メ モ リ ポー ト に制限 さ れます。
こ れ ら の最適化が適用 さ れ る と 、 Vivado HLS で可変境界ループに関す る 最大の問題を示す メ ッ セージが表示 さ れ ま
す。
@W [XFORM-503] Cannot unroll loop 'LOOP_X' in function 'code028': cannot completely
unroll a loop with a variable trip count.
可変境界ループは展開で き ないので、 unroll 指示子が適用で き ないだけでな く 、 そのループの上の レベルのパ イ プ ラ
イ ン処理 も で き ません。
重要 : ループ ま たは関数がパ イ プ ラ イ ン処理 さ れ る と 、 Vivado HLS はその関数 ま たはループの下の階層ですべての
ループ を展開 し ます。 こ の階層に可変境界を含むループがあ る と 、 パ イ プ ラ イ ン処理はで き ません。
こ の問題は、 ループ内で条件付 き 実行を使用 し 、 ループの繰 り 返 し 回数を固定値にす る と 回避で き ます。 例 3-40 の
コ ー ド は、 例 3-41 の よ う に書 き 直す こ と がで き ま す。 こ の例では、 ループ境界は可変幅の最大値に設定 さ れ、 ルー
プ本体は条件付 き で実行 さ れます。
#include ap_cint.h
#define N 32
typedef int8 din_t;
typedef int13 dout_t;
typedef uint5 dsel_t;
dout_t loop_max_bounds(din_t A[N], dsel_t width) {
dout_t out_accum=0;
dsel_t x;
LOOP_X:for (x=0;x<N-1; x++) {
if (x<width) {
out_accum += A[x];
}
}
return out_accum;
}
例 3‐41 : 可変ルー プ境界 ( 修正後 )
例 3-41for-loop (LOOP_X) は、 展開で き ます。 こ れは、 ループに上位境界があ り 、 Vivado HLS でハー ド ウ ェ アが どれ
く ら い作成 さ れ る か認識 さ れ る か ら です。 RTL デザ イ ン のループ本体には N(32) コ ピーがあ り ます。 こ のループ本
体の各 コ ピーには、 それに関す る 条件付 き ロ ジ ッ ク が含まれ、 可変幅の値に よ っ て実行 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
202
C の合成
ループのパイ プ ラ イ ン処理
ループ をパ イ プ ラ イ ン処理す る 際は、 通常一番内部のループ をパ イ プ ラ イ ン処理する と 、 エ リ ア と パフ ォーマ ン ス の
最適なバ ラ ン ス がわか り ます。 こ れに よ り 、 ラ ン タ イ ム も 最速にな り ます。 例 3-42 の コ ー ド は、 ループお よ び関数
をパ イ プ ラ イ ン処理 し た場合の ト レー ド オ フ を示 し てい ます。
#include loop_pipeline.h
dout_t loop_pipeline(din_t A[N]) {
int i,j;
static dout_t acc;
LOOP_I:for(i=0; i < 20; i++){
LOOP_J: for(j=0; j < 20; j++){
acc += A[i] * j;
}
}
return acc;
}
例 3‐42 : ルー プのパ イ プ ラ イ ン
一番内側のループ (LOOP_J) がパ イ プ ラ イ ン処理 さ れ る と 、 ハー ド ウ ェ アには LOOP_J の コ ピーが 1 つ (乗算器 1 つ)
で き 、 Vivado HLS はその外側のループ (LOOP_I) を使用 し て LOOP_J に新 し いデー タ を提供 し ます。 乗算器演算 1 つ
と ア レ イ ア ク セ ス 1 回のみを ス ケ ジ ュ ールする 必要があ り ます。 こ れ ら を ス ケ ジ ュ ール し てお く と 、 ループの繰 り 返
し は 1 つのループ本体のエン テ ィ テ ィ (20X20 のループ繰 り 返 し ) と し て ス ケ ジ ュ ールで き ます。
ヒ ン ト : ループ ま たは関数がパ イ プ ラ イ ン処理 さ れ る 場合は、 そのループ ま たは関数の下の階層にあ る ループ を展開
す る 必要があ り ます。
外側のループ (LOOP_I) がパ イ プ ラ イ ン処理 さ れ る と 、 内部のループ (LOOP_J) が展開 さ れ、 そのループの本体の コ
ピーが 20 個作成 さ れます。 こ のため、乗算器 20 個 と ア レ イ ア ク セ ス 20 回を ス ケ ジ ュ ールする 必要があ り ます。 こ
れで LOOP_I の各繰 り 返 し を 1 つのエン テ ィ テ ィ と し て ス ケ ジ ュ ールで き る よ う にな り ます。
最上位関数がパ イ プ ラ イ ン処理 さ れ る 場合は、 ど ち ら のループ も 展開す る 必要があ り ます。 こ のため、 乗算器 400 個
と ア レ イ ア ク セ ス 400 回を ス ケ ジ ュ ールす る 必要があ り ます。 ただ し 、 Vivado HLS で 400 個の乗算器が作成 さ れ る
こ と はほぼあ り ません。 こ れは、 ほ と ん ど のデザ イ ンで、 デー タ 依存性のために最大の並列処理がで き ない こ と が よ
く あ る か ら です。 た と えば、 こ の例の場合、 デ ュ アル ポー ト RAM が A[N] に使用 さ れて も 、 デザ イ ンは ク ロ ッ ク サ
イ ク ルの A[N] の 2 つの値に し かア ク セ ス で き ません。
パ イ プ ラ イ ン処理す る 階層レベルを選択す る と 、 た と えば一番内側のループ をパ イ プ ラ イ ン処理 し た と き に、 ほ と ん
ど のアプ リ ケーシ ョ ンで一般的に許容 さ れ る スループ ッ ト で最小のハー ド ウ ェ アが提供 さ れます。 階層の上位をパ イ
プ ラ イ ン処理す る と 、 すべての下位ループが展開 さ れ る ので、 ス ケ ジ ュ ールす る ために さ ら に多 く の演算が作成 さ れ
ますが ( ラ ン タ イ ム と メ モ リ 容量に影響する 可能性あ り )、 スループ ッ ト と レ イ テ ン シの観点か ら 、 通常はパフ ォーマ
ン ス の最 も 高いデザ イ ンにな り ます。
上記のオプシ ョ ン を ま と め る と 、 次の よ う にな り ます。
•
LOOP_J のパ イ プ ラ イ ン :
レ イ テ ン シは約 400 サ イ ク ル (20X20) にな り 、100 個未満の LUT お よ びレ ジ ス タ が必要にな り ます (I/O 制御お よ
び FSM は常にあ り ます)。
•
LOOP_I のパ イ プ ラ イ ン :
レ イ テ ン シは約 20 サ イ ク ルにな り ますが、 数百個の LUT お よ びレ ジ ス タ が必要にな り ます。 ロ ジ ッ ク 数は、 最
初のオプシ ョ ンの約 20 倍の数か ら ロ ジ ッ ク 最適化で処理 さ れ る ロ ジ ッ ク を引いた数にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
203
C の合成
•
パ イ プ ラ イ ン関数 loop_pipeline
レ イ テ ン シは約 10 個 (デ ュ アル ポー ト ア ク セ ス 20 回) にな り ますが、何千個 も の LUT お よ びレ ジ ス タ が必要 と
な り ます。 ロ ジ ッ ク 数は最初のオプシ ョ ンの約 400 倍か ら ロ ジ ッ ク 最適化で処理 さ れ る ロ ジ ッ ク を引いた数にな
り ます。
不完全なネス ト ループ
一番内側のループ階層がパ イ プ ラ イ ン処理 さ れ る と 、 Vivado HLS はネ ス ト さ れた (入れ子にな っ た) ループ を フ ラ ッ
ト に し て、 ループの遷移 (ループの入出時にループ イ ンデ ッ ク ス で実行 さ れ る チ ェ ッ ク ) に よ っ て発生 し たサ イ ク ル
を削除す る こ と で、 レ イ テ ン シ を削減 し て スループ ッ ト 全体を改善 し ます。 こ の よ う なチ ェ ッ ク は、 1 つのループか
ら 次のループへの遷移の際に ク ロ ッ ク 遅延を発生 さ せます。 例 3-42 の よ う に一番内側のループ をパ イ プ ラ イ ン処理
す る と 、 Vivado HLS で次の よ う な メ ッ セージが表示 さ れます。
@I [XFORM-541] Flattening a loop nest 'LOOP_I' in function 'loop_pipeline'.
ネ ス ト ループは、 ループが完全ま たは半完全であ る 場合にのみフ ラ ッ ト にで き ます。
•
•
完全ループ
°
一番内側のループにのみ本体が含まれます。
°
ループ文間に指定 さ れ る ロ ジ ッ ク はあ り ません。
°
ループ境界は定数です。
半完全ループ
°
一番内側のループにのみ本体が含まれます。
°
ループ文間に指定 さ れ る ロ ジ ッ ク はあ り ません。
°
一番外側のループは可変にで き ます。
例 3-43 は、 ループ ネ ス ト が不完全な例を示 し てい ます。
#include loop_imperfect.h
void loop_imperfect(din_t A[N], dout_t B[N]) {
int i,j;
dint_t acc;
LOOP_I:for(i=0; i < 20; i++){
acc = 0;
LOOP_J: for(j=0; j < 20; j++){
acc += A[i] * j;
}
B[i] = acc / 20;
}
}
例 3‐43 : 不完全な ネ ス ト ルー プ
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
204
C の合成
LOOP_I 内 (LOOP_J 外側) の acc お よ びア レ イ B[N] への代入があ る と 、ループが フ ラ ッ ト にな ら ない よ う にで き ま
す。 例 3-43 の LOOP_J がパ イ プ ラ イ ン処理 さ れ る と 、 合成レ ポー ト には次の よ う に表示 さ れます。
+ Summary of loop latency (clock cycles):
+ LOOP_I:
* Trip count:20
* Latency:
480
+ LOOP_J:
* Trip count:
20
* Latency:
21
* Pipeline II:
1
* Pipeline depth:2
•
パ イ プ ラ イ ンの深 さ に よ り 、 LOOP_J を 1 回反復す る のに 2 ク ロ ッ ク かか る のがわか り ます。 こ れはデバ イ ス テ
ク ノ ロ ジお よ び ク ロ ッ ク 周期に よ っ て異な り ます。
•
新 し い反復は、 各 ク ロ ッ ク サ イ ク ルご と に開始で き ます。 Pipeline II は 1 です。 II はループ本体の各新規実行間
のサ イ ク ルを示す開始間隔の こ と です。
•
最初の反復が結果を出力す る ま でに 2 サ イ ク ルかか り ます。 パ イ プ ラ イ ン処理のため、 続 く 反復実行は前の反復
を使用 し て平行に実行 さ れ、 1 ク ロ ッ ク 後に値を出力 し ます。 ループの レ イ テ ン シの合計は、 2 + 残 り の 19 回の
反復ご と に 1 で、 21 にな り ます。
•
LOOP_I は 20 反復を実行す る のに 480 ク ロ ッ ク を必要 と す る ので、 LOOP_I の各反復は 24 ク ロ ッ ク サ イ ク ルで
す。 つま り 、 LOOP_J への入出には 3 サ イ ク ルのオーバーヘ ッ ド があ り ます (24 – 21 = 3)。
不完全なループ ネ ス ト の場合、 ま たはループ を フ ラ ッ ト にで き ない場合、 ループの入出のために ク ロ ッ ク サ イ ク ル
が追加 さ れ ます。 例 3-43 の コ ー ド は、 ネ ス ト さ れたループ を完全に し 、 フ ラ ッ ト にで き る よ う にす る ために記述 し
直す こ と がで き ます。
例 3-44 は、 例 3-43 と 同 じ 機能ですが、 ループが フ ラ ッ ト にで き る よ う に、 条件文を LOOP_J ループに追加 し た と こ
ろ を示 し てい ます。
#include loop_perfect.h
void loop_perfect(din_t A[N], dout_t B[N]) {
int i,j;
dint_t acc;
LOOP_I:for(i=0; i < 20; i++){
LOOP_J: for(j=0; j < 20; j++){
if(j==0) acc = 0;
acc += A[i] * j;
if(j==19) B[i] = acc / 20;
}
}
}
例 3‐44 : 完全な ネ ス ト ルー プ
例 3-44 が合成 さ れ る と 、 こ のループはフ ラ ッ ト にな り ます。
@I [XFORM-541] Flattening a loop nest 'LOOP_I' in function 'loop_perfect'.
合成レ ポー ト には、 レ イ テ ン シの改善が示 さ れます。
+ Summary of loop latency (clock cycles):
+ LOOP_I_LOOP_J:
* Trip count:
400
* Latency:
401
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
205
C の合成
* Pipeline II:
1
* Pipeline depth:2
デザ イ ン にネ ス ト ループが含ま れ る 場合は、 結果を解析 し て、 な る べ く 多 く のループが フ ラ ッ ト にな る よ う に し ま
す。 ロ グ フ ァ イ ル ま たは上記の よ う な合成 レ ポー ト で、 ループ ラ ベルが統合 さ れた か ど う か を 確認 し て く だ さ い
(LOOP_I お よ び LOOP_J は LOOP_I_LOOP_J と し て レ ポー ト さ れ る よ う にな り ます)。
ループの並列処理
Vivado HLS では、 レ イ テ ン シ を削減す る ために、 ロ ジ ッ ク お よ び関数がで き る だけ早い段階で ス ケ ジ ュ ール さ れ ま
す。 こ れを実行す る ため、 な る べ く 多 く の ロ ジ ッ ク 演算お よ び関数が並列に ス ケ ジ ュ ール さ れますが、 ループ を並列
に実行す る こ と はで き ません。
例 3-45 が合成 さ れ る と 、 SUM_X ループが ス ケ ジ ュ ール さ れ、 その後 SUM_Y ループが ス ケ ジ ュ ール さ れます。 SUM_Y
ループの開始は SUM_X ループの完了を待つ必要がな く て も 、 SUM_X の後に ス ケ ジ ュ ール さ れます。
#include loop_sequential.h
void loop_sequential(din_t A[N], din_t B[N], dout_t X[N], dout_t Y[N],
dsel_t xlimit, dsel_t ylimit) {
dout_t X_accum=0;
dout_t Y_accum=0;
int i,j;
SUM_X:for (i=0;i<xlimit; i++) {
X_accum += A[i];
X[i] = X_accum;
}
SUM_Y:for (i=0;i<ylimit; i++) {
Y_accum += B[i];
Y[i] = Y_accum;
}
}
例 3‐45 : シ ーケ ン シ ャ ル ルー プ
こ れ ら のループには異な る 境界 (xlimit お よ び ylimit) があ る ため、 統合はで き ません。 例 3-46 の よ う にループ を
別の関数に含め る と 、 ま っ た く 同 じ 機能を達成で き 、 ど ち ら のループ も 処理で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
206
C の合成
#include loop_functions.h
void sub_func(din_t I[N], dout_t O[N], dsel_t limit) {
int i;
dout_t accum=0;
SUM:for (i=0;i<limit; i++) {
accum += I[i];
O[i] = accum;
}
}
void loop_functions(din_t A[N], din_t B[N], dout_t X[N], dout_t Y[N],
dsel_t xlimit, dsel_t ylimit) {
dout_t X_accum=0;
dout_t Y_accum=0;
int i,j;
sub_func(A,X,xlimit);
sub_func(B,Y,ylimit);
}
例 3‐46 : 関数 と し てのシーケ ン シ ャ ル ルー プ
例 3-46 が合成 さ れ る と 、 レ イ テ ン シは 例 3-45 の半分にな り ます。 こ れは、 ループが関数 と し て並列に実行で き る よ
う にな っ たか ら です。
例 3-45 には、 dataflow 最適化 も 使用で き ま す。 こ こ に示す並列処理の た め、 関数にループ を 取 り 込む方法は、
dataflow 最適化が使用で き ない場合に使用 し ます。 た と えば、 よ り 大型のデザ イ ン例では、 dataflow 最適化を最
上位のすべてのループ/関数、 お よ び各最上位ループお よ び関数間に配置 さ れた メ モ リ に適用で き ます。
ループ依存性
ループ依存性は、 ループ を最適化 さ れない よ う に (通常はパ イ プ ラ イ ン処理) す る デー タ 依存性の こ と です。 こ れ ら
は、 ループの 1 回の反復内ま たはループ内の異な る 反復間にで き ます。
ループ依存性を理解す る には、 極端な例を見てみ る のが簡単です。 次の例では、 ループの結果がそのループの継続/終
了条件 と し て使用 さ れてい ます。 ループの各反復は次のループが開始で き る 状態にな る 前に終了 し てい る 必要があ り
ます。
Minim_Loop: while (a != b) {
if (a > b)
a -= b;
else
b -= a;
}
例 3‐47 : コ ー ド 例
こ の場合、 ループはパ イ プ ラ イ ン処理で き ません。 ループの次の反復は前の反復が終了す る ま で開始で き ないか ら で
す。
すべてのループ依存性が こ の よ う に極端なわけではあ り ませんが、 ほかの演算が終了す る ま で開始で き ない演算があ
る こ と に注意 し て く だ さ い。ソ リ ュ ーシ ョ ン と し ては、最初の演算がで き る だけ早い段階で実行 さ れ る よ う に し ます。
ループ依存性はすべてのデー タ 型で発生す る 可能性はあ り ますが、 特にア レ イ を使用する 場合に よ く 発生 し ます。 こ
れについては、 次の 「ア レ イ 」 セ ク シ ョ ンで説明 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
207
C の合成
アレイ
コ ー ド 形式に よ っ て合成後のア レ イ の イ ン プ リ メ ン テーシ ョ ン が ど の よ う に変わ る かについて説明す る 前に、 C シ
ミ ュ レーシ ョ ン な ど合成が実行 さ れ る 前に発生す る 可能性のあ る 問題について説明 し ます。
次の よ う にかな り 大 き なア レ イ が指定 さ れ る 場合は、 C シ ミ ュ レーシ ョ ン で メ モ リ 不足に よ り エ ラ ーにな る 可能性が
あ り ます。 こ の例は、 合成用の関数は示 さ ず、 大き な ア レ イ と 任意精度型の大き な ア レ イ が ラ ン タ イ ム メ モ リ に ど の
よ う に影響を与え る か を示 し てい ます。
#include ap_cint.h
int main() {
int i, acc;
// Use an arbitrary precision type
int32 la0[10000000], la1[10000000];
for (i=0 ; i < 10000000; i++) {
acc = acc + la0[i] + la1[i];
}
return 0;
}
例 3‐48 : コ ー ド 例
シ ミ ュ レーシ ョ ンは メ モ リ 不足でエ ラ ーにな る こ と があ り ます。 こ れは、 メ モ リ に存在す る ス タ ッ ク にア レ イ が配置
さ れ、 OS で管理 さ れて ロ ーカル デ ィ ス ク 空間を使用する ヒ ープには配置 さ れないためです。
こ れに よ り 、デザ イ ンが実行す る と メ モ リ 不足にな り 、次の よ う に、状況に よ っ ては問題が悪化す る こ と も あ り ます。
•
PC では使用可能な メ モ リ が大型の Linux ボ ッ ク ス よ り も 少ない こ と が よ く あ り 、 使用可能な メ モ リ が少ない こ
と があ り ます。
•
任意精度型を使用す る と 、 標準 C 型 よ り も 多 く の メ モ リ が必要にな る ので、 こ の問題が悪化す る 可能性があ り ま
す。
•
C++ お よ び SystemC の よ り 複雑な固定小数点任意精度型を使用す る と 、 さ ら に多 く の メ モ リ が必要 と な る ので、
問題が悪化す る 可能性があ り ます。
次の例の よ う に、 シ ミ ュ レーシ ョ ンにはダ イ ナ ミ ッ ク メ モ リ 割 り 当て を、 合成には固定サ イ ズのア レ イ を使用 し て、
問題を回避 し て く だ さ い。 こ の場合、 こ 必要な メ モ リ は ヒ ープに割 り 当て ら れ、OS で管理 さ れ る ので、 ロ ーカル デ ィ
ス ク 空間が使用で き る よ う にな り ます。
こ の よ う な コ ー ド への変更は、 シ ミ ュ レーシ ョ ン さ れ る コ ー ド と 合成 さ れ る コ ー ド が異な っ て し ま う ため、 理想的で
はあ り ませんが、 デザ イ ン を実行す る には こ れ し か方法がない場合があ り ます。 こ れを実行 し た場合は、 C テ ス ト ベ
ンチで こ のア レ イ にア ク セ スす る すべての点が記述 さ れ る よ う に し て く だ さ い。 こ れに よ り 、 cosim_design で実
行 さ れ る RTL シ ミ ュ レーシ ョ ン で メ モ リ ア ク セ ス が正 し いか ど う かが検証 さ れ る よ う にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
208
C の合成
#include ap_cint.h
int main() {
int i, acc;
#ifdef __SYNTHESIS__
// Use an arbitrary precision type & array for synthesis
int32 la0[10000000], la1[10000000];
#else
// Use an arbitrary precision type & dynamic memory for simulation
int32 la0 = malloc(10000000 * sizeof(int32));
int32 la1 = malloc(10000000 * sizeof(int32));
#endif
for (i=0 ; i < 10000000; i++) {
acc = acc + la0[i] + la1[i];
}
return 0;
}
例 3‐49 : コ ー ド 例
ア レ イ は、 通常合成後に メ モ リ (RAM、 ROM、 ま たは FIFO) と し て イ ン プ リ メ ン ト さ れ ま す。 177 ページ の 「 イ ン
タ ーフ ェ イ ス のア レ イ 」 に記述 し た よ う に、 最上位関数 イ ン タ ーフ ェ イ ス のア レ イ は メ モ リ 外部にア ク セ スする RTL
ポ ー ト と し て 合成 さ れ ま す。 デザ イ ン に対 し て 内部に あ る ア レ イ は、 最適化設定に よ っ て 内部ブ ロ ッ ク RAM、
LUTRAM ま たは レ ジ ス タ と し て合成 さ れます。
ループ と 同様、 ア レ イ も 簡単な コ ー ド 構文なので、 C プ ロ グ ラ ムで よ く 使用 さ れます。 ま た、 ループの よ う に、 Vivado
HLS には多 く の最適化が含ま れ、 コ ー ド を修正 し な く て も RTL の イ ン プ リ メ ン テーシ ョ ン を最適化す る ための指示
子が含まれます。
ア レ イ に よ り RTL で問題 と な る のは、 次の よ う な場合です。
•
ア レ イ ア ク セ ス がパフ ォーマ ン ス の障害 と な っ て し ま う こ と が よ く あ り ます。メ モ リ と し て イ ンプ リ メ ン ト さ れ
る と 、 メ モ リ ポー ト の数に よ り デー タ へのア ク セ ス が制限 さ れます。
•
ア レ イ 初期化は、 注意 し て実行 し ない と 、 RTL での リ セ ッ ト お よ び初期化が不必要に長 く な っ て し ま う こ と があ
り ます。
•
読み出 し ア ク セ ス のみを必要 と す る ア レ イ は、 RTL では ROM と し て イ ンプ リ メ ン ト さ れ る よ う にす る 必要があ
り ます。
Vivado HLS では、 ポ イ ン タ ーのア レ イ がサポー ト さ れます。 詳細は、 191 ページの 「ポ イ ン タ ー」 を参照 し て く だ さ
い。 各ポ イ ン タ ーは、 ス カ ラ ーま たは ス カ ラ ーのア レ イ のみを指定で き ます。
注記 : ア レ イ はサ イ ズ指定す る 必要があ り ます。
サポー ト さ れ る 例 : Array[10];
サポー ト さ れない例 : Array[];
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
209
C の合成
ア レ イ ア ク セス
例 3-50 の コ ー ド では、 ア レ イ へのア ク セ ス に よ り 最終 RTL デザ イ ン でパフ ォーマ ン ス が制限 さ れ ます。 mem[N] ア
レ イ へのア ク セ ス が 3 回あ り 、 合計結果が作成 さ れてい ます。
#include array_mem_bottleneck.h
dout_t array_mem_bottleneck(din_t mem[N]) {
dout_t sum=0;
int i;
SUM_LOOP:for(i=2;i<N;++i)
sum += mem[i] + mem[i-1] + mem[i-2];
return sum;
}
例 3‐50 : ア レ イ と メ モ リ の障害
合成中、 ア レ イ は RAM と し て イ ン プ リ メ ン ト さ れ ま す。 RAM がシ ン グル ポー ト RAM と し てい指定 さ れ る 場合、
SUM_LOOP ループ をパ イ プ ラ イ ン処理 し て、 各 ク ロ ッ ク サ イ ク ルご と に新規ループ反復を処理で き ます。
SUM_LOOP を初期間隔 1 でパ イ プ ラ イ ン処理 し よ う と す る と 、 次の よ う な メ ッ セージが表示 さ れます (スループ ッ ト
1 が達成で き なか っ たために、 Vivado HLS は制約を解除 し ます)。
@I [SCHED-61] Pipelining loop 'SUM_LOOP'.
@W [SCHED-69] Unable to schedule 'load' operation ('mem_load_1',
array_mem_bottleneck.c:54) on array 'mem' due to limited resources (II = 1).
@W [SCHED-69] Unable to schedule 'load' operation ('mem_load_2',
array_mem_bottleneck.c:54) on array 'mem' due to limited resources (II = 2).
@I [SCHED-61] Pipelining result:Target II:1, Final II:3, Depth:4.
こ こ での問題は、 シ ン グル ポー ト RAM にはシ ン グル デー タ ポー ト し かないので、 各 ク ロ ッ ク サ イ ク ルで 1 つの読
み出 し (お よ び 1 つの書 き 込み) が実行で き る 点にあ り ます。
•
SUM_LOOP サ イ ク ル1 : read mem[i];
•
SUM_LOOP サ イ ク ル 2 : read mem[i-1], sum values;
•
SUM_LOOP サ イ ク ル 3 : read mem[i-1], sum values;
デ ュ アル ポー ト RAM も 使用で き ますが、 ク ロ ッ ク サ イ ク ルご と に 2 つのア ク セ ス し か許容 さ れません。合計値を計
算す る のに 3 つの読み出 し が必要なので、ク ロ ッ ク サ イ ク ルご と に新 し い反復でループ をパ イ プ ラ イ ン処理す る ため
には、 ク ロ ッ ク サ イ ク ルご と に 3 つのア ク セ ス が必要にな り ます。
注意 : メ モ リ ま たは メ モ リ ポー ト と し て イ ンプ リ メ ン ト さ れ る ア レ イ は、パフ ォーマ ン ス の障害 と な る こ と が よ く あ
り ます。
例 3-50 を スループ ッ ト 1 でパ イ プ ラ イ ンがで き る よ う に変更する と 、 例 3-51 の コ ー ド にな り ます。 例 3-51 では、 先
行読み出 し を実行 し て、 デー タ ア ク セ ス を手動でパ イ プ ラ イ ン処理す る こ と で、 ループの各反復で指定 さ れ る ア レ イ
読み出 し が 1 回だけにな っ てい ます。 こ れに よ り 、 パフ ォーマ ン ス を達成する ためには、 シ ン グル ポー ト RAM だけ
が必要 と な り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
210
C の合成
#include array_mem_perform.h
dout_t array_mem_perform(din_t mem[N]) {
din_t tmp0, tmp1, tmp2;
dout_t sum=0;
int i;
tmp0 = mem[0];
tmp1 = mem[1];
SUM_LOOP:for (i = 2; i < N; i++) {
tmp2 = mem[i];
sum += tmp2 + tmp1 + tmp0;
tmp0 = tmp1;
tmp1 = tmp2;
}
return sum;
}
例 3‐51 : パ フ ォ ーマ ン ス ア ク セ ス を 使用 し た ア レ イ と メ モ リ
Vivado HLS には、 ア レ イ の イ ンプ リ メ ン ト お よ びア ク セ ス方法を変更で き る 最適化指示子が多 く あ り ます。 通常、 こ
の よ う な指示子が使用 さ れ る 場合、 コ ー ド を変更す る 必要はあ り ません。 ア レ イ は、 ブ ロ ッ ク ま たは個別エ レ メ ン ト
にパーテ ィ シ ョ ン で き ます。 Vivado HLS でア レ イ が個別エ レ メ ン ト にパーテ ィ シ ョ ン さ れ る こ と も あ り ま す。 こ れ
は、 自動パーテ ィ シ ョ ンの コ ン フ ィ ギ ュ レーシ ョ ン設定を使用す る と 指定で き ます。
ア レ イ が複数のブ ロ ッ ク にパーテ ィ シ ョ ン さ れ る と 、 1 つのア レ イ は複数の RTL RAM ブ ロ ッ ク と し て イ ンプ リ メ ン
ト さ れ ます。 エ レ メ ン ト にパーテ ィ シ ョ ン さ れ る 場合、 各エ レ メ ン ト は RTL で レ ジ ス タ と し て イ ン プ リ メ ン ト さ れ
ます。 ど ち ら の場合 も 、 パーテ ィ シ ョ ン で さ ら に多 く のエ レ メ ン ト が並列にア ク セ ス で き る よ う にな り 、 パフ ォーマ
ン ス が向上 し ます。 デザ イ ンの ト レー ド オ フは、 パフ ォ ーマ ン ス と それを達成す る ために必要な RAM ま たは レ ジ ス
タ の数です。
FIFO ア ク セス
ア レ イ ア ク セ ス に特に注意が必要な のは、 ア レ イ が FIFO と し て イ ン プ リ メ ン ト さ れ る 場合です。 よ く あ る のは、
dataflow 最適化を使用す る 場合です。
FIFO へのア ク セ ス は、 位置 0 か ら 開始 し て シーケ ン シ ャ ルな順番であ る 必要があ り ます。 ま た、 ア レ イ が複数位置
で読み出 さ れ る 場合、 コ ー ド では FIFO ア ク セ ス の順番を厳 し く 指定す る 必要があ り ます。 複数フ ァ ン ア ウ ト を含む
ア レ イ は、 ア ク セ ス の順番を指定す る コ ー ド を追加 し ない と 、 FIFO と し て イ ン プ リ メ ン ト で き ない こ と が よ く あ り
ます。
ア レ イの初期化
推奨 : 189 ページの 「型修飾子」 で示す と お り 、 必須ではあ り ませんが、 static 修飾子を使用 し て メ モ リ と し て イ ンプ
リ メ ン ト さ れ る ア レ イ を指定す る こ と をお勧め し ます。 こ れに よ り 、 Vivado HLS で RTL の メ モ リ を使用 し て ア レ イ
を イ ンプ リ メ ン ト で き る よ う にな る ほか、 static 型の初期化動作を使用で き る よ う にな り ます。
次の コ ー ド 例では、 ア レ イ は値のセ ッ ト を使用 し て初期化 さ れます。 関数が実行 さ れ る たびに、 coeff ア レ イ に こ れ
ら の値が代入 さ れます。 合成後、 coeff を イ ンプ リ メ ン ト す る RAM が実行 さ れ る たびに、 こ れ ら の値が読み込まれ
ます。 シ ン グル ポー ト RAM の場合は、 8 ク ロ ッ ク サ イ ク ルかか り ます。 1024 のア レ イ の場合、 当然 1024 ク ロ ッ ク
サ イ ク ルかか り ます。 こ の間、 coeff に よ っ ては演算が行われません。
int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8, -2};
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
211
C の合成
次の コ ー ド では、 static 修飾子を使用 し て coeff ア レ イ を定義 し てい ま す。 ア レ イ は実行開始時に指定 し た値で
初期化 さ れ ま す。 関数が実行 さ れ る たびに、 coeff ア レ イ には前の実行か ら の値が記録 さ れ ま す。 C コ ー ド では、
static ア レ イ は メ モ リ が RTL で動作す る よ う に動作 し ます。
static int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8, -2};
ま た、 変数に static 修飾子が含まれ る 場合、 Vivado HLS はRTL デザ イ ンお よ び FPGA ビ ッ ト ス ト リ ームの変数を
初期化 し ます。 こ れに よ り 、 メ モ リ を初期化す る のに複数 ク ロ ッ ク サ イ ク ル も 必要な く な り 、 大容量 メ モ リ の初期化
が使用オーバーヘ ッ ド にな ら な く な り ます。
リ セ ッ ト を適用 し た (デフ ォ ル ト ではない) 後に static 変数がその初期ス テー ト を戻すか ど う かは、 RTL コ ン フ ィ ギ ュ
レーシ ョ ン コ マ ン ド で指定で き ます。 メ モ リ が リ セ ッ ト 後に初期ス テー ト に戻る のであれば、 使用オーバーヘ ッ ド に
な り 、 値を リ セ ッ ト す る のに複数サ イ ク ルが必要 と な り 、 値はそれぞれ各 メ モ リ ア ド レ ス に書 き込まれ る必要があ り
ます。
ROM のイ ン プ リ メ ン ト
例 3-30 に示す よ う に、 Vivado HLS では メ モ リ を合成す る のに static 修飾子、 その メ モ リ を ROM に推論す る のに
const 修飾子を使用 し て ア レ イ を指定す る 必要はあ り ません。 Vivado HLS は、 デザ イ ンの解析を実行 し 、 最 も 最適
なハー ド ウ ェ ア を作成 し よ う と し ますが、
メ モ リ にす る ア レ イ には static 修飾子 を使用す る こ と をお勧め し ま す。 こ れは、 「ア レ イ の初期化」 に示す よ う に、
static 型が RTL の メ モ リ と ほぼ同 じ よ う に動作する ためです。
Vivado HLS では常に ROM がデザ イ ン解析で使用 さ れ る よ う に推論 さ れ る わけではないので、 ア レ イ が読み出 し 専用
の場合は、 const 修飾子 も 推奨 さ れます。 ロ ーカルの static (グ ロ ーバル以外) ア レ イ は読み出 し の前に書 き 込まれ る
必要があ る と い う のが ROM の自動推論の一般的な規則です。 次の例の よ う に指定す る と 、 ROM が推論 さ れやす く
な り ます。
•
ア レ イ を それを使用す る 関数でで き る だけ早い段階で初期化 し ます。
•
書 き 込みを ま と め ます。
•
array(ROM) 初期化書 き 込みを初期化コ ー ド 以外の コ ー ド で イ ン タ ー リ ーブ し ない よ う に し ます。
•
異な る 値を同 じ ア レ イ エ レ メ ン ト に格納 し ない よ う に し ます (書 き 込みはすべて コ ー ド 内で ま と め ます)。
•
エ レ メ ン ト 値の計算は、 初期化ループ カ ウ ン タ ー変数を除いて、 定数以外 ( コ ンパ イ ル時) のデザ イ ン変数に依
存 し ない よ う に し ます。
ROM を初期化す る のに複雑な代入が使用 さ れ る 場合、 た と えば math.h ラ イ ブ ラ リ か ら の関数例では、 ア レ イ 初期
化を別々の関数に配置す る と 、 ROM が推論 さ れ る よ う にで き ます。 例 3-52 では、 sin_table[256] ア レ イ が メ モ
リ と し て推論 さ れ、 RTL 合成後は ROM と し て イ ンプ リ メ ン ト さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
212
C の合成
#include array_ROM_math_init.h
#include <math.h>
void init_sin_table(din1_t sin_table[256])
{
int i;
for (i = 0; i < 256; i++) {
dint_t real_val = sin(M_PI * (dint_t)(i - 128) / 256.0);
sin_table[i] = (din1_t)(32768.0 * real_val);
}
}
dout_t array_ROM_math_init(din1_t inval, din2_t idx)
{
short sin_table[256];
init_sin_table(sin_table);
return (int)inval * (int)sin_table[idx];
}
例 3‐52 : math.h を 使用 し た ROM の初期化
ヒ ン ト : sin() 関数の結果は定数値にな る ので、 sin() 関数を イ ン プ リ メ ン ト す る のに、 RTL デザ イ ン で コ アは必
要あ り ません。 sin() 関数は 表 3-4 に リ ス ト さ れ る コ アの 1 つではないので、 C の合成でサポー ト さ れません (C++
で math.h 関数を使用す る 場合は、 「C++ の合成」 を参照 し て く だ さ い)。
assert の使用
C の assert マ ク ロ は、 範囲情報を アサー ト する のに使用 さ れ る 場合、 合成でサポー ト さ れます。 た と えば、 変数 と ルー
プ境界の上限を指定で き ます。
「ループ反復の制御」 セ ク シ ョ ン で説明 し た よ う に、 可変ループ境界があ る 場合、 高位合成ではそのループの反復す
べての レ イ テ ン シ を決定す る こ と がで き ず、 レ イ テ ン シが ク エ ス チ ョ ン マー ク (?) で表示 さ れます。 tripcount 指示子
はループ境界の高位合成に情報を渡すためには使用で き ますが、 こ の情報はレ ポー ト 目的にのみ使用 さ れ、 合成結果
には影響 し ません (tripcount 指示子の有無に関係な く 同 じ サ イ ズのハー ド ウ ェ アが作成 さ れます)。
次の コ ー ド 例は、 assert を使用 し て高位合成に変数の最大範囲を伝え、 さ ら に適 し たハー ド ウ ェ ア を作成す る ために
ど の よ う に assert を使用す る か を示 し てい ます。
assert を使用す る 前に、 assert マ ク ロ を定義す る ヘ ッ ダー フ ァ イ ルを含め る 必要があ り ます。 こ の例では、 こ れはヘ ッ
ダー フ ァ イ ルに含まれます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
213
C の合成
#ifndef _loop_sequential_assert_H_
#define _loop_sequential_assert_H_
#include <stdio.h>
#include <assert.h>
#include ap_cint.h
#define N 32
typedef int8 din_t;
typedef int13 dout_t;
typedef uint8 dsel_t;
void loop_sequential_assert(din_t A[N], din_t B[N], dout_t X[N], dout_t Y[N], dsel_t
xlimit, dsel_t ylimit);
#endif
例 3‐53 : 可変ルー プ境界 ( 修正後 )
メ イ ン コ ー ド では、 各ループの前に次の 2 つの assert 文を記述 し ます。
assert(xlimit<32);
...
assert(ylimit<16);
...
こ れ ら の assert 文では、 次が実行 さ れます。
•
アサー ト で問題があ っ て、 値が記述 し てい る よ り も 大き い場合、 C シ ミ ュ レーシ ョ ン をエ ラ ーに し ます。 こ れに
よ り 、 C コ ー ド を合成前にシ ミ ュ レーシ ョ ンす る のが重要な こ と も わか り ます。 合成前にデザ イ ンが有効か ど う
か必ず確認 し て く だ さ い。
•
こ の変数の範囲が超過 し ない こ と を高位合成に伝え ます。 こ の値お よ び こ の事実は、 RTL の変数サ イ ズ、 こ の場
合はループの反復回数を最適化す る ために使用で き ます。
例 3-54 は、 こ の コ ー ド を示 し てい ます。
#include loop_sequential_assert.h
void loop_sequential_assert(din_t A[N], din_t B[N], dout_t X[N], dout_t Y[N], dsel_t
xlimit, dsel_t ylimit) {
dout_t X_accum=0;
dout_t Y_accum=0;
int i,j;
assert(xlimit<32);
SUM_X:for (i=0;i<=xlimit; i++) {
X_accum += A[i];
X[i] = X_accum;
}
assert(ylimit<16);
SUM_Y:for (i=0;i<=ylimit; i++) {
Y_accum += B[i];
Y[i] = Y_accum;
}
}
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
214
C の合成
例 3‐54 : 可変ルー プ境界 ( 修正後 )
assert マ ク ロ を除いて、 こ の コ ー ド は例 3-45 と 同 じ ですが、 合成後の合成レ ポー ト で 2 つの相違点があ り ます。
assert マ ク ロ がない場合、 レ ポー ト は次の よ う にな り 、 ループの ト リ ッ プカ ウ ン ト は 1 ~ 256 に変化す る 可能性があ
り ます。 こ れは、 ループ境界の変数が 8 ビ ッ ト 変数の d_sel デー タ 型にな る か ら です。
* Loop Latency:
+----------+-----------+----------+
|Target II |Trip Count |Pipelined |
+----------+-----------+----------+
|- SUM_X
|1 ~ 256
|no
|
|- SUM_Y
|1 ~ 256
|no
|
+----------+-----------+----------+
assert マ ク ロ が使用 さ れ る 場合、 レ ポー ト には SUM_X お よ び SUM_Y ループの ト リ ッ プカ ウ ン ト が 32 お よ び 16 で
あ る こ と が示 さ れます。 assert は 32 お よ び 16 を超え ない値がアサー ト さ れ る ので、 高位合成ではレ ポー ト で こ れが
使用で き ます。
* Loop Latency:
+----------+-----------+----------+
|Target II |Trip Count |Pipelined |
+----------+-----------+----------+
|- SUM_X
|1 ~ 32
|no
|
|- SUM_Y
|1 ~ 16
|no
|
+----------+-----------+----------+
ま た、 tripcount 指示子を使用す る 場合 と 異な り 、 assert 文を使用する と 最適なハー ド ウ ェ ア を提供で き ます。 assert が
ない場合、 最終的なハー ド ウ ェ ア では最大 256 ループ反復にサ イ ズ を合わせた変数お よ びカ ウ ン タ ーが使用 さ れ ま
す。
* Expression:
+----------+------------------------+-------+---+----+
|Operation |Variable Name
|DSP48E |FF |LUT |
+----------+------------------------+-------+---+----+
|+
|X_accum_1_fu_182_p2
|0
|0 |13 |
|+
|Y_accum_1_fu_209_p2
|0
|0 |13 |
|+
|indvar_next6_fu_158_p2 |0
|0 |9
|
|+
|indvar_next_fu_194_p2
|0
|0 |9
|
|+
|tmp1_fu_172_p2
|0
|0 |9
|
|+
|tmp_fu_147_p2
|0
|0 |9
|
|icmp
|exitcond1_fu_189_p2
|0
|0 |9
|
|icmp
|exitcond_fu_153_p2
|0
|0 |9
|
+----------+------------------------+-------+---+----+
|Total
|
|0
|0 |80 |
+----------+------------------------+-------+---+----+
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
215
C の合成
変数範囲を アサー ト す る コ ー ド は、 よ り 小型の RTL では可能性のあ る 最大範囲結果 よ り も 小 さ く な り ます。
* Expression:
+----------+------------------------+-------+---+----+
|Operation |Variable Name
|DSP48E |FF |LUT |
+----------+------------------------+-------+---+----+
|+
|X_accum_1_fu_176_p2
|0
|0 |13 |
|+
|Y_accum_1_fu_207_p2
|0
|0 |13 |
|+
|i_2_fu_158_p2
|0
|0 |6
|
|+
|i_3_fu_192_p2
|0
|0 |5
|
|icmp
|tmp_2_fu_153_p2
|0
|0 |7
|
|icmp
|tmp_9_fu_187_p2
|0
|0 |6
|
+----------+------------------------+-------+---+----+
|Total
|
|0
|0 |50 |
+----------+------------------------+-------+---+----+
アサー ト は、 デザ イ ンの変数の範囲を示すために使用で き ます。 アサー ト を使用す る 場合、 すべての可能性のあ る 状
況に適用 さ れ る C シ ミ ュ レーシ ョ ン を実行す る こ と が重要にな り ます。 こ れに よ り 、 高位合成で使用 さ れ る アサー ト
が有効にな り ます。
サポー ト さ れない C コ ン ス ト ラ ク ト
Vivado HLS では、 C 言語が広範囲にわた っ てサポー ト さ れい ますが、 合成がで き ず、 後のデザ イ ン フ ロ ーでエ ラ ー
を発生 さ せ る C コ ン ス ト ラ ク ト も あ り ます。 こ のセ ク シ ョ ンでは、 こ の よ う な関数が合成 さ れ FPGA デバ イ ス に イ ン
プ リ メ ン ト さ れ る 場合の、 コ ー ド 変更が必要な箇所について説明 し ます。
合成す る には、 次が必要です。
•
デザ イ ンのすべての機能を含め る 必要あ り
•
OS へのシ ス テ ム コ ールで実行で き る 機能はな し
•
C コ ン ス ト ラ ク ト が固定サ イ ズ ま たは境界のあ る サ イ ズであ る 必要あ り
•
こ れ ら の コ ン ス ト ラ ク ト の イ ンプ リ メ ン テーシ ョ ンが曖昧ではない必要あ り
シ ス テム コ ール
シ ス テ ム コ ールは、 C プ ロ グ ラ ム を実行 し てい る OS で一部の タ ス ク が実行 さ れ る ので、 合成で き ません。
Vivado HLS は よ く 使用 さ れ る 、printf() お よ び fprintf(stdout,) の よ う なデー タ を表示す る だけでアルゴ リ ズ
ムの実行には影響のないシ ス テ ム コ ールは無視 し ますが、 通常はシ ス テ ム コ ールは合成で き ないので、 合成前に関
数か ら 削除 し てお く 必要があ り ます。 getc()、 time()、 sleep() な ど のシ ス テ ム コ ール も 、 OS に呼び出 し を実
行す る ので合成で き ません。
Vivado HLS では、合成が実行 さ れた と き に macro __SYNTHESIS__ が定義 さ れます。こ れに よ り 、__SYNTHESIS__
macro を使用 し て、 デザ イ ンか ら 合成不可能な コ ー ド を削除で き る よ う にな り ます。
例 3-55 は、下位関数か ら の中間結果が保存 さ れ る ハー ド ド ラ イ ブの フ ァ イ ルに保存 さ れ る コ ー ド 例を示 し てい ます。
__SYNTHESIS__ マ ク ロ を使用す る と 、 合成不可能な フ ァ イ ルの書 き 込みが合成中に無視 さ れ る よ う にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
216
C の合成
#include hier_func4.h
int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub)
{
*outSum = *in1 + *in2;
*outSub = *in1 - *in2;
}
int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB)
{
*outA = *in1 >> 1;
*outB = *in2 >> 2;
}
void hier_func4(din_t A, din_t B, dout_t *C, dout_t *D)
{
dint_t apb, amb;
sumsub_func(&A,&B,&apb,&amb);
#ifndef __SYNTHESIS__
FILE *fp1;// The following code is ignored for synthesis
char filename[255];
sprintf(filename,Out_apb_%03d.dat,apb);
fp1=fopen(filename,w);
fprintf(fp1, %d \n, apb);
fclose(fp1);
#endif
shift_func(&apb,&amb,C,D);
}
例 3‐55 : デバ ッ グ用の フ ァ イ ルの書 き 込み
__SYNTHESIS__ マ ク ロ を使用す る と 、 C 関数か ら コ ー ド 自体を削除せずに、 合成不可能な コ ー ド を削除で き ます。
ただ し 、 こ のマ ク ロ を使用す る と 、 シ ミ ュ レーシ ョ ン用の C コ ー ド と 合成用の C コ ー ド が異な る こ と にな り ます。
注意 : __SYNTHESIS__ マ ク ロ を C コ ー ド の機能を変更する ために使用する と 、 C シ ミ ュ レーシ ョ ン と C 合成の結
果が異な り ま す。 こ の よ う な コ ー ド のエ ラ ーはデバ ッ グ し に く いので、 機能を変更す る ために __SYNTHESIS__ マ
ク ロ を使用す る のはお勧めで き ません。
ダ イ ナ ミ ッ ク メ モ リ の使用
シ ス テ ム内の メ モ リ 割 り 当て を管理す る シ ス テ ム コ ール、 た と えば malloc()、 alloc()、 お よ び free() は、 OS
の メ モ リ に あ る リ ソ ー ス を使用 し 、 ラ ン タ イ ム中に作成お よ び リ リ ー ス さ れ ま す。 ハー ド ウ ェ ア イ ン プ リ メ ン テー
シ ョ ン を合成で き る よ う にす る には、 デザ イ ンに必要な リ ソ ース がすべて指定 さ れ、 含まれてい る 必要があ り ます。
メ モ リ 割 り 当てのシ ス テ ム コ ールは、 合成前にデザ イ ン か ら 削除す る 必要があ り ますが、 ダ イ ナ ミ ッ ク メ モ リ 操作
がデザ イ ンの機能を定義す る ために使用 さ れてい る ので、 同等の範囲が制限 さ れた表現に変換す る 必要があ り ます。
例 3-56 は、 malloc() を使用す る デザ イ ンが合成可能なバージ ョ ンに変換 さ れ る 例を示 し てい ます。
例 3-56 の例には、 次の 2 つの コ ー ド 記述方法が示 さ れます。
•
デザ イ ンでは __SYNTHESIS__ マ ク ロ を使用 し ません。
合成可能なバージ ョ ン と 合成不可能なバージ ョ ン間を選択にユーザー定義の NO_SYNTH マ ク ロ が使用 さ れます。
こ れに よ り 、 同 じ コ ー ド が C でシ ミ ュ レーシ ョ ン さ れて、 Vivado HLS で合成 さ れ る よ う にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
217
C の合成
•
malloc() を使用す る 元のデザ イ ンのポ イ ン タ ーは、 固定サ イ ズのエ レ メ ン ト 用に書き 直す必要はあ り ません。
固定サ イ ズの リ ソ ース は作成で き 、 既存ポ イ ン タ ーは単に固定サ イ ズの リ ソ ース を指定す る よ う にで き ます。 こ
の方法に よ り 、 既存デザ イ ン を手動で書 き 直す必要はな く な り ます。
#include malloc_removed.h
#include <stdlib.h>
//#define NO_SYNTH
dout_t malloc_removed(din_t din[N], dsel_t width) {
#ifdef NO_SYNTH
long long *out_accum = malloc (sizeof(long long));
int* array_local = malloc (64 * sizeof(int));
#else
long long _out_accum;
long long *out_accum = &_out_accum;
int _array_local[64];
int* array_local = &_array_local[0];
#endif
int i,j;
LOOP_SHIFT:for (i=0;i<N-1; i++) {
if (i<width)
*(array_local+i)=din[i];
else
*(array_local+i)=din[i]>>2;
}
*out_accum=0;
LOOP_ACCUM:for (j=0;j<N-1; j++) {
*out_accum += *(array_local+j);
}
return *out_accum;
}
例 3‐56 : malloc() の固定サ イ ズ リ ソ ースへの変換
こ こ での変更はデザ イ ンの機能に影響す る ので、 __SYNTHESIS__ マ ク ロ の使用はお勧めで き ません。 こ の場合、 次
を実行す る こ と をお勧め し ます。
1.
ユーザー定義のマ ク ロ NO_SYNTH を コ ー ド に追加 し て、 コ ー ド を修正 し ます。
2.
NO_SYNTH マ ク ロ を イ ネーブルに し 、 C シ ミ ュ レーシ ョ ン を実行 し て結果を保存 し ます。
3.
NO_SYNTH マ ク ロ をデ ィ ス エーブルに し (た と えば、 例 50 の よ う に コ メ ン ト ア ウ ト し ) 、 C シ ミ ュ レーシ ョ ン を
実行 し て結果が同 じ にな る か ど う か検証 し ます。
4.
こ のユーザー定義のマ ク ロ をデ ィ ス エーブルに し て合成を実行 し ます。
こ の方法を使用す る と 、 ア ッ プデー ト さ れた コ ー ド が C シ ミ ュ レーシ ョ ン で検証 さ れ、 同 じ コ ー ド が合成 さ れ る よ う
にで き ます。
ポ イ ン タ ーの制限
一般的なポ イ ン タ ーの型変換
Vivado HLS では、 一般的なデー タ 型間のポ イ ン タ ー型の変換はサポー ト さ れ ませんが、 ネ イ テ ィ ブ C 型の間ではサ
ポー ト さ れます。 ポ イ ン タ ー型変換の詳細は、 168 ページの 「ポ イ ン タ ー」 を参照 し て く だ さ い。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
218
C++ の合成
ポ イ ン タ ーのア レ イ
ポ イ ン タ ーのア レ イ は、 各ポ イ ン タ ーが ス カ ラ ーま たは ス カ ラ ーのア レ イ を指定する 場合に、 合成でサポー ト さ れま
す。 ポ イ ン タ ーのア レ イ では、別のポ イ ン タ ーを指定する こ と はで き ません。 ポ イ ン タ ーのア レ イ の詳細は、 168 ペー
ジの 「ポ イ ン タ ー」 を参照 し て く だ さ い。
再帰関数
再帰関数は合成で き ません。再帰関数は、次の よ う な再帰が恒久的に繰 り 返 さ れ る 可能性のあ る 関数に適用 さ れます。
unsigned foo (unsigned n)
{
if (n == 0 || n == 1) return 1;
return (foo(n-2) + foo(n-1));
}
Vivado HLS では有限数の関数呼び出 し があ る 末尾再帰はサポー ト さ れません。
unsigned foo (unsigned m, unsigned n)
{
if (m == 0) return n;
if (n == 0) return m;
return foo(n, m%n);
}
C++ では、 テ ンプ レー ト で末尾再帰を イ ンプ リ メ ン ト で き ます。 C_++ については、 次で説明 し ます。
C++ の合成
こ のセ ク シ ョ ンでは、 Vivado HLS の合成で使用 さ れ る C++ 言語について説明 し ます。 こ のセ ク シ ョ ンで C の合成に
関 し て説明 さ れ る 項目 (最上位関数の引数、 ポ イ ン タ ー、 ループ、 ア レ イ な ど) のほ と ん どは、 C++ の コ ー ド 記述に も
適用 さ れます。 こ のセ ク シ ョ ンの前に 「C の合成」 セ ク シ ョ ン を読んでおいて く だ さ い。
「C の合成」 の項目で C++ に適用 さ れない も のは、 C で使用 さ れ る 任意精度型 (C++ には独自の任意精度型あ り ) お
よ び C で任意精度型を コ ンパ イ ルす る 際の制限です。 C++ の任意精度型では整数拡張問題は発生 し ません。
こ のセ ク シ ョ ンでは、 ク ラ ス、 テ ンプ レー ト 、 C++ 任意精度型、 math.h ラ イ ブ ラ リ お よ び標準テ ンプ レー ト ラ イ ブ
ラ リ のサポー ト な ど、 合成に関す る C++ のその他の言語機能について説明 し ます。
Vivado HLS では、 C++ 関数には標準の g++ フ ァ イ ル拡張子 (.cpp、 .cxx な ど) が付いてい る と 予測 さ れます。 適切
に名前が変更 さ れ、 Vivado HLS C 任意精度型の (u)int# で使用 さ れない標準 C 言語関数は、 C++ デザ イ ン と し て合
成で き ます。 C++ オブジ ェ ク ト 指向の コ ーデ ィ ン グ形式を使用する ための要件はあ り ません。
C++ ク ラ ス
C++ ク ラ ス は、 Vivado HLS での合成で完全にサポー ト さ れてい ます。 合成の最上位は、 関数であ る 必要があ り ます。
ク ラ ス は、 合成では最上位にで き ません。 ク ラ ス の メ ンバー関数を合成す る には、 ク ラ ス自体を関数に イ ン ス タ ン シ
エー ト す る 必要があ り ます。 最上位 ク ラ ス は、 単にテ ス ト ベンチに イ ン ス タ ン シエー ト し ない よ う に し て く だ さ い。
例 3-57 は、CFIR ク ラ ス (次で説明す る ヘ ッ ダー フ ァ イ ルで定義) が最上位関数の cpp_FIR に イ ン ス タ ン シエー ト さ
れ、 FIR フ ィ ル タ ーを イ ンプ リ メ ン ト す る ために使用 さ れ る コ ー ド を示 し てい ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
219
C++ の合成
#include cpp_FIR.h
// Top-level function with class instantiated
data_t cpp_FIR(data_t x)
{
static CFir<coef_t, data_t, acc_t> fir1;
cout << fir1;
return fir1(x);
}
例 3‐57 : C++ FIR フ ィ ル タ ー
重要 : ク ラ スお よ び ク ラ ス メ ンバー関数は、 合成では最上位にで き ません。 ク ラ スは最上位関数に イ ン ス タ ン シエー
ト す る 必要があ り ます。
例 3-57 で、 デザ イ ン を イ ンプ リ メ ン ト す る ために使用 さ れ る ク ラ ス を検証する 前に、 Vivado HLS が合成中に標準出
力ス ト リ ーム カ ウ ン ト を無視す る こ と に注意 し て く だ さ い。 Vivado HLS で合成 さ れ る と 、 次の よ う な警告 メ ッ セー
ジが表示 さ れます。
@I [SYNCHK-101] Discarding
'std::ostream::operator<<'
@I [SYNCHK-101] Discarding
'std::ostream::operator<<'
@I [SYNCHK-101] Discarding
<std::char_traits<char> >'
@
unsynthesizable system call:
(cpp_FIR.h:108)
unsynthesizable system call:
(cpp_FIR.h:108)
unsynthesizable system call:'std::operator<<
(cpp_FIR.h:110)
次の例 3-58 に示す cpp_FIR.h ヘ ッ ダー フ ァ イ ルには、CFir ク ラ スお よ びそれに関連す る メ ンバー関数が定義 さ れ
てい ます。 こ の例では、 演算子の メ ンバー関数 () お よ び << はオーバー ロ ー ド さ れ る 演算子です。 それぞれ main ア
ルゴ リ ズ ム を実行す る た めに使用 さ れ、 cout と 一緒に使用す る と 、 C シ ミ ュ レ ーシ ョ ン中に表示 さ れ る デー タ を
フ ォーマ ッ ト で き ます。
#include <fstream>
#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
#define N 85
typedef int coef_t;
typedef int data_t;
typedef int acc_t;
// Class CFir definition
template<class coef_T, class data_T, class acc_T>
class CFir {
protected:
static const coef_T c[N];
data_T shift_reg[N-1];
private:
public:
data_T operator()(data_T x);
template<class coef_TT, class data_TT, class acc_TT>
friend ostream&
operator<<(ostream& o, const CFir<coef_TT, data_TT, acc_TT> &f);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
220
C++ の合成
};
// Load FIR coefficients
template<class coef_T, class data_T, class acc_T>
const coef_T CFir<coef_T, data_T, acc_T>::c[N] = {
#include cpp_FIR.inc
};
// FIR main algorithm
template<class coef_T, class data_T, class acc_T>
data_T CFir<coef_T, data_T, acc_T>::operator()(data_T x) {
int i;
acc_t acc = 0;
data_t m;
loop: for (i = N-1; i >= 0; i--) {
if (i == 0) {
m = x;
shift_reg[0] = x;
} else {
m = shift_reg[i-1];
if (i != (N-1))
shift_reg[i] = shift_reg[i - 1];
}
acc += m * c[i];
}
return acc;
}
// Operator for displaying results
template<class coef_T, class data_T, class acc_T>
ostream& operator<<(ostream& o, const CFir<coef_T, data_T, acc_T> &f) {
for (int i = 0; i < (sizeof(f.shift_reg)/sizeof(data_T)); i++) {
o << shift_reg[ << i << ]= << f.shift_reg[i] << endl;
}
o << ______________ << endl;
return o;
}
data_t cpp_FIR(data_t x);
例 3‐58 : ク ラ ス を 定義す る C++ ヘ ッ ダー フ ァ イ ル
テ ス ト ベンチ 例 3-57 は 例 3-59 で示 さ れ、 最上位関数の cpp_FIR が呼び出 さ れて検証 さ れてい る と こ ろ を示 し て
い ます。 こ の例には、 Vivado HLS 合成用にテ ス ト ベンチの重要な属性が含ま れます。
•
出力結果は、 既知の良い値に対 し て比較 さ れます。
•
テ ス ト ベンチは結果が正 し い と 確認 さ れれば 0 を戻 し ます。
テ ス ト ベンチの詳細は、 162 ページの 「生産的なテ ス ト ベンチの作成」 を参照 し て く だ さ い。
#include cpp_FIR.h
int main() {
ofstream result;
data_t output;
int retval=0;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
221
C++ の合成
// Open a file to saves the results
result.open(result.dat);
// Apply stimuli, call the top-level function and saves the results
for (int i = 0; i <= 250; i++)
{
output = cpp_FIR(i);
result << setw(10) << i;
result << setw(20) << output;
result << endl;
}
result.close();
// Compare the results file with the golden results
retval = system(diff --brief -w result.dat result.golden.dat);
if (retval != 0) {
printf(Test failed !!!\n);
retval=1;
} else {
printf(Test passed !\n);
}
// Return 0 if the test
return retval;
}
例 3‐59 : cpp_FIR の C++ テ ス ト ベ ン チ
指示子を ク ラ ス で定義 し たオブジ ェ ク ト に適用す る には、 次の手順に従っ て く だ さ い。
1.
ク ラ ス が定義 さ れてい る フ ァ イ ル (通常はヘ ッ ダー フ ァ イ ル) を開き ます。
2.
[Directives] タ ブ を使用 し て指示子を適用 し ます。
関数 と 同様、 1 つの ク ラ ス の イ ン ス タ ン ス はすべて同 じ 最適化が適用 さ れます。
コ ン ス ト ラ ク タ ー、 デス ト ラ ク タ ーお よび仮想関数
ク ラ ス コ ン ス ト ラ ク タ ーお よ びデス ト ラ ク タ ーは、 ク ラ ス オブジ ェ ク ト が宣言 さ れ る と 含まれて合成 さ れます。
Vivado HLS がエ ラ ボ レーシ ョ ン中に関数を静的に決定で き る 場合、 仮想関数は、 抽象的な も の も 含め、 合成でサポー
ト さ れます。 次は、 仮想関数が合成でサポー ト さ れない例です。
•
仮想関数はマルチ レ イ ヤー イ ンヘ リ タ ン ス ク ラ ス階層で定義で き ますが、 シ ン グル イ ンヘ リ タ ン ス を使用 し て
のみ定義で き ます。
•
動的なポ リ モーフ ィ ズ ムは、 ポ イ ン タ ー オブジ ェ ク ト が コ ンパ イ ル時に決定で き る 場合にのみサポー ト さ れま
す。 た と えば、 こ の よ う なポ イ ン タ ーは if-else やループ文では使用で き ません。
•
STL コ ン テナは、オブジ ェ ク ト のポ イ ン タ ーを含め、ポ リ モーフ ィ ズ ム関数を呼び出すためには使用で き ません。
次はその例です。
vector<base *> base_ptrs(10);
//Push_back some base ptrs to vector.
for (int i = 0; i < base_ptrs.size(); ++i) {
//Static elaboration cannot resolve base_ptrs[i] to actual data type.
base_ptrs[i]->virtual_function();
}
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
222
C++ の合成
•
Vivado HLS では、 base オブジ ェ ク ト ポ イ ン タ ーがグ ロ ーバル変数の場合はサポー ト さ れません。 次はその例で
す。
Base *base_ptr;
void func()
{
……
base_prt->virtual_function();
……
}
•
base オブジ ェ ク ト ポ イ ン タ ーは ク ラ ス定義の メ ンバー変数にはで き ません。 次に例を示 し ます。
// Static
class A
{
…..
Base
void
void
…..
};
elaboration cannot bind base object pointer with correct data type.
*base_ptr;
set_base(Base *base_ptr);
some_func();
void A::set_base(Base *ptr)
{
this.base_ptr = ptr;
}
void A::some_func()
{
….
base_ptr->virtual_function();
….
}
•
base オブジ ェ ク ト ポ イ ン タ ーま たは リ フ ァ レ ン ス が コ ン ス ト ラ ク タ ーの関数パ ラ メ ー タ ー リ ス ト にあ る 場合
は、 Vivado HLS でそれは変換 さ れ ません。 こ れについては、 ISO C++ 規格のセ ク シ ョ ン 12.7 に記述 さ れてい ま
す。 ビヘ イ ビ アは定義 さ れない こ と も あ り ます。
class A {
A(Base *b) {
b-> virtual _ function ();
}
};
グ ローバル変数お よび ク ラ ス
ク ラ ス でグ ロ ーバル変数を使用す る のは、 推奨 さ れません。 使用す る と 、 一部の最適化が実行 さ れない こ と があ り ま
す。 例 3-60 「ループ イ ンデ ッ ク ス の C++ ク ラ ス デー タ メ ンバーの コ ー ド 例」 では、 フ ィ ル タ ーの コ ン ポーネ ン ト を
作成す る のに ク ラ ス が使用 さ れてい ます (polyd_cell ク ラ ス はシ フ ト 、 乗算、 累算を実行す る コ ン ポーネ ン ト と し
て使用 さ れます)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
223
C++ の合成
ループ イ ンデ ッ ク スの C++ ク ラ ス デー タ メ ンバーの コ ー ド 例
typedef
typedef
typedef
typedef
long
int
char
char
long
acc_t;
mult_t;
data_t;
coef_t;
#define
#define
#define
#define
TAPS
3
PHASES
4
DATA_SAMPLES 256
CELL_SAMPLES 12
// Use k on line 73 static int k;
template <typename T0, typename T1, typename T2, typename T3, int N>
class polyd_cell {
private:
public:
T0 areg;
T0 breg;
T2 mreg;
T1 preg;
T0 shift[N];
int k;
//line 73
T0 shift_output;
void exec(T1 *pcout, T0 *dataOut, T1 pcin, T3 coeff, T0 data, int col)
{
Function_label0:;
if (col==0) {
SHIFT:for (k = N-1; k >= 0; --k) {
if (k > 0)
shift[k] = shift[k-1];
else
shift[k] = data;
}
*dataOut = shift_output;
shift_output = shift[N-1];
}
*pcout = (shift[4*col]* coeff) + pcin;
}
};
// Top-level function with class instantiated
void cpp_class_data (
acc_t
*dataOut,
coef_t
coeff1[PHASES][TAPS],
coef_t
coeff2[PHASES][TAPS],
data_t dataIn[DATA_SAMPLES],
int
row
) {
acc_t pcin0 = 0;
acc_t pcout0, pcout1;
data_t dout0, dout1;
int col;
static acc_t
accum=0;
static int sample_count = 0;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
224
C++ の合成
static polyd_cell<data_t, acc_t, mult_t, coef_t, CELL_SAMPLES>
polyd_cell0;
static polyd_cell<data_t, acc_t, mult_t, coef_t, CELL_SAMPLES>
polyd_cell1;
COL:for (col = 0; col <= TAPS-1; ++col) {
polyd_cell0.exec(&pcout0,&dout0,pcin0,coeff1[row][col],dataIn[sample_count],
col);
polyd_cell1.exec(&pcout1,&dout1,pcout0,coeff2[row][col],dout0,col);
if ((row==0) && (col==2)) {
*dataOut = accum;
accum = pcout1;
} else {
accum = pcout1 + accum;
}
}
sample_count++;
}
例 3‐60 : ルー プ イ ン デ ッ ク スの C++ ク ラ ス デー タ メ ンバーの コ ー ド 例
polyd_cell ク ラ ス内には、 デー タ を シ フ ト す る ための SHIFT ループがあ り ます。 SHIFT ループで使用 さ れ る ルー
プ イ ン デ ッ ク ス の k が削除 さ れ、 k の グ ロ ーバル イ ン デ ッ ク ス に置換 さ れ る と (前の例で も 記述 し て い ま し た が
static int k と 記述 さ れて コ メ ン ト ア ウ ト さ れてい ま し た)、 Vivado HLS では polyd_cell ク ラ ス の使用 さ れ る
ループ ま たは関数がパ イ プ ラ イ ン処理で き な く な り ます。 Vivado HLS では、 次の よ う な メ ッ セージが表示 さ れます。
@W [XFORM-503] Cannot unroll loop 'SHIFT' in function 'polyd_cell<char, long long,
int, char, 12>::exec' completely: variable loop bound.
ループ イ ンデ ッ ク ス にはグ ロ ーバル変数以外の ロ ーカル変数を使用す る と 、 Vivado HLS ですべての最適化が実行 さ
れます。
テ ン プ レー ト
Vivado HLS では合成用に C++ のテ ンプ レー ト の使用がサポー ト さ れ ますが、 最上位関数のテ ンプ レー ト はサポー ト
さ れません。
重要 : 最上位関数にはテ ンプ レー ト を使用で き ません。
例 3-58 お よ び 例 3-60 に示す よ う な一般的なテ ンプ レー ト の使用方法だけでな く 、テ ンプ レー ト は標準 C 合成ではサ
ポー ト さ れない再帰関数を イ ンプ リ メ ン ト す る ために使用す る こ と も で き ます。
例 3-61 では、 末尾再帰の フ ィ ボナ ッ チ アルゴ リ ズ ム を イ ン プ リ メ ン ト す る ために、 テ ン プ レー ト 化 さ れた struct
が使用 さ れてい ます。 合成を実行す る ためには、 再帰の最終呼び出 し を イ ンプ リ メ ン ト す る のに終端 ク ラ ス を使用す
る 必要があ り ます。 こ の場合、 テ ンプ レー ト サ イ ズは 1 が使用 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
225
C++ の合成
//Tail recursive call
template<data_t N> struct fibon_s {
template<typename T>
static T fibon_f(T a, T b) {
return fibon_s<N-1>::fibon_f(b, (a+b));
}
};
// Termination condition
template<> struct fibon_s<1> {
template<typename T>
static T fibon_f(T a, T b) {
return b;
}
};
void cpp_template(data_t a, data_t b, data_t &dout){
dout = fibon_s<FIB_N>::fibon_f(a,b);
}
例 3‐61 : テ ン プ レ ー ト を 使用 し た C++ の末尾再帰
デー タ 型
C 言語の 「デー タ 型」 セ ク シ ョ ン で説明 し た よ う に、 Vivado HLS では C++ と 同 じ 標準デー タ 型が合成でサポー ト さ
れます。
Vivado HLS では、 C++ 任意精度型整数 も サポー ト さ れ ます。 C++ 任意精度整数には、 C で使用 さ れ る も の と は異な
り 、 シ ミ ュ レーシ ョ ン制限があ り ません。 C++ 任意精度の固定小数点型 も サポー ト さ れます。
C++ の任意精度整数型
C++ のネ イ テ ィ ブ デー タ 型は、 8 ビ ッ ト 境界 (8、 16、 32、 64 ビ ッ ト ) にあ り ます。 RTL 信号お よ び演算では、 任意の
ビ ッ ト 長がサポー ト さ れます。
Vivado HLS では C++ の任意精度デー タ 型が提供 さ れてお り 、C コ ー ド の変数お よ び演算を任意の ビ ッ ト 幅 (6 ビ ッ ト 、
17 ビ ッ ト 、 234- ビ ッ ト な ど、 最大 1024 ビ ッ ト ま で) で指定で き ます。
ヒ ン ト : デフ ォ ル ト の幅の最大許容幅は 1024 ビ ッ ト です。 こ のデフ ォ ル ト は、 ap_int.h ヘ ッ ダー フ ァ イ ルを含め る 前
に、 32768 以下の正の整数値でマ ク ロ AP_INT_MAX_W を定義する と 上書き する こ と がで き ます。
C++ では SystemC 規格で定義 さ れた任意精度型の使用がサポー ト さ れ る ので、 単に SystemC ヘ ッ ダー フ ァ イ ルの
systemc.h を含め る だけで、 SystemC デー タ 型が使用で き ます。 SystemC のデー タ 型については、 「SystemC の合成」 を
参照 し て く だ さ い。
任意精度デー タ 型には、 ネ イ テ ィ ブ C++ デー タ 型 よ り も 次の よ う な利点があ り ます。
•
ハー ド ウ ェ アの質の改善 :た と えば 17 ビ ッ ト の乗算器が必要な場合、 計算で調度 17 ビ ッ ト が使用 さ れ る よ う に
指定す る ために任意精度型を使用で き ます。
°
•
任意精度デー タ 型を使用 し ない場合、 こ の よ う な乗算 (17 ビ ッ ト ) は 32 ビ ッ ト の整数デー タ 型を使用 し て イ
ン プ リ メ ン ト す る 必要があ る ので、 複数の DSP48 コ ン ポーネ ン ト を使用 し て乗算が イ ン プ リ メ ン ト さ れ る
こ と にな り ます。
正確な C++ シ ミ ュ レーシ ョ ン/解析 :C++ コ ー ド の任意精度デー タ 型を使用す る と 、 正確な ビ ッ ト 幅を使用 し て
C++ シ ミ ュ レーシ ョ ン を実行で き 、 合成前にアルゴ リ ズ ムの機能 (お よ び精度) を検証で き ます。
C++ の任意精度型には、 C の任意精度型で発生す る よ う な問題はあ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
226
C++ の合成
•
C++ 任意精度型は、 標準 C++ コ ンパ イ ラ ーで コ ンパ イ ル さ れます ( 「C 言語での任意精度デー タ 型の検証」 に示
す よ う に、 appc と 同等の も のは C++ にはあ り ません)。
•
C++ 任意精度型には、 整数拡張問題はあ り ません。
フ ァ イ ル拡張子を .c か ら .cpp
C++ と し て コ ンパ イ ルで き ます。
に変更す る のは珍 し く ないので、 フ ァ イ ルは上記の よ う な問題がない場合は
こ のセ ク シ ョ ンの残 り の部分では、 任意精度型の使用方法について説明 し ます。 詳細は、 296 ページの 「C++ の任意
精度型」 を参照 し て く だ さ い。 こ のセ ク シ ョ ンには、 次の内容が含まれます。
•
任意精度の整数に (1024 ビ ッ ト を超え る 値 も 含めて) 定数お よ び初期値を代入す る 方法
•
表示、 連結、 ビ ッ ト ス ラ イ ス、 範囲選択な ど の Vivado HLS のヘルパー メ ソ ッ ド の詳細
•
シ フ ト 演算 (負のシ フ ト 値は反対方向でシ フ ト にな る ) の記述 も 含めた演算子の動作の詳細
C++ 言語での任意精度デー タ 型の使用
C++ 言語では、ヘ ッ ダー フ ァ イ ル ap_int.h に よ り 任意精度の整数デー タ 型 ap_(u)int<W> が定義 さ れます。 た と
えば、 ap_int<8> は 8 ビ ッ ト の符号付 き 整数デー タ 型を表 し 、 ap_uint<234> は 234 ビ ッ ト の符号な し 整数デー タ
型を表 し ます。
ap_int.h フ ァ イ ルは、$HLS_ROOT/include デ ィ レ ク ト リ ($HLS_ROOT は Vivado HLS の イ ン ス ト ール デ ィ レ ク ト リ ) に
あ り ます。
例 3-62 の コ ー ド は、 前述の基本的な演算例 (例 3-22 お よ び例 3-36) の コ ー ド を繰 り 返 し た も のです。 こ の例で合成 さ
れ る 最上位関数のデー タ 型は dinA_t、 dinB_t な ど と 指定 さ れてい ます。
#include cpp_ap_int_arith.h
void cpp_ap_int_arith(din_A inA, din_B inB, din_C inC, din_D inD,
dout_1 *out1, dout_2 *out2, dout_3 *out3, dout_4 *out4
) {
// Basic arithmetic operations
*out1 = inA * inB;
*out2 = inB + inA;
*out3 = inC / inA;
*out4 = inD % inA;
}
例 3‐62 : C++ 型で書 き 直 し た基本演算
こ のア ッ プデー ト では、 C++ 任意精度型が使用 さ れてい ます。
•
ソ ース コ ー ド にヘ ッ ダー フ ァ イ ル ap_int.h を追加 し ます。
•
ネ イ テ ィ ブ C++ 型を任意精度型 ap_int<N> ま たは ap_uint<N> に変更 し ます。 こ こ での N の ビ ッ ト サ イ ズは
1 ~ 1024 にな り ます (前述 し た と お り 、 こ れは必要であれば 32 ビ ッ ト に拡張で き ます)。
デー タ 型はヘ ッ ダー フ ァ イ ル cpp_ap_int_arith.h で定義 さ れます (例 3-37)。
例 3-22 と 比較す る と 、入力デー タ 型は単に実際の入力デー タ の最大サ イ ズ を表す よ う に削減 さ れてい ます (例 : 8 ビ ッ
ト 入力 inA を 6 ビ ッ ト 入力に削減)。出力は さ ら に正確に改良 さ れてい ます。 た と えば inA と inB の合計であ る out2
は 32 ビ ッ ト ではな く 13 ビ ッ ト だけ必要です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
227
C++ の合成
#ifndef _CPP_AP_INT_ARITH_H_
#define _CPP_AP_INT_ARITH_H_
#include <stdio.h>
#include ap_int.h
#define N 9
// Old data types
//typedef char dinA_t;
//typedef short dinB_t;
//typedef int dinC_t;
//typedef long long dinD_t;
//typedef int dout1_t;
//typedef unsigned int dout2_t;
//typedef int32_t dout3_t;
//typedef int64_t dout4_t;
typedef
typedef
typedef
typedef
ap_int<6> dinA_t;
ap_int<12> dinB_t;
ap_int<22> dinC_t;
ap_int<33> dinD_t;
typedef
typedef
typedef
typedef
ap_int<18> dout1_t;
ap_uint<13> dout2_t;
ap_int<22> dout3_t;
ap_int<6> dout4_t;
void cpp_ap_int_arith(dinA_t inA,dinB_t inB,dinC_t inC,dinD_t inD,dout1_t
*out1,dout2_t *out2,dout3_t *out3,dout4_t *out4);
#endif
例 3‐63 : C++ 任意精度型 を使用 し た基本演算
例 3-62 が合成 さ れ る と 、 例 3-22 お よ び 例 3-37 と 同 じ 機能を持つデザ イ ン にな り ます。 テ ス ト ベンチ を で き る 限 り
例 3-37 の よ う にす る には、 C++ カ ウ ン ト 演算を使用 し て結果を フ ァ イ ルに出力す る よ り も 、 ビル ト イ ン ap_int メ
ソ ッ ド の .to_int() を使用 し て ap_int の結果を標準 fprintf 関数で使用 さ れ る 整数型に変換 し ます。
fprintf(fp, %d*%d=%d; %d+%d=%d; %d/%d=%d; %d mod %d=%d;\n,
inA.to_int(), inB.to_int(), out1.to_int(),
inB.to_int(), inA.to_int(), out2.to_int(),
inC.to_int(), inA.to_int(), out3.to_int(),
inD.to_int(), inA.to_int(), out4.to_int());
こ の メ ソ ッ ド 、合成動作、ap_(u)int<N> 任意精度デー タ 型を使用 し たすべての側面な ど の詳細については、296 ペー
ジの 「C++ の任意精度型」 を参照 し て く だ さ い。
C++ の任意精度 (AP) 固定小数点型
C++ 関数を使用す る と 、 Vivado HLS に含まれ る 任意精度の固定小数点型の利点を生かす こ と がで き ます。 図 3-7 は、
こ れ ら の固定小数点型の基本的な機能を ま と めてい ます。
•
ワー ド は符号付 き (ap_fixed) ま たは符号な し (ap_ufixed) にで き ます。
•
任意サ イ ズの ワー ド 幅 W は定義で き ます。
•
整数部 I の桁数に よ り 、 ワー ド W-I の整数部 も 定義 さ れます (図 3-7 では B)。
•
丸め ま たは量子化 (Q) の タ イ プ を選択で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
228
C++ の合成
•
オーバーフ ロ ー ビヘ イ ビ アー (O お よ び N) を選択で き ます。
X-Ref Target - Figure 3-7
図 3‐7 : 任意精度の固定小数点型
任意精度の固定小数点型は、 ヘ ッ ダー フ ァ イ ル ap_fixed.h が コ ー ド に含まれてい る と 使用で き ます。
ヒ ン ト : 任意精度の固定小数点デー タ 型の方が C シ ミ ュ レーシ ョ ン中に よ り 多 く の メ モ リ を必要 と し ます。 ap_[u] 固
定小数点デー タ 型のかな り 大 き な ア レ イ を使用す る 場合は、 208 ページの 「ア レ イ 」 の C シ ミ ュ レーシ ョ ンの説明を
参照 し て く だ さ い。
固定小数点型を使用す る と 、 次の よ う な利点があ り ます。
•
小数を簡単に記述で き ます。
•
整数部お よ び小数部のビ ッ ト 数が異な る 変数の場合、 小数点のア ラ イ メ ン ト が処理 さ れます。
•
結果を正確に示すだけの小数部ビ ッ ト が足 ら ない場合のため、 多 く の丸めの実行を処理す る オプシ ョ ンがあ り ま
す。
•
結果が整数部ビ ッ ト よ り も 大 き い場合のため、 多 く の変数のオーバーフ ロ ーを処理す る オプシ ョ ン も あ り ます。
こ れ ら の属性は、 例 3-64 の コ ー ド に含まれてい ます。 まず、 ヘ ッ ダー フ ァ イ ル ap_fixed.h が含まれ、 ap_fixed
型がtypedef 文に よ り 定義 さ れます。
•
10 ビ ッ ト 入力 :8 ビ ッ ト 整数値 + 2 小数部
•
6 ビ ッ ト 入力 :3 ビ ッ ト 整数値 + 3 小数部
•
累算用の 22 ビ ッ ト 変数 :17 ビ ッ ト 整数値 + 5 小数部
•
結果用の 36 ビ ッ ト 変数 :30 ビ ッ ト 整数値 + 6 小数部
関数には、 演算実行後の小数点のア ラ イ メ ン ト を管理す る コ ー ド は含まれません。 こ れは、 自動的に実行 さ れます。
#include ap_fixed.h
typedef
typedef
typedef
typedef
ap_ufixed<10,8, AP_RND, AP_SAT> din1_t;
ap_fixed<6,3, AP_RND, AP_WRAP> din2_t;
ap_fixed<22,17, AP_TRN, AP_SAT> dint_t;
ap_fixed<36,30> dout_t;
dout_t cpp_ap_fixed(din1_t d_in1, din2_t d_in2) {
static dint_t sum;
sum =+ d_in1;
return sum * d_in2;
}
例 3‐64 : AP_Fixed 小数点の例
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
229
C++ の合成
表 3-5 は、量子化モー ド お よ びオーバーフ ロ ー モー ド を示 し てい ます。 詳細は、「C++ の任意精度 (AP) 固定小数点型」
を参照 し て く だ さ い。
ヒ ン ト : 標準ハー ド ウ ェ ア演算 (折 り 返 し お よ び切 り 捨て) のデフ ォ ル ト ビヘ イ ビ ア以上を実行す る 量子化モー ド お
よ びオーバーフ ロ ー モー ド を使用す る と 、 さ ら に多 く の関連ハー ド ウ ェ ア を含む演算子にな り ます。 負の無限大への
丸めや対称的な飽和な ど の さ ら にア ド バン ス なモー ド を イ ンプ リ メ ン ト す る ために、 ロ ジ ッ ク (LUT) が必要にな り ま
す。
表 3‐5 : 固定小数点の識別子
識別子
説明
W
ワー ド 長を ビ ッ ト 数で指定
I
整数値を ビ ッ ト 数で指定 (整数部の ビ ッ ト 数)
Q
量子化モー ド を指定。 量子化モー ド は、 結果の保存に使用 さ れ る 変数の最小の小数ビ ッ ト
で定義で き る よ り も 大 き い精度が生成 さ れた場合の動作を指定 し ます。
O
N
モー ド
説明
AP_RND
正の無限大への丸め
AP_RND_ZERO
0 への丸め
AP_RND_MIN_INF
負の無限大への丸め
AP_RND_INF
無限大への丸め
AP_RND_CONV
収束丸め
AP_TRN
負の無限大への切 り 捨て
AP_TRN_ZERO
0 への切 り 捨て (デフ ォ ル ト )
オーバーフ ロ ー モー ド を指定。 オーバーフ ロ ー モー ド は、 結果の保存に使用 さ れ る 変数
よ り も 多 く のビ ッ ト が生成 さ れた場合の動作を指定 し ます。
モー ド
説明
AP_SAT
飽和
AP_SAT_ZERO
0 への飽和
AP_SAT_SYM
対称飽和
AP_WRAP
折 り 返 し (デフ ォ ル ト )
AP_WRAP_SM
符号絶対値の折 り 返 し
折 り 返 し モー ド での飽和ビ ッ ト 数
ap_(u)fixed 型を使用す る と 、 C++ シ ミ ュ レーシ ョ ンのビ ッ ト 精度は正 し く な り ます。 高速シ ミ ュ レーシ ョ ン を使
用す る と 、 アルゴ リ ズ ム と その精度を検証で き ます。 合成後、 RTL では同 じ ビ ッ ト 精度の動作にな り ます。
任意精度の固定小数点型を使用す る と 、 リ テ ラ ル値を自由に代入で き ます。 例 3-65 と 一緒に使用 さ れ る テ ス ト ベン
チ (例 3-64) に示す よ う に、 in1 お よ び in2 の値は宣言済みで、 定数値が代入 さ れてい ます。
演算子に関 し て リ テ ラ ル値を代入す る 際は、 まず リ テ ラ ル値を ap_(u)fixed 型に変換す る 必要があ り ます。 こ う し
ない と 、 C コ ンパ イ ラ お よ び Vivado HLS で こ の リ テ ラ ル値が整数ま たは float/double 型 と し て認識 さ れ、 最適な
演算子が検索 さ れな く な り ます。た と えば、in1 = in1 + din1_t(0.25) の代入では、リ テ ラ ル値 0.25 が ap_fixed
型に変換 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
230
C++ の合成
ap_fixed 小数点のテ ス ト ベン チの コ ー ド 例
#include <cmath>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
#include ap_fixed.h
typedef
typedef
typedef
typedef
ap_ufixed<10,8, AP_RND, AP_SAT> din1_t;
ap_fixed<6,3, AP_RND, AP_WRAP> din2_t;
ap_fixed<22,17, AP_TRN, AP_SAT> dint_t;
ap_fixed<36,30> dout_t;
dout_t cpp_ap_fixed(din1_t d_in1, din2_t d_in2);
int main()
{
ofstream result;
din1_t in1 = 0.25;
din2_t in2 = 2.125;
dout_t output;
int retval=0;
result.open(result.dat);
// Persistent manipulators
result << right << fixed << setbase(10) << setprecision(15);
for (int i = 0; i <= 250; i++)
{
output = cpp_ap_fixed(in1,in2);
result
result
result
result
result
<<
<<
<<
<<
<<
setw(10)
setw(20)
setw(20)
setw(20)
endl;
<<
<<
<<
<<
i;
in1;
in2;
output;
in1 = in1 + din1_t(0.25);
in2 = in2 - din2_t(0.125);
}
result.close();
// Compare the results file with the golden results
retval = system(diff --brief -w result.dat result.golden.dat);
if (retval != 0) {
printf(Test failed !!!\n);
retval=1;
} else {
printf(Test passed !\n);
}
// Return 0 if the test passes
return retval;
}
例 3‐65 : ap_fixed 小数点のテ ス ト ベ ン チの コ ー ド 例
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
231
SystemC の合成
サポー ト さ れない C++ コ ン ス ト ラ ク ト
こ のセ ク シ ョ ン では、 合成で き ないサポー ト さ れ る C++ コ ン ス ト ラ ク ト について説明 し ます。 こ れ ら の コ ン ス ト ラ
ク ト は、 216 ページの 「サポー ト さ れない C コ ン ス ト ラ ク ト 」 の リ ス ト に追加 さ れていなか っ た も のです。
ダ イ ナ ミ ッ ク オブ ジ ェ ク ト
C でのダ イ ナ ミ ッ ク メ モ リ 使用に関す る 制限 と 同様、 Vivado HLS では、 ダ イ ナ ミ ッ ク に作成/削除 さ れ る C++ オブ
ジ ェ ク ト も 合成でサポー ト さ れません。 こ れには、 ポ リ モーフ ィ ズ ム関数お よ びダ イ ナ ミ ッ ク 仮想関数の呼び出 し が
含まれます。
次の コ ー ド は、 ラ ン タ イ ムで新 し い関数を作成す る ので、 合成で き ません。
Class A {
public:
virtual void bar() {…};
};
void fun(A* a) {
a->bar();
}
A* a = 0;
if (base)
A= new A();
else
A = new B();
foo(a);
例 3‐66 : 合成で き な い コ ー ド の コ ー ド 例
標準テ ン プ レー ト ラ イ ブ ラ リ
C++ 標準テ ン プ レー ト ラ イ ブ ラ リ (STL) には、 再帰関数が含ま れてお り 、 ダ イ ナ ミ ッ ク メ モ リ 割 り 当てが使用 さ れ
ます。 そのため、 STL は合成で き ません。 STL を使用する 場合は、 再帰、 ダ イ ナ ミ ッ ク メ モ リ 割 り 当て、 ダ イ ナ ミ ッ
ク なオブジ ェ ク ト の作成/削除な ど の特性を持たない同 じ 機能の ロ ーカル関数を作成 し ます。
SystemC の合成
Vivado HLS では、 ハー ド ウ ェ ア記述に使用 さ れ る C++ ク ラ ス ラ イ ブ ラ リ であ る SystemC (IEEE 規格 1666) がサポー
ト さ れます。 こ の ラ イ ブ ラ リ は、 www.systemc.org か ら 入手で き ます。
Vivado HLS では、 次がサポー ト さ れます。
•
SystemC バージ ョ ン 2.1
•
SystemC Synthesizable Subset ( ド ラ フ ト 1.3)
こ のセ ク シ ョ ン では、 Vivado HLS を使用 し て SystemC 関数を合成す る 際の詳細について説明 し ます。 こ こ に含ま れ
る 情報は、 前述の 「C の合成」 お よ び 「C++ の合成」 の章の情報に記載 さ れなかっ た も ので、 合成の基本的な コ ー ド
規則を理解す る には、 こ れ ら の章を理解 し てお く 必要があ り ます。
重要 : C お よ び C++ デザ イ ンの場合 と 同様、合成では最上位関数が C コ ンパ イ ルの最上位 sc_main() の下にあ る 必
要があ り ます。 sc_main() は合成では最上位関数にはで き ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
232
SystemC の合成
デザイ ンの記述
合 成 の 最 上 位 は、 SC_MODULE で あ る 必要 が あ り ま す。 SystemC コ ン ス ト ラ ク タ ー プ ロ セ ス の SC_METHOD 、
SC_CTHREAD お よ び SC_HAS_PROCESS を使用 し て記述 さ れ る 場合、ま たは SC_MODULES がほかの SC_MODULES 内
に イ ン ス タ ン シエー ト さ れ る 場合、 デザ イ ンは合成で き ます。
デザ イ ンの最上位の SC_MODULE はテ ンプ レー ト にはで き ません。 テ ンプ レー ト は下位モジ ュ ールでのみ使用で き ま
す。
モジ ュ ールの コ ン ス ト ラ ク タ ーでは、 モジ ュ ールの定義ま たは イ ン ス タ ン シエー ト し かで き ず、 機能を含め る こ と が
で き ません。
SC_MODULE は別の SC_MODULE 内には定義で き ません ( こ れ ら は後に示す方法で定義で き ます)。
SC_ MODULE の コ ー ド 例
こ のセ ク シ ョ ンでは、 SC_ MODULE の コ ー ド 例を示 し ます。
SC_ MODULE の例 1
モジ ュ ールが別のモジ ュ ール内で定義 さ れ る 場合 (SC_ MODULE の例 1)、 モジ ュ ールがネ ス ト さ れないバージ ョ ン
(SC_ MODULE の例 2) に変換す る 必要があ り ます。
SC_MODULE(nested1)
{
SC_MODULE(nested2)
{
sc_in<int> in0;
sc_out<int> out0;
SC_CTOR(nested2)
{
SC_METHOD(process);
sensitive<<in0;
}
void process()
{
int var =10;
out0.write(in0.read()+var);
}
};
sc_in<int> in0;
sc_out<int> out0;
nested2 nd;
SC_CTOR(nested1)
:nd(nested2)
{
nd.in0(in0);
nd.out0(out0);
}
};
例 3‐67 : SC_ MODULE の例 1
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
233
SystemC の合成
SC_ MODULE の例 2
SC_MODULE(nested2)
{
sc_in<int> in0;
sc_out<int> out0;
SC_CTOR(nested2)
{
SC_METHOD(process);
sensitive<<in0;
}
void process()
{
int var =10;
out0.write(in0.read()+var);
}
};
SC_MODULE(nested1)
{
sc_in<int> in0;
sc_out<int> out0;
nested2 nd;
SC_CTOR(nested1)
:nd(nested2)
{
nd.in0(in0);
nd.out0(out0);
}
};
例 3‐68 : SC_ MODULE の例 2
SC_ MODULE の例 3
SC_MODULE は別の SC_MODULE か ら 派生 さ せ る こ と はで き ません。 次に例を示 し ます。
SC_MODULE(BASE)
{
sc_in<bool> clock; //clock input
sc_in<bool> reset;
SC_CTOR(BASE) {}
};
class DUT: public BASE
{
public:
sc_in<bool> start;
sc_in<sc_uint<8> > din;
…
};
例 3‐69 : SC_ MODULE の例 3
推奨 : モジ ュ ール コ ン ス ト ラ ク タ ーをモジ ュ ール内で定義 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
234
SystemC の合成
SC_ MODULE の例 4
次の SC_ MODULE の例 4 の よ う な場合は、 SC_ MODULE の例 5 に示す よ う に変換する 必要があ り ます。
SC_MODULE(dut) {
sc_in<int> in0;
sc_out<int>out0;
SC_HAS_PROCESS(dut);
dut(sc_module_name nm);
…
};
dut::dut(sc_module_name nm)
{
SC_METHOD(process);
sensitive<<in0;
}
例 3‐70 : SC_ MODULE の例 4
SC_ MODULE の例 5
SC_MODULE(dut) {
sc_in<int> in0;
sc_out<int>out0;
SC_HAS_PROCESS(dut);
dut(sc_module_name nm)
:sc_module(nm)
{
SC_METHOD(process);
sensitive<<in0;
}
…
};
例 3‐71 : SC_ MODULE の例 5
Vivado HLS では、 合成で SC_THREAD がサポー ト さ れません。
SC_METHOD の使用
例 3-72 は、 SC_METHOD を 使 用 し て 半加算器 を 記述 し た 小規模 な 組み合 わ せデ ザ イ ン の ヘ ッ ダ ー フ ァ イ ル
(sc_combo_method.h) を示 し てい ます。 最上位デザ イ ン名の sc_combo_method は SC_MODULE で指定 さ れてい
ます。
#include <systemc.h>
SC_MODULE(sc_combo_method){
//Ports
sc_in<sc_uint<1> > a,b;
sc_out<sc_uint<1> > sum,carry;
//Process Declaration
void half_adder();
//Constructor
SC_CTOR(sc_combo_method){
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
235
SystemC の合成
//Process Registration
SC_METHOD(half_adder);
sensitive<<a<<b;
}
};
例 3‐72 : SystemC の組み合わせデザ イ ンのヘ ッ ダー フ ァ イ ル
デザ イ ン には、 a と b の 2 つのシ ン グル ビ ッ ト 入力ポー ト が含 ま れ ま す。 SC_METHOD は ど ち ら の入力ポー ト の ス
テー ト の変更に も 影響 さ れ、 half_adder 関数を実行 し ます。 half_adder 関数は sc_combo_method.cpp フ ァ
イ ルで指定 さ れ (例 3-73)、 出力ポー ト のキ ャ リ ー値を計算 し ます。
#include sc_combo_method.h
void sc_combo_method::half_adder(){
bool s,c;
s=a.read() ^ b.read();
c=a.read() & b.read();
sum.write(s);
carry.write(c);
#ifndef __SYNTHESIS__
cout << Sum is << a <<
sc_time_stamp() <<endl;
cout << Car is << a <<
sc_time_stamp() <<endl;
#endif
^
<< b <<
=
<< s << :<<
&
<< b <<
=
<< c << :<<
例 3‐73 : SystemC 組み合わせデザ イ ンの main 関数
例 3-73 は、 __SYNTHESIS__ マ ク ロ を使用 し て、 C シ ミ ュ レーシ ョ ン中に値を表示する ために使用 さ れ る cout 文が
合成 さ れない よ う にす る 方法を示 し てい ます。
SystemC 組み合わせデザイ ンのテ ス ト ベン チ
例 3-73 のテ ス ト ベンチは、 例 3-74 の よ う にな り ます。 こ のテ ス ト ベンチには、 Vivado HLS を使用す る 場合に必要な
重要属性が複数含ま れてい ます。
#ifdef __RTL_SIMULATION__
#include sc_combo_method_rtl_wrapper.h
#define sc_combo_method sc_combo_method_RTL_wrapper
#else
#include sc_combo_method.h
#endif
#include tb_init.h
#include tb_driver.h
int sc_main (int argc , char *argv[])
{
sc_report_handler::set_actions(/IEEE_Std_1666/deprecated, SC_DO_NOTHING);
sc_report_handler::set_actions( SC_ID_LOGIC_X_TO_BOOL_, SC_LOG);
sc_report_handler::set_actions( SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, SC_LOG);
sc_report_handler::set_actions( SC_ID_OBJECT_EXISTS_, SC_LOG);
sc_signal<bool>
s_reset;
sc_signal<sc_uint<1> >
s_a;
sc_signal<sc_uint<1> >
s_b;
sc_signal<sc_uint<1> >
s_sum;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
236
SystemC の合成
sc_signal<sc_uint<1> >
s_carry;
// Create a 10ns period clock signal
sc_clock s_clk(s_clk,10,SC_NS);
tb_init
U_tb_init(U_tb_init);
sc_combo_method
U_dut(U_dut);
tb_driver
U_tb_driver(U_tb_driver);
// Generate a clock and reset to drive the sim
U_tb_init.clk(s_clk);
U_tb_init.reset(s_reset);
// Connect the DUT
U_dut.a(s_a);
U_dut.b(s_b);
U_dut.sum(s_sum);
U_dut.carry(s_carry);
// Drive stimuli from dat* ports
// Capture results at out* ports
U_tb_driver.clk(s_clk);
U_tb_driver.reset(s_reset);
U_tb_driver.dat_a(s_a);
U_tb_driver.dat_b(s_b);
U_tb_driver.out_sum(s_sum);
U_tb_driver.out_carry(s_carry);
// Sim for 200
int end_time = 200;
cout << INFO:Simulating
<< endl;
// start simulation
sc_start(end_time, SC_NS);
if (U_tb_driver.retval != 0) {
printf(Test failed !!!\n);
} else {
printf(Test passed !\n);
}
return U_tb_driver.retval;
};
例 3‐74 : SystemC 組み合わせデザ イ ンのテ ス ト ベ ン チ
Vivado HLS の cosim_design 機能を使用 し て RTL シ ミ ュ レーシ ョ ン を実行す る には、 テ ス ト ベンチに例 3-74 の一
番上に示すマ ク ロ を含め る 必要があ り ます。 デザ イ ン に DUT と い う 名前が付いてい る 場合、 次を使用す る 必要があ
り ます。 DUT は実際のデザ イ ン名に置 き 換え ら れます。
#ifdef __RTL_SIMULATION__
#include DUT_rtl_wrapper.h
#define DUT DUT_RTL_wrapper
#else
#include DUT.h //Original unmodified code
#endif
デザ イ ン ヘ ッ ダー フ ァ イ ルが含まれ る テ ス ト ベンチに追加す る 必要があ り ます。 追加 し ない と 、 cosim_design の
RTL シ ミ ュ レーシ ョ ンでエ ラ ーが発生 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
237
SystemC の合成
推奨 : Vivado HLS で使用 さ れ る すべての SystemC テ ス ト ベンチ フ ァ イ ルに、 レ ポー ト ハン ド ラ ー関数 (例 3-74) を追
加す る 必要があ り ます。
sc_report_handler::set_actions(/IEEE_Std_1666/deprecated, SC_DO_NOTHING);
sc_report_handler::set_actions( SC_ID_LOGIC_X_TO_BOOL_, SC_LOG);
sc_report_handler::set_actions( SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, SC_LOG);
sc_report_handler::set_actions( SC_ID_OBJECT_EXISTS_, SC_LOG);
こ れ ら の設定に よ り 、 RTL シ ミ ュ レーシ ョ ン中に メ ッ セージが過多に表示 さ れ る こ と はな く な り ます。
こ れ ら の メ ッ セージの中で最 も 重要なのは、 次の警告文です。
Warning:(W212) sc_logic value 'X' cannot be converted to bool
合成済みデザ イ ン周辺に配置 さ れ る ア ダプ タ ーは、 未知の値 (X) で開始 さ れ ま す。 すべての SystemC 型で未知の値
(X) がサポー ト さ れ る わけではあ り ません。 こ の警告は、 未知の値 (X) が未知の値を サポー ト し ないデー タ 型に割 り
当て ら れた場合、 ス テ ィ ミ ュ ラ ス がテ ス ト ベンチか ら 適用 さ れ る 前な ど に表示 さ れますが、 通常は無視 し て も 問題あ
り ません。
例 3-74 のテ ス ト ベンチは、 最後に結果のチ ェ ッ ク を実行 し 、
結果が正 し い場合は値 0 を戻 し ます。 こ の場合、 結果は tb_driver 関数内で検証 さ れますが、 戻 り 値はチ ェ ッ ク さ
れた後、 最上位テ ス ト ベンチに戻 さ れます。
if (U_tb_driver.retval != 0) {
printf(Test failed !!!\n);
} else {
printf(Test passed !\n);
}
return U_tb_driver.retval;
SC_MODULES のイ ン ス タ ン シ エー ト
SC_MODULE の階層 イ ン ス タ ン シエーシ ョ ンは合成で き ます (例 3-75)例 3-75 では、 例 3-72 か ら の半加算器デザ イ ン
(sc_combo_method) の 2 つの イ ン ス タ ン ス が全加算器デザ イ ン を作成す る ために イ ン ス タ ン シエーシ ョ ン さ れてい
ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
238
SystemC の合成
#include <systemc.h>
#include sc_combo_method.h
SC_MODULE(sc_hier_inst){
//Ports
sc_in<sc_uint<1> > a, b, carry_in;
sc_out<sc_uint<1> > sum, carry_out;
//Variables
sc_signal<sc_uint<1> > carry1, sum_int, carry2;
//Process Declaration
void full_adder();
//Half-Adder Instances
sc_combo_methodU_1, U_2;
//Constructor
SC_CTOR(sc_hier_inst)
:U_1(U_1)
,U_2(U_2)
{
// Half-adder inst 1
U_1.a(a);
U_1.b(b);
U_1.sum(sum_int);
U_1.carry(carry1);
// Half-adder inst 2
U_2.a(sum_int);
U_2.b(carry_in);
U_2.sum(sum);
U_2.carry(carry2);
//Process Registration
SC_METHOD(full_adder);
sensitive<<carry1<<carry2;
}
};
例 3‐75 : SystemC 階層デザ イ ン 例
full_adder 関数は、 carry_out 信号の ロ ジ ッ ク を作成する ために使用 さ れてい ます (例 3-76)。
#include sc_hier_inst.h
void sc_hier_inst::full_adder(){
carry_out= carry1.read() | carry2.read();
}
例 3‐76 : SystemC の full_adder 関数
SC_CTHREAD の使用
コ ン ス ト ラ ク タ ー プ ロ セ ス の SC_CTHREAD は、 ク ロ ッ ク 付き プ ロ セ ス (ス レ ッ ド ) を記述する ために使用 さ れ、 シー
ケ ン シ ャ ル デザ イ ン を記述す る 主な方法です。 例 3-77 では、 シーケ ン シ ャ ル デザ イ ンの主な属性を示 し てい ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
239
SystemC の合成
•
デー タ には関連す る ハン ド シ ェ イ ク 信号が含まれ る ので、 合成前後に同 じ テ ス ト ベンチを使用 し てデー タ が処理
さ れ る よ う にで き ます。
•
ク ロ ッ ク の SC_CTHREAD は、 関数が実行 さ れ る タ イ ミ ン グ を記述する ために使用 さ れます。
•
SC_CTHREAD では、 リ セ ッ ト 動作がサポー ト さ れます。
#include <systemc.h>
SC_MODULE(sc_sequ_cthread){
//Ports
sc_in <bool> clk;
sc_in <bool> reset;
sc_in <bool> start;
sc_in<sc_uint<16> > a;
sc_in<bool> en;
sc_out<sc_uint<16> > sum;
sc_out<bool> vld;
//Variables
sc_uint<16> acc;
//Process Declaration
void accum();
//Constructor
SC_CTOR(sc_sequ_cthread){
//Process Registration
SC_CTHREAD(accum,clk.pos());
reset_signal_is(reset,true);
}
};
例 3‐77 : SystemC の SC_CTHREAD
例 3-78 は accum 関数を示 し てい ます。 . こ の例では、 次を示 し てい ます。
•
コ ア記述プ ロ セ ス は、 無限の while() ループで、 中に wait() 文が含まれます。
•
変数の初期化は、 無限の while() ループ よ り も 前に実行 さ れます。 こ の コ ー ド は、 リ セ ッ ト が SC_CTHREAD で
認識 さ れ る と 実行 さ れます。
•
デー タ 読み出 し お よ び書 き 込みは、 ハン ド シ ェ イ ク プ ロ ト コ ルで確認 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
240
SystemC の合成
#include sc_sequ_cthread.h
void sc_sequ_cthread::accum(){
//Initialization
acc=0;
sum.write(0);
vld.write(false);
wait();
// Process the data
while(true) {
// Wait for start
while (!start.read()) wait();
// Read if valid input available
if (en) {
acc = acc + a.read();
sum.write(acc);
vld.write(true);
} else {
vld.write(false);
}
wait();
}
}
例 3‐78 : SystemC の SC_CTHREAD 関数
複数ク ロ ッ クの合成
SystemC では、 C お よ び C++ 合成 と は異な り 、 複数 ク ロ ッ ク を使用す る デザ イ ンがサポー ト さ れます。 複数 ク ロ ッ ク
デザ イ ンでは、 各 ク ロ ッ ク に関連す る 機能が SC_CTHREAD で取 り 込まれ る 必要があ り ます。
例 3-79 は 2 つの ク ロ ッ ク (clock お よ び clock2) を含むデザ イ ン を示 し てい ます。
•
ク ロ ッ ク の 1 つは Prc1 関数を実行する SC_CTHREAD を ア ク テ ィ ベー ト す る ために使用 さ れます。
•
も う 1 つは Prc2 関数を実行す る SC_CTHREAD を ア ク テ ィ ベー ト す る ために使用 さ れます。
合成後は、 Prc1 関数に関連す る すべてのシーケ ン シ ャ ル ロ ジ ッ ク に clock が付き 、 clock2 は Prc2 関数のシーケ
ン シ ャ ル ロ ジ ッ ク すべて を駆動 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
241
SystemC の合成
#includesystemc.h
#includetlm.h
using namespace tlm;
SC_MODULE(sc_multi_clock)
{
//Ports
sc_in <bool> clock;
sc_in <bool> clock2;
sc_in <bool> reset;
sc_in <bool> start;
sc_out<bool> done;
sc_fifo_out<int> dout;
sc_fifo_in<int> din;
//Variables
int share_mem[100];
bool write_done;
//Process Declaration
void Prc1();
void Prc2();
//Constructor
SC_CTOR(sc_multi_clock)
{
//Process Registration
SC_CTHREAD(Prc1,clock.pos());
reset_signal_is(reset,true);
SC_CTHREAD(Prc2,clock2.pos());
reset_signal_is(reset,true);
}
};
例 3‐79 : SystemC の複数 ク ロ ッ ク デザ イ ン
通信チ ャ ネル
ス レ ッ ド 、 メ ソ ッ ド 、 モジ ュ ール (ス レ ッ ド お よ び メ ソ ッ ド を含む) 間の通信は、 チ ャ ネルを使用 し てのみ実行す る 必
要があ り ます。 ス レ ッ ド 間の通信には単純な変数は使用で き ません。
異な る プ ロ セ ス (ス レ ッ ド 、 メ ソ ッ ド ) 間の通信には sc_buffer ま たは sc_signal の使用をお勧め し ますが、 最初
の値の読み出 し 前に複数の値が書 き 込まれ る よ う な場合は、 sc_fifo お よ び tlm_fifo を使用で き ます。
sc_fifo お よ び tlm_fifo の場合、 合成では次の メ ソ ッ ド がサポー ト さ れます。
•
ノ ンブ ロ ッ キ ン グの読み出 し /書 き 込み
•
ブ ロ ッ キ ン グの読み出 し /書 き 込み
•
num_available()/num_free()
•
nb_can_put()/nb_can_get()
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
242
SystemC の合成
最上位 SystemC ポー ト
SystemC デザ イ ン に含 ま れ る ポー ト は、 ソ ー ス コ ー ド で指定 さ れ ま す。 C お よ び C++ と 異な り 、 SystemC の場合、
Vivado HLS でサポー ト さ れ る メ モ リ イ ン タ ーフ ェ イ ス で し か イ ン タ ーフ ェ イ ス 合成 し か実行 さ れ ま せん。 詳細は、
177 ページの 「 イ ン タ ーフ ェ イ ス のア レ イ 」 を参照 し て く だ さ い。
最上位 イ ン タ ーフ ェ イ ス のポー ト は、 すべて次のいずれかの型を使用 し てい る 必要があ り ます。
•
sc_in_clk
•
sc_in
•
sc_out
•
sc_inout
•
sc_fifo_in
•
sc_fifo_out
•
ap_mem_if
サポー ト さ れ る メ モ リ イ ン タ ーフ ェ イ ス を除 き 、デザ イ ン と テ ス ト ベンチ間のすべてのハン ド シ ェ イ ク は SystemC 関
数で明示的に記述 し てお く 必要があ り ます。 サポー ト さ れ る メ モ リ イ ン タ ーフ ェ イ ス は、 次の と お り です。
•
sc_fifo_in
•
sc_fifo_out
•
ap_mem_if
Vivado HLS は、 タ イ ミ ン グ要件を満たすために必要であれば、 SystemC デザ イ ンに ク ロ ッ ク サ イ ク ルを追加す る こ
と があ り ます。 合成後の ク ロ ッ ク 数は異な る 可能性があ る ので、 SystemC デザ イ ン ではテ ス ト ベンチを使用 し てすべ
てのデー タ 転送にハン ド シ ェ イ ク 信号を付け る 必要があ り ます。
Vivado HLS では、 TLM 2.0 を使用 し た ト ラ ン ザ ク シ ョ ン レ ベルの記述お よ び イ ベン ト ベー ス の記述は合成ではサ
ポー ト さ れません。
SystemC のイ ン タ ー フ ェ イ ス合成
通常、 Vivado HLS では SystemC の イ ン タ ーフ ェ イ ス合成は実行 さ れませんが、 RAM お よ び FIFO ポー ト な ど の メ モ
リ イ ン タ ーフ ェ イ ス では イ ン タ ーフ ェ イ ス合成がサポー ト さ れ る こ と があ り ます。
RAM ポー ト の合成
C お よ び C++ の合成 と は異な り 、 Vivado HLS はア レ イ ポー ト を RTL の RAM には変換 し ません。 次の SystemC コ ー
ド の場合、Vivado HLS の指示子を使用 し て ア レ イ ポー ト を個々のエ レ メ ン ト にパーテ ィ シ ョ ンする 必要があ り ます。
こ う し ない と 、 こ の コ ー ド は合成で き ません。
SC_MODULE(dut)
{
sc_in<T> in0[N];
sc_out<T>out0[N];
…
SC_CTOR(dut)
{
…
}
};
例 3‐80 : RAM ポー ト の合成 コ ー ド 例
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
243
SystemC の合成
こ れ ら のア レ イ を個々のエ レ メ ン ト にパーテ ィ シ ョ ンする 指示子は、 次の と お り です。
set_directive_array_partition dut in0 -type complete
set_directive_array_partition dut out0 -type complete
N が大き な数の場合は、 RTL イ ン タ ーフ ェ イ ス に多 く の ス カ ラ ー ポー ト が作成 さ れます。
例 3-81 は、RAM イ ン タ ーフ ェ イ ス が SystemC シ ミ ュ レーシ ョ ンで ど の よ う に記述 さ れ、Vivado HLS で完全に合成 さ
れ る か を示 し てい ます。 例 3-81 では、 ア レ イ が RAM ポー ト に合成可能な ap_mem_if 型に置 き 換え ら れてい ます。
•
ap_mem_port 型を使用す る には、 Vivado HLS イ ン ス ト ール デ ィ レ ク ト リ の include/ap_sysc デ ィ レ ク ト リ
にあ る ap_mem_if.h ヘ ッ ダー フ ァ イ ルを含め る 必要があ り ます。
°
•
Vivado HLS 環境では、 include/ap_sysc デ ィ レ ク ト リ が自動的に含まれます。
din お よ び dout のア レ イ は ap_mem_port 型に置 き 換え ら れてい ます。こ の フ ィ ール ド については例 3-81で説
明 し ます
#includesystemc.h
#include ap_mem_if.h
SC_MODULE(sc_RAM_port)
{
//Ports
sc_in <bool> clock;
sc_in <bool> reset;
sc_in <bool> start;
sc_out<bool> done;
//sc_out<int> dout[100];
//sc_in<int> din[100];
ap_mem_port<int, int, 100, RAM_2P> dout;
ap_mem_port<int, int, 100, RAM_2P> din;
//Variables
int share_mem[100];
sc_signal<bool> write_done;
//Process Declaration
void Prc1();
void Prc2();
//Constructor
SC_CTOR(sc_RAM_port)
: dout (dout),
din (din)
{
//Process Registration
SC_CTHREAD(Prc1,clock.pos());
reset_signal_is(reset,true);
SC_CTHREAD(Prc2,clock.pos());
reset_signal_is(reset,true);
}
};
例 3‐81 : SystemC の RAM イ ン タ ー フ ェ イ ス
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
244
SystemC の合成
ap_mem_port 型の フ ォーマ ッ ト は、 次の と お り です。
ap_mem_port (<data_type>, < address_type>, <number_of_elements>, <Mem_Target>)
•
data_type は格納 さ れたデー タ エ レ メ ン ト に使用 さ れ る デー タ 型です。 例 3-81 では、 こ れ ら は標準の int 型で
す。
•
address_type はア ド レ ス バ ス に使用 さ れ る デー タ 型です。 こ のデー タ 型には、 ア レ イ 内のすべてのエ レ メ ン
ト を ア ド レ ス指定す る のに十分なデー タ ビ ッ ト が含まれ る 必要があ り ます。 含まれない場合、 C シ ミ ュ レーシ ョ
ンでエ ラ ーにな り ます。
•
number_of_elements は記述 さ れ る ア レ イ に含まれ る エ レ メ ン ト 数を指定 し ます。
•
Mem_Target は、 こ のポー ト を接続す る メ モ リ を指定す る ので、 最終
能な タ ーゲ ッ ト の リ ス ト は、 表 3-6を参照 し て く だ さ い。
RTL の I/O ポー ト を決定 し ます。 使用可
表 3-6 の メ モ リ タ ーゲ ッ ト は、 合成で作成 さ れ る ポー ト と デザ イ ン内での操作の ス ケ ジ ュ ール方法に影響 し ます。 た
と えば、 デ ュ アル ポー ト RAM の場合、 次の よ う にな り ます。
•
I/O ポー ト 数はシ ン グル ポー ト RAM の 2 倍にな り ます。
•
内部操作が並列で実行 さ れ る よ う に ス ケ ジ ュ ールで き る こ と があ り ます
コ ー ド コ ン ス ト ラ ク ト で許容 さ れ る 場合のみ)。
( ループお よ びデー タ 依存性の よ う な
表 3‐6 : SystemC の ap_mem_port の メ モ リ タ ーゲ ッ ト
タ ーゲ ッ ト
RAM
説明
RAM_1P
シ ン グル ポー ト RAM
RAM_2P
デ ュ アル ポー ト RAM
RAM_T2P
入力お よ び出力の両方で読み出 し ポー ト と 書 き 込みポー ト の両方をサポー ト す る デ ュ アル ポー ト
RAM
ROM_1P
シ ン グル ポー ト ROM
ROM_2P
デ ュ アル ポー ト ROM
ap_mem_port が イ ン タ ーフ ェ イ ス で定義 さ れ る と 、 変数はほかのア レ イ と 同 じ 方法で コ ー ド か ら ア ク セ ス さ れ る よ
う にな り ます。
dout[i] = share_mem[i] + din[i];
例 3-81 をサポー ト す る テ ス ト ベンチは、例 3-82 の よ う にな り ます。ap_mem_port 型はテ ス ト ベンチの ap_mem_chn
型でサポー ト さ れ る 必要があ り ます。 ap_mem_chn 型は ap_mem_if.h ヘ ッ ダー フ ァ イ ルで定義 さ れ ます。 サポー
ト さ れ る フ ィ ール ド は、 ap_mem_port と 同 じ です。
SystemC の RAM イ ン タ ー フ ェ イ スのテ ス ト ベン チ
#ifdef __RTL_SIMULATION__
#include sc_RAM_port_rtl_wrapper.h
#define sc_RAM_port sc_RAM_port_RTL_wrapper
#else
#include sc_RAM_port.h
#endif
#include tb_init.h
#include tb_driver.h
#include ap_mem_if.h
int sc_main (int argc , char *argv[])
{
sc_report_handler::set_actions(/IEEE_Std_1666/deprecated, SC_DO_NOTHING);
sc_report_handler::set_actions( SC_ID_LOGIC_X_TO_BOOL_, SC_LOG);
sc_report_handler::set_actions( SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, SC_LOG);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
245
SystemC の合成
sc_report_handler::set_actions( SC_ID_OBJECT_EXISTS_, SC_LOG);
sc_signal<bool>
s_reset;
sc_signal<bool>
s_start;
sc_signal<bool>
s_done;
ap_mem_chn<int,int, 100, RAM_2P> dout;
ap_mem_chn<int,int, 100, RAM_2P> din;
// Create a 10ns period clock signal
sc_clock s_clk(s_clk,10,SC_NS);
tb_init
sc_RAM_port
tb_driver
U_tb_init(U_tb_init);
U_dut(U_dut);
U_tb_driver(U_tb_driver);
// Generate a clock and reset to drive the sim
U_tb_init.clk(s_clk);
U_tb_init.reset(s_reset);
U_tb_init.done(s_done);
U_tb_init.start(s_start);
// Connect the DUT
U_dut.clock(s_clk);
U_dut.reset(s_reset);
U_dut.done(s_done);
U_dut.start(s_start);
U_dut.dout(dout);
U_dut.din(din);
// Drive inputs and Capture outputs
U_tb_driver.clk(s_clk);
U_tb_driver.reset(s_reset);
U_tb_driver.start(s_start);
U_tb_driver.done(s_done);
U_tb_driver.dout(dout);
U_tb_driver.din(din);
// Sim
int end_time = 1100;
cout << INFO:Simulating
<< endl;
// start simulation
sc_start(end_time, SC_NS);
if (U_tb_driver.retval != 0) {
printf(Test failed !!!\n);
} else {
printf(Test passed !\n);
}
return U_tb_driver.retval;
};
例 3‐82 : SystemC の RAM イ ン タ ー フ ェ イ スのテ ス ト ベ ン チ
FIFO ポー ト の合成
最上位 イ ン タ ーフ ェ イ ス の FIFO ポー ト は、 標準 SystemC の sc_fifo_in お よ び sc_fifo_out ポー ト か ら 直接合
成で き ます。 例 3-83 は、 イ ン タ ーフ ェ イ ス で FIFO ポー ト を使用する 例を示 し てい ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
246
SystemC の合成
合成後、 各 FIFO ポー ト にはデー タ ポー ト お よ び次の よ う な関連す る FIFO 制御信号が含まれます。
•
入力には empty お よ び read ポー ト
•
出力には full お よ び write ポー ト
FIFO を使用す る と 、 デー タ 転送を同期す る のに必要なハン ド シ ェ イ ク が RTL テ ス ト ベンチに追加 さ れます。
#includesystemc.h
#includetlm.h
using namespace tlm;
SC_MODULE(sc_FIFO_port)
{
//Ports
sc_in <bool> clock;
sc_in <bool> reset;
sc_in <bool> start;
sc_out<bool> done;
sc_fifo_out<int> dout;
sc_fifo_in<int> din;
//Variables
int share_mem[100];
bool write_done;
//Process Declaration
void Prc1();
void Prc2();
//Constructor
SC_CTOR(sc_FIFO_port)
{
//Process Registration
SC_CTHREAD(Prc1,clock.pos());
reset_signal_is(reset,true);
SC_CTHREAD(Prc2,clock.pos());
reset_signal_is(reset,true);
}
};
例 3‐83 : SystemC の FIFO イ ン タ ー フ ェ イ ス
サポー ト さ れない SystemC コ ン ス ト ラ ク ト
モ ジ ュ ールおよび コ ン ス ト ラ ク タ ー
•
SC_MODULE は別の SC_MODULE 内にはネ ス ト で き ません。
•
SC_MODULE は別の SC_MODULE か ら は派生で き ません。
•
Vivado HLS では、 SC_THREAD がサポー ト さ れません。
•
ク ロ ッ ク 付 き バージ ョ ンの SC_CTHREAD はサポー ト さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
247
SystemC の合成
モ ジ ュ ールのイ ン ス タ ン シ エーシ ョ ン
SC_MODULE は new を使用 し て イ ン ス タ ン シエー ト で き ま せん。 「モジ ュ ールの イ ン ス タ ン シエーシ ョ ン の例 1」 の
コ ー ド (SC_MODULE(TOP) は 「モジ ュ ールの イ ン ス タ ン シエーシ ョ ンの例 2」 の よ う に変更する 必要があ り ます。
{
sc_in<T> din;
sc_out<T> dout;
M1 *t0;
SC_CTOR(TOP){
t0 = new M1(t0);
t0->din(din);
t0->dout(dout);
}
}
例 3‐84 : モ ジ ュ ールの イ ン ス タ ン シ エー シ ョ ン の例 1
SC_MODULE(TOP)
{
sc_in<T> din;
sc_out<T> dout;
M1 t0;
SC_CTOR(TOP)
: t0(“t0”)
{
t0.din(din);
t0.dout(dout);
}
}
例 3‐85 : モ ジ ュ ールの イ ン ス タ ン シ エー シ ョ ン の例 2
モ ジ ュ ールの コ ン ス ト ラ ク タ ー
モジ ュ ール コ ン ス ト ラ ク タ ー と 一緒に使用で き る のは name パ ラ メ ー タ ーのみです。デー タ 型 int の変数 temp には
次を渡す こ と がで き ません。 次に例を示 し ます。
SC_MODULE(dut) {
sc_in<int> in0;
sc_out<int>out0;
int var;
SC_HAS_PROCESS(dut);
dut(sc_module_name nm, int temp)
:sc_module(nm),var(temp)
{ …
}
};
例 3‐86 : モ ジ ュ ール コ ン ス ト ラ ク タ ーの コ ー ド 例
仮想関数
Vivado HLS では、 仮想関数がサポー ト さ れません。 た と えば、 次の コ ー ド は仮想関数を使用 し てい る ので、 合成で き
ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
248
SystemC の合成
SC_MODULE(DUT)
{
sc_in<int> in0;
sc_out<int>out0;
virtual int foo(int var1)
{
return var1+10;
}
void process()
{
int var=foo(in0.read());
out0.write(var);
}
…
};
例 3‐87 : 仮想関数の コ ー ド 例
最上位イ ン タ ー フ ェ イ ス ポー ト
Vivado HLS では sc_out ポー ト の読み出 し がサポー ト さ れません。 た と えば、 次の コ ー ド は、 out0 に読み出 し があ
る ため、 サポー ト さ れません。
SC_MODULE(DUT)
{
sc_in<T> in0;
sc_out<T>out0;
…
void process()
{
int var=in0.read()+out0.read();
out0.write(var);
}
};
例 3‐88 : 最上位 イ ン タ ー フ ェ イ ス ポー ト の コ ー ド 例
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
249
C ライブラ リ
C ライブラ リ
Vivado HLS の C ラ イ ブ ラ リ を使用す る と 、共通のハー ド ウ ェ ア デザ イ ン コ ン ス ト ラ ク ト を C で簡単に記述 し て RTL
に合成で き ます。
•
Vivado HLS の math ラ イ ブ ラ リ
250 ページの 「Vivado HLS の math ラ イ ブ ラ リ 」 (hls_math.h) には、 標準 C/C++ math.h ラ イ ブ ラ リ で最 も よ く
使用 さ れ る 関数の合成可能なバージ ョ ンが含まれてい ます。
•
Vivado HLS の video ラ イ ブ ラ リ
257 ページの 「Vivado HLS の video ラ イ ブ ラ リ 」 (hls_video.h) には、 ビデオ アルゴ リ ズ ムが C で さ ら に簡単
に取 り 込まれ る よ う にす る ビデオ デー タ 型 と ク ラ ス が含まれます。
Vivado HLS には、 C で簡単に記述 し て RTL に合成で き る よ う 、 共通のハー ド ウ ェ ア デザ イ ン構文を含む C ラ イ ブ ラ
リ が多 く 含まれてい ます。 こ のセ ク シ ョ ンでは次の C ラ イ ブ ラ リ について説明 し ます。
• hls_math.h ラ イ ブ ラ リ
• hls_video.h ラ イ ブ ラ リ
• hls_fft.h ラ イ ブ ラ リ
• hls_fir.h ラ イ ブ ラ リ
hls_math.h ラ イ ブ ラ リ には、 標準 C/C++ math.h ラ イ ブ ラ リ で最 も よ く 使用 さ れ る 関数の合成可能なバージ ョ ン
が含まれてい ます。
hls_video.h ラ イ ブ ラ リ には、 ビデオ アルゴ リ ズ ムが C で さ ら に簡単に取 り 込ま れ る よ う にす る ビデオ デー タ 型 と ク
ラ ス が含まれます。
hls_fft.h お よ び hls_fir.h ラ イ ブ ラ リ を使用す る と 、ザ イ リ ン ク ス FFT お よ び FIR IP ブ ロ ッ ク を C デザ イ ン内
で使用で き る よ う にな り ます。 こ れ ら の ラ イ ブ ラ リ には、 ザ イ リ ン ク ス IP と ま っ た く 同 じ 機能を持つ コ ン フ ィ ギ ュ
レーシ ョ ン可能な C 関数が含まれ、 RTL がザ イ リ ン ク ス IP ブ ロ ッ ク を使用 し て イ ンプ リ メ ン ト さ れ る よ う にな っ て
い ます。
Vivado HLS の math ラ イ ブ ラ リ
Vivado HLS の math ラ イ ブ ラ リ (hls_math.h) は、 標準 C (math.h) お よ び C++ (cmath.h) ラ イ ブ ラ リ の浮動小数点
関数の合成をサポー ト す る ために提供 さ れてい ます。
251 ページの表 3-7 は、 合成 さ れ る math.h ま たは cmath.h の関数を リ ス ト し てい ます。 こ れ ら の関数の中には、 浮
動小数点 LogicCORE を使用 し て イ ンプ リ メ ン ト さ れ る も の も あ り ます。 それ以外は、 hls_math.h ラ イ ブ ラ リ を使
用 し 、 ビ ッ ト 概算 イ ンプ リ メ ン テーシ ョ ン と し て イ ンプ リ メ ン ト さ れます。
•
ビ ッ ト 概算 イ ンプ リ メ ン テーシ ョ ンには、 標準動作 と 同 じ 精度はあ り ません。 精度はほ と ん ど の動作範囲で通常
1 ULP (Unit in the Last Place) 以内にな り ますが、 100 ULP ま でにな る 可能性 も あ り ます。
•
ULP は、 浮動小数点が どれだけ正確か を計測す る 単位です。 ULP が 1 の場合、 結果が最終的な 2 進数ビ ッ ト での
演算 さ れた正確な回答 と は異な る 可能性があ り ます。 次に注意 し て く だ さ い。
•
°
浮動小数点の数値を使用す る と 、 最終的な 2 進数ビ ッ ト は値 1 ま たは 0 にな ら ず、 正確な値は指数の値に
よ っ て異な り ます。
°
通常 1 ULP は、 相対的なエ ラ ーがかな り 少ない こ と を意味 し ます。
ビ ッ ト 概算 イ ンプ リ メ ン テーシ ョ ンでは、 C/C++ バージ ョ ン と は異な る 下位アルゴ リ ズ ム を使用 し て結果が達成
さ れ る こ と があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
250
C ライブラ リ
表 3-7 に リ ス ト さ れていない math.h ま たは cmath.h ラ イ ブ ラ リ の関数は合成で き ません。 こ の場合、 エ ラ ー メ ッ
セージが表示 さ れて Vivado HLS が停止 し ます。
hls_math.h ラ イ ブ ラ リ は、 合成が実行 さ れ る と Vivado HLS か ら 呼び出 さ れます。 オプシ ョ ン で ソ ース に含め る こ
と も で き ます。 hls_math.h ラ イ ブ ラ リ を含めた場合 と 含めない場合の違いは、 C シ ミ ュ レーシ ョ ン結果に表れま
す。 こ れについては、 こ のセ ク シ ョ ンの後半で説明 し ます。
•
表 3-7 の浮動小数点 C 関数の場合、 その関数の倍精度バージ ョ ンはあ り ません。 サポー ト については表 3-7 で
「該当な し 」 と 記載 さ れてい ます。
•
精度 (ULP) の列には、 演算子入力値の範囲全体での最小か ら 最大の精度の差異が リ ス ト さ れてい ます。
表 3‐7 : math.h ‐ ビ ッ ト 概算のサポー ト さ れる関数
関数
浮動小数点
倍精度
精度 (ULP)
イ ン プ リ メ ン テーシ ョ ン形
式
abs
サポー ト あ り
サポー ト あ り
正確
合成済み
atanf
サポー ト あ り
該当な し
2
合成済み
ceil
サポー ト あ り
サポー ト あ り
正確
合成済み
ceilf
サポー ト あ り
該当な し
正確
合成済み
copysign
サポー ト あ り
サポー ト あ り
正確
合成済み
copysignf
サポー ト あ り
該当な し
正確
合成済み
cos
サポー ト あ り
サポー ト あ り
10
合成済み
cosf
サポー ト あ り
該当な し
1
合成済み
coshf
サポー ト あ り
該当な し
4
合成済み
exp
サポー ト あ り
サポー ト あ り
正確
LogiCore
expf
サポー ト あ り
該当な し
正確
LogiCore
fabs
サポー ト あ り
サポー ト あ り
正確
合成済み
fabsf
サポー ト あ り
該当な し
正確
合成済み
floorf
サポー ト あ り
該当な し
正確
合成済み
fmax
サポー ト あ り
サポー ト あ り
正確
合成済み
fmin
サポー ト あ り
サポー ト あ り
正確
合成済み
logf
サポー ト あ り
該当な し
1
合成済み
floor
サポー ト あ り
サポー ト あ り
正確
合成済み
fpclassify
サポー ト あ り
サポー ト あ り
正確
合成済み
isfinite
サポー ト あ り
サポー ト あ り
正確
合成済み
isinf
サポー ト あ り
サポー ト あ り
正確
合成済み
isnan
サポー ト あ り
サポー ト あ り
正確
合成済み
isnormal
サポー ト あ り
サポー ト あ り
正確
合成済み
log
サポー ト あ り
サポー ト あ り
浮動小数点の場合
は 1、 倍精度の場
合は 16
合成済み
log10
サポー ト あ り
サポー ト あ り
浮動小数点の場合
は 2、 倍精度の場
合は 3
合成済み
modf
サポー ト あ り
サポー ト あ り
正確
合成済み
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
251
C ライブラ リ
表 3‐7 : math.h ‐ ビ ッ ト 概算のサポー ト さ れる関数 (続き)
関数
浮動小数点
倍精度
精度 (ULP)
イ ン プ リ メ ン テーシ ョ ン形
式
modff
サポー ト あ り
該当な し
正確
合成済み
1/x (逆数)
サポー ト あ り
サポー ト あ り
正確
LogiCORE IP
recip
サポー ト あ り
サポー ト あ り
1
合成済み
recipf
サポー ト あ り
該当な し
1
合成済み
round
サポー ト あ り
サポー ト あ り
正確
合成済み
rsqrt
サポー ト あ り
サポー ト あ り
1
合成済み
rsqrtf
サポー ト あ り
該当な し
1
合成済み
1/sqrt (逆数 sqrt)
サポー ト あ り
サポー ト あ り
正確
LogiCORE IP
signbit
サポー ト あ り
サポー ト あ り
正確
合成済み
sin
サポー ト あ り
サポー ト あ り
10
合成済み
sincos
サポー ト あ り
サポー ト あ り
浮動小数点の場合
は 1、 倍精度の場
合は 5
合成済み
sincosf
サポー ト あ り
該当な し
1
合成済み
sinf
サポー ト あ り
該当な し
1
合成済み
sinhf
サポー ト あ り
該当な し
6
合成済み
sqrt
サポー ト あ り
サポー ト あ り
正確
LogiCORE IP
tan
サポー ト あ り
サポー ト あ り
20
合成済み
tanf
サポー ト あ り
該当な し
3
合成済み
trunc
サポー ト あ り
サポー ト あ り
正確
合成済み
表 3-7 に含まれ る 次の 7 つの関数を コ ンパ イ ルす る ために使用 さ れ る C 標準に よ っ て、 結果は異な り ます。
•
copysign
•
fpclassify
•
isinf
•
isfinite
•
isnan
•
isnormal
•
signbit
C90 モー ド
isinf、 isnan、 お よ び copysign だけは、 通常シ ス テ ム ヘ ッ ダー フ ァ イ ルで提供 さ れ、 倍精度で動作 し ます。 特
に copysign は常に倍精度の結果を戻 し ます。 こ れに よ り 、 浮動小数点を戻 さ なければいけない場合、 double-to-float
変換ブ ロ ッ ク がハー ド ウ ェ アに導入 さ れ る ので、 合成後で予想外の結果にな っ て し ま う こ と があ り ます。
C99 モー ド (‐std=c99)
7 つの関数はすべて、シ ス テ ム ヘ ッ ダー フ ァ イ ルに よ り __isnan(double) お よ び __isnan(float) に リ ダ イ レ
ク ト さ れ る と い う 予測の元提供 さ れてい ます。 通常の GCC フ ァ イ ルは isnormal を リ ダ イ レ ク ト は し ませんが、 そ
れを fpclassify を使用 し て イ ンプ リ メ ン ト し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
252
C ライブラ リ
math.h を使用 し た C++
7 つの関数はすべて、 通常シ ス テ ム ヘ ッ ダー フ ァ イ ルで提供 さ れ、 倍精度で動作 し ます。
copysign は常に倍精度の結果を戻 し ます。 こ れに よ り 、 浮動小数点を戻 さ なければいけない場合、 double-to-float 変
換ブ ロ ッ ク がハー ド ウ ェ アに導入 さ れ る ので、 合成後で予想外の結果にな っ て し ま う こ と があ り ます。
cmath を使用 し た C++
C99 モー ド (-std=c99) と 同様ですが、 次の点が異な り ます。
°
シ ス テ ム ヘ ッ ダー フ ァ イ ルは通常異な り ます。
°
関数は、 次の場合適切にオーバー ロ ー ド さ れます。
-
float()snan(double)
-
isinf(double)
copysign お よ び copysignf は 「using namespace std;」 の場合で も ビル ト イ ン と し て処理 さ れます。
cmath お よ び namespace std を使用 し た C++
問題な し 。 最適な結果 と な る ので、 次の使用をお勧め し ます。
•
C の場合は -std=c99
•
C お よ び C++ の場合は -fno-builtin
シ ミ ュ レーシ ョ ンの違い
シ ミ ュ レーシ ョ ンの結果は、 複数の要因に よ っ て異な り ます。
•
演算が LogiCORE を使用 し て イ ンプ リ メ ン ト さ れ る よ う な場合はすべて、C シ ミ ュ レーシ ョ ン と RTL シ ミ ュ レー
シ ョ ンの結果は同 じ にな り ます。
•
math.h お よ び cmath.h ラ イ ブ ラ リ が使用 さ れ る 場合、RTL シ ミ ュ レーシ ョ ンの結果は表 2-3 の C シ ミ ュ レー
シ ョ ンの結果 と は精度 (ULP) が違 う ので異な り ます。
•
hls_math.h ラ イ ブ ラ リ が C コ ー ド に含まれ る と 、 C シ ミ ュ レーシ ョ ン と RTL シ ミ ュ レーシ ョ ンはすべての場
合で一致 し ます。 ま た、 math.h お よ び cmath.h ラ イ ブ ラ リ が コ ー ド に含まれた ま ま で も 、 Vivado HLS イ ン ス
ト ール デ ィ レ ク ト リ (src デ ィ レ ク ト リ ) か ら lib_hlsm.cpp フ ァ イ ルをプ ロ ジ ェ ク ト に追加す る と 、同 じ 結果
にな り ます。
こ れについては、 表 3-8 に ま と めてい ます。
表 3‐8 : シ ミ ュ レーシ ョ ン結果の違い
hls_math.h
math.h または cmath.h
math.h または cmath.h (lib_hls.cpp 含
有)
C 検証
結果 A
結果 C
結果 C
RTL シ ミ ュ レ ー
ション
結果 B
結果 C
結果 C
例 3-89 は、 次の関数を使用 し た C++ デザ イ ン を示 し てい ます。
•
sinf
•
cosf
•
sqrtf
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
253
C ライブラ リ
例 3-89 は、 Vivado HLS でのデザ イ ンの合成方法 と その合成前 と 合成後の結果が どれ く ら い違 う か を示 し てい ます。
#include cpp_math.h
data_t cpp_math(data_t angle) {
data_t s = sinf(angle);
data_t c = cosf(angle);
return sqrtf(s*s+c*c);
}
例 3‐89 : コ ー ド 例
ヘ ッ ダー フ ァ イ ル cpp_math.h には、 次が含まれます。
•
cmath ラ イ ブ ラ リ の呼び出 し
注記 : math.h は C で使用
•
標準の名前空間 (namespace) の使用
•
デー タ 型 data_t を float 型 と し て定義
#include <cmath>
#include <fstream>
#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
typedef float data_t;
data_t cpp_math(data_t angle);
例 3‐90 : コ ー ド 例
テ ス ト ベンチでは、 結果が合成前シ ミ ュ レーシ ョ ン で検証 さ れ ますが、 エ ラ ーは合成後の RTL シ ミ ュ レーシ ョ ン で
を戻 さ れます。 詳細は、 256 ページの 「 よ く あ る 合成エ ラ ー」 を参照 し て く だ さ い。
#include cpp_math.h
int main() {
ofstream result;
data_t angle = 0.01;
data_t output;
int retval=0;
result.open(result.dat);
// Persistent manipulators
result << right << fixed << setbase(10) << setprecision(15);
for (data_t i = 0; i <= 250; i++)
{
output = cpp_math(angle);
result
result
result
result
<<
<<
<<
<<
setw(10) << i;
setw(20) << angle;
setw(20) << output;
endl;
angle = angle + .1;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
254
C ライブラ リ
}
result.close();
// Compare the results file with the golden results
retval = system(diff --brief -w result.dat result.golden.dat);
if (retval != 0) {
printf(Test failed !!!\n);
retval=1;
} else {
printf(Test passed !\n);
}
// Return 0 if the test passes
return retval;
}
例 3‐91 : コ ー ド 例
テ ス ト ベンチは result.dat の出力結果 と result.golden.dat の予測 さ れ る デー タ 値を比較 し ます。
合成後、 math.h 関数の RTL イ ン プ リ メ ン テーシ ョ ンはその関数の ビ ッ ト 概算バージ ョ ン なので、 RTL シ ミ ュ レー
シ ョ ンで出力 さ れ る result.dat フ ァ イ ルは予測 さ れ る 結果 と は異な る 可能性があ り ます。
Vivado HLS は次のプ ロ ジ ェ ク ト 下位 デ ィ レ ク ト リ の RTL シ ミ ュ レーシ ョ ン を実行 し ます。
<SOLUTION>/sim/<HDL>
説明 :
•
SOLUTION は ソ リ ュ ーシ ョ ンの名前
•
HDL は RTL シ ミ ュ レーシ ョ ン用に選択 さ れた HDL の タ イ プ
た と えば、 プ ロ ジ ェ ク ト を次の よ う に設定 し た と し ます。
•
プ ロ ジ ェ ク ト 名は proj_cpp_math.prj
•
ソ リ ュ ーシ ョ ンは solution1
•
RTL は systemc を使用 し てシ ミ ュ レーシ ョ ン
RTL シ ミ ュ レーシ ョ ンの出力は proj_cpp_math.prj/solution1/sim/ systemc/results.dat フ ァ イ ルに保
存
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
255
C ライブラ リ
図 3-8は、 合成前の result.dat フ ァ イ ル と 合成後の RTL の result.dat フ ァ イ ルの比較を示 し てい ます。 出力値
は 3 列目に表示 さ れてい ます。
X-Ref Target - Figure 3-8
図 3‐8 : 合成前後のシ ミ ュ レーシ ョ ンの違い
こ の こ のアルゴ リ ズ ム と テ ス ト ベンチでは、 合成前の合成後のシ ミ ュ レーシ ョ ン結果は小数点分異な り ます。 こ れ ら
の小数点部分を最終 RTL イ ンプ リ メ ン テーシ ョ ンで使用す る か ど う かは、 ユーザーが決定す る 必要があ り ます。
こ れ ら の違いを処理す る のに推奨 さ れ る フ ロ ーは、 結果をチ ェ ッ ク し てエ ラ ーの許容範囲内に収ま る か ど う か を確認
す る テ ス ト ベンチを使用す る フ ロ ーです。
•
math.h お よ び cmath.h ラ イ ブ ラ リ を ( こ の例の場合の よ う に) 使用す る 場合は、 精度の違いが許容範囲か ど う
か を確認 し ます。
•
ま たは、 hls_math.h を使用す る よ う に関数を変換 し 、 こ れ ら の結果 と math.h ま たは cmath.h を使用 し た場合の
結果 と の相違点を確認 し ます。
浮動小数点お よ び倍精度の演算お よ び関数を使用す る 場合は、 範囲を使用 し て結果を確認す る こ と をお勧め し ます。
結果を絶対比較す る と エ ラ ーにな る こ と が よ く あ り ます。同様の (ま っ た く 同 じ ではない) 方法で計算 し た 2 セ ッ ト の
結果を C コ ー ド で比較 し た場合です ら 、 エ ラ ーにな る こ と があ り ます。
よ く あ る合成エ ラ ー
次は math 関数を合成す る 際に よ く 発生する 使用エ ラ ーです。 こ れ ら は math 関数の合成の利点を生かすために、 C 関
数を C++ 関数へ変換 し た場合に よ く 発生 し ます。
C++ の cmath.h
C++ の cmath.h ヘ ッ ダー フ ァ イ ルが使用 さ れ る と 、 浮動小数点関数 (sinf お よ び cosf な ど) が使用で き ます。 こ
れ ら はハー ド ウ ェ アで 32 ビ ッ ト 演算にな り ま す。 cmath.h ヘ ッ ダー フ ァ イ ルは標準関数 (sin、 cos な ど) も オー
バー ロ ー ド す る ので、 float お よ び double 型に も 使用で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
256
C ライブラ リ
C の math.h
C の math.h ラ イ ブ ラ リ が使用 さ れ る 場合は、32 ビ ッ ト の浮動小数点演算を合成す る ために、浮動小数点関数 (sinf、
cosf な ど) が必要です。 すべての標準関数呼び出 し (sin、 cos な ど) は合成 さ れ る と 倍精度お よ び 64 ビ ッ ト の倍精
度演算にな り ます。
注意
math.h サポー ト の利点 を生かすために C 関数 を C++ に変換す る 場合は、 Vivado HLS で合成す る 前に新 し い C++
コ ー ド が正 し く コ ンパ イ ル さ れ る よ う にす る 必要があ り ます。 た と えば、 sqrtf() が math.h と 一緒に コ ー ド で使
用 さ れ る 場合は、 それをサポー ト す る ために次の コ ー ド を C++ コ ー ド に追加す る 必要があ り ます。
C float sqrtf(float);
183 ページの 「float お よ び double 型」 に示 し た よ う に、 double お よ び float 型の混合に関す る 警告 メ ッ セージに従っ
て、 型変換に よ っ て不必要なハー ド ウ ェ アが作成 さ れない よ う に し ます。
Vivado HLS の video ラ イ ブ ラ リ
Vivado HLS ビデオ ラ イ ブ ラ リ には、hls_video.h ヘ ッ ダー フ ァ イ ルを使用する 必要があ り ます。こ のヘ ッ ダー フ ァ
イ ルには、 Vivado HLS で提供 さ れ る すべての イ メ ージお よ びビデオ プ ロ セ ス専用の ビデオ型お よ び関数が含ま れま
す。
Vivado HLS video ラ イ ブ ラ リ を使用す る 場合、 次の要件 も 満た し てい る 必要があ り ます。
•
デザ イ ンが C++ で記述 さ れて hls namespace が使用 さ れてい る 必要があ り ます。
#include <hls_video.h>
hls::rgb_8 video_data[1920][1080]
ま たは
•
型お よ び ク ラ ス が ス コ ープ付 き の名前を使用 し てい る 必要があ り ます。
#include <hls_video.h>
using namespace hls;
rgb_8 video_data[1920][1080]
video ラ イ ブ ラ リ には、 ビデオ デザ イ ン を C++ で記述す る のに役立つ関数が複数含まれ ます。 こ のセ ク シ ョ ン では、
次の点について説明 し ます。
•
デー タ 型
•
メ モ リ ラ イ ン バッ フ ァー
•
メモリ ウ ィンドウ
•
ビデオ関数
デー タ 型
ラ イ ブ ラ リ には、 次のデー タ 型が含まれます。 すべてのデー タ 型で 8 ビ ッ ト デー タ のみがサポー ト さ れます。
表 3‐9 : ビデオ デー タ 型
デー タ 型名
フ ィ ール ド 0 (8 ビ ッ ト ) フ ィ ール ド 1 (8 ビ ッ ト ) フ ィ ール ド 2 (8 ビ ッ ト ) フ ィ ール ド 3 (8 ビ ッ ト )
yuv422_8
Y
UV
使用な し
使用な し
yuv444_8
Y
U
V
使用な し
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
257
C ライブラ リ
表 3‐9 : ビデオ デー タ 型
デー タ 型名
フ ィ ール ド 0 (8 ビ ッ ト ) フ ィ ール ド 1 (8 ビ ッ ト ) フ ィ ール ド 2 (8 ビ ッ ト ) フ ィ ール ド 3 (8 ビ ッ ト )
rgb_8
G
B
R
使用な し
yuva422_8
Y
UV
a
使用な し
yuva444_8
Y
U
V
a
rgba_8
G
B
R
a
yuva420_8
Y
aUV
使用な し
使用な し
yuvd422_8
U
UV
D
使用な し
yuvd444_8
Y
U
V
D
rgbd_8
G
B
R
D
bayer_8
RGB
使用な し
使用な し
使用な し
luma_8
Y
使用な し
使用な し
使用な し
C コー ド例
hls_video.h ラ イ ブ ラ リ が含まれ、 hls namespace が定義 さ れ る と 、 例 3-5 165 ページの 「テ ス ト ベンチお よ び最上
位デザ イ ン」 に リ ス ト さ れ る デー タ 型を自由に使用で き る よ う にな り ます。
#include <hls_video.h>
using namespace hls;
rgb_8 video_data[1920][1080]
例 3‐92 : コ ー ド 例
メ モリ ラ イン バッ フ ァー
linebuffer ク ラ ス は、 ユーザーのアルゴ リ ズ ム コ ー ド 内で ラ イ ン バ ッ フ ァ ーを簡単に宣言お よ び管理可能にす る C++
ク ラ ス です。 こ の ク ラ ス には、 ラ イ ン バ ッ フ ァ を イ ン ス タ ン シエー ト お よ び操作す る ために必要な メ ソ ッ ド がすべて
含まれます。 linebuffer ク ラ ス は、 すべてのデー タ 型で使用で き ます。
linebuffer ク ラ ス の主な機能は、 次の と お り です。
•
パ ラ メ ー タ ー指定に よ る すべてのデー タ 型のサポー ト
•
ユーザー定義の行数お よ び列数
•
メ モ リ のバン ド 幅を増加す る ために行を別々の メ モ リ バン ク へ自動的にバン キ ン グ
•
アルゴ リ ズ ム デザ イ ンの ラ イ ン バ ッ フ ァ ーの使用お よ びデバ ッ グ をす る メ ソ ッ ド すべて を提供
linebuffer ク ラ ス には、 次の メ ソ ッ ド が含まれます。
•
print()
•
shift_up();
•
shift_down()
•
insert_bottom()
•
insert_top()
•
getval(row,column)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
258
C ライブラ リ
linebuffer の使用方法を説明す る ため、 すべての例の最初に次のデー タ セ ッ ト が使用 さ れます。
表 3‐10 : linebuffer 例のデー タ セ ッ ト
列0
列1
列2
列3
列4
行2
1
2
3
4
5
行1
6
7
8
9
10
行0
11
12
13
14
15
ラ イ バ ッ フ ァ ーの宣言
ラ イ ン バ ッ フ ァ ーは、 次のデー タ 型を使用 し て アルゴ リ ズ ムに イ ン ス タ ン シエー ト で き ます。
hls::linebuffer<type, rows, columns>
表 3-10 のデー タ を保持す る ラ イ ン バ ッ フ ァ ーは、 次の よ う に宣言で き ます。
hls::linebuffer<char,3,5> Buff_A;
ラ イ ン バ ッ フ ァ ーの内容の表示
linebuffer ク ラ ス には、 ラ イ ン バ ッ フ ァ ーに格納 さ れ る デー タ を表示す る ために print メ ソ ッ ド が含まれます。 ラ イ ン
バ ッ フ ァ ーには多数の列を含め る こ と がで き る ので、 print メ ソ ッ ド を使用する と 、 開始列値か ら 終了列値ま でのすべ
ての行が表示 さ れます。
次に例を示 し ます。
Buff_A.print(1,3);
こ れは次の よ う にな り ます。
行 2 :234
行 1 :789
行 0 :121314
ラ イ ン バ ッ フ ァ ーでのデー タ の挿入 と シ フ ト
linebuffer ク ラ ス では、 ラ イ ン バ ッ フ ァ ーを イ ン ス タ ン シエー ト す る ブ ロ ッ ク に入力 さ れ る デー タ は、 ラ ス タ ー走査
順に並び替え ら れ る ので、 新 し いデー タ がそれぞれ前のデー タ と は別の列に格納 さ れます。
新 し い値を挿入す る 場合は、 前の有限数値は列に保存 さ れた状態の ま ま で、 その列の行間の垂直シ フ ト が必要にな り
ます。 シ フ ト が終了 し た ら 、 新 し いデー タ 値は列の最上部ま たは最下部のいずれかに挿入で き ます。
た と えば、 値 100 を ラ イ ン バ ッ フ ァ ーの列 2 の最上部に挿入す る には、 次のいずれかの方法を使用 し ます。
Buff_A.shift_down(2);
Buff_A.insert_top(100,2);
こ れに よ り 、 表 3-11 に示す よ う な新 し いデー タ セ ッ ト にな り ます。
表 3‐11 : shift_down お よび insert_top を使用 し た後のデー タ セ ッ ト
列0
列1
列2
列3
列4
行2
1
2
100
4
5
行1
6
7
3
9
10
行0
11
12
8
14
15
値 100 を ラ イ ン バ ッ フ ァ ー セ ッ ト (表 3-10) の列 2 の最下部に挿入する には、 次を使用 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
259
C ライブラ リ
Buff_A.shift_up(2);
Buff_A.insert_bottom(100,2);
こ れに よ り 、 表 3-12 に示す よ う な新 し いデー タ セ ッ ト にな り ます。
表 3‐12 : shift_up および insert_bottom を使用 し た後のデー タ セ ッ ト
列0
列1
列2
列3
列4
行2
1
2
8
4
5
行1
6
7
13
9
10
行0
11
12
100
14
15
shift メ ソ ッ ド と insert メ ソ ッ ド の ど ち ら も 処理する 列の値を必要 と し ます。
デー タ の取得
linebuffer イ ン ス タ ン ス で格納 さ れた値はすべて getval(row,column) メ ソ ッ ド で取 り 出す こ と がで き ます。 こ の
メ ソ ッ ド では、 ラ イ ン バ ッ フ ァ ー内の ど の位置の値で も 戻す こ と がで き ます。 た と えば、 次の場合、 変数 Value に
値 9 が代入 さ れます。
Value = Buff_A.getval(1,3);
メモリ ウィ ンドウ
ウ ィ ン ド ウ C++ ク ラ ス を使用す る と 、 2 次元の メ モ リ ウ ィ ン ド ウ を宣言お よ び管理で き ま す。 こ の ク ラ ス の主な機
能は、 次の と お り です。
•
パ ラ メ ー タ ー指定に よ る すべてのデー タ 型のサポー ト
•
ユーザー定義の行数お よ び列数
•
最大バン ド 幅のため、 個別レ ジ ス タ ーへの自動パーテ ィ シ ョ ン
•
メ モ リ ウ ィ ン ド ウ を使用お よ びデバ ッ グする メ ソ ッ ド すべて を提供
メ モ リ ウ ィ ン ド ウ ク ラ ス は、 次の メ ソ ッ ド でサポー ト さ れます。
•
print()
•
shift_up();
•
shift_down()
•
shift_left()
•
shift_right()
•
insert(value,row,column)
•
insert_bottom()
•
insert_top()
•
insert_left()
•
insert_right()
•
getval(row, column)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
260
C ライブラ リ
メ モ リ ウ ィ ン ド ウ の使用方法を説明す る ため、 すべての例の最初に次のデー タ セ ッ ト が使用 さ れます。
表 3‐13 : メ モ リ ウ ィ ン ド ウ例のデー タ セ ッ ト
列0
列1
列2
行2
1
2
3
行1
6
7
8
行0
11
12
13
メ モ リ ウ ィ ン ド ウの宣言
メ モ リ ウ ィ ン ド ウ は、 次のデー タ 型を使用 し て アルゴ リ ズ ムに イ ン ス タ ン シエー ト で き ます。
hls::window<type, rows, columns>
デー タ を保持す る メ モ リ ウ ィ ン ド ウ は次の よ う に宣言で き ます。
hls::window<char,3,3> Buff_B;
メ モ リ ウ ィ ン ド ウの内容の表示
window ク ラ ス には、 メ モ リ ウ ィ ン ド ウ の内容を表示す る ために、 print メ ソ ッ ド が含まれます。 デフ ォ ル ト では、 こ
の メ ソ ッ ド は ウ ィ ン ド ウ内に格納 さ れ る すべての値を表示 し ます。 次はその例です。
Buff_B.print();
こ れは次の よ う にな り ます。
Window Size3x3
Col012
Row 2123
Row 1678
Row 0111213
すべての window ク ラ ス イ ン ス タ ン シエーシ ョ ンで row 0 は メ モ リ ウ ィ ン ド ウ の最下部にな る と 仮定 さ れます。
メ モ リ ウ ィ ン ド ウでのデー タ のシ フ ト
window ク ラ ス には、 メ モ リ ウ ィ ン ド ウ内に格納 さ れたデー タ を上下左右に移動する メ ソ ッ ド が含まれます。 こ れ ら
のシ フ ト 操作に よ り 、 新 し いデー タ 用に メ モ リ ウ ィ ン ド ウ内の スペース を空け る こ と がで き ます。
表 4-9 のデー タ セ ッ ト か ら 開始す る と し て、 次を実行 し た と し ます。
Buff_B.shift_up();
Buff_B.print();
こ れは、 次の結果にな り ます。
Window Size3x3
Col0 1 2
Row 267 8
Row 1111213
Row 0New dataNew dataNew data
同様に、 表 3-13 のデー タ セ ッ ト か ら 開始する と し て、 次を実行 し た と し ます。
Buff_B.shift_down();
Buff_B.print();
こ れは、 次の結果にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
261
C ライブラ リ
Window Size3x3
Col 0 1 2
Row 2New dataNew dataNew data
Row 11 2 3
Row 06 7 8
ま た、 次を実行 し た と し ます。
Buff_B.shift_left();
Buff_B.print();
デー タ が左にシ フ ト さ れて、 次の よ う にな り ます。
Window Size3x3
Col012
Row 223New data
Row 178New data
Row 01213New data
最後に次を実行 し た と し ます。
Buff_B.shift_right();
Buff_B.print();
こ の結果、 次の よ う にな り ます。
Window Size3x3
Col0 1 2
Row 2New data12
Row 1New data67
Row 0New data1112
メ モ リ ウ ィ ン ド ウのデー タ の挿入および取得
window ク ラ ス を使用す る と 、 メ モ リ ウ ィ ン ド ウ 内にデー タ を挿入 し た り 、 デー タ を取得 し た り で き ま す。 メ モ リ
ウ ィ ン ド ウ の境界上にデー タ のブ ロ ッ ク 挿入をす る こ と も で き ます。
デー タ を メ モ リ ウ ィ ン ド ウ のいずれかの位置に挿入する には、 次を使用 し ます。
insert(value,row,column
た と えば、 値 100 は次を実行す る と メ モ リ ウ ィ ン ド ウ の行 1 列 1 に挿入で き ます。
Buff_B.insert(100,1,1);
Buff_B.print();
こ れは print メ ソ ッ ド で表示す る と 、 次の よ う にな り ます。
Window Size3x3
Col012
Row 2123
Row 161008
Row 0111213
ブ ロ ッ ク レベルの挿入には、バ ウ ン ダ リ 上に挿入す る デー タ エ レ メ ン ト のア レ イ を指定する 必要があ り ます。window
ク ラ ス で提供 さ れ る メ ソ ッ ド は、 次の と お り です。
•
insert_bottom
•
insert_top
•
insert_left
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
262
HLS FFT ラ イ ブ ラ リ
•
insert_right
た と えば、 C が 3 エ レ メ ン ト のア レ イ で、 各ア レ イ の値は 50 で、 メ モ リ ウ ィ ン ド ウ の最下部バ ウ ン ダ リ に値 50 を挿
入す る 場合は、 次の よ う に指定 し ます。
char C[3] = {50, 50, 50};
Buff_B.insert_bottom(C);
Buff_B.print();
こ の結果、 次の よ う にな り ます。
Window Size3x3
Col012
Row 2123
Row 161008
Row 0505050
window ク ラ ス のその他のエ ッ ジ挿入 メ ソ ッ ド は、 insert_bottom() メ ソ ッ ド と 同 じ よ う に使用で き ます。
メ モ リ ウ ィ ン ド ウ か ら デー タ を取得す る には、 次を使用 し ます。
getval(row,column)
次に例を示 し ます。
A = Buff_B.getval(0,1);
こ れは次の よ う にな り ます。
A = 50
ビデオ関数
Vivado HLS の video ラ イ ブ ラ リ に含ま れ る ビデオ プ ロ セ ッ シ ン グ関数は、 既存の OpenCV 関数 と 互換性があ り 、 同
じ よ う に名前が付け ら れますが、 既存の OpenCV ビデオ ラ イ ブ ラ リ 関数を直接置換す る も のではあ り ません。
ビデオ プ ロ セ ッ シ ン グ関数では hls::Mat デー タ 型が使用 さ れます。 こ のデー タ 型に よ り 、 関数がハ イ パフ ォーマ
ン ス ハー ド ウ ェ ア と し て合成お よ び イ ンプ リ メ ン テーシ ョ ンで き る よ う にな り ます。 た と えば、 OpenCV ラ イ ブ ラ リ
には イ メ ージ を表示す る cv::Mat ク ラ ス が含ま れ ます。 次の例の場合、 変数 image は CV_8UC3 型の 1080x1920 エ
レ メ ン ト と し て定義 さ れます。
cv::Mat image(1080, 1920, CV_8UC3);
ビデオ ラ イ ブ ラ リ には、 こ れ と 同等の合成可能な hls::Mat テ ンプ レー ト ク ラ ス があ り ます。 hls::Mat ク ラ ス を
使用す る と 、 同 じ 変数 image が次の よ う に定義 さ れます。
hls::Mat<1080, 1920, HLS_8UC3> image;
テ ンプ レー ト ク ラ ス を使用す る と 、 ハー ド ウ ェ ア ス ト レージに使用 さ れ る メ モ リ のサ イ ズが Vivado HLS で決定で き
る よ う にな り ます。 hls::Mat ク ラ ス は、 合成後の イ ンプ リ メ ン テーシ ョ ン でハー ド ウ ェ ア用に最適化 さ れ る よ う に
も な っ てい ます。
HLS FFT ラ イ ブ ラ リ
ザ イ リ ン ク ス FFT ブ ロ ッ ク は、hls_fft.h ラ イ ブ ラ リ を使用する と C デザ イ ン内で呼び出す こ と がで き ます。 こ の IP に
ついては、 ザ イ リ ン ク ス の資料、 『LogiCORE™ IP Fast Fourier Transform 製品ガ イ ド (AXI)』 (PG109) を参照 し て く だ さ
い。 こ のセ ク シ ョ ンでは、 FFT を C++ コ ー ド で コ ン フ ィ ギ ュ レーシ ョ ンす る 方法について説明 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
263
HLS FFT ラ イ ブ ラ リ
重要 : IP を その多 く の機能を使用 し て イ ンプ リ メ ン ト す る 方法については、 『LogiCORE IP Fast Fourier Transform 製品
ガ イ ド (AXI)』 (PG109)を参照 し て く だ さ い。 本書では、 Vivado HLS を使用 し て C モデルを使用お よ び イ ン プ リ メ ン
ト す る 方法についてのに説明 し てい ます。
次は、 C++ コ ー ド で FFT を使用す る 5 つの手順です。
• コ ー ド に hls_fft.h ラ イ ブ ラ リ を含め る
• 定義済みの struct であ る hls::ip_fft::params_t を使用 し てデフ ォ ル ト のパ ラ メ ー タ ーを設定す る
• ラ ン タ イ ム コ ン フ ィ ギ ュ レーシ ョ ン を定義する
• FFT 関数を呼び出す
• ラ ン タ イ ム ス テー タ ス をチ ェ ッ ク する (オプシ ョ ン)
次の コ ー ド 例は、 こ れ ら の各手順を ま と めて実行 し た も のです。各手順については、詳細を後でそれぞれ説明 し ます。
まず、 ソ ース コ ー ド に FFT ラ イ ブ ラ リ を含め ます。 こ のヘ ッ ダー フ ァ イ ルは、 Vivado HLS の イ ン ス ト ール デ ィ レ ク
ト リ の include デ ィ レ ク ト リ に含 ま れ ま す ( こ のデ ィ レ ク ト リ はシ ミ ュ レ ーシ ョ ンお よ び合成中に自動的に検索 さ れ
ます)。
#include "hls_fft.h"
FFT の static パ ラ メ ー タ ーを定義 し ます。 こ れには、 ダ イ ナ ミ ッ ク には変更 し ない入力幅、 チ ャ ネル数、 アーキ テ ク
チ ャ タ イ プな ど が含まれます。 FFT ラ イ ブ ラ リ には、 パ ラ メ ー タ ーを指定 し た struct の hls::ip_fft::params_t
が含まれ、 すべての static パ ラ メ ー タ ーがデフ ォ ル ト 値で初期化で き る よ う にな っ てい ます。
こ の例の場合、 出力順序のデフ ォ ル ト 値、 お よ び コ ン フ ィ ギ ュ レーシ ョ ン ポー ト と ス テー タ ス ポー ト の幅が、 定義
済み struct に基づいて、 ユーザー定義の struct であ る param1 を使用 し て上書 き さ れてい ます。
struct param1 : hls::ip_fft::params_t {
static const unsigned ordering_opt = hls::ip_fft::natural_order;
static const unsigned config_width = FFT_CONFIG_WIDTH;
static const unsigned status_width = FFT_STATUS_WIDTH;
};
ラ ン タ イ ム コ ン フ ィ ギ ュ レーシ ョ ン と ラ ン タ イ ム ス テー タ ス両方のデー タ 型 と 変数を定義 し ます。 こ れ ら の値はダ
イ ナ ミ ッ ク にで き る ので、 変更可能で API か ら ア ク セ ス さ れ る C コー ド の変数 と し て定義 さ れます。
typedef hls::ip_fft::config_t<param1> config_t;
typedef hls::ip_fft::status_t<param1> status_t;
config_t fft_config1;
status_t fft_status1;
次に、 • ラ ン タ イ ム コ ン フ ィ ギ ュ レーシ ョ ン を設定 し ます。 こ の例では、 direction 変数の値に基づいて FFT (前方向ま
たは逆方向) が設定 さ れ る ほか、 ス ケー リ ン グ ス ケ ジ ュ ールの値 も 設定 さ れてい ます。
fft_config1->setDir(direction);
fft_config1->setSch(0x2AB);
HLS namespace と 定義済み static コ ン フ ィ ギ ュ レーシ ョ ン ( こ の例では param1) を使用 し て FFT 関数を呼び出 し ます。
関数のパ ラ メ ー タ ーは、 順に、 入力デー タ 、 出力デー タ 、 出力ス テー タ ス、 入力 コ ン フ ィ ギ ュ レーシ ョ ン を示 し てい
ます。
hls::fft<param1> (xn1, xk1, &fft_status1, &fft_config1);
最後に出力ス テー タ ス をチ ェ ッ ク し ます。 こ の例では、 オーバーフ ロ ー フ ラ グがチ ェ ッ ク さ れて、 結果が ovflo 変数
に格納 さ れます。
*ovflo = fft_status1->getOvflo();
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
264
FFT の static パラ メ ー タ ー
FFT C ラ イ ブ ラ リ を使用 し たデザ イ ン例は、[Help] → [Welcome] → [Open Example Project] → [Design Examples] → [FFT]
を ク リ ッ ク し て表示 さ れ る Vivado HLS のサンプルに含まれます。
FFT の static パラ メ ー タ ー
FFT の static パ ラ メ ー タ ーでは、 FFT の コ ン フ ィ ギ ュ レーシ ョ ン方法のほか、 FFT のサ イ ズ な ど の固定パ ラ メ ー タ ー
(サ イ ズがダ イ ナ ミ ッ ク に変更可能か ど う か、 イ ン プ リ メ ン テーシ ョ ン がパ イ プ ラ イ ン処理 さ れ る か radix_4_burst_io
が使用 さ れ る か) が指定 さ れます。
hls_fft.h
ヘ ッ ダー
フ ァ イ ルでは
static
パ ラ メ ー タ ー の デ フ ォ ル ト 値 の 設定 に 使用可能 な
hls::ip_fft::params_t と い う struct が定義 さ れてい ます。 デフ ォ ル ト 値が使用 さ れ る 場合、 パ ラ メ ー タ ー指定
さ れた struct を FFT 関数 と 一緒に直接使用で き ます。
hls::fft<hls::ip_fft::params_t >
(xn1, xk1, &fft_status1, &fft_config1);
こ れは、 パ ラ メ ー タ ーの一部をデフ ォ ル ト 値以外の値に変更す る ために も よ く 使用 さ れます。 こ れは、 デフ ォ ル ト の
パ ラ メ ー タ ー指定 さ れた struct に基づいて新 し いユーザー定義のパ ラ メ ー タ ー指定 さ れた struct が作成 さ れ、 一部の
デフ ォ ル ト 値が変更 さ れ る こ と で実行 さ れます。
次の例では、 新 し いユーザー struct の my_fft_config が新 し い出力順序の値 (natural_order に変更) と 共に定義 さ れ
てい ます。 FFT に対す る その他すべての static パ ラ メ ー タ ーでは、 デフ ォ ル ト 値が使用 さ れます (表 3-15)。
struct my_fft_config : hls::ip_fft::params_t {
static const unsigned ordering_opt = hls::ip_fft::natural_order;
};
hls::fft<my_fft_config >
(xn1, xk1, &fft_status1, &fft_config1);
パ ラ メ ー タ ー指定 struct の hls::ip_fft::params_t については、 表 3-14 を参照 し て く だ さ い。 パ ラ メ ー タ ーのデ
フ ォ ル ト 値お よ び使用可能な値の リ ス ト については、 表 3-15 を参照 し て く だ さ い。
パ ラ メ ー タ ーお よ びその設定の詳細については、ザ イ リ ン ク ス資料の 『LogiCORE IP Fast Fourier Transform v9.0 Product
Guide (AXI)』 (PG109) を参照 し て く だ さ い。
表 3‐14 : FTT の struct パラ メ ー タ ー
パラ メ ー タ ー
説明
input_width
デー タ 入力ポー ト 幅
output_width
デー タ 出力ポー ト 幅
status_width
出力ス テー タ ス ポー ト 幅
config_width
入力 コ ン フ ィ ギ ュ レーシ ョ ン ポー ト 幅
max_nfft
FFT デー タ セ ッ ト のサ イ ズ を 1 << max_nfft に指定
has_nfft
FFT のサ イ ズ を ラ ン タ イ ム コ ン フ ィ ギ ャ ラ ブルにす る か ど う かを指定
channels
チ ャ ネル数
arch_opt
イ ンプ リ メ ン テーシ ョ ン アーキ テ ク チ ャ
phase_factor_width
ordering_opt
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
内部位相係数の精度を コ ン フ ィ ギ ュ レーシ ョ ン
出力順序モー ド
japan.xilinx.com
Send Feedback
265
FFT の static パラ メ ー タ ー
表 3‐14 : FTT の struct パラ メ ー タ ー (続き)
ovflo
scaling_opt
rounding_opt
mem_data
mem_phase_factors
mem_reorder
stages_block_ram
mem_hybrid
complex_mult_type
butterfly_type
オーバーフ ロ ー モー ド を イ ネーブル
ス ケー リ ン グ オプシ ョ ン を定義
丸めモー ド を定義
デー タ メ モ リ にブ ロ ッ ク RAM を使用す る か分散 RAM を使用す る か指定
位相係数 メ モ リ にブ ロ ッ ク RAM を使用する か分散 RAM を使用する か指定
出力順序並べ替え メ モ リ にブ ロ ッ ク RAM を使用す る か分散 RAM を使用す る か指
定
イ ンプ リ メ ン テーシ ョ ンで使用 さ れ る ブ ロ ッ ク RAM ス テージ数を定義
ブ ロ ッ ク RAM がデー タ 、 位相係数ま たは順序並び替えバ ッ フ ァ ーに指定 さ れ る 際
に、 ブ ロ ッ ク RAM と 分散 RAM のハ イ ブ リ ッ ド を使用 し て、 特定の コ ン フ ィ ギ ュ
レーシ ョ ンでブ ロ ッ ク RAM のカ ウ ン ト が削減 さ れ る よ う にする か ど う か を指定
複素乗算器に使用す る 乗算器の タ イ プを定義
FFT バ タ フ ラ イ に使用 さ れ る イ ンプ リ メ ン テーシ ョ ン を定義。
整数ま たはブール型ではないパ ラ メ ー タ ー値を指定す る 際は、Vivado HLS の FFT namespace を使用す る 必要があ り ま
す。
た と えば、 表 3-15 の butterfly_type パ ラ メ ー タ ーに使用可能な値は use_luts お よ び
use_xtremedsp_slices です。 C プ ロ グ ラ ムでは butterfly_type = hls::ip_fft::use_luts お よ び
butterfly_type = hls::ip_fft::use_xtremedsp_slices を使用する 必要があ り ます。
表 3‐15 : FTT の struct パラ メ ー タ ーの値
パラ メ ー タ ー
C タ イプ
デ フ ォル ト 値
有効な値
input_width
unsigned
16
8-34
output_width
unsigned
16
input_width ~ (input_width +
max_nfft + 1)
status_width
unsigned
8
FFT コ ン フ ィ ギ ュ レ ーシ ョ ン に
よ っ て異な る
config_width
unsigned
16
FFT コ ン フ ィ ギ ュ レ ーシ ョ ン に
よ っ て異な る
max_nfft
unsigned
10
3-16
has_nfft
bool
false
True、 False
channels
unsigned
1
1-12
arch_opt
unsigned
pipelined_streaming_io
automatically_select
pipelined_streaming_io
radix_4_burst_io
radix_2_burst_io
radix_2_lite_burst_io
phase_factor_width
unsigned
16
8-34
ordering_opt
unsigned
bit_reversed_order
bit_reversed_order
natural_order
bool
true
false
true
ovflo
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
266
FFT のラ ン タ イム コ ン フ ィ ギ ュ レーシ ョ ン と ラ ン タ イム ス テー タ ス
表 3‐15 : FTT の struct パラ メ ー タ ーの値 (続き)
scaling_opt
unsigned
scaled
scaled
unscaled
block_floating_point
rounding_opt
unsigned
truncation
truncation
convergent_rounding
mem_data
unsigned
block_ram
block_ram
distributed_ram
mem_phase_factors
unsigned
block_ram
block_ram
distributed_ram
mem_reorder
unsigned
block_ram
block_ram
distributed_ram
stages_block_ram
unsigned
(max_nfft < 10) ?0 :
(max_nfft - 9)
0-11
bool
false
false
true
complex_mult_type
unsigned
use_luts
use_luts
use_mults_resources
use_mults_performance
butterfly_type
unsigned
use_luts
use_luts
use_xtremedsp_slices
mem_hybrid
FFT IP の機能について 表 3-15 に記載 さ れていない も のは現時点では Vivado HLS イ ン プ リ メ ン テーシ ョ ン でサポー
ト さ れてい ません。
FFT のラ ン タ イム コ ン フ ィ ギ ュ レーシ ョ ン と ラ ン タ
イム ス テー タ ス
FFT では、 コ ン フ ィ ギ ュ レーシ ョ ン ポー ト と ス テー タ ス ポー ト を介 し たモニ タ リ ン グに よ り 、 ラ ン タ イ ム コ ン フ ィ
ギ ュ レーシ ョ ン と ラ ン タ イ ム ス テー タ ス がサポー ト さ れます。 こ れ ら のポー ト は FFT 関数への引数 と し て定義 さ れ、
次の例では fft_status1 お よ び fft_config1 変数 と し て記載 さ れてい ます。
hls::fft<param1> (xn1, xk1, &fft_status1, &fft_config1);
ラ ン タ イ ム コ ン フ ィ ギ ュ レーシ ョ ン と ラ ン タ イ ム ス テー タ ス は、 FFT の C ラ イ ブ ラ リ か ら 定義済み struct を使用 し
てア ク セ ス で き ます。
•
hls::ip_fft::config_t<param1>
•
hls::ip_fft::status_t<param1>
注記 : ど ち ら の場合 も 、 struct には static パ ラ メ ー タ ー指定 struct が必要で、 例では param1 と し て記載 さ れてい ます。
static パ ラ メ ー タ ー指定の struct の詳細は、 前のセ ク シ ョ ン を参照 し て く だ さ い。
ラ ン タ イ ム コ ン フ ィ ギ ュ レーシ ョ ンの struct を使用する と 、 C コ ー ド で次を実行で き ます。
•
ラ ン タ イ ム コ ン フ ィ ギ ュ レーシ ョ ンが イ ネーブルの場合は、 FFT 長を設定
•
FFT の方向を前方向ま たは逆方向に設定
•
ス ケー リ ン グ ス ケ ジ ュ ールを設定
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
267
FFT 関数
FFT 長は、 次の よ う に設定で き ます。
typedef hls::ip_fft::config_t<param1> config_t;
config_t fft_config1;
// Set FFT length to 512 => log2(512) =>9
fft_config1-> setNfft(9);
FFT の方向は、 次の よ う に設定で き ます。
typedef hls::ip_fft::config_t<param1> config_t;
config_t fft_config1;
// Forward FFT
fft_config1->setDir(0);
// Inverse FFT
fft_config1->setDir(1);
FFT の ス ケー リ ン グ ス ケ ジ ュ ールは、 次の よ う に設定で き ます。
typedef hls::ip_fft::config_t<param1> config_t;
config_t fft_config1;
fft_config1->setSch(0x2AB);
出力ス テー タ ス ポー ト には定義済み struct を使用 し て ア ク セ ス で き 、 次が判断 さ れます。
•
FFT 中にオーバーフ ロ ーが発生 し たか ど う か
•
ブ ロ ッ ク の指数値
FFT オーバーフ ロ ー モー ド は、 次の よ う にチ ェ ッ ク で き ます。
typedef hls::ip_fft::status_t<param1> status_t;
status_t fft_status1;
// Check the overflow flag
bool *ovflo = fft_status1->getOvflo();
ブ ロ ッ ク の指数値は、 次を使用す る と 取得で き ます。
typedef hls::ip_fft::status_t<param1> status_t;
status_t fft_status1;
// Obtain the block exponent
unsigned int *blk_exp = fft_status1-> getBlkExp();
FFT 関数
FFT 関数は、 Vivado HLS の namespace で定義 さ れ、 次の よ う に呼び出す こ と がで き ます。
hls::fft<STATIC_PARAM> (
INPUT_DATA_ARRAY,
OUTPUT_DATA_ARRAY,
OUTPUT_STATUS,
INPUT_RUN_TIME_CONFIGURATIOn);
STATIC_PARAM は、 「FFT の static パ ラ メ ー タ ー」 セ ク シ ョ ンで説明 し た static パ ラ メ ー タ ー指定の struct で、 FFT の
static パ ラ メ ー タ ーを定義 し ます。
入力デー タ も 出力デー タ も ア レ イ (INPUT_DATA_ARRAY お よ び OUTPUT_DATA_ARRAY) と し て関数に提供 さ れます。
最終的な イ ンプ リ メ ン テーシ ョ ンでは、 FFT RTL ブ ロ ッ ク のポー ト は AXI4-Stream ポー ト と し て イ ンプ リ メ ン ト さ れ
ま す。 デー タ フ ロ ー最適化 (set_directive_dataflow) を使用 し た領域では、 ア レ イ が ス ト リ ー ミ ン グ ア レ イ と
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
268
HLS FIR ラ イ ブ ラ リ
し て イ ン プ リ メ ン ト さ れ る の で、 常 に FFT 関数 を 使用す る こ と を お勧 め し ま す。 ま た は、 ど ち ら の ア レ イ も
set_directive_stream コ マ ン ド を使用 し て ス ト リ ー ミ ン グ と し て指定 し ます。
重要 : FFT は、 パ イ プ ラ イ ン さ れた領域では使用で き ません。 高度なパフ ォーマ ン ス の演算が必要な場合、 FFT の前
後でループ ま たは関数をパ イ プ ラ ン し て、 その領域のループお よ び関数すべてでデー タ フ ロ ー最適化を使用 し ます。
ア レ イ のデー タ 型は、 float ま たは ap_fixed のいずれかにで き ます。
重要 : 浮動小数点デー タ 型を使用す る 場合は、 変数を static 修飾子を使用 し て定義 し てお く 必要があ り ます。
typedef float data_t;
static complex<data_t> xn[FFT_LENGTH];
static complex<data_t> xk[FFT_LENGTH];
固定小数点デー タ 型を使用す る 場合は、 Vivado HLS 任意精度型の ap_fixed を使用す る 必要があ り ます。
#include "ap_fixed.h"
typedef ap_fixed<FFT_INPUT_WIDTH,1> data_in_t;
typedef ap_fixed<FFT_OUTPUT_WIDTH,FFT_OUTPUT_WIDTH-FFT_INPUT_WIDTH+1> data_out_t;
#include <complex>
typedef std::complex<data_in_t> cmpxData;
typedef std::complex<data_out_t> cmpxDataOut;
ど ち ら の場合 も FFT には同 じ 正 し いデー タ サ イ ズでパ ラ メ ー タ ーを付け る 必要があ り ます。 浮動小数点デー タ 型の
場合、 デー タ 幅は常に 32 ビ ッ ト で、 その他のサ イ ズ を指定 し て も 無効 と 判断 さ れます。
FFT のマルチチ ャ ネル機能は、 入力デー タ と 出力デー タ の 2 次元ア レ イ を使用す る と 使用で き ます。 こ の場合、 ア レ
イ デー タ は最初に次元が書 く チ ャ ネルを、2 つ目の次元が FFT デー タ を表す よ う に コ ン フ ィ ギ ュ レーシ ョ ン さ れ る 必
要があ り ます。
typedef float data_t;
static complex<data_t> xn[CHANNEL][FFT_LENGTH];
static complex<data_t> xk[CHANELL][FFT_LENGTH];
OUTPUT_STATUS お よ び INPUT_RUN_TIME_CONFIGURATION は、 「FFT ラ ン タ イ ム コ ン フ ィ ギ ュ レーシ ョ ン」 の
セ ク シ ョ ンで説明 さ れた struct です。
注記 : FFT を使用 し たデザ イ ンは、 HDL (Verilog ま たは VHDL) を使用 し て し か検証で き ません。 SystemC RTL を使用
し た RTL 協調シ ミ ュ レーシ ョ ンは、 FFT を使用 し たデザ イ ンではサポー ト さ れません。
FFT C ラ イ ブ ラ リ を使用 し たデザ イ ン例は、[Help] → [Welcome] → [Open Example Project] → [Design Examples] → [FFT]
を ク リ ッ ク し て表示 さ れ る Vivado HLS のサンプルに含まれます。
HLS FIR ラ イ ブ ラ リ
ザ イ リ ン ク ス FIR ブ ロ ッ ク は、 hls_fir.h ラ イ ブ ラ リ を使用す る と C++ デザ イ ン内で呼び出す こ と がで き ます。 こ
の IP につい ては、 ザ イ リ ン ク ス の資料、 『LogiCORE IP FIR Compiler v7.1』 (PG149) を 参照 し て く だ さ い。 こ のセ ク
シ ョ ンでは、 FIR を C++ コ ー ド で コ ン フ ィ ギ ュ レーシ ョ ンす る 方法について説明 し ます。
重要 : IP を その多 く の機能を使用 し て イ ンプ リ メ ン ト す る 方法については、 『ogiCORE IP FIR Compiler v7.1』 (PG149)
を参照 し て く だ さ い。 本書では、 Vivado HLS を使用 し て C モデルを使用お よ び イ ンプ リ メ ン ト す る 方法についての
に説明 し てい ます。
次は、 C++ コ ー ド で FIR を使用す る 4 つの手順です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
269
HLS FIR ラ イ ブ ラ リ
•
コ ー ド に hls_fir.h ラ イ ブ ラ リ を含め る
•
定義済みの struct であ る hls::ip_fir::params_t を使用 し てデフ ォ ル ト のパ ラ メ ー タ ーを設定する
•
FIR 関数を呼び出す
•
ラ ン タ イ ム入力 コ ン フ ィ ギ ュ レーシ ョ ン を定義す る (オプシ ョ ン)
次の コ ー ド 例は、 こ れ ら の各手順を ま と めて実行 し た も のです。各手順については、詳細を後でそれぞれ説明 し ます。
まず、 ソ ース コ ー ド に FIR ラ イ ブ ラ リ を含め ます。 ヘ ッ ダー フ ァ イ ルは、 Vivado HLS イ ン ス ト ール デ ィ レ ク ト リ の
include デ ィ レ ク ト リ にあ り ます。 こ の フ ァ イ ルは、 Vivado HLS を実行する と 自動的に検索 さ れます。 Vivado HLS 内
で コ ンパ イ ルす る 場合は、 こ のデ ィ レ ク ト リ へのパ ス を指定す る 必要はあ り ません。
#include "hls_fir.h"
FIR の static パ ラ メ ー タ ーを定義 し ます。 こ れには、 入力幅、 係数、 フ ィ ル タ ー レー ト (single、 decimation、 hilbert) な
ど の static 属性が含 ま れ ま す。 FIR ラ イ ブ ラ リ には、 パ ラ メ ー タ ー指定 struct の hls::ip_fir::params_t が含ま
れ、 すべての static パ ラ メ ー タ ーがデフ ォ ル ト 値で初期化で き る よ う にな っ てい ます。
次の例では、 係数が coeff_vec ア レ イ にあ る と 定義 さ れ、 定義済み struct に基づいたユーザー定義の myconfig と
い う struct を使用 し て、 その係数の数のデフ ォ ル ト 値、 入力幅お よ び量子化 (quantization) モー ド が上書 き さ れてい ま
す。
struct myconfig : hls::ip_fir::params_t {
static const double coeff_vec[sg_fir_srrc_coeffs_len];
static const unsigned num_coeffs = sg_fir_srrc_coeffs_len;
static const unsigned input_width = INPUT_WIDTH;
static const unsigned quantization = hls::ip_fir::quantize_only;
};
HLS namespace と 定義済み static パ ラ メ ー タ ー ( こ の例では myconfig) を使用 し て FIR 関数の イ ン ス タ ン ス を作成 し
てか ら 、 run メ ソ ッ ド で関数を呼び出 し て を呼び出 し て、 関数を実行 し ます。 時間数の引数は、 順に、 入力デー タ 、
出力デー タ です。
static hls::FIR<param1> fir1;
fir1.run(fir_in, fir_out);
オプシ ョ ンで、 ラ ン タ イ ム入力 コ ン フ ィ ギ ュ レーシ ョ ン を使用す る こ と がで き ます。 FIR のモー ド の中には、 こ の入
力のデー タ に よ っ て イ ン タ ー リ ーブ さ れたチ ャ ネル中や係数 リ ロ ー ド が必要にな っ た場合に係数の使用方法が異な
る こ と があ り ます。 こ の コ ン フ ィ ギ ュ レーシ ョ ンはダ イ ナ ミ ッ ク にで き る ので、 変数 と し て定義 さ れます。 こ の入力
コ ン フ ィ ギ ュ レ ーシ ョ ン に必要なモー ド の詳細については、 ザ イ リ ン ク ス 資料の 『LogiCORE IP FIR Compiler v7.1』
(PG149) を参照 し て く だ さ い。
ラ ン タ イ ム入力 コ ン フ ィ ギ ュ レ ーシ ョ ン が使用 さ れ る 場合、 FIR 関数は入力デー タ 、 出力デー タ 、 お よ び入力 コ ン
フ ィ ギ ュ レーシ ョ ンの 3 つの引数を使用 し て呼び出 さ れます。
// Define the configuration type
typedef ap_uint<8> config_t;
// Define the configuration variable
config_t fir_config = 8;
// Use the configuration in the FFT
static hls::FIR<param1> fir1;
fir1.run(fir_in, fir_out, &fir_config);
FIR C ラ イ ブ ラ リ を使用 し たデザ イ ン例は、[Help] → [Welcome] → [Open Example Project] → [Design Examples] → [FIR]
を ク リ ッ ク し て表示 さ れ る Vivado HLS のサンプルに含まれます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
270
FIR の static パラ メ ー タ ー
FIR の static パラ メ ー タ ー
FIR の static パ ラ メ ー タ ーでは、 FIR IP のパ ラ メ ー タ ーが指定 さ れ、 入力幅 と 出力幅、 小数ビ ッ ト 、 係数値、 イ ン タ ー
ポ レーシ ョ ン レー ト 、 お よ びデシ メ ーシ ョ ン レー ト な ど のダ イ ナ ミ ッ ク でない も が指定 さ れ る 方法が定義 さ れます。
こ れ ら の コ ン フ ィ ギ ュ レーシ ョ ンのほ と ん ど にデフ ォ ル ト 値があ り ますが、 係数にはデフ ォ ル ト 値はあ り ません。
hls_fir.h ヘ ッ ダ ー フ ァ イ ル で は ほ と ん ど の static パ ラ メ ー タ ー の デ フ ォ ル ト 値 の 設定 に 使用可能 な
hls::ip_fir::params_t と い う struct が定義 さ れてい ます。
重要 : 係数にはデフ ォ ル ト 値は定義 さ れ ま せん。 こ のため、 FIR を直接初期化す る ために定義済みの struct を使用す
る のはお勧め し ません。 static パ ラ メ ー タ ー指定を実行する には、 係数を指定す る 新 し いユーザー定義の struct を常に
使用す る 必要があ り ます。
次の例では、 新 し い ユーザー struct の my_config が新 し い係数値 を 使用 し て 定義 さ れ て い ま す。 係数は ア レ イ
coeff_vec 内にあ る と 指定 さ れてい ます。 FIR に対す る その他すべてのパ ラ メ ー タ ーでは、 デフ ォ ル ト 値が使用 さ
れます (表 3-17)。
struct myconfig : hls::ip_fir::params_t {
static const double coeff_vec[sg_fir_srrc_coeffs_len];
};
static hls::FIR<param1> fir1;
fir1.run(fir_in, fir_out);
パ ラ メ ー タ ー指定 struct の hls::ip_fir::params_t に使用 さ れ る パ ラ メ ー タ ーについては、表 3-16 を参照 し て く
だ さ い。 パ ラ メ ー タ ーのデフ ォ ル ト 値お よ び使用可能な値の リ ス ト については、 表 3-17 を参照 し て く だ さ い。
パ ラ メ ー タ ーお よ びその設定の詳細については、 ザ イ リ ン ク ス資料の 『LogiCORE IP FIR Compiler v7.1』 (PG149) を参
照 し て く だ さ い。
表 3‐16 : FIR の struct パラ メ ー タ ー
パラ メ ー タ ー
input_width
input_fractional_bits
output_width
output_fractional_bits
coeff_width
coeff_fractional_bits
num_coeffs
coeff_sets
説明
デー タ 入力ポー ト 幅
入力ポー ト の小数ビ ッ ト の数
デー タ 出力ポー ト 幅
出力ポー ト の小数ビ ッ ト の数
係数のビ ッ ト 幅
係数の小数ビ ッ ト の数
係数の数
係数セ ッ ト の数
input_length
入力デー タ のサンプル数
output_length
出力デー タ のサンプル数
num_channels
処理 さ れ る デー タ のチ ャ ネル数を指定
total_number_coeff
係数の総数
coeff_vec[total_num_co
eff]
係数ア レ イ
filter_type
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
フ ィ ル タ ーに使用 さ れ る フ ィ ル タ ー タ イ プ を イ ンプ リ メ ン ト
japan.xilinx.com
Send Feedback
271
FIR の static パラ メ ー タ ー
表 3‐16 : FIR の struct パラ メ ー タ ー (続き)
rate_change
整数ま たは小数レー ト の変更を指定
interp_rate
イ ン タ ーポ レーシ ョ ン レー ト
decim_rate
デシ メ ーシ ョ ン レー ト
zero_pack_factor
イ ン タ ーポ レーシ ョ ンで使用 さ れ る 係数 0 の数
rate_specification
レー ト を周波数ま たは周期 と し て指定
hardware_oversampling
_rate
オーバーサンプ リ ン グの レー ト を指定
sample_period
sample_frequency
quantization
ハー ド ウ ェ アのオーバーサンプ リ ン グ周期
ハー ド ウ ェ アのオーバーサンプ リ ン グ周波数
使用 さ れ る 量子化方法
best_precision
最適な精度を イ ネーブルま たはデ ィ ス エーブル
coeff_structure
使用す る 係数構造の タ イ プ
output_rounding_mode
filter_arch
optimization_goal
inter_column_pipe_leng
th
出力で使用 さ れ る 丸めの タ イ プ
シ ス ト リ ッ ク ま たは転置型アーキ テ ク チ ャ を選択
最適化目標を速度ま たはエ リ アに指定
DSP 列間に必要なパ イ プ ラ イ ン長
column_config
DSP48 列数を指定
config_method
DSP48 列の コ ン フ ィ ギ ュ レーシ ョ ン方法を指定
coeff_padding
フ ィ ル タ ーの先頭に追加 さ れ る 0 パデ ィ ン グの数
整数ま たはブール型ではないパ ラ メ ー タ ー値を指定す る 際は、 Vivado HLS の FIR namespace を使用す る 必要があ り ま
す。
た と えば、 rate_change に使用可能な値は表 3-17 に integer お よ び fixed_fractional と 記述 さ れてい ます。
C プ ロ グ ラ ムでは rate_change = hls::ip_fir::integer お よ び rate_change =
hls::ip_fir::fixed_fractional を使用す る 必要があ り ます。
表 3‐17 : FIR の struct パ ラ メ ー タ ーの値
パラ メ ー タ ー
C タ イプ
デ フ ォル ト 値
有効な値
input_width
unsigned
16
制限な し
input_fractional_bits
unsigned
0
input_width のサ イ ズに よ り 制限
output_width
unsigned
24
制限な し
output_fractional_bits
unsigned
0
output_width のサ イ ズに よ り 制限
coeff_width
unsigned
16
制限な し
coeff_fractional_bits
unsigned
0
coeff_width のサ イ ズに よ り 制限
bool
21
フル
coeff_sets
unsigned
1
1-1024
input_length
unsigned
21
制限な し
output_length
unsigned
21
制限な し
num_channels
unsigned
1
1-1024
num_coeffs
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
272
FIR の static パラ メ ー タ ー
表 3‐17 : FIR の struct パ ラ メ ー タ ーの値 (続き)
total_number_coeff
unsigned
21
num_coeffs * coeff_sets
double array
なし
該当な し
filter_type
unsigned
single_rate
single_rate、 interpolation、 decimation、
hilbert、 interpolated
rate_change
unsigned
integer
integer、 fixed_fractional
interp_rate
unsigned
1
2-1024
decim_rate
unsigned
1
2-1024
zero_pack_factor
unsigned
1
2-8
rate_specification
unsigned
period
frequency、 period
hardware_oversampling
_rate
unsigned
1
制限な し
bool
1
制限な し
sample_frequency
unsigned
0.001
制限な し
quantization
unsigned
integer_coefficients
integer_coefficients、 quantize_only、
maximize_dynamic_range
best_precision
unsigned
false
false
true
coeff_structure
unsigned
non_synmetric
inferred、 non_symmetric、 symmetric、
negative_symmetric、 half_band、 hilbert
output_rounding_mode
unsigned
full_precision
full_precision、 truncate_lsbs、
non_symmetric_rounding_down、
non_symmetric_rounding_up、
symmetric_rounding_to_zero、
symmetric_rounding_to_infinity、
convergent_rounding_to_even、
convergent_rounding_to_odd
filter_arch
unsigned
systolic_multiply_accumu s y s t o l i c _ m u l t i p l y _ a c c u m u l a t e 、
late
transpose_multiply_accumulate
optimization_goal
unsigned
area
area、 speed
inter_column_pipe_leng
th
unsigned
4
1-16
column_config
unsigned
1
使用 さ れ る DSP48 の数に よ っ て制限
config_method
unsigned
single
single、 by_channel
coeff_padding
bool
false
false
true
coeff_vec[total_num_co
eff]
sample_period
FIR IP の機能について 表 3-17 に記載 さ れていない も のは現時点では Vivado HLS イ ンプ リ メ ン テーシ ョ ン でサポー ト
さ れてい ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
273
FIR 関数
FIR 関数
FIR 関数は、 Vivado HLS の namespace で定義 さ れ、 次の よ う に呼び出す こ と がで き ます。
// Create an instance of the FIR
static hls::FIR<STATIC_PARAM> fir1;
// Execute the FIR instance fir1
fir1.run(INPUT_DATA_ARRAY, OUTPUT_DATA_ARRAY);
STATIC_PARAM は、 「FIR の static パ ラ メ ー タ ー」 セ ク シ ョ ンで説明 し た static パ ラ メ ー タ ー指定の struct で、 FIR の
static パ ラ メ ー タ ーを定義 し ます。
入力デー タ も 出力デー タ も ア レ イ (INPUT_DATA_ARRAY お よ び OUTPUT_DATA_ARRAY) と し て関数に提供 さ れます。
最終的な イ ンプ リ メ ン テーシ ョ ン では、 FIRT IP の こ れ ら のポー ト は AXI4-Stream ポー ト と し て イ ン プ リ メ ン ト さ れ
ま す。 デー タ フ ロ ー最適化 (set_directive_dataflow) を使用 し た領域では、 ア レ イ が ス ト リ ー ミ ン グ ア レ イ と
し て イ ン プ リ メ ン ト さ れ る の で、 常 に FIR 関数 を 使用す る こ と を お勧 め し ま す。 ま た は、 ど ち ら の ア レ イ も
set_directive_stream コ マ ン ド を使用 し て ス ト リ ー ミ ン グ と し て指定 し ます。
重要 : FIR は、 パ イ プ ラ イ ン さ れた領域では使用で き ません。 高度なパフ ォ ーマ ン ス の演算が必要な場合、 FIR の前
後でループ ま たは関数をパ イ プ ラ ン し て、 その領域のループお よ び関数すべてでデー タ フ ロ ー最適化を使用 し ます。
FIR のマルチチ ャ ネル機能は、 シ ン グル入力お よ びシ ン グル出力ア レ イ のデー タ を イ ン タ ー リ ーブす る こ と でサポー
ト さ れます。
•
入力ア レ イ のサ イ ズは、 すべてのサンプル (num_channels * input_length) に十分な大き さ であ る 必要があ り ます。
•
出力ア レ イ のサ イ ズは、 すべての出力サンプル (num_channels * output_length) を含め る よ う に指定す る 必要があ
り ます。
次の コ ー ド 例は、 2 チ ャ ネルで、 デー タ が ど の よ う に イ ン タ ー リ ーブ さ れ る か を示 し てい ます。 こ の例では、 最上位
関数に入力デー タ のチ ャ ネルが 2 つ (din_i、 din_q) お よ び出力デー タ のチ ャ ネルが 2 つ (dout_i、 dout_q) 含ま
れてい ます。 2 つの関数が フ ロ ン ト エ ン ド (fe) と バ ッ ク エ ン ド (be) で FIR 入力ア レ イ のデー タ を正 し く 並べて、 FIR
出力ア レ イ か ら それを抽出す る ために使用 さ れてい ます。
void dummy_fe(din_t din_i[LENGTH], din_t din_q[LENGTH], din_t out[FIR_LENGTH]) {
for (unsigned i = 0; i < LENGTH; ++i) {
out[2*i] = din_i[i];
out[2*i + 1] = din_q[i];
}
}
void dummy_be(dout_t in[FIR_LENGTH], dout_t dout_i[LENGTH], dout_t dout_q[LENGTH]) {
for(unsigned i = 0; i < LENGTH; ++i) {
dout_i[i] = in[2*i];
dout_q[i] = in[2*i+1];
}
}
void fir_top(din_t din_i[LENGTH], din_t din_q[LENGTH],
dout_t dout_i[LENGTH], dout_t dout_q[LENGTH]) {
din_t fir_in[FIR_LENGTH];
dout_t fir_out[FIR_LENGTH];
static hls::FIR<myconfig> fir1;
dummy_fe(din_i, din_q, fir_in);
fir1.run(fir_in, fir_out);
dummy_be(fir_out, dout_i, dout_q);
}
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
274
オプ シ ョ ンの FIR ラ ン タ イ ム コ ン フ ィ ギ ュ レーシ ョ ン
注記 : FIR を使用 し たデザ イ ンは、 HDL (Verilog ま たは VHDL) を使用 し て し か検証で き ません。 SystemC RTL を使用
し た RTL 協調シ ミ ュ レーシ ョ ンは、 FIT を使用 し たデザ イ ンではサポー ト さ れません。
オプシ ョ ンの FIR ラ ン タ イム コ ン フ ィ ギュ レーシ ョ ン
演算モー ド に よ っ ては、 係数の使用方法を コ ン フ ィ ギ ュ レーシ ョ ンする ため、 FIR に別の入力が必要な こ と も あ り ま
す。 こ の入力 コ ン フ ィ ギ ュ レ ーシ ョ ン に必要な モー ド の詳細につい ては、 ザ イ リ ン ク ス 資料の 『LogiCORE IP FIR
Compiler v7.1』 (PG149) を参照 し て く だ さ い。
こ の入力 コ ン フ ィ ギ ュ レーシ ョ ンは、 標準 8 ビ ッ ト デー タ 型の ap_int.h を使用 し て C コ ー ド で実行で き ます。 次の
コ ー ド は、 こ の追加入力を C に イ ンプ リ メ ン ト す る と こ ろ を示 し てい ます。 ま た、 #include を使用 し て同 じ 値が変数
と FIR コ ン フ ィ ギ ュ レーシ ョ ンに使用 さ れ る よ う にす る と こ ろ も 示 し てい ます。
こ の例では、 fir_top.h ヘ ッ ダー フ ァ イ ルで FIR と ap_fixed ラ イ ブ ラ リ の使用が指定 さ れ、 多 く のデザ イ ン パ
ラ メ ー タ ー値が定義 さ れた後、 それ ら に基づいて固定小数点型がい く つか定義 さ れてい ます。
#include "ap_fixed.h"
#include "hls_fir.h"
const unsigned FIR_LENGTH
= 21;
const unsigned INPUT_WIDTH = 16;
const unsigned INPUT_FRACTIONAL_BITS = 0;
const unsigned OUTPUT_WIDTH = 24;
const unsigned OUTPUT_FRACTIONAL_BITS = 0;
const unsigned COEFF_WIDTH = 16;
const unsigned COEFF_FRACTIONAL_BITS = 0;
const unsigned COEFF_NUM = 7;
const unsigned COEFF_SETS = 3;
const unsigned INPUT_LENGTH = FIR_LENGTH;
const unsigned OUTPUT_LENGTH = FIR_LENGTH;
const unsigned CHAN_NUM = 1;
typedef ap_fixed<INPUT_WIDTH, INPUT_WIDTH - INPUT_FRACTIONAL_BITS> s_data_t;
typedef ap_fixed<OUTPUT_WIDTH, OUTPUT_WIDTH - OUTPUT_FRACTIONAL_BITS> m_data_t;
typedef ap_uint<8> config_t;
最上位 コ ー ド には、 ヘ ッ ダー フ ァ イ ルの情報が含まれ、 C コ ー ド と FIR コ ン フ ィ ギ ュ レーシ ョ ンが一致す る よ う に、
ビ ッ ト 幅を指定す る のに使用 し たの と 同 じ 定数値を使用 し て static パ ラ メ ー タ ーで指定 さ れた struct 構造体が作成 さ
れ、係数が指定 さ れます。最上位では、ヘ ッ ダー フ ァ イ ルで 8 ビ ッ ト デー タ と し て定義 さ れた入力 コ ン フ ィ ギ ュ レー
シ ョ ンが FIR に渡 さ れます。
#include "fir_top.h"
struct param1 : hls::ip_fir::params_t {
static const double coeff_vec[total_num_coeff];
static const unsigned input_length = INPUT_LENGTH;
static const unsigned output_length = OUTPUT_LENGTH;
static const unsigned num_coeffs = COEFF_NUM;
static const unsigned num_coeffs = COEFF_NUM;
};
const double param1::coeff_vec[total_num_coeff] =
{6,0,-4,-3,5,6,-6,-13,7,44,64,44,7,-13,-6,6,5,-3,-4,0,6};
void dummy_fe(s_data_t in[INPUT_LENGTH], s_data_t out[INPUT_LENGTH],
config_t* config_in, config_t* config_out)
{
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
275
ハー ド ウ ェ アのコ ー ド 記述方法
*config_out = *config_in;
for(unsigned i = 0; i < INPUT_LENGTH; ++i)
out[i] = in[i];
}
void dummy_be(m_data_t in[OUTPUT_LENGTH], m_data_t out[OUTPUT_LENGTH])
{
for(unsigned i = 0; i < OUTPUT_LENGTH; ++i)
out[i] = in[i];
}
// DUT
void fir_top(s_data_t in[INPUT_LENGTH],
m_data_t out[OUTPUT_LENGTH],
config_t* config)
{
s_data_t fir_in[INPUT_LENGTH];
m_data_t fir_out[OUTPUT_LENGTH];
config_t fir_config;
// Create struct for config
static hls::FIR<param1> fir1;
//==================================================
// Dataflow process
dummy_fe(in, fir_in, config, &fir_config);
fir1.run(fir_in, fir_out, &fir_config);
dummy_be(fir_out, out);
//==================================================
}
FIR C ラ イ ブ ラ リ を使用 し たデザ イ ン例は、[Help] → [Welcome] → [Open Example Project] → [Design Examples] → [FIR]
を ク リ ッ ク し て表示 さ れ る Vivado HLS のサンプルに含まれます。
ハー ド ウ ェ アの コ ー ド 記述方法
C コ ー ド は、 再利用、 読みやす さ 、 パフ ォ ーマ ン ス な ど の複数の要件を満たす よ う に記述 さ れます。 現時点では、 C
コ ー ド は高位合成後に最適なハー ド ウ ェ アが得 ら れ る よ う に記述 さ れてい ません。
ただ し 、 再利用、 読みやす さ 、 パフ ォーマ ン ス要件 と 同様に、 特定の コ ー ド 記述方法ま たはあ ら か じ め定義 さ れた コ
ン ス ト ラ ク ト を使用す る こ と に よ り 、 合成結果が よ り 適切なハー ド ウ ェ アにな る よ う に、 ま たはアルゴ リ ズ ム を よ り
簡単に検証 し て C でハー ド ウ ェ ア を よ り 適切に記述で き る よ う で き ます。
C++ でのユーザー定義のレ ジ ス タ
通常、 C 関数で確実に レ ジ ス タ と し て イ ンプ リ メ ン ト さ れ る 変数は、 次の と お り です。
•
static 修飾子が最初に付いた変数
•
グ ロ ーバルに定義 さ れた変数 (グ ロ ーバルがポー ト と し て使用可能な場合を除 く )
•
メ モ リ リ ソ ース を タ ーゲ ッ ト と し た ア レ イ
その他の変数は、 合成中の決定に よ っ て、 レ ジ ス タ に イ ンプ リ メ ン ト さ れ る 場合 と そ う でない場合があ り ます。 合成
で、 変数が複数サ イ ク ル間レ ジ ス タ に保持 さ れ る 必要があ る と 判断 さ れ る 場合 と 、 作成 さ れたサ イ ク ル と 同 じ サ イ ク
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
276
ハー ド ウ ェ アのコ ー ド 記述方法
ルで使用で き る ので レ ジ ス タ は不要であ る と 判断 さ れ る 場合があ り ます。 上記の変数のみが、 RTL で確実に レ ジ ス タ
に イ ンプ リ メ ン ト さ れます。
次の例に示す よ う に、 Reg と い う C++ 関数を使用す る と 、 特定の変数を最終的な RTL デザ イ ン で確実に レ ジ ス タ と
し て イ ンプ リ メ ン ト で き ます。
#include foo.h
template<class T>
T Reg(T in) {
#pragma HLS PIPELINE
#pragma HLS INLINE off
#pragma HLS INTERFACE port=return register
return in;
}
int foo (int in1, int in2 ) {
int tmp=in1*(0x0800-in2);
// int out = tmp >> 10;
int out = Reg(tmp >> 10);
return( out );
}
int foo_top(int inA, int inB) {
int res1 = foo(inA, inB);
return(res1);
}
こ の コ ー ド の重要な点は、 次の と お り です。
•
関数 Reg が作成 さ れ、 出力の関数 return の値が レ ジ ス タ に格納 さ れてい ます。
下位関数では、イ ン タ ーフ ェ イ ス指示子は関数の引数 (RTL ポー ト ) を レ ジ ス タ に格納す る ためのみに使用で き ま
す。 イ ン タ ーフ ェ イ ス指示子は、下位関数の引数の I/O プ ロ ト コ ルを指定す る ために使用す る こ と はで き ません。
•
関数 Reg では、 Vivado HLS で こ の関数が自動的に イ ン ラ イ ン化 さ れない よ う に、 イ ン ラ イ ン化がデ ィ ス エーブ
ルにな っ てい ます。
関数 Reg を イ ン ラ イ ン化す る と 、個別の関数でな く な る ため、関数で実行 さ れ る レ ジ ス タ 操作が無効にな り ます。
•
下位関数 foo の乗算 と シ フ ト 演算の出力は、 関数 Reg の入力 と し て使用 さ れます。
関数 Reg の出力にはレ ジ ス タ が付いてい る ので、 こ れに よ り こ の演算の結果が RTL 出力の レ ジ ス タ に格納 さ れ
ます。
•
pipeline 指示子は、 こ の関数が イ ンプ リ メ ン ト さ れて、 現在の ト ラ ンザ ク シ ョ ンが終了 し た後な る べ く 早 く 次の
ト ラ ンザ ク シ ョ ンが実行 さ れ る よ う にな る よ う に、 適用 さ れ ます。 こ れに よ り 、 こ の関数に FSM ロ ジ ッ ク は必
要な く な り ます。
•
こ の変数の元の ソ ース コ ー ド は、 こ の手法を適用する のがどれだけ簡単か を示すために、 コ メ ン ト ア ウ ト さ れ
てい ます。
通常は Vivado HLS に よ り 最終 RTL で レ ジ ス タ に格納 さ れ る 変数が決定 さ れますが、 こ の コ ー ド 記述方法を使用す る
と 、 コ ー ド の機能を変えずに特定の変数を レ ジ ス タ に格納で き ます。
void apint_arith(dinA_t inA, dinB_t
dout1_t *out1
) {
inB,
dout2_t temp;
#pragma HLS RESOURCE variable=temp core=AddSub_DSP
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
277
ハー ド ウ ェ アのコ ー ド 記述方法
temp = inB + inA;
*out1 = temp;
}
DSP48 への加算器および減算器のイ ン プ リ メ ン ト
デフ ォ ル ト では、加算器お よ び減算器は LUT を使用 し て イ ンプ リ メ ン ト さ れます。RESOURCE 指示子を使用す る と 、
DSP48 を使用 し て演算が イ ンプ リ メ ン ト さ れ る よ う に指定で き ます。
次の例の場合、 RESOURSE 指示子が変数 temp の加算演算を指定 し てお り 、 加算は AddSub_DSP コ ア を使用 し て イ
ン プ リ メ ン ト さ れ る 必要があ り ま す。 こ れに よ り 、 最終的なデザ イ ン では演算が DSP を使用 し て イ ン プ リ メ ン ト さ
れ る よ う にな り ます。
SRL リ ソ ースへの直接マ ッ プ
多 く の C アルゴ リ ズ ム では、 デー タ を ア レ イ 内で順次シ フ ト し ます。 ア レ イ の開始に新 し い値を追加 し 、 既存のデー
タ を ア レ イ 内でシ フ ト し 、 最 も 古いデー タ 値は破棄 さ れます。 こ の操作は、 ハー ド ウ ェ アではシ フ ト レ ジ ス タ と し て
イ ンプ リ メ ン ト さ れます。
C か ら シ フ ト レ ジ ス タ を イ ンプ リ メ ン ト す る 場合、 ア レ イ を個々のエ レ メ ン ト に完全にパーテ ィ シ ョ ン し 、 RTL 内の
エ レ メ ン ト 間のデー タ 依存性か ら シ フ ト レ ジ ス タ を暗示 さ せる のが最 も 一般的です。
論理合成では、通常 RTL シ フ ト レ ジ ス タ がシ フ ト レ ジ ス タ を効率的に イ ンプ リ メ ン ト する ザ イ リ ン ク ス SRL リ ソ ー
ス に イ ンプ リ メ ン ト さ れます。 問題は、 論理合成で RTL シ フ ト レ ジ ス タ が SRL コ ン ポーネ ン ト を使用 し て イ ンプ リ
メ ン ト さ れない場合があ る こ と です。
•
シ フ ト レ ジ ス タ の中央にあ る デー タ にア ク セ スする 場合、 論理合成では SRL を直接推論で き ません。
•
SRL が最適であ っ て も 、 ほかの要因に よ り 論理合成でシ フ ト レ ジ ス タ が フ リ ッ プ フ ロ ッ プに イ ンプ リ メ ン ト さ
れ る こ と があ り ます。 論理合成は、 複雑なプ ロ セ ス です。
Vivado HLS では、 C++ ク ラ ス (ap_shift_reg) が提供 さ れてお り 、 C コ ー ド で定義 さ れた シ フ ト レ ジ ス タ が SRL
リ ソ ース を使用 し て常に イ ン プ リ メ ン ト さ れ る よ う にな っ てい ます。 ap_shift_reg ク ラ ス では、 SRL コ ン ポーネ
ン ト でサポー ト さ れ る さ ま ざ ま な読み出 し お よ び書 き 込みア ク セ ス を実行す る 方法が 2 つあ り ます。
シ フ ト レ ジ ス タ か らの読み出 し
読み出 し メ ソ ッ ド では、 シ フ ト レ ジ ス タ の指定 し た位置か ら 読み出 し をする こ と がで き ます。
Vivado HLS には、 ap_shift_reg ク ラ ス を定義す る ap_shift_reg.h ヘ ッ ダー フ ァ イ ルが ス タ ン ド ア ロ ン パ ッ
ケ ー ジ と し て 含 ま れ て お り 、 ユ ー ザ ー の ソ ー ス コ ー ド で 使用 で き る よ う に な っ て い ま す。 こ の パ ッ ケ ー ジ
(xilinx_hls_lib_2013_1.tgz) は、Vivado HLS イ ン ス ト ール デ ィ レ ク ト リ の include デ ィ レ ク ト リ に含まれま
す。
// Include the Class
#include ap_shift_reg.h
// Define a variable of type ap_shift_reg<type, depth>
// - Sreg must use the static qualifier
// - Sreg will hold integer data types
// - Sreg will hold 4 data values
static ap_shift_reg<int, 4> Sreg;
int var1;
// Read location 2 of Sreg into var1
var1 = Sreg.read(2);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
278
ハー ド ウ ェ アのコ ー ド 記述方法
デー タ の読み出 し および書き込み し て、 シ フ ト
shift メ ソ ッ ド では、 読み出 し 、 書 き 込みお よ びシ フ ト 操作を実行で き ます。
// Include the Class
#include ap_shift_reg.h
// Define a variable of type ap_shift_reg<type, depth>
// - Sreg must use the static qualifier
// - Sreg will hold integer data types
// - Sreg will hold 4 data values
static ap_shift_reg<int, 4> Sreg;
int var1;
// Read location 3 of Sreg into var1
// THEN shift all values up one and load In1 into location 0
var1 = Sreg.shift(In1,3);
読み出 し および書き込み し て、 シ フ ト を イ ネーブル制御
shift メ ソ ッ ド では イ ネーブル入力 も サポー ト さ れてお り 、 シ フ ト 操作を変数で制御お よ び イ ネーブルにで き ます。
// Include the Class
#include ap_shift_reg.h
// Define a variable of type ap_shift_reg<type, depth>
// - Sreg must use the static qualifier
// - Sreg will hold integer data types
// - Sreg will hold 4 data values
static ap_shift_reg<int, 4> Sreg;
int var1, In1;
bool En;
// Read location 3 of Sreg into var1
// THEN if En=1
// Shift all values up one and load In1 into location 0
var1 = Sreg.shift(In1,3,En);
ap_shift_reg ク ラ ス を使用す る と 、 Vivado HLS で各シ フ ト レ ジ ス タ に対 し て固有の RTL コ ン ポーネ ン ト が作成
さ れます。 論理合成が実行 さ れ る と 、 こ の コ ン ポーネ ン ト が SRL リ ソ ース に合成 さ れます。
ス ト リ ー ミ ング デー タ を使用 し た設計
ス ト リ ー ミ ン グ デー タ と は、 デー タ サ ンプルが最初のサン プルか ら シーケ ン シ ャ ル順に送信 さ れ る タ イ プのデー タ
転送の こ と です。 ス ト リ ー ミ ン グには、 ア ド レ ス管理は必要あ り ません。
ス ト リ ー ミ ン グ デー タ を使用す る デザ イ ンは C で記述する のが困難な場合があ り ます。 172 ページの 「マルチア ク セ
ス ポ イ ン タ ー イ ン タ ーフ ェ イ ス : ス ト リ ー ミ ン グ デー タ 」 の説明の と お り 、 複数の読み出 し お よ び書 き 込みを実行
す る ためにポ イ ン タ ーを使用す る と 、 型修飾子 と テ ス ト ベンチの構築方法が記述 さ れ る ので、 問題が発生す る 可能性
があ り ます。
Vivado HLS には、 ス ト リ ー ミ ン グ デー タ 構造を記述す る ための C++ テ ン プ レー ト ク ラ ス の hls::stream<> が含
まれます。 hls::stream<> ク ラ ス を使用 し て イ ンプ リ メ ン ト し た ス ト リ ームには、 次の属性があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
279
ハー ド ウ ェ アのコ ー ド 記述方法
こ のセ ク シ ョ ンでは、 ス ト リ ー ミ ン グ デー タ を使用 し たデザ イ ン を hls::stream<> ク ラ ス を使用 し て よ り 簡単に
記述す る 方法を示 し ます。 こ のセ ク シ ョ ンの ト ピ ッ ク には、 次が含まれます。
•
ス ト リ ーム を使用 し た記述 と ス ト リ ームの RTL イ ンプ リ メ ン テーシ ョ ンの概要
•
グ ロ ーバル ス ト リ ーム変数の規則
•
ス ト リ ームの使用方法
•
読み出 し お よ び書 き 込みのブ ロ ッ キ ン グ
•
読み出 し お よ び書 き 込みの ノ ンブ ロ ッ キ ン グ
•
FIFO の深 さ の制御
注記 : hls::stream ク ラ ス は常に C++ リ フ ァ レ ン ス引数 と し て関数間で使用 さ れます。た と えば、&my_stream
です。
C 記述 と RTL イ ン プ リ メ ン テーシ ョ ン
ス ト リ ームは、 ソ フ ト ウ ェ ア (お よ び RTL 協調シ ミ ュ レーシ ョ ン中のテ ス ト ベンチ) では無限大のキ ュ ー と し て記述
さ れます。 ス ト リ ーム を シ ミ ュ レーシ ョ ンす る ために C で深 さ を指定する 必要はあ り ません。 ス ト リ ームは、 関数内
お よ び関数への イ ン タ ーフ ェ イ ス 上で使用で き ま す。 内部 ス ト リ ームは関数パ ラ メ ー タ ー と し て渡す こ と がで き ま
す。
ス ト リ ームは C++ ベース のデザ イ ン でのみ使用で き ます。 各 hls::stream<> オブジ ェ ク ト は 1 プ ロ セ ス で書 き 込
ま れ、 1 プ ロ セ ス で読み出 さ れ る よ う にす る 必要があ り ます。 た と えば、 DATAFLOW デザ イ ン では、 各 ス ト リ ーム
グには 1 つの送信プ ロ セ ス と 1 つの受信プ ロ セ ス だけが含まれます。
RTL では、 ス ト リ ームは FIFO ま たはフル ハン ド シ ェ イ ク イ ン タ ーフ ェ イ ス ポー ト のいずれか と し て イ ンプ リ メ ン
ト さ れます。 デフ ォ ル ト の イ ン タ ーフ ェ イ ス ポー ト は ap_fifo ポー ト です。 こ のポー ト はオプシ ョ ン で最上位 イ ン
タ ーフ ェ イ ス の ap_hs ポー ト と し て イ ンプ リ メ ン ト す る こ と も で き ます。 内部ス ト リ ームは、 FIFO イ ン タ ーフ ェ イ
ス と し てのみ イ ンプ リ メ ン ト さ れます。
ス ト リ ーム で作成 さ れた FIFO はデフ ォ ル ト で深 さ 1、 2 エ レ メ ン ト レ ジ ス タ ベース の FIFO と し て イ ン プ リ メ ン ト
さ れます。 FIFO の深 さ にはオプシ ョ ンで STREAM 指示子を使用で き ます。
グ ローバルおよびロー カル ス ト リ ーム
ス ト リ ームは、 ロ ーカルま たはグ ロ ーバルのいずれかに定義で き ます。 ロ ーカル ス ト リ ームは常に内部 FIFO と し て
イ ンプ リ メ ン ト さ れます。 グ ロ ーバル ス ト リ ームは FIFO ま たはポー ト と し て イ ンプ リ メ ン ト さ れ る 可能性があ り ま
す。
•
読み出 し 専用ま たは書 き 込み専用のグ ロ ーバルに定義 さ れた ス ト リ ームは、 最上位 RTL ブ ロ ッ ク の外部ポー ト
と し て推論 さ れます。
•
最上位関数 よ り 下位の階層での読み出 し お よ び書 き 込み両方用の グ ロ ーバルに定義 さ れた ス ト リ ーム は、 内部
FIFO と し て イ ンプ リ メ ン ト さ れます。
グ ロ ーバル ス コ ープで定義 さ れ る ス ト リ ームは、 その他のグ ロ ーバル変数 と 同 じ 規則に従い ます。 グ ロ ーバル変数の
合成の詳細は、 181 ページの 「デー タ 型」 を参照 し て く だ さ い。
ス ト リ ームの使用
hls::stream<> オブジ ェ ク ト を使用す る には、ヘ ッ ダー フ ァ イ ルの hls_stream.h を含め ます。 こ の フ ァ イ ルは、
Vivado HLS イ ン ス ト ール デ ィ レ ク ト リ の include デ ィ レ ク ト リ に含まれます。こ のデ ィ レ ク ト リ はシ ミ ュ レーシ ョ
ンお よ び合成中に自動的に検索 さ れ る ので、 検索パ ス に追加す る 必要はあ り ません。
Vivado HLS には、 hls_stream.h ヘ ッ ダー フ ァ イ ル も ス タ ン ド ア ロ ン パ ッ ケージ と し て含まれてお り 、 ユーザーの
ソ ース コ ー ド で使用で き る よ う にな っ てい ます。 こ の xilinx_hls_lib_2012_3.tgz パ ッ ケージは、 Vivado HLS
イ ン ス ト ール デ ィ レ ク ト リ の include デ ィ レ ク ト リ に含まれます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
280
ハー ド ウ ェ アのコ ー ド 記述方法
ス ト リ ー ミ ン グ デー タ オブジ ェ ク ト は、 型 と 変数名を指定 し て定義 し ます。 次の例では、 128 ビ ッ ト の符号な し 整数
型が定義 さ れて、 my_wide_stream と い う ス ト リ ーム変数を作成す る ために使用 さ れてい ます。
#include <ap_int.h>
#include <hls_stream.h>
typedef ap_uint<128> uint128_t; // 128-bit user defined type
hls::stream<uint128_t> my_wide_stream; // A stream declaration
ス ト リ ームが hls::stream<T> と し て指定 さ れてい る 場合は、 T 型は次のいずれかにな り ます。
•
C++ ネ イ テ ィ ブ デー タ 型
•
Vivado HLS 任意精度型 (例 : ap_int<>、 ap_ufixed<>、 ユーザー定義 (typedef) 構造型な ど)
注記 : メ ソ ッ ド ( メ ンバー関数) を含む通常のユーザー定義の ク ラ ス (ま たは構造) は、 ス ト リ ーム変数の型 (T) と し て
使用 さ れ る べ き ではあ り ません。
ス ト リ ームが関数を出入 り す る 際は、 次の例の よ う に リ フ ァ レ ン ス ご と に渡 さ れ る 必要があ り ます。
void stream_function (
hls::stream<uint8_t> &strm_out,
hls::stream<uint8_t> &strm_in,
uint16_t strm_len
)
GUI の ウ ェ ルカ ム画面か ら デザ イ ン例に含まれ る hls_stream の例を参照 し て く だ さ い。
ス ト リ ームは上記の例の よ う に ス コ ープ付 き の名前を使用す る か、 「using namespace hls;」 文の付いた フ ァ イ
ル ス コ ープに hls namespace を含め る 必要があ り ます。 namespace が使用 さ れ る 場合、 上記の例は次の よ う に記述で
き ます。
#include <ap_int.h>
#include <hls_stream.h>
using namespace hls;
typedef ap_uint<128> uint128_t; // 128-bit user defined type
stream<uint128_t> my_wide_stream; // hls:: no longer required
> 演算子 よ り も ピ リ オ ド ( . ) を使用 し て メ ソ ッ ド を選択で き る よ う にな る ので、 foo(hls::stream<char> &foo,
…) の よ う に参照渡 し 変数のみを使用す る こ と をお勧め し ます。
Vivado HLS では、 ブ ロ ッ キ ン グお よ び ノ ンブ ロ ッ キ ン グ ア ク セ ス の メ ソ ッ ド 両方がサポー ト さ れます。
•
ノ ンブ ロ ッ キ ン グ ア ク セ ス は、 FIFO イ ン タ ーフ ェ イ ス と し てのみ イ ンプ リ メ ン ト で き ます。
•
ap_fifo ポー ト と し て イ ンプ リ メ ン ト さ れ る ス ト リ ー ミ ン グ ポー ト と AXI4Stream リ ソ ース を使用 し て定義 さ
れ る ス ト リ ー ミ ン グ ポー ト には、 ノ ンブ ロ ッ キ ン グ ア ク セ ス を使用 し ないで く だ さ い。
読み出 し および書き込みのブ ロ ッ キング
hls::stream<> オブジ ェ ク ト への基本的な ア ク セ ス は読み出 し お よ び書 き 込みのブ ロ ッ キ ン グで、こ れは ク ラ ス メ
ソ ッ ド ( メ ンバー関数) を使用 し て達成で き ます。 こ れ ら の メ ソ ッ ド は、 空の ス ト リ ーム FIFO か ら の読み出 し や、 フ
ル ス ト リ ーム FIFO への書 き 込みが あ っ た場合、 ま たは ap_hs イ ン タ ーフ ェ イ ス プ ロ ト コ ルにマ ッ プ さ れた ス ト
リ ームに対 し て フル ハン ド シ ェ イ ク が達成 さ れ る ま で、 実行を停止 (ブ ロ ッ ク ) し ます。
書き込み メ ソ ッ ド のブ ロ ッ キング
次の例では、 src_var 変数が ス ト リ ームに含まれてい ます。
// Usage of void write(const T & wdata)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
281
ハー ド ウ ェ アのコ ー ド 記述方法
hls::stream<int> my_stream;
int src_var = 42;
my_stream.write(src_var);
<< 演算子はオーバー ロ ー ド さ れてい る ので、 C++ ス ト リ ームの ス ト リ ーム挿入演算子 (例 : iostreams、 filestreams な ど
) と 同様の方法で使用で き ます。 書 き 込まれ る hls::stream<> オブジ ェ ク ト は、 左側の引数 と し て、 書 き 込まれ る
値は右側に記述 さ れます。
// Usage of void operator << (T & wdata)
hls::stream<int> my_stream;
int src_var = 42;
my_stream << src_var;
読み出 し メ ソ ッ ド のブ ロ ッ キング
こ の メ ソ ッ ド では、 ス ト リ ームの冒頭か ら 読み出 し 、 値を dst_var 変数に代入 し ます。
// Usage of void read(T &rdata)
hls::stream<int> my_stream;
int dst_var;
my_stream.read(dst_var);
ま たは、 ス ト リ ームの次のオブジ ェ ク ト は、 その ス ト リ ーム を左側のオブジ ェ ク ト に代入 (=、 +=、 な ど を使用) す る
と 読み出す こ と がで き ます。
// Usage of T read(void)
hls::stream<int> my_stream;
int dst_var = my_stream.read();
>> 演算子はオーバー ロ ー ド さ れ、 C++ ス ト リ ームの ス ト リ ーム抽出演算子 (例 : iostreams、 filestreams な ど) の よ う に
使用で き ます。 hls::stream は LHS 引数、 お よ びデス テ ィ ネーシ ョ ン変数の RHS と し て提供 さ れてい ます。
// Usage of void operator >> (T & rdata)
hls::stream<int> my_stream;
int dst_var;
my_stream >> dst_var;
ノ ン ブ ロ ッ キング読み出 し お よび書き込み
読み出 し お よ び書 き 込みの ノ ンブ ロ ッ キ ン グ メ ソ ッ ド も 提供 さ れてい ます。 こ れに よ り 、 空の ス ト リ ーム FIFO か ら
の読み出 し やフル ス ト リ ーム FIFO への書 き 込みがあ っ て も 、 実行を続行 さ せ る こ と がで き ます。
こ れ ら の メ ソ ッ ド は、 ア ク セ ス の ス テー タ ス を示すブール値を戻 し ま す (問題なければ true、 それ以外は false)。
hls::stream<> ス ト リ ームの ス テー タ ス を テ ス ト す る ために、 別の メ ソ ッ ド も 提供 さ れてい ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
282
ハー ド ウ ェ アのコ ー ド 記述方法
ヒ ン ト : ノ ン ブ ロ ッ キ ン グ ア ク セ ス の詳細な メ ソ ッ ド は ど れ も 、 ap_hs プ ロ ト コ ルが選択 さ れた hls::stream<> イ ン
タ ーフ ェ イ ス では使用で き ません。
C シ ミ ュ レーシ ョ ン中、 ス ト リ ーム には無限サ イ ズが含 ま れ ま す。 こ のため、 ス ト リ ーム が フ ルの場合は C シ ミ ュ
レーシ ョ ンで検証はで き ません。 こ れ ら の メ ソ ッ ド は、 FIFO サ イ ズ (デフ ォ ル ト サ イ ズの 1 か STREAM 指示子で定
義 さ れた任意のサ イ ズ) が定義 さ れた場合の RTL シ ミ ュ レーシ ョ ン中にのみ検証で き ます。
ノ ン ブ ロ ッ キング書き込み
こ の メ ソ ッ ド では、 src_var 変数を my_stream ス ト リ ームに含め よ う と し 、 含まれ る 場合はブール値 true が戻 さ
れ る よ う に し てい ます。 それ以外の場合は false が戻 さ れて、 キ ュ ーは影響を受け ません。
// Usage of void write_nb(const T & wdata)
hls::stream<int> my_stream;
int src_var = 42;
if (my_stream.write_nb(src_var)) {
// Perform standard operations
...
} else {
// Write did not occur
return;
}
フ ルかど う かのテ ス ト
bool full(void)
こ の メ ソ ッ ド は、 hls::stream<> オブジ ェ ク ト が フルの場合にのみ true を戻 し ます。
// Usage of bool full(void)
hls::stream<int> my_stream;
int src_var = 42;
bool stream_full;
stream_full = my_stream.full();
ノ ン ブ ロ ッ キング読み出 し
bool read_nb(T & rdata)
こ の メ ソ ッ ド では、 ス ト リ ームか ら 値を読み出そ う と し 、 問題な く 読み出せた場合は true が戻 さ れます。 それ以外
の場合は false が戻 さ れて、 キ ュ ーは影響を受け ません。
// Usage of void read_nb(const T & wdata)
hls::stream<int> my_stream;
int dst_var;
if (my_stream.read_nb(dst_var)) {
// Perform standard operations
...
} else {
// Read did not occur
return;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
283
ハー ド ウ ェ アのコ ー ド 記述方法
}
空かど う かのテ ス ト
bool empty(void)
hls::stream<> が空の場合にのみ true を戻 し ます。
// Usage of bool empty(void)
hls::stream<int> my_stream;
int dst_var;
bool stream_empty;
fifo_empty = my_stream.empty();
次の例は、 ノ ンブ ロ ッ キ ン グ ア ク セ ス と フル/空のテ ス ト を組み合わせて、 RTL FIFO が フルま たは空の場合にエ ラ ー
を ど の よ う に処理す る か を示 し てい ます。
#include hls_stream.h
using namespace hls;
typedef struct {
short
data;
bool
valid;
bool
invert;
} input_interface;
bool invert(stream<input_interface>& in_data_1,
stream<input_interface>& in_data_2,
stream<short>& output
) {
input_interface in;
bool full_n;
// Read an input value or return
if (!in_data_1.read_nb(in))
if (!in_data_2.read_nb(in))
return false;
// If the valid data is written, return not-full (full_n) as true
if (in.valid) {
if (in.invert)
full_n = output.write_nb(~in.data);
else
full_n = output.write_nb(in.data);
}
return full_n;
}
ス ト リ ーム を使用 し たデザ イ ン例全体は、次を ク リ ッ ク し た Vivado HLS のサンプル デザ イ ン例のセ ク シ ョ ンに含ま
れます。
[Help] → [Welcome] → [Browse Examples] → [Design Examples] → [hls_stream]
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
284
C の任意精度型
RTL の FIFO の深 さ の制御
ス ト リ ー ミ ン グ デー タ を使用す る ほ と ん ど のデザ イ ンでは、 デフ ォ ル ト の RTL FIFO の深 さ 1 は十分な深 さ です。 こ
れは、 ス ト リ ー ミ ン グ デー タ が通常 1 度に 1 サンプルを処理す る か ら です。
イ ンプ リ メ ン テーシ ョ ンで FIFO の深 さ が 1 よ り 多 く 必要なマルチ レー ト デザ イ ンの場合は、STREAM 指示子を使用
し て RTL シ ミ ュ レーシ ョ ンが終了す る ために必要な深 さ を設定す る 必要があ り ます。FIFO の深 さ が十分でない場合、
RTL 協調シ ミ ュ レーシ ョ ンは停止 し ます。
こ のため、 ス ト リ ーム オブジ ェ ク ト は GUI の [Directives] タ ブには表示 さ れないので、 STREAM 指示子を [Directives]
タ ブか ら は直接適用で き ません。
hls::stream<> オブジ ェ ク ト が宣言 さ れてい る ( ま たは引数 リ ス ト に使用 さ れてい る か存在 し てい る ) 関数で右 ク
リ ッ ク し ます。
•
STREAM 指示子を選択 し ます。
•
variable フ ィ ール ド には、 その ス ト リ ーム変数名を入力 し ます。
ま たは、 次のいずれか を実行 し ます。
•
directives.tcl フ ァ イ ルで STREAM 指示子を手動で指定 し ます。
•
source に pragma と し て追加 し ます。
RTL 協調シ ミ ュ レーシ ョ ンのサポー ト
Vivado HLS の RTL 協調シ ミ ュ レーシ ョ ン機能では、 最上位 イ ン タ ーフ ェ イ ス に hls::stream<> メ ンバーを含む構
造ま たは ク ラ ス はサポー ト さ れません。 Vivado HLS では こ れ ら の構造お よ び ク ラ ス は合成でサポー ト さ れます。
typedef struct {
hls::stream<uint8_t> a;
hls::stream<uint16_t> b;
} strm_strct_t;
void dut_top(strm_strct_t indata, strm_strct_t outdata) { … }
こ れ ら の制限は、 最上位関数の引数 と グ ロ ーバルに宣言 さ れたオブジ ェ ク ト の両方に適用 さ れます。 ス ト リ ームの構
造体が合成に使用 さ れ る 場合は、 外部の RTL シ ミ ュ レー タ と ユーザーの作成 し た HDL テ ス ト ベンチを使用 し てデザ
イ ン を検証す る 必要があ り ま す。 内部 リ ン ケージの厳 し い hls::stream<> オブジ ェ ク ト には、 こ の よ う な制限は
あ り ません。
C の任意精度型
こ のセ ク シ ョ ンでは、 次について説明 し ます。
•
C 言語デザ イ ン用に Vivado HLS で提供 さ れ る 任意精度 (AP) 型
•
C の int#w 型用の関連関数
[u]int#W 型の コ ンパイル
[u]int#W 型を使用す る には、 [u]int#W 変数を参照す る ソ ース フ ァ イ ルすべてに ap_cint.h ヘ ッ ダー フ ァ イ ル
を含め る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
285
C の任意精度型
こ の型を使用す る ソ フ ト ウ ェ ア モデルを コ ンパ イ ルす る と き 、 Vivado HLS のヘ ッ ダー フ ァ イ ルの場所を指定す る 必
要があ る 場合があ り ます。 た と えば、 gcc コ ンパ イ ルには -I/<HLS_HOME>/include オプシ ョ ン を追加す る な ど し
ます。
ヒ ン ト : gcc -O3 オプシ ョ ン を使用 し て コ ンパ イ ルす る 場合には、 ソ フ ト ウ エア モデルで最高のパフ ォ ーマ ン ス に
な り ます。
[u]int#W 変数の宣言/定義
C 型には次の よ う にそれぞれ符号付 き お よ び符号な し があ り ます。
•
int#W
•
uint#W
説明 :
°
#W は数値で、 宣言 さ れてい る 変数の合計幅を指定 し ます。
次の例にあ る よ う に、 C/C++ の typedef 文を使用 し てユーザー定義型を作成す る こ と がで き ます。
include “ap_cint.h”
// use [u]int#W types
typedef uint128 uint128_t;
int96 my_wide_var;
// 128-bit user defined type
// a global variable declaration
幅の最大値は 1024 ビ ッ ト です。
定数 ( リ テ ラ ル) か ら の初期化および代入
[u]int#W 変数は、 ネ イ テ ィ ブ整数デー タ 型でサポー ト さ れてい る の と 同 じ 整数定数で初期化す る こ と がで き ます。
定数は [u]int#W 変数の最大幅ま でゼ ロ ま たは符号拡張 さ れます。
#include “ap_cint.h”
uint15
uint52
uint52
uint96
a
b
c
d
=
=
=
=
0;
1234567890U;
0o12345670UL;
0x123456789ABCDEFULL;
64 ビ ッ ト よ り も 大 き な ビ ッ ト 幅には、 次の フ ァ ン ク シ ョ ン を使用す る こ と がで き ます。
apint_string2bits()
こ のセ ク シ ョ ンで も 、 関連す る 関数の使用について説明 し ます。
•
apint_string2bits_bin()
•
apint_string2bits_oct()
•
apint_string2bits_hex()
こ れ ら の フ ァ ン ク シ ョ ンは、 基数 (10 進数、 2 進数、 8 進数、 16 進数) の制約内で指定 さ れた桁の定数文字列を、 ビ ッ
ト 幅 N の値に変換 し ます。 基数の場合、 値が負の値であ る こ と を示すには、 マ イ ナ ス記号 (-) を数字の前に付け ます。
int#Napint_string2bits[_radix](const char*, int N)
こ れは、 C 言語で許容 さ れ る 値 よ り も 大 き な値で整数定数を コ ン ス ト ラ ク ト す る のに使用 さ れます。 小 さ な値で も 問
題はあ り ませんが、 既存の C 言語の定数値で指定す る 方が簡単です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
286
C の任意精度型
#include <stdio.h>
#include “ap_cint.h”
int128 a;
// Set a to the value hex 00000000000000000123456789ABCDF0
a = a-apint_string2bits_hex(-123456789ABCDEF,128);
ま た、 値は文字列か ら 直接代入す る こ と がで き ます。
apint_vstring2bits()
こ の関数は、 16 進数の基数の制約内で指定 さ れた桁の定数文字列を、 ビ ッ ト 幅 N の値に変換 し ます。 値が負の値で
あ る こ と を示すには、 マ イ ナ ス記号 (-) を数字の前に付け ます。
こ れは、C 言語で許容 さ れ る 値 よ り も 大 き な値で整数定数を コ ン ス ト ラ ク ト する のに使用 さ れます。 こ の関数は通常、
フ ァ イ ルか ら 情報を読み出すためにテ ス ト ベンチで使用 さ れます。
フ ァ イ ル test.dat には次のデー タ が含まれてい る と し ます。
123456789ABCDEF
-123456789ABCDEF
-5
テ ス ト ベンチで使用 さ れてい る 場合、 こ の関数で次の値が出力 さ れます。
#include <stdio.h>
#include “ap_cint.h”
typedef data_t;
int128 test (
int128 t a
) {
return a+1;
}
int main () {
FILE *fp;
char vstring[33];
fp
= fopen(test.dat,r);
while (fscanf(fp,%s,vstring)==1) {
//
//
//
//
Supply function “test” with the following values
00000000000000000123456789ABCDF0
FFFFFFFFFFFFFFFFFEDCBA9876543212
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC
test(apint_vstring2bits_hex(vstring,128));
printf(\n);
}
fclose(fp);
return 0;
}
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
287
C の任意精度型
コ ン ソ ール I/O (出力) のサポー ト
[u]int#W 変数は、 ネ イ テ ィ ブ整数デー タ 型でサポー ト さ れてい る の と 同 じ 変換指定子で出力す る こ と がで き ます。
変換指定子に基づいて フ ィ ッ ト す る ビ ッ ト のみが出力 さ れます。
#include “ap_cint.h”
uint164
c = 0x123456789ABCDEFULL;
printf( d%40d\n,c);
// d
printf( hd%40hd\n,c);
// hd
printf( ld%40ld\n,c);
// ld
printf(lld%40lld\n,c);
// lld
// Signed integer in decimal format
-1985229329
// Short integer
-12817
// Long integer
81985529216486895
// Long long integer
81985529216486895
printf( u%40u\n,c);
// u
printf( hu%40hu\n,c);
// hu
printf( lu%40lu\n,c);
// lu
printf(llu%40llu\n,c);
// llu
// Unsigned integer in decimal format
2309737967
printf( o%40o\n,c);
// o
printf( ho%40ho\n,c);
// ho
printf( lo%40lo\n,c);
// lo
printf(llo%40llo\n,c);
// llo
// Unsigned integer in octal format
21152746757
printf( x%40x\n,c);
// x
printf( hx%40hx\n,c);
// hx
printf( lx%40lx\n,c);
// lx
printf(llx%40llx\n,c);
// llx
// Unsigned integer in hexadecimal format [0-9a-f]
89abcdef
printf(
// X
}
// Unsigned integer in hexadecimal format [0-9A-F]
89ABCDEF
X%40X\n,c);
52719
81985529216486895
81985529216486895
146757
4432126361152746757
4432126361152746757
cdef
123456789abcdef
123456789abcdef
[u]int#W 変数の初期化お よ び代入の場合 と 同様に、 64 ビ ッ ト よ り も 大 き な値の出力を サポー ト す る ための機能が
提供 さ れてい ます。
apint_print()
こ れは、 C 言語で許容 さ れ る 値 よ り も 大 き な値の整数を表示す る のに使用 さ れ ま す。 こ の関数は、 基数 (2、 8、 10、
16) に基づいて処理 さ れた値を stdout に出力 し ます。
void
apint_print(int#N value, int radix)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
288
C の任意精度型
apint_printf() が使用 さ れてい る と き の結果値の例は次の よ う にな り ます。
#include <stdio.h>
#include “ap_cint.h”
int65 Var1 = 44;
apint_print(tmp,2);
//00000000000000000000000000000000000000000000000000000000000101100
apint_print(tmp,8);
// 0000000000000000000054
apint_print(tmp,10);
// 44
apint_print(tmp,16);
// 0000000000000002C
apint_fprint()
こ れは、C 言語で許容 さ れ る 値 よ り も 大 き な値の整数を表示する のに使用 さ れます。 こ の フ ァ ン ク シ ョ ンは、基数 (2、
8、 10、 16) に基づいて処理 さ れた値を フ ァ イ ルに出力 し ます。
void
apint_fprint(FILE* file, int#N value, int radix)
[u]int#W 型を使用 し た式
[u]int#W 型の変数は、 通常 C 演算子を使用 し た式では自由に使用す る こ と がで き ます。 し か し 、 一部には予期 し な
い動作が見 ら れ、 説明が必要な こ と があ り ます。
ビ ッ ト 幅が小 さ い値を幅が大き い ものへ代入する場合のゼロ ま たは符号拡張
ビ ッ ト 幅が小 さ い符号付 き 変数の値を幅の大 き な も のへ代入す る と 、 符号に関わ ら ず、 値はデス テ ィ ネーシ ョ ン変数
の幅 (大 き いほ う の幅) に符号拡張 さ れます。
同様に、 符号な し のビ ッ ト 幅の小 さ い変数は代入前にゼ ロ 拡張 さ れます。
代入で予期動作を得 る には、 ソ ース変数の明示的な型変換が必要にな る こ と があ り ます。
ビ ッ ト 幅が大き い値を幅が小 さ い ものへ代入する場合の切 り 捨て
ビ ッ ト 幅が大 き い ソ ース変数値を幅の小 さ な も のへ代入す る と 、 値が切 り 捨て ら れ、 デス テ ィ ネーシ ョ ン値 (幅の小
さ いほ う の値) の最上位ビ ッ ト (MSB) を超え た ビ ッ ト はすべて失われます。
こ の切 り 捨てが行われ る と き 、 符号情報が特別に処理 さ れ る わけではないので、 予期 し ない動作が見 ら れ る 可能性が
あ り ます。 予期 し ない動作を防 ぐ には、 明示的な型変換を利用 し ます。
2 進数の演算子
通常、 ネ イ テ ィ ブの C 整数デー タ 型で実行可能な有効な演算は [u]int#w 型でサポー ト さ れてい ます。
任意精度演算を行 う ため、 標準 2 進数整数演算子がオーバー ロ ー ド さ れます。 次の演算子ではすべて、 [u]int#W の
2 つのオペ ラ ン ド が使用 さ れ る か、 ま たは [u]int#W 型を 1 つ と C/C++ 整数デー タ 型 1 つ (char、 short、 int な
ど) が使用 さ れます。
結果値の幅お よ び符号は、 デス テ ィ ネーシ ョ ン変数 (ま たは式) の幅に基づいて符号拡張、 ゼ ロ の追加、 ま たは切 り 捨
てが実行 さ れ る 前に、 オペ ラ ン ド の幅お よ び符号で決ま り ます。 返 さ れ る 値の詳細は各演算子で説明 さ れてい ます。
式に ap_[u]int 型お よ び C/C++ 整数型の両方が含まれてい る 場合、 C++ 型では次の幅が使用 さ れます。
•
char :8 ビ ッ ト
•
short :16 ビ ッ ト
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
289
C の任意精度型
•
int :32 ビ ッ ト
•
long :32 ビ ッ ト
•
long long :64 ビ ッ ト
加算
[u]int#W::RType [u]int#W::operator + ([u]int#W op)
こ の式は、 2 つの ap_[u]int (ま たは ap_[u]int 1 つ と C/C++ 整数型を 1つ) の和を計算 し ます。
和の幅は、 次の よ う にな り ます。
•
2 つのオペ ラ ン ド の幅の大 き いほ う よ り も 1 ビ ッ ト 大き く な る
•
幅の広いほ う が符号な し で幅の小 さ いほ う が符号付 き の場合のみ 2 ビ ッ ト 大 き く な る
オペ ラ ン ド のいずれか (ま たは両方) が符号付 き であれば、 和は符号付 き と し て処理 さ れ る
減算
[u]int#W::RType [u]int#W::operator - ([u]int#W op)
•
2 つの整数の差を計算す る 式です。
•
相違値の幅は、 次の よ う にな り ます。
°
2 つのオペ ラ ン ド の幅の大 き いほ う よ り も 1 ビ ッ ト 大き く な る
°
幅の広いほ う が符号な し で幅の小 さ いほ う が符号付 き の場合のみ 2 ビ ッ ト 大 き く な る
•
代入前に、 デス テ ィ ネーシ ョ ン変数の幅に基づいて、 符号拡張、 ゼ ロ の追加、 ま たは切 り 捨てが実行 さ れます。
•
オペ ラ ン ド の符号に関わ ら ず、 差は符号付 き と し て処理 さ れます。
乗算
[u]int#W::RType [u]int#W::operator * ([u]int#W op)
•
2 つの整数値の積を戻 し ます。
•
積の幅はオペ ラ ン ド の幅の合計です。
•
オペ ラ ン ド のいずれかが符号付 き であれば、 積は符号付 き と し て処理 さ れます。
除算
[u]int#W::RType [u]int#W::operator / ([u]int#W op)
•
2 つの整数値の商を計算 し ます。
•
除数が符号な し であ る 場合、 商の幅は被除数の幅 と な り 、 そ う でない場合は、 商の幅は被除数の幅に 1 を足 し た
も のの幅 と な り ます。
•
オペ ラ ン ド のいずれかが符号付 き であれば、 商は符号付 き と し て処理 さ れます。
注記 : 除算演算子 を Vivado HLS で合成す る と 、 生成 さ れ た RTL に適切にパ ラ メ ー タ ー設定 さ れ た ザ イ リ ン ク ス
LogiCORE™ IP の除算 コ アが イ ン ス タ ン シエー ト さ れます。
剰余
[u]int#W::RType [u]int#W::operator % ([u]int#W op)
•
2 つの整数値の整数除算の余 り を戻 し ます。
•
オペ ラ ン ド が ど ち ら も 同 じ 符号であ る 場合は、剰余の幅はオペ ラ ン ド の幅の最小値 と な り ます。除数が符号な し 、
被除数が符号付 き の場合は、 剰余の幅は除数の幅に 1 を足 し た も の と な り ます。
•
除数が符号な し 、 被除数が符号付 き の場合は、 剰余の幅は除数の幅に 1 を足 し た も の と な り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
290
C の任意精度型
注記 : 剰余 (%) 演算子を Vivado HLS で合成す る と 、 生成 さ れた RTL で適宜パ ラ メ ー タ ー設定 さ れたザ イ リ ン ク ス
LogiCORE 除算 コ アが イ ン ス タ ン シエー ト さ れます。
ビ ッ ト 単位の論理演算子
ビ ッ ト 単位の論理演算子はすべて、 2 つのオペ ラ ン ド の幅の最大値 と な る 幅の値を返 し 、 両方のオペ ラ ン ド が符号な
し の場合にのみ符号な し と し て処理 さ れます。 そ う でない場合は、 符号付 き と し て処理 さ れます。
符号拡張 (ま たはゼ ロ の追加) は、 デス テ ィ ネーシ ョ ン変数ではな く 、 式の符号に基づいて実行 さ れます。
ビ ッ ト 単位の OR
[u]int#W::RType [u]int#W::operator | ([u]int#W op)
2 つのオペ ラ ン ド の ビ ッ ト 単位の OR 値を返 し ます。
ビ ッ ト 単位の AND
[u]int#W::RType [u]int#W::operator & ([u]int#W op)
2 つのオペ ラ ン ド の ビ ッ ト 単位の AND 値を返 し ます。
ビ ッ ト 単位の XOR
[u]int#W::RType [u]int#W::operator ^ ([u]int#W op)
2 つのオペ ラ ン ド の ビ ッ ト 単位の XOR 値を返 し ます。
シ フ ト 演算子
各シ フ ト 演算子には 2 つのバージ ョ ンがあ り 、 1 つは符号な し の右辺 (RHS) オペ ラ ン ド 、 も う 1 つは符号付き の RHS
です。
符号付 き RHS に負の値が与え ら れ る と シ フ ト 演算の方向を逆に し ま す。 た と えば、 RHS オペ ラ ン ド の絶対値に よ る
シ フ ト が逆の方向で発生 し ます。
シ フ ト 演算子は、 左辺 (LHS) オペ ラ ン ド と 同 じ 幅の値を返 し ます。 C/C++ の場合 と 同 じ よ う に、 右シ フ ト の LHS オペ
ラ ン ド が符号付 き の場合、 符号ビ ッ ト は、 LHS オペ ラ ン ド の符号を維持 し つつ、 最上位ビ ッ ト に コ ピー さ れます。
符号な し 整数右シ フ ト
[u]int#W [u]int#W::operator << (ap_uint<int_W2> op)
整数右シ フ ト
[u]int#W [u]int#W::operator << (ap_int<int_W2> op)
符号な し 整数左シ フ ト
[u]int#W [u]int#W::operator >> (ap_uint<int_W2> op)
整数左シ フ ト
[u]int#W [u]int#W::operator >> (ap_int<int_W2> op)
注意 : 左シ フ ト 演算子の結果を幅が広いほ う のデス テ ィ ネーシ ョ ン変数に代入する と 、 情報の一部ま たはすべてが失
われ る 場合があ り ますので注意 し て く だ さ い。 予期 し ない動作を防ぐ には、 シ フ ト 式を代入 さ れ る ほ う の型に明示的
に型変換す る よ う に し て く だ さ い。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
291
C の任意精度型
複合代入演算子
Vivado HLS では、 次の複合演算子がサポー ト さ れてい ます。
•
*=
•
/=
•
%=
•
+=
•
-=
•
<<=
•
>>=
•
&=
•
^=
•
=
RHS 式は計算 さ れてか ら 、 基本演算子に RHS オペ ラ ン ド と し て渡 さ れ、 LHS 変数にその結果が代入 さ れます。 式の
長 さ 、 符号、 符号拡張か切 り 捨てかのルールは、 関連す る 演算に対 し 上記で説明 さ れてい る よ う に、 適用 さ れます。
関係演算子
Vivado HLS では、 すべての関係演算子がサポー ト さ れてお り 、 比較結果に基づい てブール形式の値が返 さ れ ま す。
ap_[u]int 型の変数は、 こ れ ら の演算子を使用 し て C/C++ 基本整数型に比較す る こ と がで き ます。
等号
bool [u]int#W::operator == ([u]int#W op)
等号否定
bool [u]int#W::operator != ([u]int#W op)
小な り
bool [u]int#W::operator < ([u]int#W op)
大な り
bool [u]int#W::operator > ([u]int#W op)
小な り イ コ ール
bool [u]int#W::operator <= ([u]int#W op)
大な り イ コ ール
bool [u]int#W::operator >= ([u]int#W op)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
292
C の任意精度型
ビ ッ ト レ ベル演算 :サポー ト さ れる関数
[u]int#W 型を使用す る と 変数を ビ ッ ト レベルの精度で計算す る こ と がで き ます。 ビ ッ ト レベル演算を実行す る に
はハー ド ウ ェ ア アルゴ リ ズ ム を使用す る のが最適であ る こ と が よ く あ り ます。 Vivado HLS では次の よ う な関数が提
供 さ れてい ます。
ビ ッ ト 操作
ap_[u]int 型変数に格納 さ れてい る 値に基づいて一般的な ビ ッ ト レベル演算を行 う ために、 次の メ ソ ッ ド が提供 さ
れてい ます。
長さ
apint_bitwidthof()
int
apint_bitwidthof(type_or_value)
任意精度の整数値でビ ッ ト 数を示す整数値を戻 し ます。 1 つの型ま たは値で使用する こ と がで き ます。
int5 Var1, Res1;
Var1= -1;
Res1 = apint_bitwidthof(Var1);
Res1 = apint_and_reduce(int7);
// Res1 is assigned 5
// Res1 is assigned 7
連結
apint_concatenate()
int#(N+M)
apint_concatenate(int#N first, int#M second)
2 つの [u]int#W 変数を連結 し ます。 返 さ れた値の幅はオペ ラ ン ド の幅の和です。
引数の高い値お よ び低い値は、 それぞれ結果の高位お よ び低位ビ ッ ト にな り ます。
推奨 : 整数 リ テ ラ ルを含むネ イ テ ィ ブ C 型は、 予期 し ない結果を避け る ため、連結前に該当す る [u]int#W 型に明示
的に型変換 し ます。
ビ ッ ト 選択
apint_get_bit()
int
apint_get_bit(int#N source, int index)
任意精度の整数値か ら 1 ビ ッ ト 選択 し 、 それを戻 し ます。
ソ ース は [u]int#W 型、 イ ンデ ッ ク ス引数は int 値であ る 必要があ り ます。 選択す る ビ ッ ト の指数を指定 し 、 最下
位ビ ッ ト は指数 0 にな り ます。 最大指数は こ の [u]int#W のビ ッ ト 幅か ら 1 を引いた値にな り ます。
ビ ッ ト 値の設定
apint_set_bit()
int#N
•
apint_set_bit(int#N source, int index, int value)
[u]int#W イ ン ス タ ン ス ソ ース の指定ビ ッ ト 、 指数、 を指定値 (0 ま たは 1) に設定 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
293
C の任意精度型
範囲選択
apint_get_range()
int#N
apint_get_range(int#N source, int high, int low)
•
引数で指定 さ れ る ビ ッ ト の範囲で表 さ れ る 値を戻 し ます。
•
引数 high は、 範囲内の最上位ビ ッ ト (MSB) を指定
•
引数 low は範囲内の最下位ビ ッ ト (LSB) を指定
•
ソ ース変数の LSB は 0 の位置にあ り ます。 引数 high の値が low の も の よ り 小 さ い場合、 ビ ッ ト は逆順で返 さ れ
ます。
範囲値設定
apint_set_range()
int#N
•
apint_set_range(int#N source, int high, int low, int#M part)
high と low 間の ソ ース指定ビ ッ ト を part の値に設定 し ます。
ビ ッ ト 低減
AND を使用 し た低減
apint_and_reduce()
int
•
•
apint_and_reduce(int#N value)
値のすべてのビ ッ ト に対 し AND 演算を適用 し ます。
整数値 と し て単一ビ ッ ト の結果値を戻 し ます (ブールに型変換可能)。
int5 Var1, Res1;
•
Var1= -1;
Res1 = apint_and_reduce(Var1);
// Res1 is assigned 1
Var1= 1;
Res1 = apint_and_reduce(Var1);
// Res1 is assigned 0
-1 と 比較 し て、 次を戻 し ます。 一致すれば 1不一致の場合は 0すべてのビ ッ ト が 1 であ る こ と をチ ェ ッ ク す る 方
法で も あ り ます。
OR を使用 し た低減
apint_or_reduce()
int
apint_or_reduce(int#N value)
•
値のすべてのビ ッ ト に対 し XOR 演算を適用 し ます。
•
整数値 と し て単一ビ ッ ト の結果値を戻 し ます (ブールに型変換可能)。
•
こ の演算は、 0 と 比較 し て一致すれば 0 を返 し 、 一致 し なければ 1 を戻 し ます。
int5 Var1, Res1;
Var1= 1;
Res1 = apint_or_reduce(Var1);
// Res1 is assigned 1
Var1= 0;
Res1 = apint_or_reduce(Var1);
// Res1 is assigned 0
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
294
C の任意精度型
XOR を使用 し た低減
apint_xor_reduce()
int
apint_xor_reduce(int#N value)
•
値のすべてのビ ッ ト に対 し OR 演算を適用 し ます。
•
整数値 と し て単一ビ ッ ト の結果値を戻 し ます (ブールに型変換可能)。
•
ワー ド 内の 1 の数を カ ウ ン ト し 、 次を戻 し ます。
°
偶数の場合は 1
°
奇数 (偶数パ リ テ ィ ) の場合は 0
int5 Var1, Res1;
Var1= 1;
Res1 = apint_xor_reduce(Var1);
// Res1 is assigned 0
Var1= 0;
Res1 = apint_xor_reduce(Var1);
// Res1 is assigned 1
NAND を使用 し た低減
apint_nand_reduce()
int
apint_nand_reduce(int#N value)
•
値のすべてのビ ッ ト に対 し NAND 演算を適用 し ます。
•
整数値 と し て単一ビ ッ ト の結果値を戻 し ます (ブールに型変換可能)。
•
こ の値を -1 (すべて 1) と 比較 し 、 一致すれば false、 そ う でなければ true を返 し ます。
int5 Var1, Res1;
Var1= 1;
Res1 = apint_nand_reduce(Var1);
// Res1 is assigned 1
Var1= -1;
Res1 = apint_nand_reduce(Var1);
// Res1 is assigned 0
NOR を使用 し た低減
apint_nor_reduce()
int
apint_nor_reduce(int#N value)
•
値のすべてのビ ッ ト に対 し NOR 演算を適用 し ます。
•
整数値 と し て単一ビ ッ ト の結果値を戻 し ます (ブールに型変換可能)。
•
こ の値を 0 (すべて 0) と 比較 し 、 一致すれば true、 そ う でなければ false を返 し ます。
int5 Var1, Res1;
Var1= 0;
Res1 = apint_nor_reduce(Var1);
// Res1 is assigned 1
Var1= 1;
Res1 = apint_nor_reduce(Var1);
// Res1 is assigned 0
XNOR を使用 し た低減
apint_xnor_reduce()
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
295
C++ の任意精度型
int
apint_xnor_reduce(int#N value)
•
値のすべてのビ ッ ト に対 し XNOR 演算を適用 し ます。
•
整数値 と し て単一ビ ッ ト の結果値を戻 し ます (ブールに型変換可能)。
•
ワー ド 内の 1 の数を カ ウ ン ト し 、
•
次を戻 し ます。
°
奇数の場合は 1
°
偶数 (奇数パ リ テ ィ ) の場合は 0
int5 Var1, Res1;
Var1= 0;
Res1 = apint_xnor_reduce(Var1);
// Res1 is assigned 0
Var1= 1;
Res1 = apint_xnor_reduce(Var1);
// Res1 is assigned 1
C++ の任意精度型
Vivado HLS では、 ソ フ ト ウ ェ ア と ハー ド ウ ェ ア モデ リ ン グ間での一貫 し た、 ビ ッ ト 精度の動作で、 任意精度 (ま たは
ビ ッ ト 精度) の整数デー タ 型を イ ン プ リ メ ン ト す る ap_[u]int<> と い う C++ のテ ン プ レー ト ク ラ ス が提供 さ れて
い ます。
こ の ク ラ ス は、 ネ イ テ ィ ブ C 整数型で使用可能なすべての四則演算、 ビ ッ ト 単位、 論理、 関係演算子を提供 し てい ま
す。 さ ら に、 64 ビ ッ ト よ り も 幅が広い変数の初期化お よ び変換を可能にす る ハー ド ウ ェ ア演算の一部を処理す る ため
の メ ソ ッ ド も 、 こ の ク ラ ス で提供 し てい ます。 演算子お よ び ク ラ ス メ ソ ッ ド の詳細は次を参照 し て く だ さ い。
ap_[u]<> 型の コ ンパイル
ap_[u]fixed<> ク ラ ス を 使用す る には、 ap_[u]fixed<> 変数 を 参照す る ソ ー ス フ ァ イ ルすべて に ap_int.h
ヘ ッ ダー フ ァ イ ルを含め る 必要があ り ます。
こ れ ら の ク ラ ス を使用す る ソ フ ト ウ ェ ア モデルを コ ンパ イ ルす る と き 、 Vivado HLS のヘ ッ ダー フ ァ イ ルの場所を指
定す る 必要があ る 場合があ り ます。 た と えば、 gcc コ ンパ イ ルには -I/<HLS_HOME>/include オプシ ョ ン を追加す
る な ど し ます。
ヒ ン ト : g++ -O3 オプシ ョ ン を使用 し て コ ンパ イ ルす る 場合には、 ソ フ ト ウ エア モデルで最高のパフ ォ ーマ ン ス に
な り ます。
ap_[u] 変数の宣言/定義
次の よ う にそれぞれ符号付 き お よ び符号な し の ク ラ ス が別々にあ り ます。
•
ap_int<int_W> (符号付 き )
•
ap_uint<int _W> (符号な し )
テ ンプ レー ト パ ラ メ ー タ ーの int_W は宣言 さ れてい る 変数の合計幅を指定 し ます。
次の例にあ る よ う に、 C/C++ の typedef 文を使用 し てユーザー定義型を作成す る こ と がで き ます。
include “ap_int.h”//
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
use ap_[u]fixed<> types
japan.xilinx.com
Send Feedback
296
C++ の任意精度型
typedef ap_uint<128> uint128_t;
ap_int<96> my_wide_var;
// 128-bit user defined type
// a global variable declaration
デフ ォ ル ト の幅の最大許容幅は 1024 ビ ッ ト です。 こ のデフ ォ ル ト は、 ap_int.h ヘ ッ ダー フ ァ イ ルを含め る 前に、
32768 以下の正の整数値でマ ク ロ AP_INT_MAX_W を定義する と 上書き する こ と がで き ます。
注意 : AP_INT_MAX_W の値を あ ま り 高 く 設定す る と 、ソ フ ト ウ ェ アの コ ンパ イ ルお よ び実行に時間がかか る 可能性が
あ り ます。
次は AP_INT_MAX_W を上書 き す る 例です。
#define AP_INT_MAX_W 4096
#include “ap_int.h”
// Must be defined before next line
ap_int<2048> very_wide_var;
定数 ( リ テ ラ ル) か ら の初期化および代入
ク ラ ス コ ン ス ト ラ ク タ ーお よ び代入演算子の オーバー ロ ー ド を 利用 し 、 標準 C/C++ の整数 リ テ ラ ル を 使用 し て
ap_[u]fixed<> 変数を初期化お よ び代入す る こ と がで き ます。
し か し 、 こ の ap_[u]fixed<> 変数への値の代入方法は、 C++ お よ び ソ フ ト ウ ェ アが実行 さ れ る シ ス テ ム の制限の
対象 と な る ので、 通常、 整数 リ テ ラ ルの 64 ビ ッ ト 制限 (LL ま たは ULL 接頭辞な ど) の影響を受け ます。
ap_[u]fixed<> ク ラ ス では、任意の長 さ (変数の幅以下の も の) の文字列か ら 初期化が可能な コ ン ス ト ラ ク タ が提供
さ れてい ます。
デフ ォ ル ト では、 文字列に有効な 16 進数 (0 か ら 9 ま での数字お よ び a か ら f の文字) のみが含まれてい る 限 り 、 文
字列は 16 進数値 と し て処理 さ れ ます。 その よ う な文字列か ら 値を代入す る には、 文字列を該当す る 型へ と 、 明示的
に C++ 形式の型変換を行 う 必要があ り ます。
64 ビ ッ ト よ り も 大 き な値を含む初期化お よ び代入の例は次の と お り です。
ap_int<42> a_42b_var(-1424692392255LL);
a_42b_var = 0x14BB648B13FLL;
a_42b_var = -1;
// long long decimal format
// hexadecimal format
// negative int literal sign-extended to full width
ap_uint<96> wide_var(“76543210fedcba9876543210”);
wide_var = ap_int<96>(“0123456789abcdef01234567”);
// Greater than 64-bit
ap_[u]<> コ ン ス ト ラ ク タ は、 基数 2、 8、 10、 ま たは 16 で数値を表わ し て文字を処理す る よ う に明示的に指定す る
こ と がで き ます。 コ ン ス ト ラ ク タ の呼び出 し に 2 番目のパ ラ メ ー タ ー と し て該当する 基数値を追加する と 、 こ の設定
がで き ます。
指定 さ れてい る 基数に対 し て無効な文字が文字 リ テ ラ ルに含まれてい る と 、 コ ンパ イ ル エ ラ ーが発生 し ます。
それぞれの基数フ ォーマ ッ ト の例は次の と お り です。
ap_int<6> a_6bit_var(“101010”, 2);
a_6bit_var = ap_int<6>(“40”, 8);
a_6bit_var = ap_int<6>(“55”, 10);
a_6bit_var = ap_int<6>(“2A”, 16);
a_6bit_var = ap_int<6>(“42”, 2);
//
//
//
//
42d in binary format
32d in octal format
decimal format
42d in hexadecimal format
// COMPILE-TIME ERROR!“42” is not binary
文字列でエン コ ー ド さ れてい る 基数は、 「0」 の後に 「 b 」 、 「o」 、 ま たは 「x」 を続けた接頭辞を付け る と 、 コ ン ス ト
ラ ク タ で自動推論す る こ と も で き ます。 「0b」、 「0o」、 お よ び 「0x」 と い う 接頭辞はそれぞれ 2 進数、 8 進数、 16 進数
の フ ォーマ ッ ト に対応 し てい ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
297
C++ の任意精度型
こ の初期化文字列フ ォーマ ッ ト を使用 し た例は次の と お り です。
ap_int<6> a_6bit_var(“0b101010”, 2);
a_6bit_var = ap_int<6>(“0o40”, 8);
a_6bit_var = ap_int<6>(“0x2A”, 16);
// 42d in binary format
// 32d in octal format
// 42d in hexidecimal format
a_6bit_var = ap_int<6>(“0b42”, 2);
// COMPILE-TIME ERROR!“42” is not binary
ビ ッ ト 幅が 53 ビ ッ ト を超え る 場合、 ap_[u]fixed 値は次の よ う に文字列で初期化す る 必要があ り ます。
ap_ufixed<72,10> Val(“2460508560057040035.375”);
コ ン ソ ール I/O (出力) のサポー ト
ap_[u]fixed<> 変数の初期化お よ び代入の場合 と 同様に、 Vivado HLS では 64 ビ ッ ト よ り も 大 き な値の出力を サ
ポー ト す る ための機能が提供 さ れてい ます。
C++ の標準出力ス ト リ ームの使用
ap_[u]int 変数に格納 さ れてい る 値を出力する のに最 も 簡単な方法は、 次の C++ の標準出力ス ト リ ームのいずれか
を使用す る 方法です。
•
std::cout (#include <iostream>)
•
std::cout (#include <iostream.h>)
ス ト リ ーム挿入演算子 << は、任意の ap_[u]fixed 変数に対す る 範囲全体に含まれ る 値が正 し く 出力 さ れ る よ う に、
オーバー ロ ー ド さ れます。 次の ス ト リ ーム マニ ピ ュ レー タ ー も サポー ト さ れてい ます。
•
dec (10 進数)
•
hex (16 進数)
•
oct (8 進数)
こ れに よ り 、 値を指定どお り に フ ォーマ ッ ト す る こ と がで き ます。
次の例では、 値を出力す る のに cout が使用 さ れてい ます。
#include <iostream.h>
// Alternative:#include <iostream>
ap_ufixed<72> Val(“10fedcba9876543210”);
cout << Val << endl;
// Yields:“313512663723845890576”
cout << hex << val << endl; // Yields:“10fedcba9876543210”
cout << oct << val << endl; // Yields:“41773345651416625031020”
標準 C ラ イ ブ ラ リ の使用
標準 C ラ イ ブ ラ リ (#include <stdio.h>) を使用 し て、 64 ビ ッ ト よ り も 大き な値を出力する こ と も で き ます。
1.
ap_[u]fixed ク ラ ス の to_string() メ ソ ッ ド を使用 し 、 値を C++ の std::string に変換 し ます。
2.
その結果を std::string ク ラ ス の c_str() メ ソ ッ ド を使用 し て、 ヌ ルで終了す る C 文字に変換 し ます。
オプ シ ョ ンの引数 1 (基数の指定)
ap[u]int::to_string() メ ソ ッ ド では目的の基数を指定す る オプシ ョ ンの引数を渡す こ と がで き ます。 有効な基
数の引数値は、 次の と お り です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
298
C++ の任意精度型
•
2 (2 進数)
•
8 (8 進数)
•
10 (10 進数)
•
16 (16 進数) (デフ ォ ル ト )
オプ シ ョ ンの引数 2 (符号付きの値 と し て出力)
ap_[u]int::to_string() の 2 つ目のオプシ ョ ンの引数は、 10 進数以外の フ ォーマ ッ ト で符号付 き の値を出力す
る か ど う か を指定 し ます。 こ の引数はブール形式です。 デフ ォ ル ト 値は false で、 10 進数以外の フ ォーマ ッ ト で符号
な し の値が出力 さ れます。
次の例では、 値を出力す る のに printf が使用 さ れてい ます。
ap_int<72> Val(“80fedcba9876543210”);
printf(“%s\n”,
printf(“%s\n”,
printf(“%s\n”,
printf(“%s\n”,
Val.to_string().c_str();
//
Val.to_string(10).c_str();
//
Val.to_string(8).c_str();
//
Val.to_string(16, true).c_str();
=>
=>
=>
//
“80FEDCBA9876543210”
“-2342818482890329542128”
“401773345651416625031020”
=> “-7F0123456789ABCDF0”
ap_[u]<> 型を使用 し た式
ap_[u]<> 型の変数は、 通常 C/C++ 演算子を使用 し た式では自由に使用す る こ と がで き ま す。 し か し 、 一部には予
期 し ない動作が見 ら れ る こ と があ り ます。 こ れについては、 次を参照 し て く だ さ い。
ビ ッ ト 幅が小 さ い値を幅が大き い ものへ代入する場合のゼロ ま たは符号拡張
ビ ッ ト 幅が小 さ い符号付 き (ap_int<>) 変数の値を幅の大 き な も のへ代入す る と 、 符号に関わ ら ず、 値はデ ス テ ィ
ネーシ ョ ン変数 (幅の大 き い変数) の幅に符号拡張 さ れます。
同様に、 符号な し のビ ッ ト 幅の小 さ い変数は代入前にゼ ロ 拡張 さ れます。
代入で予期動作を得 る には、 ソ ース変数の明示的な型変換が必要にな る こ と があ り ます。 次に例を示 し ます。
ap_uint<10> Result;
ap_int<7> Val1 = 0x7f;
ap_uint<6> Val2 = 0x3f;
Result = Val1;
Result = Val2;
// Yields:0x3ff (sign-extended)
// Yields:0x03f (zero-padded)
Result = ap_uint<7>(Val1);
Result = ap_int<6>(Val2);
// Yields:0x07f (zero-padded)
// Yields:0x3ff (sign-extended)
ビ ッ ト 幅が大き い値を幅が小 さ い ものへ代入する場合の切 り 捨て
ビ ッ ト 幅が大 き い ソ ース変数値を幅の小 さ な も のへ代入す る と 、 値が切 り 捨て ら れ、 デス テ ィ ネーシ ョ ン値 (幅の小
さ いほ う の値) の最上位ビ ッ ト (MSB) を超え た ビ ッ ト はすべて失われます。
こ の切 り 捨てが行われ る と き 、 符号情報が特別に処理 さ れ る わけではないので、 予期 し ない動作が見 ら れ る 可能性が
あ り ます。 予期 し ない動作を防 ぐ には、 明示的な型変換を利用 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
299
C++ の任意精度型
ク ラ ス演算子および メ ソ ッ ド
ap_[u]int 型では、wide ap_[u]int (> 64 ビ ッ ト ) か ら ビル ト イ ン C/C++ 整数型への暗示的な変換はサポー ト さ
れません。 た と えば、 次の コ ー ド 例の場合、 ap_int[65] か ら if 文内の bool 型への暗示的な キ ャ ス ト で 0 が戻 さ
れ る ので、 戻 り 値は 1 にな り ます。
bool nonzero(ap_uint<65> data) {
return data; // This leads to implicit truncation to 64b int
}
int main() {
if (nonzero((ap_uint<65>)1 << 64)) {
return 0;
}
printf(FAIL\n);
return 1;
}
幅の大 き い ap_[u]int 型を ビル ト イ ンの整数へ変換す る には、 ap_[u]int に含ま れ る 次の明示的な変換関数を使
用 し ます。
•
to_int()
•
to_long()
•
to_bool()
通 常、 ネ イ テ ィ ブ の C/C++ 整 数 デ ー タ 型 で 実行可能 な 有効 な 演算 は、 演算子 を オ ー バ ー ロ ー ド す る こ と で、
ap_[u]int 型でサポー ト さ れてい ます。
オーバー ロ ー ド さ れた演算子に加え、一部の特定演算子お よ び メ ソ ッ ド を使用 し て ビ ッ ト レベルの演算を簡単にす る
こ と がで き ます。
2 進数の演算子
任意精度演算を行 う ため、 標準 2 進数整数演算子がオーバー ロ ー ド さ れます。 次の演算子では次のいずれかが使用 さ
れます。
•
ap_[u]int の 2 つのオペ ラ ン ド
•
ap_[u]int 型を 1 つ と C/C++ 整数デー タ 型 1 つ
次に例を示 し ます。
•
char
•
short
•
int
結果値の幅お よ び符号は、 デス テ ィ ネーシ ョ ン変数 (ま たは式) の幅に基づいて符号拡張、 ゼ ロ の追加、 ま たは切 り 捨
てが実行 さ れ る 前に、 オペ ラ ン ド の幅お よ び符号で決ま り ます。 返 さ れ る 値の詳細は各演算子で説明 さ れてい ます。
式に ap_[u]int 型お よ び C/C++ 整数型の両方が含まれてい る 場合、 C++ 型では次の幅が使用 さ れます。
•
char (8 ビ ッ ト )
•
short (16 ビ ッ ト )
•
int (32 ビ ッ ト )
•
long (32 ビ ッ ト )
•
long long (64 ビ ッ ト )
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
300
C++ の任意精度型
加算
ap_(u)int::RType ap_(u)int::operator + (ap_(u)int op)
次の和が戻 さ れます。
•
ap_[u]int を 2 つ
•
ap_[u]int 1 つ と C/C++ 整数デー タ 型
和の幅は、 次のいずれかの よ う にな り ます。
•
2 つのオペ ラ ン ド の幅の大 き いほ う よ り も 1 ビ ッ ト 大き く な る
•
幅の広いほ う が符号な し で幅の小 さ いほ う が符号付 き の場合のみ 2 ビ ッ ト 大 き く な る
オペ ラ ン ド のいずれか (ま たは両方) が符号付 き であれば、 和は符号付 き と し て処理 さ れます。
減算
ap_(u)int::RType ap_(u)int::operator - (ap_(u)int op)
2 つの整数の差を計算す る 式です。
相違値の幅は、 次の よ う にな り ます。
•
2 つのオペ ラ ン ド の幅の大 き いほ う よ り も 1 ビ ッ ト 大き く な る
•
幅の広いほ う が符号な し で幅の小 さ いほ う が符号付 き の場合のみ 2 ビ ッ ト 大 き く な る
代入前に、 デス テ ィ ネーシ ョ ン変数の幅に基づいて、 符号拡張、 ゼ ロ の追加、 ま たは切 り 捨てが実行 さ れます。
オペ ラ ン ド の符号に関わ ら ず、 差は符号付 き と し て処理 さ れます。
乗算
ap_(u)int::RType ap_(u)int::operator * (ap_(u)int op)
2 つの整数値の積を戻 し ます。
積の幅はオペ ラ ン ド の幅の合計です。
オペ ラ ン ド のいずれかが符号付 き であれば、 積は符号付 き と し て処理 さ れます。
除算
ap_(u)int::RType ap_(u)int::operator / (ap_(u)int op)
2 つの整数値の商を計算 し ます。
除数が符号な し であ る 場合、 商の幅は被除数の幅 と な り 、 そ う でない場合は、 商の幅は被除数の幅に 1 を足 し た も の
の幅 と な り ます。
オペ ラ ン ド のいずれかが符号付 き であれば、 商は符号付 き と し て処理 さ れます。
重要 : 除算演算子 を Vivado HLS で 合成す る と 、 生成 さ れ た RTL で 適宜パ ラ メ ー タ ー設定 さ れ た ザ イ リ ン ク ス
LogiCORE 除算 コ アが イ ン ス タ ン シエー ト さ れます。
剰余
ap_(u)int::RType ap_(u)int::operator % (ap_(u)int op)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
301
C++ の任意精度型
2 つの整数値の整数除算の余 り を戻 し ます。
剰余 と オペ ラ ン ド 両方に同 じ 符号が付いてい る 場合、 剰余の幅は、 オペ ラ ン ド の幅の最小値です。
オペ ラ ン ド が ど ち ら も 同 じ 符号であ る 場合は、 剰余の幅はオペ ラ ン ド の幅の最小値 と な り ます。
除数が符号な し 、 被除数が符号付 き の場合は、 剰余の幅は除数の幅に 1 を足 し た も の と な り ます。
重要 : 剰余 (%) 演算子を Vivado HLS で合成す る と 、 生成 さ れた RTL で適宜パ ラ メ ー タ ー設定 さ れたザ イ リ ン ク ス
LogiCORE 除算 コ アが イ ン ス タ ン シエー ト さ れます。
次は、 演算子の例です。
ap_uint<71> Rslt;
ap_uint<42> Val1 = 5;
ap_int<23> Val2 = -8;
Rslt
Rslt
Rslt
Rslt
Rslt
=
=
=
=
=
Val1
Val1
Val1
50 /
50 %
+ Val2;
- Val2;
* Val2;
Val2;
Val2;
//
//
//
//
//
Yields:-3 (43 bits) sign-extended to 71 bits
Yields:+3 sign extended to 71 bits
Yields:-40 (65 bits) sign extended to 71 bits
Yields:-6 (33 bits) sign extended to 71 bits
Yields:+2 (23 bits) sign extended to 71 bits
ビ ッ ト 単位の論理演算子
ビ ッ ト 単位の論理演算子はすべて、 2 つのオペ ラ ン ド の幅の最大値 と な る 幅の値を戻 し 、 両方のオペ ラ ン ド が符号な
し の場合にのみ符号な し と し て処理 さ れます。 そ う でない場合は、 符号付 き と し て処理 さ れます。
符号拡張 (ま たはゼ ロ の追加) は、 デス テ ィ ネーシ ョ ン変数ではな く 、 式の符号に基づいて実行 さ れます。
ビ ッ ト 単位の OR
ap_(u)int::RType ap_(u)int::operator | (ap_(u)int op)
2 つのオペ ラ ン ド の ビ ッ ト 単位の OR 値を戻 し ます。
ビ ッ ト 単位の AND
ap_(u)int::RType ap_(u)int::operator & (ap_(u)int op)
2 つのオペ ラ ン ド の ビ ッ ト 単位の AND 値を戻 し ます。
ビ ッ ト 単位の XOR
ap_(u)int::RType ap_(u)int::operator ^ (ap_(u)int op)
2 つのオペ ラ ン ド の ビ ッ ト 単位の XOR 値を戻 し ます。
単項演算子
加算
ap_(u)int ap_(u)int::operator + ()
ap_[u]int オペ ラ ン ド のセルフ コ ピーを戻 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
302
C++ の任意精度型
減算
ap_(u)int::RType ap_(u)int::operator - ()
次が戻 さ れます。
•
符号付 き の場合は同 じ 幅でオペ ラ ン ド のネゲー ト さ れた値を戻 し 、
•
符号な し の場合はその幅に 1 を足 し た値を戻 し ます。
戻 り 値は常に符号付 き です。
ビ ッ ト 単位の逆
ap_(u)int::RType ap_(u)int::operator ~ ()
同 じ 幅お よ び符号で、 オペ ラ ン ド のビ ッ ト 単位の逆 (NOT) を戻 し ます。
等価ゼロ
bool ap_(u)int::operator !()
オペ ラ ン ド がゼ ロ (0) の場合はブール形式の false を戻 し ます。
オペ ラ ン ド がゼ ロ (0) 以外の場合は true を戻 し ます。
シ フ ト 演算子
各シ フ ト 演算子には次の 2 つのバージ ョ ンがあ り ます。
•
符号な し の右辺 (RHS) オペ ラ ン ド
•
符号付 き の右辺 (RHS) オペ ラ ン ド
符号付 き RHS に負の値が与え ら れ る と シ フ ト 演算の方向が逆にな り ます。 た と えば、 RHS オペ ラ ン ド の絶対値に よ
る シ フ ト が逆の方向で発生 し ます。
シ フ ト 演算子は、 左辺 (LHS) オペ ラ ン ド と 同 じ 幅の値を戻 し ます。 C/C++ の場合 と 同 じ よ う に、 右シ フ ト の LHS オ
ペ ラ ン ド が符号付 き の場合、 符号ビ ッ ト は、 LHS オペ ラ ン ド の符号を維持 し つつ、 最上位ビ ッ ト に コ ピー さ れます。
符号な し 整数右シ フ ト
ap_(u)int ap_(u)int::operator << (ap_uint<int_W2> op)
整数右シ フ ト
ap_(u)int ap_(u)int::operator << (ap_int<int_W2> op)
符号な し 整数左シ フ ト
ap_(u)int ap_(u)int::operator >> (ap_uint<int_W2> op)
整数左シ フ ト
ap_(u)int ap_(u)int::operator >> (ap_int<int_W2> op)
注意 : 左シ フ ト 演算子の結果を幅が広いほ う のデス テ ィ ネーシ ョ ン変数に代入する と 、 情報の一部ま たはすべてが失
われ る 場合があ り ますので注意 し て く だ さ い。 予期 し ない動作を防ぐ には、 シ フ ト 式を代入 さ れ る ほ う の型に明示的
に型変換す る よ う に し て く だ さ い。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
303
C++ の任意精度型
次は、 シ フ ト 演算の例です。
ap_uint<13> Rslt;
ap_uint<7> Val1 = 0x41;
Rslt = Val1 << 6;
Rslt = ap_uint<13>(Val1) << 6;
// Yields:0x0040, i.e. msb of Val1 is lost
// Yields:0x1040, no info lost
ap_int<7> Val2 = -63;
Rslt = Val2 >> 4;
//Yields:0x1ffc, sign is maintained and extended
複合代入演算子
Vivado HLS では、 次の複合演算子がサポー ト さ れてい ます。
•
*=
•
/=
•
%=
•
+=
•
-=
•
<<=
•
>>=
•
&=
•
^=
•
|=
RHS 式は まず求めてか ら 、 基本演算子に RHS オペ ラ ン ド と し て与え ら れ、 LHS 変数に結果が代入 さ れ ます。 式の長
さ 、 符号、 符号拡張か切 り 捨てかのルールは、 関連す る 演算に対 し 上記で説明 さ れてい る よ う に、 適用 さ れます。
ap_uint<10> Val1 = 630;
ap_int<3> Val2 = -3;
ap_uint<5> Val3 = 27;
Val1 += Val2 - Val3;
// Yields:600 and is equivalent to:
// Val1 = ap_uint<10>(ap_int<11>(Val1) +
//
ap_int<11>((ap_int<6>(Val2) //
ap_int<6>(Val3))));
例 3‐93 : 複合代入文
イ ン ク リ メ ン ト お よびデ ク リ メ ン ト 演算子
イ ン ク リ メ ン ト お よ びデ ク リ メ ン ト の演算子が提供 さ れてい ます。 オペ ラ ン ド と 同 じ 幅の値を返 し ますが、 両方のオ
ペ ラ ン ド が符号な し の場合のみ値は符号な し で、 そ う でない場合は、 符号付 き です。
プリ インク リ メ ン ト
ap_(u)int& ap_(u)int::operator ++ ()
オペ ラ ン ド の イ ン ク リ メ ン ト さ れた値を戻 し ます。
その イ ン ク リ メ ン ト さ れた値を オペ ラ ン ド に代入 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
304
C++ の任意精度型
ポス ト イ ン ク リ メ ン ト
const ap_(u)int ap_(u)int::operator ++ (int)
イ ン ク リ メ ン ト さ れた値を オペ ラ ン ド 変数に代入す る 前に、 オペ ラ ン ド の値を戻 し ます。
プ レデ ク リ メ ン ト
ap_(u)int& ap_(u)int::operator -- ()
オペ ラ ン ド のデ ク リ メ ン ト さ れた値を戻 し て、 その値を オペ ラ ン ド に代入 し ます。
ポス ト デ ク リ メ ン ト
const ap_(u)int ap_(u)int::operator -- (int)
デ ク リ メ ン ト さ れた値を オペ ラ ン ド 変数に代入す る 前に、 オペ ラ ン ド の値を戻 し ます。
関係演算子
Vivado HLS では、 すべての関係演算子がサポー ト さ れてい ます。 比較結果に基づいてブール形式の値が返 さ れます。
ap_[u]int 型の変数は、 こ れ ら の演算子を使用 し て C/C++ 基本整数型 と 比較す る こ と がで き ます。
等号
bool ap_(u)int::operator == (ap_(u)int op)
等号否定
bool ap_(u)int::operator != (ap_(u)int op)
小な り
bool ap_(u)int::operator < (ap_(u)int op)
大な り
bool ap_(u)int::operator > (ap_(u)int op)
小な り イ コ ール
bool ap_(u)int::operator <= (ap_(u)int op)
大な り イ コ ール
bool ap_(u)int::operator >= (ap_(u)int op)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
305
C++ の任意精度型
その他の ク ラ ス メ ソ ッ ド および演算子
次のセ ク シ ョ ンでは、 ク ラ ス メ ソ ッ ド お よ び演算子について説明 し ます。
ビ ッ ト レ ベル演算
次の メ ソ ッ ド を使用す る と 、 ap_[u]int 型変数に格納 さ れてい る 値に基づいて一般的な ビ ッ ト レベル演算が行われ
ます。
長さ
int ap_(u)int::length ()
こ の メ ソ ッ ド は整数値を戻 し 、 ap_[u]int 変数でのビ ッ ト 合計を出力 し ます。
連結
ap_concat_ref ap_(u)int::concat (ap_(u)int low)
ap_concat_ref ap_(u)int::operator , (ap_(u)int high, ap_(u)int low)
2 つの ap_[u]int 変数を連結 し ます。 返 さ れた値の幅はオペ ラ ン ド の幅の和です。
high お よ び low の引数にはそれぞれ結果値の高位ビ ッ ト ま たは下位ビ ッ ト が出力 さ れます。concat() メ ソ ッ ド の場
合は下位ビ ッ ト が出力 さ れます。
オーバー ロ ー ド さ れた カ ン マ演算子を使用す る と き は括弧が必要です。 カ ン マ演算子バージ ョ ン が代入の LHS に現
れ る こ と も あ り ます。
推奨 : 整数 リ テ ラ ルを含む C/C++ ネ イ テ ィ ブ型は、 予期 し ない結果を避け る ため、 連結前に該当す る ap_[u]int 型
に明示的に型変換 し ます。
ap_uint<10> Rslt;
例 3‐94 : 連結の例 1
ap_int<3> Val1 = -3;
ap_int<7> Val2 = 54;
例 3‐95 : 連結の例 2
Rslt = (Val2, Val1);
Rslt = Val1.concat(Val2);
(Val1, Val2) = 0xAB;
// Yields:0x1B5
// Yields:0x2B6
// Yields:Val1 == 1, Val2 == 43
例 3‐96 : 連結の例 3
ビ ッ ト 選択
ap_bit_ref ap_(u)int::operator [] (int bit)
任意精度の整数値か ら 1 ビ ッ ト 選択 し 、 それを返 し ます。
戻 さ れた値は参照値で、 こ の ap_[u]int での対応ビ ッ ト を設定ま たは消去す る ために使用 し ます。
bit 引数は int 値であ る 必要があ り ます。 選択す る ビ ッ ト の指数を指定 し 、 最下位ビ ッ ト は指数 0 にな り ます。 最高
指数は こ の ap_[u]int のビ ッ ト 幅か ら 1 を引いた値にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
306
C++ の任意精度型
ap_bit_ref はビ ッ ト で指定 さ れてい る こ の ap_[u]int イ ン ス タ ン ス の 1 ビ ッ ト への参照を表 し て し ます。
範囲選択
ap_range_ref ap_(u)int::range (unsigned Hi, unsigned Lo)
ap_range_ref ap_(u)int::operator () (unsigned Hi, unsigned Lo)
引数で指定 さ れ る ビ ッ ト の範囲で表 さ れ る 値を返 し ます。
引数 Hi は、 範囲内の最上位ビ ッ ト (MSB) を、 Lo は最下位ビ ッ ト (LSB) を指定 し ます。
ソ ース変数の LSB は 0 の位置にあ り ます。 引数 Hi の値が Lo の も の よ り 小 さ い場合、 ビ ッ ト は逆順で戻 さ れます。
ap_uint<4> Rslt;
例 3‐97 : 範囲選択の例 1
ap_uint<8> Val1 = 0x5f;
ap_uint<8> Val2 = 0xaa;
例 3‐98 : 範囲選択の例 2
Rslt = Val1.range(3, 0);
Val1(3,0) = Val2(3, 0);
Val1(4,1) = Val2(4, 1);
Rslt = Val1.range(7, 4);
//
//
//
//
Yields:0xF
Yields:0x5A
Yields:0x55
Yields:0xA; bit-reversed!
例 3‐99 : 範囲選択の例 3
AND を使用 し た低減
bool ap_(u)int::and_reduce ()
•
ap_(u)int で、 すべての ビ ッ ト に対 し AND 演算を使用 し ます。
•
結果値を シ ン グル ビ ッ ト で戻 し ます。
•
こ の値を -1 (すべて 1) と 比較 し 、 一致すれば true、 そ う でなければ false を戻 し ます。
OR を使用 し た低減
bool ap_(u)int::or_reduce ()
•
ap_(u)int で、 すべての ビ ッ ト に対 し OR 演算を使用 し ます。
•
結果値を シ ン グル ビ ッ ト で戻 し ます。
•
こ の値を 0 (すべて 0) と 比較 し 、 一致すれば false、 そ う でなければ true を戻 し ます。
XOR を使用 し た低減
bool ap_(u)int::xor_reduce ()
•
こ の ap_int のすべての ビ ッ ト に対 し XOR 演算を使用 し ます。
•
結果値を シ ン グル ビ ッ ト で戻 し ます。
•
こ れは、 こ の値の 1 ビ ッ ト の数を カ ウ ン ト す る の と 同 じ で、 カ ウ ン ト 数が偶数であれば false、 奇数であれば
true を返 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
307
C++ の任意精度型
NAND を使用 し た低減
bool ap_(u)int::nand_reduce ()
•
こ の ap_int のすべての ビ ッ ト に対 し NAND 演算を使用 し ます。
•
結果値を シ ン グル ビ ッ ト で戻 し ます。
•
こ の値を -1 (すべて 1) と 比較 し 、 一致すれば false、 そ う でなければ true を戻 し ます。
NOR を使用 し た低減
bool ap_int::nor_reduce ()
•
こ の ap_int のすべての ビ ッ ト に対 し NOR 演算を使用 し ます。
•
結果値を シ ン グル ビ ッ ト で戻 し ます。
•
こ の値を 0 (すべて 0) と 比較 し 、 一致すれば true、 そ う でなければ false を戻 し ます。
XNOR を使用 し た低減
bool ap_(u)int::xnor_reduce ()
•
ap_(u)int で、 すべての ビ ッ ト に対 し XNOR 演算を使用 し ます。
•
結果値を シ ン グル ビ ッ ト で戻 し ます。
•
こ れは、 こ の値の 1 ビ ッ ト の数を カ ウ ン ト す る の と 同 じ で、 カ ウ ン ト 数が偶数であれば true、 奇数であれば
false を返 し ます。
ビ ッ ト 低減 メ ソ ッ ド の例
ap_uint<8> Val = 0xaa;
例 3‐100 : ビ ッ ト 低減 メ ソ ッ ド の例 1
bool t = Val.and_reduce();
t = Val.or_reduce();
t = Val.xor_reduce();
t = Val.nand_reduce();
t = Val.nor_reduce();
t = Val.xnor_reduce();
//
//
//
//
//
//
Yields:
Yields:
Yields:
Yields:
Yields:
Yields:
false
true
false
true
false
true
例 3‐101 : ビ ッ ト 低減 メ ソ ッ ド の例 2
ビ ッ ト の リ バース
void ap_(u)int::reverse ()
次の よ う に、 ap_[u]int イ ン ス タ ン ス の内容を逆転 さ せます。
•
LSB は MSB に
•
MSB は LSB に
リ バース メ ソ ッ ド の例
ap_uint<8> Val = 0x12;
Val.reverse(); // Yields:0x48
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
308
C++ の任意精度型
ビ ッ ト 値のテ ス ト
bool ap_(u)int::test (unsigned i)
ap_(u)int イ ン ス タ ン ス の指定ビ ッ ト が 1 であ る か ど う かをチ ェ ッ ク し ます。
1 の場合は true、 そ う でない場合は false を戻 し ます。
テ ス ト メ ソ ッ ド の例
ap_uint<8> Val = 0x12;
bool t = Val.test(5); // Yields: true
ビ ッ ト 値の設定
void ap_(u)int::set (unsigned i, bool v)
void ap_(u)int::set_bit (unsigned i, bool v)
ap_(u)int イ ン ス タ ン ス の指定ビ ッ ト を整数 V の値に設定 し ます。
ビ ッ ト の設定 (1)
void ap_(u)int::set (unsigned i)
ap_(u)int の指定ビ ッ ト を 1 に設定 し ます。
ビ ッ ト のク リ ア (0)
void ap_(u)int::clear(unsigned i)
ap_(u)int の指定ビ ッ ト を 0 に設定 し ます。
ビ ッ ト の反転
void ap_(u)int::invert(unsigned i)
ap_(u)int イ ン ス タ ン ス の第 i 位ビ ッ ト を反転 さ せます。 第 i 位ビ ッ ト は、 元の値が 1 の場合 0 と な り 、 0 の場合は
1 にな り ます。
ビ ッ ト の設定、 ク リ ア、 反転 メ ソ ッ ド の例 :
ap_uint<8> Val = 0x12;
Val.set(0, 1);
Val.set_bit(5, false);
Val.set(7);
Val.clear(1);
Val.invert(5);
//
//
//
//
//
Yields:0x13
Yields:0x03
Yields:0x83
Yields:0x81
Yields:0x91
右に移動
void ap_(u)int::rrotate(unsigned n)
ap_(u)int イ ン ス タ ン ス を n 桁右に移動 さ せます。
左に移動
void ap_(u)int::lrotate(unsigned n)
ap_(u)int イ ン ス タ ン ス を n 桁左に移動 さ せます。
ap_uint<8> Val = 0x12;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
309
C++ の任意精度型
例 3‐102 : rotate メ ソ ッ ド の例 1
Val.rrotate(3);
Val.lrotate(6);
// Yields:0x42
// Yields:0x90
例 3‐103 : rotate メ ソ ッ ド の例 2
ビ ッ ト 単位 NOT
void ap_(u)int::b_not()
•
ap_(u)int イ ン ス タ ン ス の各ビ ッ ト を補完 し ます。
ap_uint<8> Val = 0x12;
Val.b_not();
// Yields:0xED
例 3‐104 : ビ ッ ト 単位 NOT の例
符号のテ ス ト
bool ap_int::sign()
•
ap_(u)int イ ン ス タ ン ス が 負の値であ る か ど う か をチ ェ ッ ク し ます。
•
負の場合は true を戻 し ます。
•
正の場合は false を戻 し ます。
明示的な変換 メ ソ ッ ド
C/C++ の (u)int 型
int ap_(u)int::to_int ()
unsigned ap_(u)int::to_uint ()
•
ap_[u]int に含まれてい る 値でネ イ テ ィ ブ C/C++ (ほ と ん ど のシ ス テ ムで 32 ビ ッ ト ) の整数を戻 し ます。
•
値が [unsigned] int で表 さ れ る も の よ り 大き い場合は、 切 り 捨てが実行 さ れます。
C/C++ 64 ビ ッ ト (u)int 型
long long ap_(u)int::to_int64 ()
unsigned long long ap_(u)int::to_uint64 ()
•
ap_[u]int に含まれてい る 値でネ イ テ ィ ブ C/C++ の 64 ビ ッ ト の整数を戻 し ます。
•
値が [unsigned] int で表 さ れ る も の よ り 大き い場合は、 切 り 捨てが実行 さ れます。
C/C++ の double 型
double ap_(u)int::to_double ()
•
ap_[u]int に含まれてい る 値のネ イ テ ィ ブ C/C++ の double 型 64 ビ ッ ト の浮動小数点値を戻 し ます。
•
ap_[u]int が 53 ビ ッ ト (double の仮数部のビ ッ ト 数) よ り も 大き い場合、 double 型の値は期待値 と ま っ た く
同 じ にな ら ない こ と があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
310
C++ の任意精度 (AP) 固定小数点型
C++ の任意精度 (AP) 固定小数点型
Vivado HLS では、 小数算術を簡単に処理で き る よ う 、 固定小数点型がサポー ト さ れてい ます。 こ の利点は次の例で説
明 さ れてい ます。
ap_fixed<10, 5> Var1 = 22.96875;
ap_ufixed<12,11> Var2 = 512.5
ap_fixed<13,5> Res1;
// 10-bit signed word, 5 fractional bits
// 12-bit word, 1 fractional bit
// 13-bit signed word, 5 fractional bits
Res1 = Var1 + Var2;
// Result is 535.46875
Var1 お よ び Var2 の精度は異な る のですが、 固定小数点型を使用す る こ と で、 演算 ( こ の場合は加算) が実行 さ れ る
前に小数点が揃え ら れます。 小数点を揃え る ために C コ ー ド で演算を実行す る 必要はあ り ません。
固定小数点演算の結果値を格納す る のに使用 さ れ る 型は、 整数ビ ッ ト お よ び小数ビ ッ ト の両方の結果値を完全に格納
す る のに十分な大 き さ であ る 必要があ り ます。
そ う ではない場合、 ap_fixed 型では次が自動的に実行 さ れます。
•
オーバーフ ロ ー (代入 さ れた型でサポー ト さ れ る よ り も MSB が多い場合)
•
量子化 (代入 さ れた型でサポー ト さ れ る よ り も LSB が少ない場合)
ap_[u]fixed 型では、 オーバー フ ロ ーお よ び量子化の実行方法に関 し て さ ま ざ ま なオプ シ ョ ン が提供 さ れてい ま
す。 次のセ ク シ ョ ンでは、 その詳細について説明 し ます。
ap_[u]fixed 表現
ap_[u]fixed 型では、 固定小数値は 2 進小数点の位置を指定 し た、 ビ ッ ト シーケ ン ス で表現 さ れます。
•
2 進小数点の左側にあ る ビ ッ ト は値の整数部を示 し ます。
•
右側にあ る ビ ッ ト は値の小数部を示 し ます。
ap_[u]fixed 型は次の よ う に定義 さ れます。
ap_[u]fixed<int W,
int I,
ap_q_mode Q,
ap_o_mode O,
ap_sat_bits N>;
•
W 属性には、 ワー ド のビ ッ ト 合計数を指定す る パ ラ メ ー タ ーを設定 し ます。 こ のパ ラ メ ー タ ー値には定数の整数
式のみを使用 し ます。
•
I 属性には、 整数部を表すビ ッ ト 数を指定する パ ラ メ ー タ ーを設定 し ます。
•
•
°
I の値は W と 等 し いかそれ以下であ る 必要があ り ます。
°
小数部を表すためのビ ッ ト 数は W か ら I を差 し 引いた値です。
°
こ のパ ラ メ ー タ ー値には定数の整数式のみを使用 し ます。
Q 属性には量子化モー ド を指定す る パ ラ メ ー タ ーを設定 し ます。
°
こ のパ ラ メ ー タ ー値にはあ ら か じ め定義 さ れてい る 列挙値のみを使用 し ます。
°
デフ ォ ル ト 値は AP_TRN です。
O 属性にはオーバーフ ロ ー モー ド を指定す る パ ラ メ ー タ ーを設定 し ます。
°
こ のパ ラ メ ー タ ー値にはあ ら か じ め定義 さ れてい る 列挙値のみを使用 し ます。
°
デフ ォ ル ト 値は AP_WRAP です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
311
C++ の任意精度 (AP) 固定小数点型
•
N 属性には、 オーバーフ ロ ー ラ ッ プ モー ド で使用 さ れ る 飽和ビ ッ ト 数を設定 し ます。
°
こ のパ ラ メ ー タ ー値には定数の整数式のみを使用 し ます。
°
デフ ォ ル ト 値は 0 です。
注記 : 例にあ る よ う に、 量子化、 オーバーフ ロ ー、 飽和パ ラ メ ー タ ーが指定 さ れていない場合は、 デフ ォ ル ト 設定が
使用 さ れます。
量子化お よ びオーバーフ ロ ーのモー ド は次で説明 し ます。
量子化モー ド
•
正の無限大への丸め
「AP_RND」
•
0 への丸め
「AP_RND_ZERO」
•
負の無限大への丸め
「AP_RND_MIN_INF」
•
無限大への丸め
「AP_RND_INF」
•
収束丸め
「AP_RND_CONV」
•
切 り 捨て
「AP_TRN」
•
0 への切 り 捨て
「AP_TRN_ZERO」
AP_RND
•
特定の ap_[u]fixed 型の近似値に値が丸め ら れます。
ap_fixed<3, 2, AP_RND, AP_SAT> UAPFixed4 = 1.25;
ap_fixed<3, 2, AP_RND, AP_SAT> UAPFixed4 = -1.25;
// Yields:1.5
// Yields:-1.0
例 3‐105 : AP_RND の例
AP_RND_ZERO
•
表示可能なの近似値に値が丸め ら れます。
•
0 の方向へ丸め ら れます。
°
正の値に対 し ては重複ビ ッ ト が削除 さ れます。
°
負の値に対 し ては LSB が追加 さ れ、 最 も 近い表示可能な値が表示 さ れます。
ap_fixed<3, 2, AP_RND_ZERO, AP_SAT> UAPFixed4 = 1.25; // Yields:1.0
ap_fixed<3, 2, AP_RND_ZERO, AP_SAT> UAPFixed4 = -1.25; // Yields:-1.0
例 3‐106 : AP_RND_ZERO の例
AP_RND_MIN_INF
•
表示可能なの近似値に値が丸め ら れます。
•
負の無限大の方向へ丸め ら れます。
°
正の値に対 し ては重複ビ ッ ト が削除 さ れます。
°
負の値に対 し ては LSB が追加 さ れます。
ap_fixed<3, 2, AP_RND_MIN_INF, AP_SAT> UAPFixed4 = 1.25;
ap_fixed<3, 2, AP_RND_MIN_INF, AP_SAT> UAPFixed4 = -1.25;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
// Yields:1.0
// Yields:-1.5
Send Feedback
312
C++ の任意精度 (AP) 固定小数点型
例 3‐107 : AP_RND_MIN_INF の例
AP_RND_INF
•
表示可能なの近似値に値が丸め ら れます。
•
丸めは LSB に よ っ て変わ り ます。
°
正の値に対 し ては、 LSB が設定 さ れてい る 場合は正の無限大の方向に丸め ら れます。 そ う でない場合は負の
無限大の方向に丸め ら れます。
°
負の値に対 し ては、 LSB が設定 さ れてい る 場合は負の無限大の方向に丸め ら れます。 そ う でない場合は正の
無限大の方向に丸め ら れます。
ap_fixed<3, 2, AP_RND_INF, AP_SAT> UAPFixed4 = 1.25;
ap_fixed<3, 2, AP_RND_INF, AP_SAT> UAPFixed4 = -1.25;
// Yields:1.5
// Yields:-1.5
例 3‐108 : AP_RND_INF の例
AP_RND_CONV
•
表示可能なの近似値に値が丸め ら れます。
•
丸めは LSB に よ っ て変わ り ます。
°
LSB が設定 さ れてい る 場合は正の無限大の方向に丸め ら れます。
°
そ う でない場合は負の無限大の方向に丸め ら れます。
ap_fixed<3, 2, AP_RND_CONV, AP_SAT> UAPFixed4 = 0.75;
ap_fixed<3, 2, AP_RND_CONV, AP_SAT> UAPFixed4 = -1.25;
// Yields:1.0
// Yields:-1.0
例 3‐109 : AP_RND_CONV の例
AP_TRN
•
表示可能なの近似値に値が丸め ら れます。
•
常に負の無限大に向か っ て値が丸め ら れます。
ap_fixed<3, 2, AP_TRN, AP_SAT> UAPFixed4 = 1.25;
ap_fixed<3, 2, AP_TRN, AP_SAT> UAPFixed4 = -1.25;
// Yields:1.0
// Yields:-1.5
例 3‐110 : AP_TRN の例
AP_TRN_ZERO
表示可能なの近似値に値が丸め ら れます。
*
正の値の場合、 AP_TRN モー ド と 同 じ 丸めにな り ます。
*
負の値の場合はゼ ロ の方向へ丸め ら れます。
ap_fixed<3, 2, AP_TRN_ZERO, AP_SAT> UAPFixed4 = 1.25;
ap_fixed<3, 2, AP_TRN_ZERO, AP_SAT> UAPFixed4 = -1.25;
// Yields:1.0
// Yields:-1.0
例 3‐111 : AP_TRN_ZERO の例
オーバー フ ロー モー ド
•
飽和
「AP_SAT」
•
0 への飽和
「AP_SAT_ZERO」
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
313
C++ の任意精度 (AP) 固定小数点型
•
対称飽和
「AP_SAT_SYM」
•
折 り 返し
「AP_WRAP」
•
符号絶対値の折 り 返 し
「AP_WRAP_SM」
AP_SAT
値が次の よ う に飽和 さ れます。
•
オーバーフ ロ ーが発生 し た と き は値が最大値に飽和 さ れます。
•
負のオーバーフ ロ ーの と き は最小値に飽和 さ れます。
ap_ufixed<4, 4, AP_RND, AP_SAT> UAPFixed4 = 19.0;
ap_fixed<4, 4, AP_RND, AP_SAT> UAPFixed4 = 19.0;
ap_ufixed<4, 4, AP_RND, AP_SAT> UAPFixed4 = -19.0;
ap_fixed<4, 4, AP_RND, AP_SAT> UAPFixed4 = -19.0;
//
//
//
//
Yields:15.0
Yields:7.0
Yields:0.0
Yields:-8.0
例 3‐112 : AP_SAT の例
AP_SAT_ZERO
オーバーフ ロ ーま たは負のオーバーフ ロ ーの場合に値 を 0 に し ます。
ap_ufixed<4, 4, AP_RND, AP_SAT_ZERO> UAPFixed4 = 19.0;
ap_fixed<4, 4, AP_RND, AP_SAT_ZERO> UAPFixed4 = 19.0;
ap_ufixed<4, 4, AP_RND, AP_SAT_ZERO> UAPFixed4 = -19.0;
ap_fixed<4, 4, AP_RND, AP_SAT_ZERO> UAPFixed4 = -19.0;
//
//
//
//
Yields:0.0
Yields:0.0
Yields:0.0
Yields:0.0
//
//
//
//
Yields:15.0
Yields:7.0
Yields:0.0
Yields:-8.0
//
//
//
//
Yields:3.0
Yields:-1.0
Yields:13.0
Yields:-3.0
例 3‐113 : AP_SAT_ZERO の例
AP_SAT_SYM
値が次の よ う に飽和 さ れます。
•
オーバーフ ロ ーが発生 し た と き は値が最大値に飽和 さ れます。
•
負のオーバーフ ロ ーの と き は最小値に飽和 さ れます。
°
符号付 き ap_fixed 型の場合は負の最大値
°
符号な し ap_ufixed 型の場合は 0
ap_ufixed<4, 4, AP_RND, AP_SAT_SYM> UAPFixed4 = 19.0;
ap_fixed<4, 4, AP_RND, AP_SAT_SYM> UAPFixed4 = 19.0;
ap_ufixed<4, 4, AP_RND, AP_SAT_SYM> UAPFixed4 = -19.0;
ap_fixed<4, 4, AP_RND, AP_SAT_SYM> UAPFixed4 = -19.0;
例 3‐114 : AP_SAT_SYM の例
AP_WRAP
オーバーフ ロ ーが発生 し た と き は値が折 り 返 さ れます。
ap_ufixed<4, 4, AP_RND, AP_WRAP> UAPFixed4 = 19.0;
ap_fixed<4, 4, AP_RND, AP_WRAP> UAPFixed4 = 31.0;
ap_ufixed<4, 4, AP_RND, AP_WRAP> UAPFixed4 = -19.0;
ap_fixed<4, 4, AP_RND, AP_WRAP> UAPFixed4 = -19.0;
例 3‐115 : AP_WRAP の例
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
314
C++ の任意精度 (AP) 固定小数点型
N の値が 0 の場合 (デフ ォ ル ト のオーバーフ ロ ー モー ド ) :
•
範囲外の MSB はすべて削除 さ れます。
•
符号な し の場合は、 最大値に達 し た ら 0 に戻 り ます。
•
符号付 き の場合は、 最大値に達 し た ら 最小値に戻 り ます。
N が 0 よ り 大き い場合 :
•
N が 0 よ り 大 き い場合、 MSB は飽和する か、 ま たは 1 に設定 さ れます。
•
符号ビ ッ ト は保持 さ れ る ため、 正の値は正の ま ま、 負の値は負の ま ま にな り ます。
•
飽和 し ていないビ ッ ト は LSB 側か ら コ ピー さ れます。
AP_WRAP_SM
値が符号絶対値で折 り 返 さ れます。
ap_fixed<4, 4, AP_RND, AP_WRAP_SM> UAPFixed4 = 19.0;
ap_fixed<4, 4, AP_RND, AP_WRAP_SM> UAPFixed4 = -19.0;
// Yields:-4.0
// Yields:2.0
例 3‐116 : AP_WRAP_SM の例
N の値が 0 の場合 (デフ ォ ル ト のオーバーフ ロ ー モー ド ) :
•
こ のモー ド では符号絶対値 ラ ッ プが使用 さ れます。
•
符号ビ ッ ト は最下位の削除 さ れた ビ ッ ト の値に設定 さ れます。
•
最上位の残 り のビ ッ ト が元の MSB と は異な る 場合、 残っ てい る ビ ッ ト すべてが反転 さ れます。
•
MSB が同 じ であ る 場合は、 ほかのビ ッ ト が コ ピー さ れます。
•
a.
重複 し てい る MSB が削除 さ れます。
b.
新 し い符号ビ ッ ト は削除 さ れた ビ ッ ト の最下位ビ ッ ト です。 こ の場合は 0 です。
c.
新 し い符号ビ ッ ト が新 し い値の符号 と 比較 さ れます。
異な る 場合は、 すべての数値が反転 さ れます。 こ の場合は数値は異な り ます。
N が 0 よ り 大き い場合 :
•
符号絶対値の飽和が使用 さ れます。
•
N 個の MSB が 1 に飽和 し ます。
•
N =0 のケース と 同様の動作にな り ますが、 正の数値は正の ま ま、 負の数値は負の ま ま にな る 点が異な り ます。
ap_[u]fixed<> 型の コ ンパイル
ap_[u]fixed<> ク ラ ス を使用す る には、 ap_[u]fixed<> 変数を参照す る ソ ース フ ァ イ ルすべてに ap_fixed.h
ヘ ッ ダー フ ァ イ ルを含め る 必要があ り ます。
こ れ ら の ク ラ ス を使用す る ソ フ ト ウ ェ ア モデルを コ ンパ イ ルす る と き 、 Vivado HLS のヘ ッ ダー フ ァ イ ルの場所を指
定す る 必要があ る 場合があ り ます。 た と えば、 gcc コ ンパ イ ルには -I/<HLS_HOME>/include オプシ ョ ン を追加す
る な ど し ます。
ヒ ン ト : g++ -O3 オプシ ョ ン を使用 し て コ ンパ イ ルす る 場合には、 ソ フ ト ウ エア モデルが最高のパフ ォ ーマ ン ス に
な り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
315
C++ の任意精度 (AP) 固定小数点型
ap_[u]fixed<> 変数の宣言 と 定義
次の よ う にそれぞれ符号付 き お よ び符号な し の ク ラ ス が別々にあ り ます
•
ap_fixed<W,I> (符号付 き )
•
ap_ufixed<W,I> (符号な し )
C/C++ の typedef文を使用す る と 、 ユーザー定義型を作成する こ と がで き ます。
#include “ap_fixed.h”
// use ap_[u]fixed<> types
typedef ap_ufixed<128,32> uint128_t;
// 128-bit user defined type,
// 32 integer bits
例 3‐117 : ユーザー定義型の例
定数 ( リ テ ラ ル) か ら の初期化および代入
ap_[u]fixed 変数は、 次の一般的な C/C++ 幅の標準浮動小数点定数で初期化 さ れます。
•
float 型の場合は 32 ビ ッ ト
•
double 型の場合は 64 ビ ッ ト
つま り 、 通常は、 浮動小数点値は単精度ま たは倍精度です。
こ の よ う な浮動小数点定数は、 値の符号に よ り 、 任意精度の固定小数点変数の フル サ イ ズの幅に処理お よ び変換 さ れ
ます (C99 規格の 16 進数の浮動小数点定数 も サポー ト さ れ る 場合)。
#include <ap_fixed.h>
ap_ufixed<30, 15> my15BitInt = 3.1415;
ap_fixed<42, 23> my42BitInt = -1158.987;
ap_ufixed<99, 40> = 287432.0382911;
ap_fixed<36,30> = -0x123.456p-1;
コ ン ソ ール I/O (出力) のサポー ト
ap_[u]fixed<> 変数の初期化お よ び代入の場合 と 同様に、 Vivado HLS では 64 ビ ッ ト よ り も 大 き な値の出力を サ
ポー ト す る ための機能が提供 さ れてい ます。
ap_[u]fixed 変数に格納 さ れてい る 値を出力す る のに最 も 簡単な方法は、 C++ の標準出力ス ト リ ーム std::cout
(#include <iostream> or <iostream.h>) を 使用す る 方法 で す。 ス ト リ ー ム 挿入演算子 << は、 任 意 の
ap_[u]fixed 変数に対す る 範囲全体に含まれ る 値が正 し く 出力 さ れ る よ う に、 オーバー ロ ー ド さ れます。 次の ス ト
リ ーム マニ ピ ュ レー タ ー も サポー ト さ れてい る ので、 それぞれの進数値を フ ォーマ ッ ト する こ と がで き ます。
•
dec (10 進数)
•
hex (16 進数)
•
oct (8 進数)
#include <iostream.h>
// Alternative:#include <iostream>
ap_fixed<6,3, AP_RND, AP_WRAP> Val = 3.25;
cout << Val << endl;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
// Yields:3.25
japan.xilinx.com
Send Feedback
316
C++ の任意精度 (AP) 固定小数点型
例 3‐118 : 値の出力に cout を 使用 し た例
標準 C ラ イ ブ ラ リ の使用
標準 C ラ イ ブ ラ リ (#include <stdio.h>) を使用 し て、 64 ビ ッ ト よ り も 大き な値を出力する こ と も で き ます。
1.
ap_[u]fixed ク ラ ス の to_string() メ ソ ッ ド を使用 し 、 値を C++ の std::string に変換 し ます。
2.
その結果を std::string ク ラ ス の c_str() メ ソ ッ ド を使用 し て、 ヌ ルで終了す る C 文字に変換 し ます。
オプ シ ョ ンの引数 1 (基数の指定)
ap[u]int::to_string() メ ソ ッ ド は目的の基数を指定す る オプシ ョ ンの引数を渡す こ と がで き ます。 有効な基数
の引数値は、 次の と お り です。
•
2 (2 進数)
•
8 (8 進数)
•
10 (10 進数)
•
16 (16 進数) (デフ ォ ル ト )
オプ シ ョ ンの引数 2 (符号付きの値 と し て出力)
ap_[u]int::to_string() の 2 つ目のオプシ ョ ンの引数は、 10 進数以外の フ ォーマ ッ ト で符号付 き の値を出力す
る か ど う か を指定 し ます。 こ の引数はブール形式です。 デフ ォ ル ト 値は false で、 10 進数以外の フ ォーマ ッ ト で符号
な し の値が出力 さ れます。
ap_fixed<6,3, AP_RND, AP_WRAP> Val = 3.25;
printf(%s \n, in2.to_string().c_str());
// Yields:0b011.010
printf(%s \n, in2.to_string(10).c_str()); //Yields:3.25
例 3‐119 : 2 進数お よ び 10 進数の出力
ap_[u]fixed 型は、 次の C++ マニ ピ ュ レー タ ー関数でサポー ト さ れます。
•
setprecision
•
setw
•
setfill
setprecision マニ ピ ュ レー タ ーでは、 使用す る 10 進数の精度を設定 し ます。 こ の場合、 1 つのパ ラ メ ー タ ー f を 10 進
数精度の値 と し て使用 し ます。 n には意味のあ る 10 進数の最大数を指定 し 、 合計 (小数点の前 と 後の両方を カ ウ ン ト
) を表示 さ せます。
デフ ォ ル ト の f の値は、 ネ イ テ ィ ブ C の float 型 と 互換性があ る 6 です。
ap_fixed<64, 32> f =3.14159;
cout << setprecision (5) << f << endl;
cout << setprecision (9) << f << endl;
f = 123456;
cout << setprecision (5) << f << endl;
上記を実行す る と 、 実際の精度が指定 し た精度を超え る 場合、 表示結果は丸め ら れ、 次の よ う に表示 さ れます。
3.1416
3.14159
1.2346e+05
setw マニ ピ ュ レー タ ーでは、 次が実行 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
317
C++ の任意精度 (AP) 固定小数点型
•
フ ィ ール ド 幅に使用 さ れ る 文字数を設定
•
1 つのパ ラ メ ー タ ー w を幅の値 と し て使用
説明 :
°
w では、 一部の出力表示で使用 さ れ る 最小文字数を指定 し ます。
表示の設定幅が フ ィ ール ド 幅 よ り も 短い場合は、 埋め字で補足 さ れます。 埋め字は、 1 つのパ ラ メ ー タ ー f を補足文
字 と し て使用す る setfill マニ ピ ュ レー タ ーで制御 さ れます。
次に例を示 し ます。
ap_fixed<65,32> aa = 123456;
int precision = 5;
cout<<setprecision(precision)<<setw(13)<<setfill('T')<<a<<endl;
こ の出力は、 次の よ う にな り ます。
TTT1.2346e+05
例 3‐120 : setfill マ ニ ピ ュ レ ー タ ーの使用例
ap_fixed<6,3, AP_RND, AP_WRAP> Val = 3.25;
printf(%s \n, in2.to_string().c_str());
// Yields:0b011.010
printf(%s \n, in2.to_string(10).c_str()); //Yields:3.25
例 3‐121 : 値の出力に printf を使用 し た例
ap_[u]fixed<> 型を使用 し た式
任意精度の固定小数点値は、 C/C++ でサポー ト さ れてい る 演算子を使用する 式で使用で き ます。 任意精度の固定小数
点型ま たは変数を定義 し 終えた ら 、 その使用方法は C/C++ 言語のほかの浮動小数点型ま たは変数 と 同 じ です。
次に注意 し て く だ さ い。
•
ゼ ロ お よ び符号拡張
ソ ース値の符号に よ り 、 ビ ッ ト 幅が小 さ いほ う の値はすべてゼ ロ が追加 さ れ る か ま たは符号拡張 さ れます。 ビ ッ
ト 幅が小 さ い方の値を大 き な方の値に代入す る と き 、符号を得 る には型変換 (キ ャ ス ト ) を挿入す る 必要があ る 場
合があ り ます。
•
切 り 捨て
デス テ ィ ネーシ ョ ン変数 よ り も ビ ッ ト 幅が大 き な値の任意精度の固定小数点の代入を行 う 場合は、 切 り 捨てが実
行 さ れます。
ク ラ ス演算子および メ ソ ッ ド
通 常、 ネ イ テ ィ ブ の C/C++ 整 数 デ ー タ 型 で 実行可能 な 有効 な 演算 は、 演算子 を オ ー バ ー ロ ー ド す る こ と で、
ap_[u]fixed 型でサポー ト さ れます。 オーバー ロ ー ド さ れた演算子に加え、 一部の特定演算子お よ び メ ソ ッ ド を使
用 し て ビ ッ ト レベルの演算を簡単にす る こ と がで き ます。
2 進数の演算子
加算
ap_[u]fixed::RType ap_[u]fixed::operator + (ap_[u]fixed op)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
318
C++ の任意精度 (AP) 固定小数点型
任意のオペ ラ ン ド op を使用 し 任意精度の固定小数点値を加算 し ます。
オペ ラ ン ド は、 次のいずれかの整数型にな り ます。
•
ap_[u]fixed
•
ap_[u]int
•
C/C++
結果の ap_[u]fixed::RType は 2 つのオペ ラ ン ド の型に よ っ て異な り ます。
ap_fixed<76, 63> Result;
ap_fixed<5, 2> Val1 = 1625.153;
ap_fixed<75, 62> Val2 = 6721.355992351;
Result = Val1 + Val2;
//Yields 6722.480957
例 3‐122 : 2 進数演算子の加算の例
Val2 は、 整数部お よ び小数部の両方で ビ ッ ト 幅が大 き いため、 結果値をすべて格納で き る よ う にす る には、 結果の
型は こ の同 じ ビ ッ ト 幅に 1 を足 し た も のにな り ます。
減算
ap_[u]fixed::RType ap_[u]fixed::operator - (ap_[u]fixed op)
任意のオペ ラ ン ド op を使用 し 任意精度の固定小数点値を減算 し ます。
結果型 ap_[u]fixed::RType は 2 つのオペ ラ ン ド の型に よ っ て異な り ます。
ap_fixed<76, 63> Result;
ap_fixed<5, 2> Val1 = 1625.153;
ap_fixed<75, 62> Val2 = 6721.355992351;
Result = Val2 - Val1; // Yields 6720.23057
例 3‐123 : 2 進数演算子の減算の例
Val2 は、 整数部お よ び小数部の両方で ビ ッ ト 幅が大 き いため、 結果値をすべて格納で き る よ う にす る には、 結果の
型は こ の同 じ ビ ッ ト 幅に 1 を足 し た も のにな り ます。
乗算
ap_[u]fixed::RType ap_[u]fixed::operator * (ap_[u]fixed op)
任意のオペ ラ ン ド op を使用 し 任意精度の固定小数点値を乗算 し ます。
ap_fixed<80, 64> Result;
ap_fixed<5, 2> Val1 = 1625.153;
ap_fixed<75, 62> Val2 = 6721.355992351;
Result = Val1 * Val2;
// Yields 7561.525452
例 3‐124 : 2 進数演算子の乗算の例
こ の例では、 Val1 と Val2 を掛け合わせてい ます。 こ の結果の型は、 整数部の ビ ッ ト 幅 と 小数部の ビ ッ ト 幅の和に
な り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
319
C++ の任意精度 (AP) 固定小数点型
除算
ap_[u]fixed::RType ap_[u]fixed::operator / (ap_[u]fixed op)
任意のオペ ラ ン ド op を使用 し 任意精度の固定小数点値を除算 し ます。
ap_fixed<84, 66> Result;
ap_fixed<5, 2> Val1 = 1625.153;
ap_fixed<75, 62> Val2 = 6721.355992351;
Result = Val2 / Val1;
// Yields 5974.538628
例 3‐125 : 2 進数演算子の除算の例
こ の例では、 Val1 と Val2 を除算 し てい ます。 十分な精度を保持する には、 次の よ う にな り ます。
•
結果型の整数ビ ッ ト 幅は、 Val1 の整数ビ ッ ト 幅 と 、 Val2 の小数ビ ッ ト 幅の和にな り ます。
•
結果型の小数ビ ッ ト 幅は、 Val1 の小数ビ ッ ト 幅 と 、 Val2 の全ビ ッ ト 幅の和にな り ます。
ビ ッ ト 単位の論理演算子
ビ ッ ト 単位の OR
ap_[u]fixed::RType ap_[u]fixed::operator | (ap_[u]fixed op)
任意精度の固定小数点 と 任意のオペ ラ ン ド op にビ ッ ト 単位演算を適用 し ます。
ap_fixed<75, 62> Result;
ap_fixed<5, 2> Val1 = 1625.153;
ap_fixed<75, 62> Val2 = 6721.355992351;
Result = Val1 | Val2;
// Yields 6271.480957
例 3‐126 : ビ ッ ト 単位の論理演算子の OR の例
ビ ッ ト 単位の AND
ap_[u]fixed::RType ap_[u]fixed::operator & (ap_[u]fixed op)
任意精度の固定小数点 と 任意のオペ ラ ン ド op にビ ッ ト 単位演算を適用 し ます。
ap_fixed<75, 62> Result;
ap_fixed<5, 2> Val1 = 1625.153;
ap_fixed<75, 62> Val2 = 6721.355992351;
Result = Val1 & Val2;
// Yields 1.00000
例 3‐127 : ビ ッ ト 単位の論理演算子の OR の例
ビ ッ ト 単位の XOR
ap_[u]fixed::RType ap_[u]fixed::operator ^ (ap_[u]fixed op)
任意精度の固定小数点 と 任意のオペ ラ ン ド op に xor ビ ッ ト 単位演算を適用 し ます。
ap_fixed<75, 62> Result;
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
320
C++ の任意精度 (AP) 固定小数点型
ap_fixed<5, 2> Val1 = 1625.153;
ap_fixed<75, 62> Val2 = 6721.355992351;
Result = Val1 ^ Val2;
// Yields 6720.480957
例 3‐128 : ビ ッ ト 単位の論理演算子の XOR の例
イ ン ク リ メ ン ト お よびデ ク リ メ ン ト 演算子
プリ インク リ メ ン ト
ap_[u]fixed ap_[u]fixed::operator ++ ()
こ の operator 関数の接頭辞を使用す る と 、 任意精度の固定小数点変数が 1 ずつ イ ン ク リ メ ン ト さ れます。
ap_fixed<25, 8> Result;
ap_fixed<8, 5> Val1 = 5.125;
Result = ++Val1;
// Yields 6.125000
例 3‐129 : イ ン ク リ メ ン ト お よ びデ ク リ メ ン ト 演算子 : プ リ イ ン ク リ メ ン ト の例
ポス ト イ ン ク リ メ ン ト
ap_[u]fixed ap_[u]fixed::operator ++ (int)
こ の operator 接尾語関数では、 次が実行 さ れます。
•
•
任意精度の固定小数点変数を 1 ずつ イ ン ク リ メ ン ト
こ の任意精度の固定小数点の元の値を戻す
ap_fixed<25, 8> Result;
ap_fixed<8, 5> Val1 = 5.125;
Result = Val1++;
// Yields 5.125000
例 3‐130 : イ ン ク リ メ ン ト お よ びデ ク リ メ ン ト 演算子 : ポ ス ト イ ン ク リ メ ン ト の例
プ レデ ク リ メ ン ト
ap_[u]fixed ap_[u]fixed::operator -- ()
こ の operator 関数の接頭辞を使用す る と 、 任意精度の固定小数点変数が 1 ずつデ ク リ メ ン ト さ れます。
ap_fixed<25, 8> Result;
ap_fixed<8, 5> Val1 = 5.125;
Result = --Val1;
// Yields 4.125000
例 3‐131 : イ ン ク リ メ ン ト お よ びデ ク リ メ ン ト 演算子 : プ リ デ ク リ メ ン ト の例
ポス ト デ ク リ メ ン ト
ap_[u]fixed ap_[u]fixed::operator -- (int)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
321
C++ の任意精度 (AP) 固定小数点型
こ の operator 接尾語関数では、 次が実行 さ れます。
•
任意精度の固定小数点変数を 1 ずつデ ク リ メ ン ト
•
こ の任意精度の固定小数点の元の値を戻す
ap_fixed<25, 8> Result;
ap_fixed<8, 5> Val1 = 5.125;
Result = Val1--;
// Yields 5.125000
例 3‐132 : イ ン ク リ メ ン ト お よ びデ ク リ メ ン ト 演算子ポ ス ト デ ク リ メ ン ト の例
単項演算子
加算
ap_[u]fixed ap_[u]fixed::operator + ()
任意精度の固定小数点変数のセルフ コ ピーを戻 し ます。
ap_fixed<25, 8> Result;
ap_fixed<8, 5> Val1 = 5.125;
Result = +Val1;
// Yields 5.125000
例 3‐133 : 単項演算子 : 加算の例
減算
ap_[u]fixed::RType ap_[u]fixed::operator - ()
任意精度の固定小数点変数の負の値を戻 し ます。
ap_fixed<25, 8> Result;
ap_fixed<8, 5> Val1 = 5.125;
Result = -Val1;
// Yields -5.125000
例 3‐134 : 単項演算子 : 減算の例
等価ゼロ
bool ap_[u]fixed::operator !()
こ の operator 関数では、 次が実行 さ れます。
•
任意精度の固定小数点変数を 0 と 比較
•
結果を戻す
bool Result;
ap_fixed<8, 5> Val1 = 5.125;
Result = !Val1;
// Yields false
例 3‐135 : 単項演算子 : 等価ゼ ロの例
ビ ッ ト 単位の逆
ap_[u]fixed::RType ap_[u]fixed::operator ~ ()
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
322
C++ の任意精度 (AP) 固定小数点型
任意精度の固定小数点変数のビ ッ ト 単位の補数を戻 し ます。
ap_fixed<25, 15> Result;
ap_fixed<8, 5> Val1 = 5.125;
Result = ~Val1;
// Yields -5.25
例 3‐136 : 単項演算子 : ビ ッ ト 単位反転の例
シ フ ト 演算子
符号な し 左シ フ ト
ap_[u]fixed ap_[u]fixed::operator << (ap_uint<_W2> op)
こ の operator 関数では、 次が実行 さ れます。
•
任意の整数オペ ラ ン ド で左にシ フ ト
•
結果を戻す
オペ ラ ン ド には次の C/C++ の整数型を使用する こ と がで き ます。
•
char
•
short
•
int
•
long
左シ フ ト 演算で戻 さ れ る 型は、 シ フ ト さ れてい る 型 と 同 じ 幅にな り ます。
注記 : シ フ ト ではオーバーフ ロ ーま たは量子化モー ド はサポー ト さ れてい ません。
ap_fixed<25, 15> Result;
ap_fixed<8, 5> Val = 5.375;
ap_uint<4> sh = 2;
Result = Val << sh;
// Yields -10.5
例 3‐137 : シ フ ト 演算子 : 符号な し 左シ フ ト の例
結果のビ ッ ト 幅は (W = 25、I = 15) です。左シ フ ト 演算の結果型は Val と 同 じ 型であ る ため、次の よ う にな り ます。
•
Val の高位 2 ビ ッ ト がシ フ ト ア ウ ト
•
結果は -10.5
結果値に 21.5 が必要な場合は、 ap_ufixed<10, 7>(Val) の よ う に、 まず Val をap_fixed<10, 7> に型変換す
る 必要があ り ます。
符号付き左シ フ ト
ap_[u]fixed ap_[u]fixed::operator << (ap_int<_W2> op)
こ れに よ り 、 次が実行 さ れます。
•
任意の整数オペ ラ ン ド で左にシ フ ト
•
結果を戻す
シ フ ト の方向はオペ ラ ン ド が正か負かに よ り 変わ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
323
C++ の任意精度 (AP) 固定小数点型
•
オペ ラ ン ド が正の場合は右シ フ ト が実行 さ れます。
•
オペ ラ ン ド が負の場合は左シ フ ト (逆方向) が実行 さ れます。
オペ ラ ン ド には次の C/C++ の整数型を使用する こ と がで き ます。
•
char
•
short
•
int
•
long
右シ フ ト 演算で戻 さ れ る 型は、 シ フ ト さ れてい る 型 と 同 じ 幅にな り ます。
ap_fixed<25, 15, false> Result;
ap_uint<8, 5> Val = 5.375;
ap_int<4> Sh = 2;
Result = Val << sh;
// Shift left, yields -10.25
Sh = -2;
Result = Val << sh;
// Shift right, yields 1.25
例 3‐138 : シ フ ト 演算子 : 符号な し 左シ フ ト の例
符号な し 右シ フ ト
ap_[u]fixed ap_[u]fixed::operator >> (ap_uint<_W2> op)
こ の operator 関数では、 次が実行 さ れます。
•
任意の整数オペ ラ ン ド で右にシ フ ト
•
結果を戻す
オペ ラ ン ド には次の C/C++ の整数型を使用する こ と がで き ます。
•
char
•
short
•
int
•
long
右シ フ ト 演算で戻 さ れ る 型は、 シ フ ト さ れてい る 型 と 同 じ 幅にな り ます。
ap_fixed<25, 15> Result;
ap_fixed<8, 5> Val = 5.375;
ap_uint<4> sh = 2;
Result = Val >> sh;
// Yields 1.25
例 3‐139 : シ フ ト 演算子 : 符号な し 右シ フ ト の例
すべての上位ビ ッ ト を保持す る 必要があ る 場合は、 ap_fixed<10, 5>(Val) の よ う に、 まず Val の小数部の ビ ッ
ト 幅を拡張 し ます。
符号付き右シ フ ト
ap_[u]fixed ap_[u]fixed::operator >> (ap_int<_W2> op)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
324
C++ の任意精度 (AP) 固定小数点型
こ れに よ り 、 次が実行 さ れます。
•
任意の整数オペ ラ ン ド でmigi にシ フ ト
•
結果を戻す
シ フ ト の方向はオペ ラ ン ド が正か負かに よ り 変わ り ます。
•
オペ ラ ン ド が正の場合は右シ フ ト にな り ます。
•
オペ ラ ン ド が負の場合は左シ フ ト (逆方向) にな り ます。
オペ ラ ン ド には C/C++ の整数型を使用する こ と がで き ます (char、 short、 int、 ま たは long)。
右シ フ ト 演算の返 さ れ る 型は、 シ フ ト さ れてい る 型 と 同 じ 幅にな り ます。 次はその例です。
ap_fixed<25, 15, false> Result;
ap_uint<8, 5> Val = 5.375;
ap_int<4> Sh = 2;
Result = Val >> sh;
// Shift right, yields 1.25
Sh = -2;
Result = Val >> sh;
// Shift left,
yields -10.5
1.25
関係演算子
等号
bool ap_[u]fixed::operator == (ap_[u]fixed op)
任意のオペ ラ ン ド で任意精度の固定小数点変数を比較 し ます。
等 し ければ true を、 等 し く なければ false を戻 し ます。
オペ ラ ン ド op には、 ap_[u]fixed、 ap_int ま たは C/C++ 整数型を使用する こ と がで き ます。 次はその例です。
bool Result;
ap_ufixed<8, 5> Val1 = 1.25;
ap_fixed<9, 4> Val2 = 17.25;
ap_fixed<10, 5> Val3 = 3.25;
Result = Val1 == Val2;
Result = Val1 == Val3;
// Yields
// Yields
true
false
等号否定
bool ap_[u]fixed::operator != (ap_[u]fixed op)
任意のオペ ラ ン ド で こ の任意精度の固定小数点変数を比較 し ます。
等 し く なければ true を、 等 し く ければ false を戻 し ます。
オペ ラ ン ド op には、 次を使用す る こ と がで き ます。
•
ap_[u]fixed
•
ap_int
•
C ま たは C++ の整数型
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
325
C++ の任意精度 (AP) 固定小数点型
次はその例です。
bool Result;
ap_ufixed<8, 5> Val1 = 1.25;
ap_fixed<9, 4> Val2 = 17.25;
ap_fixed<10, 5> Val3 = 3.25;
Result = Val1 != Val2;
Result = Val1 != Val3;
// Yields false
// Yields true
大な り イ コ ール
bool ap_[u]fixed::operator >= (ap_[u]fixed op)
こ の operator では、 任意のオペ ラ ン ド で変数を比較 し てい ます。
変数が等 し い、 ま たはオペ ラ ン ド よ り 大 き い場合は true を、 そ う でない場合は false を戻 し ます。
オペ ラ ン ド op には、 ap_[u]fixed, ap_int ま たは C/C++ 整数型を使用す る こ と がで き ます。
次はその例です。
bool Result;
ap_ufixed<8, 5> Val1 = 1.25;
ap_fixed<9, 4> Val2 = 17.25;
ap_fixed<10, 5> Val3 = 3.25;
Result = Val1 >= Val2;
Result = Val1 >= Val3;
// Yields true
// Yields false
小な り イ コ ール
bool ap_[u]fixed::operator <= (ap_[u]fixed op)
任意のオペ ラ ン ド で変数を比較 し 、等 し い、ま たはオペ ラ ン ド よ り 小 さ い場合は true を戻 し 、そ う でなければ false
を戻 し ます。
オペ ラ ン ド op には、 ap_[u]fixed、 , ap_int ま たは C/C++ 整数型を使用する こ と がで き ます。
次はその例です。
bool Result;
ap_ufixed<8, 5> Val1 = 1.25;
ap_fixed<9, 4> Val2 = 17.25;
ap_fixed<10, 5> Val3 = 3.25;
Result = Val1 <= Val2;
Result = Val1 <= Val3;
// Yields true
// Yields true
大な り
bool ap_[u]fixed::operator > (ap_[u]fixed op)
任意のオペ ラ ン ド で変数を比較 し 、 オペ ラ ン ド よ り 大 き い場合は true を戻 し 、 そ う でなければ false を戻 し ます。
オペ ラ ン ド op には、 ap_[u]fixed、 , ap_int ま たは C/C++ 整数型を使用する こ と がで き ます。
次はその例です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
326
C++ の任意精度 (AP) 固定小数点型
bool Result;
ap_ufixed<8, 5> Val1 = 1.25;
ap_fixed<9, 4> Val2 = 17.25;
ap_fixed<10, 5> Val3 = 3.25;
Result = Val1 > Val2;
Result = Val1 > Val3;
// Yields false
// Yields false
小な り
bool ap_[u]fixed::operator < (ap_[u]fixed op)
任意のオペ ラ ン ド で変数を比較 し 、 オペ ラ ン ド よ り 小 さ い場合は true を返 し 、 そ う でなければ false を戻 し ます。
オペ ラ ン ド op には、 ap_[u]fixed、 ap_int ま たは C/C++ 整数型を使用する こ と がで き ます。 次はその例です。
bool Result;
ap_ufixed<8, 5> Val1 = 1.25;
ap_fixed<9, 4> Val2 = 17.25;
ap_fixed<10, 5> Val3 = 3.25;
Result = Val1 < Val2;
Result = Val1 < Val3;
// Yields false
// Yields true
ビ ッ ト 演算子
ビ ッ ト の選択および設定
af_bit_ref ap_[u]fixed::operator [] (int bit)
任意精度の固定小数点値か ら 1 ビ ッ ト 選択 し 、 それを戻 し ます。
戻 し 値は、 ap_[u]fixed 変数で対応す る ビ ッ ト を設定ま たは消去で き る 参照値です。 ビ ッ ト 引数は整数値であ る 必
要があ り 、 選択す る ビ ッ ト の指数を指定 し ます。 最下位ビ ッ ト は指数 0 にな り ます。 最大指数は こ の ap_[u]fixed
変数のビ ッ ト 幅か ら 1 を引いた値にな り ます。
結果型は af_bit_ref で値は 0 ま たは 1 です。 次はその例です。
ap_int<8, 5> Value = 1.375;
Value[3];
Value[4];
// Yields
// Yields
1
0
Value[2] = 1;
Value[3] = 0;
// Yields 1.875
// Yields 0.875
ビ ッ ト 範囲
af_range_ref af_(u)fixed::range (unsigned Hi, unsigned Lo)
af_range_ref af_(u)fixed::operator [] (unsigned Hi, unsigned Lo)
こ の演算は、 ビ ッ ト 選択の演算子 [] に似てい ますが、 1 ビ ッ ト ではな く ビ ッ ト の範囲に対 し て演算が行われ、
任意精度の固定小数点変数か ら ビ ッ ト のグループを選択 し ます。 引数 Hi は範囲の上のほ う のビ ッ ト を指定 し 、 引数
Lo は最下位ビ ッ ト を指定 し ます。 Lo が Hi よ り も 大 き い場合は、 選択 さ れた ビ ッ ト が逆の順序で戻 さ れます。
返 さ れ る 型 af_range_ref は、Hi お よ び Lo で指定 さ れ る ap_[u]fixed 変数の範囲の参照です。次はその例です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
327
C++ の任意精度 (AP) 固定小数点型
ap_uint<4> Result = 0;
ap_ufixed<4, 2> Value = 1.25;
ap_uint<8> Repl = 0xAA;
Result = Value.range(3, 0);
Value(3, 0) = Repl(3, 0);
// Yields:0x5
// Yields:-1.5
// when Lo > Hi, return the reverse bits string
Result = Value.range(0, 3);
// Yields:0xA
範囲選択
af_range_ref af_(u)fixed::range ()
af_range_ref af_(u)fixed::operator []
こ れは、 範囲選択演算子 [] の特殊ケース で、 任意精度の固定小数点値か ら すべての ビ ッ ト を標準の順序で選択 し ま
す。
返 さ れ る 型 af_range_ref は、 Hi = W - 1 お よ び Lo = 0 で指定 さ れ る 範囲の参照です。 次はその例です。
ap_uint<4> Result = 0;
ap_ufixed<4, 2> Value = 1.25;
ap_uint<8> Repl = 0xAA;
Result = Value.range();
Value() = Repl(3, 0);
// Yields:0x5
// Yields:-1.5
長さ
int ap_[u]fixed::length ()
任意精度の固定小数点値で ビ ッ ト 数を示す整数値を返 し ます。 1 つの型ま たは値で使用す る こ と がで き ます。 次はそ
の例です。
ap_ufixed<128, 64> My128APFixed;
int bitwidth = My128APFixed.length();
// Yields 128
明示的な変換 メ ソ ッ ド
固定小数点から double 型
double ap_[u]fixed::to_double ()
こ の メ ンバー フ ァ ン ク シ ョ ンは、 IEEE の倍精度フ ォーマ ッ ト で固定小数点値を返 し ます。 次はその例です。
ap_ufixed<256, 77> MyAPFixed = 333.789;
double Result;
Result = MyAPFixed.to_double();
// Yields 333.789
固定小数点から ap_int 型
ap_int ap_[u]fixed::to_ap_int ()
こ の メ ンバー フ ァ ン ク シ ョ ンは、 こ の固定小数点値を、 すべての整数ビ ッ ト を取 り 込む ap_int 型に明示的に変換
し ます (小数ビ ッ ト は切 り 捨て)。 次はその例です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
328
SystemC 型 と Vivado HLS 型の比較
ap_ufixed<256, 77> MyAPFixed = 333.789;
ap_uint<77> Result;
Result = MyAPFixed.to_ap_int();
//Yields 333
固定小数点から 整数型
int ap_[u]fixed::to_int ()
unsigned ap_[u]fixed::to_uint ()
ap_slong ap_[u]fixed::to_int64 ()
ap_ulong ap_[u]fixed::to_uint64 ()
こ の メ ンバー フ ァ ン ク シ ョ ンは、こ の固定小数点値を C のビル ト イ ン整数型に明示的に変換 し ます。次はその例です。
ap_ufixed<256, 77> MyAPFixed = 333.789;
unsigned int Result;
Result = MyAPFixed.to_uint();
//Yields 333
unsigned long long Result;
Result = MyAPFixed.to_uint64();
//Yields 333
SystemC 型 と Vivado HLS 型の比較
Vivado HLS 型は SystemC型 と 同様で、実質上すべての ク ラ ス に互換性があ り ます。 Vivado HLS 型を使用 し て記述 さ れ
た コ ー ド は、 通常 SystemC デザ イ ンに移行で き 、 SystemC 型を使用 し て記述 さ れた コ ー ド は Vivado HLS に移行で き
ます。
Vivado HLS 型 と SystemC 型の ビヘ イ ビ アーには、 違い も あ り ます。 こ れ ら の違いについては、 次のセ ク シ ョ ン に分
けて説明 し ます。
•
デフ ォ ル ト コ ン ス ト ラ ク タ ー
•
整数除算
•
整数係数
•
負のシ フ ト
•
左シ フ ト のオーバーフ ロ ー
•
range 演算
•
固定小数点の除算
•
固定小数点の ラ イ ト シ フ ト
•
固定小数点の左シ フ ト
デ フ ォル ト コ ン ス ト ラ ク タ ー
SystemC では、 次の型の コ ン ス ト ラ ク タ ーに よ り 、 プ ロ グ ラ ム実行前に値が 0 に初期化 さ れます。
•
sc_[u]int
•
sc_[u]bigint
•
sc_[u]fixed
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
329
SystemC 型 と Vivado HLS 型の比較
次の Vivado HLS 型は こ の コ ン ス ト ラ ク タ ーでは初期化 さ れません。
•
ap_[u]int
•
ap_[u]fixed
Vivado HLS のビ ッ ト 精度デー タ 型 :
•
ap_[u]int
デフ ォ ル ト の初期化な し
•
ap_[u]fixed
デフ ォ ル ト の初期化な し
SystemC のビ ッ ト 精度デー タ 型 :
•
sc_[u]int
デフ ォ ル ト で 0 に初期化
•
sc_big[u]int
デフ ォ ル ト で 0 に初期化
•
sc_[u]fixed
デフ ォ ル ト で 0 に初期化
注意 : SystemC 型を Vivado HLS 型に移行す る 場合は、 変数が読み出 さ れない よ う に、 ま たは書 き 込まれ る ま で条件文
に使用 さ れない よ う に し て く だ さ い。
出力が書 き 込まれたか ど う かに関係な く 、 SystemC デザ イ ンのすべての出力がデフ ォ ル ト 値の 0 で表示 さ れ始め る こ
と があ り ます。 こ の場合、 Vivado HLS 型 と 同 じ 変数はそれが書 き 込まれ る ま で未知の状態の ま ま です。
整数除算
整数除算を使用す る 場合、 Vivado HLS 型は sc_big[u]int 型 と 同 じ にな り ますが、 sc_[u]int と は異な る ビヘ イ
ビ アーにな り ます。 図 3-9 はその例を示 し てい ます。
X-Ref Target - Figure 3-9
図 3‐9 : 整数除算の相違点
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
330
SystemC 型 と Vivado HLS 型の比較
SystemC の sc_int 型は、 符号な し の整数が負の符号付 き 整数で除算 さ れ る と 0 を戻 し ます。 Vivado HLS 型の場合、
SystemC の sc_bigint と 同様、 負の結果を示 し ます。
整数係数
剰余演算子を使用す る 場合、 Vivado HLS 型は sc_big[u]int 型 と 同 じ にな り ますが、 sc_[u]int と は異な る ビヘ
イ ビ アーにな り ます。 図 3-10 はその例を示 し てい ます。
X-Ref Target - Figure 3-10
図 3‐10 : 整数剰余の相違点
SystemC の sc_int 型は、 次の場合に剰余演算の被除数の値を戻 し ます。
•
被除数 (dividend) が符号な し の整数
•
除数 (divisor) が負の符号付 き 整数
Vivado HLS 型の場合 (例 : SystemC の sc_bigint 型)、 正の剰余演算結果を戻 し ます。
負のシ フ ト
シ フ ト 演算の値が負の数値の場合、 Vivado HLS の ap_[u]int 型は値を逆方向にシ フ ト し ます。 た と えば、 右シ フ ト
の場合は左シ フ ト を戻 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
331
SystemC 型 と Vivado HLS 型の比較
SystemC 型の sc_[u]int お よ び sc_big[u]int は、 こ の よ う な場合異な る ビヘ イ ビ アーにな り ます。 図 3-11 は、
こ の演算の例を Vivado HLS 型 と SystemC 型の両方で示 し てい ます。
X-Ref Target - Figure 3-11
図 3‐11 : 負のシ フ ト の相違点
表 3‐18 : 負のシ フ ト の相違点のサマ リ
型
操作
ap_[u]int
反対方向にシ フ ト
sc_[u]int
0 を戻す
sc_big[u]int
シフ ト なし
シ フ ト レ フ ト のオーバー フ ロー
シ フ ト 演算が実行 さ れ、 結果が出力や代入 さ れた変数ではな く 、 入力変数か ら オーバーフ ロ ーする 場合、 Vivado HLS
型 と SystemC 型のビヘ イ ビ アーは異な り ます。
•
Vivado HLS の ap_[u]int は、 値を シ フ ト し てか ら 代入をす る ので、 上位ビ ッ ト はオーバーフ ロ ー し て失われ
ます。
•
SystemC の sc_big(u)int お よ び sc_(u)int 型の場合は、 両方 と も 結果を代入 し てか ら 、 上位ビ ッ ト を保持
し つつシ フ ト を実行 し ます。
•
図 3-12 は、 こ の演算の例を Vivado HLS 型 と SystemC 型の両方で示 し てい ます。
X-Ref Target - Figure 3-12
図 3‐12 : シ フ ト レ フ ト のオーバー フ ローの相違点
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
332
SystemC 型 と Vivado HLS 型の比較
range 演算
range 演算が使用 さ れ、 その range のサ イ ズが ソ ー ス と デ ス テ ィ ネーシ ョ ン で異な る 場合は、 ビヘ イ ビ アが異な り ま
す。図 3-13 は、 こ の演算の例を Vivado HLS 型 と SystemC 型の両方で示 し てい ます。次のサマ リ を参照 し て く だ さ い。
X-Ref Target - Figure 3-13
図 3‐13 : range 演算の相違点
•
Vivado HLS の ap_[u]int お よ び SystemC の sc_big[u]int 型は、 指定 し た range を置 き 換え て、 タ ーゲ ッ ト
の範囲を 0 で埋め る よ う に拡張 さ れます。
•
SystemC の sc_big[u]int 型は、 ソ ース の range のみ使用 し て ア ッ プデー ト さ れます。
固定小数点型の除算
異な る サ イ ズの固定小数点型の変数を使用 し て除算を実行す る 場合、 小数値の代入方法が Vivado HLS 型 と SystemC
型で異な り ます。
ap_[u]fixed 型の場合、 小数部分はその被除数 よ り も 大 き く はな り ません。 SystemC の sc_[u]fixed 型では、 除
算での小数の精度が保持 さ れます。 ap_[u]fixed 型を使用す る 場合、 代入前に新 し い変数幅へキ ャ ス ト す る と 、 小
数部分を保持す る こ と がで き ます。
図 3-14 は、 こ の演算の例を Vivado HLS 型 と SystemC 型の両方で示 し てい ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
333
SystemC 型 と Vivado HLS 型の比較
X-Ref Target - Figure 3-14
図 3‐14 : 固定小数点の除算の相違点
固定小数点型の右シ フ ト
右シ フ ト 演算が実行 さ れ る 場合、 Vivado HLS と SystemC の動作は異な り ます。
•
Vivado HLS の固定小数点型で実行 さ れ る と 、 シ フ ト が実行 さ れてか ら 、 値が代入 さ れます。
•
SystemC の固定小数点型の場合、 値が代入 さ れてか ら 、 シ フ ト が実行 さ れます。
結果が よ り 多 く の小数ビ ッ ト を含む固定小数点型の場合、 SystemC 型では さ ら に追加で精度が保持 さ れます。
図 3-15 は、 こ の演算の例を Vivado HLS 型 と SystemC 型の両方で示 し てい ます。
X-Ref Target - Figure 3-15
図 3‐15 : 右シ フ ト を使用 し た固定小数点型の違い
量子化モー ド の型は、 ap_[u]fixed の右シ フ ト の結果には影響 し ません。 シ フ ト 演算 よ り も 前に結果の型のサ イ ズに代
入 し てお く こ と をお勧め し ます。
固定小数点型の左シ フ ト
ap_[u]fixed 型を使用 し て左シ フ ト 演算を実行す る と 、 オペ ラ ン ド が符号拡張 さ れてか ら 、 シ フ ト さ れて、 代入 さ
れます。 SystemC の sc_[u]fixed 型の場合は、 代入 し てか ら シ フ ト が実行 さ れます。 こ の場合、 Vivado HLS 型はす
べての符号を保持 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
334
SystemC 型 と Vivado HLS 型の比較
図 3-16 は、 こ の演算の例を Vivado HLS 型 と SystemC 型の両方で示 し てい ます。
X-Ref Target - Figure 3-16
図 3‐16 : 左シ フ ト を使用 し た固定小数点型の違い
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
335
第 4章
高位合成 コ マ ン ド
高位合成 コ マ ン ド の使用
ア ク テ ィ ブ デザ イ ン プ ロ ジ ェ ク ト で高位合成 (HLS) コ マ ン ド を実行す る 前に、 次の基本的なの概念を理解 し てお く
必要があ り ます。
1.
Vivado HLS では、 プ ロ ジ ェ ク ト ベース構造でデザ イ ンが保存 さ れます。
2.
Vivado HLS の最適化は、 領域、 ロ ケーシ ョ ン、 ま たは コ ー ド 内で指定 し ます。
3.
Vivado HLS の最適化は Tcl コ マ ン ド ま たは ソ ース コ ー ド のプ ラ グマ と し て指定で き ます。
ど ち ら のオプシ ョ ン も テ キ ス ト フ ァ イ ルで編集で き る ほか、 Vivado HLS の GUI か ら で も 実行で き ます。
本章では、 こ れ ら の概念についてそれぞれ説明 し ます。
プ ロ ジ ェ ク ト の管理
Vivado HLS では、 プ ロ ジ ェ ク ト ベース のデー タ ベース が使用 さ れ、 合成お よ び検証が管理 さ れ、 結果が保存 さ れま
す。 デザ イ ンは、 複数の ソ リ ュ ーシ ョ ン を含むプ ロ ジ ェ ク ト と し て表示 さ れます。
ソ ース コ ー ド お よ びテ ス ト ベンチは こ のプ ロ ジ ェ ク ト に保存 さ れます。 ソ リ ュ ーシ ョ ン を使用する と 、 次が実行で き
ます。
•
タ ーゲ ッ ト テ ク ノ ロ ジ (FPGA フ ァ ミ リ お よ びデバ イ ス) を指定
•
指示子を適用 し 、 同 じ ソ ース コ ー ド に対 し て異な る イ ンプ リ メ ン テーシ ョ ン を作成 (最適な イ ンプ リ メ ン テー
シ ョ ン を選択す る ための表示あ り )
Vivado HLS のプ ロ ジ ェ ク ト お よ び ソ リ ュ ーシ ョ ンは、 Vivado HLS で使用 さ れ る デ ィ レ ク ト リ 構造に直接反映 さ れま
す。 図 4-1 は、 結果が生成 さ れた後の Vivado HLS デ ィ レ ク ト リ の例です。
図 4-1 の例には、 次が表示 さ れてい ます。
•
一番上のプ ロ ジ ェ ク ト は project.prj. と 表示 さ れ、 すべてのプ ロ ジ ェ ク ト デー タ が同 じ 名前のプ ロ ジ ェ ク ト
デ ィ レ ク ト リ に保存 さ れます。
•
プ ロ ジ ェ ク ト には ソ ース コ ー ド と テ ス ト ベンチ フ ァ イ ルが含まれます。
•
こ のプ ロ ジ ェ ク ト には solution1 と solution2 の 2 つの ソ リ ュ ーシ ョ ンがあ り ます。
•
現在の と こ ろ、 ア ク テ ィ ブ ソ リ ュ ーシ ョ ンは solution1 (太字でハ イ ラ イ ト ) です。
•
シ ミ ュ レーシ ョ ン結果は sim デ ィ レ ク ト リ に保存 さ れます。
•
合成結果は syn デ ィ レ ク ト リ に保存 さ れます。
°
syn デ ィ レ ク ト リ には、 Verilog、 VHDL、 SystemC で作成 さ れた RTL 出力が含まれます。
°
syn デ ィ レ ク ト リ には、 生成 さ れた レ ポー ト が含まれます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
336
高位合成コ マ ン ド の使用
X-Ref Target - Figure 4-1
図 4‐1 : プ ロ ジ ェ ク ト および ソ リ ュ ーシ ョ ンの構造
Vivado HLS コ マ ン ド を使用す る 際は、 ア ク テ ィ ブ プ ロ ジ ェ ク ト ま たは ソ リ ュ ーシ ョ ン内で し か使用で き ない コ マ ン
ド があ る こ と に注意 し て く だ さ い。 通常、 プ ロ ジ ェ ク ト は同 じ ソ ース コ ー ド のセ ッ ト に使用 さ れ、 ソ リ ュ ーシ ョ ンは
その ソ ース コ ー ド に対す る さ ま ざ ま な イ ンプ リ メ ン テーシ ョ ン を作成する ために使用 さ れます。
ヒ ン ト : 新 し いプ ロ ジ ェ ク ト を開 く と 、 既存のプ ロ ジ ェ ク ト は自動的に閉 じ 、 新 し い ソ リ ュ ーシ ョ ン を開 く と 、 既存
の ソ リ ュ ーシ ョ ンは自動的に閉 じ ます。
高位合成の最適化のロ ケーシ ョ ン
Vivado HLS での最適化は、 関数、 ループ、 領域、 ア レ イ お よ び イ ン タ ーフ ェ イ ス パ ラ メ ー タ ーで指定で き ます。 こ
のセ ク シ ョ ンでは、 最適化の適用方法 と 影響す る ロ ケーシ ョ ンについて説明 し ます。
最適化の指定
最適化は、 次の 3 つのいずれかの方法で指定 し ます。
1.
GUI の [Directive] タ ブ を使用 し ます。
2.
オブジ ェ ク ト が独自に識別で き る のであれば、 対話型プ ロ ンプ ト ま たはバ ッ チ フ ァ イ ルに Tcl コ マ ン ド を使用 し
て指示子を指定 し ます。 ループお よ び領域には ラ ベルが必要です。
3.
プ ラ グマ指示子を ソ ース コ ー ド に直接挿入 し ます。 プ ラ グマは、 関数、 ループ、 ま たはそれが適用 さ れ る 領域内
に含まれ る 必要があ り 、 グ ロ ーバル空間の関数外には配置で き ません。
こ れ ら の方法で指定 さ れ る 最適化は、 ソ ース コ ー ド 内の指定 ロ ケーシ ョ ン (ス コ ープ) に適用 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
337
高位合成コ マ ン ド の使用
コー ド例
次の例は、 あ る ソ ース コ ー ド の概要を示 し てい ます。
int foo_sub_A (int mem_1[64],..){
for_A: for (int n = 0; n < 3; ++n) {
...
}
...
}
int foo_sub_B (int mem_1[64], int i) {
for_B:for (int n = 0; n < 4; ++n) {
...
}
...
}
void foo_top (int mem_1[64], int mem_2[64]) {
...
for_top: for (int i = 0; i < 64; ++i) {
my_label:{
...
}
}
}
[Directive] タ ブ
図 4-2 に、 上記の コ ー ド 例が ど の よ う に [Directive] タ ブに表示 さ れ る か を示 し ます。 [Directive] タ ブは、 次の方法で
表示で き ます。
1.
[Explorer] タ ブで ソ ース コ ー ド を ダブル ク リ ッ ク し て開 き ます。
2.
補足エ リ アで [Directive] タ ブ を ク リ ッ ク し ます。
X-Ref Target - Figure 4-2
図 4‐2 : [Directive] タ ブのオブ ジ ェ ク ト
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
338
高位合成コ マ ン ド の使用
[Directive] タ ブに含まれ る オブジ ェ ク ト は、 次の と お り です。
•
イ ン タ ーフ ェ イ ス
イ ン タ ーフ ェ イ ス に適用 さ れ る 指示子は、 その イ ン タ ーフ ェ イ ス のオブジ ェ ク ト (関数、 パ ラ メ ー タ ー、 グ ロ ー
バルま たは戻 り 値) にのみ適用 さ れます。
•
関数
関数に適用 さ れ る 指示子は、 その関数の ス コ ープ内のオブジ ェ ク ト すべてに対 し て実行 さ れます。 指示子の影響
は、 その関数階層の次の レベルで停止 し ますが、 すべてが繰 り 返 し フ ラ ッ ト に さ れて展開 さ れ る PIPELINE 指示
子の場合や、 指示子で -recursive オプシ ョ ンがサポー ト さ れていて適用 さ れ る 場合な どは例外です。
図 4-2 の例の場合、 foo_top に適用 さ れた指示子は foo_sub_A ま たは foo_sub_B の演算には影響 し ません
(上記の例外は除 く )。
•
ループ
ループに適用 さ れ る 指示子は、 そのループの ス コ ープ内のオブジ ェ ク ト すべてに影響 し ます。
•
°
ループに MERGE 指示子が使用 さ れ る 場合、指示子はループ自体ではな く 、その下位ループに適用 さ れます。
ループは同 じ 階層レベルのループ と は結合 さ れず、 下位ループ と 結合 さ れます。
°
PIPELINE 指示子は、 ループ内のオブジ ェ ク ト に も 適用 さ れます。 こ れは、 本質的にはループ自体のパ イ プ
ラ イ ン処理 と 同 じ です。
アレ イ
指示子はア レ イ に直接適用で き ます。 こ の場合、 ア レ イ 自体にのみ適用で き る ほか、 複数のア レ イ を含む関数、
ループ、 領域に適用で き ます。 ま た、 含まれ る すべてのア レ イ に適用 さ れます。
•
領域
コ ー ド の領域は波括弧 { } で囲む と 作成で き ます。
{the code between these braces is a region}
ラ ベル付 き 領域に適用 さ れ る 指示子は、 その領域内のオブジ ェ ク ト に適用 さ れます。
ヒ ン ト : Tcl コ マ ン ド を使用 し て指示子を適用す る には、 上記の例の よ う にループお よ び領域に ラ ベルが必要です (上
記の例ではループ ラ ベル for_top と 領域 ラ ベル my_label)。
イ ン タ ーフ ェ イ スお よ びア レ イ 以外のその他のオブジ ェ ク ト (関数、 ループ、 領域) は、 複数の文を含むコ ー ド の 「エ
リ ア」 を示 し ます。 こ のため、 本書では タ ーゲ ッ ト を 「 ロ ケーシ ョ ン」 と し て リ ス ト し てい ます。
重要 : 指示子が ロ ケーシ ョ ンに適用 さ れ る と 、 明確に指定がない限 り 、 その ロ ケーシ ョ ン内のすべてのオブジ ェ ク ト
に適用 さ れます。
コ マ ン ド およびプ ラ グマ
Vivado HLS の最適化は、 前のセ ク シ ョ ンで説明 し た よ う に、 主に コ ー ド 内の ロ ケーシ ョ ンに基づいてい ます。 最適化
を指定す る こ のモデルでは、 コ ー ド 内でのプ ラ グマの使用がサポー ト さ れてい ます。
次の例の場合、 プ ラ グ マは for ループ を展開す る ために コ ー ド に挿入 さ れてい ます。 プ ラ グマの後は、 常に AP キー
ワー ド と 指示子が指定 さ れます。
for (int i = 0; i < 64; ++i) {
#pragma HLS UNROLL
...
}
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
339
高位合成コ マ ン ド の使用
C コ ー ド で入力 さ れ る 指示子は、 C 仕様を使用す る イ ンプ リ メ ン テーシ ョ ンすべてで共有 さ れます。 C 仕様にすべて
の最適化指示子が含ま れ る よ う にす る 必要があ る こ と も あ り ますが、 プ ラ グマ を ソ ース と 分けて、 別の ソ リ ュ ーシ ョ
ン が作成で き る よ う にす る 方が望 ま し い こ と がほ と ん ど です。 プ ラ グ マが使用 さ れ る と 、 その ソ ー ス を使用す る ソ
リ ュ ーシ ョ ンすべてに対 し て同 じ 最適化が実行 さ れます。
上記の例の場合、 ループに ラ ベルが付いていれば、 コ マ ン ド ラ イ ン イ ン タ ーフ ェ イ ス に set_directive_unroll
コ マ ン ド を使用す る か、 [Directives] タ ブの ソ ース コ ー ド に UNROLL 指示子を追加 し ます。
Vivado HLS の指示子およびプ ラ グマ
次を表示す る には、 Vivado HLS で help コ マ ン ド を実行 し ます。 こ れに よ り 、 各最適化指示子に関連す る プ ラ グマが
表示 さ れます。
vivado_hls> help
ALL TCL COMMANDS:
add_files
- Add file(s) to the current project
close_project
- Close the project that is currently open
close_solution
- Close a solution
config_array_partition
- Config the array partition
config_bind
- Config the options for micro-architecture binding
config_dataflow
- Config the dataflow pipeline
config_interface
- Config command for io mode
config_rtl
- Config the options for RTL generation
config_schedule
- Config scheduler options
cosim_design
- Simulate the RTL using C test bench
create_clock
- Set up a virtual clock
csim_design
- Simulate C
csynth_design
- Synthesize the design
delete_project
- Delete a project
delete_solution
- Delete a solution from the current project
export_design
- Package design
help
- Print the manpage of a command
list_core
- List core(s) in the resource library
list_part
- List supported parts
open_project
- Open an existing project or create a new project
open_solution
- Open an existing solution or create a new solution
set_clock_uncertainty
- Set the clock uncertainty
set_directive_allocation
- Directive ALLOCATION
set_directive_array_map
- Directive ARRAY_MAP
set_directive_array_partition
- Directive ARRAY_PARTITION
set_directive_array_reshape
- Directive ARRAY_RESHAPE
set_directive_clock
- Directive CLOCK
set_directive_data_pack
- Directive DATA_PACK
set_directive_dataflow
- Directive DATAFLOW
set_directive_dependence
- Directive DEPENDENCE
set_directive_expression_balance
- Directive EXPRESSION_BALANCE
set_directive_function_instantiate - Directive FUNCTION_INSTANTIATE
set_directive_inline
- Directive INLINE
set_directive_interface
- Directive INTERFACE
set_directive_latency
- Directive LATENCY
set_directive_loop_flatten
- Directive LOOP_FLATTEN
set_directive_loop_merge
- Directive LOOP_MERGE
set_directive_loop_tripcount
- Directive LOOP_TRIPCOUNT
set_directive_occurrence
- Directive OCCURRENCE
set_directive_pipeline
- Directive PIPELINE
set_directive_protocol
- Directive PROTOCOL
set_directive_reset
- Directive RESET
set_directive_resource
- Directive RESOURCE
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
340
高位合成コ マ ン ド の使用
set_directive_stream
set_directive_top
set_directive_unroll
set_part
set_top
-
Directive STREAM
Directive TOP
Directive UNROLL
Set the target part
Set the top-level model
どれを最適化す る か、 コ マ ン ド ま たはプ ラ グマが何かを決定す る 一番簡単な方法は、 次の と お り です。
1.
コ ー ド を GUI で開 き ます。
2.
[Directive] タ ブ (図 4-1) を ク リ ッ ク し 、 最適化可能なオブジ ェ ク ト すべて を表示 し ます。
3.
オブジ ェ ク ト を選択 し て、 右 ク リ ッ ク で指示子を指定 し ます。
a.
[Destination] を [Into Directive File] に し 、 コ マ ン ド が constraints/directive.tcl に含まれ る よ う に し
ます。
ま たは
b.
[Destination] を [Into Source File] に し 、 プ ラ グマが コ ー ド に直接挿入 さ れ る よ う に し ます。
プ ラ グマ指示子の付いた変数値の使用
プ ラ グマ指示子は、 define 文で指定 さ れ る 使用値元々はサポー ト し てい ません。 次の コ ー ド では、 define 文を使
用 し て ス ト リ ームの深 さ を指定 し よ う と し てい ますが、 コ ンパ イ ルは さ れません。
ヒ ン ト : 深 さ の引数は明確な値で指定す る 必要があ り ます。
#include <hls_stream.h>
using namespace hls;
#define STREAM_IN_DEPTH 8
void foo (stream<int> &InStream, stream<int> &OutStream) {
// Illegal pragma
#pragma HLS stream depth=STREAM_IN_DEPTH variable=InStream
// Legal pragma
#pragma HLS stream depth=8 variable=OutStream
}
C コ ー ド のマ ク ロ を使用す る と 、 こ の機能を イ ンプ リ メ ン ト で き ます。 マ ク ロ を使用す る には、 マ ク ロ の階層レベル
を使用 し ます。 こ れに よ り 、 拡張が正 し く 実行 さ れ る よ う にな り ます。 上記の コ ー ド の場合、 次の よ う にす る と コ ン
パ イ ル さ れ る よ う にな り ます。
#include <hls_stream.h>
using namespace hls;
#define PRAGMA_SUB(x) _Pragma (#x)
#define PRAGMA_HLS(x) PRAGMA_SUB(x)
#define STREAM_IN_DEPTH 8
void foo (stream<int> &InStream, stream<int> &OutStream) {
// Legal pragmas
PRAGMA_HLS(HLS stream depth=STREAM_IN_DEPTH variable=InStream)
#pragma HLS stream depth=8 variable=OutStream
}
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
341
add_files
add_files
説明
現在のプ ロ ジ ェ ク ト にデザ イ ン ソ ース フ ァ イ ルを追加 し ます。
ツールは、 デザ イ ン ソ ース に含まれ る ヘ ッ ダー フ ァ イ ルを現在のデ ィ レ ク ト リ で検索 し ます。 ほかのデ ィ レ ク ト リ
に保存 さ れてい る ヘ ッ ダー フ ァ イ ルを使用する には、 -cflags オプシ ョ ン を使用 し て、 検索パ ス にそれ ら のデ ィ レ
ク ト リ を追加 し ます。
構文
add_files [OPTIONS] <src_files>
説明 :
•
<src_files> は、 デザ イ ンの記述を含む ソ ース フ ァ イ ルを リ ス ト し ます。
オプ シ ョ ン
-tb
デザ イ ンのテ ス ト ベンチの一部 と し て使用 さ れ る フ ァ イ ルを指定 し ます。
こ れ ら の フ ァ イ ルは合成 さ れ ませんが、 cosim_design コ マ ン ド に よ り 合成後検証が実行 さ れ る と き に使用 さ れ ま
す。
こ のオプシ ョ ンが使用 さ れてい る と き は、 ソ ース フ ァ イ ルの リ ス ト にデザ イ ン フ ァ イ ルを含め る こ と はで き ません。
デザ イ ン フ ァ イ ルお よ びテ ス ト ベンチ フ ァ イ ルを追加す る には、 別の add_files コ マ ン ド を使用 し ます。
-cflags <string>
GCC コ ンパ イ ル オプシ ョ ンの文字列です。
プ ラ グマ
同等の pragma はあ り ません。
例
例1
add_files a.cpp
add_files b.cpp
add_files c.cpp
プ ロ ジ ェ ク ト に 3 つのデザ イ ン フ ァ イ ルを追加 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
342
add_files
例2
add_files "a.cpp b.cpp c.cpp"
1 コ マ ン ド 行で複数の フ ァ イ ルを追加 し ます。
例3
add_files top.cpp -cflags "-DUSE_RANDOM -i./lib_functions"
•
USE_RANDOM と い う マ ク ロ を有効にす る コ ンパ イ ラ フ ラ グ と 共に SystemC フ ァ イ ルを追加 し ます。
•
ヘ ッ ダー フ ァ イ ル検索用の追加の下位デ ィ レ ク ト リ ./lib_functions を指定 し ます。
例4
add_files -tb "a_test.cpp input_stimuli.dat out.gold.dat"
-tb オプシ ョ ン を使用 し てプ ロ ジ ェ ク ト にテ ス ト ベンチ フ ァ イ ルを追加 し ます。 こ の例では、 1 コ マ ン ド 行で次の複
数の フ ァ イ ルを追加 し てい ます。
•
a_test.cpp テ ス ト ベンチ
•
テ ス ト ベンチで読み出 さ れ る すべてのデー タ フ ァ イ ル :
°
input_stimuli.dat
°
out.gold.dat.
例5
add_files -tb a_test.cpp
add_files -tb test_data
例 4 のテ ス ト ベンチのデー タ フ ァ イ ルが、 別のデ ィ レ ク ト リ (た と えば test_data) に保存 さ れてい る 場合、 個々の
フ ァ イ ルを指定す る 代わ り に、 こ のデ ィ レ ク ト リ を プ ロ ジ ェ ク ト に追加で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
343
cosim_design
cosim_design
説明
元の C ベース のテ ス ト ベンチを使用 し て、合成 さ れた RTL の合成後協調シ ミ ュ レーシ ョ ン を実行する コ マ ン ド です。
テ ス ト ベンチ用の フ ァ イ ルを指定す る には、 次の コ マ ン ド を実行 し ます。
add_files -tb
シ ミ ュ レーシ ョ ンはア ク テ ィ ブ ソ リ ュ ーシ ョ ンの下位デ ィ レ ク ト リ の sim/<HDL> で実行 さ れます。
説明 :
•
<HDL> は -rtl オプシ ョ ン で指定 さ れます。
cosim_design でデザ イ ン を検証す る には、 次を使用す る 必要があ り ます。
•
ap_ctrl_hs と い う イ ン タ ーフ ェ イ ス モー ド を使用す る 必要があ り ます。
•
次のいずれかの イ ン タ ーフ ェ イ ス モー ド を各出力ポー ト で使用する 必要があ り ます。
°
ap_vld
°
ap_ovld
°
ap_hs
°
ap_memory
°
ap_fifo
°
ap_bus
イ ン タ ーフ ェ イ ス モー ド は、 書 き 込み Valid 信号を使用 し ていつ出力が書 き 込まれ る か指定 し ます。
構文
cosim_design [OPTIONS]
オプ シ ョ ン
-O
C テ ス ト ベンチお よ び RTL ラ ッ パーの最適化コ ンパ イ ルを実行 し ます。
最適化を実行 し ない場合は、 cosim_design に よ り で き る かぎ り 短時間でテ ス ト ベンチが コ ンパ イ ル さ れます。
可能であれば、 コ ンパ イ ルに時間がかか っ て も 、 ラ ン タ イ ム パフ ォーマ ン ス を改善す る ために最適化を実行 し て く だ
さ い。 実行フ ァ イ ルの ラ ン タ イ ム速度が向上する 可能性はあ り ますが、 ラ ン タ イ ムが改善す る か ど う かはデザ イ ンに
よ っ て異な り ます。 ラ ン タ イ ム目的で最適化を行 う と 、 大型関数のために メ モ リ 使用量が多 く 必要 と な る 可能性があ
り ます。
-argv <string>
ビヘ イ ビ アー テ ス ト ベンチの引数 リ ス ト を指定 し ます。
<string> は メ イ ン C 関数に渡 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
344
cosim_design
-coverage
VCS シ ミ ュ レー タ ーを使用 し たシ ミ ュ レーシ ョ ン での範囲を指定 し ます。
-ignore_init <integer>
<integer> で指定 さ れ る 最初の ク ロ ッ ク サ イ ク ル数に対 し 、 比較チ ェ ッ ク を無効に し ます。
こ れは、 未知の値 ('hX) で RTL が開始す る タ イ ミ ン グ を確認する のに便利です。
-ldflags <string>
協調シ ミ ュ レーシ ョ ンのために リ ン カーに渡すオプシ ョ ン を指定 し ます。
通常は、 イ ン ク ルー ド パ ス情報お よ び C テ ス ト ベンチの ラ イ ブ ラ リ 情報を渡すのに使用 さ れます。
-mflags <string>
SystemC シ ミ ュ レーシ ョ ンのために コ ンパ イ ラ に渡すオプシ ョ ン を指定 し ます。
通常、 コ ンパ イ ルの速度を上げ る ために使用 さ れます。
-rtl (systemc|vhdl|verilog)
C テ ス ト ベンチでの検証に ど の RTL を使用する かを選択 し ます。
Verilog お よ び VHDL の場合は、 -tool オプシ ョ ン を使用 し てシ ミ ュ レー タ ーを指定す る 必要があ り ます。 デフ ォ ル
ト は systemc です。
-setup
ア ク テ ィ ブ ソ リ ュ ーシ ョ ンの sim/<HDL> デ ィ レ ク ト リ にシ ミ ュ レーシ ョ ン フ ァ イ ルがすべて作成 さ れますが、 シ
ミ ュ レーシ ョ ンは実行 さ れません。
-tool (vcs|questasim|riviera|isim|vivadosimulator|ncsim)
C テ ス ト ベンチを使用 し て RTL を協調シ ミ ュ レーシ ョ ンす る のに使用す る シ ミ ュ レー タ ーを指定 し ます。
SystemC の協調シ ミ ュ レーシ ョ ンにはツールを指定する 必要はあ り ません。Vivado HLS に含まれてい る SystemC カー
ネルが使用 さ れます。
-trace_level (none|all)
実行 さ れ る ト レース フ ァ イ ルの出力レベルを指定 し ます。
all を指定す る と 、 すべてのポー ト お よ び信号が ト レース フ ァ イ ルに保存 さ れます。 ト レース フ ァ イ ルは、 シ ミ ュ
レ ーシ ョ ン が実行 さ れ る と 、 現在の ソ リ ュ ーシ ョ ン の sim/<HDL> デ ィ レ ク ト リ にシ ミ ュ レ ー タ でサポー ト さ れ る
フ ォーマ ッ ト で保存 さ れます。 次に例を示 し ます。
•
SystemC では VCD フ ァ イ ルが作成 さ れ る
•
QuestaSim では WLF フ ァ イ ルが作成 さ れ る
•
Vivado Simulator では WDB お よ び WCFG フ ァ イ ルが作成 さ れ る
デフ ォ ル ト は none です。
プ ラ グマ
同等の pragma はあ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
345
cosim_design
例
例1
cosim_design
SystemC RTL を使用 し た検証が実行 さ れます。
例2
cosim_design -tool VCS -rtl verilog -coverage -trace_level all
Verilog RTL を検証す る ため VCS シ ミ ュ レー タ ーを使用 し 、 波形 ト レース フ ァ イ ルの保存を イ ネーブルに し ます。
例3
cosim_design -tool modelsim -rtl vhdl -argv "5 1"
ModelSim を使用 し て VHDL RTL を検証 し ます。値 5 お よ び 1 がテ ス ト ベンチ関数に渡 さ れ RTL 検証で使用 さ れます。
例4
cosim_design -O -setup
SystemC RTL 用に最適化 さ れた シ ミ ュ レーシ ョ ン モデルを作成 し ますが、 シ ミ ュ レーシ ョ ンは実行 さ れません。
シ ミ ュ レーシ ョ ン を実行す る には、 ア ク テ ィ ブ ソ リ ュ ーシ ョ ンの sim/systemc デ ィ レ ク ト リ で run.sh を実行 し
ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
346
csynth_design
csynth_design
説明
ア ク テ ィ ブ ソ リ ュ ーシ ョ ン用に
Vivado HLS デー タ ベース を合成 し ます。
こ の コ マ ン ド はア ク テ ィ ブ ソ リ ュ ーシ ョ ンの コ ン テ ン ツ でのみ実行で き ます。デー タ ベース にあ る エ ラ ボ レー ト さ れ
たデザ イ ンは、 設定 さ れてい る 制約に基づいて ス ケ ジ ュ ール さ れ RTL にマ ッ プ さ れます。
構文
csynth_design
プ ラ グマ
同等の pragma はあ り ません。
例
csynth_design
最上位デザ イ ンでVivado HLS の合成を実行 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
347
close_project
close_project
説明
現在のプ ロ ジ ェ ク ト を閉 じ ます。 現在プ ロ ジ ェ ク ト は
Vivado HLS セ ッ シ ョ ンでア ク テ ィ ブではな く な り ます。
close_project コ マ ン ド の特徴は次の と お り です。
•
プ ロ ジ ェ ク ト や ソ リ ュ ーシ ョ ン用の コ マ ン ド が入力で き な く な り ます。
•
必須ではあ り ません。 新 し いプ ロ ジ ェ ク ト が開かれ る と 、 現在のプ ロ ジ ェ ク ト を閉 じ ます。
構文
close_project
プ ラ グマ
同等の pragma はあ り ません。
例
close_project
•
現在のプ ロ ジ ェ ク ト を閉 じ ます。
•
すべての結果を保存 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
348
close_solution
close_solution
説明
現在の ソ リ ュ ーシ ョ ン を閉 じ ます。 現在 ソ リ ュ ーシ ョ ンは
Vivado HLS セ ッ シ ョ ンでア ク テ ィ ブではな く な り ます。
close_solution コ マ ン ド には次の特徴があ り ます。
•
ソ リ ュ ーシ ョ ン用の コ マ ン ド が入力で き な く な り ます。
•
必須ではあ り ません。 新 し い ソ リ ュ ーシ ョ ンが開かれ る と 、 現在の ソ リ ュ ーシ ョ ン を閉 じ ます。
構文
close_solution
プ ラ グマ
同等の pragma はあ り ません。
例
close_solution
•
現在のプ ロ ジ ェ ク ト を閉 じ ます。
•
すべての結果を保存 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
349
config_array_partition
config_array_partition
説明
ア レ イ のパーテ ィ シ ョ ンのデフ ォ ル ト 動作を指定 し ます。
構文
config_array_partition [OPTIONS]
オプ シ ョ ン
-auto_partition_threshold <int>
ア レ イ (定数指数のない も の も 含む) をパーテ ィ シ ョ ンす る ための し き い値を設定 し ます。
指定 さ れた し き い値 よ り も エ レ メ ン ト 数が少ないア レ イ は、 イ ン タ ーフ ェ イ スや コ ア仕様がア レ イ に適用 さ れていな
い限 り 、 個々のエ レ メ ン ト に自動的にパーテ ィ シ ョ ン さ れます。 デフ ォ ル ト は 4 です。
-auto_promotion_threshold <int>
定数 イ ンデ ッ ク ス を使用 し てア レ イ をパーテ ィ シ ョ ンす る ための し き い値を設定 し ます。
指定 さ れた し き い値 よ り も エ レ メ ン ト 数が少な く 、ま た定数 イ ンデ ッ ク ス を持つ ( イ ンデ ッ ク ス は変数ではない) ア レ
イ は、 個々のエ レ メ ン ト に自動的にパーテ ィ シ ョ ン さ れます。 デフ ォ ル ト は 64 です。
-exclude_extern_globals
スループ ッ ト に基づいた自動パーテ ィ シ ョ ンか ら 外部グ ロ ーバル ア レ イ を除外 し ます。
デフ ォ ル ト では、 -throughput_driven オプシ ョ ン が指定 さ れてい る と 、 外部グ ロ ーバル ア レ イ がパーテ ィ シ ョ
ン さ れます。 -throughput_driven も 選択 さ れていない と 、 こ のオプシ ョ ンは効果があ り ません。
-include_ports
I/O ア レ イ の自動パーテ ィ シ ョ ン を有効に し ます。
1 つのア レ イ I/O ポー ト が複数のポー ト にパーテ ィ シ ョ ン さ れ、 各ポー ト のサ イ ズは個々のア レ イ エ レ メ ン ト のサ イ
ズにな り ます。
-scalarize_all
デザ イ ンのすべてのア レ イ を個々のエ レ メ ン ト にパーテ ィ シ ョ ン し ます。
-throughput_driven
スループ ッ ト に基づいてア レ イ の自動パーテ ィ シ ョ ン を有効に し ます。
ア レ イ を個々のエ レ メ ン ト にパーテ ィ シ ョ ンす る こ と で指定の ス ループ ッ ト 要件を満たす こ と がで き る か ど う かは
Vivado HLS で判断 さ れます。
プ ラ グマ
同等の pragma はあ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
350
config_array_partition
例
例1
config_array_partition auto_partition_threshold 12 -exclude_extern_globals
エ レ メ ン ト 数が 12 未満のア レ イ (グ ロ ーバル ア レ イ を除 く ) をすべて個々のエ レ メ ン ト にパーテ ィ シ ョ ン し ます。
例2
config_array_partition -throughput_driven -include_ports
ス ループ ッ ト を 改善す る た め、 関数 イ ン タ ー フ ェ イ ス の ア レ イ を 含め、 ど の ア レ イ を パーテ ィ シ ョ ン す る かが
Vivado HLS で判断 さ れます。
例3
config_array_partition -scalarize_all
グ ロ ーバルア レ イ を含む、 デザ イ ンのすべてのア レ イ を個々のエ レ メ ン ト にパーテ ィ シ ョ ン し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
351
config_bind
config_bind
説明
マ イ ク ロ アーキ テ ク チ ャ バ イ ンデ ィ ン グのデフ ォ ル ト オプシ ョ ン を設定 し ます。
バ イ ンデ ィ ン グは、 加算、 乗算、 シ フ ト な ど の演算子が特定の RTL イ ン プ リ メ ン テーシ ョ ン にマ ッ プ さ れ る プ ロ セ
ス の こ と を指 し ます。 た と えば、 乗算 (mult) 演算は組み合わせ、 ま たはパ イ プ ラ イ ン RTL 乗算器 と し て イ ン プ リ メ
ン ト さ れます。
構文
config_bind [OPTIONS]
オプ シ ョ ン
-effort (low|medium|high)
ラ ン タ イ ム と 最適化の ト レー ド オ フ と 制御す る 最適化エ フ ォー ト レベルを設定 し ます。
•
デフ ォ ル ト は medium です。
•
low は、 最適化があ ま り 実行で き ない よ う な ケース、 た と えば、 すべての if-else 文の各分岐に相互排他的な
演算子があ り 、 演算子の共有がで き ない よ う な場合に ラ ン タ イ ム を向上 し ます。
•
high は、 ラ ン タ イ ムが長 く な り ますが、 通常結果を向上 さ せ る こ と がで き ます。
-min_op <string>
特定演算子の イ ン ス タ ン ス数を最小限に抑え る よ う にす る オプシ ョ ンです。 こ の よ う な演算子が複数 コ ー ド に含まれ
る 場合、 最 も 少ない数の RTL リ ソ ース ( コ ア) で演算子が共有 さ れ る よ う にな り ます。
次の演算子は引数 と し て指定で き ます。
•
add - 加算
•
sub - 減算
•
mul - 乗算
•
icmp - 整数比較
•
sdiv - 符号付 き 除算
•
udiv - 符号な し 除算
•
srem - 符号付 き 剰余
•
urem - 符号な し 剰余
•
lshr - 論理右シ フ ト
•
ashr - 四則演算右シ フ ト
•
shl - 左シ フ ト
プ ラ グマ
同等の pragma はあ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
352
config_bind
例
例1
config_bind -effort high
Vivado HLS に次が命令 さ れます。
•
バ イ ンデ ィ ン グ プ ロ セ ス でのエ フ ォー ト レベルを上げ る
•
演算子を イ ンプ リ メ ン ト す る ため、 さ ら に多 く のオプシ ョ ン を試す
•
よ り よ い リ ソ ース使用率でデザ イ ンが生成 さ れ る よ う にす る
例2
config_bind -min_op mul
乗算演算子の数を最小限に抑え る ので、 RTL の乗算器の数は最小にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
353
config_dataflow
config_dataflow
説明
•
デー タ フ ロ ー パ イ プ ラ イ ンのデフ ォ ル ト 動作を指定 し ます (set_directive_dataflow コ マ ン ド に よ り イ ン
プ リ メ ン ト さ れ る )。
•
デフ ォ ル ト のチ ャ ネル メ モ リ タ イ プお よ びその深 さ を指定す る こ と がで き ます。
構文
config_dataflow [OPTIONS]
オプ シ ョ ン
-default_channel (fifo|pingpong)
デー タ フ ロ ー パ イ プ ラ イ ン が 使用 さ れ て い る と き 、 関数間 ま た は ルー プ 間 の デー タ を バ ッ フ ァ ーす る の に、
pingpong 形式で コ ン フ ィ ギ ュ レ ーシ ョ ン さ れてい る RAM メ モ リ がデフ ォ ル ト で使用 さ れ ま す。 ス ト リ ー ミ ン グ
デー タ が使用 さ れてい る 場合 (デー タ の読み出 し お よ び書 き 込みがが常に逐次行われ る 場合) は、 FIFO メ モ リ のほ う
が効果的で、 デフ ォ ル ト の メ モ リ タ イ プ と し て選択する こ と がで き ます。
ヒ ン ト : FIFO ア ク セ ス を実行す る には、 set_directive_stream コ マ ン ド を使用 し て ア レ イ を ス ト リ ー ミ ン グに設定す る
必要があ り ます。
-fifo_depth <integer>
デフ ォ ル ト の FIFO の深 さ を指定 し ます。
こ のオプシ ョ ンは、 pingpong 形式の メ モ リ が使用 さ れてい る 場合は効果があ り ません。 チ ャ ネルで使用す る FIFO が
指定 さ れていない場合は、 最大出力ま たは入力 (いずれかの大 き いほ う ) のサ イ ズに設定 さ れます。 場合に よ っ ては、
こ の設定が控えめすぎ て必要以上に大 き な FIFO が作成 さ れ る 可能性があ り ます。 こ のオプシ ョ ンは FIFO のサ イ ズ
が必要以上に大 き い と わか っ てい る 場合に使用 し て く だ さ い。
注意 : こ のオプシ ョ ン を使用す る には、 注意が必要です。 間違っ て使用する と 、 デザ イ ンが正 し く 動作 し な く な る 可
能性があ り ます。
プ ラ グマ
同等の pragma はあ り ません。
例
例1
config_dataflow -default_channel
デフ ォ ル ト チ ャ ネルを pingpong 形式の メ モ リ か ら FIFO に変更 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
354
config_dataflow
例2
config_dataflow -default_channel fifo -fifo_depth 6
デフ ォ ル ト チ ャ ネルを pingpong 形式の メ モ リ か ら 幅が 6 の FIFO に変更 し ます。
注意 : エ レ メ ン ト 数が 6 よ り 多い FIFO がデザ イ ン イ ンプ リ メ ン テーシ ョ ンで必要な場合、 こ の設定では RTL 検証エ
ラ ーが発生 し ます。 ユーザーは こ のオプシ ョ ン を上書 き す る こ と がで き ますが、 使用にあ た っ ては注意が必要です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
355
config_interface
config_interface
説明
イ ン タ ーフ ェ イ ス合成中に各関数の RTL ポー ト の イ ン プ リ メ ン テーシ ョ ンに使用 さ れ る デフ ォ ル ト イ ン タ ーフ ェ イ
ス オプシ ョ ン を指定 し ます。
構文
config_interface [OPTIONS]
オプ シ ョ ン
-clock_enable
ク ロ ッ ク イ ネーブル ポー ト (ap_ce) をデザ イ ンに追加 し ます。
ク ロ ッ ク イ ネーブルがア ク テ ィ ブ Low の と き は、 すべての ク ロ ッ ク 操作が停止にな り 、 その後に続 く すべての操作
が無効にな り ます。
-expose_global
グ ロ ーバル変数が I/O ポー ト と し て使用で き る よ う にな り ます。
変数がグ ロ ーバル と し て作成 さ れていて も 、 すべての読み出 し お よ び書 き 込みア ク セ ス が ロ ーカルにな っ てい る 場
合、 リ ソ ース はデザ イ ン内に作成 さ れ、 RTL で I/O ポー ト が必要な く な り ます。
推奨 : グ ロ ーバル変数が外部 ソ ース にな る よ う にする 場合、ま たは RTL ブ ロ ッ ク 外のデス テ ィ ネーシ ョ ンにな る よ う
にす る 場合は、 こ のオプシ ョ ン を使用 し てポー ト を作成す る 必要があ り ます。
-trim_dangling_port
構造体に基づいた イ ン タ ーフ ェ イ ス のデフ ォ ル ト ビヘ イ ビ アーを上書き し ます。
デフ ォ ル ト では、 ブ ロ ッ ク イ ン タ ーフ ェ イ ス でパ ッ ク さ れていない構造体のすべての メ ンバーが、 デザ イ ン ブ ロ ッ
ク で使用 さ れ る か ど う かに関係な く 、 RTL ポー ト にな り ます。 こ のオプシ ョ ン をオンにす る と 、 生成 さ れ る ブ ロ ッ ク
で使用 さ れない イ ン タ ーフ ェ イ ス ポー ト すべてが削除 さ れます。
プ ラ グマ
同等の pragma はあ り ません。
例
config_interface -expose_global -clock_enable
•
グ ロ ーバル変数が I/O ポー ト と し て使用で き る よ う にな り ます。
•
ク ロ ッ ク イ ネーブル ポー ト を追加 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
356
config_rtl
config_rtl
説明
使用 さ れ る リ セ ッ ト の タ イ プ、ス テー ト マシ ンのエン コ ーデ ィ ン グ な ど、出力 RTL の さ ま ざ ま な属性を コ ン フ ィ ギ ュ
レーシ ョ ン し ます。 RTL でユーザー ID 情報を使用で き る よ う に も し ます。
デフ ォ ル ト では、 オプシ ョ ンは最上位デザ イ ン、 お よ びそのデザ イ ン内のすべての RTL ブ ロ ッ ク に適用 さ れます。 特
定の RTL モデルを オプシ ョ ン で指定で き ます。
構文
config_rtl [OPTIONS] <model_name>
説明 :
•
<model_name> は コ ン フ ィ ギ ュ レーシ ョ ンす る RTL モデル名です。
何 も 指定 さ れていない場合は、 最上位デザ イ ン (お よ びその下位ブ ロ ッ ク すべて) が対象にな り ます。
オプ シ ョ ン
-header <string>
<string> フ ァ イ ルの内容を コ メ ン ト と し てすべての出力 RTL お よ びシ ミ ュ レーシ ョ ン フ ァ イ ルの冒頭に挿入 し ます。
ヒ ン ト : こ のオプシ ョ ン を使用す る と 、 出力 RTL フ ァ イ ルにユーザー指定の ID 情報が含まれ る よ う にな り ます。
-prefix <string>
すべての RTL エン テ ィ テ ィ /モジ ュ ール名に追加す る 接頭辞を指定 し ます。
-reset (none|control|state|all)
C コ ー ド で初期化 さ れ る 変数は常に RTL で も (つま り ビ ッ ト ス ト リ ーム で も ) 同 じ 値に初期化 さ れ ます。 こ の初期化
はパ ワーオン時にのみ実行 さ れ、 デザ イ ンに リ セ ッ ト が適用 さ れた と き には繰 り 返 さ れません。
-reset オプシ ョ ン を使用 し て適用 さ れた設定に よ り 、 レ ジ ス タ お よ び メ モ リ の リ セ ッ ト 方法が決ま り ます。
•
none
デザ イ ンに リ セ ッ ト は追加 さ れません。
•
control (デフ ォ ル ト )
ス テー ト マシ ンに使用 さ れ る レ ジ ス タ や I/Oプ ロ ト コ ル信号を生成す る ために使用 さ れ る よ う な制御レ ジ ス タ を
リ セ ッ ト し ます。
•
state
C コ ー ド の ス タ テ ィ ッ ク 変数 ま たはグ ロ ーバル変数か ら 生成 さ れた レ ジ ス タ お よ び レ ジ ス タ / メ モ リ を リ セ ッ ト
に よ り 制御 し ます。 C コ ー ド で初期化 さ れ る ス タ テ ィ ッ ク 変数ま たはグ ロ ーバル変数は、 初期値に リ セ ッ ト し ま
す。
•
all
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
357
config_rtl
デザ イ ン内の レ ジ ス タ お よ び メ モ リ をすべて リ セ ッ ト し ます。 C コ ー ド で初期化 さ れ る ス タ テ ィ ッ ク 変数ま たは
グ ロ ーバル変数は、 初期値に リ セ ッ ト し ます。
-reset_async
すべての レ ジ ス タ で非同期 リ セ ッ ト が使用 さ れ る よ う にな り ます。
こ のオプシ ョ ンが指定 さ れていない場合は、 同期 リ セ ッ ト が使用 さ れます。
-reset_level (low|high)
リ セ ッ ト 信号の極性を ア ク テ ィ ブ Low ま たはア ク テ ィ ブ High にで き ます。
デフ ォ ル ト は high です。
-encoding (auto|bin|onehot|gray)
デザ イ ンの ス テー ト マシ ンで使用 さ れ る エン コ ーデ ィ ン グ形式を指定 し ます。
デフ ォ ル ト は auto です。
auto エン コ ーデ ィ ン グ を使用す る と 、Vivado HLS で コ ーデ ィ ン グ ス タ イ ルが決定 さ れますが、ザ イ リ ン ク ス の ロ ジ ッ
ク 合成ツール (Vivado お よ び ISE) で ロ ジ ッ ク 合成中に FSM ス タ イ ルを抽出 し て再 イ ンプ リ メ ン ト す る こ と がで き ま
す。 それ以外のエン コ ーデ ィ ン グ ス タ イ ル (bin ま たは onehot) を選択 し た場合は、 エン コ ーデ ィ ン グ ス タ イ ルはザ イ
リ ン ク ス ロ ジ ッ ク 合成ツールでは最適化 し 直す こ と がで き ません。
プ ラ グマ
同等の pragma はあ り ません。
例
例1
config_rtl -reset all -reset_async -reset_level low
非同期の ア ク テ ィ ブ Low リ セ ッ ト 信号を使用 し てすべての レ ジ ス タ が リ セ ッ ト さ れ る よ う に出力 RTL を コ ン フ ィ
ギ ュ レーシ ョ ン し ます。
例2
config_rtl -header my_mesage.txt
my_message.txt フ ァ イ ルの内容を コ メ ン ト と し てすべての RTL 出力フ ァ イ ルに追加 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
358
config_schedule
config_schedule
説明
Vivado HLS で実行 さ れ る ス ケ ジ ュ ー リ ン グのデフ ォ ル ト タ イ プ を コ ン フ ィ ギ ュ レーシ ョ ン し ます。
構文
config_schedule [OPTIONS]
オプ シ ョ ン
-effort (high|medium|low)
ス ケ ジ ュ ー リ ン グ中に使用す る エ フ ォー ト を指定 し ます。
•
デフ ォ ル ト は medium です。
•
low は、 ラ ン タ イ ム を改善 し ます。 デザ イ ン イ ンプ リ メ ン テーシ ョ ンに改善の余地があ ま り ないケース で指定
す る と メ リ ッ ト があ る こ と があ り ます。
•
high は、 ラ ン タ イ ムが長 く な り ますが、 通常結果を向上 さ せ る こ と がで き ます。
-verbose
ス ケ ジ ュ ー リ ン グで指示子や制約を満たす こ と がで き ない と き の ク リ テ ィ カル パス を出力 し ます。
プ ラ グマ
同等の pragma はあ り ません。
例
config_schedule -effort low
ラ ン タ イ ム を短縮 さ せ る ためデフ ォ ル ト の ス ケ ジ ュ ール エ フ ォー ト を low に変更 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
359
create_clock
create_clock
説明
現在の ソ リ ュ ーシ ョ ンの仮想 ク ロ ッ ク を作成 し ます。
こ の コ マ ン ド はア ク テ ィ ブ ソ リ ュ ーシ ョ ンの コ ン テ ン ツ でのみ実行 さ れます。 その ク ロ ッ ク 周期は自動最適化 (指定
ク ロ ッ ク 周期で可能な限 り の数の演算をチ ェーン接続) を駆動する 制約です。
C お よ び C++ デザ イ ンでは、 ク ロ ッ ク 1 つのみがサポー ト さ れます。 SystemC デザ イ ンの場合は、 複数の指定 ク ロ ッ
ク を作成 し 、 set_directive_clock コ マ ン ド を使用 し て異な る SC_MODULE に適用で き ます。
構文
create_clock -period <number> [OPTIONS]
オプ シ ョ ン
-name <string>
ク ロ ッ ク 名を指定 し ます。
名前が指定 さ れていない場合は、 デフ ォ ル ト 名が使用 さ れます。
-period <number>
ナ ノ 秒 (ns) ま たは MHz で ク ロ ッ ク 周期を指定 し ます。
•
単位が指定 さ れていない場合は、 デフ ォ ル ト で ns が使用 さ れます。
•
周期が指定 さ れていない場合は、 デフ ォ ル ト で 10ns の周期が使用 さ れます。
プ ラ グマ
同等の pragma はあ り ません。
例
例1
create_clock -period 50
50ns の ク ロ ッ ク 周期を指定 し ます。
例2
create_clock
デフ ォ ル ト 周期 10ns を使用 し て ク ロ ッ ク を指定 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
360
create_clock
例3
create_clock -period 15 fast_clk
create_clock -period 60 slow_clk
SystemC デザ イ ンの場合は、複数の指定 ク ロ ッ ク を作成する こ と がで き ます (set_directive_clock コ マ ン ド を使
用)。
例4
create_clock -period 100MHz
ク ロ ッ ク 周波数を MHz で指定 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
361
csim_design
csim_design
説明
指定 し た C テ ス ト ベンチを使用 し て合成前の C シ ミ ュ レーシ ョ ン を コ ンパ イ ル し て実行 し ます。
テ ス ト ベンチ用の フ ァ イ ルを指定す る には、 add_file -tb を使用 し ます。 シ ミ ュ レーシ ョ ンの作業デ ィ レ ク ト リ
は、 ア ク テ ィ ブ ソ リ ュ ーシ ョ ン内の csim です。
構文
csim_design [OPTIONS]
オプ シ ョ ン
-O
コ ンパ イ ルの最適化を イ ネーブルに し ます。
デフ ォ ル ト では、 デバ ッ グ を イ ネーブルにす る ために コ ンパ イ ルがデバ ッ グ モー ド で実行 さ れます。
-argv <string>
C テ ス ト ベンチの引数 リ ス ト を指定 し ます。
<string> は C テ ス ト ベンチの <main> 関数に渡 さ れます。
-clean
ク リ ーン ビル ド を イ ネーブルに し ます。
こ のオプシ ョ ンがない と 、 csim_design は イ ン ク リ メ ン タ ルに コ ンパ イ ル し ます。
-ldflags <string>
C シ ミ ュ レーシ ョ ンのために リ ン カーに渡すオプシ ョ ン を指定 し ます。
通常は、 C テ ス ト ベンチお よ びデザ イ ンの ラ イ ブ ラ リ 情報を渡すのに使用 さ れます。
-mflags <string>
C シ ミ ュ レーシ ョ ンのために コ ンパ イ ラ に渡すオプシ ョ ン を指定 し ます。
通常、 コ ンパ イ ルの速度を上げ る ために使用 さ れます。
-setup
ア ク テ ィ ブ ソ リ ュ ーシ ョ ンの csim デ ィ レ ク ト リ に C シ ミ ュ レーシ ョ ン バ イ ナ リ が作成 さ れますが、シ ミ ュ レーシ ョ
ンは実行 さ れません。
プ ラ グマ
同等の pragma はあ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
362
csim_design
例
例1
csim_design
C シ ミ ュ レーシ ョ ン を コ ンパ イ ル し て実行 し ます。
例2
csim_design -O -setup
ソ ース デザ イ ン と テ ス ト ベンチを コ ンパ イ ル し 、 シ ミ ュ レーシ ョ ン バ イ ナ リ を生成 し ますが、 バ イ ナ リ は実行 し ま
せん。
シ ミ ュ レーシ ョ ン を実行す る には、 ア ク テ ィ ブ ソ リ ュ ーシ ョ ンの csim/build デ ィ レ ク ト リ で run.sh を実行 し
ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
363
delete_project
delete_project
構文
delete_project <project>
説明 :
•
<project> はプ ロ ジ ェ ク ト 名です。
説明
プ ロ ジ ェ ク ト に関連付け ら れてい る デ ィ レ ク ト リ を削除 し ます。
delete_project コ マ ン ド では、 削除前に、 該当す る プ ロ ジ ェ ク ト デ ィ レ ク ト リ <project> が有効なVivado HLS プ
ロ ジ ェ ク ト であ る か ど う かチ ェ ッ ク さ れ ます。 現在の作業デ ィ レ ク ト リ にデ ィ レ ク ト リ <project> が存在 し ない場合
は、 こ の コ マ ン ド は効果があ り ません。
プ ラ グマ
同等の pragma はあ り ません。
例
delete_project Project_1
Project_1 を削除 し ます。 ./Project_1 デ ィ レ ク ト リ お よ びそれに含まれ る も のをすべて削除 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
364
delete_solution
delete_solution
構文
delete_solution <solution>
説明 :
•
<solution> は削除す る ソ リ ュ ーシ ョ ンです。
説明
ア ク テ ィ ブ プ ロ ジ ェ ク ト か ら ソ リ ュ ーシ ョ ン を削除 し 、 プ ロ ジ ェ ク ト デ ィ レ ク ト リ か ら <solution> 下位デ ィ レ ク ト
リ を削除 し ます。
プ ロ ジ ェ ク ト デ ィ レ ク ト リ に ソ リ ュ ーシ ョ ンが存在 し ない場合は、 こ の コ マ ン ド は効果があ り ません。
プ ラ グマ
同等の pragma はあ り ません。
例
delete_solution Solution_1
ア ク テ ィ ブ プ ロ ジ ェ ク ト か ら Solution_1 と い う ソ リ ュ ーシ ョ ン を削除 し 、 ア ク テ ィ ブ プ ロ ジ ェ ク ト か ら 下位デ ィ
レ ク ト リ の Solution_1 を削除 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
365
export_design
export_design
説明
ダ ウ ン ス ト リ ーム ツール用に RTL の合成済みデザ イ ン をエ ク ス ポー ト し て IP と し てパ ッ ケージに し ます。
サポー ト さ れ る IP フ ォーマ ッ ト は次の と お り です。
•
IP カ タ ロ グ
•
Pcore
•
System Generator
パ ッ ケージ さ れたデザ イ ンは、次の下位デ ィ レ ク ト リ のいずれかのア ク テ ィ ブ ソ リ ュ ーシ ョ ンの impl デ ィ レ ク ト リ
に保存 さ れます。
•
pcore
•
ip
•
sysgen
構文
export_design [OPTIONS]
オプ シ ョ ン
-description <string>
生成 し た IP カ タ ロ グ IP の詳細が提供 さ れます。
-evaluate (verilog|vhdl)
フ ォーマ ッ ト に よ っ て、 ISE ま たは Vivado を使用 し 、 指定 し た HDL の さ ら に正確な タ イ ミ ン グ と 使用量デー タ を取
得 し ます。
•
エ ク ス ポー ト フ ォーマ ッ ト が pcore の場合は ISE が使用 さ れます。
•
エ ク ス ポー ト フ ォーマ ッ ト が pcore 以外の場合は Vivado が使用 さ れます。
-format (pcore|sysgen|sysgen_ise|ipxact)
IP をパ ッ ケージす る フ ォーマ ッ ト を指定 し ます。
サポー ト さ れ る フ ォーマ ッ ト は、 次の と お り です。
•
pcore
EDK pcore (6 シ リ ーズお よ びそれ以前のデバ イ ス のデフ ォ ル ト )
•
ipxact
IP カ タ ロ グ (7 シ リ ーズ FPGA デバ イ ス のデフ ォ ル ト )
•
sysgen
Vivado Design Suit の System Generator for DSP で使用で き る フ ォーマ ッ ト (7 シ リ ーズ FPGA デバ イ ス のみ)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
366
export_design
•
sysgen_ise
ISE の System Generator for DSP で使用で き る フ ォーマ ッ ト (すべてのデバ イ ス)
ヒ ン ト : フ ォーマ ッ ト が指定 さ れない場合、 タ ーゲ ッ ト デバ イ ス が 7 シ リ ーズお よ びそれ以降の場合 iipxact が、そ
れ以外の場合は pcore が使用 さ れます。
-library <string>
生成す る IP カ タ ロ グ IP の ラ イ ブ ラ リ 名を指定 し ます。
-use_netlist ( none | ip | top )
RTL の代わ り に生成 さ れ る ネ ッ ト リ ス ト (.ngc フ ァ イ ル) を指定 し ます。 pcore に対 し てのみ使用で き ます。
•
none
デザ イ ンのネ ッ ト リ ス ト は生成 さ れません。
•
ip
ザ イ リ ン ク ス IP があ る 場合はそのネ ッ ト リ ス ト を生成 し ます。
•
top
最上位デザ イ ンのネ ッ ト リ ス ト を生成 し ます。
-vendor <string>
生成す る IP カ タ ロ グ IP のベン ダー文字列を指定 し ます。
-version <string>
生成す る IP カ タ ロ グ ま たは pcore IP のバージ ョ ン文字列を指定 し ます。
pragma
同等の pragma はあ り ません。
例
例1
export_design -format sysgen
System Generator 用に RTL を エ ク ス ポー ト し ます。
例2
export_design -format pcore
EDK の pcore 用に RTL をエ ク ス ポー ト し ます。
例3
export_design -evaluate vhdl -format ipxact
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
367
export_design
•
IP カ タ ロ グ用に RTL をエ ク ス ポー ト し ます。
•
VHDL を評価 し て、 Vivado を使用 し て よ り 良い タ イ ミ ン グお よ び使用量デー タ を取得 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
368
help
help
説明
•
<cmd> に何 も 指定 し ない場合、 Vivado HLS Tcl コ マ ン ド をすべて リ ス ト し ます。
•
Vivado HLS Tcl コ マ ン ド を引数 と し て指定する と 、 その特定コ マ ン ド の情報が表示 さ れます。
コ マ ン ド 引数を入力す る と き タ ブ キーを押す と 、 自動的に有効なVivado HLS コ マ ン ド が入力 さ れます。
構文
help [OPTIONS] <cmd>
説明 :
•
<cmd> はヘルプ を表示す る コ マ ン ド です。
オプ シ ョ ン
各コ マン ド
プ ラ グマ
同等の pragma はあ り ません。
例
例1
help
すべての コ マ ン ド お よ び指示子に対す る ヘルプ を表示 し ます。
例2
help add_files
add_files コ マ ン ド のヘルプ を表示 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
369
list_core
list_core
説明
現在 イ ン ス ト ール さ れてい る ラ イ ブ ラ リ にあ る コ ア をすべて リ ス ト し ます。
コ アは、 出力 RTL に加算、 乗算、 メ モ リ な ど の演算を イ ンプ リ メ ン ト す る ために使用す る コ ン ポーネ ン ト です。
エ ラ ボ レーシ ョ ンの後、 RTL の演算は内部デー タ ベース に演算子 と し て表示 さ れます。 ス ケ ジ ュ ー リ ン グ中、 RTL デ
ザ イ ン を イ ンプ リ メ ン ト す る ため、 演算子は ラ イ ブ ラ リ の コ アにマ ッ プ さ れます。 複数の演算子を 1 つの コ アの同 じ
イ ン ス タ ン ス にマ ッ プ し 、 同 じ RTL リ ソ ース を共有す る こ と も 可能です。
次の関連オプシ ョ ン を使用 し て、 list_core コ マ ン ド では使用可能な演算子お よ び コ ア を」 リ ス ト す る こ と がで き
ます。
•
operation
各演算を イ ンプ リ メ ン ト す る ために、 ラ イ ブ ラ リ で使用可能な コ ア を表示 し ます。
•
type
使用可能な コ ア を タ イ プ別に表示 し ます。 た と えば、 論理演算を イ ンプ リ メ ン ト す る タ イ プ、 メ モ リ ま たは ス ト
レージ を イ ンプ リ メ ン ト す る タ イ プな ど です。
オプシ ョ ンが指定 さ れていない場合は、 ラ イ ブ ラ リ の コ アがすべて表示 さ れます。
ヒ ン ト : list_core コ マ ン ド と set_directive_resource を使用 し て表示 さ れ る 情報は、 特定の演算を特定の
コ アに イ ンプ リ メ ン ト す る ために使用 し ます。
構文
list_core [OPTIONS]
オプ シ ョ ン
-operation (opers)
ラ イ ブ ラ リ にあ る 、 指定 さ れてい る 演算を イ ンプ リ メ ン ト す る こ と がで き る コ ア を リ ス ト し ます。 演算は、 次の と お
り です。
•
add - 加算
•
sub - 減算
•
mul - 乗算
•
udiv - 符号な し 除算
•
urem - 符号な し 剰余
•
srem - 符号付 き 剰余
•
icmp - 整数比較
•
shl - 左シ フ ト
•
lshr - 論理右シ フ ト
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
370
list_core
•
ashr - 四則演算右シ フ ト
•
mux - マルチプ レ ク サー
•
load - メ モ リ 読み出 し
•
store - メ モ リ 書 き 込み
•
fiforead - FIFO 読み出 し
•
fifowrite - FIFO 書 き 込み
•
fifonbread - 非ブ ロ ッ キ ン グ FIFO 読み出 し
•
fifonbwrite - 非ブ ロ ッ キ ン グ FIFO 書 き 込み
-type (functional_unit|storage|connector|interface|ip_block)
指定 し た タ イ プの コ アのみを リ ス ト し ます。
•
functional_unit
標準 RTL 演算 (加算、 乗算、 比較な ど) を イ ンプ リ メ ン ト す る コ ア
•
storage
レ ジ ス タ や メ モ リ な ど の ス ト レージ エ レ メ ン ト を イ ンプ リ メ ン ト す る コ ア
•
connector
直接接続やス ト リ ー ミ ン グ ス ト レージ エ レ メ ン ト を含む、 デザ イ ン内の コ ネ ク テ ィ ビ テ ィ を イ ン プ リ メ ン ト す
る コア
•
adapter
IP 生成時に最上位デザ イ ン を接続す る ために使用す る イ ン タ ーフ ェ イ ス を イ ンプ リ メ ン ト す る コ ア。 こ れ ら の イ
ン タ ーフ ェ イ ス は IP 生成フ ロ ー (ザ イ リ ン ク ス EDK) で使用 さ れ る RTL ラ ッ パーに イ ンプ リ メ ン ト さ れます。
•
ip_block
ユーザーが追加 し た IP コ ア
プ ラ グマ
同等の pragma はあ り ません。
例
例1
list_core -operation add
現在 イ ン ス ト ール さ れてい る ラ イ ブ ラ リ にあ る コ アの中で、add 演算を イ ンプ リ メ ン ト す る こ と がで き る コ ア をすべ
て リ ス ト し ます。
例2
list_core -type storage
ラ イ ブ ラ リ にあ る 使用可能な メ モ リ (ス ト レージ) コ ア をすべて リ ス ト し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
371
list_core
ヒ ン ト : 使用可能な メ モ リ の 1 つを使用 し て ア レ イ を イ ンプ リ メ ン ト す る には、set_directive_resource コ マ ン ド を使用
し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
372
list_part
list_part
説明
•
フ ァ ミ リ が指定 さ れ る 場合は、 そのサポー ト デバ イ ス フ ァ ミ リ 、 ま たはその フ ァ ミ リ でサポー ト さ れ る パーツ
を表示 し ます。
•
フ ァ ミ リ が指定 さ れていない場合は、 すべてのサポー ト さ れ る フ ァ ミ リ を リ ス ト し ます。
ヒ ン ト : コ マ ン ド にオプシ ョ ン を指定 し ない と き に表示 さ れ る サポー ト フ ァ ミ リ の中か ら 1 つ選択 し 、 それを オプ
シ ョ ンに指定す る と 、 その フ ァ ミ リ のサポー ト パーツ が リ ス ト さ れます。
構文
list_part [OPTIONS]
プ ラ グマ
同等の pragma はあ り ません。
例
例1
list_part
すべてのサポー ト さ れ る フ ァ ミ リ を リ ス ト し ます。
例2
list_part virtex6
サポー ト さ れ る Virtex-6 パーツ をすべて リ ス ト し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
373
open_project
open_project
説明
既存プ ロ ジ ェ ク ト を開 く か、 ま たは新規プ ロ ジ ェ ク ト を作成 し ます。
Vivado HLS の 1 セ ッ シ ョ ン でア ク テ ィ ブにな る プ ロ ジ ェ ク ト は 1 つだけです。 1 プ ロ ジ ェ ク ト には複数の ソ リ ュ ー
シ ョ ン を含め る こ と がで き ます。
プ ロ ジ ェ ク ト を閉 じ る には、 次のいずれかの手順に従い ます。
•
close_project コ マ ン ド を使用 し ます。
•
open_project コ マ ン ド で別のプ ロ ジ ェ ク ト を開始 し ます。
delete_project コ マ ン ド を使用 し て、 プ ロ ジ ェ ク ト デ ィ レ ク ト リ お よ びそれに関連付け ら れてい る ソ リ ュ ーシ ョ
ン をすべて完全にデ ィ ス ク か ら 削除 し ます。
構文
open_project [OPTIONS] <project>
説明 :
•
<project> はプ ロ ジ ェ ク ト 名です。
オプ シ ョ ン
-reset
•
既存のプ ロ ジ ェ ク ト デー タ を削除 し てプ ロ ジ ェ ク ト を リ セ ッ ト し ます。
•
デザ イ ン ソ ース フ ァ イ ル、 ヘ ッ ダー フ ァ イ ルの検索パ ス、 最上位関数に関す る プ ロ ジ ェ ク ト 情報を削除 し ます。
関連 ソ リ ュ ーシ ョ ン デ ィ レ ク ト リ お よ びフ ァ イ ルは保持 さ れますが、結果は無効にな っ て し ま っ てい る 可能性が
あ り ます。
注記 : delete_project コ マ ン ド で も -reset オプシ ョ ン と 同 じ 効果があ り 、 すべての ソ リ ュ ーシ ョ ン デー タ を削
除で き ます。
推奨 : こ のオプシ ョ ンは、 Tcl ス ク リ プ ト を使用 し てVivado HLS を実行 し てい る と き に使用 し て く だ さ い。 それ以外
の場合は、 add_files コ マ ン ド が新 し く 実行 さ れ る たびに追加フ ァ イ ルが既存デー タ に追加 さ れます。
プ ラ グマ
同等の pragma はあ り ません。
例
例1
open_project Project_1
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
374
open_project
Project_1 と い う 名前の新規ま たは既存プ ロ ジ ェ ク ト を開き ます。
例2
open_project -reset Project_2
プ ロ ジ ェ ク ト を開いて、 既存デー タ をすべて削除 し ます。
推奨 : Tcl ス ク リ プ ト で こ の方法を使用す る と 、 既存プ ロ ジ ェ ク ト デー タ に ソ ース ま たは ラ イ ブ ラ リ フ ァ イ ルが追加
さ れない よ う にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
375
open_solution
open_solution
説明
ア ク テ ィ ブ プ ロ ジ ェ ク ト で既存の ソ リ ュ ーシ ョ ン を開いた り 、 新規 ソ リ ュ ーシ ョ ン を作成 し ます。
注意 : ア ク テ ィ ブ プ ロ ジ ェ ク ト がない と き に ソ リ ュ ーシ ョ ン を開いた り 作成 し よ う と す る と 、 エ ラ ーが発生 し ます。
Vivado HLS の 1 セ ッ シ ョ ンでア ク テ ィ ブな ソ リ ュ ーシ ョ ンは 1 つだけです。
現在のプ ロ ジ ェ ク ト デ ィ レ ク ト リ の下に各 ソ リ ュ ーシ ョ ン の下位デ ィ レ ク ト リ があ り 管理 さ れてい ます。 ソ リ ュ ー
シ ョ ンが現在の作業デ ィ レ ク ト リ に存在 し ない場合は、 新 し い ソ リ ュ ーシ ョ ンが作成 さ れます。
ソ リ ュ ーシ ョ ン を閉 じ る には、 次のいずれかの手順に従い ます。
•
close_solution コ マ ン ド を実行 し ます。
•
open_solution コ マ ン ド で別の ソ リ ュ ーシ ョ ン を開 き ます。
delete_solution コ マ ン ド を使用す る と 、 プ ロ ジ ェ ク ト か ら ソ リ ュ ーシ ョ ンが削除 さ れ、 該当す る 下位デ ィ レ ク ト
リ も 削除 さ れます。
構文
open_solution [OPTIONS] <solution>
説明 :
•
<solution> は ソ リ ュ ーシ ョ ン名です。
オプ シ ョ ン
-reset
•
ソ リ ュ ーシ ョ ンが既に存在す る 場合は、 ソ リ ュ ーシ ョ ン デー タ が リ セ ッ ト さ れます。 ラ イ ブ ラ リ 、 制約、 お よ び
指示子に関す る 前の ソ リ ュ ーシ ョ ン情報は削除 さ れます。
•
合成、 検証、 イ ンプ リ メ ン テーシ ョ ンの結果 も 削除 さ れます。
プ ラ グマ
同等の pragma はあ り ません。
例
例1
open_solution Solution_1
ア ク テ ィ ブ プ ロ ジ ェ ク ト に、 Solution_1 と い う 名前の新規 ソ リ ュ ーシ ョ ン ま たは既存の ソ リ ュ ーシ ョ ン を開 き ま
す。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
376
open_solution
例2
open_solution -reset Solution_2
•
ア ク テ ィ ブ プ ロ ジ ェ ク ト で ソ リ ュ ーシ ョ ン を開 き ます。
•
既存デー タ を削除 し ます。
推奨 : Tcl ス ク リ プ ト で こ の方法を使用す る と 、 既存 ソ リ ュ ーシ ョ ン デー タ に追加が さ れない よ う にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
377
set_clock_uncertainty
set_clock_uncertainty
説明
create_clock で定義 さ れてい る ク ロ ッ ク 周期のマージ ン を設定 し ます。
マージ ンは、 実質の ク ロ ッ ク 周期を作成する ため ク ロ ッ ク 周期か ら 差 し 引かれます。 ク ロ ッ ク のば ら つ き が定義 さ れ
ていない場合は、 デフ ォ ル ト で ク ロ ッ ク 周期の 12.5% と な り ます。
Vivado HLS では、 有効な ク ロ ッ ク 周期に基づいてデザ イ ンが最適化 さ れ、 ダ ウ ン ス ト リ ーム ツールにマージ ンが提
供 さ れ、 ロ ジ ッ ク 合成お よ び配線で考慮 さ れます。 こ の コ マ ン ド はア ク テ ィ ブ ソ リ ュ ーシ ョ ンの コ ン テ ン ツ でのみ実
行 さ れます。Vivado HLS ではすべての出力フ ァ イ ルで指定 さ れた ク ロ ッ ク 周期が使用 さ れ、検証お よ び イ ンプ リ メ ン
テーシ ョ ンで使用 さ れます。
create_clock コ マ ン ド で複数の ク ロ ッ ク が指定 さ れてい る SystemC デザ イ ンの場合、 各 ク ロ ッ ク を指定す る こ と
で、 ク ロ ッ ク ご と に異な る ば ら つ き を指定す る こ と がで き ます。
構文
set_clock_uncertainty <uncertainty> <clock_list>
説明 :
•
<uncertainty> は、 ク ロ ッ ク のば ら つ き ま たはマージ ン と し て使用 さ れ る ク ロ ッ ク 周期を表す値で、 単位はナ ノ 秒
(ns) です。
•
<clock_list> は、 ク ロ ッ ク ド メ イ ンの リ ス ト です。
プ ラ グマ
同等の pragma はあ り ません。
例
例1
set_clock_uncertainty 0.5
ク ロ ッ ク のば ら つ き ま たはマージ ン を 0.5ns に指定 し ます。
こ れに よ り 、 Vivado HLS で使用可能な ク ロ ッ ク 周期が 0.5ns 削減 さ れます。
例2
create_clock -period 15 fast_clk
create_clock -period 60 slow_clk
set_clock_uncertainty 0.5 fast_clock
set_clock_uncertainty 1.5 slow_clock
こ の SystemC の例では、 ク ロ ッ ク ド メ イ ン を 2 つ作成 し 、 ド メ イ ン ご と に異な る ク ロ ッ ク のば ら つ き を指定 し てい
ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
378
set_clock_uncertainty
ヒ ン ト : SystemC デザ イ ン で は マ ルチ ク ロ ッ ク が サ ポ ー ト さ れ て い ま す。 ク ロ ッ ク を 該当関数に適用す る に は
set_directive_clock コ マ ン ド を使用 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
379
set_directive_allocation
set_directive_allocation
説明
リ ソ ース割 り 当てのための イ ン ス タ ン ス制限を指定 し ます。
特定の関数ま たは演算を イ ン プ リ メ ン ト す る のに使用 さ れ る RTL イ ン ス タ ン ス の数を定義 ま たは制限 し ます。 た と
えば、 foo_sub と い う 関数の イ ン ス タ ン ス が 4 つ C ソ ース コ ー ド にあ る 場合、 set_directive_allocation コ
マ ン ド を使用す る と 、 最終 RTL では foo_sub の イ ン ス タ ン ス を 1 つだけにす る こ と がで き ます。 同 じ RTL ブ ロ ッ
ク を使用 し て、 4 つすべての イ ン ス タ ン ス が イ ンプ リ メ ン ト さ れます
構文
set_directive_allocation [OPTIONS] <location> <instances>
説明 :
•
<location> は function[/label] の フ ォーマ ッ ト の ロ ケーシ ョ ン文字列です。
•
<instances> は関数ま たは演算子です。
関数には、 次が実行 さ れていない元の C コ ー ド のいずれかの関数を指定で き ます。
•
set_directive_inline コ マ ン ド に よ る イ ン ラ イ ン化
•
Vivado HLS に よ る 自動的な イ ン ラ イ ン化
演算子の リ ス ト は次の と お り です (C ソ ース コ ー ド に演算の イ ン ス タ ン ス があ る 場合)。
•
add - 加算
•
sub - 減算
•
mul - 乗算
•
icmp - 整数比較
•
sdiv - 符号付 き 除算
•
udiv - 符号な し 除算
•
srem - 符号付 き 剰余
•
urem - 符号な し 剰余
•
lshr - 論理右シ フ ト
•
ashr - 四則演算右シ フ ト
•
shl - 左シ フ ト
オプ シ ョ ン
-limit <integer>
RTL デザ イ ン で使用す る イ ン ス タ ン ス (-type オプシ ョ ン で指定 さ れてい る タ イ プの イ ン ス タ ン ス) の最大数を設定
し ます。
-type (function|operation)
イ ン ス タ ン ス タ イ プには、 function (デフ ォ ル ト ) ま たは operation を指定で き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
380
set_directive_allocation
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS allocation \
instances=<Instance Name List> \
limit=<Integer Value> \
<operation, function>
例
例1
set_directive_allocation -limit 2 -type function foo_top foo
#pragma HLS allocation instances=foo limit=2 function
デザ イ ン foo_top には、 関数 foo の イ ン ス タ ン ス を が複数含ま れ、 RTL での foo の イ ン ス タ ン ス数を 2 に制限 し
てい ます。
例2
set_directive_allocation -limit 1 -type operation My_func mul
#pragma HLS allocation instances=mul limit=1 operation
My_func の イ ンプ リ メ ン テーシ ョ ンで使用 さ れ る 乗算器の数を 1 に制限 し ます。
こ の制限は、 My_func の下位関数にあ る 乗算器には適用 さ れ ません。 下位関数に イ ン プ リ メ ン テーシ ョ ン で使用 さ
れ る 乗算器の数を制限す る には、 その下位関数に割 り 当て指示子を指定す る か、 下位関数を My_func に埋め込みま
す。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
381
set_directive_array_map
set_directive_array_map
説明
小型ア レ イ を大型ア レ イ にマ ッ プ し ます。
通常は、 set_directive_array_map コ マ ン ド を使用 し て、 複数の小型ア レ イ を 1 つの大型ア レ イ にマ ッ プ し ま
す。 こ の大型ア レ イ は、 こ の後単一の メ モ リ (RAM ま たは FIFO) リ ソ ース に使用で き ます。
-mode オプシ ョ ンは、 新 し い タ ーゲ ッ ト が次の ど ち ら の連結なのか を決定す る ために使用 し ます。
•
エ レ メ ン ト (水平マ ッ ピ ン グ)
•
ビ ッ ト 幅 (垂直マ ッ ピ ン グ)
ア レ イ は set_directive_array_map コ マ ン ド が出力 さ れた順番で連結 さ れ、 次か ら 開始 さ れます。
•
水平マ ッ ピ ン グの場合は タ ーゲ ッ ト エ レ メ ン ト 0
•
垂直マ ッ ピ ン グの場合はビ ッ ト 0
構文
set_directive_array_map [OPTIONS] <location> <array>
説明 :
•
<location> はア レ イ 変数を含む ロ ケーシ ョ ン (function[/label] の フ ォーマ ッ ト ) です。
•
<variable> は新 し い タ ーゲ ッ ト ア レ イ イ ン ス タ ン ス にマ ッ プする ア レ イ 変数名です。
オプ シ ョ ン
-instance <string>
現在のア レ イ 変数がマ ッ プ さ れ る 新 し いア レ イ イ ン ス タ ン ス名を指定 し ます。
-mode (horizontal|vertical)
•
水平マ ッ ピ ン グ (holizontal) (デフ ォ ル ト ) では タ ーゲ ッ ト に さ ら に多 く のエ レ メ ン ト が含まれ る よ う にア レ イ が
連結 さ れます。
•
垂直マ ッ ピ ン グ (vertical) では タ ーゲ ッ ト の ワー ド 数が大 き く な る よ う にア レ イ が連結 さ れます。
-offset <integer>
重要 : 水平マ ッ ピ ン グ専用のオプシ ョ ンです。
現在のマ ッ プ操作用に、タ ーゲ ッ ト イ ン ス タ ン ス での絶対オ フ セ ッ ト を示す整数値を指定 し ます。次に例を示 し ます。
•
ア レ イ 変数のエ レ メ ン ト 0 は、 新 し い タ ーゲ ッ ト のエ レ メ ン ト <int> にマ ッ プ さ れます。
•
ほかのエ レ メ ン ト は新 し い タ ーゲ ッ ト の <int+1>、 <int+2> にマ ッ プ さ れます
値が指定 さ れていない場合は、 重複を避け る ため、 Vivado HLS で必要なオ フ セ ッ ト が自動的に計算 さ れます。 た と え
ば、 タ ーゲ ッ ト の次の未使用エ レ メ ン ト か ら ア レ イ の連結が開始 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
382
set_directive_array_map
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS array_map \
variable=<variable> \
instance=<instance> \
<horizontal, vertical> \
offset=<int>
例
例1
set_directive_array_map -instance AB -mode horizontal foo A
set_directive_array_map -instance AB -mode horizontal foo B
#pragma HLS array_map variable=A instance=AB horizontal
#pragma HLS array_map variable=B instance=AB horizontal
こ れ ら の コ マ ン ド は、 関数 foo のア レ イ A[10] お よ び B[15] を、 新 し い 1 つのア レ イ AB[25] にマ ッ プ し てい ます。
•
エ レ メ ン ト AB[0] は A[0] と 同 じ にな り ます。
•
エ レ メ ン ト AB[10] は B[0] と 同 じ にな り ます (-offset オプシ ョ ンが使用 さ れていないため)。
•
ア レ イ AB[25] のビ ッ ト 幅は A[10] ま たは B[15] の最大ビ ッ ト 幅にな り ます。
例2
set_directive_array_map -instance CD -mode vertical foo C
set_directive_array_map -instance CD -mode vertical foo D
#pragma HLS array_map variable=C instance=CD vertical
#pragma HLS array_map variable=D instance=CD vertical
ア レ イ C お よ び D が新 し いア レ イ CD に連結 さ れ、 ビ ッ ト 数は C お よ び D のビ ッ ト 数を足 し た も のにな り ます。 CD
のエ レ メ ン ト 数は C ま たは D の最大数にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
383
set_directive_array_partition
set_directive_array_partition
説明
ア レ イ を よ り 小 さ なア レ イ ま たは個々のエ レ メ ン ト にパーテ ィ シ ョ ン し ます。
こ のパーテ ィ シ ョ ンに よ り 、 次の結果にな り ます。
•
RTL には、 1 つの大 き な メ モ リ ではな く 、 複数の小型 メ モ リ ま たは複数の レ ジ ス タ が イ ンプ リ メ ン ト さ れます。
•
ス ト レージの読み出 し お よ び書 き 込みポー ト の数が効率的に増加 し ます。
•
デザ イ ンの スループ ッ ト が改善 さ れ る 可能性があ り ます。
•
よ り 多 く の メ モ リ イ ン ス タ ン スやレ ジ ス タ が必要 と な り ます。
構文
set_directive_array_partition [OPTIONS] <location> <array>
説明 :
•
<location> はア レ イ 変数を含む ロ ケーシ ョ ン (function[/label] の フ ォーマ ッ ト ) です。
•
<array> はパーテ ィ シ ョ ン さ れ る ア レ イ 変数です。
オプ シ ョ ン
-dim <integer>
注記 : 複数次元のア レ イ にのみ使用す る オプシ ョ ンです。
ア レ イ の ど の次元がパーテ ィ シ ョ ン さ れ る か を指定 し ます。
•
値が 0 の場合は、 指定 し たオプシ ョ ン ですべての次元がパーテ ィ シ ョ ン さ れます。
•
その他の値が指定 さ れてい る 場合は、 その次元のみがパーテ ィ シ ョ ン さ れます。 た と えば、 値が 1 の場合は、 最
初の次元のみがパーテ ィ シ ョ ン さ れます。
-factor <integer>
注記 : こ のオプシ ョ ンは、
block ま たは cyclic タ イ プのパーテ ィ シ ョ ンにのみ使用 し ます。
作成す る 小型ア レ イ の数を指定 し ます。
-type (block|cyclic|complete)
•
block タ イ プのパーテ ィ シ ョ ン では、 元のア レ イ の連続 し たブ ロ ッ ク か ら 小型ア レ イ を作成 し ます。 こ れは 1 つ
のア レ イ を N 個のブ ロ ッ ク にパーテ ィ シ ョ ンす る オプシ ョ ンで、 N は -factor で定義 さ れてい る 整数です。
•
cyclic タ イ プのパーテ ィ シ ョ ンでは、 元のア レ イ のエ レ メ ン ト を イ ン タ ー リ ーブ し て小型ア レ イ を作成 し ます。
た と えば、 -factor が 3 の場合、 エ レ メ ン ト はそれぞれ次に割 り 当て ら れます。
°
エ レ メ ン ト 0 は 1 番目の新 し いア レ イ
°
エ レ メ ン ト 1 は 2 番目の新 し いア レ イ
°
エ レ メ ン ト 3 は 3 番目の新 し いア レ イ
°
エ レ メ ン ト 4 は再び 1 番目の新 し いア レ イ
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
384
set_directive_array_partition
•
complete タ イ プのパーテ ィ シ ョ ンでは、 ア レ イ を個々のエ レ メ ン ト にパーテ ィ シ ョ ン し ます。 1 次元ア レ イ の場
合は、 ア レ イ が個々のエ レ メ ン ト にパーテ ィ シ ョ ン さ れ ま す。 複数次元のア レ イ の場合は、 各次元のパーテ ィ
シ ョ ン を指定す る か、 ま たは -dim 0 を使用 し てすべての次元をパーテ ィ シ ョ ン し ます。
デフ ォ ル ト は complete です。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS array_partition \
variable=<variable> \
<block, cyclic, complete> \
factor=<int> \
dim=<int>
例
例1
set_directive_array_partition -type block -factor 4 foo AB
#pragma HLS array_partition variable=AB block factor=4
関数 foo のア レ イ AB[13] を 4 つのア レ イ にパーテ ィ シ ョ ン し ま す。 4 は 13 の倍数ではないので、 次の よ う にパー
テ ィ シ ョ ン さ れます。
•
3 つのア レ イ に 13 個のエ レ メ ン ト
•
1 つのア レ イ に 4 つのエ レ メ ン ト (AB[9:12])
例2
set_directive_array_partition -type block -factor 2 -dim 2 foo AB
#pragma HLS array_partition variable=AB block factor=2 dim=2
関数 foo のア レ イ AB[6][4] を各次元が [6][2] の 2 つのア レ イ にパーテ ィ シ ョ ン し ます。
例3
set_directive_array_partition -type complete -dim 0 foo AB
#pragma HLS array_partition variable=AB complete dim=0
関数 foo の AB[4][10][6] のすべての次元を個々のエ レ メ ン ト にパーテ ィ シ ョ ン し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
385
set_directive_array_reshape
set_directive_array_reshape
説明
垂直ア レ イ マ ッ ピ ン グ を使用 し て ア レ イ のパーテ ィ シ ョ ン を ま と め、エ レ メ ン ト 数は少な く ワー ド 数は大 き い新 し い
ア レ イ を 1 つ作成 し ます。
set_directive_array_reshape コ マ ン ド では、 次が実行 さ れます。
1.
ア レ イ を複数のア レ イ にパーテ ィ シ ョ ン (set_directive_array_partition と 同 じ )
2.
パーテ ィ シ ョ ン さ れた ア レ イ が垂直方向を自動的に ま と めて (set_directive_array_map -type vertical と
同 じ )、 ワー ド 数の大 き い 1 つのア レ イ を新 し く 作成
構文
set_directive_array_reshape [OPTIONS] <location> <array>
説明 :
•
<location> はア レ イ 変数を含む ロ ケーシ ョ ン (function[/label] の フ ォーマ ッ ト ) です。
•
<array> は再形成 さ れ る ア レ イ 変数です。
オプ シ ョ ン
-dim <integer>
注記 : 複数次元のア レ イ にのみ使用す る オプシ ョ ンです。
ア レ イ の ど の次元が再形成 さ れ る か を指定 し ます。
•
値が 0 の場合は、 指定 し たオプシ ョ ン ですべての次元がパーテ ィ シ ョ ン さ れます。
•
その他の値が指定 さ れてい る 場合は、 その次元のみがパーテ ィ シ ョ ン さ れます。 た と えば、 値が 1 の場合は、 最
初の次元のみがパーテ ィ シ ョ ン さ れます。
-factor <integer>
注記 : こ のオプシ ョ ンは、 block ま たは cyclic タ イ プの再形成にのみ使用 し ます。
作成す る 一時的な小型ア レ イ の数を指定 し ます。
-type (block|cyclic|complete)
•
block タ イ プの再形成では、 元のア レ イ の連続 し たブ ロ ッ ク か ら 小型ア レ イ を作成 し ます。 N 個 (N は-factor オプ
シ ョ ン で 定 義 さ れ て い る 数) の ブ ロ ッ ク に ア レ イ を パ ー テ ィ シ ョ ン し た 後、 そ の N 個 の ブ ロ ッ ク を
word-width*N で 1 つのア レ イ に ま と め ます。 デフ ォ ル ト は complete です。
•
cyclic タ イ プは、 元のア レ イ のエ レ メ ン ト を イ ン タ ー リ ーブ し て小型ア レ イ を作成 し ます。 た と えば、 -factor
が 3 の場合、 エ レ メ ン ト 0 は新 し く 作成 さ れ る 1 番目のア レ イ に割 り 当て ら れ、 エ レ メ ン ト 1 は 2 番目、 エ レ メ
ン ト 3 は 3 番目、 そ し てエ レ メ ン ト 4 は ま た 1 番目のア レ イ に割 り 当て ら れます。 最終的な ア レ イ は、 新 し いア
レ イ を 1 つのア レ イ に連結 し た垂直連結にな り ます (ワ ー ド 数が大き い も のを作成する には ワ ー ド 連結)。
•
complete タ イ プは、 ア レ イ を一時的に個々のエ レ メ ン ト にパーテ ィ シ ョ ン し てか ら 、 ワー ド 数の大 き な 1 つのア
レ イ に ま と め ます。 1 次元ア レ イ の場合、 こ れは ワー ド 数が非常に大 き い レ ジ ス タ を 1 つ作成す る の と 同 じ です
(元のア レ イ が M ビ ッ ト の N 個のエ レ メ ン ト であ っ た場合、 N*M ビ ッ ト の レ ジ ス タ にな り ます)。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
386
set_directive_array_reshape
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS array_reshape \
variable=<variable> \
<block, cyclic, complete> \
factor=<int> \
dim=<int>
例
例1
set_directive_array_reshape -type block -factor 4 foo AB
#pragma HLS array_reshape variable=AB block factor=4
関数 foo の 8 ビ ッ ト ア レ イ AB[17] を、 エ レ メ ン ト を 5 つ含む新 し い 32 ビ ッ ト ア レ イ 1 つに再形成 し ます。
4 は 13 の倍数整数ではないので、 次の よ う に変更 さ れます。
•
AB[17] は 5 番目のエ レ メ ン ト の下位 8 ビ ッ ト
•
5 番目のエ レ メ ン ト の余 り は未使用
例2
set_directive_array_reshape -type block -factor 2 -dim 2 foo AB
#pragma HLS array_reshape variable=AB block factor=2 dim=2
関数 foo のア レ イ AB[6][4] を、次元 [6][2] の新 し いア レ イ 1 つにパーテ ィ シ ョ ン し ます。こ の次元 2 の幅は 2 倍です。
例3
set_directive_array_reshape -type complete -dim 0 foo AB
#pragma HLS array_reshape variable=AB complete dim=0
関数 foo の 8 ビ ッ ト ア レ イ AB[4][2][2] を シ ン グ ル エ レ メ ン ト の ア レ イ (1 つの レ ジ ス タ ) に し ま す。 ビ ッ ト 幅は
4*2*2*8(=128) にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
387
set_directive_clock
set_directive_clock
説明
指定 ク ロ ッ ク を指定関数に適用 し ます。
C お よ び C++ デザ イ ン では、 ク ロ ッ ク 1 つのみがサポー ト さ れ ま す。 create_clock で指定 し た ク ロ ッ ク 周期は、
デザ イ ン内のすべての関数に適用 さ れます。
SystemC デザ イ ン ではマルチ ク ロ ッ ク がサポー ト さ れてい ます。 create_clock コ マ ン ド を使用 し て複数の ク ロ ッ
ク を 指定 し 、 set_directive_clock コ マ ン ド を 使用 し て 個々の SC_MODULE に適用す る こ と が で き ま す。 各
SC_MODULE はシ ン グル ク ロ ッ ク で合成 さ れます。
構文
set_directive_clock <location> <domain>
説明 :
•
<location> は ク ロ ッ ク が適用 さ れ る 関数です。
•
<domain> は create_clock コ マ ン ド の -name オプシ ョ ンで指定 さ れてい る ク ロ ッ ク 名です。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS clock domain=<string>
例
次の よ う な SystemC デザ イ ンがあ る と し ます。
•
最上位の foo_top には fast_clock お よ びslow_clock と い う ク ロ ッ ク ポー ト があ り ます。
•
最上位ではその関数内で fast_clock のみが使用 さ れます。
•
下位ブ ロ ッ ク の foo では slow_clock のみが使用 さ れます。
こ の場合、 コ マ ン ド は次の よ う にな り ます。
•
両方の ク ロ ッ ク を作成
•
fast_clock を foo_top に適用
•
slow_clock を下位ブ ロ ッ ク foo に適用
create_clock -period 15 fast_clk
create_clock -period 60 slow_clk
set_directive_clock foo_top fast_clock
set_directive_clock foo slow_clock
#pragma HLS clock domain=fast_clock
#pragma HLS clock domain=slow_clock
注記 : create_clock と 同等の pragma はあ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
388
set_directive_dataflow
set_directive_dataflow
説明
関数ま たはループでデー タ フ ロ ー最適化が実行 さ れ る よ う に指定す る コ マ ン ド で、RTL イ ンプ リ メ ン テーシ ョ ンの同
時実行を改善 し ます。
C 記述では、 すべての演算が順次に実行 さ れます。 Vivado HLS は、 set_directive_allocation な ど リ ソ ース を
制限す る 指示子がない場合は、 自動的に レ イ テ ン シ を最小限に押 さ え、 同時実行性を改善 し よ う と し ます。
ただ し 、 デー タ 依存性のために こ れが制限 さ れ る こ と があ り ます。 た と えば、 ア レ イ にア ク セ スす る 関数ま たはルー
プは、 完了す る 前にア レ イ への読み出 し /書 き 込みア ク セ ス をすべて終了す る 必要があ り ます。 こ れに よ り 、 そのデー
タ を消費す る 次の関数/ループの演算が開始 さ れな く な り ます。
ただ し 、 前の関数/ループがすべての演算を完了す る 前に、 次の関数/ループの演算を開始す る こ と が可能な こ と はあ
り ます。
デー タ フ ロ ー最適化が指定 さ れてい る 場合、 Vivado HLS では次が実行 さ れます。
•
順次関数/ループ間のデー タ フ ロ ーを解析 し ます。
•
前の関数ま たはループが完了す る 前に次の関数ま たはループを開始可能にす る チ ャ ネルを
RAM ま たは FIFO に基づいて) 作成 し よ う と し ます。
(pingpong
形式の
こ れで関数ま たはループがパ ラ レルで実行 さ れ、 次が達成で き ます。
•
レ イ テ ン シが低減 し ます。
•
RTL デザ イ ンの スループ ッ ト が改善 さ れます。
開始 イ ン タ ーバル (関数ま たはループの開始か ら 次の も のの開始ま での間のサ イ ク ル数) が指定 さ れていない場合は、
Vivado HLS は開始 イ ン タ ーバルを最小限に抑え て、デー タ が使用可能にな っ た ら すぐ に演算を開始で き る よ う に し ま
す。
構文
set_directive_dataflow <location>
説明 :
•
<location> はデー タ フ ロ ー最適化が実行 さ れ る ロ ケーシ ョ ン (function[/label] フ ォーマ ッ ト ) です。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS dataflow
例
set_directive_dataflow foo
#pragma HLS dataflow
関数 foo 内のデー タ フ ロ ー最適化を指定 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
389
set_directive_data_pack
set_directive_data_pack
説明
構造体 (struct) のデー タ フ ィ ール ド を 1 つの ス カ ラ ー ( ワー ド 数が よ り 大 き い) にパ ッ ク し ます。
構造体内で宣言 さ れてい る ア レ イ はすべて完全にパーテ ィ シ ョ ン さ れ、 幅の広い ス カ ラ ーに ま と め ら れ、 ほかの ス カ
ラ ー フ ィ ール ド を使用 し てパ ッ ク さ れます。
ワー ド 数のビ ッ ト ア ラ イ メ ン ト は、構造体フ ィ ール ド の宣言か ら 自動推論 さ れます。 すべての フ ィ ール ド がマ ッ プ さ
れ る ま で、 最初の フ ィ ール ド には ワー ド の最下位部が入 り ます。
構文
set_directive_data_pack [OPTIONS] <location> <variable>
説明 :
•
<location> はパ ッ ク さ れ る 変数を含む ロ ケーシ ョ ン (function[/label] フ ォーマ ッ ト ) です。
•
<variable> はパ ッ ク さ れ る 変数です。
オプ シ ョ ン
-instance <string>
パ ッ キ ン グ後の変数の名前を指定 し ます。 何 も 指定 さ れていない場合は、 variable に入力 さ れてい る 名前が使用 さ
れます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS data_pack variable=<variable> instance=<string>
例
例1
関数 foo にあ る 8 ビ ッ ト の フ ィ ール ド が 3 つあ る 構造体 (typedef struct {unsigned char R, G, B;} pixel) のア レ イ AB[17]
を 24 ビ ッ ト の 17 エ レ メ ン ト のア レ イ 1 つにパ ッ ク し ます。
set_directive_data_pack foo AB
#pragma HLS data_pack variable=AB
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
390
set_directive_data_pack
例2
関数 foo にあ る 8 ビ ッ ト の フ ィ ール ド が 3 つあ る 構造体 (typedef struct {unsigned char R, G, B;} pixel) のポ イ ン タ ー AB
を 1 つの新 し い 24 ビ ッ ト ポ イ ン タ ーにパ ッ ク し ます。
set_directive_data_pack foo AB
#pragma HLS data_pack variable=AB
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
391
set_directive_dependence
set_directive_dependence
説明
Vivado HLS では次の依存が検出 さ れます。
•
ループ内 (ループ独立型の依存)
•
同 じ ループの反復間 (ループ運搬型の依存)
こ う し た依存は、演算が ス ケ ジ ュ ールで き る タ イ ミ ン グ、特に関数お よ びループのパ イ プ ラ イ ン化処理に影響 し ます。
•
ループ独立型の依存
同 じ ループの反復で同 じ エ レ メ ン ト がア ク セ ス さ れます。
for (i=0;i<N;i++) {
A[i]=x;
y=A[i];
}
•
ループ運搬型の依存
異な る ループ反復で同 じ エ レ メ ン ト がア ク セ ス さ れます。
for (i=0;i<N;i++) {
A[i]=A[i-1]*2;
}
変数依存のア レ イ イ ンデ ッ ク スや、 外部要件を満たす必要があ る 場合 (2 つの入力が同 じ イ ンデ ッ ク ス にな ら ない場
合な ど) な ど の状況では、 依存分析は保守的すぎ る こ と があ り ます。 set_directive_dependence コ マ ン ド を使用
す る と 、 依存を明示的に指定で き 、 不正な依存を解決す る こ と がで き ます。
構文
set_directive_dependence [OPTIONS] <location>
説明 :
•
<location> は依存が指定 さ れ る ロ ケーシ ョ ン (function[/label] フ ォーマ ッ ト ) です。
オプ シ ョ ン
-class (array|pointer)
依存を明確にす る 必要があ る 変数の ク ラ ス を指定 し ます。 こ れは、 -variable オプシ ョ ンが使用 さ れてい る と き は
使用で き ません。
-dependent (true|false)
依存を使用す る 必要があ る (true) か、 削除する (false) かを指定 し ます。 デフ ォ ル ト は false です。
-direction (RAW|WAR|WAW)
注記 : ループ運搬型依存にのみ使用 し ます。
依存の タ イ プは次の よ う に指定 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
392
set_directive_dependence
•
RAW (Read-After-Write - 真の依存)
書読み出 し 命令で使用 さ れた値が書 き 込み命令で使用 さ れます。
•
WAR (Write-After-Read - ア ンチ依存)
読み出 し 命令の値は、 書 き 込み命令で上書 き さ れます。
•
WAW (Write-After-Write - 出力依存)
2 つの書 き 込み命令に よ り 、 特定の順序で同 じ ロ ケーシ ョ ンに書き 込みが実行 さ れます。
-distance <integer>
注記 : こ れは、 -dependent が true に設定 さ れてい る ループ運搬型依存でのみ使用 し ます。
ア レ イ ア ク セ ス の反復間隔を指定 し ます。
-type (intra|inter)
次のいずれかに依存を指定 し ます。
•
同 じ ループ内の反復 (intra)
•
異な る ループ間の反復 (inter)
-variable <variable>
依存指示子を考慮す る ための具体的な変数を指定 し ます。 こ れは、 -class オプシ ョ ンが使用 さ れてい る と き は使用
で き ません。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS dependence \
variable=<variable> \
<array, pointer> \
<inter, intra> \
<RAW, WAR, WAW> \
distance=<int> \
<false, true>
例
例1
関数 foo の loop_1 の同 じ 反復での Var1 の依存を削除 し ます。
set_directive_dependence -variable Var1 -type intra \
-dependent false foo/loop_1
#pragma HLS dependence variable=Var1 intra false
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
393
set_directive_dependence
例2
関数 foo の loop_2 にあ る すべてのア レ イ の依存に よ り 、 同 じ ループ反復ではすべての読み出 し が書 き 込みの後に
実行 さ れ る よ う に設定 し ます。
set_directive_dependence -class array -type inter \
-dependent true -direction RAW foo/loop_2
#pragma HLS dependence array inter RAW true
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
394
set_directive_expression_balance
set_directive_expression_balance
説明
C ベース の仕様は演算シーケ ン ス で書かれてい る こ と があ り ます。 その場合、 RTL での演算チ ェ ーンが長 く な り 、 僅
かな ク ロ ッ ク 周期でデザ イ ン レ イ テ ン シが増加する 可能性が出て き ます。
デフ ォ ル ト では、 Vivado HLS では演算の関連性や接続性を考慮 し て、 演算が並び替え ら れます。 こ れに よ り 、 ハー ド
ウ ェ ア上での レ イ テ ン シ を低減 し つつ、 演算チ ェーン を短 く す る こ と がで き る バ ラ ン ス の と れた ツ リ ーが作成で き ま
す。
set_directive_expression_balance コ マ ン ド を使用する と 、 こ のバ ラ ン ス機能を指定範囲内でオン/オ フ にす
る こ と がで き ます。
構文
set_directive_expression_balance [OPTIONS] <location>
説明 :
•
<location> は、 バ ラ ン ス機能をオン/オ フ にす る ロ ケーシ ョ ン (function[/label] フ ォーマ ッ ト ) を指定 し ます。
オプ シ ョ ン
-off
バ ラ ン ス機能を指定 ロ ケーシ ョ ンでオ フ に し ます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS expression_balance <off>
例
例1
関数 My_Func 内でバ ラ ン ス機能を オ フ に し ます。
set_directive_expression_balance -off My_Func
#pragma HLS expression_balance off
例2
関数 My_Func2 でバ ラ ン ス機能を オンに し ます。
set_directive_expression_balance My_Func2
#pragma HLS expression_balance
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
395
set_directive_function_instantiate
set_directive_function_instantiate
説明
デフ ォ ル ト で次の よ う にな り ます。
•
関数は RTL で個別の階層ブ ロ ッ ク の ま ま残 り ます。
•
同 じ 階層レベルにあ る 関数のすべての イ ン ス タ ン ス は、 同 じ RTL イ ンプ リ メ ン テーシ ョ ン (ブ ロ ッ ク ) を使用 し
ます。
set_directive_function_instantiate コ マ ン ド は、 関数の イ ン ス タ ン ス ご と に 1 つの RTL イ ンプ リ メ ン テー
シ ョ ン を作成す る のに使用 し ます。 こ れで各 イ ン ス タ ン ス を最適化で き る よ う にな り ます。
デフ ォ ル ト では、 次の コ ー ド で、 3 つの イ ン ス タ ン スすべてに対 し 、 関数 foo_sub の RTL イ ンプ リ メ ン テーシ ョ ン
が 1 つ作成 さ れます。
char foo_sub(char inval, char incr)
{
return inval + incr;
}
void foo(char inval1, char inval2, char inval3,
char *outval1, char *outval2, char * outval3)
{
*outval1 = foo_sub(inval1, 1);
*outval2 = foo_sub(inval2, 2);
*outval3 = foo_sub(inval3, 3);
}
以下の例に示す方法で こ の指示子を使用す る と 、 3 つのバージ ョ ン の関数 foo_sub が作成 さ れ、 変数 incr に対 し
てそれぞれが個別に最適化 さ れます。
構文
set_directive_function_instantiate <location> <variable>
説明 :
•
<location> は関数の イ ン ス タ ン ス を個別に作成する ロ ケーシ ョ ン (function[/label] フ ォーマ ッ ト ) を指定 し ます。
•
variable <string> は定数 と し て指定する 引数 <string> を指定 し ます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS function_instantiate variable=<variable>
例
こ の例では、 次の Tcl (ま たは関数 foo_sub に配置 さ れた pragma) に よ り 、 foo_sub の入力 さ れてい る incr に従っ
て各 イ ン ス タ ン ス が個別に最適化 さ れます。
set_directive_function_instantiate incr foo_sub
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
396
set_directive_function_instantiate
#pragma HLS function_instantiate variable=incr
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
397
set_directive_inline
set_directive_inline
説明
階層の別エン テ ィ テ ィ と し て関数を削除 し ます。 関数を イ ン ラ イ ン化する と 、 別の階層 と し ては表示 さ れな く な り ま
す。
場合に よ っ ては、 関数を イ ン ラ イ ン化す る と 、 関数内の演算が共有 さ れ、 周辺の演算 と 共に効率 よ く 最適化 さ れ る こ
と があ り ます。 ただ し 、 イ ン ラ イ ン化 さ れた関数は共有で き ないので、 エ リ アが増加 し て し ま う 可能性があ り ます。
デフ ォ ル ト では、 関数階層のす ぐ下の階層でのみ イ ン ラ イ ン化が実行 さ れます。
構文
set_directive_inline [OPTIONS] <location>
説明 :
•
<location> は イ ン ラ イ ン化が実行 さ れ る ロ ケーシ ョ ン (function[/label] フ ォーマ ッ ト ) です。
オプ シ ョ ン
-off
関数の イ ン ラ イ ン化を オ フ に し 、 特定関数が イ ン ラ イ ン さ れない よ う に使用 し ます。 た と えば、 -recursive オプ
シ ョ ンが呼び出 し 関数に使用 さ れてい る 場合、 ほかの関数は イ ン ラ イ ン化 さ れて も 、 特定の呼び出 さ れた関数が イ ン
ラ イ ン化 さ れない よ う にす る こ と がで き ます。
-recursive
デフ ォ ル ト では、 関数階層のすぐ 下の階層でのみ イ ン ラ イ ン化が実行 さ れます。 特定の関数内に含まれ る 関数は イ ン
ラ イ ン化 さ れません。 -recursive オプシ ョ ンは階層全体の関数をすべて再帰的に イ ン ラ イ ン化 し ます。
-region
指定範囲の関数をすべて イ ン ラ イ ン化 し ます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS inline <region | recursive | off>
例
例1
foo_top に含まれ る すべての関数を イ ン ラ イ ン化 し ます ( し か し 下位にあ る 関数は イ ン ラ イ ン化 さ れません)。
set_directive_inline -region foo_top
#pragma HLS inline region
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
398
set_directive_inline
例2
foo_sub1 関数のみを イ ン ラ イ ン化 し ます。
set_directive_inline foo_sub1
#pragma HLS inline
例3
foo_sub2 を 除 く 、 foo_top に あ る すべて の関数が階層全体 を 通 し て繰 り 返 し イ ン ラ イ ン 化 さ れ ま す。 1 つ目の
pragma は foo_top に配置 さ れてい ます。 2 つ目の pragma は foo_sub2 に配置 さ れてい ます。
set_directive_inline -region -recursive foo_top
set_directive_inline -off foo_sub2
#pragma HLS inline region recursive
#pragma HLS inline off
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
399
set_directive_interface
set_directive_interface
説明
イ ン タ ーフ ェ イ ス合成で関数記述か ら ど の よ う に RTL ポー ト が作成 さ れ る か を指定 し ます。
RTL イ ンプ リ メ ン テーシ ョ ンのポー ト は次の も のか ら 派生 し ます。
•
指定 さ れてい る 、 任意の関数レベルのプ ロ ト コ ル
•
関数の引数
•
グ ロ ーバル変数 (最上位関数に よ り ア ク セ ス さ れ、 ス コ ープ外部で定義 さ れ る )
関数レベルのハン ド シ ェ イ ク :
•
関数がいつ演算を開始す る か を制御
•
関数レベルのハン ド シ ェ イ ク は、 次の タ イ ミ ン グ を示 し ます。
°
演算の終了
°
ア イ ド ル状態
°
新 し い入力を受信す る 準備完了
関数レベルのプ ロ ト コ ルの イ ンプ リ メ ン テーシ ョ ンは、 次の よ う にな り ます。
•
ap_ctrl_none、 ap_ctrl_hs ま たは ap_ctrl_chain モー ド で制御
•
最上位関数の名前のみが必要
注記 : pragma に関数 return を指定
各関数引数は、 独自の I/O プ ロ ト コ ルを持つ よ う に指定す る こ と がで き ます (有効ハン ド シ ェ イ ク や承認ハン ド シ ェ
イ ク な ど)。
変数がグ ロ ーバル と し て作成 さ れていて も 、 すべての読み出 し お よ び書 き 込みア ク セ ス が ロ ーカルにな っ てい る 場
合、 リ ソ ース はデザ イ ン内に作成 さ れ、 RTL で I/O ポー ト が必要な く な り ます。 し か し 、 グ ロ ーバル変数が外部 ソ ー
ス ま たはデス テ ィ ネーシ ョ ンにな る はずであれば、 イ ン タ ーフ ェ イ スは標準関数引数 と 同 じ よ う な方法で指定す る 必
要があ り ます。 例を参照 し て く だ さ い。
set_directive_interface が下位関数に使用 さ れてい る 場合は、-register オプシ ョ ン を使用で き ます。-mode
オプシ ョ ンは、 下位関数ではサポー ト さ れません。
構文
set_directive_interface [OPTIONS] <location> <port>
説明 :
•
<location> は指定す る 関数 イ ン タ ーフ ェ イ ス ま たは レ ジ ス タ を介 し た出力の ロ ケーシ ョ ン (function[/label] フ ォー
マ ッ ト ) です。
•
<port> - イ ン タ ーフ ェ イ ス を合成する のに必要なパ ラ メ ー タ ー (関数引数ま たはグ ロ ーバル変数)
ap_ctrl_none ま たは ap_ctrl_hs モー ド が使用 さ れてい る 場合は、 こ れは不要です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
です。
400
set_directive_interface
オプ シ ョ ン
-mode (ap_ctrl_none|ap_ctrl_hs|ap_none|ap_stable|ap_vld|ap_ovld|
ap_ack|ap_hs|ap_fifo|ap_memory|ap_bus)
適切なプ ロ ト コ ルを選択 し ます。
モー ド の値
-mode 値で イ ンプ リ メ ン ト さ れ る 関数プ ロ ト コ ルは次の と お り です。
•
ap_ctrl_none
関数レベルのハン ド シ ェ イ ク プ ロ ト コ ルはあ り ません。
•
ap_ctrl_hs
デフ ォ ル ト 動作。 関数レベルのハン ド シ ェ イ ク プ ロ ト コ ルを イ ンプ リ メ ン ト し ます。
関数が演算を開始す る には、入力ポー ト ap_start が High にな る 必要があ り ます(関数レベル信号はすべてア ク
テ ィ ブ High)。
出力ポー ト ap_done は、関数が終了 し た こ と を示 し (ま た関数の戻 り 値があ る 場合は、戻 り 値が有効であ る こ と
を示す) 、 出力ポー ト ap_idle は、 関数がア イ ド ル状態であ る こ と を示 し ます。
パ イ プ ラ イ ン化 さ れた関数では、追加出力ポー ト ap_ready が イ ンプ リ メ ン ト さ れ、 その関数が新 し い入力デー
タ を受信す る 準備完了状態にあ る こ と を示 し ます。
•
ap_ctrl_chain
こ の関数レベルのプ ロ ト コ ルは、デー タ ス ト リ ーム を処理す る ために複数のブ ロ ッ ク がチ ェーン接続 さ れ る よ う
なデザ イ ン用で、 ap_ctrl_hs モー ド のすべての機能が含 ま れ る ほか、 新 し い入力信号 ap_continue を関数
レベルのプ ロ ト コ ルに追加 し ます。
ap_continue 信号が Low にな る と 、 ダ ウ ン ス ト リ ーム ブ ロ ッ ク が新 し いデー タ を受信で き る 状態ではない こ
と を意味 し ます。 こ の場合、 出力が準備で き る ま で、 ブ ロ ッ ク は継続 し てデー タ を処理 し 続け ます。 準備がで き
た ら DONE 信号がアサー ト さ れ、 ap_continue 信号が High にアサー ト さ れ る ま で処理が停止 さ れます。
関数引数お よ びグ ロ ーバル変数の場合は、 各引数 タ イ プに対 し 、 次のデフ ォ ル ト プ ロ ト コ ルが使用 さ れます。
•
読み出 し 専用 (入力) - ap_none
•
書 き 込み専用 (出力) - ap_vld
•
読み出 し - 書 き 込み (入出力) - ap_ovld
•
ア レ イ - ap_memory
関数引数お よ びグ ロ ーバル変数を イ ンプ リ メ ン ト す る RTL ポー ト は、 次の -mode 値で指定 さ れます。
•
ap_none
プ ロ ト コ ルな し 。 単純な ワ イ ヤに対応 し ます。
•
ap_stable
入力ポー ト にのみ使用可能。 こ のポー ト の値が リ セ ッ ト 後安定 し ていて、 次の リ セ ッ ト ま で変化 し ない こ と が
Vivado HLS に伝え ら れます。 こ のプ ロ ト コ ルは ap_none モー ド の よ う に イ ンプ リ メ ン ト さ れますが、 信号フ ァ
ン ア ウ ト で内部最適化が実行 さ れます。
注記 : 定数値ではな く 、 変動 し ない値のみが考慮 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
401
set_directive_interface
•
ap_vld
こ のデー タ ポー ト と 共に動作す る 別の有効 (valid) ポー ト (<port_name>_vld) が作成 さ れます。
•
°
入力ポー ト 場合、 関連の入力有効ポー ト がアサー ト さ れ る ま で、 読み出 し に よ り 関数が停止 さ れます。
°
出力ポー ト の場合は、 デー タ を書 き 込む と き 、 出力有効信号がアサー ト さ れます。
ap_ack
こ のデー タ ポー ト と 共に動作す る 別の承認 (acknowledge) ポー ト (<port_name>_vld) が作成 さ れます。
•
°
入力ポー ト の場合、 値を読み出す と き 、 読み出 し に よ り 出力承認がアサー ト さ れます。
°
関連の入力承認ポー ト がアサー ト さ れ る ま で、 出力書 き 込みに よ り 関数が停止 さ れます。
ap_hs
こ のデー タ ポー ト と 共に動作す る 別の有効 (valid) ポー ト (<port_name>_vld) お よ び承認 (acknowledge) ポー ト
(<port_name>_ack) が作成 さ れます。
•
•
°
入力ポー ト の場合、 読み出 し に よ り 、 入力有効がアサー ト さ れ る ま で関数が停止 さ れ、 デー タ が読み出 さ れ
た と き に出力承認信号がアサー ト さ れます。
°
出力書 き 込みに よ り 、 デー タ が書き 込まれた と き 出力有効がアサー ト さ れ、 関連入力承認ポー ト がアサー ト
さ れ る ま で関数が停止 さ れます。
ap_ovld
°
入力信号の場合は、 ap_none モー ド の よ う に動作 し ます。 プ ロ ト コ ルは追加 さ れません。
°
出力信号の場合は、 ap_vld モー ド の よ う に動作 し ます。
°
入力出力信号の場合は、 次の よ う にな り ます。
-
入力が ap_none モー ド の よ う に動作 し ます。
-
出力が ap_vld モー ド の よ う に動作 し ます。
ap_memory
外部 RAM へのア ク セ ス と し て ア レ イ 引数が イ ンプ リ メ ン ト さ れます。
外部 RAM か ら の読み出 し お よ びその RAM への書き 込みを行 う ため、 デー タ 、 ア ド レ ス、 お よ び RAM 制御ポー
ト (CE や WE な ど) が作成 さ れます。 特定の信号お よ びデー タ ポー ト 数はア ク セ ス し てい る RAM に よ っ て決ま
り ます。
推奨 : ア レ イ 引数は、set_directive_resource コ マ ン ド を使用 し てテ ク ノ ロ ジ ラ イ ブ ラ リ にあ る 特定 RAM に指定す る 必
要があ り ます。 指定 し ない場合は、 Vivado HLS で自動的に使用す る RAM が選択 さ れます。
•
ap_fifo
FIFO ア ク セ ス と し て、 ア レ イ 、 ポ イ ン タ ー、 参照渡 し 変数のポー ト を イ ンプ リ メ ン ト し ます。
°
°
デー タ 入力ポー ト :
-
外部 FIFO か ら 値を読み出す準備が整 う と 、関連する 出力読み出 し ポー ト (<port_name>_read) を アサー
ト し ます。
-
値読み出 し 可能であ る こ と を示すため入力可能なポー ト (<port_name>_empty_n) がアサー ト さ れ る ま
で、 関数を停止 し ます。
デー タ 出力ポー ト :
-
ポー ト に値を書 き 込んだ こ と を示すため、 出力書 き 込みポー ト (<port_name>_write) を アサー ト し ま
す。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
402
set_directive_interface
-
•
新 し い出力用に外部
FIFO
に空 き スペース があ る こ と を示すため、 関連す る 入力可能ポー ト
(<port_name>_full_n) がアサー ト さ れ る ま で、 関数を停止 し ます。 こ の イ ン タ ーフ ェ イ ス モー ド には
–depth オプシ ョ ン を使用す る 必要があ り ます。
ap_bus
バ ス イ ン タ ーフ ェ イ ス と し て、 ポ イ ン タ ー、 参照渡 し 変数のポー ト を イ ンプ リ メ ン ト し ます。
標準 FIFO バス イ ン タ ーフ ェ イ ス と のバース ト ア ク セ ス をサポー ト する ため、 複数の制御信号を使用 し て、 入力
お よ び出力両方のポー ト が合成 さ れます。
こ の イ ン タ ーフ ェ イ ス の詳細は、 第 1 章 「高位合成の概要」 を参照 し て く だ さ い。
推奨 : こ の イ ン タ ーフ ェ イ ス モー ド には、 -depth オプシ ョ ン を使用する 必要があ り ます。
•
-depth
ap_fifo ま たは ap_bus モー ド を使用す る ポ イ ン タ ー イ ン タ ーフ ェ イ ス に必要です。
こ のオプシ ョ ン を使用す る と 、 テ ス ト ベンチで処理 さ れ る サンプルの最大数を指定で き ます。 こ れは、 RTL 協調
シ ミ ュ レーシ ョ ン用に作成 さ れた検証ア ダプ タ ーに必要な FIFO の最大サ イ ズ を Vivado HLS に渡すために必要
です。
•
-register
最上位関数では、 こ のオプシ ョ ン を次の よ う に使用 し ます。
°
次の ス カ ラ ー イ ン タ ーフ ェ イ ス に使用 し ます。
-
ap_none
-
ap_ack
-
ap_vld
-
ap_ovld
-
ap_hs
°
信号 (お よ び任意の関連プ ロ ト コ ル信号) が レ ジ ス タ を介 し 、少な く と も 関数実行の最終サ イ ク ルま で保持 さ
れ る よ う にな り ます。
°
ap_ctrl_hs 関数プ ロ ト コ ルが イ ネーブルにな っ てい る 必要があ り ます。 ap_ctrl_hs と 共に使用 さ れ る
と 、 関数の戻 り 値が レ ジ ス タ を介す よ う にな り ます。
°
下位関数に使用す る と 、 関数が最後ま で実行 さ れ る ま で出力お よ び制御信号を レ ジ ス タ に保存で き ます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS interface <mode> register port=<string>
例
例1
関数 foo の関数レベルのハン ド シ ェ イ ク をオ フ に し ます。
set_directive_interface -mode ap_ctrl_none foo
#pragma HLS interface ap_ctrl_none port=return
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
403
set_directive_interface
例2
関数 foo の引数 InData に ap_vld イ ン タ ーフ ェ イ ス を含め る よ う に指定 さ れ、 入力が レ ジ ス タ を介す よ う に設定 さ
れます。
set_directive_interface -mode ap_vld -register foo InData
#pragma HLS interface ap_vld register port=InData
例3
関数 foo で使用 さ れ る グ ロ ーバル変数 lookup_table が RTL デザ イ ン でポー ト と し て処理 さ れ、 イ ン タ ーフ ェ イ
ス には ap_memory が指定 さ れます。
set_directive_interface -mode ap_memory foo look_table
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
404
set_directive_latency
set_directive_latency
説明
関数、 ループ、 ま たは リ ージ ョ ンに レ イ テ ン シの最大値 と 最小値のいずれか、 ま たは両方を設定 し ます。
Vivado HLS は常に最小レ イ テ ン シ を目標に し ま す。 レ イ テ ン シの最大値お よ び最小値が指定 さ れ る と き の
HLS の動作は次の よ う にな り ます。
•
Vivado
レ イ テ ン シが最小値未満
レ イ テ ン シが最小値に満た ない場合、 レ イ テ ン シが指定値ま で拡張 さ れ、 リ ソ ース が さ ら に共有 さ れ る 可能性が
あ り ます。
•
レ イ テ ン シが最小値 よ り 大 き い
制約は満た さ れ、 こ れ以上の最適化は行われません。
•
レ イ テ ン シが最大値未満
制約は満た さ れ、 こ れ以上の最適化は行われません。
•
レ イ テ ン シが最大値 よ り 大 き い
最大値以下で ス ケ ジ ュ ールで き ない場合、指定 し た制約を満たす こ と がで き る よ う エ フ ォー ト レベルが上げ ら れ
ます。 こ れで も 最大レ イ テ ン シ を満たす こ と がで き ない場合は、 警告が表示 さ れ、 達成可能な最小値の レ イ テ ン
シでデザ イ ンが作成 さ れます。
構文
set_directive_latency [OPTIONS] <location>
説明 :
•
<location> は制約を設定す る ロ ケーシ ョ ン (関数 ループ、 ま たは リ ージ ョ ン) (function[/label] フ ォーマ ッ ト ) を指
定 し ます。
オプ シ ョ ン
-max <integer
最大レ イ テ ン シ を指定 し ます。
-min <integer>
最小レ イ テ ン シ を指定 し ます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS latency \
min=<int> \
max=<int>
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
405
set_directive_latency
例
例1
関数 foo の最小レ イ テ ン シ を 4、 最大を 8 に指定 し ます。
set_directive_latency -min=8 -max=8 foo
#pragma HLS latency min=4 max=4
例2
関数 foo で、 ループ loop_row の最大レ イ テ ン シ を 12 に指定 し ます。 pragma はループ本体に記述 し ます。
set_directive_latency -max=12 foo/loop_row
#pragma HLS latency max=12
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
406
set_directive_loop_flatten
set_directive_loop_flatten
説明
入れ子にな っ てい る ループ を 1 つのループ階層に フ ラ ッ ト に し ます。
RTL イ ン プ リ メ ン テーシ ョ ン では、 ループ階層にあ る ループ間の移動に 1 ク ロ ッ ク サ イ ク ルかか り ま す。 入れ子に
な っ たループ を フ ラ ッ ト にす る こ と で、 それ ら を 1 つのループ と し て最適化する こ と がで き る ので、 ク ロ ッ ク サ イ ク
ルを少な く で き 、 ループ本文の ロ ジ ッ ク を さ ら に最適化す る こ と が可能です。
推奨 : こ の指示子は、 ループ階層の一番内側にあ る ループに適用す る 必要があ り ます。 完全ま たは半完全ループのみ
を こ の方法で フ ラ ッ ト にす る こ と がで き ます。
•
•
•
完全ループの入れ子
°
一番内側のループのみにループ本体の内容が含まれます。
°
ループ文間に指定 さ れ る ロ ジ ッ ク はあ り ません。
°
すべてのループの範囲は定数です。
半完全ループの入れ子
°
一番内側のループのみにループ本体の内容が含まれます。
°
ループ文間に指定 さ れ る ロ ジ ッ ク はあ り ません。
°
一番外側のループの範囲は変数にで き ます。
不完全ループの入れ子
内側のループの範囲が変数であ っ た り 、 ループ本体が内側のループにのみ含まれてい る と は限 ら ない場合、 コ ー
ド の構造を変更す る か、 ループ本体の中のループを展開 し て、 完全ループの入れ子を作成 し てみて く だ さ い。
構文
set_directive_loop_flatten [OPTIONS] <location>
説明 :
•
<location> は ロ ケーシ ョ ン (一番内側のループ) (function[/label] のフ ォーマ ッ ト ) です。
オプ シ ョ ン
-off
フ ラ ッ ト にな ら ない よ う に し ます。
一部のループのみを フ ラ ッ ト に し 、 指定 ロ ケーシ ョ ンの こ れ以外のループはフ ラ ッ ト にで き ます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS loop_flatten off
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
407
set_directive_loop_flatten
例
例1
関数 foo の loop_1、ループ階層上で こ れ よ り 上にあ る すべてのループ (完全ま たは半完全) を 1 つのループに フ ラ ッ
ト に し ます。 pragma を loop_1 の本体に記述 し ます。
set_directive_loop_flatten foo/loop_1
#pragma HLS loop_flatten
例2
関数 foo の loop_2 でループが フ ラ ッ ト さ れない よ う に し ます。 pragma を loop_2 の本体に記述 し ます。
set_directive_loop_flatten -off foo/loop_2
#pragma HLS loop_flatten off
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
408
set_directive_loop_merge
set_directive_loop_merge
説明
すべてのループ を 1 つのループに結合 し ます。
ループ を結合す る と 、 次が可能にな り ます。
•
ループ本文の イ ンプ リ メ ン テーシ ョ ン間の移行に RTL で必要な ク ロ ッ ク サ イ ク ル数を低減す る こ と がで き ま
す。
•
可能であればループ をパ ラ レルに イ ンプ リ メ ン ト で き ます。
ループ を マージす る 場合のルールは次の よ う にな っ てい ます。
•
ループの境界が変数の場合、 同 じ 値を設定 し てお く 必要があ り ます (同 じ 数の反復)。
•
ループの境界が定数の場合、 最大定数値がマージ さ れたループの境界 と し て使用 さ れます。
•
境界が変数のループ と 、 定数の も のを一緒にマージ さ せ る こ と はで き ません。
•
結合す る ループ間の コ ー ド は、 結合する こ と に よ る 悪影響が出ない よ う に し ます。 こ の コ ー ド は複数回実行 し て
も 常に同 じ 結果にな る よ う にす る 必要があ り ます
•
-
a=b は有効
-
a=a+1 は無効
ループに FIFO 読み出 し が含まれ る 場合は、 ループ同士を結合す る こ と はで き ません。 結合に よ り 読み出 し の順
番が変更 さ れて し ま う ためです。 FIFO か ら の読み出 し 、 ま たは FIFO イ ン タ ーフ ェ イ スは、 常にシーケ ン ス どお
り に実行 さ れ る 必要があ り ます。
構文
set_directive_loop_merge <location>
説明 :
•
<location> はループがあ る ロ ケーシ ョ ン (function[/label] フ ォーマ ッ ト ) です。
オプ シ ョ ン
-force
Vivado HLS で警告が出力 さ れて も 、 ループが結合 さ れ ま す。 結合 し たループが問題な く 動作す る か ど う かは、 ユー
ザーが確認す る 必要があ り ます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS loop_merge force
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
409
set_directive_loop_merge
例
例1
関数 foo の連続す る すべてのループ を 1 つのループに結合 し ます。
set_directive_loop_merge foo
#pragma HLS loop_merge
例2
関数 foo のloop_2 の内側にあ る すべてのループ (loop_2 を除 く すべて) を -force オプシ ョ ン を使用 し て結合 し
ます。 pragma は loop_2 の本体に記述 し ます。
set_directive_loop_merge -force foo/loop_2
#pragma HLS loop_merge force
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
410
set_directive_loop_tripcount
set_directive_loop_tripcount
説明
ループで実行 さ れ る 反復回数の合計を指定 し ます。 Vivado HLS は、 各ループの合計レ イ テ ン シ、 つま り ループのすべ
ての反復を実行す る ためのサ イ ク ル数を レ ポー ト し ます。 こ のループ レ イ テ ン シは ト リ ッ プカ ウ ン ト (ループ反復の
数) と い う わけです。
ト リ ッ プカ ウ ン ト は、 定数値にな る こ と も あ り ますが、 ループ式 (x<y な ど) で使用 さ れ る 変数の値や、 ループ内の制
御文に よ っ て変わ り ます。
Vivado HLS で ト リ ッ プカ ウ ン ト が決定で き ない こ と があ り ます。 た と えば、 ト リ ッ プカ ウ ン ト を決定す る のに使用 さ
れ る 変数が次のいずれかの場合に決定で き ません。
•
入力引数
•
ダ イ ナ ミ ッ ク 演算に よ り 計算 さ れ る 変数
こ の よ う な場合、 ループ レ イ テ ン シが未知の値にな る こ と があ り ます。
set_directive_loop_tripcount コ マ ン ド を使用す る と 、 ループの ト リ ッ プカ ウ ン ト の最小値、 平均値、 最大値
を指定で き 、 最適化を駆動す る デザ イ ン解析が実行 し やす く な り ます。 こ れに よ り 、 デザ イ ン レ イ テ ン シ全体にルー
プ レ イ テ ン シがど の程度占めてい る のか を レ ポー ト で確認する こ と がで き ます。
構文
set_directive_loop_tripcount [OPTIONS] <location>
説明 :
•
<location> は ト リ ッ プカ ウ ン ト が指定 さ れ る ループの ロ ケーシ ョ ン (function[/label] フ ォーマ ッ ト ) です。
オプ シ ョ ン
-avg <integer>
平均レ イ テ ン シ を指定 し ます。
-max <integer>
最大レ イ テ ン シ を指定 し ます。
-min <integer>
最小レ イ テ ン シ を指定 し ます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS loop_tripcount \
min=<int> \
max=<int> \
avg=<int>
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
411
set_directive_loop_tripcount
例
関数 foo の loop_1 は、 次の よ う に指定 さ れてい ます。
•
最小 ト リ ッ プカ ウ ン ト 12
•
平均 ト リ ッ プカ ウ ン ト 14
•
最大 ト リ ッ プカ ウ ン ト 16
set_directive_loop_tripcount -min 12 -max 14 -avg 16 foo/loop_1
#pragma HLS loop_tripcount min=12 max=14 avg=16
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
412
set_directive_occurrence
set_directive_occurrence
説明
関数ま たはループをパ イ プ ラ イ 処理す る と き 、 ロ ケーシ ョ ン の コ ー ド がそれを囲んでい る (外側にあ る ) 関数/ループ
の コ ー ド よ り も 速度が遅い レー ト で実行 さ れ る よ う に指定 し ます。
こ れで、 実行速度が遅い コ ー ド 部分が低速でパ イ プ ラ イ ン処理 さ れ る よ う にで き る ほか、 最上位パ イ プ ラ イ ン内で共
有で き る 可能性があ り ます。 次に例を示 し ます。
•
ループは N 回反復す る と し ます。
•
ループの一部が条件文で保護 さ れていて、 M 回 し か実行 さ れない と し ます ( こ の場合 N は M の整数倍数)。
•
条件文で保護 さ れてい る コ ー ド には、 N/M の実行が含まれ る と し ます。
N が初期間隔 II でパ イ プ ラ イ ン処理 さ れ る 場合、 条件文で保護 さ れてい る 関数/ループは、 次の よ う にな り ます。
•
こ れ よ り も 高い II の値でパ イ プ ラ イ ン化す る こ と がで き ます。
注記 : 低速です。 こ の コ ー ド の実行頻度は高 く あ り ません。
•
外側の速い レー ト の方のパ イ プ ラ イ ン内で よ り よ い共有が行われ る 可能性があ り ます。
こ う し た領域を識別す る と 、こ の領域の関数お よ びループが外側にあ る 関数/ループ よ り も 遅い初期間隔でパ イ プ ラ イ
ン処理 さ れ る よ う にな り ます。
構文
set_directive_occurrence [OPTIONS] <location>
説明 :
•
<location> は実行速度の遅い ロ ケーシ ョ ン を指定 し ます。
オプ シ ョ ン
-cycle <int>
N/M の実行頻度を指定 し ます。
•
N は囲んでい る 関数/ループの実行回数です。
•
M は条件文領域の実行回数です。
N は M の整数倍数であ る 必要があ り ます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS occurrence cycle=<int>
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
413
set_directive_occurrence
例
関数 foo の領域 Cond_Region の実行頻度を 4 に指定 し ます。 囲んでい る コ ー ド よ り も 4 倍低速で こ の箇所が実行
さ れます。
set_directive_occurrence -cycle 4 foo/Cond_Region
#pragma HLS occurrence cycle=4
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
414
set_directive_pipeline
set_directive_pipeline
説明
次の詳細を指定 し ます。
•
関数のパ イ プ ラ イ ン処理
•
ループのパ イ プ ラ イ ン処理
パ イ プ ラ イ ン処理 さ れた関数ま たはループは、 N サ イ ク ル (N は開始間隔 (II)) ご と に新 し い入力を処理で き ます。 デ
フ ォ ル ト の開始間隔は 1 で、 ク ロ ッ ク サ イ ク ルご と に新 し い入力が処理 さ れます。 –II オプシ ョ ン で開始間隔を指定
す る こ と も で き ます。
指定 し た開始間隔でデザ イ ン を作成で き ない場合は、 次が実行 さ れます。
•
警告 メ ッ セージが表示 さ れます。
•
最低限可能な開始間隔でデザ イ ンが作成 さ れます。
こ の後、 警告 メ ッ セージ を使用 し てデザ イ ン を解析 し 、 必要な開始間隔を満た し てデザ イ ン を作成す る ために ど の手
順が必要なのか を分析 し ます。
構文
set_directive_pipeline [OPTIONS] <location>
説明 :
•
<location> はパ イ プ ラ イ ン処理が実行 さ れ る ロ ケーシ ョ ン (function[/label] フ ォーマ ッ ト ) です。
オプ シ ョ ン
-II <integer>
パ イ プ ラ イ ンの開始間隔を指定 し ます。
Vivado HLS では、 デー タ の依存性に基づいて こ の要求を満たそ う と し ます。 実際の結果は、 こ の II よ り 大 き い間隔
にな り ます。
-enable_flush
パ イ プ ラ イ ンの入力が停止 し た と き に、 パ イ プ ラ イ ン段を一掃で き る パ イ プ ラ イ ンが イ ンプ リ メ ン ト さ れます。
こ の機能を使用す る と 、 次が実行 さ れます。
•
追加で制御 ロ ジ ッ ク が イ ンプ リ メ ン ト さ れます。
•
エ リ アは大 き く な り ます
•
こ の機能はオプシ ョ ンです。
-rewind
注記 : ループにのみ適用で き る オプシ ョ ンです。
巻 き 戻 し を イ ネーブルに し ます。 連続す る ループのパ イ プ ラ イ ン (1 つのループの繰 り 返 し の終わ り と 次の開始の間
に一時停止な し ) が イ ネーブルにな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
415
set_directive_pipeline
巻 き 戻 し は、最上位関数内に 1 つのループ し かない (ま たは完全なループ ネ ス ト があ る ) 場合にのみ効果的です。ルー
プ前の コ ー ド 部分は、 次の よ う にな り ます。
•
初期化 と し て認識 さ れます。
•
パ イ プ ラ イ ンで 1 度だけ実行 さ れます。
•
条件文 (if-else) は含む こ と がで き ません。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS pipeline \
II=<int> \
enable_flush \
rewind
例
例1
関数 foo が開始間隔 1 でパ イ プ ラ イ ン処理 さ れます。
set_directive_pipeline foo
#pragma HLS pipeline
例2
関数 foo のループ loop_1 が開始間隔 4 でパ イ プ ラ イ ン処理 さ れます。 パ イ プ ラ イ ンが一掃 さ れます。
set_directive_pipeline -II 4 -enable_flush foo/loop_1
#pragma HLS pipeline II=4 enable_flush
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
416
set_directive_protocol
set_directive_protocol
説明
コ ー ド の領域 (プ ロ ト コ ル領域) を指定す る も ので、 コ ー ド で明確に指定 し ていない限 り 、 Vivado HLS で ク ロ ッ ク 動
作が挿入 さ れます。
プ ロ ト コ ル領域は、 手動で イ ン タ ーフ ェ イ ス プ ロ ト コ ルを指定す る ために使用 し ます。 Vivado HLS では、 関数引数
か ら の読み出 し お よ び関数引数への書 き 込み も 含め、 動作間に ク ロ ッ ク は挿入 さ れません。 こ のため、 読み出 し お よ
び書 き 込みは RTL に従い ます。
ク ロ ッ ク 動作は、 次の よ う に指定で き ます。
•
ap_wait() 文 (ap_utils.h を含む) を使用する と C で指定で き ます。
•
wait() 文 (systemc.h を含む) を使用す る と C++ お よ び SystemC で も 指定で き ます。
ap_wait お よ び wait 文は、 それぞれ C お よ び C++ デザ イ ンのシ ミ ュ レーシ ョ ンには影響せず、 Vivado HLS でのみ
認識 さ れます。
C コ ー ド の領域は、 次の手順で作成で き ます。
1.
領域を波括弧 { } で囲む
2.
名前を付け る
次の例では、 io_section と い う 領域を定義 し てい ます。
io_section:{..lines of C code...}
構文
set_directive_protocol [OPTIONS] <location>
説明 :
•
<location> - 外部のプ ロ ト コ ル要件に対応 し て、 サ イ ク ルの正確な方法で イ ンプ リ メ ン ト さ れ る よ う に、 ロ ケー
シ ョ ン (function[/label] フ ォーマ ッ ト ) を指定 し ます。
オプ シ ョ ン
-mode (floating|fixed)
floating モー ド (デフ ォ ル ト ) では、 プ ロ ト コ ル領域外の文に対応す る コ ー ド が最終的な RTL のプ ロ ト コ ル文内で
重複で き る よ う にな り ます。 プ ロ ト コ ル領域のサ イ ク ルは正確な ま ま ですが、 その他の動作は同時に発生で き ます。
fixed モー ド の場合は、 重複がない よ う にな り ます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS protocol \
<floating, fixed>
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
417
set_directive_protocol
例
関数 foo の領域 io_section を fixed プ ロ ト コ ル領域 と し て定義 し ます。pragma は領域 io_section の中に記述 し
ます。
set_directive_protocol -mode fixed foo/io_section
#pragma HLS protocol fixed
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
418
set_directive_reset
set_directive_reset
説明
特定の ス テー ト 変数 (グ ロ ーバルま たは ス タ テ ィ ッ ク ) の リ セ ッ ト を追加ま たは削除 し ます。
構文
set_directive_reset [OPTIONS] <location> <variable>
オプ シ ョ ン
<location> <string>
<location> は変数が定義 さ れ る 箇所 (function[/label] フ ォーマ ッ ト ) です。
<variable> <string>
<variable> は指示子が適用 さ れ る 変数です。
<variable> <string> -off
•
-off を指定す る と 、 指定 し た変数に対 し て リ セ ッ ト が生成 さ れません。
•
-off を指定 し ない場合、 指定 し た変数に対 し て リ セ ッ ト が生成 さ れます。
プ ラ グマ
C ソ ース コ ー ド の変数の ラ イ フ サ イ ク ルの境界内に pragma を挿入する 必要があ り ます。
#pragma HLS reset variable=a off
例
例1
グ ロ ーバル リ セ ッ ト 設定が none ま たは control の場合で も 、 関数 foo の変数 static int a に リ セ ッ ト を追加
し ます。
set_directive_reset foo a
#pragma HLS reset variable=a
例2
グ ロ ーバル リ セ ッ ト 設定が state ま たは all の場合で も 、関数 foo の変数 static int a か ら リ セ ッ ト を削除 し
ます。
set_directive_reset -off foo a
#pragma HLS reset variable=a off
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
419
set_directive_resource
set_directive_resource
説明
特定の ラ イ ブ ラ リ リ ソ ース ( コ ア) が RTL で変数を イ ンプ リ メ ン ト す る ために使用 さ れ る よ う に し ます。 変数は、 次
のいずれかにな り ます。
•
アレ イ
•
演算式
•
関数の引数
Vivado HLS では、現在読み込まれてい る ラ イ ブ ラ リ で使用可能な コ ア を使用 し て、 コ ー ド に動作が イ ンプ リ メ ン ト さ
れ ます。 変数の イ ン プ リ メ ン ト に ラ イ ブ ラ リ の複数の コ ア を使用で き る 場合、 set_directive_resource コ マ ン
ド で ど の コ ア を使用す る か指定 し ます。 コ アの リ ス ト は、「高位合成の コ ア」 セ ク シ ョ ンに含まれ る ほか、list_core
コ マ ン ド を使用す る と 使用可能な コ アがすべて リ ス ト さ れます。 リ ソ ース を指定 し ない場合は、Vivado HLS で ど の リ
ソ ース を使用す る かが指定 さ れます。
set_directive_resource は、 ラ イ ブ ラ リ の ど の メ モ リ エ レ メ ン ト を使用 し て ア レ イ を イ ンプ リ メ ン ト する か指
定す る ために最 も よ く 使用 さ れます。 こ れに よ り 、た と えば、ア レ イ を シ ン グル ポー ト RAM と デ ュ アル ポー ト RAM
の ど ち ら と し て イ ンプ リ メ ン ト す る か を指定で き ます。RTL のポー ト はア レ イ に関連付け ら れた メ モ リ に よ っ て決ま
る ので、 こ れは最上位関数 イ ン タ ーフ ェ イ ス のア レ イ に特に重要な方法です。
C の場合は -std=c99 を、 C お よ び C++ の場合は -fno-builtin を使用する こ と をお勧め し ます。
固定小数点の数学関数
固定小数点の数学関数 も 提供 さ れてい ます。 固定小数点の イ ン プ リ メ ン テーシ ョ ンは、 float ま たは double 型で使用
さ れ る の と 同 じ hls_math.h ラ イ ブ ラ リ を使用 し て呼び出す こ と がで き ます。 固定小数点型の場合、 関数値の精度は少
し 落ち ますが、 RTL イ ンプ リ メ ン テーシ ョ ンは よ り 小 さ く 高速にな り ます。
固定小数点型の関数は、 float 型の変数を使用 し た関数に代わ る も のなので、 32 ビ ッ ト の入力 と 戻 り 値に固定 さ れ ま
す。 整数ビ ッ ト 数は、 32 ま での値にで き ます。
固定小数点でサポー ト さ れ る 数学関数の リ ス ト は、 表 4-1 を参照 し て く だ さ い。
表 4‐1 : 32 ビ ッ ト 固定小数点を イ ン プ リ メ ン テーシ ョ ン し た数学関数
関数
サポー ト さ れる型
精度 (ULP)
イ ン プ リ メ ン テーシ ョ ン形式
cos
ap_fixed<32,I>
28-29
合成済み
sin
ap_fixed<32,I>
28-29
合成済み
sqrt
ap_fixed<32,I>
28-29
合成済み
構文
set_directive_resource -core <string> <location> <variable>
説明 :
•
<location> は変数のあ る ロ ケーシ ョ ン (function[/label] フ ォーマ ッ ト ) です。
•
<variable> は変数です。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
420
set_directive_resource
オプ シ ョ ン
-core <string>
テ ク ノ ロ ジ ラ イ ブ ラ リ で定義 さ れてい る の と 同 じ よ う に、 コ アの名前を指定 し ます。
-port_map <string>
IP 生成フ ロ ーを使用 し てポー ト マ ッ プ を指定す る ために使用す る オプシ ョ ン で、 ア ダプ タ ーのポー ト を使用 し てデ
ザ イ ンにポー ト がマ ッ プ さ れます。
<string> は、 デザ イ ン ポー ト お よ びア ダプ タ ー ポー ト の Tcl リ ス ト です。
-metadata <string>
IP 生成フ ロ ーを使用す る 際にバス オプシ ョ ン を指定す る オプシ ョ ンです。
<string> バ ス操作指示子が ク ォーテーシ ョ ンで囲まれた リ ス ト です。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS resource \
variable=<variable> \
core=<core>
例
例1
変数 coeffs[128] は最上位関数の foo_top に対す る 引数です。 こ の指示子に よ り 、 coeffs が ラ イ ブ ラ リ か ら の
RAM_1P コ ア を使用 し て イ ンプ リ メ ン ト さ れ る よ う に指定 さ れます。coeffs の値にア ク セ スす る ために RTL で作成
さ れ る ポー ト が、 RAM_1P コ アで定義 さ れ る も のにな り ます。
set_directive_resource -core RAM_1P foo_top coeffs
#pragma HLS resource variable=coeffs core=RAM_1P
例2
関数 foo に Result=A*B と い う コ ー ド があ る と し ます。 こ こ では、 Mul2S と い う 2 段のパ イ プ ラ イ ン乗算器 コ ア を
使用 し て乗算が イ ンプ リ メ ン ト さ れ る よ う に指定 し ます。
set_directive_resource -core Mul2S foo Result
#pragma HLS resource variable=Result core=Mul2S
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
421
set_directive_stream
set_directive_stream
説明
デフ ォ ル ト では、 ア レ イ 変数は RAM メ モ リ と し て イ ンプ リ メ ン ト さ れます。
•
最上位関数のア レ イ パ ラ メ ー タ ーは RAM イ ン タ ーフ ェ イ ス ポー ト と し て イ ンプ リ メ ン ト さ れます。
•
一般ア レ イ は、 読み出 し お よ び書 き 込みア ク セ ス用に RAM と し て イ ンプ リ メ ン ト さ れます。
•
デー タ フ ロ ー最適化に関連 し た下位関数では、 ア レ イ 引数は RAM の pingpong バ ッ フ ァ ー チ ャ ネルを使用 し て
イ ンプ リ メ ン ト さ れます。
•
ループ ベース のデー タ フ ロ ー最適化に関連 し た ア レ イ は RAM の pingpong バ ッ フ ァ ー チ ャ ネルを使用 し て イ ン
プ リ メ ン ト さ れます。
ア レ イ に保存 さ れてい る デー タ が順次に入力ま たは出力 さ れ る 場合は、RAM ではな く FIFO が使用 さ れ る ス ト リ ー ミ
ン グ デー タ を使用す る ほ う が効率的です。
最上位関数の引数の イ ン タ ーフ ェ イ ス タ イ プが ap_fifo に指定 さ れてい る と き は、 ア レ イ は ス ト リ ー ミ ン グであ る
と 判別 さ れます。
構文
set_directive_stream [OPTIONS] <location> <variable>
説明 :
•
<location> はア レ イ 変数を含む ロ ケーシ ョ ン (function[/label] の フ ォーマ ッ ト ) です。
•
<variable> は FIFO と し て イ ンプ リ メ ン ト さ れ る ア レ イ 変数です。
オプ シ ョ ン
-depth <integer>
注記 : デー タ フ ロ ー チ ャ ネルのア レ イ ス ト リ ー ミ ン グにのみ関連 し てい ます。
config_dataflow コ マ ン ド で (グ ロ ーバルに) 指定 さ れたデフ ォ ル ト の FIFO の深 さ を上書 き し ます。
-off
注記 : デー タ フ ロ ー チ ャ ネルのア レ イ ス ト リ ー ミ ン グにのみ関連 し てい ます。
config_dataflow
-default_channel
fifo
コ マ ン ド を 使用す る と 、 デ ザ イ ン 全体 の ア レ イ に
set_directive_stream がグ ロ ーバルに適用 さ れます。 こ のオプシ ョ ン を使用す る と 、 特定ア レ イ で ス ト リ ー ミ ン
グ を オ フ にで き ます (RAM の pingpong バ ッ フ ァ ー ベース チ ャ ネルが ま たデフ ォ ル ト で使用 さ れ る よ う にな り ます)。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS stream
variable=<variable> \
off \
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
422
set_directive_stream
depth=<int>
例
例1
set_directive_stream foo A
#pragma HLS STREAM variable=A
関数 foo のア レ イ A[10] を ス ト リ ー ミ ン グに し 、 FIFO と し て イ ンプ リ メ ン ト し ます。
例2
set_directive_stream -depth 12 foo/loop_1 B
#pragma HLS STREAM variable=B depth=12
関数 foo の loop_1 と い う ループにあ る ア レ イ B が深 さ 12 の FIFO で ス ト リ ー ミ ン グ さ れ る よ う に設定 し ます。I こ
の場合、 pragma は loop_1 内に挿入す る 必要があ り ます。 .
例3
set_directive_stream -off foo C
#pragma HLS STREAM variable=C off
ア レ イ C の ス ト リ ー ミ ン グがデ ィ ス エーブルにな り ます。 こ の例では config_dataflow で イ ネーブルにな る と 想
定 し てい ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
423
set_directive_top
set_directive_top
説明
関数に名前を付け ます。 こ れで、 こ の名前が set_top コ マ ン ド に使用で き ます。
こ れは通常 C++ の ク ラ ス の メ ンバー関数を合成す る ために使用 さ れます。
推奨 : 指示子は、ア ク テ ィ ブ ソ リ ュ ーシ ョ ンで指定 し ます。こ の後、その新 し い名前を set_top コ マ ン ド で使用 し ます。
構文
set_directive_top [OPTIONS] <location>
説明 :
•
<variable> は名前が変更 さ れ る 関数です。
オプ シ ョ ン
-name <string>
set_top コ マ ン ド で使用 さ れ る 名前を指定 し ます。
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS top \
name=<string>
例
例1
関数 foo_long_name の名前を DESIGN_TOP に変更 し 、 最上位 と し て指定 し ます。
コ ー ド 内に pragma が置かれ る 場合で も 、 set_top コ マ ン ド を含め る 必要があ り ます。 ま たは、 GUI のプ ロ ジ ェ ク ト
設定で最上位を指定す る 必要があ り ます。
set_directive_top -name DESIGN_TOP foo_long_name
#pragma HLS top name=DESIGN_TOP
set_top DESIGN_TOP
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
424
set_directive_unroll
set_directive_unroll
説明
ループ本文の コ ピーを複数作成す る こ と でループを変換 し ます。
ループは、 ループ変換で指定 さ れてい る 反復回数分実行 さ れます。 反復の回数は、 ループ本文内の ロ ジ ッ ク に よ っ て
も 変わ り ます (ループ終了変数へのブ レー ク や変更な ど)。ループは RTL に ロ ジ ッ ク のブ ロ ッ ク に よ り イ ンプ リ メ ン ト
さ れます。 こ のブ ロ ッ ク はループ本文を表 し 、 同 じ 反復回数分実行 さ れます。
set_directive_unroll コ マ ン ド を使用す る と 、 ループ を完全に展開す る こ と がで き 、 RTL にループ反復回数 と
同 じ 数のループ本文の コ ピーを作成で き ます。 ま たは、 ループ を係数 N で部分的に展開 し 、 N 数のループ本文の コ
ピーを作成 し 、 それに応 じ てループ反復数を調整す る こ と がで き ます。
部分展開に使用 さ れ る 係数 N が元のループ反復数の整数倍数でない場合は、ループ本文の展開 さ れた箇所の終わ り ご
と に元の終了条件をチ ェ ッ ク す る 必要があ り ます。
ループ を完全に展開す る には、 ループの境界が コ ンパ イ ル時に認識 さ れ る 必要があ り ます。 こ れは部分展開には必要
あ り ません。
構文
set_directive_unroll [OPTIONS] <location>
説明 :
•
<location> は展開す る ループの ロ ケーシ ョ ン (function[/label] フ ォーマ ッ ト ) を指定 し ます。
オプ シ ョ ン
-factor <integer>
部分展開が リ ク エ ス ト さ れた こ と を示すゼ ロ 以外の整数値を指定 し ます。
ループ本文は、 こ の数値で指定 さ れた回数分繰 り 返 さ れ、 反復 も それに応 じ て調整 さ れます。
-region
ループ内にあ る すべてのループ を展開 し ますが、 それを含む外側のループそ う の も のは展開 さ れません。
次は、 その具体例です。
•
ループ loop_1 内には loop_2 お よ び loop_3 と い う ループが同 じ レベルにあ り ます。
•
指定す る ループ (loop_1な ど) は コ ー ド 内の領域ま たは ロ ケーシ ョ ンで も あ り ます。
•
コ ー ド のセ ク シ ョ ンは、 { }.か っ こ で囲まれます。
•
UNROLL 指示子が <function>/loop_1 ロ ケーシ ョ ンに指定 さ れてい る 場合、 loop_1 が展開 さ れます。
-region オプシ ョ ン を使用す る と 、 指定 し た領域を含むループにのみ適用 さ れ ます。 こ れは、 次の よ う な結果にな
り ます。
•
loop_1 は展開 さ れません。
•
loop_1 の内側にあ る すべてのループ (loop_2 お よ び loop_3) が展開 さ れます。
-skip_exit_check
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
425
set_directive_unroll
係数が指定 さ れてい る 場合 (部分展開) にのみ、 こ のオプシ ョ ンは有効です。
•
固定境界
反復回数が係数の倍数であ る 場合は、 終了条件がチ ェ ッ ク さ れません。
反復カ ウ ン ト が係数の整数倍数でない場合は、 次の よ う にな り ます。
•
°
展開は さ れません。
°
処理を続行す る には終了チ ェ ッ ク を実行す る 必要があ る こ と を示す警告 メ ッ セージが表示 さ れます。
可変境界
終了条件チ ェ ッ ク が削除 さ れます。 次を確認 し て く だ さ い。
°
可変境界が係数の整数倍数であ る
°
終了チ ェ ッ ク が不要であ る
プ ラ グマ
C ソ ース コ ー ド の必要な ロ ケーシ ョ ンの境界内に pragma を挿入す る 必要があ り ます。
#pragma HLS unroll \
skip_exit_check \
factor=<int> \
region
例
例1
関数 foo のループ L1 を展開 し ます。 pragma は L1 の本体に記述 し ます。
set_directive_unroll foo/L1
#pragma HLS unroll
例2
関数 foo のループ L2 の展開係数を 4 に指定 し ます。 最終チ ェ ッ ク を削除 し ます。
pragma は L2 本体に記述 し ます。
set_directive_unroll -skip_exit_check -factor 4 foo/L2
#pragma HLS unroll skip_exit_check factor=4
例3
関数 foo のループ L3 内のループがすべて展開 さ れますが、 ループ L3 自体は展開 さ れません。
-region オプシ ョ ンでは、ループ ラ ベルではな く 、ループを囲む領域 と し て考慮 さ れ る ロ ケーシ ョ ン を指定 し ます。
set_directive_unroll -region foo/L3
#pragma HLS unroll region
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
426
set_part
set_part
説明
現在の ソ リ ュ ーシ ョ ンの タ ーゲ ッ ト デバ イ ス を設定 し ます。
こ の コ マ ン ド はア ク テ ィ ブ ソ リ ュ ーシ ョ ンの コ ン テ ン ツ でのみ実行 さ れます。
構文
set_part <device_specification>
説明 :
•
< device_specification> は Vivado HLS での合成お よ び イ ンプ リ メ ン テーシ ョ ンの タ ーゲ ッ ト デバ イ ス を設定す る
デバ イ ス仕様です。
•
<device_family> はフ ァ ミ リ 内のデフ ォ ル ト デバ イ ス を使用す る デバ イ ス フ ァ ミ リ 名です。
•
<device><package><speed_grade> デバ イ ス、 パ ッ ケージ、 ス ピー ド グ レー ド 情報を含む タ ーゲ ッ ト デバ イ ス名で
す。
オプ シ ョ ン
-tool (auto|ise|vivado)
タ ーゲ ッ ト RTL 合成ツールを指定 し ます。
•
•
•
vivado を選択す る と 、 Vivadl HLS では次が実行 さ れます。
°
最新の Vivado Design Suite リ リ ース でサポー ト さ れ る IP コ アすべてが使用 さ れます。
°
RTL 合成は Vivado ツールを使用 し て実行 さ れます。
ise を選択す る と 、 Vivadl HLS では次が実行 さ れます。
°
最新の ISE リ リ ース でサポー ト さ れ る IP コ アすべてが使用 さ れます。
°
RTL 合成に ISE を使用で き ます。
auto (デフ ォ ル ト ) を選択す る と 、 次が実行 さ れます。
°
Zynq お よ び 7 シ リ ーズ FPGA デバ イ ス (お よ び こ れ以降) には Vivado ツールが使用 さ れます。
°
その他すべてのデ (Virtex-6 シ リ ーズお よ びそれ以前のデバ イ ス) には ISE が使用 さ れます。
重要 : こ の オ プ シ ョ ン は、 IP パ ッ ケ ー ジ に 影響 し ま す。 Vivado を タ ー ゲ ッ ト に し た デ ザ イ ン は、 Pcore ま た は
Sysgen-ISE の IP と し てはエ ク ス ポー ト で き ません。
pragma
同等の pragma はあ り ません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
427
set_part
例
例1
Vivado HLS に含まれ る FPGA ラ イ ブ ラ リ は、次の例に示す よ う に、デバ イ ス フ ァ ミ リ 名を指定す る と 現在の ソ リ ュ ー
シ ョ ンに追加で き ます。 こ の場合、 こ のデバ イ ス フ ァ ミ リ に対 し て Vivado HLS の FPGA ラ イ ブ ラ リ で指定 さ れた
デフ ォ ル ト のデバ イ ス、 パ ッ ケージお よ びス ピー ド グ レー ド が使用 さ れます。
set_part virtex6
例2
Vivado HLS に含まれ る FPGA ラ イ ブ ラ リ は、 特定のデバ イ ス をパ ッ ケージお よ びス ピー ド グ レー ド 情報を使用 し て
指定す る こ と も で き ます。
set_part xc6vlx240tff1156-1
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
428
set_top
set_top
説明
合成 さ れ る 最上位関数を定義 し ます。
こ の関数で呼び出 さ れ る 関数 も すべてデザ イ ンの一部にな り ます。
構文
set_top <top>
説明 :
•
<variable> は合成 さ れ る 関数です。
プ ラ グマ
同等の pragma はあ り ません。
例
例1
最上位関数を foo_top と し て設定 し ます。
set_top foo_top
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
429
‐tool
‐tool
説明
RTL 出力を合成す る のに使用す る RTL 合成ツールを指定で き ます。
ザ イ リ ン ク ス浮動小数点 LogiCORE な ど のザ イ リ ン ク ス IP の正 し いバージ ョ ンが RTL を作成す る ために使用 さ れ る
よ う にな り ます。 Vivado HLS で使用 さ れ る IP のバージ ョ ンは RTL 合成ツールでサポー ト さ れ る バージ ョ ン と 同 じ で
あ る 必要があ り ます。
注記 : こ のオプシ ョ ンは、 export_design コ マ ン ド に影響 し ます。 た と えば、 合成に ISE を使用 し たデザ イ ンは Vivado
IP カ タ ロ グにはエ ク ス ポー ト で き ません。
構文
-tool (auto | ise | vivado)
•
•
auto (デフ ォ ル ト )
°
7 シ リ ーズ以降のデバ イ ス の場合は Vivado Design Suite が使用 さ れます。
°
その他のデバ イ ス の場合はザ イ リ ン ク ス ISE が使用 さ れます。
ise
°
•
RTL の合成には ISE が使用 さ れます。
vivado
°
RTL の合成には Vivado Design Suite が使用 さ れます。
リ フ ァ レンス コマン ド
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
ap_ctrl_none、 ap_ctrl_hs、 ap_ctrl_chain
イ ン タ ーフ ェ イ ス タ イ プ ap_ctrl_none、 ap_ctrl_hs お よ び ap_ctrl_chain は、 RTL をブ ロ ッ ク レベル ハン ド シ ェ イ ク 信
号 と 共に イ ンプ リ メ ン ト す る か ど う か を指定 し ます。 ブ ロ ッ ク レベルのハン ド シ ェ イ ク 信号は、 デザ イ ン で標準の操
作を開始で き る 状態にな っ た こ と と 、 操作が終了 し た こ と を示 し ます。 こ れ ら の イ ン タ ーフ ェ イ ス タ イ プは、 関数ま
たは関数 リ タ ーンに指定 し ます。
図 4-3 に、 ap_ctrl_hs を関数に指定 し た場合に生成 さ れ る RTL ポー ト と 動作を示 し ます。 こ れがデフ ォ ル ト です。 こ
の例では、 関数で return 文を使用 し て値が返 さ れ る ので、 RTL デザ イ ン に出力ポー ト ap_return が作成 さ れ ます。 関
数に return 文がなければ、 こ のポー ト は作成 さ れません。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
430
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
X-Ref Target - Figure 4-3
図 4‐3 : ap_ctrl_hs イ ン タ ー フ ェ イ スの例
ap_ctrl_chain イ ン タ ーフ ェ イ ス モー ド は、 ap_ctrl_hs と 類似 し てい ますが、 補足のために入力信号 ap_continue が追加
さ れてい る 点が異な り ます。 Vivado HLS ブ ロ ッ ク 同士を接続する 際は、こ の イ ン タ ーフ ェ イ ス モー ド の使用をお勧め
し ます。 ap_ctrl_hs お よ び ap_ctrl_chain のプ ロ ト コ ルについては、 次に説明 し ます。
ap_ctrl_none を指定す る と 、 図 4-3 に示すハン ド シ ェ イ ク 信号ポー ト (ap_start、 ap_idle、 お よ び ap_done) は作成 さ れ
ず、 ブ ロ ッ ク を cosim_design 機能で検証す る こ と はで き ません。
図 4-4 に、 イ ン タ ーフ ェ イ ス タ イ プ ap_ctrl_hs で作成 さ れたブ ロ ッ ク レベルのハン ド シ ェ イ ク 信号の動作を示 し 、 そ
の後にそれ ら の動作を解説 し ます。
X-Ref Target - Figure 4-4
図 4‐4 : ap_ctrl_hs イ ン タ ー フ ェ イ スのビヘ イ ビ ア
リ セ ッ ト 後、 動作は次の よ う にな り ます。
•
ap_start が High にな る と ブ ロ ッ ク が操作を開始 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
431
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
•
ap_start 信号は、 ap_ready 信号に よ り デザ イ ンが新 し い入力 ap_start を受信可能な状態にな っ た こ と が示 さ れ る ま
で High の ま ま であ る 必要があ り ます。 Low にな る か、 High の ま ま であ る と 、 別の ト ラ ンザ ク シ ョ ンが開始 さ れ
ます。
•
ap_start 出力が High にな る と 、 ap_idle が Low にな り ます。
•
こ れで、 入力ポー ト か ら デー タ を読み出せ る よ う にな り ます。
°
•
•
ブ ロ ッ ク ですべての操作が完了す る と 、 戻 り 値が ap_return ポー ト に書 き 込まれます。
°
関数 リ タ ーンがない場合は、 RTL ブ ロ ッ ク に no ap_return ポー ト はあ り ません。
°
その他の出力は、 ブ ロ ッ ク が完了す る ま で任意に書 き 出 さ れ、 こ の I/O プ ロ ト コ ルか ら は独立 し てい ます。
ブ ロ ッ ク の操作が完了す る と 、 ap_done 出力が High にな り ます。
°
•
最初の入力デー タ は、 ap_idle が Low にな っ た後の最初の ク ロ ッ ク エ ッ ジでサンプ リ ン グ さ れます。
デザ イ ンが新 し い入力を受信可能な状態にな る と 、 ap_ready 信号が High にな り ます。 パ イ プ ラ イ ン処理の
ないデザ イ ンの場合、 こ の信号は ap_done と 同時にアサー ト さ れます。 こ の段階で、 ap_start が Low にな る
か、 High の ま ま であ る と 、 新 し い ト ラ ンザ ク シ ョ ンが開始 さ れます。
°
ap_return ポー ト があ る 場合、 こ のポー ト の値は ap_done が High な っ た と き に有効にな り ます。
°
ap_done 信号は、 関数の戻 り 値 (ap_return ポー ト の出力) が有効であ る こ と を示すために使用で き ます。
ap_idle 信号は、 ap_done が High にな っ た 1 サ イ ク ル後に High にな り 、 次に ap_start が High にな り 、 ブ ロ ッ ク が
操作を開始す る こ と が示 さ れ る ま で、 High の ま ま にな り ます。
ap_done が High にな っ た と き に ap_start 信号が High の場合は、 次の よ う にな り ます。
•
ap_idle 信号は Low の ま ま にな り ます。
•
ブ ロ ッ ク は次の実行 (次の ト ラ ンザ ク シ ョ ン) を即座に開始 し ます。
•
次の入力は、 次の ク ロ ッ ク エ ッ ジで読み出 さ れます。
Vivado HLS ではパ イ プ ラ イ ン処理がサポー ト さ れてお り 、 現在の ト ラ ン ザ ク シ ョ ン が終了す る 前に次の ト ラ ン ザ ク
シ ョ ン を 開始で き ま す。 こ の場合、 ブ ロ ッ ク で最初の ト ラ ン ザ ク シ ョ ン が完了す る 前に新 し い入力 を 受信で き 、
ap_done は High にな り ます。
関数がパ イ プ ラ イ ン処理 さ れてい る 場合、 ま たは最上位ループが -rewind オプシ ョ ンでパ イ プ ラ イ ン処理 さ れてい る
場合、 ap_ready 信号は ap_done よ り も 前に High にな り 、 次の ト ラ ンザ ク シ ョ ン を開始す る か ど う かは、 現在の ト ラ
ン ザ ク シ ョ ン が完了す る 前に決定で き ま す。 こ の段階で、 パ イ プ ラ イ ン に既に存在す る デー タ を 取得す る には、
-enable_flush オプシ ョ ンにパ イ プ ラ イ ン指示子を付けて実行 し ます。
ap_ctrl_chain イ ン タ ーフ ェ イ ス プ ロ ト コ ルは ap_ctrl_hs と 類似 し てい ますが、 ap_continue ポー ト が追加 さ れてい る 点
が異な り ます。 ap_continue 信号が Low にな る と 、 デー タ を消費す る ダ ウ ン ス ト リ ーム ブ ロ ッ ク が新 し いデー タ を受
信で き る 状態ではない こ と を意味 し ます。
ap_continue が Low にな る と 、現在の ト ラ ンザ ク シ ョ ンの最終ス テー ト に到達 し た と き にデザ イ ンは停止 し ます。 出力
デー タ は イ ン タ ーフ ェ イ ス に出力 さ れ、 ap_done 信号が High にな り 、 デザ イ ンは ap_continue が High にな る ま で こ の
ス テー ト の ま ま にな り ます。 こ れは、 図 4-5 に示 し ます。
注記 : パ イ プ ラ イ ン処理 さ れたデザ イ ンの場合は、 現在の ト ラ ンザ ク シ ョ ン の終わ り が ap_continue が Low にな っ た
すぐ後の次の ク ロ ッ ク サ イ ク ルで発生する こ と に注意 し て く だ さ い (デザ イ ンが 1 の スループ ッ ト でパ イ プ ラ イ ン さ
れ る 場合)。
こ の信号に よ り 、 ダ ウ ン ス ト リ ーム ブ ロ ッ ク でデー タ が こ れ以上生成 さ れない よ う にで き ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
432
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
X-Ref Target - Figure 4-5
図 4‐5 : ap_ctrl_chain イ ン タ ー フ ェ イ スのビ ヘ イ ビ アー
注記 : ap_done が High にな っ た と き に確実に有効なデー タ は、ap_return ポー ト の値です。 こ のポー ト は、関数で return
文を使用 し て値を戻す場合にのみ存在 し ます。
ト ラ ンザ ク シ ョ ン が終了 し て ap_done が High にな っ た と き に、 デザ イ ン のその他の出力 も 有効であ る 可能性があ り
ますが、必ず し も 有効であ る と は限 り ません。出力ポー ト に対応す る Valid 信号が必要な場合は、 こ の後説明す る ポー
ト レベルの I/O プ ロ ト コ ルで指定す る 必要があ り ます。
ap_none
ap_none イ ン タ ーフ ェ イ ス タ イ プは最 も 単純な イ ン タ ーフ ェ イ ス で、 ほかの信号はあ り ません。 入力信号に も 出力信
号に も 、 デー タ の読み出 し ま たは書 き 込みがいつ実行 さ れてい る か を示す制御ポー ト はあ り ません。 RTL デザ イ ンに
含まれ る ポー ト は、 ソ ース コ ー ド で指定 さ れてい る も のだけです。
ap_none イ ン タ ーフ ェ イ ス では追加のハー ド ウ ェ ア オーバーヘ ッ ド はあ り ませんが、 送信ブ ロ ッ ク で適切な時間に入
力ポー ト にデー タ を供給 し 、 ト ラ ンザ ク シ ョ ン中 (デザ イ ンが完了する ま で) 保持す る 必要があ り 、 受信ブ ロ ッ ク で適
切な時間に出力ポー ト を読み出す必要があ り ます。 そのため、 イ ン タ ーフ ェ イ ス タ イ プ ap_none が出力に指定 さ れた
デザ イ ンは、 cosim_design 機能を使用 し て自動的に検証する こ と はで き ません。
ap_none イ ン タ ーフ ェ イ ス は、 図 1-36 に示す よ う に、 ア レ イ 引数では使用で き ません。
ap_stable
ap_stable イ ン タ ーフ ェ イ ス タ イ プは、ap_none と 同様に、デザ イ ンに イ ン タ ーフ ェ イ ス制御ポー ト は追加 さ れません。
ap_stable タ イ プは、 ポー ト が通常の操作中は安定 し てい る が、 最適化 さ れ る 可能性のあ る 低数値ではな く 、 ポー ト に
レ ジ ス タ を付け る 必要がない こ と を指定 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
433
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
ap_stable タ イ プは、通常 コ ン フ ィ ギ ュ レーシ ョ ン デー タ を供給す る ポー ト に使用 さ れます。 コ ン フ ィ ギ ュ レーシ ョ ン
デー タ は変化す る 必要があ り ますが、 通常の操作では変化 し ません。 コ ン フ ィ ギ ュ レーシ ョ ン デー タ は、 通常 リ セ ッ
ト 中ま たは リ セ ッ ト 前にのみ変化 し ます。
ap_stable タ イ プは、 入力ポー ト のみに適用で き ます。 入出力ポー ト に適用す る と 、 ポー ト の入力部分のみが安定 し て
い る と 想定 さ れます。
ap_hs (ap_ack、 ap_vld、 および ap_ovld)
ap_hs イ ン タ ーフ ェ イ ス では、 デー タ が使用 さ れた こ と を示す ACK 信号 と デー タ が読み出 さ れた こ と を示す Valid 信
号が使用 さ れます。 こ の イ ン タ ーフ ェ イ ス は、 ap_ack、 ap_vld、 お よ び ap_ovld の スーパーセ ッ ト です。
•
イ ン タ ーフ ェ イ ス タ イ プ ap_ack では、 ACK 信号のみが提供 さ れます。
•
イ ン タ ーフ ェ イ ス タ イ プ ap_vld では、 Valid 信号のみが提供 さ れます。
•
イ ン タ ーフ ェ イ ス タ イ プ ap_ovld では Valid 信号のみが提供 さ れ、 出力ポー ト ま たは入出力ポー ト の出力部分の
みに適用 さ れます。
図 4-6 に、 入力ポー ト と 出力ポー ト で ap_hs イ ン タ ーフ ェ イ ス が ど の よ う に動作す る か を示 し ます。 こ の例では、 入
力ポー ト 名は in、 出力ポー ト 名は out です。
注記 : 制御信号には、 元のポー ト 名に基づいて自動的に名前が付け ら れます。 た と えば、 入力ポー ト in の Valid ポー
ト は in_vld です。
X-Ref Target - Figure 4-6
図 4‐6 : ap_hs イ ン タ ー フ ェ イ スの動作
入力は、 次の よ う にな り ます。
•
リ セ ッ ト 後 ap_start が High にな る と 、 ブ ロ ッ ク が通常の操作を開始 し ます。
•
入力ポー ト が読み出 さ れ る と き に in_vld 入力が Low の場合、 デザ イ ンは停止 し 、 in_vld 入力が High にな っ て新
し い入力値が有効であ る こ と が示 さ れ る ま で待機 し ます。
•
in_vld 入力が High にな る と す ぐ に、 in_ack 出力が High にな り 、 デー タ が読み出 さ れた こ と が示 さ れます。
出力は、 次の よ う にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
434
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
•
リ セ ッ ト 後 ap_start が High にな る と 、 ブ ロ ッ ク が通常の操作を開始 し ます。
•
出力ポー ト への書 き 込みが実行 さ れ る と 、 同時に out_vld 出力信号が High にな り 、 ポー ト に有効なデー タ が存在
す る こ と が示 さ れます。
•
out_ack 入力が Low の場合、 デザ イ ンが停止 し 、 out_ack 入力が High にな る ま で待機 し ます。
•
out_ack 入力が High にな る と 、 次の ク ロ ッ ク エ ッ ジで out_vld 出力が Low にな り ます。
ap_hs イ ン タ ーフ ェ イ ス を使用す る デザ イ ンは cosim_design で検証で き る ので、 柔軟な開発プ ロ セ ス が可能 と な り 、
ボ ト ム ア ッ プお よ び ト ッ プダ ウ ンの設計フ ロ ーの両方が使用で き ます。 ブ ロ ッ ク 間の通信は双方向のハン ド シ ェ イ ク
に よ り 安全に実行で き 、 正 し い操作のために手動の操作や前提は必要あ り ません。
ap_hs イ ン タ ーフ ェ イ ス は安全な イ ン タ ーフ ェ イ ス プ ロ ト コ ルですが、 2 つのポー ト と 関連の制御 ロ ジ ッ ク が必要 と
な り ます。
ap_ack イ ン タ ーフ ェ イ ス では、 ACK ポー ト のみが合成 さ れます。
•
入力引数に指定す る と 、 出力 ACK ポー ト が生成 さ れ、 入力が読み出 さ れ る サ イ ク ルで High にな り ます。
•
出力引数に指定す る と 、 入力 ACK ポー ト と な り ます。
°
°
書 き 込み操作後、 デザ イ ンは停止 し 、 ACK 入力 が High にな っ て出力が受信ブ ロ ッ ク に よ り 読み出 さ れた こ
と が示 さ れ る ま で待機 し ます。
ただ し 、 デー タ が使用可能であ る こ と を示す出力ポー ト はあ り ません。
出力ポー ト で ap_ack イ ン タ ーフ ェ イ ス タ イ プ を指定する 場合は、 注意が必要です。 出力ポー ト に ap_ack を使用す る
デザ イ ンは、 cosim_design で検証で き ません。
イ ン タ ーフ ェ イ ス タ イ プ ap_vld を指定す る と 、 RTL デザ イ ンに関連の Valid ポー ト が追加 さ れます。
•
出力引数に指定す る と 、 出力 Valid ポー ト が生成 さ れ、 出力 ポー ト のデー タ が有効にな っ た こ と を示 し ます。
注記 : 入力引数に指定 し た場合、 こ の Valid ポー ト は ap_hs で イ ンプ リ メ ン ト さ れ る Valid ポー ト と は動作が異な
り ます。
•
ap_vld を入力ポー ト に使用す る と (出力 ACK 信号はな し )、 Valid がア ク テ ィ ブにな る と 同時に入力ポー ト が読み
出 さ れます。 こ れはデザ イ ンでポー ト を読み出す準備がで き ていない場合 も 同様で、 その場合はデー タ ポー ト が
サンプ リ ン グ さ れ、 必要にな る ま で内部で保持 さ れます。
•
Valid 入力がア ク テ ィ ブな各サ イ ク ルで、 入力デー タ が読み出 さ れます。
ap_ovld イ ン タ ーフ ェ イ ス タ イ プは ap_vld と 同 じ ですが、 出力ポー ト のみに指定で き ます。 こ れは、 読み出 し と 書 き
込みの両方が実行 さ れ る ポ イ ン タ ー を、 Valid 出力ポー ト のみ を 付け て イ ン プ リ メ ン ト し 、 入力側はデ フ ォ ル ト の
ap_none で イ ンプ リ メ ン ト す る 場合に有益です。
ap_memory
ア レ イ 引数は、 通常 ap_memory イ ン タ ーフ ェ イ ス を使用 し て イ ンプ リ メ ン ト さ れ ます。 こ のポー ト イ ン タ ーフ ェ イ
ス は、 イ ンプ リ メ ン テーシ ョ ンで メ モ リ のア ド レ ス ロ ケーシ ョ ンに ラ ン ダ ム ア ク セ ス が必要な場合に、 メ モ リ エ レ
メ ン ト (RAM、 ROM) と 通信す る ために使用 さ れ ます。 ア レ イ 引数は、 ラ ン ダ ム ア ク セ ス メ モ リ イ ン タ ーフ ェ イ ス
をサポー ト す る 唯一の引数です。
メ モ リ エ レ メ ン ト へのシーケ ン シ ャ ル ア ク セ ス のみが必要な場合は、 次に説明する ap_fifo イ ン タ ーフ ェ イ ス を使用
し て、 ハー ド ウ ェ アのオーバーヘ ッ ド を削減で き ます。 ap_fifo イ ン タ ーフ ェ イ ス では、 ア ド レ ス生成は実行 さ れませ
ん。
ap_memory イ ン タ ー フ ェ イ ス を 使用す る 場合、 「 メ モ リ リ ソ ー ス の選択」 に示す よ う に、 ア レ イ タ ーゲ ッ ト を
set_directive_resource コ マ ン ド を使用 し て指定す る 必要が あ り ま す。 ア レ イ に タ ーゲ ッ ト が指定 さ れてい ない場合、
Vivado HLS に よ り 自動的にシ ン グル ポー ト ま たはデ ュ アル ポー ト RAM イ ン タ ーフ ェ イ ス を使用す る かが判断 さ れ
ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
435
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
ヒ ン ト : 合成の前に、 RESOURCE 指示子を使用 し て、 ア レ イ 引数の タ ーゲ ッ ト と し て正 し い メ モ リ タ イ プ を指定 し
て く だ さ い。 新 し い正 し い メ モ リ で再合成す る と 、 ス ケ ジ ュ ー リ ン グお よ び RTL が異な る も のにな る 可能性があ り
ます。
図 4-7 に、d と い う ア レ イ タ ーゲ ッ ト がシ ン グル ポー ト ブ ロ ッ ク RAM と し て指定 さ れた リ ソ ース であ る 例を示 し ま
す。
X-Ref Target - Figure 4-7
図 4‐7 : ap_memory イ ン タ ー フ ェ イ スの動作
リ セ ッ ト 後、 動作は次の よ う にな り ます。
•
リ セ ッ ト 後 ap_start が High にな る と 、 ブ ロ ッ ク が通常の操作を開始 し ます。
•
読み出 し は、 出力ア ド レ ス ポー ト にア ド レ ス を供給 し 、 出力信号 d_ce を アサー ト する と 実行 さ れます。
°
•
こ のブ ロ ッ ク RAM タ ーゲ ッ ト では、入力デー タ が次の ク ロ ッ ク サ イ ク ルで有効にな る と デザ イ ン で判断 さ
れます。
書 き 込み操作は、 出力ポー ト d_ce と d_we を アサー ト し 、 同時にア ド レ ス と デー タ を供給する と 実行 さ れます。
メ モ リ イ ン タ ー フ ェ イ ス は外部信号に よ っ て 停止で き ず、 出力デー タ が有効で あ る か ど う か が示 さ れ る の で、
cosim_design を使用 し て検証で き ます。
ap_fifo
メ モ リ エ レ メ ン ト に ア ク セ ス す る 必要が あ り 、 ア ク セ ス が シーケ ン シ ャ ルで ラ ン ダ ム ア ク セ ス が不要な場合は、
ap_fifo イ ン タ ーフ ェ イ ス を使用す る のがハー ド ウ ェ アの点では最 も 効率的です。ap_fifo イ ン タ ーフ ェ イ ス では、 ポー
ト を FIFO に接続で き 、 完全な双方向の Empty/Full の通信がサポー ト さ れ、 ア レ イ 、 ポ イ ン タ ー、 お よ び参照渡 し 引
数で指定で き ます。
ap_fifo イ ン タ ーフ ェ イ ス を使用可能な関数では、 ポ イ ン タ ーが よ く 使用 さ れ、 同 じ 変数に複数回ア ク セ スす る 可能性
があ り ます。 こ の場合、 「マルチア ク セ ス ポ イ ン タ ー イ ン タ ーフ ェ イ ス」 を参照 し て volatile 修飾子の重要性を理解
し て く だ さ い。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
436
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
注記 : ap_fifo イ ン タ ーフ ェ イ ス では、 すべての読み出 し お よ び書 き 込みがシーケ ン シ ャ ルであ る と 想定 さ れます。
Vivado HLS でそ う ではない と 判断 さ れた場合、 エ ラ ー メ ッ セージが表示 さ れて処理が停止 し ます。
Vivado HLS でア ク セ ス が常にシーケ ン シ ャ ルか ど う か を判断で き ない場合は、警告 メ ッ セージが表示 さ れ、処理が継
続 さ れます。
次の例では、 in1 は現在のア ド レ ス にア ク セ ス し 、 その後現在のア ド レ ス の上 2 つのア ド レ ス にア ク セ ス し て、 最後
に 1 つ下のア ド レ ス にア ク セ スす る ポ イ ン タ ーです。
void foo(int* in1, ...){
int data1, data2, data3;
...
data1= *in1;
data2= *(in1+2);
data3= *(in1-1);
...
}
in1 を ap_fifo イ ン タ ーフ ェ イ ス と し て指定する と 、 Vivado HLS でア ク セ ス がチ ェ ッ ク さ れ、 ア ク セ ス がシーケ ン シ ャ
ルでない場合はエ ラ ー メ ッ セージが表示 さ れ、 停止 し ます。 シーケ ン シ ャ ルでないア ド レ ス ロ ケーシ ョ ン か ら 読み
出すには、 ap_memory イ ン タ ーフ ェ イ ス を ラ ン ダ ム ア ク セ ス と し て使用す る か、 ap_bus イ ン タ ーフ ェ イ ス を使用 し
ます。
ap_fifo イ ン タ ーフ ェ イ ス は、 読み出 し お よ び書 き 込みの両方に使用 さ れ る 引数 (入出力ポー ト ) には指定で き ません。
入力引数ま たは出力引数のみで指定で き ます。 入力引数 in、 出力引数 out を ap_fifo イ ン タ ーフ ェ イ ス と し て指定 し た
イ ン タ ーフ ェ イ ス は、 次の よ う に動作 し ます。
X-Ref Target - Figure 4-8
図 4‐8 : ap_fifo イ ン タ ー フ ェ イ スの動作
リ セ ッ ト 後 ap_start が High にな る と 、 ブ ロ ッ ク が通常の操作を開始 し ます。
読み出 し では、 次の よ う にな り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
437
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
•
入力ポー ト で読み出 し が実行 さ れ る と き に FIFO が空の場合 (in_empty_n 入力ポー ト が Low)、デザ イ ンは停止 し 、
デー タ を読み出せ る よ う にな る ま で待機 し ます。
•
in_empty_n 入力が High にな っ て FIFO にデー タ があ る こ と が示 さ れ る と すぐ に、ACK 信号であ る in_read 出力が
High にな り 、 こ のサ イ ク ルでデー タ が読み出 さ れた こ と が示 さ れます。
•
ポー ト で読み出 し が必要な と き に FIFO にデー タ があ る と 、 出力 ACK 信号が High にな り 、 こ のサ イ ク ルでデー
タ が読み出 さ れた こ と が示 さ れます。
出力は、 次の よ う にな り ます。
•
出力ポー ト で書 き 込みが実行 さ れ る と き に FIFO が フルの場合 (out_full_n が Low)、デー タ は出力ポー ト に配置 さ
れますが、 デザ イ ンは停止 し 、 FIFO に書 き 込むスペース がで き る ま で待機 し ます。
•
FIFO に書 き 込むスペース がで き る と (out_full_n 入力が High)、 out_write 出力が High にな り 、 出力デー タ が有効
であ る こ と が示 さ れます。
•
出力を書 き 込む必要があ る と き に FIFO に スペース があ る と 、出力 Valid 信号が High にな り 、こ のサ イ ク ルでデー
タ が有効であ る こ と が示 さ れます。
ap_fifo イ ン タ ーフ ェ イ ス では、 出力デー タ ポー ト に関連の書き 込み信号ポー ト があ る ので、 cosim_design を使用 し て
検証で き ます。
最上位関数がパ イ プ ラ イ ン処理 さ れ る 場合、 ま たは最上位ループが -rewind オプシ ョ ン でパ イ プ ラ イ ン処理 さ れ る 場
合、 _lwr が接尾語に付いた追加の出力ポー ト が作成 さ れ ます。 こ のポー ト は、 FIFO イ ン タ ーフ ェ イ スへ最後の書 き
込みが実行 さ れ る と ア ク テ ィ ブ High にな り ます。
ap_bus
ap_bus イ ン タ ーフ ェ イ ス を使用す る と 、 バ ス ブ リ ッ ジ と 通信で き ま す。 こ の イ ン タ ーフ ェ イ ス は特定のバ ス規格に
は従っ てい ませんが、 汎用であ る ためバ ス ブ リ ッ ジ と 共に使用で き 、 バ ス ブ リ ッ ジでシ ス テ ム バ ス を アービ ト レー
シ ョ ンで き ます。 バ ス ブ リ ッ ジでは、 バース ト 書き 込みを キ ャ ッ シ ュ で き る よ う にな っ てい る 必要があ り ます。
ap_bus イ ン タ ーフ ェ イ ス を使用可能な関数ではポ イ ン タ ーが使用 さ れ、同 じ 変数に複数回ア ク セ スす る こ と があ り ま
す。 こ の場合、 「マルチア ク セ ス ポ イ ン タ ー イ ン タ ーフ ェ イ ス」 を参照 し て volatile 修飾子の重要性を理解 し て く だ
さ い。
ap_bus イ ン タ ーフ ェ イ スは、 次の 2 つの方法で使用で き ます。
•
標準モー ド :読み出 し お よ び書 き 込みを、 それぞれにア ド レ ス を指定 し て個別に実行 し ます。
•
バース ト モー ド :C ソ ース コ ー ド で C 関数 memcpy を使用する と 、 デー タ 転送にバース ト モー ド が使用 さ れま
す。 バース ト モー ド では、 イ ン タ ーフ ェ イ ス に よ り 転送のベース ア ド レ ス と サ イ ズが示 さ れ、 デー タ サンプル
が連続す る サ イ ク ルで高速に転送 さ れます。
•
memcpy 関数でア ク セ ス さ れ る ア レ イ は、 レ ジ ス タ にはパーテ ィ シ ョ ンで き ません。
図 4-9 お よ び図 4-10 に、 標準モー ド での読み出 し と 書 き 込みの動作の例を示 し ます。 こ の例では、 ap_bus イ ン タ ー
フ ェ イ ス が引数 d に適用 さ れてい ます。
void foo (int *d) {
static int acc = 0;
int i;
for (i=0;i<4;i++) {
acc += d[i+1];
d[i] = acc;
}
}
図 4-11 お よ び図 4-12 に、 C 関数 memcpy と バース ト モー ド を使用する 例を示 し ます。 こ の例の コ ー ド は、 次の と お
り です。
void bus (int *d) {
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
438
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
int buf1[4], buf2[4];
int i;
memcpy(buf1,d,4*sizeof(int));
for (i=0;i<4;i++) {
buf2[i] = buf1[3-i];
}
memcpy(d,buf2,4*sizeof(int));
}
X-Ref Target - Figure 4-9
図 4‐9 : ap_bus イ ン タ ー フ ェ イ スの動作標準読み出 し
リ セ ッ ト 後、 動作は次の よ う にな り ます。
•
リ セ ッ ト 後 ap_start が High にな る と 、 ブ ロ ッ ク が通常の操作を開始 し ます。
•
読み出 し を実行す る と き にバ ス ブ リ ッ ジ FIFO にデー タ がない場合は (d_rsp_empty_n が Low)、 次の よ う にな り
ます。
°
出力ポー ト d_req_write がアサー ト さ れ、 d_req_din ポー ト がデ ィ アサー ト さ れて、 読み出 し 操作が示 さ れま
す。
°
ア ド レ ス が出力です。
°
デザ イ ンが停止 し 、 デー タ が読み出せ る よ う にな る ま で待機 し ます。
•
デー タ が読み出せ る よ う にな る と 、 出力信号 d_rsp_read がアサー ト さ れ、 次の ク ロ ッ ク エ ッ ジでデー タ が読み出
さ れます。
•
読み出 し を実行す る と き にバ ス ブ リ ッ ジ FIFO にデー タ があ る 場合は (d_rsp_empty_n が High)、 次の よ う にな り
ます。
°
出力ポー ト d_req_write がアサー ト さ れ、 d_req_din ポー ト がデ ィ アサー ト さ れて、 読み出 し 操作が示 さ れま
す。
°
ア ド レ ス が出力です。
°
次の ク ロ ッ ク サ イ ク ルで d_rsp_read がアサー ト さ れ、 次の ク ロ ッ ク エ ッ ジでデー タ が読み出 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
439
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
X-Ref Target - Figure 4-10
図 4‐10 : ap_bus イ ン タ ー フ ェ イ スの動作標準書き込み
リ セ ッ ト 後、 動作は次の よ う にな り ます。
•
リ セ ッ ト 後 ap_start が High にな る と 、 ブ ロ ッ ク が通常の操作を開始 し ます。
•
書 き 込みを実行す る と き にバ ス ブ リ ッ ジ FIFO に スペース がない場合は (d_req_full_n が Low)、 次の よ う にな り
ます。
•
•
°
ア ド レ スお よ びデー タ が出力です。
°
デザ イ ンが停止 し 、 スペース が使用可能にな る ま で待機 し ます。
書 き 込むスペース がで き る と 、 次の よ う にな り ます。
°
出力ポー ト d_req_write と d_req_din がアサー ト さ れて、 書 き 込み操作が示 さ れます。
°
出力信号 d_req_din がアサー ト さ れ、 次の ク ロ ッ ク エ ッ ジでデー タ が有効であ る こ と が示 さ れます。
書 き 込みを実行す る と き にバ ス ブ リ ッ ジ FIFO に スペース があ る 場合は (d_req_full_n が High)、 次の よ う にな り
ます。
°
出力ポー ト d_req_write と d_req_din がアサー ト さ れて、 書 き 込み操作が示 さ れます。
°
ア ド レ スお よ びデー タ が出力です。
°
d_req_din がアサー ト さ れ、 次の ク ロ ッ ク エ ッ ジでデー タ が有効であ る こ と が示 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
440
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
X-Ref Target - Figure 4-11
図 4‐11 : ap_bus イ ン タ ー フ ェ イ スの動作バース ト 読み出 し
リ セ ッ ト 後、 動作は次の よ う にな り ます。
•
リ セ ッ ト 後 ap_start が High にな る と 、 ブ ロ ッ ク が通常の操作を開始 し ます。
•
読み出 し を実行す る と き にバ ス ブ リ ッ ジ FIFO にデー タ がない場合は (d_rsp_empty_n が Low)、 次の よ う にな り
ます。
°
出力ポー ト d_req_write がアサー ト さ れ、 d_req_din ポー ト がデ ィ アサー ト さ れて、 読み出 し が示 さ れます。
°
転送のベース ア ド レ ス と サ イ ズが出力 さ れます。
°
デザ イ ンが停止 し 、 デー タ が読み出せ る よ う にな る ま で待機 し ます。
•
デー タ が読み出せ る よ う にな る と 、 出力信号 d_rsp_read がアサー ト さ れ、 次の N ク ロ ッ ク エ ッ ジ (N は d_size 出
力ポー ト の値) でデー タ が読み出 さ れます。
•
バ ス ブ リ ッ ジ FIFO が途中で空にな る と 、 デー タ 転送は即座に停止 し 、 デー タ が読み出 さ れ る よ う にな る ま で待
機 し て、 停止 し た地点か ら 再開 し ます。
•
読み出 し を実行す る と き にバ ス ブ リ ッ ジ FIFO にデー タ があ る 場合は、 次の よ う にな り ます。
°
転送は上記の よ う に開始 し 、 FIFO が途中で空にな る と 、 デザ イ ンが停止 し てデー タ が再び読み出せ る よ う
にな る ま で待機 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
441
イ ン タ ー フ ェ イ ス合成 リ フ ァ レ ン ス
X-Ref Target - Figure 4-12
図 4‐12 : ap_bus イ ン タ ー フ ェ イ スの動作バース ト 書き込み
リ セ ッ ト 後、 動作は次の よ う にな り ます。
•
リ セ ッ ト 後 ap_start が High にな る と 、 ブ ロ ッ ク が通常の操作を開始 し ます。
•
書 き 込みを実行す る と き にバ ス ブ リ ッ ジ FIFO に スペース がない場合は (d_req_full_n が Low)、 次の よ う にな り
ます。
•
•
°
ベース ア ド レ ス、 転送サ イ ズ、 お よ びデー タ が出力です。
°
デザ イ ンが停止 し 、 スペース が使用可能にな る ま で待機 し ます。
書 き 込むスペース がで き る と 、 次の よ う にな り ます。
°
出力ポー ト d_req_write と d_req_din がアサー ト さ れて、 書 き 込み操作が示 さ れます。
°
出力信号 d_req_din がアサー ト さ れ、 次の ク ロ ッ ク エ ッ ジでデー タ が有効であ る こ と が示 さ れます。
°
FIFO が フルにな る と 即座に d_req_din 出力信号がデ ィ アサー ト さ れ、 スペース がで き る と 再びアサー ト さ れ
ます。
°
N 個のデー タ 値が転送 さ れ る と 転送が停止 し ます (N は d_size の値)。
書 き 込みを実行す る と き にバ ス ブ リ ッ ジ FIFO に スペース があ る 場合は (d_req_full_n が High)、 次の よ う にな り
ます。
°
転送は上記の よ う に開始 し 、 FIFO が途中で空にな る と 、 デザ イ ンが停止 し てデー タ が再び読み出せ る よ う
にな る ま で待機 し ます。
cosim_design イ ン タ ーフ ェ イ ス は、 autosim 機能で検証で き ます。
AXI4 Stream
AXI Stream I/O プ ロ ト コ ルは、 I/O プ ロ ト コ ル と し て指定で き ます。 タ イ ミ ン グお よ びポー ト な ど を含む AXI Stream
イ ン タ ーフ ェ イ ス の説明については、 『AXI リ フ ァ レ ン ス ガ イ ド 』 (UG761) を参照 し て く だ さ い。
こ の I/O プ ロ ト コ ルのすべての機能については、 「バス イ ン タ ーフ ェ イ ス の指定」 セ ク シ ョ ン を参照 し て く だ さ い。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
442
C ド ラ イバー リ フ ァ レ ン ス
AXI4 Slave Lite
AXI Slave Lite I/O プ ロ ト コ ルは I/O プ ロ ト コ ルの 1 つ と し て指定で き ます。 タ イ ミ ン グお よ びポー ト な ど を含む AXI
Slave Lite イ ン タ ーフ ェ イ ス の説明については、 『AXI リ フ ァ レ ン ス ガ イ ド 』 (UG761) を参照 し て く だ さ い。
AXI4 Slave Lite イ ン タ ーフ ェ イ ス の指定方法は、 ほかの I/O プ ロ ト コ ル と は少 し 違い ます。 こ の イ ン タ ーフ ェ イ ス は
既存 イ ン タ ーフ ェ イ ス に追加 し て使用で き ます。 た と えば、 イ ン タ ーフ ェ イ ス を ap_hs と し て指定す る 場合、 それ
に AXI4 Slave Lite リ ソ ース を適用す る と 、 AXI4 Slave Lite ポー ト が作成で き ます。
こ の よ う に、ほかの イ ン タ ーフ ェ イ ス と は動作が違 う ので、AXI Slave Lite イ ン タ ーフ ェ イ スは [Export RTL] 後の HDL
出力で し か使用可能にな ら ず、 Verilog HDL .に し かな り ません。
こ の I/O プ ロ ト コ ルのすべての機能については、 「バス イ ン タ ーフ ェ イ ス の指定」 セ ク シ ョ ン を参照 し て く だ さ い。
AXI4 Master
AXI4 Master I/O プ ロ ト コ ルは I/O プ ロ ト コ ルの 1 つ と し て指定で き ます。 タ イ ミ ン グお よ びポー ト な ど を含む AXI4
Master イ ン タ ーフ ェ イ ス の説明については、 『AXI リ フ ァ レ ン ス ガ イ ド 』 (UG761) を参照 し て く だ さ い。
AXI4 Master イ ン タ ーフ ェ イ ス の指定方法は、 ほかの I/O プ ロ ト コ ル と は少 し 違い ます。 こ の イ ン タ ーフ ェ イ ス は既
存 イ ン タ ーフ ェ イ ス に追加 し て使用で き ます。 た と えば、 イ ン タ ーフ ェ イ ス を ap_hs と し て指定す る 場合、 それに
AXI4 Master リ ソ ース を適用す る と 、 AXI4 Slave Lite ポー ト が作成で き ます。
こ の よ う に、 ほかの イ ン タ ーフ ェ イ ス と は動作が違 う ので、 AXI4 Master イ ン タ ーフ ェ イ スは [Export RTL] 後の HDL
出力で し か使用可能にな ら ず、 Verilog HDL .に し かな り ません。
こ の I/O プ ロ ト コ ルのすべての機能については、 「バス イ ン タ ーフ ェ イ ス の指定」 セ ク シ ョ ン を参照 し て く だ さ い。
C ド ラ イバー リ フ ァ レ ン ス
C ド ラ イバー フ ァ イル
AXI4 Lite イ ン タ ーフ ェ イ ス がデザ イ ン に追加 さ れ る と 、 C ド ラ イ バー フ ァ イ ルのセ ッ ト が自動的に作成 さ れ ま す。
こ れ ら の C ド ラ イ バー フ ァ イ ルには、 CPU で実行 さ れ る ど の ソ フ ト ウ ェ アに も 統合で き る API が含まれ、 AXI4 Lite
イ ン タ ーフ ェ イ ス を介 し てデバ イ ス と の通信に使用 さ れます。
C ド ラ イ バー フ ァ イ ルは、 デザ イ ンが IP カ タ ロ グか Pcore フ ォーマ ッ ト で IP と し てパ ッ ケージ さ れ る と 作成 さ れま
す。 IP のパ ッ ケージに関す る 詳細は、 「RTL デザ イ ンのエ ク ス ポー ト 」 セ ク シ ョ ン を参照 し て く だ さ い。
ド ラ イ バー フ ァ イ ルは、 Standalone モー ド と Linux モー ド 用に作成 さ れます。 Standalone モー ド の場合、 ド ラ イ バー
がその他のザ イ リ ン ク ス ス タ ン ド ア ロ ン ド ラ イ バー と 同 じ よ う に使用 さ れ ま す。 .Linux モー ド の場合、 すべての C
フ ァ イ ル (.c) と ヘ ッ ダー フ ァ イ ル (.h) が ソ フ ト ウ ェ ア プ ロ ジ ェ ク ト に コ ピー さ れます。
次の ド ラ イ バー フ ァ イ ルは、 solution デ ィ レ ク ト リ 内の impl デ ィ レ ク ト リ で作成 さ れます。
注記 : 実際の イ ンプ リ メ ン テーシ ョ ンでは、 こ のセ ク シ ョ ンで使用 さ れてい る 「DUT」 と い う 用語が最上位デザ イ ン
名に置 き 換わ り ます。
表 4‐2 : フ ァ イル パス
フ ァ イル パス
使用モー ド
説明
data/DUT_top_v2_1_0.mdd
Standalone
ド ラ イ バー定義フ ァ イ ル
data/DUT_top_v2_1_0.tcl
Standalone
ソ フ ト ウ ェ ア を プ ロ ジ ェ ク ト に統合す る た めに SDK
で使用
src/xDUT_hw.h
両方
すべての内部レ ジ ス タ のア ド レ ス オ フ セ ッ ト を定義
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
443
C ド ラ イバー リ フ ァ レ ン ス
表 4‐2 : フ ァ イル パス
フ ァ イル パス
使用モー ド
説明
src/xDUT.h
両方
API 定義
src/xDUT.c
両方
Standard API イ ンプ リ メ ン テーシ ョ ン
src/xDUT_sinit.c
Standalone
初期化 API イ ンプ リ メ ン テーシ ョ ン
src/xDUT_linux.c
Linux
初期化 API イ ンプ リ メ ン テーシ ョ ン
src/Makefile
Standalone
Makefile
xDUT.h フ ァ イ ルでは 2 つの struct が定義 さ れ る
•
XDut_Config : こ れは、IP イ ン ス タ ン ス の コ ン フ ィ ギ ュ レーシ ョ ン情報 (各 AXI4 Lite Slave のベース ア ド レ ス) を
維持す る ために使用 さ れます。
•
XDut : こ れは IP イ ン ス タ ン ス を維持する ために使用 さ れます。 ほ と ん ど の API では こ の イ ン タ ーフ ェ イ ス ポ イ
ン タ ーを最初の引数 と し て認識 し ます。
標準 API は xDUT.c フ ァ イ ルに含まれてお り 、 次の関数が提供 さ れてい ます。
•
デバ イ ス を初期化
•
デバ イ ス を制御 し 、 その ス テー タ ス を ク エ リ ー
•
内部レ ジ ス タ を読み出 し /書 き 込み
•
割 り 込みを設定
次の関数は、 デバ イ ス を初期化す る ために使用 さ れます。
int XDut_Initialize(XDut *InstancePtr, u16 DeviceId);
デバ イ ス を初期化 し ます。 こ の API は InstancePtr に適切な値を書 き 込みます。 こ の後、 ほかの API で使用で き ます。
こ の API を呼び出 し てデバ イ ス を初期化す る こ と をお勧め し ます。 ただ し 、 MMU がシ ス テ ムで使用 さ れてい る と き
は、 XDut_CfgInitialize を使用 し て く だ さ い。
•
InstancePtr : デバ イ ス イ ン ス タ ン スへのポ イ ン タ ー
•
DeviceId : xparameters.h で定義 さ れたデバ イ ス ID
•
Return : XST_SUCCESS は問題がなかっ た こ と を示 し ます。 それ以外の場合は、 問題があ っ た こ と を示 し ます。
XDut_Config* XDut_LookupConfig(u16 DeviceId);
こ の関数は、 ID を指定 し てデバ イ ス の コ ン フ ィ ギ ュ レーシ ョ ン情報を取得 し ます。
•
DeviceId :xparameters.h で定義 さ れたデバ イ ス ID
•
Return :デバ イ ス ID が DeviceId のデバ イ ス の コ ン フ ィ ギ ュ レーシ ョ ン情報を保持す る XDut_LookupConfig 変数
へのポ イ ン タ ーです。 一致す る Deviceid が見つか ら なか っ た場合は NULL にな り ます。
int XDut_CfgInitialize(XDut *InstancePtr, XDut_Config *ConfigPtr);
シ ス テ ム に MMU が 使 用 さ れ る と デ バ イ ス を 初期化 し ま す。 こ の 場合、 AXI4Lite Slave の 有効 な ア ド レ ス が
xparameters.h で定義 さ れた も の と 異な り 、 デバ イ ス を初期化す る のに API が必要にな り ます。
•
InstancePtr : デバ イ ス イ ン ス タ ン スへのポ イ ン タ ー
•
DeviceId : XDut_Config へのポ イ ン タ ー
•
Return : XST_SUCCESS は問題がなかっ た こ と を示 し ます。 それ以外の場合は、 問題があ っ た こ と を示 し ます。
デバ イ ス のデー タ ポー ト は、 次の関数を使用する と AXI4 Lite イ ン タ ーフ ェ イ ス を介 し て ア ク セ ス で き ます。
void XDut_Start(XDut *InstancePtr);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
444
C ド ラ イバー リ フ ァ レ ン ス
デバ イ ス を起動 し ます。 こ の関数は、 デバ イ ス の ap_start ポー ト を アサー ト し ます。 デバ イ ス に ap_start ポー ト があ
る 場合にのみ使用で き ます。
•
InstancePtr : デバ イ ス イ ン ス タ ン スへのポ イ ン タ ー
void XDut_IsDone(XDut *InstancePtr);
デバ イ ス が前の実行を終了 し たか ど う か をチ ェ ッ ク し ます。 こ の関数では、 デバ イ ス の ap_done ポー ト の値が戻 さ れ
ます。 デバ イ ス に ap_done ポー ト があ る 場合にのみ使用で き ます。
•
InstancePtr : デバ イ ス イ ン ス タ ン スへのポ イ ン タ ー
void XDut_IsIdle(XDut *InstancePtr);
デバ イ ス がア イ ド ル ス テー ト か ど う か をチ ェ ッ ク し ます。 こ の関数では、 デバ イ ス の ap_idle ポー ト の値が戻 さ れま
す。 デバ イ ス に ap_idle ポー ト があ る 場合にのみ使用で き ます。
•
InstancePtr :デバ イ ス イ ン ス タ ン スへのポ イ ン タ ー
void XDut_EnableAutoRestart(XDut *InstancePtr);
デバ イ ス での自動再開を イ ネーブルに し ます。 イ ネーブルの場合は、 次が実行 さ れます。
•
ap_done がデバ イ ス に よ り アサー ト さ れ る と 、 す ぐ に ap_start ポー ト を アサー ト し ます。 デバ イ スは、 次の ト ラ ン
ザ ク シ ョ ン を自動的に開始 し ます。
•
ま たは、 ブ ロ ッ ク レベルの I/O プ ロ ト コ ル ap_ctrl_chain がデバ イ ス に イ ンプ リ メ ン ト さ れてい る 場合、 ap_ready
が デ バ イ ス に よ り ア サ ー ト さ れ る と ap_start を ア サ ー ト し 、 ap_done が デバ イ ス に よ り ア サ ー ト さ れ る と
ap_continue を アサー ト し て、 次の ト ラ ンザ ク シ ョ ン を自動的に再開 し ます。
デバ イ ス に ap_start ポー ト があ る 場合にのみ使用で き ます。
•
InstancePtr : デバ イ ス イ ン ス タ ン スへのポ イ ン タ ー
void XDut_DisableAutoRestart(XDut *InstancePtr);
自動再開をデ ィ ス エーブルに し ます。 デバ イ ス に ap_start ポー ト があ る 場合にのみ使用で き ます。
•
InstancePtr : デバ イ ス イ ン ス タ ン スへのポ イ ン タ ー
void XDut_SetArg(XDut *InstancePtr, u32 Data);
Arg ポー ト に値 (top 関数の ス カ ラ ー引数) を書き 込みます。 Arg が入力ポー ト の場合にのみ使用で き ます。
•
InstancePtr : デバ イ ス イ ン ス タ ン スへのポ イ ン タ ー
•
Data : 書 き 込む値です。
u32 XDut_GetArg(XDut *InstancePtr);
Arg か ら 値を読み出 し ます。 .Arg ポー ト がデバ イ ス の出力ポー ト の場合にのみ使用で き ます。
•
InstancePtr : デバ イ ス イ ン ス タ ン スへのポ イ ン タ ー
Return : Arg の値です。 .
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
445
C ラ イブラ リ リ フ ァ レンス
C ラ イブ ラ リ リ フ ァ レンス
Vivado HLS の video 関数
こ のセ ク シ ョ ンでは、 Vivado HLS の video 関数について説明 し ます。
•
OpenCV イ ン タ ーフ ェ イ ス関数
標準 OpenCV デー タ 型にデー タ を変換 し た り 、標準 OpenCV デー タ 型か ら AXI4 ス ト リ ー ミ ン グ プ ロ ト コ ルに変
換 し た り し ます。
•
AXI4 Stream I/O 関数
AXI4 ス ト リ ー ミ ン グ プ ロ ト コ ルを ビデオ プ ロ セ ッ シ ン グ関数で使用 さ れ る hsl::Mat デー タ 型に変換で き ま
す。
•
ビデオ プ ロ セ ッ シ ン グ関数
ビデオ イ メ ージ を操作す る ための標準 OpenCV 関数 と 互換性があ り ます。
既存 OpenCV の コ ン テ キ ス ト で ビ デオ関数の詳細お よ び手法につい ては、 ア プ リ ケーシ ョ ン ノ ー ト 『Accelerating
OpenCV Applications with Zynq using Vivado HLS Video Libraries』 (XAPP1167) を参照 し て く だ さ い。
OpenCV イ ン タ ー フ ェ イ ス関数
OpenCV 関数を使用 し た典型的な ビデオ シ ス テ ムの場合、 ほ と ん ど のアルゴ リ ズ ムが CPU に残っ た ま ま、OpenCV 関
数 を 使用 し 続け ま す。 FPGA フ ァ ブ リ ッ ク での ア ク セ ラ レ ーシ ョ ン が必要な アル ゴ リ ズ ム だ けが合成 さ れ る ので、
Vivado HLS の video 関数を使用す る よ う にア ッ プデー ト さ れます。
AXI4 ス ト リ ー ミ ン グ プ ロ ト コ ルは CPU に残っ た ま ま の コ ー ド と 合成 さ れ る 関数間の イ ン タ ーフ ェ イ ス と し て よ く
使用 さ れ る ので、 CPU で実行 さ れ る OpenCV コ ー ド と FPGA フ ァ ブ リ ッ ク で実行 さ れ る 合成済みハー ド ウ ェ ア関数
間のデー タ 転送を可能にす る ために、 OpenCV 関数が提供 さ れてい ます。
デー タ を合成 さ れ る 関数に渡す前に変換す る ために イ ン タ ーフ ェ イ ス関数を使用す る と 、 ハ イ パフ ォーマ ン ス シ ス
テ ム にで き ま す。 こ の関数、 た と えば hls::Mat には、 デー タ の転送だけでな く 、 Vivado HLS の video ラ イ ブ ラ リ
デー タ 型 と OpenCV デー タ 形式間を変換する 機能が含まれます。
OpenCV 関数を使用す る には、 ヘ ッ ダー フ ァ イ ル hls_opencv.h を含め る 必要があ り ます。 こ れ ら の関数は、 CPU
に残っ た コ ー ド で使用 さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
446
C ラ イブラ リ リ フ ァ レンス
IplImage2AXIvideo
コー ド例
template<int W> void IplImage2AXIvideo (
IplImage* img,
hls::stream<ap_axiu<W,1,1,1> >& AXI_video_strm);
パラ メ ー タ ー
表 4‐3 : パラ メ ー タ ー
パラ メ ー タ ー
説明
img
OpenCV IplImage 形式の入力 イ メ ージ ヘ ッ ダー
AXI_video_strm
hls::stream 形式 (AXI4-Stream プ ロ ト コ ル と 互換性
あ り ) の出力 AXI ビデオ ス ト リ ーム
説明
•
OpenCV の IplImage 形式か ら のデー タ を AXI ビデオ ス ト リ ーム (hls::stream) 形式に変換 し ます。
•
イ メ ージ デー タ は img に格納す る 必要があ り ます。
•
AXI_video_strm は起動前に空にな っ てい る 必要があ り ます。
•
img の ピ ク セルのデー タ 幅 (ビ ッ ト ) は W (AXI4-Stream プ ロ ト コ ルの TDATA のデー タ 幅) 未満にす る 必要があ り
ます。
AXIvideo2IplImage
コー ド例
template<int W> void AXIvideo2IplImage (
hls::stream<ap_axiu<W,1,1,1> >& AXI_video_strm,
IplImage* img);
パラ メ ー タ ー
表 4‐4 : パラ メ ー タ ー
パラ メ ー タ ー
説明
AXI_video_strm
hls::stream 形式 (AXI4-Stream プ ロ ト コ ル と 互換性
あ り ) の入力 AXI ビデオ ス ト リ ーム
img
OpenCV IplImage 形式の出力 イ メ ージ ヘ ッ ダー
説明
•
AXI ビデオ ス ト リ ーム (hls::stream) 形式か ら デー タ を OpenCV の IplImage 形式に変換 し ます。
•
イ メ ージ デー タ は AXI_video_strm に格納する 必要があ り ます。
•
こ の関数を起動す る と 、 AXI_video_strm のデー タ が消費 さ れます。
•
img の ピ ク セルのデー タ 幅は W (AXI4-Stream プ ロ ト コ ルの TDATA のデー タ 幅) 未満にする 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
447
C ラ イブラ リ リ フ ァ レンス
cvMat2AXIvideo
コー ド例
template<int W> void cvMat2AXIvideo (
cv::Mat& cv_mat,
hls::stream<ap_axiu<W,1,1,1> >& AXI_video_strm);
パラ メ ー タ ー
表 4‐5 : パラ メ ー タ ー
パラ メ ー タ ー
説明
cv_mat
OpenCV cv::Mat 形式の入力 イ メ ージ
AXI_video_strm
hls::stream 形式 (AXI4-Stream プ ロ ト コ ル と 互換性
あ り ) の出力 AXI ビデオ ス ト リ ーム
説明
•
OpenCV の cv::Mat 形式か ら のデー タ を AXI ビデオ ス ト リ ーム (hls::stream) 形式に変換 し ます。
•
イ メ ージ デー タ は cv_mat に格納する 必要があ り ます。
•
AXI_video_strm は起動前に空にな っ てい る 必要があ り ます。
•
cv_mat の ピ ク セルのデー タ 幅 (ビ ッ ト ) は W (AXI4-Stream プ ロ ト コ ルの TDATA のデー タ 幅) 未満にす る 必要が
あ り ます。
AXIvideo2cvMat
コー ド例
template<int W> void AXIvideo2cvMat (
hls::stream<ap_axiu<W,1,1,1> >& AXI_video_strm,
cv::Mat& cv_mat);
パラ メ ー タ ー
•
AXI ビデオ ス ト リ ーム (hls::stream) 形式か ら デー タ を OpenCV の cv::Mat 形式に変換 し ます。
•
イ メ ージ デー タ は AXI_video_strm に格納する 必要があ り ます。
•
こ の関数を起動す る と 、 AXI_video_strm のデー タ が消費 さ れます。
•
cv_mat の ピ ク セルのデー タ 幅は W (AXI4-Stream プ ロ ト コ ルの TDATA のデー タ 幅) 未満にす る 必要があ り ま
す。
説明
•
OpenCV の cv::Mat 形式か ら のデー タ を AXI ビデオ ス ト リ ーム (hls::stream) 形式に変換 し ます。
•
イ メ ージ デー タ は cv_mat に格納する 必要があ り ます。
•
AXI_video_strm は起動前に空にな っ てい る 必要があ り ます。
•
cv_mat の ピ ク セルのデー タ 幅 (ビ ッ ト ) は W (AXI4-Stream プ ロ ト コ ルの TDATA のデー タ 幅) 未満にす る 必要が
あ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
448
C ラ イブラ リ リ フ ァ レンス
CvMat2AXIvideo
コー ド例
template<int W> void CvMat2AXIvideo (
CvMat* cvmat,
hls::stream<ap_axiu<W,1,1,1> >& AXI_video_strm);
パラ メ ー タ ー
表 4‐6 : パラ メ ー タ ー
パラ メ ー タ ー
説明
cvmat
OpenCV の CvMat 形式への入力 イ メ ージ ポ イ ン タ ー
AXI_video_strm
hls::stream 形式 (AXI4-Stream プ ロ ト コ ル と 互換性
あ り ) の出力 AXI ビデオ ス ト リ ーム
説明
•
OpenCV の CvMat 形式か ら のデー タ を AXI ビデオ ス ト リ ーム (hls::stream) 形式に変換 し ます。
•
イ メ ージ デー タ は cvmat に格納す る 必要があ り ます。
•
AXI_video_strm は起動前に空にな っ てい る 必要があ り ます。
•
cvmat の ピ ク セルのデー タ 幅 (ビ ッ ト ) は W (AXI4-Stream プ ロ ト コ ルの TDATA のデー タ 幅) 未満にす る 必要が
あ り ます。
AXIvideo2CvMat
コー ド例
template<int W> void AXIvideo2CvMat (
hls::stream<ap_axiu<W,1,1,1> >& AXI_video_strm,
CvMat* cvmat);
パラ メ ー タ ー
表 4‐7 : パラ メ ー タ ー
パラ メ ー タ ー
説明
AXI_video_strm
hls::stream 形式 (AXI4-Stream プ ロ ト コ ル と 互換性
あ り ) の入力 AXI ビデオ ス ト リ ーム
cvmat
OpenCV の CvMat 形式への出力 イ メ ージ ポ イ ン タ ー
説明
•
AXI ビデオ ス ト リ ーム (hls::stream) 形式か ら デー タ を OpenCV の CvMat 形式に変換 し ます。
•
イ メ ージ デー タ は AXI_video_strm に格納する 必要があ り ます。
•
こ の関数を起動す る と 、 AXI_video_strm のデー タ が消費 さ れます。
•
cvmat の ピ ク セルのデー タ 幅は W (AXI4-Stream プ ロ ト コ ルの TDATA のデー タ 幅) 未満にする 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
449
C ラ イブラ リ リ フ ァ レンス
IplImage2hlsMat
コー ド例
template<int ROWS, int COLS, int T> void IplImage2hlsMat (
IplImage* img,
hls::Mat<ROWS, COLS, T>& mat);
パラ メ ー タ ー
表 4‐8 : パラ メ ー タ ー
パラ メ ー タ ー
説明
img
OpenCV の IplImage 形式の入力 イ メ ージ ヘ ッ ダー
mat
hls::Mat 形式の出力 イ メ ージ
説明
•
OpenCV の IplImage 形式か ら のデー タ を hls::Mat 形式に変換 し ます。
•
イ メ ージ デー タ は img に格納す る 必要があ り ます。
•
mat は起動前に空にな っ てい る 必要があ り ます。
•
引数 img お よ び mat は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
hlsMat2IplImage
コー ド例
template<int ROWS, int COLS, int T> void hlsMat2IplImage (
hls::Mat<ROWS, COLS, T>& mat,
IplImage* img);
パラ メ ー タ ー
表 4‐9 : パラ メ ー タ ー
パラ メ ー タ ー
説明
mat
hls::Mat 形式の入力 イ メ ージ
img
OpenCV の IplImage 形式の出力 イ メ ージ ヘ ッ ダー
説明
•
hls::Mat 形式か ら のデー タ を OpenCV の IplImage 形式に変換 し ます。
•
イ メ ージ デー タ は mat に格納す る 必要があ り ます。
•
こ の関数を起動す る と 、 mat のデー タ が消費 さ れます。
•
引数 mat お よ び img は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
cvMat2hlsMat
コー ド例
template<int ROWS, int COLS, int T> void cvMat2hlsMat (
cv::Mat* cv_mat,
hls::Mat<ROWS, COLS, T>& mat);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
450
C ラ イブラ リ リ フ ァ レンス
パラ メ ー タ ー
表 4‐10 : パラ メ ー タ ー
パラ メ ー タ ー
説明
cv_mat
OpenCV cv::Mat 形式の入力 イ メ ージ
mat
hls::Mat 形式の出力 イ メ ージ
説明
•
OpenCV の cv::Mat 形式か ら のデー タ を hls::Mat 形式に変換 し ます。
•
イ メ ージ デー タ は cv_mat に格納する 必要があ り ます。
•
mat は起動前に空にな っ てい る 必要があ り ます。
•
引数 cv_mat お よ び mat は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
hlsMat2cvMat
コー ド例
template<int ROWS, int COLS, int T> void hlsMat2cvMat (
hls::Mat<ROWS, COLS, T>& mat,
cv::Mat& cv_mat);
パラ メ ー タ ー
表 4‐11 : パラ メ ー タ ー
パラ メ ー タ ー
説明
mat
hls::Mat 形式の入力 イ メ ージ
cv_mat
OpenCV cv::Mat 形式の出力 イ メ ージ
説明
•
hls::Mat 形式か ら のデー タ を OpenCV の cv::Mat 形式に変換 し ます。
•
イ メ ージ デー タ は mat に格納す る 必要があ り ます。
•
こ の関数を起動す る と 、 mat のデー タ が消費 さ れます。
•
引数 mat お よ び cv_mat は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
451
C ラ イブラ リ リ フ ァ レンス
CvMat2hlsMat
コー ド例
template<int ROWS, int COLS, int T> void CvMat2hlsMat (
CvMat* cvmat,
hls::Mat<ROWS, COLS, T>& mat);
パラ メ ー タ ー
表 4‐12 : パラ メ ー タ ー
パラ メ ー タ ー
説明
cvmat
OpenCV の CvMat 形式への入力 イ メ ージ ポ イ ン タ ー
mat
hls::Mat 形式の出力 イ メ ージ
説明
•
OpenCV の CvMat 形式か ら のデー タ を hls::Mat 形式に変換 し ます。
•
イ メ ージ デー タ は cvmat に格納す る 必要があ り ます。
•
mat は起動前に空にな っ てい る 必要があ り ます。
•
引数 cvmat お よ び mat は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
hlsMat2CvMat
コー ド例
template<int ROWS, int COLS, int T> void hlsMat2CvMat (
hls::Mat<ROWS, COLS, T>& mat,
CvMat* cvmat);
パラ メ ー タ ー
表 4‐13 : パラ メ ー タ ー
パラ メ ー タ ー
説明
mat
hls::Mat 形式の入力 イ メ ージ
cvmat
OpenCV cv::Mat 形式の出力 イ メ ージ ポ イ ン タ ー
説明
•
hls::Mat 形式か ら のデー タ を OpenCV の CvMat 形式に変換 し ます。
•
イ メ ージ デー タ は mat に格納す る 必要があ り ます。
•
こ の関数を起動す る と 、 mat のデー タ が消費 さ れます。
•
引数 mat お よ び cvmat は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
452
C ラ イブラ リ リ フ ァ レンス
CvMat2hlsWindow
コー ド例
template<int ROWS, int COLS, typename T> void CvMat2hlsWindow (
CvMat* cvmat,
hls::Window<ROWS, COLS, T>& window);
パラ メ ー タ ー
表 4‐14 : パラ メ ー タ ー
パラ メ ー タ ー
説明
cvmat
OpenCV の CvMat 形式への入力 2D ウ ィ ン ド ウ
window
hls::Window 形式の出力 2D ウ ィ ン ド ウ
説明
•
OpenCV の CvMat 形式か ら のデー タ を hls::Window 形式に変換 し ます。
•
イ メ ージ デー タ は cvmat に格納す る 必要があ り ます。
•
window は起動前に空にな っ てい る 必要があ り ます。
•
引数 cvmat お よ び window はシ ン グルチ ャ ネルで、同 じ サ イ ズであ る 必要があ り ます。 こ の関数は、主に イ メ ー
ジ プ ロ セ ッ シ ン グ カーネルを変換す る ために使用 し ます。
hlsWindow2CvMat
コー ド例
template<int ROWS, int COLS, typename T> void hlsWindow2hlsCvMat (
hls::Window<ROWS, COLS, T>& window,
CvMat* cvmat);
パラ メ ー タ ー
表 4‐15 : パラ メ ー タ ー
パラ メ ー タ ー
説明
window
hls::Window 形式の入力 2D ウ ィ ン ド ウ
cvmat
OpenCV の CvMat 形式への出力 2D ウ ィ ン ド ウ ポ イ ン
ター
説明
•
hls::Window 形式か ら のデー タ を OpenCV の CvMat 形式に変換 し ます。
•
イ メ ージ デー タ は window に格納する 必要があ り ます。
•
こ の関数を起動す る と 、 window のデー タ が消費 さ れます。
•
引数 mat お よ び window はシ ン グルチ ャ ネルで、 同 じ サ イ ズであ る 必要があ り ます。 こ の関数は、 主に イ メ ー
ジ プ ロ セ ッ シ ン グ カーネルを変換す る ために使用 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
453
C ラ イブラ リ リ フ ァ レンス
AXI4‐Stream I/O 関数
OpenCV イ ン タ ーフ ェ イ ス関数は、 合成 さ れ る 関数のデー タ を転送する ために使用 さ れます。 合成 さ れ る ほ と ん ど の
ビデオ関数が イ メ ージに hls::Mat デー タ 型を使用 し ます。
次に説明す る AXI4-Stream I/O 関数を使用す る と 、 hls::Mat デー タ 型 と OpenCV イ ン タ ーフ ェ イ ス関数で使用 さ れ
る AXI4-Stream デー タ 型 (hls::stream) を変換で き ます。
hls::AXIvideo2Mat
コー ド例
template<int W, int ROWS, int COLS, int T> int hls::AXIvideo2Mat (
hls::stream<ap_axiu<W,1,1,1> >& AXI_video_strm,
hls::Mat<ROWS, COLS, T>& mat);
パラ メ ー タ ー
表 4‐16 : パラ メ ー タ ー
パラ メ ー タ ー
説明
AXI_video_strm
hls::stream 形式 (AXI4-Stream プ ロ ト コ ル と 互換性
あ り ) の入力 AXI ビデオ ス ト リ ーム
mat
hls::Mat 形式の出力 イ メ ージ
説明
•
hls::Mat 形式 と し て格納 さ れた イ メ ージ デー タ を AXI4 ビデオ ス ト リ ーム形式 (hls::stream) に変換 し ま
す。
•
イ メ ージ デー タ は AXI_video_strm に格納する 必要があ り ます。
•
mat のデー タ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 AXI_video_strm のデー タ が消費 さ れ、 mat の イ メ ージ デー タ が満た さ れます。
•
mat の ピ ク セルのデー タ 幅は W (AXI4-Stream プ ロ ト コ ルの TDATA のデー タ 幅) 未満にする 必要があ り ます。
•
こ の関数を使用す る と 、 TUSER ビ ッ ト が検出 さ れて入力フ レームの左上の ピ ク セルがマー ク さ れ、 入力ビデオ
ス ト リ ーム の フ レーム同期が実行で き る よ う にな り ます。 TLAST 入力を検出す る こ と で、 予測 さ れない ラ イ ン
長を示す ERROR_IO_EOL_EARLY ま たは ERROR_IO_EOL_LATE と いっ た ビ ッ ト エ ラ ーが戻 さ れます。
hls::Mat2AXIvideo
コー ド例
template<int W, int ROWS, int COLS, int T> int hls::AXIvideo2Mat (
hls::Mat<ROWS, COLS, T>& mat,
hls::stream<ap_axiu<W,1,1,1> >& AXI_video_strm);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
454
C ラ イブラ リ リ フ ァ レンス
パラ メ ー タ ー
表 4‐17 : パ ラ メ ー タ ー
パラ メ ー タ ー
説明
mat
hls::Mat 形式の入力 イ メ ージ
AXI_video_strm
hls::stream 形式 (AXI4-Stream プ ロ ト コ ル と 互換性
あ り ) の出力 AXI ビデオ ス ト リ ーム
説明
•
AXI4 ビデオ ス ト リ ーム (hls::stream) 形式で格納 さ れた イ メ ージ デー タ を hls::Mat 形式の イ メ ージに変
換 し ます。
•
イ メ ージ デー タ は mat に格納す る 必要があ り ます。
•
AXI_video_strm のデー タ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 mat のデー タ が消費 さ れ、 AXI_video_strm の イ メ ージ デー タ が満た さ れます。
•
mat の ピ ク セルのデー タ 幅は W (AXI4-Stream プ ロ ト コ ルの TDATA のデー タ 幅) 未満にする 必要があ り ます。
•
こ の関数では、 AXI ビデオ ス ト リ ームに イ メ ージ デー タ を満たすために、 左上の ピ ク セルを示すス ト リ ーム エ
レ メ ン ト の TUSER ビ ッ ト を設定 し た り 、行末を示す各行の最後の ピ ク セルに TLAST ビ ッ ト を設定 し た り も さ れ
ます。
ビデオ プ ロ セ ッ シ ング関数
Vivado HLS ビデオ ラ イ ブ ラ リ に含まれ る ビデオ プ ロ セ ッ シ ン グ関数は、ビデオ イ メ ージ を操作す る ための も のです。
こ れ ら のほ と ん ど の関数が同 じ よ う な使用方法の該当す る OpenCV 関数を促進する よ う に設計 さ れてい ます。
hls::AbsDiff
コー ド例
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void hls::AbsDiff (
hls::Mat<ROWS, COLS, SRC1_T>& src1,
hls::Mat<ROWS, COLS, SRC2_T>& src2,
hls::Mat<ROWS, COLS, DST_T>& dst);
パラ メ ー タ ー
表 4‐18 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src1
1 つ目の入力 イ メ ージ
src2
2 つ目の入力 イ メ ージ
dst
出力 イ メ ージ
説明
•
2 つの入力 イ メ ージ、 src1 お よ び src2 間の絶対的な違いを計算 し て、 結果を dst に保存 し ます。
•
イ メ ージ デー タ は src1 お よ び src2 に格納する 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src1 お よ び src2 のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
455
C ラ イブラ リ リ フ ァ レンス
•
src1 お よ び src2 は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
•
dst は、 入力 と 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvAbsDiff
•
cv::absdiff
hls::AddS
コー ド例
mask な し
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void hls::AddS (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Scalar<HLS_MAT_CN(SRC_T), _T>& scl,
hls::Mat<ROWS, COLS, DST_T>& dst);
mask あ り
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void hls::AddS (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Scalar<HLS_MAT_CN(SRC_T), _T>& scl,
hls::Mat<ROWS, COLS, DST_T>& dst,
hls::Mat<ROWS, COLS, HLS_8UC1>& mask,
hls::Mat<ROWS, COLS, DST_T>& dst_ref);
パラ メ ー タ ー
表 4‐19 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
scl
入力ス カ ラ ー
dst
出力 イ メ ージ
mask
演算 mask は計測 さ れ る dst イ メ ージのエ レ メ ン ト を指
定する 8 ビ ッ ト チ ャ ネルの イ メ ージ
dst_ref
mask(I) = 0 の場合の出力 イ メ ージのエ レ メ ン ト を格
納する リ フ ァ レ ン ス イ メ ージ
説明
•
エ レ メ ン ト ご と の イ メ ージ src お よ びス カ ラ ー scl の合計を計算 し ます。
•
その結果を dst に保存 し ます。
•
mask あ り で計算 し た場合 :
•
イ メ ージ デー タ は src に格納 し (mask を使用 し て計算 し た場合、mask と dst_ref にはデー タ が格納 さ れてい
る 必要あ り )、 dst の イ メ ージ デー タ は起動前に空にする 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
456
C ラ イブラ リ リ フ ァ レンス
•
こ の関数を開始す る と 、 src のデー タ が消費 さ れ (mask を使用 し て計算 し た場合、 mask と dst_ref のデー タ
も 消費 さ れ る )、 dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び s c l のチ ャ ネル数は同 じ であ る 必要があ り ます。 dst_ref のサ イ ズお よ びチ ャ ネル数は src と 同 じ
であ る 必要があ り ます。 mask は src と 同 じ サ イ ズであ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvAddS
•
cv::add
hls::AddWeighted
コー ド例
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T, typename P_T>
void hls::AddWeighted (
hls::Mat<ROWS, COLS, SRC1_T>& src1,
P_T alpha,
hls::Mat<ROWS, COLS, SRC2_T>& src2,
P_T beta,
P_T gamma,
hls::Mat<ROWS, COLS, DST_T>& dst);
パラ メ ー タ ー
表 4‐20 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src1
1 つ目の入力 イ メ ージ
alpha
1 つ目の イ メ ージエ レ メ ン ト の重み
src2
2 つ目の入力 イ メ ージ
beta
2 つ目の イ メ ージエ レ メ ン ト の重み
gamma
各合計に追加 さ れ る ス カ ラ ー
dst
出力 イ メ ージ
説明
•
2 つの イ メ ージ src1 と src2 の重み付 き のエ レ メ ン ト ご と に合計を計算 し ます。
•
その結果を dst に保存 し ます。
•
重み付 き の合計は、 次の よ う に計算 さ れます。
•
イ メ ージ デー タ は src1 お よ び src2 に格納する 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src1 お よ び src2 のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
3 つのパ ラ メ ー タ ー、 alpha、 beta、 gamma のデー タ 型は同 じ であ る 必要があ り ます。
•
src1 お よ び src2 は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
•
dst は、 入力 と 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
457
C ラ イブラ リ リ フ ァ レンス
OpenCV リ フ ァ レ ン ス
•
cvAddWeighted
•
cv::addWeighted
hls::And
コー ド例
mask な し
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void hls::And (
hls::Mat<ROWS, COLS, SRC1_T>& src1,
hls::Mat<ROWS, COLS, SRC2_T>& src2,
hls::Mat<ROWS, COLS, DST_T>& dst);
mask あ り
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void hls::And (
hls::Mat<ROWS, COLS, SRC1_T>& src1,
hls::Mat<ROWS, COLS, SRC2_T>& src2,
hls::Mat<ROWS, COLS, DST_T>& dst,
hls::Mat<ROWS, COLS, HLS_8UC1>& mask,
hls::Mat<ROWS, COLS, DST_T>& dst_ref);
パラ メ ー タ ー
表 4‐21 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src1
1 つ目の入力 イ メ ージ
src2
2 つ目の入力ス カ ラ ー
dst
出力 イ メ ージ
mask
演算 mask は計測 さ れ る dst イ メ ージのエ レ メ ン ト を指定す る
8 ビ ッ ト チ ャ ネルの イ メ ージ
dst_ref
mask(I) = 0 の場合の出力 イ メ ージ の エ レ メ ン ト を 格納す る リ
フ ァ レ ン ス イ メ ージ
説明
•
2 つの イ メ ージ、 src1 お よ び src2 のビ ッ ト の論理積を エ レ メ ン ト ご と に計算 し ます。
•
結果を イ メ ージ dst と し て戻 し ます。
•
mask あ り で計算 し た場合 :
•
イ メ ージ デー タ は src1 お よ び src2 に格納する 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
mask を使用 し て計算 し た場合、 mask と dst_ref にはデー タ が格納 さ れてい る 必要あ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
458
C ラ イブラ リ リ フ ァ レンス
こ の関数を開始す る と 、 次の よ う にな り ます。
•
°
src1 お よ び src2 のデー タ が消費 さ れます。
注記 : mask を使用 し て計算 さ れた場合は、 mask お よ び dst_ref のデー タ も 消費 さ れます。
°
dst の イ メ ージ デー タ が満た さ れます。
•
src1 お よ び src2 は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
•
dst お よ び dst_ref は、 入力 と 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
•
mask は入力 と 同 じ サ イ ズであ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvAnd,
•
cv::bitwise_and
hls::Avg
コー ド例
mask な し
template<int ROWS, int COLS, int SRC_T, int DST_T>
hls::Scalar<HLS_MAT_CN(DST_T), DST_T> hls::Avg(
hls::Mat<ROWS, COLS, SRC_T>& src);
mask あ り
template<int ROWS, int COLS, int SRC_T, int DST_T>
hls::Scalar<HLS_MAT_CN(DST_T), DST_T> hls::Avg(
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, HLS_8UC1>& mask);
パラ メ ー タ ー
表 4‐22 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
mask
演算 mask は計測 さ れ る src イ メ ージのエ レ メ ン ト を指定す る
8 ビ ッ ト チ ャ ネルの イ メ ージ
説明
•
イ メ ージ src のエ レ メ ン ト の平均を計算 し ます。
•
結果を hls::Scalar 形式で戻 し ます。
•
mask あ り で計算 し た場合 :
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
mask を使用 し て計算す る 場合、 mask にデー タ が格納 さ れてい る 必要あ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
459
C ラ イブラ リ リ フ ァ レンス
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れます。
•
mask を使用 し て計算す る 場合、 mask のデー タ も 消費 さ れます。
•
src お よ び mask は同 じ サ イ ズであ る 必要があ り ます。
•
mask には 0 以外のエ レ メ ン ト が含まれ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvAvg
•
cv::mean
hls::AvgSdv
コー ド例
mask な し
template<int ROWS, int COLS, int SRC_T, typename _T>
void hls::AvgSdv(
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Scalar<HLS_MAT_CN(SRC_T), _T>& avg,
hls::Scalar<HLS_MAT_CN(SRC_T), _T>& sdv);
mask あ り
template<int ROWS, int COLS, int SRC_T, typename _T>
void hls::AvgSdv(
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Scalar<HLS_MAT_CN(SRC_T), _T>& avg,
hls::Scalar<HLS_MAT_CN(SRC_T), _T>& sdv,
hls::Mat<ROWS, COLS, HLS_8UC1>& mask);
パラ メ ー タ ー
表 4‐23 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
avg
計算 し た中間値の出力ス カ ラ ー
sdv
計算 し た標準的な偏差値の出力ス カ ラ ー
mask
演算 mask は計測 さ れ る src イ メ ージのエ レ メ ン ト を指定す る
8 ビ ッ ト チ ャ ネルの イ メ ージ
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
460
C ラ イブラ リ リ フ ァ レンス
説明
•
イ メ ージ src のエ レ メ ン ト の平均を計算 し ます。
•
結果を hls::Scalar 形式で戻 し ます。
•
mask あ り で計算 し た場合 :
X-Ref Target - Figure 4-13
図 4‐13 : Ehls::AvgSdv 演算
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
mask を使用 し て計算す る 場合、 mask にデー タ が格納 さ れてい る 必要あ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れます。
•
mask を使用 し て計算す る 場合、 mask のデー タ も 消費 さ れます。
•
引数 src お よ び mask は同 じ サ イ ズであ る 必要があ り ます。
•
mask には 0 以外のエ レ メ ン ト が含まれ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvAvgSdv
•
cv::meanStdDev
hls::Cmp
コー ド例
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void hls::Cmp (
hls::Mat<ROWS, COLS, SRC1_T>& src1,
hls::Mat<ROWS, COLS, SRC2_T>& src2,
hls::Mat<ROWS, COLS, DST_T>& dst,
int cmp_op);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
461
C ラ イブラ リ リ フ ァ レンス
パラ メ ー タ ー
表 4‐24 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src1
1 つ目の入力 イ メ ージ
src2
2 つ目の入力 イ メ ージ
dst
8 ビ ッ ト 出力のシ ン グルチ ャ ネル イ メ ージ
cmp_op
チ ェ ッ ク さ れ る エ レ メ ン ト 間の関係を指定する フ ラ グ
HLS_CMP_EQ
等号 (=)
HLS_CMP_GT
大な り (>)
HLS_CMP_GE
大な り イ コ ール (≧)
HLS_CMP_LT
小な り (<)
HLS_CMP_LE
小な り イ コ ール (≦)
HLS_CMP_NE
不等号
説明
•
2 つの入力 イ メ ージ、 src1 と src2 のエ レ メ ン ト ご と の比較を実行 し ます。
•
その結果を dst に保存 し ます。
•
比較結果が true であれば、 dst の該当エ レ メ ン ト が 255 に、 それ以外の場合は 0 に設定 さ れます。
•
イ メ ージ デー タ は src1 お よ び src2 に格納する 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src1 お よ び src2 のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src1 お よ び src2 は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
•
dst は、 入力 と 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvCmp
•
cv::compare
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
462
C ラ イブラ リ リ フ ァ レンス
hls::CmpS
コー ド例
template<int ROWS, int COLS, int SRC_T, typename P_T, int DST_T>
void hls::CmpS (
hls::Mat<ROWS, COLS, SRC1_T>& src,
P_T 値
hls::Mat<ROWS, COLS, DST_T>& dst,
int cmp_op);
パラ メ ー タ ー
表 4‐25 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
value
入力ス カ ラ ー値
dst
出力 8 ビ ッ ト のシ ン グルチ ャ ネル イ メ ージ
cmp_op
チ ェ ッ ク さ れ る エ レ メ ン ト 間の関係を指定する フ ラ グ
HLS_CMP_EQ
等号
HLS_CMP_GT
大な り
HLS_CMP_GE
大な り イ コ ール
HLS_CMP_LT
小な り
HLS_CMP_LE
小な り イ コ ール (≦)
HLS_CMP_NE
不等号
説明
•
入力 イ メ ージ src のエ レ メ ン ト と 入力値の比較を実行 し 、 結果を dst に保存 し ます。
•
比較結果が true であれば、 dst の該当エ レ メ ン ト が 255 に、 それ以外の場合は 0 に設定 さ れます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び dst は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvCmpS
•
cv::compare
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
463
C ラ イブラ リ リ フ ァ レンス
hls::CornerHarris
コー ド例
template<int blockSize,int Ksize,typename KT,int SRC_T,int DST_T,int ROWS,int COLS>
void CornerHarris(
hls::Mat<ROWS, COLS, SRC_T>
&_src,
hls::Mat<ROWS, COLS, DST_T>
&_dst,
KT k);
パラ メ ー タ ー
表 4‐26 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
検出 さ れた コ ーナーの出力マ ス ク
k
Harris 検出器パ ラ メ ー タ ー
borderType
ボーダーの処理方法
説明
•
こ の関数は、 Harris
エ ッ ジ/ コ ーナー検出器を イ ンプ リ メ ン ト し ます。 水平方向お よ び垂直方向の導関数が
Ksize*Ksize Sobel フ ィ ル タ ーを使用 し て概算 さ れ ます。 導関数の ロ ーカルの共分散行列 M は、 各ピ ク セル (x,y)
の blockSize*blockSize 近傍に収め ら れます。 こ の関数は、 関数を出力 し ます。
•
Ksize=3 のみがサポー ト さ れます。
OpenCV リ フ ァ レ ン ス
•
cvCornerHarris
•
cv::cornerHarris
hls::CvtColor
コー ド例
template<int code, int ROWS, int COLS, int SRC_T, int DST_T>
void hls::CvtColor (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
464
C ラ イブラ リ リ フ ァ レンス
パラ メ ー タ ー
表 4‐27 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
code
色変換の タ イ プのテ ンプ レー ト パ ラ メ ー タ ー
説明
•
カ ラ ー イ メ ージ と グ レース ケール イ メ ージ を変換 し ます。 変換の タ イ プは、 コ ー ド の次の値で定義 さ れます。
°
HLS_RGB2GRAY : RGB カ ラ ー イ メ ージ を グ レース ケール イ メ ージに変換
°
HLS_BGR2GRAY : BGR カ ラ ー イ メ ージ を グ レース ケール イ メ ージに変換
°
HLS_GRAY2RGB : グ レース ケール イ メ ージ を RGB イ メ ージに変換
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び dst は、 同 じ サ イ ズで、 必要なチ ャ ネル数を含んでい る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvCvtColor
•
cv::cvtColor
hls::Dilate
コー ド例
デ フ ォル ト
template<int ROWS, int COLS, int SRC_T, int DST_T>
void hls::Dilate (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst);
カスタム
template<int ROWS, int COLS, int SRC_T, int DST_T, int K_ROWS, int K_COLS, typename
K_T, int Shape_type, int ITERATIONS>
void hls::Dilate (
hls::Mat<ROWS, COLS, SRC_T>&
src,
hls::Mat<ROWS, COLS, DST_T>&
dst,
hls::Window<K_ROWS, K_COLS, K_T> & kernel);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
465
C ラ イブラ リ リ フ ァ レンス
パラ メ ー タ ー
表 4‐28 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
kernel
hls::Window ク ラ ス で定義 さ れた拡張に使用 さ れ る 構造
エ レ メ ン ト の長方形。 エ レ メ ン ト 内の ア ン カ ー位置は
(K_ROWS/2, K_COLS/2) で、 3x3 長方形の構造エ レ メ ン
ト がデフ ォ ル ト で使用 さ れます。
Shape_type
構造エ レ メ ン ト の形
HLS_SHAPE_RECT
長方形の構造エ レ メ ン ト
HLS_SHAPE_CROSS
十字架型の構造エ レ メ ン ト 。 ア ン カーで交差
HLS_SHAPE_ELLIPSE
楕円形の構造エ レ メ ン ト 。 塗 り つぶ さ れた楕円は長方形
エ レ メ ン ト に含まれ る 。
ITERATIONS
拡張が適用 さ れ る 回数
説明
•
カーネル内で構築 さ れた指定 さ れた構造エ レ メ ン ト を使用 し て イ メ ージ src を拡張 し ます。
•
その結果を dst に保存 し ます。
•
拡張に よ り 、 その最大値に基づいて ピ ク セル近傍の形が決定 さ れます。
•
イ メ ージ src の各チ ャ ネルが個別に処理 さ れます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び dst は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvDilate
•
cv::dilate
hls::Duplicate
コー ド例
template<int ROWS, int COLS, int SRC_T, int DST_T>
void hls::Duplicate (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst1,
hls::Mat<ROWS, COLS, DST_T>& dst2);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
466
C ラ イブラ リ リ フ ァ レンス
パラ メ ー タ ー
表 4‐29 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst1
1 つ目の出力 イ メ ージ
dst2
2 つ目の出力 イ メ ージ
説明
•
入力 イ メ ージ src を 2 つの出力 イ メ ージ dst1 と dst2 に コ ピー し 、 2 つのデー タ パ ス の分岐点 と し ます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst1 お よ び dst2 の イ メ ージ デー タ は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst1 と dst2 の イ メ ージ デー タ が満た さ れます。
•
src、 dst1 お よ び dst2 は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
該当な し
hls::EqualizeHist
コー ド例
template<int SRC_T, int DST_T,int ROW, int COL>
void EqualizeHist(
Mat<ROW, COL, SRC_T>&_src,
Mat<ROW, COL, DST_T>&_dst);
パラ メ ー タ ー
表 4‐30 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
説明
•
各フ レームの ヒ ス ト グ ラ ム を計算 し 、 次の フ レームの範囲を正規化す る ために使用 し ます。
•
遅延があ る と 、 イ ンプ リ メ ン テーシ ョ ンの フ レーム バ ッ フ ァ ーは使用 さ れな く な り ます。
•
ヒ ス ト グ ラ ムは こ の関数内部の ス タ テ ィ ッ ク デー タ と し て格納 さ れ る ので、 EqualizeHist への呼び出 し は 1
回 し かで き ません。
•
入力は、 HLS_8UC1 型にな る はずです。
OpenCV リ フ ァ レ ン ス
•
cvEqualizeHist
•
cv::EqualizeHist
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
467
C ラ イブラ リ リ フ ァ レンス
hls::Erode
コー ド例
デフ ォ ル ト :
template<int ROWS, int COLS, int SRC_T, int DST_T>
void hls::Erode (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst);
カスタム :
template<int Shape_type,int ITERATIONS,int SRC_T, int DST_T,
typename KN_T,int IMG_HEIGHT,int IMG_WIDTH,int K_HEIGHT,int K_WIDTH>
void Erode(
hls::Mat<IMG_HEIGHT, IMG_WIDTH, SRC_T>&_src,
hls::Mat<IMG_HEIGHT, IMG_WIDTH, DST_T>&_dst,
hls::Window<K_HEIGHT,K_WIDTH,KN_T>&_kernel)
{
パラ メ ー タ ー
表 4‐31 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
kernel
hls::Window ク ラ ス で定義 さ れた拡張に使用 さ れ る 構造
エ レ メ ン ト の長方形。 エ レ メ ン ト 内の ア ン カ ー位置は
(K_ROWS/2, K_COLS/2) で、 3x3 長方形の構造エ レ メ ン
ト がデフ ォ ル ト で使用 さ れます。
Shape_type
構造エ レ メ ン ト の形
HLS_SHAPE_RECT
長方形の構造エ レ メ ン ト
HLS_SHAPE_CROSS
十字架型の構造エ レ メ ン ト 。 交差 し てい る と こ ろがア ン
カー。
HLS_SHAPE_ELLIPSE
楕円形の構造エ レ メ ン ト 。 塗 り つぶ さ れた楕円は長方形
エ レ メ ン ト に含まれ る 。
ITERATIONS
削減が適用 さ れ る 回数
説明
•
カーネル内で構築 さ れた指定 さ れた構造エ レ メ ン ト を使用 し て イ メ ージ src を削減 し ます。
•
その結果を dst に保存 し ます。
•
削減に よ り 、 その最大値に基づいて ピ ク セル近傍の形が決定 さ れ、 イ メ ージ src の各チ ャ ネルが個別に処理 さ
れます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
468
C ラ イブラ リ リ フ ァ レンス
src お よ び dst は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
•
OpenCV リ フ ァ レ ン ス
•
cvErode
•
cv::erode
hls::FASTX
コー ド例
template<int SRC_T,int ROWS,int COLS>
void FASTX(
hls::Mat<ROWS,COLS,SRC_T>
&_src,
hls::Mat<ROWS,COLS,HLS_8UC1> &_mask,
int
_threshold,
bool
_nomax_supression);
template<typename T, int N, int SRC_T,int ROWS,int COLS>
void FASTX(
hls::Mat<ROWS,COLS,SRC_T>
&_src,
Point_<T> (&_keypoints)[N],
int
_threshold,
bool
_nomax_supression);
パラ メ ー タ ー
表 4‐32 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
mask
コ ーナーが検出 さ れた値 255 の出力 イ メ ージ
keypoints
検出 さ れた コ ーナーの座標のア レ イ
threshold
FAST 検出器の し き い値。ピ ク セルが window の真ん中の
ピ ク セル と こ の し き い値以上異な る 場合、 light ま た は
dark ピ ク セルのいずれかにな り ます。
nomax_supression
true の場合、 最大エ ッ ジ以外のエ ッ ジ抑制を イ ネーブル
に し ます。
説明
•
FAST コ ーナー検出器を イ ンプ リ メ ン ト し 、 コ ーナーの mask ま たは座標のア レ イ を生成 し ます。
OpenCV リ フ ァ レ ン ス
•
cvFAST
•
cv::FASTX
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
469
C ラ イブラ リ リ フ ァ レンス
hls::Filter2D
コー ド例
template<typename BORDERMODE, int SRC_T, int DST_T, typename KN_T, typename POINT_T,
int IMG_HEIGHT,int IMG_WIDTH,int K_HEIGHT,int K_WIDTH>
void Filter2D(
Mat<IMG_HEIGHT, IMG_WIDTH, SRC_T>&_src,
Mat<IMG_HEIGHT, IMG_WIDTH, DST_T> &_dst,
Window<K_HEIGHT,K_WIDTH,KN_T>&_kernel,
Point_<POINT_T>anchor)
template<int SRC_T, int DST_T, typename KN_T, typename POINT_T,
int IMG_HEIGHT,int IMG_WIDTH,int K_HEIGHT,int K_WIDTH>
void Filter2D(
Mat<IMG_HEIGHT, IMG_WIDTH, SRC_T>&_src,
Mat<IMG_HEIGHT, IMG_WIDTH, DST_T> &_dst,
Window<K_HEIGHT,K_WIDTH,KN_T>&_kernel,
Point_<POINT_T>anchor)
anchor);
パラ メ ー タ ー
表 4‐33 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
kernel
hls::Window ク ラ ス で定義 さ れた 2D フ ィ ル タ ーの カー
ネル
anchor
カ ーネル内で フ ィ ル タ ー さ れた地点の相対的な位置 を
示すカーネルのア ン カー
説明
•
指定 し た カーネルを使用 し て任意線形フ ィ ル タ ーを イ メ ージ src に適用 し ます。
•
結果を イ メ ージ dst に保存 し ます。
•
こ の関数では、 カーネルを使用 し て相互関係が計算 さ れ、 イ メ ージが フ ィ ル タ ー さ れます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び dst は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
こ の関数は border モー ド の有無に関係な く 使用で き ます。
使用方法 :
hls::GaussianBlur<3,3,BORDER_CONSTANT>(src,dst)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
470
C ラ イブラ リ リ フ ァ レンス
hls::GaussianBlur<3,3>(src,dst)
border モー ド が選択 さ れていない場合は、 デフ ォ ル ト の BORDER_DEFAULT モー ド が使用 さ れます。
border モー ド の選択肢は、 次の と お り です。
BORDER_CONSTANT : 0 で拡張 さ れた入力
BORDER_REPLICATE .: バ ウ ン ダ リ 値: abcdeeee を使用 し てバ ウ ン ダ リ で拡張 さ れた入力
BORDER_REFLECT : 重複 し たエ ッ ジ ピ ク セル abcdeedc を使用 し てバ ウ ン ダ リ で拡張 さ れた入力
BORDER_REFLECT_101 : 重複 し ないエ ッ ジ ピ ク セル abcdedcb を使用 し てバ ウ ン ダ リ で拡張 さ れた入力
BORDER_DEFAULT : BORDER_REFLECT_101 と 同 じ
•
cvFilter2D
•
cv::filter2D
hls::GaussianBlur
コー ド例
template<int KH,int KW,int SRC_T,int DST_T,int ROWS,int COLS>
void GaussianBlur(
hls::Mat<ROWS, COLS, SRC_T>
&_src,
hls::Mat<ROWS, COLS, DST_T>
&_dst);
パラ メ ー タ ー
表 4‐34 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
説明
•
正規化 さ れた 2D Gaussian Blur フ ィ ル タ ーを入力に適用 し ます。
•
フ ィ ル タ ー係数は、 KH お よ び KW パ ラ メ ー タ ー (3 ま たは 5 のいずれか) で決定 さ れます。
•
3x3 フ ィ ル タ ー タ ッ プ :
[1,2,1
2,4,2
1,2,1] * 1/16
•
5x5 フ ィ ル タ ー タ ッ プ :
[1, 2, 3, 2, 1,
2, 5, 6, 5, 2,
3, 6, 8, 6, 3,
2, 5, 6, 5, 2,
1, 2, 3, 2, 1]* 1/84
OpenCV リ フ ァ レ ン ス
•
cv::GaussianBlur
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
471
C ラ イブラ リ リ フ ァ レンス
hls::Harris
コー ド例
template<int blockSize,int Ksize,typename KT,int SRC_T,int DST_T,int ROWS,int COLS>
void Harris(
hls::Mat<ROWS, COLS, SRC_T>
&_src,
hls::Mat<ROWS, COLS, DST_T>
&_dst,
KT k,
int threshold);
パラ メ ー タ ー
表 4‐35 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
検出 さ れた コ ーナーの出力 mask
k
Harris 検出器パ ラ メ ー タ ー
threshold
最大検出結果の し き い値
説明
•
こ の関数は、 Harris エ ッ ジ ま たは コ ーナー検出器を イ ンプ リ メ ン ト し ます。
•
水平方向お よ び垂直方向の導関数が Ksize*Ksize Sobel フ ィ ル タ ーを使用 し て概算 さ れます。
•
導関数の ロ ーカルの共分散行列 M は、 各ピ ク セル (x,y) の blockSize*blockSize 近傍に収め ら れます。
•
関数が最大にな る 箇所お よ び
し き い値を超え る 箇所を示 し 、 出力 イ メ ージに コ ーナー /エ ッ ジ と し てマー ク し ます。
•
Ksize=3 のみがサポー ト さ れます。
OpenCV リ フ ァ レ ン ス
•
cvCornerHarris
•
cv::cornerHarris
hls::HoughLines2
コー ド例
template<typename AT,typename RT>
struct Polar_
AT angle;
RT
rho;
};
template<unsigned int theta,unsigned int rho,typename AT,typename RT,int SRC_T,int
ROW,int COL,unsigned int linesMax>
void HoughLines2(
hls::Mat<ROW,COL,SRC_T> &_src,
Polar_<AT,RT> (&_lines)[linesMax],
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
472
C ラ イブラ リ リ フ ァ レンス
unsigned int threshold
);
パラ メ ー タ ー
表 4‐36 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
lines
パ ラ メ ー タ ー化 さ れた ラ イ ンのア レ イ で、 極座標で表示
threshold
戻 さ れ る 前に ラ イ ン上にの る 必要のあ る ピ ク セル数
説明
ハフ ラ イ ンの変換を イ ンプ リ メ ン ト し ます。
•
OpenCV リ フ ァ レ ン ス
•
cvHoughLines2
•
cv::HoughLines
hls::Integral
コー ド例
template<int SRC_T, int DST_T, int ROWS,int COLS>
void Integral(
Mat<ROWS, COLS, SRC_T>&_src,
Mat<ROWS+1, COLS+1, DST_T>&_sum);
template<int SRC_T, int DST_T,int DSTSQ_T, ROWS,int COLS>
void Integral(
Mat<ROWS, COLS, SRC_T>&_src,
Mat<ROWS+1, COLS+1, DST_T>&_sum,
Mat<ROWS+1, COLS+1, DSTSQ_T>&_sqsum);
パラ メ ー タ ー
表 4‐37 : パ ラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
sum
ピ ク セルの上お よ び左の入力 イ メ ージの ピ ク セル合計
sqsum
ピ ク セルの上お よ び左の入力 イ メ ージ の ピ ク セルの二
乗の合計
説明
•
積分 イ メ ージの計算を イ ンプ リ メ ン ト し ます。
OpenCV リ フ ァ レ ン ス
•
cvIntegral
•
cv::integral
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
473
C ラ イブラ リ リ フ ァ レンス
hls::InitUndistortRectifyMap
コー ド例
template< typename CMT, typename RT, typename DT, int ROW, int COL, int MAP1_T, int MAP2_T,
int N>
void InitUndistortRectifyMap(
Window<3,3, CMT> cameraMatrix,
DT (&distCoeffs)[N],
Window<3,3, RT> R,
Window<3,3, CMT> newcameraMatrix,
Mat<ROW, COL, MAP1_T> &map1,
Mat<ROW, COL, MAP2_T> &map2);
template< typename CMT, typename RT, typename DT, int ROW, int COL, int MAP1_T, int MAP2_T,
int N>
void InitUndistortRectifyMapInverse(
Window<3,3, CMT> cameraMatrix,
DT (&distCoeffs)[N],
Window<3,3, ICMT> ir
Mat<ROW, COL, MAP1_T> &map1,
Mat<ROW, COL, MAP2_T> &map2);
パラ メ ー タ ー
表 4‐38 : パラ メ ー タ ー
パラ メ ー タ ー
説明
cameraMatrix
古い座標シ ス テ ムでカ メ ラ を表す入力マ ト リ ッ ク ス
DT
入力変形係数 (通常、 4、 5、 ま たは 8 の変形係数が提供
さ れます)
R
入力回転マ ト リ ッ ク ス
newCameraMatrix
新 し い座標シ ス テ ムでカ メ ラ を表す入力マ ト リ ッ ク ス
ir
Invert(newcameraMatrix*R) と 同 じ 入力変換マ ト リ ッ ク ス
map1、 map2
リ マ ッ プ を表す イ メ ージ
説明
•
こ れ ら の関数は、 パ ラ メ ー タ ーのセ ッ ト に基づいて map1 お よ び map2 を生成 し ます。 map1 お よ び map2 は
hls::Remap() に最適な入力です。 FIXME は OpenCV 資料か ら 式を取得 し ます。
•
通常は、 ir
を計算す る ための フ レーム ご と のプ ロ セ ス が合成 ロ ジ ッ ク の外部で実行 さ れ る ので、 合成には
InitUndistortRectifyMapInverse() の方が推奨 さ れます。 さ ま ざ ま なパ ラ メ ー タ ーが浮動小数点ま たは固定小数点で
あ る 可能性があ り ます。 固定小数点の入力が使用 さ れ る と 、 少な く と も ICMT で提供 さ れ る 精度が使用 さ れて内
部座標変換が実行 さ れます。
•
こ の関数に イ ンプ リ メ ン ト さ れ る 座標変換はハー ド ウ ェ ア リ ソ ース集中型なので、入力パ ラ メ ー タ ーが固定小数
点で、 使用可能な外部 メ モ リ のバン ド 幅が十分あ る 場合は、 こ の関数の結果を オ フ ラ イ ンで計算 し て、 外部 メ モ
リ の map1 お よ び map2 に保存す る 方が推奨 さ れ る こ と も あ り ます。
制限
map1 お よ び map2 は HLS_16SC2 と し てのみサポー ト さ れ ます。 cameraMatrix、 newCameraMatrix は、 次の形式を使
用 し て正規化 さ れます。
[f_x,0,c_x,
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
474
C ラ イブラ リ リ フ ァ レンス
0,f_y,c_y,
0,0,1]
R お よ び ir も 次の形式を使用 し て正規化 さ れます。
[a,b,c,
d,e,f,
0,0,1]
OpenCV リ フ ァ レ ン ス
•
cv::initUndistortRectifyMap
hls::Max
コー ド例
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void hls::Max (
hls::Mat<ROWS, COLS, SRC1_T>& src1,
hls::Mat<ROWS, COLS, SRC2_T>& src2,
hls::Mat<ROWS, COLS, DST_T>& dst);
パラ メ ー タ ー
表 4‐39 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src1
1 つ目の入力 イ メ ージ
src2
2 つ目の入力 イ メ ージ
dst
出力 イ メ ージ
説明
•
2 つの入力 イ メ ージ、 src1 お よ び src2 のエ レ メ ン ト ご と の最大を計算 し て、 結果を dst に保存 し ます。
•
イ メ ージ デー タ は src1 お よ び src2 に格納する 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src1 お よ び src2 のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src1 お よ び src2 は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。 dst は、 入力 と 同 じ サ イ ズお よ び
チ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvMax
•
cv::max
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
475
C ラ イブラ リ リ フ ァ レンス
hls::MaxS
コー ド例
template<int ROWS, int COLS, int SRC_T, typename P_T, int DST_T>
void hls::MaxS (
hls::Mat<ROWS, COLS, SRC_T>& src,
P_T 値
hls::Mat<ROWS, COLS, DST_T>& dst);
パラ メ ー タ ー
表 4‐40 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
value
入力ス カ ラ ー値
dst
出力 イ メ ージ
説明
•
入力 イ メ ージ src のエ レ メ ン ト と 入力値の最大を計算 し 、 結果を dst に保存 し ます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び dst は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvMaxS
•
cv::max
hls::Mean
コー ド例
mask な し
template<typename DST_T, int ROWS, int COLS, int SRC_T>
DST_T hls::Mean(
hls::Mat<ROWS, COLS, SRC_T>& src);
mask あ り
template<typename DST_T, int ROWS, int COLS, int SRC_T>
DST_T hls::Mean(
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, HLS_8UC1>& mask);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
476
C ラ イブラ リ リ フ ァ レンス
パラ メ ー タ ー
表 4‐41 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
mask
演算 mask は計測 さ れ る src イ メ ージ のエ レ メ ン ト を
指定する 8 ビ ッ ト チ ャ ネルの イ メ ージ
説明
•
イ メ ージ src のエ レ メ ン ト の平均を計算 し 、 結果の ス カ ラ ーの最初のチ ャ ネル値を返 し ます。
•
mask あ り で計算 し た場合 :
•
イ メ ージ デー タ は src に格納す る 必要があ り ます (mask を使用 し て計算 さ れ る 場合、 mask にはデー タ が格納 さ
れてい る 必要あ り )。
•
こ の関数を開始す る と 、 src のデー タ が消費 さ れ (mask を使用 し て計算 し た場合、 mask のデー タ も 消費 さ れま
す)。
•
src お よ び mask は同 じ サ イ ズであ る 必要があ り ます。 mask には 0 以外のエ レ メ ン ト が含まれ る 必要があ り ま
す。
OpenCV リ フ ァ レ ン ス
•
cvMean
•
cv::mean
hls::Merge
コー ド例
2 つのシ ン グルチ ャ ネル イ メ ージの入力 :
template<int ROWS, int COLS, int SRC_T, int DST_T>
void hls::Merge (
hls::Mat<ROWS, COLS, SRC_T>& src0,
hls::Mat<ROWS, COLS, SRC_T>& src1,
hls::Mat<ROWS, COLS, DST_T>& dst);
3 つのシ ン グルチ ャ ネル イ メ ージの入力 :
template<int ROWS, int COLS, int SRC_T, int DST_T>
void hls::Merge (
hls::Mat<ROWS, COLS, SRC_T>& src0,
hls::Mat<ROWS, COLS, SRC_T>& src1,
hls::Mat<ROWS, COLS, SRC_T>& src2,
hls::Mat<ROWS, COLS, DST_T>& dst);
4 つのシ ン グルチ ャ ネル イ メ ージの入力 :
template<int ROWS, int COLS, int SRC_T, int DST_T>
void hls::Merge (
hls::Mat<ROWS, COLS, SRC_T>& src0,
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
477
C ラ イブラ リ リ フ ァ レンス
hls::Mat<ROWS,
hls::Mat<ROWS,
hls::Mat<ROWS,
hls::Mat<ROWS,
COLS,
COLS,
COLS,
COLS,
SRC_T>&
SRC_T>&
SRC_T>&
DST_T>&
src1,
src2,
src3,
dst);
パラ メ ー タ ー
表 4‐42 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src0
1 つ目のシ ン グルチ ャ ネル入力 イ メ ージ
src1
2 つ目のシ ン グルチ ャ ネル入力 イ メ ージ
src2
3 つ目のシ ン グルチ ャ ネル入力 イ メ ージ
src3
4 つ目のシ ン グルチ ャ ネル入力 イ メ ージ
dst
出力マルチチ ャ ネル イ メ ージ
説明
•
複数のシ ン グルチ ャ ネル イ メ ージか ら マルチチ ャ ネル イ メ ージ dst を作成 し ます。
•
イ メ ージ デー タ は入力 イ メ ージに格納する 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 入力のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
入力 イ メ ージは、 同 じ サ イ ズで、 シ ン グルチ ャ ネルであ る 必要があ り ます。 dst は入力 と 同 じ サ イ ズで、 dst の
チ ャ ネル数は入力 イ メ ージの数 と 同 じ であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvMerge
•
cv::merge
hls::Min
コー ド例
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T>
void hls::Min (
hls::Mat<ROWS, COLS, SRC1_T>& src1,
hls::Mat<ROWS, COLS, SRC2_T>& src2,
hls::Mat<ROWS, COLS, DST_T>& dst);
パラ メ ー タ ー
表 4‐43 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src1
1 つ目の入力 イ メ ージ
src2
2 つ目の入力 イ メ ージ
dst
出力 イ メ ージ
説明
•
2 つの入力 イ メ ージ、 src1 お よ び src2 のエ レ メ ン ト ご と の最小を計算 し て、 結果を dst に保存 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
478
C ラ イブラ リ リ フ ァ レンス
•
イ メ ージ デー タ は src1 お よ び src2 に格納する 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src1 お よ び src2 のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src1 お よ び src2 は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
•
dst は、 入力 と 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvMin
•
cv::min
hls::MinMaxLoc
コー ド例
mask な し
template<int ROWS, int COLS, int SRC_T, typename P_T>
void hls::MinMaxLoc (
hls::Mat<ROWS, COLS, SRC_T>& src,
P_T* min_val,
P_T* max_val,
hls::Point& min_loc,
hls::Point& max_loc);
mask あ り
template<int ROWS, int COLS, int SRC_T, typename P_T>
void hls::MinMaxLoc (
hls::Mat<ROWS, COLS, SRC_T>& src,
P_T* min_val,
P_T* max_val,
hls::Point& min_loc,
hls::Point& max_loc,
hls::Mat<ROWS, COLS, HLS_8UC1>& mask);
パラ メ ー タ ー
表 4‐44 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
min_val
出力最小値へのポ イ ン タ ー
max_val
出力最大値へのポ イ ン タ ー
min_loc
入力 イ メ ージの最小位置の出力ポ イ ン ト
max_loc
入力 イ メ ージの最大位置の出力ポ イ ン ト
mask
演算 mask は検出 さ れ る src イ メ ージ のエ レ メ ン ト を
指定する 8 ビ ッ ト チ ャ ネルの イ メ ージ
説明
•
グ ロ ーバル最小値お よ び最大値 と 、 入力 イ メ ージ src でのそれ ら の位置を検出 し ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
479
C ラ イブラ リ リ フ ァ レンス
•
イ メ ージ デー タ は src に格納す る 必要があ り ます (mask を使用 し て計算 さ れ る 場合、 mask にはデー タ が格納
さ れてい る 必要あ り )。
•
こ の関数を開始す る と 、 src のデー タ が消費 さ れます (mask を使用 し て計算 し た場合)。mask のデー タ も 消費 さ
れます)。
•
min_val お よ び max_val には、 同 じ デー タ 型が必要で、 src お よ び mask は同 じ サ イ ズであ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvMinMaxLoc
•
cv::minMaxLoc
hls::MinS
コー ド例
template<int ROWS, int COLS, int SRC_T, typename P_T, int DST_T>
void hls::MinS (
hls::Mat<ROWS, COLS, SRC_T>& src,
P_T 値
hls::Mat<ROWS, COLS, DST_T>& dst);
パラ メ ー タ ー
表 4‐45 : パ ラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
value
入力ス カ ラ ー値
dst
出力 イ メ ージ
説明
•
入力 イ メ ージ src のエ レ メ ン ト と 入力値の最小を計算 し 、 結果を dst に保存 し ます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び dst は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvMinS
•
cv::min
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
480
C ラ イブラ リ リ フ ァ レンス
hls::Mul
コー ド例
template<int ROWS, int COLS, int SRC1_T, int SRC2_T, int DST_T, typename P_T>
void hls::Mul (
hls::Mat<ROWS, COLS, SRC1_T>& src1,
hls::Mat<ROWS, COLS, SRC2_T>& src2,
hls::Mat<ROWS, COLS, DST_T>& dst,
P_T scale=1);
パラ メ ー タ ー
表 4‐46 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src1
1 つ目の入力 イ メ ージ
src2
2 つ目の入力 イ メ ージ
dst
出力 イ メ ージ
scale
オプシ ョ ンの ス ケール係数
説明
•
2 つの入力 イ メ ージ、 src1 と src2 のエ レ メ ン ト ご と の積を計算 し ます。
•
結果を イ メ ージ dst に保存 し ます。 オプシ ョ ンの倍率 scale を使用で き ます。
•
イ メ ージ デー タ は src1 お よ び src2 に格納する 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src1 お よ び src2 のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src1 お よ び src2 は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
•
dst は、 入力 と 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvMul
•
cv::multiply
hls::Not
コー ド例
template<int ROWS, int COLS, int SRC_T, int DST_T>
void hls::Not (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
481
C ラ イブラ リ リ フ ァ レンス
パラ メ ー タ ー
表 4‐47 : パ ラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
説明
•
イ メ ージ src のエ レ メ ン ト ご と のビ ッ ト 反転を実行 し ます。
•
結果を イ メ ージ dst と し て出力 し ます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び dst は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvNot
•
cv::bitwise_not
hls::PaintMask
コー ド例
template<int SRC_T,int MASK_T,int ROWS,int COLS>
void PaintMask(
hls::Mat<ROWS,COLS,SRC_T>
&_src,
hls::Mat<ROWS,COLS,MASK_T>
&_mask,
hls::Mat<ROWS,COLS,SRC_T>
&_dst,
hls::Scalar<HLS_MAT_CN(SRC_T),HLS_TNAME(SRC_T)> _color);
パラ メ ー タ ー
表 4‐48 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
mask
入力マ ス ク
dst
出力 イ メ ージ
color
マー ク に使用する 色
説明
•
デス テ ィ ネーシ ョ ン イ メ ージの各ピ ク セルが color (mask が 0 でない場合) ま たは入力 イ メ ージか ら の該当ピ ク
セルのいずれかに設定 さ れます。
•
src、 mask、 お よ び dst はすべて同 じ サ イ ズにす る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
482
C ラ イブラ リ リ フ ァ レンス
hls::Range
コー ド例
template<int ROWS, int COLS, int SRC_T, int DST_T, typename P_T>
void hls::Range (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst,
P_T start,
P_T end);
パラ メ ー タ ー
表 4‐49 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力シ ン グルチ ャ ネル イ メ ージ
dst
出力シ ン グルチ ャ ネル イ メ ージ
start
範囲の左側のバ ウ ン ダ リ 値
end
範囲の右側のバ ウ ン ダ リ 値
説明
•
次の規則を使用 し て イ メ ージ src のすべての値を設定 し て、 結果を イ メ ージ dst と し て戻 し ます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び dst は、 同 じ サ イ ズで、 シ ン グルチ ャ ネル イ メ ージであ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvRange
hls::Remap
コー ド例
template <int WIN_ROW, int ROW, int COL, int SRC_T, int DST_T, int MAP1_T, int
MAP2_T>
void Remap(
hls::Mat<ROW, COL, SRC_T>
&src,
hls::Mat<ROW, COL, DST_T>
&dst,
hls::Mat<ROW, COL, MAP1_T>
&map1,
hls::Mat<ROW, COL, MAP2_T>
&map2);
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
483
C ラ イブラ リ リ フ ァ レンス
パラ メ ー タ ー
表 4‐50 : パ ラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
• map1
• map2
リ マップ
説明
•
指定 し た リ マ ッ プに従っ て ソ ース イ メ ージ src をデス テ ィ ネーシ ョ ン イ メ ージ dst に リ マ ッ プ し ます。出力 イ
メ ージの各ピ ク セルには、 入力ピ ク セルの座標が map1 お よ び map2 で指定 さ れます。
•
こ の 関数 は、 垂直視差 の 小 さ い カ メ ラ の ス ト リ ー ミ ン グ 処理 の た め に 作成 さ れ て お り 、 入力 イ メ ー ジ の
WIN_ROW 行を含む リ マ ッ プを イ ネーブルにする ための内部 ラ イ ン バ ッ フ ァ ーが含まれます。行 r_o の出力ピ ク
セルに該当す る 入力ピ ク セルの row r_i が [r_o-(WIN_ROW/2-1], r_o+(WIN_ROW/2-1) の範囲にない場合は、 出力
が黒にな り ます。
•
ま た、 ラ イ ン バ ッ フ ァ ーのアーキ テ ク チ ャ のため、 WIN_ROW お よ び COL が 2 のべ き 乗であ る 場合は、 関数で
使用 さ れ る リ ソ ース が少な く な り ます。
OpenCV リ フ ァ レ ン ス
•
cvRemap
hls::Reduce
コー ド例
template<typename INTER_SUM_T, int ROWS, int COLS, int SRC_T, int DST_ROWS, int
DST_COLS, int DST_T>
void hls::Reduce (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<DST_ROWS, DST_COLS, DST_T>& dst,
int dim,
int reduce_op=HLS_REDUCE_SUM);
パラ メ ー タ ー
表 4‐51 : パ ラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力マ ト リ ッ ク ス
dst
出力ベ ク タ ー
dim
行列が削減 さ れ る と き の次元指数。 0 は行列
が 1 行に削減 さ れた こ と を、 1 は行列が 1 列
に削減 さ れた こ と を意味 し ます。
reduce_op
削減演算
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
484
C ラ イブラ リ リ フ ァ レンス
表 4‐51 : パ ラ メ ー タ ー
パラ メ ー タ ー
説明
HLS_REDUCE_SUM
出力は、 マ ト リ ッ ク ス の行 と 列すべ
ての合計にな り ます。
HLS_REDUCE_AVG
マ ト リ ッ ク ス の行 と 列すべての平均
にな り ます。
HLS_REDUCE_MAX
出力は、 マ ト リ ッ ク ス の行 と 列の最
大値にな り ます。
HLS_REDUCE_MIN
出力は、 マ ト リ ッ ク ス の行 と 列の最
小値にな り ます。
説明
•
2D イ メ ージ src を dim (次元) と 共にベ ク タ ー dst ま で削減 し ます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst のデー タ は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
OpenCV リ フ ァ レ ン ス
•
cvReduce,
•
cv::reduce
hls::Resize
コー ド例
template<int SRC_T, int ROWS,int COLS,int DROWS,int DCOLS>
void Resize (
Mat<ROWS, COLS, SRC_T>
&_src,
Mat<DROWS, DCOLS, SRC_T>&_dst);
パラ メ ー タ ー
表 4‐52 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
説明
•
入力 イ メ ージ を双線補間を使用 し て出力 イ メ ージのサ イ ズに変更 し ます。
OpenCV リ フ ァ レ ン ス
•
cvResize
•
cv::resize
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
485
C ラ イブラ リ リ フ ァ レンス
hls::Set
コー ド例
src イ メ ージの設定 :
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void hls::Set (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Scalar<HLS_MAT_CN(DST_T), _T> scl,
hls::Mat<ROWS, COLS, DST_T>& dst);
dst イ メ ージの生成 :
template<int ROWS, int COLS, typename _T, int DST_T>
void hls::Set (
hls::Scalar<HLS_MAT_CN(DST_T), _T> scl,
hls::Mat<ROWS, COLS, DST_T>& dst);
パラ メ ー タ ー
表 4‐53 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
scl
設定する ス カ ラ ー値
dst
出力 イ メ ージ
説明
•
イ メ ージ src のエ レ メ ン ト を任意の ス カ ラ ー値 scl に設定 し ます。
•
結果を イ メ ージ dst と し て保存 し ます。
•
入力 イ メ ージがない場合は、 ス カ ラ ー値 scl を含むすべてのエ レ メ ン ト と 一緒に dst イ メ ージ を生成 し ます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び scl は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
•
dst は、 src と 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvSet
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
486
C ラ イブラ リ リ フ ァ レンス
hls::Scale
コー ド例
template<int ROWS, int COLS, int SRC_T, int DST_T, typename P_T>
void hls::Scale (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst,
P_T scale=1.0,
P_T shift=0.0);
パラ メ ー タ ー
表 4‐54 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
scale
ス ケール係数の値
shift
ス ケール さ れたエ レ メ ン ト へ追加 さ れた値
説明
•
入力 イ メ ージ src をオプシ ョ ンの線形変換を使用 し て変換 し ます。
•
結果を イ メ ージ dst と し て保存 し ます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び dst のサ イ ズお よ びチ ャ ネル数は同 じ であ る 必要があ り 、 scale お よ び shift のデー タ 型は同 じ であ る
必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvScale
•
cvConvertScale
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
487
C ラ イブラ リ リ フ ァ レンス
hls::Sobel
コー ド例
template<int XORDER, int YORDER, int SIZE, typename BORDERMODE, int SRC_T, int DST_T,
int ROWS,int COLS,int DROWS,int DCOLS>
void Sobel (
Mat<ROWS, COLS, SRC_T>&_src,
Mat<DROWS, DCOLS, DST_T>&_dst)
template<int XORDER, int YORDER, int SIZE, int SRC_T, int DST_T, int ROWS,int
COLS,int DROWS,int DCOLS>
void Sobel (
Mat<ROWS, COLS, SRC_T>&_src,
Mat<DROWS, DCOLS, DST_T>&_dst)
パラ メ ー タ ー
表 4‐55 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
説明
•
水平ま たは垂直方向の Sobel フ ィ ル タ ーを計測 し 、 水平ま たは垂直方向の導関数を返 し ます。 次の よ う な フ ィ ル
タ ーを使用 し ます。
[-1,0,1
-2,0,2,
-1,0,1]
•
サポー ト さ れ る のは SIZE=3 のみで、
•
XORDER=1 お よ び YORDER=0 (水平方向の導関数の場合) ま たは XORDER=0 お よ び YORDER=1 (垂直方向の導
関数の場合) のみがサポー ト さ れます。
OpenCV リ フ ァ レ ン ス
こ の関数は border モー ド の有無に関係な く 使用で き ます。
使用方法 :
hls::Sobel<1,0,3,BORDER_CONSTANT>(src,dst)
hls::Sobel<1,0,3>(src,dst)
border モー ド が選択 さ れていない場合は、 デフ ォ ル ト の BORDER_DEFAULT モー ド が使用 さ れます。
border モー ド の選択肢は、 次の と お り です。
BORDER_CONSTANT : 0 で拡張 さ れた入力
BORDER_REPLICATE .: バ ウ ン ダ リ 値: abcdeeee を使用 し てバ ウ ン ダ リ で拡張 さ れた入力
BORDER_REFLECT : 重複 し たエ ッ ジ ピ ク セル abcdeedc を使用 し てバ ウ ン ダ リ で拡張 さ れた入力
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
488
C ラ イブラ リ リ フ ァ レンス
BORDER_REFLECT_101 : 重複 し ないエ ッ ジ ピ ク セル abcdedcb を使用 し てバ ウ ン ダ リ で拡張 さ れた入力
BORDER_DEFAULT : BORDER_REFLECT_101 と 同 じ
•
cvSobel
hls::Split
コー ド例
入力 イ メ ージが 2 チ ャ ネルの場合 :
template<int ROWS, int COLS, int SRC_T, int DST_T>
void hls::Split (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst0,
hls::Mat<ROWS, COLS, DST_T>& dst1);
入力 イ メ ージが 3 チ ャ ネルの場合 :
template<int ROWS, int COLS, int SRC_T, int DST_T>
void hls::Split (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst0,
hls::Mat<ROWS, COLS, DST_T>& dst1,
hls::Mat<ROWS, COLS, DST_T>& dst2);
入力 イ メ ージが 4 チ ャ ネルの場合 :
template<int ROWS, int COLS, int SRC_T, int DST_T>
void hls::Split (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst0,
hls::Mat<ROWS, COLS, DST_T>& dst1,
hls::Mat<ROWS, COLS, DST_T>& dst2,
hls::Mat<ROWS, COLS, DST_T>& dst3);
パラ メ ー タ ー
表 4‐56 : パ ラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力マルチチ ャ ネル イ メ ージ
dst0
1 つ目のシ ン グルチ ャ ネル出力 イ メ ージ
dst1
2 つ目のシ ン グルチ ャ ネル出力 イ メ ージ
dst2
3 つ目のシ ン グルチ ャ ネル出力 イ メ ージ
dst3
4 つ目のシ ン グルチ ャ ネル出力 イ メ ージ
説明
•
複数のシ ン グルチ ャ ネル イ メ ージか ら のマルチチ ャ ネル イ メ ージ src をパーテ ィ シ ョ ン し ます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
出力の イ メ ージ デー タ は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 出力の イ メ ージ デー タ が満た さ れます。
•
出力 イ メ ージは、 同 じ サ イ ズで、 シ ン グルチ ャ ネルであ る 必要があ り ます。
•
src は出力 と 同 じ サ イ ズであ る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
489
C ラ イブラ リ リ フ ァ レンス
src のチ ャ ネル数は出力 イ メ ージの数 と 同 じ であ る 必要があ り ます。
•
OpenCV リ フ ァ レ ン ス
•
cvSplit
•
cv::split
hls::SubRS
コー ド例
mask な し
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void hls::SubRS (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Scalar<HLS_MAT_CN(SRC_T), _T>& scl,
hls::Mat<ROWS, COLS, DST_T>& dst);
mask あ り
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void hls::SubRS (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Scalar<HLS_MAT_CN(SRC_T), _T>& scl,
hls::Mat<ROWS, COLS, DST_T>& dst,
hls::Mat<ROWS, COLS, HLS_8UC1>& mask,
hls::Mat<ROWS, COLS, DST_T>& dst_ref);
パラ メ ー タ ー
表 4‐57 : パ ラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
scl
入力ス カ ラ ー
dst
出力 イ メ ージ
mask
演算 mask は計測 さ れ る dst イ メ ージのエ レ メ ン ト を指
定する 8 ビ ッ ト チ ャ ネルの イ メ ージ
dst_ref
mask(I) = 0 の場合の出力 イ メ ージ のエ レ メ ン ト を格納
する リ フ ァ レ ン ス イ メ ージ
説明
•
ス カ ラ ー値 scl と イ メ ージ src 間の違いを計算 し ます。
•
その結果を dst に保存 し ます。
•
mask あ り で計算 し た場合 :
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
mask を使用 し て計算 し た場合、 mask と dst_ref にはデー タ が格納 さ れてい る 必要あ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
490
C ラ イブラ リ リ フ ァ レンス
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れます。
•
mask を使用 し て計算 し た場合、mask と dst_ref のデー タ も 消費 さ れ、dst の イ メ ージ デー タ が満た さ れます。
•
src お よ び scl は、 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。 dst お よ び dst_ref は、 src と 同 じ サ イ
ズお よ びチ ャ ネル数であ る 必要があ り ます。 mask は src と 同 じ サ イ ズであ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvSubRS
•
cv::subtract
hls::SubS
コー ド例
mask な し
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void hls::SubRS (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Scalar<HLS_MAT_CN(SRC_T), _T>& scl,
hls::Mat<ROWS, COLS, DST_T>& dst);
mask あ り
template<int ROWS, int COLS, int SRC_T, typename _T, int DST_T>
void hls::SubRS (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Scalar<HLS_MAT_CN(SRC_T), _T>& scl,
hls::Mat<ROWS, COLS, DST_T>& dst,
hls::Mat<ROWS, COLS, HLS_8UC1>& mask,
hls::Mat<ROWS, COLS, DST_T>& dst_ref);
パラ メ ー タ ー
表 4‐58 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
scl
入力ス カ ラ ー
dst
出力 イ メ ージ
mask
演算 mask は計測 さ れ る dst イ メ ージのエ レ メ ン ト を指
定する 8 ビ ッ ト チ ャ ネルの イ メ ージ
dst_ref
mask(I) = 0 の場合の出力 イ メ ージ のエ レ メ ン ト を格納
する リ フ ァ レ ン ス イ メ ージ
説明
•
イ メ ージ src と ス カ ラ ー値 scl のエ レ メ ン ト 間の違いを計算 し ます。
•
その結果を dst に保存 し ます。
mask あ り で計算 し た場合 :
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
491
C ラ イブラ リ リ フ ァ レンス
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
mask を使用 し て計算 し た場合、 mask と dst_ref にはデー タ が格納 さ れてい る 必要あ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
mask を使用 し て計算 さ れた場合は、 mask お よ び dst_ref のデー タ も 消費 さ れます。
•
dst お よ び dst_ref は、 src と 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
•
•
OpenCV リ フ ァ レ ン ス
•
cvSub
•
cv::subtract
hls::Sum
コー ド例
template<typename DST_T, int ROWS, int COLS, int SRC_T>
hls::Scalar<HLS_MAT_CN(SRC_T), DST_T> hls::Sum(
hls::Mat<ROWS, COLS, SRC_T>& src);
パラ メ ー タ ー
表 4‐59 : パ ラ メ ー タ ー
パラ メ ー タ ー
説明
入力 イ メ ージ
src
説明
•
•
結果は ス カ ラ ー値 と し て戻 さ れます。
•
•
OpenCV リ フ ァ レ ン ス
•
cvSum
•
cv::sum
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
492
C ラ イブラ リ リ フ ァ レンス
hls::Threshold
コー ド例
template<int ROWS, int COLS, int SRC_T, int DST_T, typename P_T>
void hls::Threshold (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst,
P_T thresh,
P_T maxval,
int thresh_type);
パラ メ ー タ ー
表 4‐60 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力シ ン グルチ ャ ネル イ メ ージ
dst
出力シ ン グルチ ャ ネル イ メ ージ
thresh
し き い値
maxval
一部の し き い値型 と 一緒に使用する ための最大値
thresh_type
し き い値型詳細は説明を参照
説明
シ ン グルチ ャ ネル イ メ ージの各エ レ メ ン ト に固定レベルの し き い値を実行 し て、 シ ン グルチ ャ ネル イ メ ージ dst と
し て結果を戻 し ます。 こ の関数でサポー ト さ れ る し き い値 タ イ プは、 次の thresh_type で決ま り ます。
HLS_THRESH_BINARY
HLS_THRESH_BINARY_INV
HLS_THRESH_TRUNC
HLS_THRESH_TOZERO
HLS_THRESH_TOZERO_INV
•
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
493
C ラ イブラ リ リ フ ァ レンス
OpenCV リ フ ァ レ ン ス
•
cvThreshold
•
cv::threshold
hls::Zero
コー ド例
template<int ROWS, int COLS, int SRC_T, int DST_T>
void hls::Zero (
hls::Mat<ROWS, COLS, SRC_T>& src,
hls::Mat<ROWS, COLS, DST_T>& dst);
dst イ メ ージの生成 :
template<int ROWS, int COLS, int DST_T>
void hls::Zero (
hls::Mat<ROWS, COLS, DST_T>& dst);
パラ メ ー タ ー
表 4‐61 : パラ メ ー タ ー
パラ メ ー タ ー
説明
src
入力 イ メ ージ
dst
出力 イ メ ージ
説明
•
イ メ ージ src のエ レ メ ン ト を 0 に設定 し ます。
•
結果を イ メ ージ dst と し て保存 し ます。
•
入力 イ メ ージがない場合は、 すべてのエ レ メ ン ト を 0 で イ メ ージ dst を生成 し ます。
•
イ メ ージ デー タ は src に格納す る 必要があ り ます。
•
dst の イ メ ージ フ ィ ール ド は起動前に空にな っ てい る 必要があ り ます。
•
こ の関数を起動す る と 、 src のデー タ が消費 さ れ、 dst の イ メ ージ デー タ が満た さ れます。
•
dst は、 src と 同 じ サ イ ズお よ びチ ャ ネル数であ る 必要があ り ます。
OpenCV リ フ ァ レ ン ス
•
cvSetZero
•
cvZero
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
494
付録 5
その他の リ ソ ース
ザイ リ ン ク ス リ ソ ース
ア ンサー、 資料、 ダ ウ ン ロ ー ド 、 フ ォー ラ ム な ど のサポー ト リ ソ ース は、 次のザ イ リ ン ク ス サ
ポー ト サ イ ト を参照 し て く だ さ い。 http://japan.xilinx.com/support
ザ イ リ ン ク ス 資 料 で 使 用 さ れ る 用 語 集 に つ い て は、 次 を 参 照 し て く だ さ い。
http://japan.xilinx.com/company/terms.htm.
ソ リ ュ ーシ ョ ン セ ン タ ー
デバ イ ス、 ツール、 IP のサポー ト については、 ザ イ リ ン ク ス ソ リ ュ ーシ ョ ン セ ン タ ーを参照 し
て く だ さ い。 ト ピ ッ ク には、 デザ イ ン ア シ ス タ ン ト 、 ア ド バ イ ザ リ 、 ト ラ ブルシ ュ ー ト ヒ ン ト
な ど が含まれます。
ト レーニ ング ビデオ
•
http://japan.xilinx.com/training/vivado/index.htm
参照資料
1. Vivado Design Suite ユーザー ガ イ ド リ リ ース ノ ー ト 、 イ ン ス ト ールお よ び ラ イ セ ン ス』
(UG973)
2. 『Vivado Design Suite ユーザー ガ イ ド : 高位合成』 (UG902)
3. 『Vivado Design Suite チ ュ ー ト リ アル : 高位合成』 (UG871)
4. Vivado Design Suite ビデオ チ ュ ー ト リ アル (http://japan.xilinx.com/training/vivado/index.htm)
5. Vivado Design Suite 資料ページ
(http://japan.xilinx.com/support/documentation/dt_vivado2013-4.htm)
高位合成
UG902 (v2013.4) 2013 年 12 月 19 日
japan.xilinx.com
Send Feedback
495