You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Vivado Design Suite<br />
ユーザー ガイド<br />
高 位 合 成<br />
UG902 (v2014.1) 2014 年 4 月 2 日<br />
本 資 料 は 表 記 のバージョンの 英 語 版 を 翻 訳 したもので、 内 容 に 相 違 が 生 じる 場 合 には 原 文 を 優 先 します。 資 料<br />
によっては 英 語 版 の 更 新 に 対 応 していないものがあります。 日 本 語 版 は 参 考 用 としてご 使 用 の 上 、 最 新 情 報 に<br />
つきましては、 必 ず 最 新 英 語 版 をご 参 照 ください。
改 訂 履 歴<br />
次 の 表 に、 こ の 文 書 の 改 訂 履 歴 を 示 し ます。<br />
日 付 バージ ョ ン 改 訂 内 容<br />
2014 年 4 月 2 日 2014.1 全 体 的 な 構 成 を 変 更 し、 新 し い 「HLS UltraFast 設 計 手 法 」 セクションを 追 加<br />
高 位 合 成 japan.xilinx.com 2<br />
UG902 (v2014.1) 2014 年 4 月 2 日
目 次<br />
第 1 章 : 高 位 合 成<br />
C ベースの FPGA デザイ ンの 概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5<br />
Vivado HLS の 使 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
HLS UltraFast 設 計 手 法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61<br />
インターフェイスの 管 理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121<br />
デザ イ ン 最 適 化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151<br />
RTL 検 証 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191<br />
RTL デザイ ンのエ ク スポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197<br />
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
Vivado HLS の C ライブラリの 概 要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205<br />
任 意 精 度 データ 型 ラ イ ブ ラ リ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205<br />
Vivado HLS のス ト リーム ライブラリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219<br />
hls_math ライブラリ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225<br />
Vivado HLS の video ライブラリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233<br />
HLS IP ライブラリ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245<br />
HLS 線 形 代 数 ラ イ ブ ラ リ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259<br />
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
サポー ト されない C コンス ト ラク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261<br />
C テス トベンチ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265<br />
関 数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272<br />
ループ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273<br />
配 列 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282<br />
データ 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289<br />
C++ クラスおよびテンプレート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312<br />
assert の 使 用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319<br />
SystemC の 合 成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323<br />
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
コマンド リファレンス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341<br />
グラフィカル ユーザー インターフェイス (GUI) リファレンス. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 396<br />
インターフェイス 合 成 リファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401<br />
AXI4 Slave Lite の C ドライバーのリファレンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415<br />
ビデオ 関 数 の リ フ ァ レンス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423<br />
HLS 線 形 代 数 ラ イ ブ ラ リ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495<br />
C の 任 意 精 度 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506<br />
C++ の 任 意 精 度 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517<br />
C++ の 任 意 精 度 (AP) 固 定 小 数 点 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532<br />
SystemC 型 と Vivado HLS 型 の 比 較 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551<br />
高 位 合 成 japan.xilinx.com 3<br />
UG902 (v2014.1) 2014 年 4 月 2 日
付 録 A : その 他 の リ ソースおよび 法 的 通 知<br />
ザイ リ ンクス リソース. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557<br />
ソリューション センター. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557<br />
Vivado Design Suite ビデオ チュート リ アル. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557<br />
参 照 資 料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557<br />
法 的 通 知 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557<br />
高 位 合 成 japan.xilinx.com 4<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章<br />
高 位 合 成<br />
C ベースの FPGA デザイ ンの 概 要<br />
ザ イ リ ン ク ス 高 位 合 成 ソ フ ト ウ ェ アの Vivado ® HLS では、 C 仕 様 がレ ジ ス タ トランスファー レベル (RTL) インプリ<br />
メンテーションに 変 換 され、 ザイリンクスのフィールド プログラマブル ゲー ト 配 列 (FPGA) に 合 成 されます。 C 仕<br />
様 は C、 C++、 SystemC のいずれかで 記 述 で き ます。<br />
高 位 合 成 (HLS) には、 ソ フ ト ウ ェア ドメインとハードウェア ド メ イ ン をつな ぐ 役 割 があ り ます。<br />
• ハー ド ウ ェ ア 設 計 者 は 抽 象 度 の 高 いレベルで 記 述 し て FPGA にデザ イ ン を イ ンプ リ メ ン ト で き る ので、 生 産 性 を<br />
上 げつつ、 優 れたパフ ォーマン スのハー ド ウ ェ アを 作 成 する こ と がで き ます。<br />
• ソ フ ト ウ ェ ア 開 発 者 は 自 身 のアルゴ リ ズムの 計 算 集 約 部 分 を 新 し い コ ンパイル ターゲッ ト で 簡 単 に 速 めるこ と<br />
ができ、 FPGA にパフ ォーマン ス、 コ ス ト 、 消 費 電 力 すべて 従 来 のプ ロ セ ッ サ よ り も 優 れたアーキテ ク チャ を 構<br />
築 でき ます。<br />
HLS の 主 な 利 点 は、ハー ド ウ ェ ア 設 計 者 に と っては 生 産 性 の 改 善 、 ソ フ ト ウ ェ ア 設 計 者 に と ってはシ ス テム パフォー<br />
マン スの 改 善 がで き る 点 です。<br />
• C レベルでアルゴ リ ズム を 開 発 で き る ので、 開 発 時 間 がかかっていた イ ンプ リ メ ンテーシ ョ ンの 詳 細 に 時 間 をか<br />
け る 必 要 があ り ません。<br />
• C レベルでの 検 証 に よ り 、 従 来 のハー ド ウ ェ ア 記 述 言 語 で 可 能 であ った よ り も 何 倍 も 高 速 に 論 理 的 な 正 確 さ を 検<br />
証 でき ます。<br />
• 最 適 化 指 示 子 を 使 用 し て C 合 成 プ ロ セス を 制 御 する こ と で、 特 定 のハイ パフォーマンスなハード ウェア インプ<br />
リ メ ンテーシ ョ ンの 作 成 が 可 能 です。<br />
• 最 適 化 指 示 子 を 使 用 し て C ソース コー ド か ら さ ま ざ ま な イ ンプ リ メ ンテーシ ョ ン をすばや く 作 成 で き る ので、<br />
デザ イ ン 空 間 の 検 証 が 簡 単 にな り 、 最 適 な イ ンプ リ メ ンテーシ ョ ン を 検 出 で き る 可 能 性 が 上 が り ます。<br />
HLS 設 計 手 法 を 使 用 する と 、 読 みやす く てポータ ブルな C ソース コー ド が 記 述 で き ます。 C ソースは 別 の FPGA デ<br />
バイスにターゲッ ト 変 更 できるほか、 新 しいプロジェク トに 取 り 込 むこ と もできます。<br />
こ の 概 要 セ ク シ ョ ンでは、 高 位 合 成 (HLS) に 関 する 基 本 的 な 概 念 を 説 明 し、 Vivado HLS の 使 用 方 法 と 機 能 の 概 要 に<br />
ついて 説 明 し ます。<br />
ヒント : FPGA アーキテ ク チャ の 詳 細 および 高 位 合 成 の 基 本 的 な 概 念 については、 『Introduction to FPGA Design with<br />
Vivado High-Level Synthesis』 (UG998) を 参 照 して く ださい。<br />
高 位 合 成 japan.xilinx.com 5<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
高 位 合 成 の 理 解<br />
ス ケジ ュー リ ングおよびバイ ンデ ィ ングは、 高 位 合 成 の 中 心 と な る プ ロ セスです。 次 の コー ド 例 を 使 用 し て、 こ れ ら<br />
のプロセスについて 説 明 し ます。<br />
int foo(char x, char a, char b, char c) {<br />
char y;<br />
y = x*a+b+c;<br />
return y<br />
}<br />
Vivado HLS では、 スケジュー リ ング プロセス 中 に、 どのクロック サイクルで 演 算 が 実 行 されるかが 決 定 されます。<br />
ス ケジ ュー リ ング 中 の 決 定 では、 ク ロ ッ ク 周 波 数 、 ターゲ ッ ト デバイ ス テクノロジ ライブラリからのタイミング 情<br />
報 、 ユーザー 指 定 の 最 適 化 指 示 子 などが 考 慮 さ れます。<br />
このプロセスについては 図 1-1 の 「Scheduling Phase」 部 分 で 示 し ています。 乗 算 と 最 初 の 加 算 が 最 初 の ク ロ ッ ク サイ<br />
クルで 実 行 されるよ うにスケジュールされ、 次 のクロック サイクルで 2 つ 目 の 加 算 が 実 行 され、 結 果 が 2 つ 目 の ク<br />
ロック サイクルの 終 わりで 出 力 されます。<br />
最 終 的 なハー ド ウ ェ ア イ ンプ リ メ ンテーシ ョ ンでは、 高 位 合 成 で 最 上 位 関 数 への 引 数 が I/O ( 入 力 および 出 力 ) ポー ト<br />
と し て イ ンプ リ メ ン ト さ れます。 こ の 例 の 場 合 は、 単 純 なデータ ポー ト にな り ます。 各 入 力 変 数 は char 型 なので、 入<br />
力 データ ポー ト はすべて 8 ビッ ト 幅 です。 return 関 数 は 32 ビッ トの int データ 型 で、 出 力 データ ポー ト は 32 ビッ ト<br />
です。<br />
図 1-1 の 緑 の 正 方 形 は、 内 部 レ ジ ス タ に 変 数 が 格 納 さ れる タ イ ミ ン グ を 示 し ています。<br />
注 記 : こ の 例 の 場 合 、 高 位 合 成 では 1 クロック サ イ ク ルで 加 算 の 出 力 を レ ジ ス タ に 入 力 する 必 要 があ る だけです。 サ<br />
イクル 1 では x、 a、 b データ ポー ト が 読 み 込 まれ、 サ イ ク ル 2 では c データ ポー ト が 読 み 込 まれる 必 要 があ り ます。<br />
出 力 y はクロック サイクル 2 の 終 わ り で 使 用 可 能 にな り ます。<br />
ハー ド ウ ェ アで C コードをインプリ メン トする 利 点 は、 すべての 動 作 が 2 クロック サイクルのみで 終 わる 点 にあり<br />
ます。 CPU の 場 合 、 こ の よ う な 単 純 な コー ド 例 で も、 終 了 する のに さ ら に 多 く の ク ロ ッ ク サイクルがかかり ます。<br />
高 位 合 成 japan.xilinx.com 6<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-1<br />
図 1‐1:スケジューリングおよびバインディ ング<br />
1 クロック サ イ ク ルで ス ケジ ュール さ れる 演 算 数 は ク ロ ッ ク サ イ ク ルの 長 さ と その 演 算 が 終 了 する のにかか る 時 間<br />
に よ って 異 な り ます。 ターゲ ッ ト と し て 選 択 さ れた FPGA では、 各 演 算 が 終 了 する までにかか る 時 間 が 定 義 さ れてい<br />
ます。<br />
ク ロ ッ ク 周 期 が 長 い 場 合 、 よ り 高 速 な FPGA が ターゲ ッ ト の 場 合 、 1 つの ク ロ ッ ク サイクル 内 でよ り 多 くの 演 算 が 終<br />
了 でき るので、 図 1-1 で 示 し たすべての 演 算 を 1 ク ロ ッ ク で 終 了 する こ と も 可 能 です。 反 対 に、 ク ロ ッ ク 周 期 が 短 い<br />
場 合 (クロック 周 波 数 が 高 い 場 合 ) やターゲッ ト デバイ スの 速 度 が 遅 い 場 合 は、 HLS で 自 動 的 に 演 算 がよ り 多 く のク<br />
ロック サ イ ク ルで 終 了 する よ う にス ケジ ュール さ れます ( 演 算 の 中 にはマルチサ イ ク ル リソースとしてインプリメ<br />
ントする 必 要 のあるものもあります)。<br />
バインディングは、どのハードウェア リ ソ ースがス ケジ ュー リ ン グ さ れた 各 演 算 を イ ンプ リ メ ン ト する のか 決 定 する<br />
プロセスです。 図 1-1 に 示 すよ う に、 こ の 例 の 最 初 のバイ ンデ ィ ングでは Mul リソース ( 組 み 合 わせ 乗 算 器 ) を 使 用 し<br />
て 乗 算 演 算 が イ ンプ リ メ ン ト さ れ、 AddSub リソース ( 組 み 合 わせ 加 算 器 ま たは 減 算 器 ) を 使 用 し て 両 方 の 加 算 演 算 が<br />
インプリ メント されています。<br />
最 も 最 適 なソ リ ューシ ョ ンをインプリ メン トするため、 HLS では 合 成 の 最 終 段 階 で ターゲ ッ ト デバイ スに 関 する 特<br />
定 の 情 報 が 使 用 さ れます。 乗 算 器 と 加 算 演 算 の 1 つを 一 緒 に イ ンプ リ メ ン ト する には、 図 1-1 の「Target Binding Phase」<br />
高 位 合 成 japan.xilinx.com 7<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
部 分 に 示 すよ う に DSP48 リソースを 使 用 できます。DSP48 リソースは、FPGA アーキテ ク チャ で 使 用 可 能 な 計 算 ブ<br />
ロックで、 小 さいインプリメンテーション エ リ ア と 高 パフ ォーマン スの 理 想 的 なバラ ン ス を 提 供 し ます。<br />
た と えば、 通 常 の 組 み 合 わせ 乗 算 器 と バイ ンデ ィ ング プ ロ セ スの 代 わ り にマルチサ イ ク ルのパイ プ ラ イ ン 乗 算 器 を 使<br />
用 する と いった よ う なバイ ンデ ィ ング プ ロ セスでの 決 定 は、 演 算 のス ケジ ュー リ ングに 影 響 する ので、 ケジ ュー リ ン<br />
グ 中 に 考 慮 する 必 要 があ り ます。<br />
次 は、 高 位 合 成 の 2 つの 最 終 的 な 側 面 ( 制 御 ロ ジ ッ ク の 抽 出 と イ ンプ リ メ ンテーシ ョ ン、 および I/O ポー ト のイ ンプ<br />
リメンテーション) を 説 明 する ための コー ド 例 です。 次 の 新 し い コー ド では、 同 じ 演 算 が 実 行 さ れますが、 for-loop 内<br />
で 実 行 さ れ、 関 数 引 数 の う ちの 2 つが 配 列 であ る 点 が 異 な り ます。<br />
void foo(int in[3], char a, char b, char c, int out[3]) {<br />
int x,y;<br />
for(int i = 0; i < 3; i++) {<br />
x = in[i];<br />
y = a*x + b + c;<br />
out[i] = y;<br />
}<br />
}<br />
重 要 : こ の 結 果 、for-loop 内 のロ ジ ッ クはコー ド がス ケジ ュールされた と きに 3 回 実 行 さ れます。 高 位 合 成 では C コー<br />
ド か ら 自 動 的 に 制 御 ロ ジ ッ ク が 抽 出 さ れ、 RTL デザイ ンで 有 限 ステー ト マシン (FSM) が 作 成 されて、 これらの 演 算<br />
が 順 番 付 け られます。<br />
最 終 的 な RTL デザ イ ンでは、 最 上 位 関 数 引 数 がポー ト と し て イ ンプ リ メ ン ト さ れます。 char 型 のス カ ラー 変 数 が 標<br />
準 の 8 ビッ ト データ バス ポー ト にどの よ う にマ ッ プ さ れる かは、 簡 単 に 理 解 で き ます。 配 列 にはデータ の コ レ ク シ ョ<br />
ン 全 体 が 含 まれます。 高 位 合 成 の 配 列 は、 デフ ォル ト でブ ロ ッ ク RAM に 合 成 されます (ほかのオプシ ョ ン も 可 能 )。<br />
配 列 を 最 上 位 関 数 で 引 数 と し て 使 用 する と 、 HLS ではブロ ッ ク RAM が 最 上 位 関 数 の 外 部 にあ る と 仮 定 さ れ、 デザ イ<br />
ン 外 部 のブロ ッ ク RAM にアクセスするために 自 動 的 にポート (データ ポー ト 、 ア ド レ ス ポー ト 、 および 必 要 なチ ッ<br />
プ イネーブル 信 号 または 書 き 込 みイネーブル 信 号 ) が 作 成 されます。<br />
図 1-2 は、 新 し い コー ド 例 を 使 用 し た 場 合 の 最 終 的 な ス ケジ ュー リ ング 済 みデザ イ ン を 示 し ています。<br />
高 位 合 成 japan.xilinx.com 8<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-2<br />
図 1‐2: 抽 出 と IO ポー ト シーケンスの 制 御<br />
このイ ンプ リ メ ンテーシ ョ ンには、 次 のよ う な 側 面 があ り ます。<br />
• デザイ ンには FSM が 表 示 される よ う にな り ま し た。 これは 前 の 例 では、 説 明 を 簡 単 にするために 削 除 されてい<br />
ま し た。 こ のデザ イ ンの 演 算 全 体 では、 FSM がデータ を レ ジ ス タ に 格 納 する タ イ ミ ングおよび I/O 制 御 信 号 のス<br />
テー ト を 制 御 し ます。<br />
• FSM は C0 ステートで 開 始 され、 次 のクロックで C1 ステートになり、 その 後 、 C2 ステート、 C3 ステートにな<br />
ります。 これは、C1 (および C2、 C3) をあと 2 回 反 復 し てか ら、 C0 ステートに 戻 り ます。<br />
注 記 : これは、 C コードの for-loop の 制 御 構 造 と かな り 類 似 し ています。 ス テー ト の 全 体 の 順 番 は、 C0,{C1, C2,<br />
C3}, {C1, C2, C3}, {C1, C2, C3}, で、 最 後 に C0 に 戻 り ます。<br />
• 変 数 は、 b と c を 1 度 だけ 加 算 する こ と を 必 要 と し ます。 こ の 演 算 は for-loop 外 の C0 ステートで 実 行 されます。<br />
デザイ ンが C3 ス テー ト にな る たびに、 その 演 算 結 果 が 再 利 用 さ れます。<br />
• ブロック RAM には、 x データ 値 が 格 納 さ れ、 C1 ステー ト の 最 初 のエレ メ ン ト のア ド レ スが 生 成 されます。 FSM<br />
の 場 合 は、 正 しいア ド レ スが 変 数 in の I/O ポー ト に 提 供 さ れる よ う にな り ます。 また、C1 ス テー ト では、 加 算 器<br />
が 増 加 されて、 デザイ ンが C1、 C2、 C3 ス テー ト を 何 度 反 復 し たのかが 記 録 さ れます。<br />
• in のデータはブロ ッ ク RAM から C2 ステートに 戻 され、 変 数 x に 格 納 されます。<br />
• a ポー ト か ら のデータ がほかの 値 と 一 緒 に 読 み 込 まれて、 計 算 が 実 行 さ れます。 最 初 の y 出 力 が 生 成 さ れ、 FSM<br />
で こ の 値 をブ ロ ッ ク 外 に 格 納 する ために 正 し いア ド レ ス と 制 御 信 号 が 生 成 さ れます。<br />
• デザイ ンがC1 ステートに 戻 って、 配 列 /ブロック RAM から 次 の 値 が 読 み 込 まれます。<br />
• このプロセスは、 出 力 が 書 き 出 されるまで 続 きます。<br />
• こ の 後 、 デザ イ ンが C0 ステートに 戻 って b および c の 次 の 値 が 読 み 込 まれ、 プ ロ セ スが 最 初 か ら 再 開 さ れます。<br />
高 位 合 成 japan.xilinx.com 9<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
Vivado HLS では、 ツールのデフ ォル ト 動 作 と ユーザーが 指 定 し た 制 約 や 指 示 子 に 基 づいて、 最 適 な イ ンプ リ メ ンテー<br />
シ ョ ン を 短 時 間 で 作 成 で き ます。<br />
Vivado HLS のデフ ォル ト 動 作 は、 次 の よ う にま と め られます。<br />
• 最 上 位 関 数 の 引 数 は RTL 入 力 および 出 力 ポー ト に 合 成 さ れます。<br />
• C 関 数 は RTL 階 層 のブ ロ ッ ク に 合 成 さ れます。 C コー ド に 下 位 関 数 の 階 層 が 1 つ 含 まれる 場 合 、 最 終 的 な RTL<br />
デザイ ンには、 元 の C 関 数 の 階 層 と 1:1 で 対 応 する モジ ュール 階 層 ま たはエンテ ィ テ ィ が 含 まれます。<br />
• C 関 数 のループはデフ ォル ト で 維 持 さ れます。 つま り 、 合 成 でループの 反 復 の 1 つでロ ジ ッ クが 作 成 され、 RTL<br />
デザイ ンでシーケン スのループの 反 復 ご と に このロ ジ ッ ク が 実 行 されます。<br />
• C コー ド の 配 列 は 最 終 的 な FPGA デザイ ンではブロ ッ ク RAM に 合 成 さ れます。 配 列 が 最 上 位 関 数 イ ン ターフ ェ<br />
イスにある 場 合 は、 デザイン 外 のブロック RAM にアクセスするためのポー ト と してインプ リ メ ン ト される よ う<br />
にな り ます。<br />
最 適 化 指 示 子 を 使 用 する と 、 内 部 ロ ジ ッ ク と I/O ポー ト のデフ ォル ト 動 作 を 変 更 し た り 、 正 確 に 制 御 し た り で き ます。<br />
図 1-2 に 示 すハード ウ ェア インプリ メンテーションの 多 くのバリエーションは、 同 じ C コードから 生 成 されていま<br />
す。<br />
こ の 後 の 章 では、 特 定 の 要 件 において 最 も 理 想 的 な ソ リ ューシ ョ ン を 短 時 間 で 達 成 で き る よ う 制 約 および 指 示 子 を 設<br />
定 する 方 法 を 示 し ます。<br />
通 常 は、 新 し い イ ンプ リ メ ンテーシ ョ ン をすべて 詳 細 まで 確 認 する のは 時 間 がかかって、 生 産 性 が 悪 いので、 タ イ ミ<br />
ング を 満 た し てい る かど う かを 理 解 する ために こ こ で 示 す 方 法 を 使 用 する のはお 勧 め し ません。 最 も 生 産 的 なのは、<br />
高 位 合 成 で 生 成 さ れる 合 成 レポー ト を 確 認 する 方 法 です。 こ のレポー ト には、パフ ォーマン ス メトリックスの 詳 細 が<br />
含 まれます。 レポー ト を 解 析 し た ら、 最 適 化 指 示 子 を 使 用 し て、 必 要 な 結 果 にな る よ う に イ ンプ リ メ ンテーシ ョ ン を<br />
修 正 し てい く こ と がで き ます。<br />
重 要 : 高 位 合 成 で 作 成 さ れるデザ イ ンのパフ ォーマン ス 測 定 に 使 用 さ れる メ ト リ ッ ク スについて 理 解 し てお く こ と が<br />
重 要 と な り ます。<br />
• エリア<br />
• レイテンシ<br />
• 開 始 間 隔 (II)<br />
「エ リ ア」 は、 最 も 理 解 しやすいパフ ォーマンス メトリックスで、デザインをインプリメントするのに 必 要 なハード<br />
ウェア リソース 数 が 測 定 されます。エリアは、LUT、 レジスタ、ブロック RAM および DSP4 で 使 用 可 能 な リ ソース<br />
に よ って 測 定 さ れます。<br />
レ イ テンシ と 開 始 間 隔 (II) は 理 解 しに く いのですが、 イ ンプ リ メ ンテーシ ョ ンのパフ ォーマン スについてはそのレ イ<br />
テンシ と 開 始 間 隔 (II) について 理 解 し てか ら でない と 完 全 には 説 明 で き ないので、 先 に 進 む 前 にまず 説 明 し ておき ま<br />
す。<br />
図 1-3 は、 前 述 の 図 1-2 の 例 の 実 行 をサイ クルご と に 示 し ています。 図 には、 各 ク ロ ッ ク サイクルのステート を 読 み<br />
込 み、 計 算 、 書 き 出 し 操 作 と し てそれぞれ 記 述 し てあ り ます。<br />
高 位 合 成 japan.xilinx.com 10<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-3<br />
図 1‐3:レ イ テ ンシ と 開 始 間 隔<br />
• 関 数 のレ イ テンシ と は、その 関 数 がすべての 出 力 値 を 計 算 する までに 必 要 な ク ロ ッ ク 数 の こ と で、こ の 例 の 場 合 、<br />
すべての 値 を 出 力 する のに 10 クロック サ イ ク ル 分 かかっています。 出 力 が 配 列 の 場 合 、 レ イ テンシは 配 列 の 最<br />
後 の 出 力 値 に 合 わせて 計 測 さ れます。<br />
• 開 始 間 隔 (II) 関 数 は、 関 数 が 新 し い 入 力 データ を 受 信 する 前 の ク ロ ッ ク サイ クル 数 です。 こ の 例 の 場 合 II = 11 な<br />
ので、 関 数 が 新 し い 入 力 読 み 込 みセ ッ ト を 開 始 し てか ら 入 力 データ の 次 のセ ッ ト のプ ロ セス を 開 始 する までに 11<br />
クロック サイクルかかり ます。 1 つの 関 数 がすべて 実 行 さ れるのにかか る 時 間 は、 1 トランザクションと 呼 ばれ<br />
ます。 こ の 場 合 、 関 数 が 次 の ト ラ ンザ ク シ ョ ン 用 のデータ を 受 信 で き る までに 11 クロック サイクルかかり ます。<br />
• ループの 反 復 レ イ テンシは、 ループの 1 反 復 を 完 了 する のにかか る ク ロ ッ ク サ イ ク ル 数 です。 こ の 場 合 、 各 ルー<br />
プ 反 復 のレ イ テンシは 3 クロック サイクルです。<br />
• ループ 開 始 間 隔 は、 ループの 次 の 反 復 がデータ を 処 理 し 始 め る 前 の ク ロ ッ ク サイ クル 数 で、 こ の 例 の 場 合 、 ルー<br />
プ II = 3 です。<br />
• ループ レ イ テンシは、 ループのすべての 反 復 を 実 行 する サ イ ク ル 数 です。 こ の 例 の 場 合 、 ループ レイテンシは<br />
9 クロック サイクルです。<br />
レイテンシと II を 使 用 して、 インプ リ メ ンテーシ ョ ンのパフォーマンスを 記 述 して く ださい。 多 く のアプ リ ケーシ ョ<br />
ンの 場 合 、 各 ク ロ ッ ク サ イ ク ルで 新 し いサンプルを 処 理 する か、 II = 1 にするには、 ハード ウ ェア インプリ メンテー<br />
シ ョ ンが 必 要 です。 こ の 例 の 場 合 、 II = 11 ですが、 入 力 配 列 には 3 つのデータ エレ メン トが 含 まれるので、 デザイン<br />
はデータ を 11/3=3.66 クロック サンプル レー ト で 処 理 する こ と にな り ます。<br />
重 要 : C コー ド で 配 列 引 数 が 使 用 さ れる 場 合 は、 開 始 間 隔 を 確 認 する 際 に 配 列 のエレ メ ン ト 数 を 考 慮 する こ と が 重 要<br />
です。 開 始 間 隔 は、 配 列 内 のすべての 値 を 処 理 する のにかか る ク ロ ッ ク サイクル 数 です。<br />
高 位 合 成 japan.xilinx.com 11<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
次 のセ ク シ ョ ンでは、 Vivado HLS の 概 要 と その 機 能 について 説 明 し ます。<br />
Vivado HLS の 概 要<br />
Vivado HLS は、 ザ イ リ ン ク スの 高 位 合 成 ソ フ ト ウ ェ アで、 C 関 数 をハー ド ウ ェ ア シ ス テムに 統 合 可 能 な IP ブロック<br />
に 合 成 し ます。Vivado HLS には、 包 括 的 な 言 語 サポー ト およびユーザーの C アルゴ リ ズムの 最 適 なインプ リ メ ンテー<br />
シ ョ ン を 作 成 する 機 能 が 提 供 さ れてお り 、 残 り のザ イ リ ン ク ス デザイ ン ツール と 密 接 に 統 合 さ れています。<br />
図 1-4 は、 Vivado HLS の 入 力 および 出 力 フ ァ イルの 概 要 を 示 し ています。 Vivado HLS 内 部 の 機 能 によ り 、 次 のデザ<br />
イン フ ローが 有 効 にな り ます。<br />
• C アルゴ リ ズムをコンパイル、 実 行 (シミュレーション) およびデバ ッ グ<br />
• ユーザーの 最 適 化 指 示 子 あ り 、 ま たはな し で、 C アルゴ リ ズムを RTL シミュレーションに 合 成<br />
• 包 括 的 な レポー ト および 解 析 機 能<br />
• RTL イ ンプ リ メ ンテーシ ョ ンの 自 動 検 証<br />
• RTL インプリ メンテーションを 選 択 した IP フォーマッ トにパッケージ<br />
高 位 合 成 では、 コ ンパイル 済 み C プ ロ グ ラ ムの 実 行 が C シミュレーションと 記 述 されます。C アルゴ リ ズム を 実 行 す<br />
る と 、 そのアルゴ リ ズムが 機 能 的 に 正 し いのかど う かが 検 証 さ れる か ら です。<br />
Vivado HLS : 入 力 および 出 力<br />
Vivado HLS への 主 な 入 力 は C、 C++、 または SystemC で 記 述 された C 関 数 です。 こ の 関 数 には、 下 位 関 数 の 階 層 が 含<br />
まれる こ と があ り ます。 その 他 の 入 力 には、 制 約 および 指 示 子 が 含 まれます。 制 約 は 必 須 で、 ク ロ ッ ク 周 期 、 ク ロ ッ<br />
クのばらつき ( 指 定 されていない 場 合 はデフォル ト でク ロ ッ ク 周 期 の 12.5%)、お よ び FPGA ターゲッ トが 含 まれます。<br />
指 示 子 はオプシ ョ ンで、Vivado HLS ではこれらが 使 用 されて、 合 成 プロセスで 特 定 のビヘイビアーまたはインプリ メ<br />
ンテーシ ョ ンがインプリ メン ト されるよ うになっています。<br />
最 後 の 入 力 フ ァ イルの 種 類 は、 C テ ス ト ベンチおよび 関 連 フ ァ イルです。 高 位 合 成 では、 C テス トベンチを 使 用 して<br />
合 成 さ れる C 関 数 がシ ミ ュ レーシ ョ ン さ れます。 後 で この C テ ス ト ベンチが 再 利 用 さ れ、C/RTL 協 調 シ ミ ュ レーシ ョ<br />
ンで RTL 出 力 が 自 動 的 に 検 証 さ れます。<br />
C 入 力 フ ァ イル、 指 示 子 、 および 制 約 は Vivado のグラフ ィ カル ユーザー インターフェイス (GUI) を 使 用 して Vivado<br />
HLS プ ロ ジ ェ ク ト に イ ン タ ラ ク テ ィ ブに 追 加 する か、コ マン ド プロンプトで Tcl コマンドを 入 力 して 追 加 します。Tcl<br />
コマンドはファイルで 提 供 して、 バッチ モー ド で 実 行 する こ と も で き ます。<br />
Vivado HLS からの 主 な 出 力 は RTL 形 式 の イ ンプ リ メ ンテーシ ョ ンです。 RTL は、 論 理 合 成 に よ り 、 ゲー ト レベルの<br />
インプリ メンテーションと FPGA ビッ トスト リーム ファイルに 合 成 できます。 ビッ トスト リーム ファイルの 作 成 に<br />
必 要 な 開 発 ツールはすべて Vivado Design Suite に 含 まれています。 Vivado HLS からの RTL 出 力 は、 業 界 標 準 のハー<br />
ド ウ ェ ア 記 述 言 語 (HDL) 形 式 であ る Verilog および VHDL で 提 供 されます。RTL インプリメンテーションのバージョ<br />
ンは SystemC で も 提 供 さ れます。<br />
Vivado HLS の 出 力 フ ァ イルは、 次 の 業 界 標 準 で 提 供 さ れます。<br />
• VHDL (IEEE 1076-2000)<br />
• Verilog (IEEE 1364-2001)<br />
• SystemC (IEEE 1666-2006 -Version 2.2-)<br />
インプリ メンテーション ファイルは、ザイリンクス デザイ ン フ ローのほかのツール 内 で 使 用 でき る よ う に IP ブロッ<br />
クとしてパッケージされます。 パッケージされた IP は 論 理 合 成 を 使 用 し て FPGA をプログラムするために 使 用 され<br />
る ビ ッ ト ス ト リ ームに 合 成 さ れ、 Verilog および VHDL デザイ ン ファイルを 含 みます。<br />
SystemC 出 力 は 主 にシ ミ ュ レーシ ョ ン モデル と し て 提 供 されます。 この 形 式 は、パッ ケージ IP には 含 まれません。ザ<br />
イリンクスでは、RTL の SystemC を ビ ッ ト ス ト リ ームに 合 成 で き るデザ イ ン ツールは 提 供 し ていません。<br />
高 位 合 成 japan.xilinx.com 12<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
Vivado HLS では、 C/RTL 協 調 シ ミ ュ レーシ ョ ン 中 に C テス ト ベンチを 再 利 用 するために 必 要 なフ ァ イルが 自 動 的 に<br />
作 成 さ れます。 RTL 形 式 はサ イ ク ル 精 度 の 高 いハー ド ウ ェ ア 記 述 なので、 C テス トベンチでデータをサイクル 精 度 の<br />
高 い RTL インプリ メンテーション ファイルに 送 信 / 受 信 する ためには、 複 数 のアダプ ターおよびラ ッ パー ファイルが<br />
必 要 です。 シ ミ ュ レーシ ョ ンは 完 全 に 自 動 化 さ れてい る ので、 こ れら のシ ミ ュ レーシ ョ ン ファイルを 処 理 したり 編 集<br />
したりする 必 要 はありません。<br />
レポート フ ァ イルは、 合 成 、 C/RTL シミュレーションおよび IP パ ッ ケージの 後 に 生 成 さ れます。<br />
X-Ref Target - Figure 1-4<br />
図 1‐4:Vivado HLS の 概 要<br />
テストベンチ、 言 語 サポート、 C ライブラリ<br />
C プ ロ グ ラ ムではどれで も、 最 上 位 関 数 が main() と 呼 ばれます。 Vivado HLS デザイ ン フローでは、 main() の 下 のレ<br />
ベルの 関 数 を 合 成 で 最 上 位 関 数 と し て 指 定 で き ます。 main() 関 数 は 合 成 で き ません。<br />
• 合 成 で 最 上 位 関 数 と し て 選 択 で き る 関 数 は 1 つだけです。<br />
• 合 成 を 指 定 し たそれよ り 下 の 階 層 にあ る 関 数 も 合 成 さ れます。<br />
• 複 数 の 関 数 を 合 成 する 際 に、 それら の 関 数 が 最 上 位 関 数 の 階 層 にない 場 合 は、 1 つの 最 上 位 関 数 に 統 合 する 必 要<br />
があ り ます。<br />
高 位 合 成 japan.xilinx.com 13<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
C テス トベンチでは、 main() 関 数 と 最 上 位 関 数 の 階 層 にない 下 位 関 数 がすべて 記 述 さ れます。 こ れら の 関 数 は、 合 成<br />
で 最 上 位 関 数 が 機 能 的 に 問 題 ないかど う かを 検 証 する ために 使 用 さ れます。 こ れに よ り 、 関 数 に 合 成 用 ス テ ィ ミ ュ ラ<br />
が 提 供 さ れ、 その 出 力 を 消 費 し てそれが 正 し いかど う かが 検 証 さ れます。<br />
重 要 : テ ス ト ベンチを 使 用 し て 合 成 前 に C 関 数 を 検 証 する こ と を 強 く お 勧 め し ます。 テ ス ト ベンチの 使 用 の 詳 細 は、<br />
第 3 章 の 「C テス トベンチ」 を 参 照 して く ださい。<br />
高 位 合 成 デザ イ ン フ ローを 使 用 し た 場 合 の 最 大 の 生 産 性 の 損 失 は、 機 能 が 正 し く ない C 関 数 を 合 成 し た 場 合 に、 予<br />
測 し たパフ ォーマン ス 特 性 にな ら なかった 原 因 をつき と め る ため、 詳 細 な イ ンプ リ メ ンテーシ ョ ン 解 析 に 時 間 を 費 や<br />
すこ とにあり ます。<br />
推 奨 : 同 じ C テス トベンチは RTL 出 力 を 自 動 的 に 検 証 する ために も 使 用 さ れるので、 合 成 には 最 上 位 関 数 か ら の 出 力<br />
を 検 証 する C テ ス ト ベンチを 使 用 する こ と をお 勧 め し ます。<br />
テ ス ト ベンチを 指 定 する と 、 Vivado HLS で C シ ミ ュ レーシ ョ ン を コ ンパイルおよび 実 行 で き ます。 コ ンパイル プロ<br />
セス 中 はデバッグ オプシ ョ ン を 選 択 で き ます。 完 全 な C デバ ッ グ 環 境 が 開 いて、C シ ミ ュ レーシ ョ ン を 解 析 する のに<br />
使 用 で き ます。<br />
Vivado HLS では、 C コンパイル/シ ミ ュ レーシ ョ ンに 次 の 規 格 がサポー ト されています。<br />
• ANSI-C (GCC 4.6)<br />
• C++ (G++ 4.6)<br />
• SystemC (IEEE 1666-2006 -Version 2.2-)<br />
合 成 サポー ト は、 広 い 範 囲 の C、 C++、 SystemC 言 語 コ ン ス ト ラ ク ト 、 および float および double 型 も 含 め、 各 言 語 の<br />
すべてのネ イ テ ィ ブ データ 型 用 に 提 供 さ れていますが、 中 には 合 成 で き ない コ ン ス ト ラ ク ト も あ り ます。 合 成 で き な<br />
いコンス ト ラク トの 例 は 次 のとおりです。<br />
• ダイナミ ックなメモリ 割 り 当 て。FPGA には、 決 まった リ ソース セッ トが 含 まれます。ダイナミ ックなメモリ リ<br />
ソースの 作 成 (および 解 除 ) はサポー ト されません。<br />
• FPGA を 行 き 来 するすべてのデータは、 入 力 ポー ト か ら 読 み 込 まれる か、 出 力 ポー ト に 書 き 出 さ れます。 ただ し、<br />
ファイル アクセス ( 読 み 込 みま たは 書 き 出 し) のよ うな OS (オペレーテ ィ ング システム) 操 作 および OS クエ<br />
リー (た と えば、 時 間 および 日 付 ) はサポー ト されません。 これらの 操 作 は、 C テ ス ト ベンチで 実 行 し て、 合 成 に<br />
関 数 引 数 と し て 渡 す こ と がで き ます。<br />
サポー ト される C コンスト ラク ト とサポート されない C コンスト ラク トの 詳 細 および 主 なコンスト ラク トの 例 につ<br />
いては、 第 3 章 「 高 位 合 成 コーデ ィ ング スタイル」 を 参 照 して く ださい。<br />
また、Vivado HLS では 標 準 C 言 語 を 拡 張 する ための C ラ イ ブ ラ リ が 複 数 提 供 さ れています。C ライブラリには、FPGA<br />
の イ ンプ リ メ ンテーシ ョ ン 用 に 最 適 化 さ れた 関 数 およびコ ン ス ト ラ ク ト が 含 まれてお り 、 最 終 出 力 が QoR ( 結 果 の 品<br />
質 ) に 優 れた (つま り、 高 パフォーマンスで 最 適 な リ ソース 使 用 がされた) デザ イ ンにする ために 利 用 で き ます。 ラ イ<br />
ブラ リは C、 C++、 または SystemC で 提 供 されているので、 C 関 数 に 組 み 込 んで、 合 成 前 に 論 理 的 に 問 題 ないかど う<br />
かをシ ミ ュ レーシ ョ ンで 検 証 する こ と がで き ます。<br />
C ラ イ ブ ラ リ には、 次 の タ イ プが 提 供 さ れています。<br />
• 任 意 精 度 データ 型<br />
• 演 算 操 作<br />
• ビデオ 関 数<br />
• ザイ リ ンクス IP 関 数 (FFT および FIR)<br />
• FPGA リソース 関 数 (SRL リ ソース を 最 大 限 に 使 用 しやす く する ため)<br />
任 意 精 度 データ 型 ラ イ ブ ラ リ を 検 証 する と 、 こ れ ら の ラ イ ブ ラ リ が 優 れた QoR ( 結 果 の 品 質 ) のデザイ ンを 作 成 する<br />
際 に 役 立 つ こ と がわか り ます。<br />
高 位 合 成 japan.xilinx.com 14<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
標 準 C 型 は、 8 ビッ ト バウンダ リ (8、 16、 32、 64 ビット) に 基 づいています。 ハード ウ ェ ア プラッ ト フォームをター<br />
ゲ ッ ト にする 際 は、 特 定 のデータ 幅 のデータ 型 を 使 用 し た 方 が 効 率 的 な こ と が よ く あ り ます。<br />
た と えば、 作 成 するデザ イ ンがデータ 送 信 要 件 を 満 たすのに 10 ビ ッ ト の 入 力 データ と 18 ビ ッ ト の 出 力 データ のみを<br />
必 要 と する よ う な 通 信 プ ロ ト コルのフ ィ ルター 関 数 の 場 合 、 標 準 C データ 型 を 使 用 する と 、 入 力 データ が 少 な く と も<br />
16 ビ ッ ト 、 出 力 データ が 少 な く と も 32 ビ ッ ト 必 要 です。 最 終 的 なハー ド ウ ェ アでは、 こ れに よ り 入 力 と 出 力 間 のデー<br />
タパス も 作 成 さ れるので、 必 要 と し ていた よ り も 大 き なデータ 幅 にな り 、 リ ソース も よ り 多 く 使 用 さ れ、 遅 延 も 長 く<br />
なり (18 ビッ ト x18 ビ ッ ト の 乗 算 は 32 ビッ ト x 32 ビ ッ ト の 乗 算 よ り も 短 い 時 間 で 終 了 する ので)、 終 了 する のに さ ら<br />
に 多 く の ク ロ ッ ク サイクルが 必 要 になり ます。<br />
任 意 精 度 データ 型 を 使 用 する と 、 合 成 前 に C コードで 正 確 なビッ ト サ イ ズを 指 定 で き、 こ のア ッ プデー ト さ れた C<br />
コー ド をシ ミ ュ レーシ ョ ンで き る ので、 合 成 よ り も 前 に C シ ミ ュ レーシ ョ ンで 出 力 の 質 を 検 証 で き ます。<br />
重 要 : 任 意 精 度 データ 型 を 使 用 する と 、 C コードを 最 終 的 なハード ウェア イ ンプ リ メ ンテーシ ョ ンに 必 要 な 正 確 な<br />
ビッ ト サ イ ズでシ ミ ュ レーシ ョ ンで き、 結 果 を 合 成 前 に 検 証 で き ます。<br />
Vivado HLS では 内 部 ロ ジ ッ ク が 最 適 化 さ れ、 出 力 ポー ト にフ ァ ン ア ウ ト し ないデータ ビッ トおよびロジックが 削 除<br />
さ れるので、 任 意 精 度 型 は 関 数 のバウ ンダ リ でのみ 必 要 と な り ます。 C コー ド でデバ ッ グ 操 作 を 使 用 する には、 任 意<br />
精 度 型 にする 必 要 のあ る C コー ド のデータ 型 すべてをア ッ プデー ト し てお く こ と をお 勧 め し ます。 デバ ッ グ プロセ<br />
ス 中 に 1 つのデータ サイズから 次 のデータ サ イ ズに 変 換 する のは、 C コンパイラーで 処 理 されます。<br />
任 意 精 度 データ 型 は、 C および C++ 用 に 提 供 されてお り 、 1 ~ 1024 ビ ッ ト までの 幅 のデータ 型 を 記 述 でき る よ う に<br />
なっています (C++ 型 の 中 には 32768 ビッ トまで 記 述 できるものもあります)。 任 意 精 度 データ 型 の 詳 細 は、 「 効 率 的<br />
なハード ウ ェアのためのデータ 型 」 を 参 照 して く ださい。<br />
Vivado HLS で 提 供 される C 言 語 の 詳 細 は、 「ビデオ 関 数 の リ フ ァ レンス」 を 参 照 して く ださい。<br />
合 成 、 最 適 化 、 解 析<br />
Vivado HLS はプロジェ ク ト ベースで、 各 プ ロ ジ ェ ク ト に C コードが 1 セッ ト 含 まれます。 プロジェク トにはそれぞ<br />
れ 複 数 の ソ リ ューシ ョ ン を 含 め る こ と がで き ます。 ソ リ ューシ ョ ンに よ って、 異 な る 制 約 および 最 適 化 指 示 子 を 含 め<br />
ることができます。 各 ソリューションの 結 果 は、 それぞれ Vivado 統 合 デザ イ ン 環 境 (IDE) 内 で 比 較 で き ます。<br />
HLS デザイ ン プロセスでは、 最 初 のソ リ ューショ ンを 含 むプロジェク ト を 作 成 して、 エラーなく C シミュレーショ<br />
ンが 実 行 さ れる こ と を 確 認 し、 合 成 を 実 行 し て 最 初 の 結 果 セ ッ ト を 取 得 し ます。 こ の 後 、 結 果 を 解 析 し、 プ ロ ジ ェ ク<br />
ト 内 で 異 な る 制 約 および 最 適 化 指 示 子 を 指 定 し て 新 し い ソ リ ューシ ョ ン を 作 成 し、 新 し い ソ リ ューシ ョ ン を 合 成 し、<br />
デザ イ ンが 必 要 なパフ ォーマン ス 特 性 を 満 たすまで 同 じ プ ロ セス を 繰 り 返 し ます。 複 数 の ソ リ ューシ ョ ン を 使 用 する<br />
こ と で、 前 の 結 果 を 失 う こ と な く 開 発 を 進 める こ と ができ ます。<br />
Vivado HLS には、 デザ イ ンに 適 用 で き る 複 数 の 最 適 化 指 示 子 が 提 供 さ れています。 た と えば、 次 が 指 定 で き ます。<br />
• 関 数 、 ループ、 および 領 域 の 完 了 する までのレ イ テンシを 指 定<br />
• 使 用 さ れる リ ソースの 数 を 制 限<br />
• パイプライン 処 理 ( 現 在 の タ ス ク が 終 了 する 前 に 次 の タ ス ク が 開 始 可 能 ) でタ ス ク が 実 行 される よ う に 指 定<br />
• コー ド か ら 継 承 ま たは 暗 示 さ れた 依 存 度 を 上 書 き し、 操 作 を 許 可 。 た と えば、 ビデオ ストリームのように 最 初 の<br />
データ 値 を 削 除 ま たは 無 視 で き る 場 合 、 さ ら に 最 適 なパフ ォーマン ス 結 果 にな る のであれば、 メ モ リ を 書 き 込 み<br />
前 に 読 み 出 す こ と が 可 能 。<br />
最 適 化 は、 ソース コードでオブジェク ト を 参 照 する と、 Vivado IDE で 直 接 指 定 で き ます。 デザ イ ンで 実 行 可 能 な さ<br />
ま ざ ま な 最 適 化 については、 「デザ イ ン 最 適 化 」 を 参 照 して く ださい。<br />
推 奨 : デザ イ ンに 最 適 化 を 適 用 する 前 に 「HLS UltraFast 設 計 手 法 」 を 確 認 する こ と をお 勧 め し ます。<br />
論 理 階 層 およびビヘイ ビ アの 最 適 化 に 対 し て も、Vivado HLS では RTL デザイ ン ポー ト の 最 適 化 がサポー ト さ れます。<br />
高 位 合 成 japan.xilinx.com 15<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
合 成 さ れる 最 上 位 関 数 の 引 数 は、 最 終 的 な RTL デザイ ンで I/O ( 入 力 および 出 力 ) ポー ト と してイ ンプ リ メ ン ト されま<br />
す。 最 適 化 指 示 子 を 使 用 する と 、 こ れら の I/O ポー ト に I/O プ ロ ト コルを 選 択 し て イ ンプ リ メ ン ト で き ます。 I/O プロ<br />
ト コルを 選 択 する と 、 最 終 的 なデザ イ ン を 同 じ I/O プロ ト コルのほかのハード ウ ェア ブロッ クに 接 続 できます。<br />
下 位 関 数 で 使 用 さ れる I/O プロ ト コルは、Vivado HLS で 自 動 的 に 決 定 さ れます。 ポー ト を レ ジ ス タ に 付 け る 必 要 があ<br />
る かど う かを 指 定 する 以 外 に、 こ れ ら のポー ト についてユーザーが 指 定 で き る こ と はあ り ません。 I/O インターフェ<br />
イ スの 使 用 については、 「イ ン ターフ ェ イ スの 管 理 」 を 参 照 して く ださい。<br />
合 成 が 終 了 し た ら、 イ ンプ リ メ ンテーシ ョ ンのパフ ォーマン ス を 理 解 しやす く する ための 合 成 レポー ト が 自 動 的 に 作<br />
成 されます。Vivado HLS では、 詳 細 な 結 果 を イ ン タ ラ ク テ ィ ブに 解 析 する ためのグ ラ フ ィ カルな 解 析 情 報 が 提 供 さ れ<br />
ます。<br />
図 1-6 は、 「 高 位 合 成 の 理 解 」 で 説 明 され、 図 1-2に 示 し たデザ イ ンの 解 析 表 示 です。<br />
こ の 解 析 表 示 には、 図 1-2 と 同 じ 情 報 が 提 供 さ れています。<br />
• a、 b、 c ポー ト が 読 み 込 まれ、 加 算 演 算 が 最 初 のス テー ト C0 で 実 行 されます。<br />
• こ の 後 、 デザ イ ンはループに 入 り 、 ループのカ ウ ン ターが 増 加 し、 終 了 条 件 がチェ ッ ク さ れます。<br />
• データ が 変 数 x に 読 み 込 まれます。 ブ ロ ッ ク RAM にアクセス されるので、 これには 2 クロック サイクルが 必 要<br />
となります ( 最 初 の ク ロ ッ ク サ イ ク ルでア ド レ ス を 生 成 し、 次 のサ イ ク ルでデータ を 読 み 込 み)。<br />
• 最 後 に、 C3 ステートで 計 算 が 実 行 されて、y 出 力 がポー ト に 書 き 出 さ れます。 こ の 後 、 ループが 開 始 地 点 に 戻 り<br />
ます。<br />
こ の 短 い 説 明 で 示 すよ う に、 解 析 結 果 はイ ンプ リ メ ンテーシ ョ ンの 詳 細 な 解 析 に 使 用 で き ます。<br />
X-Ref Target - Figure 1-5<br />
RTL の 検 証<br />
合 成 が 終 了 し た ら、 Vivado HLS の RTL 検 証 機 能 を 使 用 し ます。<br />
C テス トベンチがプロジェク トに 追 加 された 場 合 は、 それを RTL の 機 能 が 元 の C と 同 じ かど う かを 検 証 する ために<br />
使 用 で き ます。<br />
重 要 : 結 果 の 検 証 は、 C テス トベンチで 実 行 されます。<br />
図 1‐5:Vivado HLS の 解 析 例<br />
高 位 合 成 japan.xilinx.com 16<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
C テ ス ト ベンチでは、 合 成 で 最 上 位 に 選 択 し た 関 数 か ら の 出 力 を 検 証 し、 結 果 が 正 し い 場 合 は、 最 上 位 関 数 main() に<br />
0 を 戻 します。 この 戻 り 値 が C シミュレーションと C/RTL 協 調 シ ミ ュ レーシ ョ ンの 両 方 で 使 用 さ れ、 結 果 が 正 し いか<br />
どうか 決 定 されます。0 以 外 の 値 が 戻 さ れた 場 合 は、シ ミ ュ レーシ ョ ンがエ ラーになった こ と を 意 味 し ます。 出 力 デー<br />
タが 正 し く、 有 効 であったとしても、 テス トベンチが main() 関 数 に 0 を 戻 さなければ、 Vivado HLS ではシ ミ ュ レー<br />
ション エラーとしてレポート されます。<br />
「サンプル デザ イ ンおよび 参 考 資 料 」 のすべてのサンプル デザ イ ンに こ の 方 法 で 動 作 する テ ス ト ベンチが 含 まれてお<br />
り、 リファレンスとして 使 用 できます。<br />
Vivado HLS では、 C/RTL 協 調 シ ミ ュ レーシ ョ ンを 実 行 する 構 造 が 自 動 的 に 作 成 され、 サポー ト される 次 のいずれか<br />
の RTL シミュレータを 使 用 してシミュレーションが 実 行 されます。<br />
• Vivado シミュレータ<br />
• Questa SIM<br />
• VCS<br />
• NCSim<br />
• ISim<br />
• Riviera<br />
• Open SystemC Initiative (OSCI)<br />
シ ミ ュ レーシ ョ ンにハー ド ウ ェ ア 記 述 言 語 (HDL) の Verilog または VHDL を 選 択 した 場 合 は、 その HDL シミュレー<br />
タが 使 用 されます。 サポート されている HDL シミュレータを 使 用 するには、 そのシミュレータのベンダーからライ<br />
セン ス を 取 得 する 必 要 があ り ます (Vivado シ ミュレータおよび ISim のライセンスは 既 に 含 まれています)。 VCS、<br />
NCSim および Riviera HDL シミュレータは Linux OS でのみサポー ト されます。<br />
SystemC の RTL 出 力 はビル ト イ ンの SystemC カーネルを 使 用 して 検 証 でき るので、サードパーテ ィ の RTL シミュレー<br />
タやライセンスは 必 要 あ り ません。<br />
こ の 手 順 に 関 する 詳 細 は、 「C/RTL 協 調 シ ミ ュ レーシ ョ ンの 使 用 」 を 参 照 して く ださい。<br />
Vivado HLS からの 出 力 の 使 用<br />
RTL エ ク ス ポー ト 機 能 を 使 用 する と 、 最 終 的 な RTL 出 力 フ ァ イルを IP としてパッケージできます。IP は、 次 の 5 つ<br />
のザイ リ ン ク ス IP フォーマッ トのいずれかでパッケージできます。<br />
• [Vivado IP Catalog] : Vivado Design Suite の Vivado IP カタログにインポートできます。<br />
• [System Generator for DSP] : System Generator for DSP (Vivado エデ ィ シ ョ ン) にインポートできます。<br />
• [System Generator for DSP (ISE)] : System Generator for DSP (ISE エデ ィ シ ョ ン) にインポートできます。<br />
• [Pcore for EDK] : Xilinx Platform Studio にインポートできます。<br />
• [Synthesized Checkpoint (.dcp)] : Vivado チェッ クポイン ト と 同 じ 方 法 で Vivado Design Suite に 直 接 イ ンポー ト でき<br />
ます。<br />
[Synthesized Checkpoint (.dcp)] フ ォーマ ッ ト では、 論 理 合 成 が 起 動 さ れて、 RTL インプリ メンテーションがゲート レ<br />
ベルのイ ンプ リ メ ンテーシ ョ ンにコ ンパイルされます。 こ のゲー ト レベルのインプ リ メ ンテーシ ョ ンが IP パッケー<br />
ジに 含 まれます。<br />
その 他 の IP フ ォーマ ッ ト の 場 合 、RTL パッケージ プロセスでは、オプショ ンで Vivado HLS デザ イ ン 環 境 内 か ら 論 理<br />
合 成 を 実 行 し て、 RTL 合 成 の 結 果 を 評 価 する こ と も で き ます。 こ のオプシ ョ ンの 手 順 に よ り 、 Vivado HLS で 提 供 さ<br />
れるタイ ミ ングおよびエリ アの 概 算 が IP パッケージのハンドオフ 前 に 確 認 できます。 このゲート レベルの 結 果 は、<br />
パッケージされた IP には 含 まれません。<br />
Vivado HLS を 使 用 する と 、 各 FOGA ごとのビルトイン ラ イ ブ ラ リ に 基 づいて タ イ ミ ングおよびエ リ ア リソースが 概<br />
算 さ れます。 論 理 合 成 を 使 用 し て RTL をゲート レベルのインプ リ メ ンテーシ ョ ンにコンパイルし、FPGA でそのゲー<br />
ト の 物 理 的 配 置 と ゲー ト 間 の 内 部 接 続 の 配 線 を 実 行 し た 場 合 は、 追 加 で 最 適 化 が さ れて Vivado HLS の 概 算 が 変 わっ<br />
てしまう こともあります。<br />
高 位 合 成 japan.xilinx.com 17<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
こ の 手 順 に 関 する 詳 細 は、 「RTL デザイ ンのエ ク スポー ト 」 を 参 照 して く ださい。<br />
Vivado HLS の 使 用<br />
Windows プラッ ト フォームで Vivado HLS を 起 動 する には、デス ク ト ッ プで [Vivado HLS] アイコン ( 図 1-6) をク リ ッ<br />
クします。<br />
X-Ref Target - Figure 1-6<br />
Linux で Vivado HLS を 起 動 する には (または Vivado HLS コマンド プ ロ ンプ ト か ら 起 動 する には)、コマンド プロンプ<br />
トで 次 のコマンドを 実 行 します。<br />
$ vivado_hls<br />
図 1-7 に 示 す Vivado HLS の GUI が 開 き ます。<br />
図 1‐6:Vivado HLS の GUI アイコン<br />
X-Ref Target - Figure 1-7<br />
図 1‐7:GUI モード<br />
高 位 合 成 japan.xilinx.com 18<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
図 1-7 の [Getting Started] の 下 には、 次 のタ ス ク が リ ス ト されています。<br />
• [Create New Project] : プ ロ ジ ェ ク ト 設 定 ウ ィ ザー ド が 起 動 し ます。<br />
• [Open Project] : 既 存 プ ロ ジ ェ ク ト を 選 択 する か、 最 近 使 用 し たプ ロ ジ ェ ク ト の リ ス ト か ら 選 択 し ます。<br />
• [Open Example Project] : Vivado HLS のサンプル 例 を 開 き ます。 こ れら のサンプルの 詳 細 は、 「サンプル デザイ ン<br />
および 参 考 資 料 」 を 参 照 して く ださい。<br />
図 1-7 の [Documentation] の 下 には、 次 のタ ス ク が リ ス ト されています。<br />
• [Tutorials] : 『Vivado Design Suite チュート リ アル : 高 位 合 成 』 (UG871) を 開 きます。 チュー ト リ アルのサンプル<br />
デザイ ンの 詳 細 は、 「サンプル デザ イ ンおよび 参 考 資 料 」 を 参 照 して く ださい。<br />
• [User Guide] : 本 書 、 『Vivado Design Suite ユーザー ガイド : 高 位 合 成 』 (UG902) を 開 きます。<br />
• [Release Note Guide] : 最 新 の ソ フ ト ウ ェ ア バージ ョ ンの 『Vivado Design Suite ユーザー ガイド : リリース ノート、<br />
インストール、 およびライセンス』 (UG973) を 開 きます。<br />
Vivado HLS を 使 用 する 主 な コ マン ド ボタンは、 ツールバーに 含 まれます ( 図 1-8)。 現 在 実 行 可 能 な コ マン ド 以 外 は、<br />
淡 色 表 示 さ れます。 た と えば、 合 成 は C/RTL 協 調 シ ミ ュ レーシ ョ ン を 実 行 する 前 に 実 行 する 必 要 があ る ので、 合 成 が<br />
完 了 する まで [C/RTL Cosimulation] ボ タ ンは 淡 色 表 示 にな り ます。<br />
X-Ref Target - Figure 1-8<br />
図 1‐8:Vivado HLS のツールバー<br />
図 の 「Project Management」 (プロジェク ト 管 理 ) 部 分 のボ タ ン を 左 か ら 右 に 向 かって 説 明 し ます。<br />
• [Create New Project] : 新 規 プ ロ ジ ェ ク ト ウィザードを 開 きます。<br />
• [Project Settings] : 現 在 のプ ロ ジ ェ ク ト 設 定 を 変 更 で き ます。<br />
• [New Solution] : 新 規 ソ リ ューシ ョ ン を 作 成 する ダ イ ア ロ グ ボックスを 開 きます。<br />
• [Solution Settings] : 現 在 の ソ リ ューシ ョ ン 設 定 を 変 更 で き ます。<br />
ツールバーの 図 の 次 の 「Operation」 (ツール 操 作 ) 部 分 のボ タ ン を 左 か ら 右 に 向 かって 説 明 し ます。<br />
• [Index C Source] : C ソースのア ノ テーシ ョ ン を 更 新 し ます。<br />
• [Run C Simulation] : [C Simulation] ダイアログ ボックスが 開 きます。<br />
• [C Synthesis] : C ソース コー ド の 高 位 合 成 を 開 始 し ます。<br />
• [Run C/RTL Cosimulation] : RTL 出 力 を 検 証 し ます。<br />
• [Export RTL] : RTL を 指 定 した IP 出 力 フ ォーマ ッ ト でパ ッ ケージ し ます。<br />
ツールバーの 図 の 次 の 「Analysis」 (デザイ ン 解 析 ) 部 分 のボ タ ン を 左 か ら 右 に 向 かって 説 明 し ます。<br />
• [Open Report] : C 合 成 レポートを 開 くか、 ほかのレポートを 開 くためのドロップダウン リストを 開 きます。<br />
• [Compare Reports] : さ ま ざ ま な ソ リ ューシ ョ ンか ら のレポー ト を 比 較 で き ます。<br />
高 位 合 成 japan.xilinx.com 19<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ツールバーの 各 ボ タ ンには、 それに 対 応 する メ ニ ュー コ マン ド があ り ます。 ツールバー ボタンに 加 えて、 次 の 表 示<br />
も 提 供 さ れています。 表 示 方 法 を 選 択 する と 、 ビ ューが 自 動 的 に 選 択 し た タ ス ク に 合 った 表 示 に 自 動 的 に 切 り 替 わ り<br />
ます。<br />
• [Debug] : C デバ ッ ガーが 開 き ます。<br />
• [Synthesis] : 合 成 を 実 行 する ためのデフ ォル ト の 表 示 です。<br />
• [Analysis] : 合 成 後 にデザ イ ン を 詳 細 に 解 析 する ために 使 用 し ます。 こ の 表 示 には、 合 成 レポー ト よ り も 詳 細 な 情<br />
報 が 含 まれます。<br />
表 示 は、 ボ タ ンでいつで も 切 り 替 え る こ と がで き ます。<br />
本 章 の 残 り の 部 分 では、 Vivado HLS の 使 用 方 法 について 説 明 し ます。 説 明 さ れる ト ピ ッ ク は 次 の と お り です。<br />
• Vivado HLS 合 成 レポー ト の 作 成 方 法<br />
• C コー ド のシ ミ ュ レーシ ョ ンおよびデバ ッ グ 方 法<br />
• デザ イ ンの 合 成 、 新 し い ソ リ ューシ ョ ンの 作 成 、 最 適 化 の 追 加 方 法<br />
• デザ イ ン 解 析 の 実 行 方 法<br />
• RTL 出 力 の 検 証 およびパ ッ ケージ 方 法<br />
• Vivado HLS Tcl コマンドおよびバッチ モー ド の 使 用 方 法<br />
最 後 に、 デザ イ ン サンプル、 チュート リ アル、 その 他 の リ ソースを 示 します。<br />
新 規 合 成 プ ロジ ェ ク ト の 作 成<br />
新 規 プ ロ ジ ェ ク ト を 作 成 する には、Welcome ページ ( 図 1-7) の [Create New Project] リンクをクリックするか、[File] →<br />
[New Project] メニューをクリックし、 プロジェクト ウ ィザードを 開 きます。<br />
ウィザードの 1 ページ 目 では、 プ ロ ジ ェ ク ト の 仕 様 を 指 定 し ます ( 図 1-9)。<br />
次 を 指 定 し ます。<br />
• [Project name] : プ ロ ジ ェ ク ト 名 を 指 定 し ます。 こ の 名 前 は、 プ ロ ジ ェ ク ト が 保 存 さ れるデ ィ レ ク ト リ 名 と し て も<br />
使 用 さ れます。<br />
• [Location] : プ ロ ジ ェ ク ト の 保 存 先 を 指 定 し ます。<br />
高 位 合 成 japan.xilinx.com 20<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-9<br />
図 1‐9:プロジェク ト 仕 様<br />
[Next] を ク リ ッ ク し て 次 のページに 進 むと 、 プロ ジェ ク ト の C ソ ース を 追 加 するページ ( 図 1-10) が 表 示 されます。<br />
• [Top Function] : 合 成 する 最 上 位 関 数 の 名 前 を 指 定 し ます。<br />
注 記 : プロジェク ト を SystemC と し て 指 定 する 場 合 は こ れは 不 要 です。Vivado HLS では 自 動 的 に 最 上 位 関 数 が 認 識 さ<br />
れます。<br />
[Add Files] をク リ ックし、 ソース コード フ ァ イルをプ ロ ジ ェ ク ト に 追 加 し ます。<br />
重 要 : ヘッダー ファイル ( 拡 張 子 は .h) は [Add Files] ボ タ ン ま たはそれに 対 応 する Tcl コマンドの add_files を 使 用 して<br />
追 加 しないよ うにしてください。<br />
プロジェクトを 含 むディレクトリ ( 図 1-9) には 自 動 的 にヘ ッ ダー ファイルが 含 まれています。Vivado HLS C ライブラ<br />
リ に 必 要 なヘ ッ ダー ファイルについても、 C コー ド で 指 定 さ れていれば、 同 じ よ う に 含 まれます。<br />
重 要 : その 他 すべてのヘ ッ ダー ファイルへのパスは、[Edit CFLAGS] ボ タ ン を 使 用 し て 指 定 する 必 要 があ り ます。 次<br />
の 図 は、 その 例 です。<br />
[Edit CFLAGS] をクリ ックすると、 指 定 された C コー ド を コ ンパイルする ために 必 要 な C コンパイラ フラグ オプシ ョ<br />
ンを 使 用 できます。 これらは、gcc または g++ で 使 用 されるの と 同 じ コ ンパイ ラ フラグ オプシ ョ ンです。 C コンパイ<br />
高 位 合 成 japan.xilinx.com 21<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ラ フラグの 例 には、 ヘッダー フ ァ イルへのパス 名 、 マ ク ロ 仕 様 、 およびコ ンパイ ラ 指 示 子 が 含 まれます。 次 はその<br />
例 です。<br />
• –I/project/source/headers : 関 連 するヘ ッ ダー ファイルの 検 索 パスを 指 定<br />
• –DMACRO_1 : コンパイル 中 に MACRO_1 を 定 義<br />
• –fnested: ネ ス ト さ れた 関 数 を 含 むデザ イ ンに 必 要<br />
X-Ref Target - Figure 1-10<br />
図 1‐10 : プロジェク トのソース ファイル<br />
ウ ィ ザー ド の 次 のページでは、 テ ス ト ベンチに 関 連 する フ ァ イルをプ ロ ジ ェ ク ト に 追 加 し ます。<br />
Vivado HLS に 含 まれるほ と んどのサンプル デザ イ ンの 場 合 、 テ ス ト ベンチはデザ イ ン と は 別 のフ ァ イルになってお<br />
り 、 必 須 のフ ァ イルではあ り ません。 テ ス ト ベンチ と 合 成 する 関 数 を 別 フ ァ イルに し てお く と 、 シ ミ ュ レーシ ョ ン と<br />
合 成 のプ ロ セス を 分 離 で き ます。 テ ス ト ベンチが 合 成 さ れる 関 数 と 同 じ フ ァ イル 内 に 含 まれる 場 合 、 次 の 手 順 で 示 す<br />
ように、 ソース ファイルとしてテストベンチ フ ァ イルを 追 加 する 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 22<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-11<br />
図 1‐11 : プロジェク トのテストベンチ ファイル<br />
C ソース ファイルと 同 様 に、 [Add Files] をク リ ックして C テス トベンチを 追 加 し、 [Edit CFLAGS] をクリ ックして C<br />
コンパイラ オプシ ョ ンを 含 めます。<br />
C ソース フ ァ イル と 共 に、 テ ス ト ベンチで 読 み 込 まれるすべてのフ ァ イルをプ ロ ジ ェ ク ト に 追 加 する 必 要 があ り ま<br />
す。 図 1-11 の 例 では、 テ ス ト ベンチで 入 力 ス テ ィ ミ ュ ラ ス を 供 給 する in.dat フ ァ イル と 、 予 測 さ れる 結 果 を 読 み 込 む<br />
out.golden.dat ファイルが 使 用 されます。 テス トベンチがこれらのファイルにアクセスするので、 これらもプロジェク<br />
ト に 追 加 する 必 要 があ り ます。<br />
テス トベンチ フ ァ イルがデ ィ レ ク ト リ にあ る 場 合 は、 個 々のフ ァ イルではな く 、 [Add Folders] ボタンでディレク ト リ<br />
全 体 を 追 加 で き ます。<br />
C テス ト ベンチがない 場 合 は、こ こ で 何 も 入 力 する 必 要 はあ り ません。[Next] をクリ ックすると、 最 初 のソリューショ<br />
ンの 詳 細 を 入 力 する ウ ィ ザー ド の 最 後 のページが 表 示 さ れます ( 図 1-12)。<br />
重 要 : テ ス ト ベンチを 使 用 する こ と を 強 く お 勧 め し ます。 テ ス ト ベンチをプ ロ ジ ェ ク ト に 追 加 する 理 由 に 関 する 重 要<br />
な 生 産 性 情 報 については、 「テス ト ベンチ : 生 産 性 向 上 には 必 須 」 を 参 照 して く ださい。<br />
高 位 合 成 japan.xilinx.com 23<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-12<br />
図 1‐12 : 最 初 のソ リ ューシ ョ ンの 設 定<br />
新 規 プ ロ ジ ェ ク ト ウ ィ ザー ド の 最 後 の 画 面 では、 最 初 の ソ リ ューシ ョ ンの 詳 細 を 指 定 で き ます ( 図 1-12)。<br />
• [Solutioin Name] : デフォル ト ではソ リ ューシ ョ ン 名 に 「solution1」 が 指 定 さ れますが、 変 更 で き ます。<br />
• [Clock Period] : ns または Mhz ( 例 : 150Mhz) を 付 けて 指 定 し た 周 波 数 の 単 位 で ク ロ ッ ク 周 波 数 を 指 定 し ます。<br />
• [Uncertainty] : 合 成 で 使 用 さ れる ク ロ ッ ク 周 期 は、 ク ロ ッ ク 周 期 か ら ク ロ ッ ク のばらつき を 引 いた 値 にな り ます。<br />
Vivado HLS では、 内 部 モデルを 使 用 して、 各 FPGA デバイ スの 操 作 の 遅 延 が 概 算 されます。 [Uncertainty] に 入 力<br />
するク ロ ッ クのばらつきの 値 は、 RTL 合 成 、 配 置 配 線 に よ る ネ ッ ト 遅 延 の 増 加 を 考 慮 する ためのマージン を ns<br />
で 指 定 で き ます。 指 定 し ない 場 合 、 ク ロ ッ ク のばらつきは ク ロ ッ ク 周 期 の 12.5% に 設 定 されます。<br />
• [Part] : 適 切 なパーツ を 選 択 し ます ( 図 1-13)。<br />
高 位 合 成 japan.xilinx.com 24<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-13<br />
図 1‐13 : パーツ 選 択<br />
[RTL Tool] は [auto]、 [ISE]、 [Vivado] に 設 定 でき ます。 2013.2 リリースの ISE および Vivado RTL 合 成 ーツールか ら は<br />
浮 動 小 数 点 コ アに 対 し て 別 のモデルを 使 用 し ています。 こ の 設 定 に よ り 、 ターゲ ッ ト 合 成 ツールに 対 し て 正 し い 浮 動<br />
小 数 点 コ アが 使 用 さ れます。 こ の 設 定 がデフ ォル ト の [auto] のままになっている と、7 シリーズおよび Zynq® パーツ<br />
の RTL 合 成 が Vivado で 実 行 され、 それ 以 外 のデバイ スは ISE で 合 成 さ れます。 こ れ 以 外 の 設 定 の 場 合 は、 RTL 合 成<br />
には 指 定 し た ツールが 使 用 さ れます。<br />
ターゲッ トにする FPGA を 選 択 します。 フ ィ ルターを 使 用 する と 、デバイ ス リストに 表 示 されるデバイス 数 を 減 らす<br />
こ と がで き ます。 ターゲ ッ ト がボー ド の 場 合 、 左 上 でボー ド を 選 択 する と 、 デバイ ス リストがサポートされるボード<br />
のリストに 変 わります (Vivado HLS では 自 動 的 に 正 し い ターゲ ッ ト デバイ スが 選 択 されます)。<br />
[Finish] をクリ ックすると、 プロジェク トが 開 きます ( 図 1-14)。<br />
高 位 合 成 japan.xilinx.com 25<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-14<br />
Vivado HLS のグラフ ィ カル ユーザー インターフェイスには、 次 の 4 つのエ リ アが 含 まれます。<br />
• 左 側 のエ ク スプ ローラー エ リ アでは、 プ ロ ジ ェ ク ト 階 層 を 表 示 で き ます。 こ の 階 層 はデ ィ ス ク のプ ロ ジ ェ ク ト<br />
ディレク ト リ と 同 じです。<br />
• 真 ん 中 の 情 報 エ リ アには、 フ ァ イルが 表 示 さ れます。 フ ァ イルはエ ク スプ ローラー エリアでダブルクリックする<br />
と 開 きます。<br />
• 右 側 の 補 足 エ リ アには、 情 報 エ リ アで 開 いたフ ァ イルに 関 する 情 報 が 表 示 されます。<br />
• 下 部 の コ ン ソール エリアには、Vivado HLS を 実 行 し た と き の 出 力 が 表 示 さ れます。<br />
C コードのシミ ュレーショ ン<br />
図 1‐14 : 新 規 プ ロジ ェ ク ト<br />
Vivado HLS フローでの 検 証 には、 大 きく 分 けて 2 つのプロセスが 含 まれます。<br />
• C プ ロ グ ラ ムが 正 し く 必 要 な 機 能 を イ ンプ リ メ ン ト する かど う かを 確 認 する ための 合 成 前 の 検 証<br />
• RTL が 正 し いかど う か 確 認 する 合 成 後 の 検 証<br />
どちらのプロセスも 「シミ ュレーショ ン」 で、 それぞれ 「C シ ミュレーション」 と 「C/RTL 協 調 シ ミ ュ レーシ ョ ン」<br />
と 呼 ばれます。<br />
合 成 前 に、 合 成 する 関 数 を C シ ミ ュ レーシ ョ ン を 使 用 し たテ ス ト ベンチで 検 証 する 必 要 があ り ます。 C テス トベンチ<br />
には、 最 上 位 関 数 の main() と 合 成 される 関 数 が 含 まれます。 その 他 の 関 数 が 含 まれる こ と も あ り ます。 理 想 的 な<br />
テ ス ト ベンチには、 次 の よ う な 特 徴 があ り ます。<br />
• テ ス ト ベンチにはセルフチェ ッ ク 機 能 があ り 、 合 成 さ れる 関 数 か ら の 結 果 が 正 し いかど う かが 検 証 さ れます。<br />
高 位 合 成 japan.xilinx.com 26<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
• 結 果 が 正 し ければ、 テ ス ト ベンチが main() に 値 0 を 戻 し ます。 正 し く ない 場 合 は、 0 以 外 の 値 が 戻 されるはず<br />
です。<br />
テス トベンチの 詳 細 は、 「C テス トベンチ」 を 参 照 して く ださい。<br />
[Run C Simulation] ツールバー ボタンをク リ ックすると、 [C Simulation] ダイアログ ボックスが 開 きます ( 図 1-15)。<br />
X-Ref Target - Figure 1-15<br />
図 1‐15 : [C Simulation] ダイアログ ボックス<br />
ダイアログ ボ ッ ク スでオプシ ョ ン を 選 択 し なければ、 C コードがコンパイルされて、C シ ミ ュ レーシ ョ ンが 自 動 的 に<br />
実 行 さ れます。 結 果 は、 図 1-16 のよ うになり ます。<br />
C コー ド が 問 題 な く シ ミ ュ レーシ ョ ン さ れた ら、 [Console] ビューに [SIM-1] メッセージが 表 示 されます ( 図 1-16)。 テ<br />
ストベンチは 使 用 された printf コマンドをすべてコンソールにエコーし、 「Test Passed!」 という メ ッセージを 表 示<br />
します ( 図 1-16)。<br />
高 位 合 成 japan.xilinx.com 27<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-16<br />
図 1‐16 : C デザイ ンのコ ンパイル 結 果<br />
[C Simulation Dialog] ダイアログ ボックスのオプションは、 次 のとおりです。<br />
• [Debug] : C コー ド が コ ンパイルされ、 画 面 が 自 動 的 にデバ ッ グ モー ド の 表 示 にな り ます。 デバ ッ グ 表 示 か ら、 左<br />
上 の [Synthesis] 表 示 ボ タ ン を ク リ ッ ク する と 、 合 成 モー ド に 表 示 が 戻 り ます。<br />
• [Build Only] : C コードがコンパイルされますが、 シ ミ ュレーシ ョ ンは 実 行 されません。 C シミュレーションを 実<br />
行 する 詳 細 については、 「C シ ミ ュ レーシ ョ ンの 出 力 確 認 」 を 参 照 して く ださい。<br />
• [Clean Build] : コードをコンパイルする 前 に、 既 存 の 実 行 ファ イルとオブジェク ト ファイルがプロジェク トから<br />
削 除 さ れます。<br />
• [Optimized Compile] : デフ ォル ト では、 デザイ ンはデバ ッ グ 情 報 を 含 めて コ ンパイルされ、 コ ンパイルがデバ ッ<br />
グ モー ド 表 示 で 解 析 さ れる よ う にで き ます。 こ のオプシ ョ ンでは、デザ イ ン を コ ンパイルする 際 に よ り 高 いレベ<br />
ルの 最 適 化 エフ ォー ト が 使 用 さ れますが、デバ ッ ガーで 必 要 と さ れるすべての 情 報 は 削 除 さ れます。こ れに よ り 、<br />
コ ンパイル 時 間 は 増 加 する 可 能 性 があ り ますが、 シ ミ ュ レーシ ョ ン 実 行 時 間 は 削 減 さ れます。<br />
高 位 合 成 japan.xilinx.com 28<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
[Debug] ボタ ンを ク リ ッ クする と 、 表 示 がデバ ッ グ 用 に 切 り 替 わってデバッ グ 環 境 が 開 き ます ( 図 1-17)。 これは、す<br />
べての 機 能 を 備 えた C デバ ッ グ 環 境 です。 ス テ ッ プ ボタン ( 図 1-17 の 赤 で 囲 った 部 分 ) を 使 用 する と 、 コー ド を 1 行<br />
ずつ 移 動 で き、 ブレー ク ポ イ ン ト を 設 定 し た り 、 変 数 の 値 が 直 接 表 示 し た り で き ます。<br />
X-Ref Target - Figure 1-17<br />
図 1‐17 : C デバッ グ 環 境<br />
[Synthesis] ボ タ ン を ク リ ッ ク する と 、 標 準 の 合 成 表 示 に 戻 り ます。<br />
高 位 合 成 japan.xilinx.com 29<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
C シ ミ ュ レーシ ョ ンの 出 力 確 認<br />
C シミュレーションが 終 了 したら、solution フ ォルダー 内 に csim フ ォルダーが 作 成 さ れます。<br />
X-Ref Target - Figure 1-18<br />
csim/build フォルダーは、 C シ ミ ュ レーシ ョ ンに 関 するすべてのフ ァ イルの 主 要 デ ィ レ ク ト リ です。<br />
• テ ス ト ベンチで 読 み 込 まれるすべてのフ ァ イルが こ のフ ォルダーに コ ピー さ れます。<br />
• C 実 行 フ ァ イルの csim.exe が 作 成 され、 このフォルダー 内 で 実 行 されます。<br />
• テス トベンチで 書 き 出 されるすべてのファ イルがこのフォルダーで 作 成 されます。<br />
[C Simulation] ダイアログ ボックスで [Build Only] をオンにする と、 このフォルダー 内 に csim.exe ファイルが 作 成<br />
されますが、 ファイルは 実 行 されません。 コマンド シ ェルか ら こ のフ ァ イルを 実 行 する と 、 C シミュレーションが 手<br />
動 で 実 行 で き ます。 Windows の 場 合 は、 Vivado HLS コマンド シェルを [スタート] メ ニ ューか ら 使 用 し ます。<br />
csim/report フォルダーには、 C シミュレーションのログ ファイルが 含 まれます。<br />
この 後 の Vivado HLS デザイ ン フ ローの 手 順 は、 合 成 の 実 行 です。<br />
C コードの 合 成<br />
このセ ク シ ョ ンでは、 次 の 点 について 説 明 し ます。<br />
• 最 初 の ソ リ ューシ ョ ンの 作 成<br />
• 合 成 の 出 力 確 認<br />
図 1‐18 : C シ ミ ュ レーシ ョ ンの 出 力 フ ァ イル<br />
高 位 合 成 japan.xilinx.com 30<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
• 合 成 結 果 の 解 析<br />
• 新 規 ソ リ ューシ ョ ンの 作 成<br />
• 最 適 化 指 示 の 適 用<br />
最 初 のソ リ ューシ ョ ンの 作 成<br />
ツールバー ボタンの [C Synthesis] または [Solution] → [Run C Synthesis] をクリ ックし、デザインを RTL インプリ メン<br />
テーシ ョ ン を 合 成 し ます。 合 成 プ ロ セス 中 は、 メ ッ セージが [Console] ビ ューに 表 示 さ れます。<br />
メ ッ セージには、 次 の よ う な 合 成 プ ロ セスの 進 捗 状 況 が 示 さ れます。<br />
@I [SYN-201] Setting up clock 'default' with a period of 4ns.<br />
@I [HLS-10] Setting target device to 'xc7k160tfbg484-1'<br />
@I [HLS-10] Analyzing design file 'array_RAM.c' ...<br />
@I [HLS-10] Validating synthesis directives ...<br />
@I [HLS-10] Starting code transformations ...<br />
@I [HLS-10] Checking synthesizability ...<br />
@I [HLS-111] Elapsed time:4.342 seconds; current memory usage:46.2 MB.<br />
メ ッ セージには、 合 成 プ ロ セ スの 詳 細 も 表 示 さ れます。 次 の 例 は、 関 数 の 一 部 が 自 動 的 に イ ン ラ イ ン 化 さ れた こ と を<br />
示 しています。Vivado HLS では、 少 量 の ロ ジ ッ ク を 含 む 関 数 が 自 動 的 に イ ン ラ イ ン 化 さ れます ( 必 要 な 場 合 は、INLINE<br />
指 示 子 に -off オプシ ョ ンを 付 ける と、 これは 回 避 でき ます)。<br />
@I [XFORM-602] Inlining function 'read_data' into 'dct' (dct.cpp:85) automatically.<br />
@I [XFORM-602] Inlining function 'write_data' into 'dct' (dct.cpp:90) automatically.<br />
合 成 が 終 了 し た ら、 最 上 位 関 数 の 合 成 レポー ト が 情 報 エ リ アに 自 動 的 に 開 き ます ( 図 1-19)。<br />
高 位 合 成 japan.xilinx.com 31<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-19<br />
図 1‐19 : 合 成 レポー ト<br />
高 位 合 成 japan.xilinx.com 32<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
合 成 の 出 力 確 認<br />
合 成 が 終 了 し た ら、 solution フォルダーに syn フ ォルダーが 作 成 さ れます。<br />
X-Ref Target - Figure 1-20<br />
図 1‐20 : C 合 成 の 出 力 フ ァ イル<br />
syn フォルダーには、 report フォルダーと RTL 出 力 フ ォーマ ッ ト それぞれに 対 し て 1 つのフ ォルダーの 合 計 4 つの<br />
フォルダーが 含 まれます。<br />
report フ ォルダーには、 最 上 位 関 数 に 対 し て 1 つ、 デザ イ ンに 含 まれる 下 位 関 数 に 対 し てそれぞれ 1 つのレポー ト<br />
ファイルが 含 まれます。 関 数 は INLINE 指 示 子 を 使 用 し て イ ン ラ イ ン 化 さ れていないか、 Vivado HLS で 自 動 的 に イ ン<br />
ラ イ ン 化 さ れてい る 場 合 に 限 り ます。 最 上 位 関 数 のレポー ト には、 デザ イ ン 全 体 の 詳 細 が 含 まれます。<br />
verilog、 vhdl、および systemc フォルダーには、 出 力 RTL ファイルが 含 まれます。 図 1-20 では、 verilog フォ<br />
ルダーを 展 開 し た と こ ろ を 示 し ています。 最 上 位 フ ァ イル 名 は、 合 成 の 最 上 位 関 数 と 同 じ 名 前 にな り ます。 C デザイ<br />
ンには、 各 関 数 ご と に 1 つの RTL ファイルがあります (インラ イン 化 されていない 場 合 )。 下 位 ブロック (ブロック<br />
RAM、 パイ プ ラ イ ン 化 さ れた 乗 算 器 など) をインプリ メントするためのその 他 の RTL ファイルがある 場 合 もありま<br />
す。<br />
重 要 : これらのファイルを RTL 合 成 に 使 用 する こ と はお 勧 め し ません。 その 代 わ り に、 こ のデザ イ ン フローの 後 半<br />
で 説 明 するパッ ケージ 済 み IP 出 力 フ ァ イルを 使 用 する こ と をお 勧 め し ます。 こ の 注 記 の 後 の 説 明 を 参 照 し て く だ さ<br />
い。<br />
浮 動 小 数 点 のデザ イ ンで 使 用 する 場 合 など、 Vivado HLS でザイ リ ン ク ス IP が 使 用 さ れる 場 合 、 RTL ディレク ト リに<br />
は RTL 合 成 中 に IP を 作 成 する ためのス ク リ プ ト が 含 まれます。syn フォルダーのファイルを RTF 合 成 で 使 用 する 場<br />
合 、 こ れら のフ ォルダー 内 にあ る ス ク リ プ ト フ ァ イルを 正 し く 使 用 する のは、 ユーザーの 責 任 にな り ます。 パ ッ ケー<br />
ジされた IP が 使 用 さ れる 場 合 、 こ のプ ロ セスはザ イ リ ン ク ス ツールに よ り 自 動 的 に 実 行 さ れます。<br />
高 位 合 成 japan.xilinx.com 33<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
C 合 成 結 果 の 解 析<br />
RTL デザ イ ン を 解 析 する ために、 次 の 2 つの 機 能 が 提 供 さ れています。<br />
• 合 成 レポー ト<br />
• [Analysis] ボタン<br />
また、RTL 環 境 を 使 用 する 場 合 のために、 Vivado HLS では IP パッケージ プロセス 中 に 2 つのプロ ジェ ク ト が 作 成 さ<br />
れます。<br />
• Vivado プロジェク ト<br />
• IP インテグレーター プロジェク ト<br />
RTL プロジェク トについては、 「IP パ ッ ケージの 出 力 確 認 」 を 参 照 して く ださい。<br />
合 成 が 終 了 し た ら、 最 上 位 関 数 の 合 成 レポー ト が 情 報 エ リ アに 自 動 的 に 開 き ます ( 図 1-19)。 レポートには、RTL デザ<br />
イ ンのパフ ォーマン ス と エ リ アに 関 する 詳 細 が 記 述 さ れています。 右 側 の [Outline] タ ブを 使 用 する と 、 レポー ト を 簡<br />
単 にナビゲー ト でき ます。<br />
表 1-1 は、 合 成 レポー ト のカテゴ リ について 説 明 し ています。<br />
表 1‐1: 合 成 レポー ト のカ テゴ リ<br />
カテゴリ<br />
General Information<br />
Performance Estimates →<br />
Timing<br />
Performance Estimates →<br />
Latency → Summary<br />
説 明<br />
結 果 が 生 成 さ れる タ イ ミ ン グ、 使 用 さ れた ソ フ ト ウ ェ ア バージ ョ ン、プロ ジ ェ<br />
ク ト 名 、 ソ リ ューシ ョ ン 名 、 デバイ スの 詳 細 です。<br />
ターゲッ ト ク ロ ッ ク 周 波 数 、 ク ロ ッ ク のばらつき、 達 成 可 能 な 最 大 ク ロ ッ ク<br />
周 波 数 の 概 算 です。<br />
このブロック と このブロックにインスタンシエート された 下 位 ブロックのレ<br />
イ テンシ と 開 始 間 隔 (II) がレポート されます。<br />
C ソースの こ のレベルで 呼 び 出 さ れる 下 位 関 数 はイ ン ラ イ ン 化 し ない 限 り 、そ<br />
れぞれこの RTL ブロックのインスタンスになり ます。<br />
レイテンシは、 出 力 値 を 生 成 するのに 必 要 なクロック サイクル 数 です。 開 始<br />
間 隔 は、 新 し い 入 力 が 適 用 さ れる 前 の ク ロ ッ ク サイクル 数 です。<br />
PIPELINE 指 示 子 がない 場 合 、 レ イ テンシは 開 始 間 隔 (II) よ りも 1 サイクル 少<br />
なくなります ( 次 の 入 力 は 最 後 の 出 力 が 書 き 出 さ れてか ら 読 み 込 まれます)。<br />
高 位 合 成 japan.xilinx.com 34<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐1: 合 成 レポー ト のカ テゴ リ<br />
カテゴリ<br />
Performance Estimates →<br />
Latency → Detail<br />
説 明<br />
このブロックのインスタンス ( 下 位 関 数 ) および ループのレ イ テンシ と 開 始 間<br />
隔 (II) についてのレポー ト で、 ループに 下 位 ループが 含 まれる 場 合 は、 ループ<br />
階 層 が 表 示 さ れます。<br />
最 小 および 最 大 レ イ テンシの 値 は、ループのすべての 反 復 を 実 行 する ためのレ<br />
イ テンシです。 コー ド の 条 件 分 岐 の 存 在 に よ り 、 最 小 値 および 最 大 値 は 異 な り<br />
ます。<br />
Iteration Latency は、 ループを 1 回 実 行 する 際 のレ イ テンシです。<br />
ループに 可 変 レ イ テンシがあ って、 レ イ テンシの 値 が 決 定 で き ない 場 合 は、 ク<br />
エスチョ ン マーク () が 表 示 されます。 こ の 表 の 後 の 説 明 を 参 照 し て く だ さ<br />
い。<br />
指 定 し た ターゲ ッ ト 開 始 間 隔 は、 達 成 し た 実 際 の 開 始 間 隔 の 横 に 表 示 さ れま<br />
す。<br />
tripcount は、 ループの 反 復 の 総 数 を 表 示 し ます。<br />
Utilization Estimates →<br />
Summary<br />
Utilization Estimates → Details<br />
→ Instance<br />
デザイ ンを イ ンプ リ メ ン ト する ために 使 用 される リ ソース (LUT、 フリップフ<br />
ロップ、DSP48) がレポート されます。<br />
ここにリストされるリソースは、この 階 層 レベルにインスタンシエートされた<br />
下 位 ブ ロ ッ ク に 使 用 さ れる も のです。<br />
デザイ ンに RTL 階 層 が 含 まれない 場 合 、 レポー ト さ れる イ ン ス タ ン スはあ り<br />
ません。<br />
イ ン ス タ ン スがあ る 場 合 は、 その イ ン ス タ ン スの 名 前 を ク リ ッ ク する と 、 その<br />
インスタンスの 合 成 レポートが 開 きます。<br />
Utilization Estimates → Details<br />
→ Memory<br />
Utilization Estimates → Details<br />
→ FIFO<br />
Utilization Estimates → Details<br />
→ Shift Register<br />
こ の 階 層 レベルで メ モ リ の イ ンプ リ メ ンテーシ ョ ンに 使 用 さ れる リ ソ ース を<br />
リストします。<br />
ここにリストされるリソースは、 この 階 層 レベルに FIFO をインプリ メンテー<br />
シ ョ ンする ために 使 用 さ れる も のです。<br />
ザイ リ ンクス SRL コ ンポーネン ト にマ ッ プ さ れたすべてのシ フ ト レジスタの<br />
サマ リ を 示 し ます。<br />
SRL コンポーネントへの 追 加 マップは RTL 合 成 中 に 発 生 し ます。<br />
Utilization Estimates → Details<br />
→ Expressions<br />
現 在 の 階 層 レベルで 乗 算 器 、 加 算 器 、 コ ンパレータ などの 演 算 で 使 用 さ れる リ<br />
ソースを 示 します。<br />
演 算 に 対 する 入 力 ポー ト のビ ッ ト 幅 が 表 示 さ れます。<br />
Utilization Estimates → Details<br />
→ Multiplexors<br />
ここにリストされるリソースは、この 階 層 レベルのマルチプレクサをインプリ<br />
メ ン ト する ために 使 用 さ れる も のです。<br />
マルチプレ ク サの 入 力 幅 が 表 示 さ れます。<br />
高 位 合 成 japan.xilinx.com 35<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐1: 合 成 レポー ト のカ テゴ リ<br />
カテゴリ<br />
Utilization Estimates → Details<br />
→ Register<br />
Interface Summary → Interface<br />
説 明<br />
こ の 階 層 レベルのレ ジ ス タすべての リ ス ト が 表 示 さ れます。 こ のレポー ト に<br />
は、 レジ ス タのビ ッ ト 幅 が 含 まれています。<br />
関 数 引 数 がどの よ う に RTL ポー ト に 合 成 さ れるかが 示 さ れます。<br />
RTL ポー ト 名 は、プロ ト コルと ソース オブジェ ク ト でグループ 分 けされます。<br />
これらは、 ソース オブジェ ク ト が 記 述 された IO プ ロ ト コルで 合 成 さ れる と 作<br />
成 される RTL ポー ト です。<br />
Vivado HLS を 初 めて 使 用 する 場 合 、 次 の 図 の よ う な 合 成 レ ポー ト が 表 示 さ れる こ と が よ く あ り ます。 レ イ テンシの 値<br />
がすべて ク エスチ ョ ン マーク () で 表 示 されています。<br />
X-Ref Target - Figure 1-21<br />
図 1‐21 : [Analysis] ボタン<br />
Vivado HLS では、 各 ループの 反 復 回 数 を 決 定 する 解 析 が 実 行 さ れます。 ループ 反 復 制 限 が 可 変 の 場 合 、 Vivado HLS<br />
では 最 大 上 限 が 決 定 で き ません。<br />
次 の 例 では、 for-loop の 最 大 反 復 が num_samples 入 力 の 値 で 決 定 さ れます。 num_samples の 値 は C 関 数 では 定 義<br />
されませんが、 外 部 から 関 数 に 入 力 されます。<br />
void foo (char num_samples, ...);<br />
void foo (num_samples, ...){<br />
int i;<br />
...<br />
loop_1: for(i=0;i< num_samples;i++) {<br />
高 位 合 成 japan.xilinx.com 36<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
}<br />
...<br />
}<br />
result = a + b;<br />
デザインのレイテンシまたはスループッ トが 可 変 インデックス 付 きのループによって 異 なる 場 合 、Vivado HLS ではそ<br />
のループのレ イ テンシが 未 知 の 状 態 ( マーク) として 表 示 されます。<br />
TRIPCOUNT 指 示 子 をループに 適 用 する と 、 ループ 反 復 数 を 手 動 で 指 定 で き、 便 利 な 数 値 がレポー ト に 含 まれる よ う<br />
にでき ます。 -max オプシ ョ ン を 使 用 する と、 Vivado HLS でループの 繰 り 返 し を 指 定 する 反 復 最 大 数 を 指 定 で き、<br />
-min オプシ ョ ン を 使 用 する と 、 実 行 さ れる 反 復 最 小 数 を 指 定 で き、 -avg オプシ ョ ン を 使 用 する と 平 均 TRIPCOUNT<br />
を 指 定 できます。<br />
注 記 : TRIPCOUNT 指 示 子 は、 合 成 結 果 には 影 響 し ません。<br />
TRIPCOUNT の 値 はレポー ト 目 的 のみに 使 用 され、Vivado HLS で 生 成 される レポー ト に 意 味 のあ る レ イ テンシおよび<br />
間 隔 が 示 さ れる よ う に し ます。 こ れに よ り 、 異 な る ソ リ ューシ ョ ン 間 で 意 味 のあ る 比 較 がで き る よ う に も な り ます。<br />
C の assert マ ク ロ を コー ド 内 で 使 用 する と 、ループの 制 限 を 指 定 で き る ほか、こ れ ら の 制 限 と 同 じ サ イ ズのハー ド ウ ェ<br />
ア を 作 成 で き ます。 詳 細 は、 「assert の 使 用 」 を 参 照 して く ださい。<br />
結 果 の 解 析 には、 合 成 レ ポー ト だけでな く 、 [Analysis] 表 示 を 使 用 する こ と も で き ます。 [Analysis] 表 示 は [Analysis]<br />
をク リ ックすると 開 くことができます ( 図 1-22)。<br />
X-Ref Target - Figure 1-22<br />
図 1‐22 : [Analysis] ボタン<br />
[Analysis] 表 示 には、 表 形 式 と 画 像 形 式 の 両 方 でデザ イ ンのパフ ォーマン スおよび リ ソ ースが 表 示 さ れ、 ど ち ら の 表<br />
示 も 連 動 するよ うになっています。 図 1-23 は、 [Analysis] 表 示 を 最 初 に 開 いた と き のデフ ォル ト の ウ ィ ン ド ウ コン<br />
フィギュレーションです。<br />
[Module Hierarchy] ビューには、 RTL デザ イ ン 全 体 の 概 要 が 表 示 さ れます。<br />
• このビューは、 デザイン 階 層 をナビゲーシ ョ ンするために 使 用 し ます。<br />
• [Module Hierarchy] タブには、 RTL 階 層 の 各 ブ ロ ッ ク の リ ソースおよびレ イ テンシ 貢 献 が 表 示 さ れます。<br />
高 位 合 成 japan.xilinx.com 37<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
図 1-23 は、 drc デザ イ ン 全 体 では、 ブ ロ ッ ク RAM 6 つと 約 300 個 の LUT が 使 用 され、 約 3000 クロック サイクルの<br />
レ イ テンシが 使 用 さ れてい る と こ ろ を 示 し ています。 その 中 の 下 位 ブ ロ ッ ク の dct_2b ではブロ ッ ク RAM 4 つ、 LUT<br />
約 250 が 使 用 され、 約 2600 クロック サ イ ク ルのレ イ テンシが 使 用 さ れています。 こ のデザ イ ンのほ と んどの リ ソー<br />
ス と レ イ テンシは 下 位 ブ ロ ッ ク の dct_2b からのものなので、このブロ ッ ク を 最 初 に 解 析 する 必 要 があるのがわか り ま<br />
す。<br />
X-Ref Target - Figure 1-23<br />
図 1‐23 : [Analysis] ボタン<br />
[Performance Profile] ビューには、 [Module Hierarchy] ビ ューで 現 在 選 択 さ れてい る ブ ロ ッ ク (こ の 場 合 、 dct ブロック)<br />
のパフ ォーマン スの 詳 細 が 表 示 さ れます。<br />
• ブロックのパフォーマンスは、 含 まれる 下 位 ブロックの 関 数 とこの 階 層 レベルに 含 まれるロジックすべてによっ<br />
て 決 ま り ます。 [Performance Profile] ビ ューには、 パフ ォーマン ス 全 体 に 貢 献 する こ の 階 層 レベルのア イ テムが 表<br />
示 されます。<br />
• パフ ォーマン スは、 レ イ テンシ と 開 始 間 隔 (II) に よ って 測 定 さ れます。 こ のビ ューには、 ブ ロ ッ ク のパイ プ ラ イ<br />
ン 処 理 の 有 無 も 表 示 さ れます。<br />
高 位 合 成 japan.xilinx.com 38<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
• この 例 では、 2 つのループが こ の 階 層 レベルに ロ ジ ッ ク と し て イ ンプ リ メ ン ト さ れ、 ど ち ら に も 下 位 ループが 含<br />
まれ、どちら もレイテンシに 対 して 144 クロック サイクル 貢 献 しているこ とがわかり ます。 両 方 のループのレイ<br />
テンシを dct に 含 まれる dct_2d のレ イ テンシに 追 加 する と 、 dct ブ ロ ッ ク のレ イ テンシ 合 計 を 取 得 で き ます。<br />
[Schedule Viewer] ビ ューには、 こ の 特 定 のブ ロ ッ ク の 演 算 が ク ロ ッ ク サイクルにどのよ うにスケジュールされている<br />
かが 表 示 されます。 デフォル ト のビ ューは、 [Performance] です。<br />
• 左 側 の 列 には、 リ ソースが 表 示 さ れます。<br />
° 下 位 ブ ロ ッ ク は 緑 で 表 示 さ れます。<br />
° ソース 内 のループの 結 果 であ る 演 算 は 黄 色 で 表 示 さ れます。<br />
° 標 準 的 な 演 算 は 紫 色 で 表 示 さ れます。<br />
• dct には 次 の 3 つの 主 な リ ソースが 含 まれます。<br />
° RD_Loop_Row というループ。 図 1-23 では、 RD_Loop_Row ループの 階 層 が 展 開 さ れています。<br />
° dct_2d という 下 位 ブロック。<br />
° WR_Loop_Row というループ。 プラス マーク (+) は、 そのループに 階 層 が 含 まれ、 展 開 し て 表 示 可 能 であ る<br />
ことを 示 しています。<br />
• 一 番 上 の 行 には、 デザ イ ンの 制 御 ス テー ト が リ ス ト さ れます。 制 御 ス テー ト は、 Vivado HLS で 使 用 さ れる 内 部 ス<br />
テー ト のこ と で、 ク ロ ッ ク サイクルに 対 して 演 算 をスケジュールします。 制 御 ステート と RTL の 有 限 ステー ト<br />
マシン (FSM) 間 は 密 に 関 係 し ていますが、 1:1 では 対 応 し ていません。<br />
[Schedule Viewer] ビ ューの 情 報 は、 最 初 に 実 行 さ れる リ ソースのセ ッ ト (RD_Loop_Row ループ) を 確 認 する と わか り<br />
ます。<br />
• デザイ ンは、 C0 ステートで 開 始 されます。<br />
• 次 に RD_Loop_Row ループのロ ジ ッ ク を 実 行 し 始 めます。<br />
° ループの 最 初 のス テー ト では、 exit 条 件 がチェ ッ ク さ れ、 加 算 演 算 が 実 行 さ れます。<br />
• ループは、 C1、 C2、 C3 の 3 つのス テー ト 間 実 行 さ れます。<br />
• [Performance Profile] ビューには、このループのト リ ップ カウントが 8 で、 これらの 3 ステートが 約 8 回 繰 り 返 さ<br />
れるこ とが 示 されます。<br />
• [Performance Profile] ビューには、RD_Loop_Row ループが 実 行 さ れるのに 144 クロック サイクルかかるこ と も 表<br />
示 されます。<br />
° RD_Loop_Row ループの 開 始 に 1 サイクルかかり ます。<br />
° [Performance Profile] ビューには、RD_Loop_Col ループのすべての 演 算 が 実 行 さ れるのに 16 クロック サイク<br />
ルかかる こ と が 示 されます。<br />
° RD_Loop_Row ループの 開 始 に 戻 る のに 1 クロック サ イ ク ル 余 分 にかか り ます。<br />
° 18 サイクルが 8 回 繰 り 返 さ れる ので、 終 了 には 144 クロック サイクルかかり ます。<br />
• RD_Loop_Col ループには、 複 数 の 加 算 、 2 サ イ ク ルの 読 み 込 み、 1 つの 書 き 出 しがあるのがわか り ます。<br />
高 位 合 成 japan.xilinx.com 39<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
図 1-24 は、 演 算 を 選 択 して 右 ク リ ッ ク したと ころを 示 しています。 [Goto Source] をク リ ックすると、 ソース コード<br />
ビ ューに 関 連 し た 変 数 が 開 き ます。 こ の 書 き 出 し に よ り 、 input 変 数 か ら の 配 列 にデータ の 書 き 出 し が イ ンプ リ メ ン<br />
トされます。<br />
X-Ref Target - Figure 1-24<br />
図 1‐24 : 関 連 する C ソース コード<br />
高 位 合 成 japan.xilinx.com 40<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
[Analysis] 表 示 では、 リ ソ ース 使 用 量 も 解 析 で き ます。 図 1-25 は、 [Resource Profile] および [Resource Sharing] ビュー<br />
を 示 しています。<br />
X-Ref Target - Figure 1-25<br />
図 1‐25 : 関 連 する C ソース コード<br />
[Resource Profile] ビ ューには、 こ の 階 層 レベルで 使 用 さ れた リ ソースが 表 示 さ れます。 こ の 例 の 場 合 、 ほ と んどの リ<br />
ソースがインスタンス (このブロック 内 にインスタンシエート されたブロック) によるものです。<br />
[Expressions] を 展 開 する と 、 こ の 階 層 レベルのほ と んどの リ ソースが 加 算 器 を イ ンプ リ メ ン ト する ために 使 用 さ れて<br />
いるのがわか り ます。<br />
[Resource Sharing] タ ブには、 使 用 さ れた 演 算 の 制 御 ス テー ト が 示 さ れます。 こ の 例 の 場 合 、 すべての 加 算 演 算 が 別 の<br />
加 算 器 リ ソ ースに 関 連 付 け ら れ、 共 有 さ れてい る 加 算 器 がないのがわか り ます (ま たは、 複 数 の 加 算 演 算 が 水 平 方 向<br />
の 各 行 にあ る 場 合 、 同 じ リ ソースが 別 のステー ト またはク ロ ッ ク サ イ ク ルで 複 数 回 使 用 さ れてい る こ と を 示 し ます)。<br />
加 算 器 は メ モ リ アクセスされる 同 じサイクルで 使 用 され、 各 メモリ 専 用 です。 これは、 関 連 する C コードをク リ ッ ク<br />
する と 確 認 できます。<br />
[Analysis] 表 示 の 機 能 は、 かな り イ ン タ ラ ク テ ィ ブです。 [Analysis] 表 示 の 詳 細 は、 『Vivado Design Suite チュート リア<br />
ル : 高 位 合 成 』 (UG871) の 「Design Analysis」 セクシ ョ ンを 参 照 してください。<br />
ヒント : Tcl フ ローがデザ イ ン を 作 成 する のに 使 用 さ れていて も、 プ ロ ジ ェ ク ト は GUI で 開 いて、 [Analysis] ビューで<br />
デザイ ンを 解 析 でき ます。<br />
[Synthesis] ボ タ ン を ク リ ッ ク する と 、 合 成 ビ ューに 戻 り ます。<br />
高 位 合 成 japan.xilinx.com 41<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
通 常 、 デザ イ ン 解 析 後 に 新 し い ソ リ ューシ ョ ン を 作 成 し て、 最 適 化 指 示 子 を 適 用 で き ます。 こ れに 新 し い ソ リ ュー<br />
シ ョ ン を 使 用 する と 、 さ ま ざ ま な ソ リ ューシ ョ ン を 比 較 で き ます。<br />
新 規 ソ リ ューシ ョ ンの 作 成<br />
Vivado HLS の 最 も 一 般 的 な 使 用 方 法 は、 まず 初 期 デザ イ ン を 作 成 し、 その 後 エ リ アおよびパフ ォーマン ス を 満 たすた<br />
めに 最 適 化 を 実 行 する 方 法 です。 ソ リ ューシ ョ ンに よ り 、 初 期 の 合 成 実 行 を 保 持 し、 比 較 で き ます。<br />
新 し い ソ リ ューシ ョ ン を 作 成 する には、[New Solution] ツールバー ボタン ( 図 1-8) をク リ ックするか、[Project] → [New<br />
Solution] をク リ ックします。 [Solution Wizard] ダイアログ ボックスが 開 きます ( 図 1-26)。<br />
X-Ref Target - Figure 1-26<br />
ソリューション ウ ィザードには、 新 規 プロジェクト ウ ィザードの 最 後 のページ ( 図 1-13) と 同 じオプションに 加 えて、<br />
既 存 ソ リ ューシ ョ ンに 適 用 さ れる 指 示 子 やカ ス タ ム 制 約 を 新 し い ソ リ ューシ ョ ンに コ ピーする オプシ ョ ンがあ り ま<br />
す。 コ ピーし た ソ リ ューシ ョ ンは、 編 集 または 削 除 も でき ます。<br />
新 し い ソ リ ューシ ョ ンが 作 成 さ れた ら、 最 適 化 指 示 子 を 追 加 で き ます ( 前 のソ リ ューシ ョ ンから コ ピーされた 場 合 は<br />
変 更 で き ます)。 次 のセ ク シ ョ ンで、 ソ リ ューシ ョ ンに 指 示 子 を 追 加 する 方 法 を 説 明 し ます。 カ ス タ ム 制 約 は、 コ ン<br />
フィギュレーション オプシ ョ ン を 使 用 し て 指 定 さ れます。 詳 細 は、 「デザ イ ン 最 適 化 」 を 参 照 して く ださい。<br />
最 適 化 指 示 の 適 用<br />
図 1‐26 : 新 規 ソ リ ューシ ョ ン ウィザード<br />
最 適 化 指 示 子 を 追 加 する には、 まず 情 報 エ リ アに ソース コードを 開 きます。[Explorer] タブで [Source] を 展 開 し、ソー<br />
ス コードをダブルク リ ッ ク して 情 報 エリ アに 開 きます ( 図 1-27)。<br />
高 位 合 成 japan.xilinx.com 42<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-27<br />
情 報 エ リ アで ソース コードをアクティブにする と、 右 側 で [Directive] タブがアクティブになり ます。 [Directive] タブ<br />
には、 開 いている ソース コー ド で 指 示 子 が 適 用 さ れてい る オブジ ェ ク ト ま たはス コープが 表 示 さ れます。<br />
注 記 : ほかの C フ ァ イルでオブジ ェ ク ト に 指 示 子 を 適 用 する には、 フ ァ イルを 開 いて 情 報 エ リ アでア ク テ ィ ブにする<br />
必 要 があ り ます。<br />
最 適 化 指 示 子 は、 次 のオブジ ェ ク ト およびス コープに 適 用 で き ます。<br />
• インターフェイス<br />
イ ン ターフ ェ イ スに 適 用 さ れる 指 示 子 は、 そのオブジ ェ ク ト ( 最 上 位 関 数 の 引 数 、 グ ローバル 変 数 ま たは 最 上 位<br />
関 数 の 戻 し) に 適 用 されます。<br />
• 関 数<br />
関 数 に 適 用 さ れる 指 示 子 は、 その 関 数 のス コープ 内 のオブジ ェ ク ト すべてに 適 用 さ れます。 指 示 子 の 影 響 は、 そ<br />
の 関 数 階 層 の 次 のレベルで 停 止 し ますが、 階 層 のすべてのループを 繰 り 返 し 展 開 する PIPELINE 指 示 子 の 場 合 や、<br />
指 示 子 で -recursive オプシ ョ ンがサポー ト さ れていて 適 用 さ れる 場 合 などは 例 外 です。<br />
• ループ<br />
図 1‐27 : ソース と 指 示 子<br />
ループに 適 用 さ れる 指 示 子 は、 そのループのス コープ 内 のオブジ ェ ク ト すべてに 適 用 さ れます。<br />
高 位 合 成 japan.xilinx.com 43<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
° たとえば、ループに LOOP_MERGE 指 示 子 が 使 用 さ れる 場 合 、 指 示 子 はループ 自 体 ではな く 、 その 下 位 ルー<br />
プに 適 用 されます。 適 用 されたループは、 同 じ 階 層 レベルの 同 等 のループとは 統 合 されません。<br />
• 配 列<br />
指 示 子 は 配 列 に 直 接 適 用 で き ます。 こ の 場 合 、 指 示 子 はオブジ ェ ク ト に 適 用 さ れ、 オブジ ェ ク ト 、 つま り 配 列 に<br />
のみ 適 用 さ れます。 複 数 の 配 列 を 含 む 関 数 、 ループ、 領 域 に 適 用 で き ます。 ま た、 ス コープ 内 のすべての 配 列 に<br />
適 用 さ れます。<br />
• 領 域<br />
領 域 は、 { } で 囲 まれたエ リ アのこ と です。<br />
{<br />
the scope between these braces is a region<br />
}<br />
指 示 子 は、 関 数 およびループに 適 用 さ れるの と 同 じ よ う に 領 域 に 適 用 で き ます。 指 示 子 は、 領 域 のス コープ 全 体<br />
に 適 用 されます。<br />
指 示 子 を 適 用 する には、 [Directive] タブでオブジェ ク ト を 右 ク リ ッ ク し、 [Insert Directive] をクリ ックして、[Vivado<br />
HLS Directive Editor] ダイアログ ボックス ( 図 1-28) を 開 きます。 図 1-26 の 例 では、 [DATAFLOW] が 選 択 されてお り 、<br />
データ フ ロー 指 示 子 が 追 加 さ れます。<br />
X-Ref Target - Figure 1-28<br />
図 1‐28 : 指 示 子 の 追 加<br />
[Directive] ドロップダウン リ ス ト で 指 示 子 を 選 択 し ます。 ド ロ ッ プダ ウ ン メニューには、 選 択 したオブジェク トまた<br />
はス コープに 追 加 で き る 指 示 子 のみが 表 示 さ れます。 たとえば、 配 列 はパイプラインできないので、 ドロップダウン<br />
リストには PIPELINE 指 示 子 は 表 示 さ れません。<br />
高 位 合 成 japan.xilinx.com 44<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
Tcl コマンドまたはエンベデッ ド プ ラ グマの 使 用<br />
ま た、 最 適 化 指 示 子 のオプシ ョ ンに 対 し て、 [Vivado HLS Directives Editor] ダイアログ ボックスの [Destination] フィー<br />
ルドで 次 を 指 定 できます。<br />
• [Directive File] : 指 示 子 は solution ディレク ト リの directives.tcl ファイルに Tcl コマンド として 挿 入 されます。<br />
• [Source File] : 指 示 子 は C ソース フ ァ イルに 直 接 プ ラ グマ と し て 挿 入 さ れます。<br />
表 1-1 は、 両 方 の 利 点 と 欠 点 を 示 し ています。<br />
表 1‐2:Tcl コマンド vs プラグマ<br />
指 示 子 形 式 利 点 欠 点<br />
指 示 子 フ ァ イル (Tcl コマンド)<br />
ソース コード (プラグマ)<br />
ソリューションにはそれぞれ 独 立 した<br />
指 示 子 が 含 まれます。 こ の 方 法 は、デザ<br />
イ ン を 確 認 する のに 理 想 的 にです。<br />
ソリューションが 合 成 し 直 されたら、そ<br />
のソ リ ューションで 指 定 した 指 示 子 の<br />
みが 適 用 さ れます。<br />
最 適 化 指 示 子 は、 C ソース コードに 埋<br />
め 込 まれます。<br />
C ソース ファイルがサードパーティに<br />
C IP として 送 信 される 場 合 に 理 想 的 で<br />
す。 同 じ 結 果 を 作 成 し 直 すのにほかの<br />
ファイルは 必 要 ありません。<br />
TRIPCOUNT および INTERFACE などの<br />
変 更 のない 可 能 性 が 高 い 指 示 子 に 便 利<br />
な 方 法 です。<br />
C ソース ファイルをサードパーティに<br />
転 送 する か、 アーカ イ ブする 場 合 、<br />
directives.tcl ファイルが 含 まれることが<br />
あります。<br />
directives.tcl ファイルは、 結 果 が 作 成 し<br />
直 さ れる 場 合 に 必 要 です。<br />
最 適 化 指 示 子 が コー ド に 埋 め 込 まれて<br />
い る 場 合 、 前 の ソ リ ューシ ョ ン を 合 成 し<br />
直 す 際 にそれら が 自 動 的 に 適 用 さ れま<br />
す。<br />
高 位 合 成 japan.xilinx.com 45<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
図 1-29 は、 [Directive File] に DATAFLOW 指 示 子 が 適 用 さ れる と こ ろ を 示 し ています。 directives.tcl は、 solution の<br />
constraints フ ォルダーの 下 に 表 示 され、 結 果 の Tcl コ マン ド を 含 めて 情 報 エ リ アで 開 き ます。<br />
X-Ref Target - Figure 1-29<br />
指 示 子 が Tcl コマンド として 適 用 されると、 その Tcl コマンドでスコープまたはそのスコープ 内 のスコープとオブ<br />
ジェ ク ト が 指 定 されます。 ループおよび 領 域 の 場 合 、 Tcl コマンドでこれらのスコープがラベルされている 必 要 があ<br />
り ます。ループま たは 領 域 に 現 時 点 で ラベルがない 場 合 は、 ラベルについて 尋 ねる ダ イ ア ロ グ ボックスが 表 示 されま<br />
す (ラベルのデフォルト 名 を 指 定 します)。<br />
次 の 例 は、 ループおよび 領 域 のラベルあ り の 場 合 と な しの 場 合 の 例 です。<br />
// Example of a loop with no label<br />
for(i=0; i
第 1 章 : 高 位 合 成<br />
ヒント : こ れら のループでは、 合 成 レ ポー ト を 読 みやす く で き ます。 ラベルのないループには、 ラベルが 自 動 的 に 生<br />
成 されます。<br />
図 1-30 は、 指 示 子 を ソ ース フ ァ イルに 追 加 し、 その 結 果 のソース コードを 情 報 エリ アに 開 いたと ころを 示 していま<br />
す。 ソース コー ド には、 最 適 化 指 示 子 を 指 定 する プ ラ グマが 含 まれる よ う にな り ま し た。<br />
X-Ref Target - Figure 1-30<br />
ど ち ら の 場 合 も、 指 示 子 が 適 用 さ れ、 合 成 を 実 行 する と 最 適 化 が 実 行 さ れます。 ラベルま たはプ ラ グマのいずれかを<br />
挿 入 し て コー ド が 変 更 さ れた ら、 合 成 前 に コー ド を 保 存 する かど う か 尋 ねる ダ イ ア ロ グ ボックスが 表 示 されます。<br />
すべての 指 示 子 およびカ ス タ ム 制 約 の リ ス ト については、 「デザ イ ン 最 適 化 」 を 参 照 し て く だ さ い。 指 示 子 およびカ<br />
ス タ ム 制 約 については、 『Vivado Design Suite ユーザー ガイド : 高 位 合 成 』 (UG902) を 参 照 して く ださい。<br />
グローバル 変 数 への 最 適 化 指 示 子 の 適 用<br />
指 示 子 は、 ス コープま たはス コープ 内 のオブジ ェ ク ト にのみ 適 用 で き ます。 関 数 のス コープ 外 部 で 宣 言 さ れる グ ロー<br />
バル 変 数 には 直 接 適 用 で き ません。<br />
グ ローバル 変 数 に 指 示 子 を 適 用 する には、 グ ローバル 変 数 が 使 用 さ れる ス コープ ( 関 数 、 ループ、 ま たは 領 域 ) に 指 示<br />
子 を 適 用 し ます。 その 変 数 が 使 用 さ れる ス コープの [Directives] タ ブを 開 き、 指 示 子 を 適 用 し、 [Vivado HLS Directive<br />
Editor] ダイアログ ボ ッ ク スに 手 動 で 変 数 名 を 入 力 し ます。<br />
クラス オブジ ェ ク ト への 最 適 化 指 示 子 の 適 用<br />
図 1‐30 : プ ラグマ 指 示 子 の 追 加<br />
最 適 化 指 示 子 は、 ク ラ スで 定 義 さ れる オブジ ェ ク ト ま たはス コープに も 適 用 で き ます。 違 いは、 通 常 ク ラ スはヘ ッ<br />
ダー フ ァ イルで 定 義 されている 点 です。 次 のいずれかの 方 法 でヘッ ダー ファイルを 開 きます。<br />
• [Explorer] タブで Include フォルダーを 開 いて、 ヘッダー ファイルをダブルクリックして 開 きます。<br />
• C ソース コード 内 でヘッダー ファイル (#include 文 ) の 上 にカーソルを 置 いて、 Ctrl キーを 押 しながらそのヘッ<br />
ダー ファイルをクリ ックします。<br />
高 位 合 成 japan.xilinx.com 47<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
[Directives] タブにヘッダー フ ァ イルのオブジ ェ ク ト が 表 示 さ れ、 指 示 子 が 適 用 で き ます。<br />
注 意 : ヘッダー フ ァ イルにプ ラ グマ と し て 指 示 子 を 適 用 する 場 合 は、 注 意 が 必 要 です。 フ ァ イルがほかのユーザーに<br />
使 用 さ れた り 、ほかのプ ロ ジ ェ ク ト で 使 用 さ れた り する 可 能 性 があ り ます。プ ラ グマ と し て 追 加 さ れた 指 示 子 は、ヘ ッ<br />
ダー フ ァ イルがデザイ ンに 含 まれる たびに 適 用 されます。<br />
テンプレー ト への 最 適 化 指 示 子 の 適 用<br />
Tcl コ マン ド を 使 用 し て 最 適 化 指 示 子 をテンプレー ト に 手 動 で 適 用 する には、 ク ラ ス メ ソ ッ ド を 参 照 する 際 にテンプ<br />
レー ト 引 数 と ク ラ ス を 指 定 し ます。 た と えば、 次 の よ う な C++ コードがある と します。<br />
template <br />
void DES10::calcRUN() {…}<br />
関 数 に INLINE 指 示 子 を 指 定 する には、 次 の Tcl コマンドを 使 用 します。<br />
set_directive_inline DES10::calcRUN<br />
プ ラ グマ 指 示 子 の 付 いた #define の 使 用<br />
プ ラ グマ 指 示 子 は、 define 文 で 指 定 さ れる 値 を 元 々はサポー ト し ていません。 次 の コー ド では、 define 文 を 使 用<br />
してス ト リームの 深 さを 指 定 しよ う としていますが、 コンパイルされません。<br />
ヒント : 深 さ の 引 数 は 明 確 な 値 で 指 定 する 必 要 があ り ます。<br />
#include <br />
using namespace hls;<br />
#define STREAM_IN_DEPTH 8<br />
void foo (stream &InStream, stream &OutStream) {<br />
// Illegal pragma<br />
#pragma HLS stream depth=STREAM_IN_DEPTH variable=InStream<br />
// Legal pragma<br />
#pragma HLS stream depth=8 variable=OutStream<br />
}<br />
C コー ド のマ ク ロ を 使 用 する と 、 こ の 機 能 を イ ンプ リ メ ン ト で き ます。 マ ク ロ を 使 用 する には、 マ ク ロ の 階 層 レベル<br />
を 使 用 し ます。 こ れに よ り 、 展 開 が 正 し く 実 行 さ れる よ う にな り ます。 こ の コー ド の 場 合 、 次 の よ う にする と コ ンパ<br />
イルされるよ うになり ます。<br />
#include <br />
using namespace hls;<br />
#define PRAGMA_SUB(x) _Pragma (#x)<br />
#define PRAGMA_HLS(x) PRAGMA_SUB(x)<br />
#define STREAM_IN_DEPTH 8<br />
void foo (stream &InStream, stream &OutStream) {<br />
// Legal pragmas<br />
PRAGMA_HLS(HLS stream depth=STREAM_IN_DEPTH variable=InStream)<br />
#pragma HLS stream depth=8 variable=OutStream<br />
}<br />
高 位 合 成 japan.xilinx.com 48<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
最 適 化 指 示 子 の 適 用 エ ラー<br />
最 適 化 指 示 子 が 適 用 さ れる と 、Vivado HLS では 進 捗 状 況 の 詳 細 がコ ン ソ ール (およびログ ファイル) に 出 力 されます。<br />
次 は、II = 1 ( 開 始 間 隔 1) の C 関 数 に PIPELINE 指 示 子 が 適 用 さ れたのに、 合 成 で こ の 目 的 が 達 成 で き なかった 例 です。<br />
@I [SCHED-11] Starting scheduling ...<br />
@I [SCHED-61] Pipelining function 'array_RAM'.<br />
@W [SCHED-69] Unable to schedule 'load' operation ('idx_load_2', array_RAM.c:52) on<br />
array 'idx' due to limited memory ports.<br />
@W [SCHED-63] Unable to schedule the whole 2 cycles 'load' operation ('d_i_load_1',<br />
array_RAM.c:52) on array 'd_i' within the first 4 cycles (II = 4).<br />
Please consider increasing the target initiation interval of the pipeline.<br />
@I [SCHED-61] Pipelining result:Target II:1, Final II:4, Depth:8.<br />
重 要 : Vivado HLS では 最 適 化 指 示 子 が 達 成 で き ない 場 合 、 最 適 化 ターゲ ッ ト が 自 動 的 に 緩 め ら れ、 低 めのパフ ォーマ<br />
ンス ターゲ ッ ト でデザイ ンの 作 成 が 試 みられますが、 ターゲ ッ ト を 緩 める こ と ができ ない 場 合 は、エラーになって 停<br />
止 します。<br />
低 めの 最 適 化 ターゲ ッ ト でデザ イ ン を 作 成 し よ う と する 場 合 、Vivado HLS からは 次 の 3 つの 重 要 な タ イプの 情 報 が 提<br />
供 可 能 です。<br />
• 現 在 の C コー ド と 最 適 化 指 示 子 で 達 成 可 能 な ターゲ ッ ト パフォーマンス<br />
• 高 めのパフ ォーマン ス ターゲッ ト を 満 たすこ とができなかった 理 由 のリ ス ト<br />
• さ ら に 詳 細 な 情 報 を 提 供 し てエ ラーの 理 由 を 理 解 で き る よ う にする ための 解 析 可 能 なデザ イ ン<br />
例 の 場 合 、SCHED-69 メッセージに、ターゲット II を 達 成 できなかった 理 由 がポー ト に 制 限 があったためであ る こ と<br />
が 記 述 さ れています。 理 由 は、デザ イ ンはブ ロ ッ ク RAM にアクセスする 必 要 があ り、ブロ ッ ク RAM には 最 大 2 ポー<br />
トしかないからです。<br />
こ の よ う なエ ラーが 発 生 し た ら、 問 題 を 解 析 し ます。 こ の 例 の 場 合 、 コー ド の 52 行 目 を 解 析 し、 [Analysis] 表 示 モー<br />
ド を 使 用 し てボ ト ルネ ッ ク を 判 明 させて、 ポー ト 数 2 つを 超 える 要 件 を 減 らすこ とができ るのか、 ポー ト 数 をどのよ<br />
う に 増 加 で き るのかを 決 定 し ます。 パフ ォーマン スの 高 めのデザ イ ン を 最 適 化 する 方 法 の 詳 細 は、 「HLS UltraFast 設<br />
計 手 法 」 および 「デザ イ ン 最 適 化 」 を 参 照 して く ださい。<br />
デザ イ ンが 最 適 化 さ れて 必 要 なパフ ォーマン スが 達 成 さ れた ら、 RTL と 検 証 し て、 合 成 結 果 を IP としてパッケージ<br />
できます。<br />
RTL の 検 証<br />
[C/RTL cosimulation ] ツールバー ボタン ( 図 1-8) または [Solution] → [Run C/RTL cosimulation] をクリ ックして RTL 結<br />
果 を 検 証 し ます。<br />
[C/RTL cosimulation] ダイアログ ボックス ( 図 1-31) では、 検 証 に 使 用 する RTL 出 力 タ イ プ (Verilog、 VHDL、 または<br />
SystemC) を 選 択 し ます。 Verilog か VHDL を 選 択 した 場 合 は、 シ ミ ュレーシ ョ ンにどの HDL シ ミ ュ レータ を 使 用 する<br />
かを 指 定 で き ます。<br />
高 位 合 成 japan.xilinx.com 49<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
すべての C/RTL 協 調 シ ミ ュ レーシ ョ ン オプシ ョ ンの 説 明 については、 「RTL 検 証 」 を 参 照 して く ださい。<br />
X-Ref Target - Figure 1-31<br />
図 1‐31 : [C/RTL cosimulation] ダイアログ ボックス<br />
検 証 が 終 了 し た ら、 コ ン ソ ールに SIM-1000 メ ッ セージが 表 示 さ れ、 検 証 が 問 題 な く 終 了 し た こ と が 確 認 で き ます。 C<br />
テス トベンチの printf コ マン ド の 結 果 が コ ン ソールに 表 示 さ れます。<br />
@I [SIM-316] Starting C post checking ...<br />
Test passed !<br />
@I [SIM-1000] *** C/RTL co-simulation finished:PASS ***<br />
@I [LIC-101] Checked in feature [HLS]<br />
シミュレーション レポー ト が 情 報 エ リ アに 自 動 的 に 開 き、 パス またはエ ラー ステータスと、 レイテンシおよび II の<br />
測 定 の 統 計 が 表 示 さ れます。<br />
重 要 : C/RTL 協 調 シ ミ ュ レーシ ョ ンは、 C テス トベンチが 値 0 を 戻 した 場 合 にのみパス します。 この 要 件 の 詳 細 は、<br />
「テス ト ベンチ : 生 産 性 向 上 には 必 須 」 を 参 照 して く ださい。<br />
高 位 合 成 japan.xilinx.com 50<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ンの 出 力 確 認<br />
RTL 検 証 が 終 了 し た ら、 solution フォルダーに sim ディレク ト リが 作 成 されます。 図 1-32 は、 作 成 されたそのフ ォル<br />
ダーを 示 しています。<br />
• レポート フォルダーには、 シミュレーションされた RTL のタイプごとにレポートおよびログ ファイルが 含 まれ<br />
ます。<br />
• 検 証 さ れる RTL の タ イ プご と に 検 証 フ ォルダーが 作 成 さ れます。 検 証 フ ォルダーの 名 前 は、 verilog、 vhdl ま<br />
たは SystemC にな り ます。 RTL 形 式 が 検 証 さ れなかった 場 合 、 フ ォルダーは 作 成 さ れません。<br />
• シミュレーションに 使 用 された RTL フ ァ イルは、 検 証 フ ォルダーに 保 存 さ れます。<br />
• RTL シ ミ ュ レーシ ョ ンは、 検 証 フ ォルダー 内 で 実 行 さ れます。<br />
• トレース フ ァ イルなどの 出 力 は、 検 証 フ ォルダーに 書 き 込 まれます。<br />
• autowrap、 tv、 wrap および wrap_pc フォルダーは、 Vivado HLS で 使 用 さ れる 作 業 フ ォルダーです。 こ れ ら<br />
のフォルダーにユーザー ファイルはありません。<br />
[C/RTL Co-simulation] ダイアログ ボックスで [Setup Only] をオンにする と、 検 証 フォルダーに 実 行 ファ イルは 作 成 さ<br />
れますが、 シ ミ ュレーシ ョ ンは 実 行 されません。 シ ミ ュレーシ ョ ンは、 コマンド プロンプトでこのシミ ュレーショ ン<br />
実 行 フ ァ イルを 実 行 する と 、 手 動 で 実 行 で き ます。<br />
X-Ref Target - Figure 1-32<br />
図 1‐32 : RTL 検 証 の 出 力<br />
• RTL 検 証 プ ロ セスの 詳 細 については、 「RTL 検 証 」 を 参 照 して く ださい。<br />
高 位 合 成 japan.xilinx.com 51<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
IP のパ ッ ケージ<br />
Vivado HLS デザイ ン フローの 最 後 の 手 順 では、RTL 出 力 を IP としてパッケージします。[Export RTL] ツールバー ボ<br />
タン ( 図 1-8) または [Solution] → [Export RTL] をクリ ックし、[Export RTL] ダイアログ ボックス ( 図 1-33) を 開 きます。<br />
X-Ref Target - Figure 1-33<br />
[Format Selection] ドロップダウン メニューの 選 択 肢 は、 合 成 でターゲッ トにした FPGA デバイ スによ って 異 な り ま<br />
す。 IP パッケージ オプシ ョ ンの 詳 細 は、 「RTL デザイ ンのエ ク スポー ト 」 を 参 照 して く ださい。<br />
IP パ ッ ケージの 出 力 確 認<br />
図 1‐33 : [RTL Export] ダイアログ ボックス<br />
[Export RTL] が 終 了 し た ら solution フ ォルダーの 下 に impl フ ォルダーが 作 成 さ れます。<br />
高 位 合 成 japan.xilinx.com 52<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-34<br />
図 1‐34 : [Export RTL] の 出 力 結 果<br />
どの 場 合 に も 出 力 には、 次 が 含 まれます。<br />
• report フォルダー。[Evaluate] をオンに し た 場 合 、 こ のフ ォルダーには Verilog および VHDL 合 成 の 合 成 レポー<br />
トが 含 まれます。<br />
• verilog フォルダー。 Verilog 形 式 の RTL 出 力 フ ァ イルが 含 まれます。 [Evaluate] をオンに し た 場 合 、 こ のフ ォ<br />
ルダーで RTL 合 成 が 実 行 さ れます。<br />
• vhdl フォルダー。VHDL 形 式 の RTL 出 力 フ ァ イルが 含 まれます。 [Evaluate] をオンに し た 場 合 、 こ のフ ォルダー<br />
で RTL 合 成 が 実 行 さ れます。<br />
重 要 : ユーザーの RTL 合 成 プ ロ ジ ェ ク ト に verilog または vhdl フ ォルダーのフ ァ イルを 直 接 使 用 する のはお 勧 め<br />
し ません。 その 代 わ り に、 次 に 説 明 するパッ ケージ 済 み IP 出 力 フ ァ イルを 使 用 する こ と をお 勧 め し ます。 こ の 注 記<br />
の 後 の 説 明 を 参 照 し て く だ さい。<br />
高 位 合 成 japan.xilinx.com 53<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
浮 動 小 数 点 のデザ イ ンで 使 用 する 場 合 など、 Vivado HLS でザイ リ ン ク ス IP が 使 用 さ れる 場 合 、 RTL ディレク ト リに<br />
は RTL 合 成 中 に IP を 作 成 するためのス ク リ プ ト が 含 まれます。 verilog または vhdl フォルダーのファイルをコ<br />
ピーして RTL 合 成 で 使 用 する 場 合 、 こ れら のフ ォルダー 内 にあ る ス ク リ プ ト ファイルを 正 しく 使 用 するのは、 ユー<br />
ザーの 責 任 にな り ます。 パッ ケージ された IP が 使 用 さ れる 場 合 、 こ のプ ロ セ スはザ イ リ ン ク ス ツールに よ り 自 動 的<br />
に 実 行 されます。<br />
[Format Selection] ドロップダウン リ ス ト の 選 択 によ って、 その 他 のフ ォルダーが 作 成 されます。 表 1-3 は、 作 成 され<br />
るフォルダーとその 内 容 を 示 しています。<br />
表 1‐3:[RTL Export] の 選 択 肢<br />
フォーマット 下 位 フォルダー コメント<br />
IP カタログ ip Vivado IP カタログに 追 加 できる ZIP ファイルが 含 まれま<br />
す。 ip フォルダーに ZIP ファイルの 内 容 ( 解 凍 済 み) も 含 ま<br />
れます。<br />
7 シリーズまたは Zynq よりも 古 い FPGA デバイ スの 場 合 、<br />
このオプショ ンは 使 用 できません。<br />
System Generator for DSP sysgen この 出 力 は、 System Generator for DSP の Vivado エデ ィ シ ョ<br />
ンに 追 加 で き ます。<br />
7 シリーズまたは Zynq よりも 古 い FPGA デバイ スの 場 合 、<br />
このオプショ ンは 使 用 できません。<br />
System Generator for DSP (ISE) sysgen この 出 力 は、System Generator for DSP の ISE エデ ィ シ ョ ンに<br />
追 加 で き ます。<br />
Pcore for EDK pcore こ の 出 力 は Xilinx Platform Studio に 追 加 でき ます。<br />
合 成 済 みデザ イ ン チェッ ク<br />
ポイント (.dcp)<br />
ip<br />
このオプショ ンでは、 Vivado Design Suite のデザイ ンに 直 接<br />
追 加 で き る Vivado チェッ クポイン ト ファイルが 作 成 されま<br />
す。<br />
これには、 RTL 合 成 が 実 行 さ れてい る 必 要 があ り ます。 こ<br />
のオプシ ョ ンを 選 択 した 場 合 は、 [Evaluate] は 自 動 的 にオン<br />
にな り ます。<br />
7 シ リーズまたは Zynq よ りも 古 い FPGA デバイ スの 場 合 、<br />
このオプショ ンは 使 用 できません。<br />
Vivado RTL プロジェク トの 例<br />
[Export RTL] を 実 行 する と 、Vivado RTL プ ロ ジ ェ ク ト が 自 動 的 に 作 成 さ れます。RTL デザイ ンにも っ と 慣 れて、Vivado<br />
RTL 環 境 を 使 用 し てい るハー ド ウ ェ ア 設 計 者 の 場 合 は、 こ れに よ り RTL が 解 析 しやす く な り ます。<br />
図 1-34 に 示 すよ う に、 project.xpr ファイルが verilog および vhdl フ ォルダーに 作 成 さ れます。 こ のフ ァ イル<br />
は Vivado Design Suite 内 で RTL 出 力 を 直 接 開 く ために 使 用 さ れます。<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ンが Vivado HLS で 実 行 されて、Vivado プロジェク トに RTL テス トベンチが 含 まれていれ<br />
ば、 デザ イ ンはシ ミ ュ レーシ ョ ンで き ます。<br />
注 記 : Vivado RTL プ ロ ジ ェ ク ト には、 最 上 位 デザ イ ン と し て Vivado HLS からの RTL 出 力 が 含 まれます。 通 常 、 こ の<br />
デザイ ンは IP としてより 大 きな Vivado RTL プロジェク トに 統 合 されるべきです。この Vivado プロジェク トは、デザ<br />
イ ン 解 析 目 的 にのみ 提 供 さ れてお り 、 イ ンプ リ メ ンテーシ ョ ン 用 には 提 供 さ れていません。<br />
高 位 合 成 japan.xilinx.com 54<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
IP インテグレーター プロジェク トの 例<br />
出 力 形 式 に [IP Catalog] を 選 択 した 場 合 は、 出 力 フォルダー impl/ip/example が 作 成 さ れます。 こ のフ ォルダー<br />
には、 IP イ ンテグ レーターのプ ロ ジ ェ ク ト を 作 成 する ための 実 行 フ ァ イル (ipi_example.bat または ipi_example.csh) が<br />
含 まれます。<br />
IP インテグレーター プ ロ ジ ェ ク ト を 作 成 する には、 コ マン ド プロンプトで ipi_exmple.* ファイルを 実 行 し、 作<br />
成 される Vivado IPI プロジェク ト ファイルを 開 きます。<br />
プロジェク トのアーカイブ<br />
Vivado HLS プロジェク トは、 [File] → [Archive] を ク リ ッ ク する と 業 界 標 準 の ZIP ファイルにアーカイブできます。<br />
[Archive Name] では、 ZIP フ ァ イルの 名 前 を 指 定 で き ます。<br />
デフォル ト では、 現 在 のアクテ ィブ ソリューションのみがアーカイブされます。[Active Solution Only] をオフにする<br />
と 、 すべての ソ リ ューシ ョ ンがアーカ イ ブ さ れます。<br />
コマンド プロンプトおよび Tcl イ ン タ ーフ ェ イ スの 使 用<br />
Windows の 場 合 、 [ スタート] → [すべてのプ ロ グ ラ ム] → [Xilinx Design Tools] → [Vivado 2014.x] → [Vivado HLS] →<br />
[Vivado HLS 2014.x Command Prompt] をクリックすると、 Vivado HLS コマンド プロンプトが 開 きます。<br />
Windows および Linux の 両 方 で、 vivado_hls コマンドを –i オプシ ョ ン を 使 用 し て 実 行 する と 、 Vivado HLS が 対 話 型<br />
モード で 開 き ます。 Vivado HLS コマンド プ ロ ンプ ト が 表 示 さ れ、 Tcl コマンドを 入 力 できるよ うになり ます。<br />
$ vivado_hls -i [-l ]<br />
vivado_hls><br />
デフォル ト では、 現 在 のディ レ ク ト リ に vivado_hls.log ファイルが 作 成 されます。 ログ フ ァ イルに 別 の 名 前 を 指 定 す<br />
るには、 -1 オプシ ョ ン を 使 用 し ます。<br />
コマンドに 関 する 資 料 にアクセスするには、 help コマン ド を 使 用 します。 すべてのコマン ドの リ ス ト は、 次 を 入 力 す<br />
る と 参 照 で き ます。<br />
vivado_hls> help<br />
各 コ マン ド のヘルプは、 コ マン ド 名 を 指 定 する と 表 示 さ れます。<br />
vivado_hls> help <br />
すべての コ マン ド ま たはコ マン ド オプシ ョ ンは、 auto-complete 機 能 を 使 用 する と 終 了 で き ます。 1 文 字 を 指 定 し て<br />
Tab キーを 押 すと、そのコマン ド またはコマン ド オプシ ョ ン を 完 了 する ために 可 能 性 のあ る オプシ ョ ンすべてが リ ス<br />
ト さ れます。 さ ら に 多 く の 文 字 を 入 力 する と 、 フ ィ ルター 機 能 に よ り 可 能 性 のあ る 選 択 肢 を 狭 め る こ と がで き ます。<br />
たとえば、 open と 入 力 して Tab キーを 押 すと、 open で 始 ま るすべての コ マン ド が リ ス ト さ れます。<br />
vivado_hls> open <br />
open<br />
open_project<br />
open_solution<br />
open_p と 入 力 して Tab キーを 押 すと、open_project 以 外 の 選 択 肢 はないので、 open_project コ マン ド が 自 動 的 に 実 行 さ<br />
れます。<br />
exit コ マン ド を 入 力 し て 対 話 型 モー ド を 終 了 し、 シ ェル プロンプトに 戻 り ます。<br />
vivado_hls> exit<br />
その 他 の Vivado HLS のオプシ ョ ンは 次 のとおり です。<br />
高 位 合 成 japan.xilinx.com 55<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
• vivado_hls -p : 指 定 し たプ ロ ジ ェ ク ト を 開 き ます。<br />
• vivado_hls -m : マシンのアーキテクチャ ( 例 : x86, x86_64) を 表 示 し ます。<br />
• vivado_hls -n : Vivado HLS のスプラ ッシュ 画 面 なしに GUI を 開 きます。<br />
• vivado_hls -r : インストール ルー ト ディレク ト リへのパスを 表 示 します。<br />
• vivado_hls -s : システムのタイプ ( 例 : Linux、 Win) を 表 示 します。<br />
• vivado_hls -v : リリース バージ ョ ン 番 号 を 表 示 し ます。<br />
コマンドを Tcl スクリプトに 記 述 し、-f オプシ ョ ン を 使 用 し てバ ッ チ モー ド で 実 行 する こ と も で き ます。<br />
$ vivado_hls -f script.tcl<br />
GUI でプ ロ ジ ェ ク ト を 作 成 し た 場 合 の Tcl コマンドは、 solution ディレク ト リの script.tcl ファイルに 保 存 されて<br />
います。 Tcl バッチ ス ク リ プ ト を 作 成 する 場 合 、 script.tcl フ ァ イルを 開 始 点 と し て 使 用 する と 便 利 です。<br />
Windows コマンド プ ロ ン プ ト の 理 解<br />
Windows OS では、Vivado HLS コマンド プロンプトは Minimalist GNU for Windows (minGW) 環 境 を 使 用 し て イ ンプ リ<br />
メ ン ト さ れています。 こ の 環 境 では、 標 準 Windows DOS コマンド と Linux コマンドのサブセッ トの 両 方 を 使 用 でき<br />
ます。<br />
図 1-35 では、Linux の ls コマンド と DOS の dir コマンドのどちらでもディレク ト リの 内 容 を リ ス トできるこ とを 示 し<br />
ています。<br />
X-Ref Target - Figure 1-35<br />
minGW 環 境 では、すべての Linux コマンド とその 動 作 がサポート されているわけではないので 注 意 してください。 次<br />
に、 サポー ト の 違 いのい く つかを 示 し ます。<br />
• Linux の which コマンドはサポート されていません。<br />
図 1‐35 : 高 位 合 成 CLI アイコン<br />
高 位 合 成 japan.xilinx.com 56<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
• makefile の Linux パスは、 minGW パスに 変 換 さ れます。 すべての makefile に 含 まれる Linux 形 式 のパス 名 の 代 入<br />
(FOO := :/ など) は、 パスが 置 換 されないよ う に、 パス 名 に ク ォーテーシ ョ ンが 付 いた もの (FOO := “:/”) に 変 換 さ<br />
れます。<br />
サンプル デザイ ンおよび 参 考 資 料<br />
Vivado HLS には、 多 く のチュー ト リ アルおよびサンプル デザイ ンが 提 供 されています。<br />
チュート リアル<br />
チュート リ アルは、 『Vivado Design Suite チュート リ アル : 高 位 合 成 』 (UG871) か ら 入 手 で き ます。 表 1-4 は、 チュー<br />
トリアルの 演 習 リストを 示 しています。<br />
表 1‐4:Vivado HLS チ ュー ト リ アル 演 習<br />
チ ュー ト リ アル 演 習<br />
高 位 合 成 イ ン ト ロ ダ ク シ ョ ン<br />
C 検 証<br />
イ ン ターフ ェ イ ス 合 成<br />
任 意 精 度 型<br />
デザイ ン 解 析<br />
デザイ ン 最 適 化<br />
RTL 検 証<br />
IP インテグレーターでの<br />
HLS IP の 使 用<br />
Zynq プロセッサ デザイ ンで<br />
の HLS IP の 使 用<br />
System Generator for DSP での<br />
HLS IP の 使 用<br />
説 明<br />
FIR デザイ ンを 使 用 し た Vivado HLS の 操 作 と 主 な 機 能 の 概<br />
要 です。<br />
Hamming ウ ィンドウ デザイ ンを 使 用 し て C シミュレーショ<br />
ンを 説 明 し、 C デバ ッ グ 環 境 を 使 用 し て C アルゴ リ ズムを<br />
検 証 し ます。<br />
イ ン タ ー フ ェ イ ス 合 成 を 使 用 し て、 さ ま ざ ま な RTL イン<br />
ターフェイス ポー ト タ イ プの 作 成 方 法 を 説 明 し ます。<br />
固 定 小 数 点 の 任 意 精 度 型 を 使 用 し て 浮 動 小 数 点 のフ ァ ン ク<br />
ションをインプリメントし、 さらに 最 適 なハードウェアを<br />
生 成 する 方 法 を 示 し ます。<br />
[Analysis] 表 示 モー ド を 使 用 し て DCT ブロッ クのパフォー<br />
マン ス を 改 善 する 方 法 を 示 し ます。<br />
行 列 乗 算 の 例 を 使 用 し てアルゴ リ ズムがどの よ う に 最 適 化<br />
さ れるかについて 説 明 し ます。 こ のチュー ト リ アルでは、 最<br />
初 の 状 態 に 変 更 を 加 え る こ と で 特 定 のハー ド ウ ェ ア インプ<br />
リメンテーションが 必 要 になることがあることを 示 しま<br />
す。<br />
RTL 検 証 機 能 の 使 用 と RTL 信 号 波 形 の 解 析 方 法 を 示 し ま<br />
す。<br />
2 つの HLS プリプロセスとポス トプロセス ブロックを IP イ<br />
ンテグレーターを 使 用 して FFT IP ブ ロ ッ ク に 接 続 する 方 法<br />
を 示 します。<br />
CPU を 使 用 し、 AXI4-Lite インターフェイスと DDR メモリ<br />
と Vivado HLS ブロックを 行 き 来 する DMA ス トリーミング<br />
データ を 使 用 し て、 Vivado HLS ブロックを 制 御 する 方 法 に<br />
ついて 説 明 し ます。CPU ソース コード と SDK で 必 要 な 手 順<br />
が 含 まれます。<br />
HLS ブロックを System Generator for DSP デザイ ン 内 で 使 用<br />
する 方 法 について 説 明 し ます。<br />
高 位 合 成 japan.xilinx.com 57<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
デザイ ン 例<br />
Vivado HLS のデザイ ン 例 には、 GUI のウェルカム 画 面 で [Open Example Project] をク リ ックし、 design フォルダー<br />
を 展 開 する と ア ク セスで き ます。 Vivado HLS の GUI を 起 動 する と 、 ウ ェルカ ム 画 面 が 表 示 さ れます。 こ の 画 面 には、<br />
[Help] → [Welcome] をク リ ックするといつでもアクセスできます。<br />
デザイ ン 例 には、 Vivado インストール ディレク ト リ (Vivado_HLS\2014.x\examples\design) から 直 接 アクセ<br />
スする こ と もできます。<br />
デザイ ン 例 については、 表 1-5 で 説 明 し ます。<br />
表 1‐5:Vivado HLS のデザイ ン 例<br />
デザイ ン 例<br />
FFT > fft_ifft<br />
反 転 FFT 用 に FFT IP を 使 用<br />
FFT > fft_single パイプラインされたス ト リーミ ング I/O 付 きのシングル 1024<br />
ポイン ト フォワード<br />
FIR > fir_2ch_int<br />
FIR フィルターの 2 つのイ ン ター リ ーブされたチャネル<br />
FIR > fir_3stage<br />
3 つの FIR (ハーフバン ド FIR → ハーフバン ド FIR → SRRC<br />
(Square Root Raise Cosine) FIR) を 直 列 に 接 続 した FIR チェーン<br />
FIR > fir_config<br />
FIR CONFIG チャネルを 使 用 して 係 数 をアップデートする 方 法<br />
を 示 した 例<br />
FIR > fir_srrc<br />
SRRC (Square Root Raise Cosine) FIR フィルター<br />
__builtin_ctz<br />
gcc ビル ト インの count trailing zero 関 数 を 使 用 し てプ ラ イ オ リ<br />
ティ エンコーダー (32 および 64 ビッ ト バージ ョ ン) をインプ<br />
リメント<br />
axi_lite<br />
AXI4-Lite インターフェイスの 使 用<br />
axi_master<br />
AXI4-Master インターフェイスの 使 用<br />
axi_stream_no_side_channel_data<br />
C コードにサイ ドチャネル データ のない AXI4-Stream インター<br />
フェイスの 使 用<br />
axi_stream_side_channel_data<br />
サイ ドチャネル データ を 使 用 し た AXI4-Stream インターフェ<br />
イス<br />
fp_mul_pow2<br />
効 率 的 な 2 のべき 乗 での 浮 動 小 数 点 乗 算 ( 浮 動 小 数 点 コ アおよ<br />
び DSP リ ソ ース を 使 用 せず、 小 型 の 加 算 器 と オプシ ョ ンで 制 限<br />
チェッ クがいくつか 含 まれるのみ) をインプリ メント<br />
fxp_sqrt<br />
ビット シリアルで 完 全 にパイプライン 可 能 な ap_fixed 型 の 平<br />
方 根 イ ンプ リ メ ンテーシ ョ ン。 こ れは、 例 と し て 提 供 さ れてい<br />
ます。 HLS math ライブラリには、ap_fixed 型 を 使 用 した sqrt 関<br />
数 の イ ンプ リ メ ンテーシ ョ ンが 提 供 さ れています。<br />
hls_stream<br />
hls::stream を 使 用 したマルチレー ト データ フ ロー (8 ビッ ト<br />
I/O、 32 ビッ ト データ プロセスおよびデシメーショ ン)<br />
Linear_Algebra > cholesky<br />
Cholesky 関 数 のパラ メ ーター 指 定 方 法 およびイ ン ス タ ンシ<br />
エー ト 方 法 を 示 す 基 本 的 なテ ス ト ベンチ<br />
Linear_Algebra > cholesky_alt<br />
代 替 Cholesky イ ンプ リ メ ンテーシ ョ ン を 選 択 する 方 法 を 示 し<br />
ます。<br />
Linear_Algebra > cholesky_complex<br />
複 素 数 データ 型 の Cholesky 関 数 を 使 用 する 方 法 を 示 し ます。<br />
Linear_Algebra > cholesky_inverse<br />
Cholesky 逆 関 数 のパラ メ ーター 指 定 方 法 およびイ ン ス タ ンシ<br />
エー ト 方 法 を 示 す 基 本 的 なテ ス ト ベンチ<br />
説 明<br />
高 位 合 成 japan.xilinx.com 58<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐5:Vivado HLS のデザイ ン 例<br />
デザイ ン 例<br />
Linear_Algebra > matrix_multiply<br />
Linear_Algebra > matrix_multiply_alt<br />
Linear_Algebra > qr_inverse<br />
Linear_Algebra > qrf<br />
Linear_Algebra > svd<br />
Linear_Algebra > svd_pairs<br />
Loop_Label > loop_lable<br />
Loop_Label > no_loop_lable<br />
memory_porting_and_ii<br />
Perfect_Loop > perfect<br />
Perfect_Loop > semi_perfect<br />
rom_init_c<br />
window_fn_float<br />
window_fn_fxpt<br />
行 列 乗 算 関 数 のパラ メ ーター 指 定 方 法 およびイ ン ス タ ンシ<br />
エー ト 方 法 を 示 す 基 本 的 なテ ス ト ベンチ<br />
代 替 の 乗 算 イ ンプ リ メ ンテーシ ョ ンの 1 つを 選 択 する 方 法 を 示<br />
します。<br />
OR 逆 関 数 のパラ メ ーター 指 定 方 法 およびイ ン ス タ ンシエー ト<br />
方 法 を 示 す 基 本 的 なテ ス ト ベンチ<br />
QRF 関 数 のパ ラ メ ーター 指 定 方 法 およびイ ン ス タ ンシエー ト<br />
方 法 を 示 す 基 本 的 なテ ス ト ベンチ<br />
SVD 関 数 のパラ メ ーター 指 定 方 法 およびイ ン ス タ ンシエー ト<br />
方 法 を 示 す 基 本 的 なテ ス ト ベンチ<br />
代 替 のペアの SVD イ ンプ リ メ ンテーシ ョ ン を 選 択 する 方 法 を<br />
示 します。<br />
ラベル 付 きループの 使 用<br />
ラベルな しループを 使 用 する こ と で、Vivado HLS でループに 最<br />
適 化 を 配 置 する 際 に ラベルを 追 加 する 方 法 を 示 し ます。<br />
配 列 パーテ ィ シ ョ ン を 使 用 し て 開 始 間 隔 を 改 善 する 方 法 を 示<br />
します。<br />
完 全 ループの 例<br />
半 完 全 ループの 例<br />
説 明<br />
下 位 関 数 で 配 列 を 使 用 し て 配 列 の ROM インプリ メンテーショ<br />
ンを 保 証<br />
単 精 度 浮 動 小 数 点 のウ ィ ン ド ウ イ ング 関 数 。 コンパイル 時 間 選<br />
択 (Rectangular (none)、 Hann、 Hamming または Gaussian) をした<br />
C++ テンプレート クラス 例<br />
固 定 小 数 点 ウ ィ ン ド ウ イ ン グ 関 数 。 window_fn_float 例 と 同 じ<br />
C++ クラスを 使 用 し、float 型 から ap_fixed 型 への 移 行 がどれ く<br />
ら い 簡 単 であ る かを 示 し ます。<br />
コード 例<br />
さ まざまな コーデ ィ ング 手 法 の 例 にコード 例 が 含 まれています。 これらは、 さ まざまな C、 C++、 SystemC コンス ト<br />
ラクトの Vivado HLS 合 成 結 果 を 示 すための 小 さ い 例 です。<br />
Vivado HLS のコード 例 には、 GUI のウェルカム 画 面 で [Open Example Project] をクリ ックし、coding フォルダーを<br />
展 開 する と ア ク セスで き ます。 Vivado HLS の GUI を 起 動 する と、 ウ ェルカム 画 面 が 表 示 されます。 この 画 面 には、<br />
[Help] → [Welcome] をク リ ックするといつでもアクセスできます。<br />
コード 例 には、 Vivado インストール ディレク ト リ (Vivado_HLS\2014.x\examples\coding) から 直 接 アクセス<br />
するこ と もできます。<br />
デザイ ン 例 については、 表 1-6 で 説 明 し ます。<br />
高 位 合 成 japan.xilinx.com 59<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐6:Vivado HLS のコード 例<br />
コード 例<br />
apint_arith<br />
apint_promotion<br />
array_arith<br />
array_FIFO<br />
array_mem_bottleneck<br />
array_mem_perform<br />
array_RAM<br />
array_ROM<br />
array_ROM_math_init<br />
cpp_ap_fixed<br />
cpp_ap_int_arith<br />
cpp_FIR<br />
cpp_template<br />
func_sized<br />
hier_func<br />
hier_func2<br />
hier_func3<br />
hier_func4<br />
loop_functions<br />
loop_imperfect<br />
loop_max_bounds<br />
loop_perfect<br />
loop_pipeline<br />
loop_sequential<br />
loop_sequential_assert<br />
loop_var<br />
malloc_removed<br />
pointer_arith<br />
pointer_array<br />
pointer_basic<br />
pointer_cast_native<br />
pointer_double<br />
pointer_multi<br />
C の ap_cint 型 の 使 用<br />
説 明<br />
C の ap_cint 型 の 整 数 拡 張 問 題 を 回 避 する 前 に 必 要 な 型 変 換<br />
インターフェイス 配 列 での 演 算 の 使 用<br />
FIFO インターフェイスのインプリ メンテーション<br />
配 列 へのア ク セ スに よ るパフ ォーマン スのボ ト ルネ ッ ク 作 成<br />
array_mem_bottleneck 例 によ るパフ ォーマン ス ボトルネックのソ<br />
リューション<br />
ブロック RAM インターフェイスのインプリ メンテーション<br />
ROM がどの よ う に 自 動 的 に 推 論 さ れる かを 示 す 例<br />
さ ら に 複 雑 な 場 合 の ROM の 推 論 方 法 を 示 す 例<br />
C++ の ap_int 型 の 使 用<br />
演 算 用 の C++ の apt_int 型 の 使 用<br />
オブジェ ク ト 指 向 のコード スタイルを 使 用 した C++ デザイ ン 例<br />
C++ テンプレート 例<br />
イ ン ターフ ェ イ スでデータ 幅 を 定 義 する こ と で 演 算 のサ イ ズを 固 定<br />
テ ス ト ベンチおよびデザ イ ン フ ァ イル と し てフ ァ イルを 追 加 する 例<br />
テス トベンチおよびデザイン フ ァ イル と し てフ ァ イルを 追 加 する 例 階<br />
層 の 下 位 ブ ロ ッ ク を 合 成 する 例<br />
テ ス ト ベンチ と デザ イ ン 関 数 を 同 じ フ ァ イルに 組 み 合 わせる 例<br />
合 成 さ れる コー ド を 回 避 する ための 定 義 済 み __SYNTHESIS__ マクロ<br />
の 使 用<br />
パ ラ レル 実 行 のためのループの 関 数 への 変 換<br />
不 完 全 なループ 例<br />
ループが 展 開 で き る よ う に 最 大 境 界 の 使 用<br />
完 全 なループ 例<br />
ループ パイプラインの 例<br />
シーケンシャル ループ<br />
assert 文 の 使 用<br />
変 数 境 界 付 き のループ<br />
コー ド か ら のマ ク ロ の 削 除 例<br />
ポ イ ン ター 演 算 例<br />
ポインターの 配 列<br />
基 本 的 なポ イ ン ター 例<br />
ネイティブ C 型 間 のポ イ ン ター 型 変 換<br />
Pointer-to-Pointer の 例<br />
複 数 ポ イ ン ター ターゲ ッ ト を 使 用 する 例<br />
高 位 合 成 japan.xilinx.com 60<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐6:Vivado HLS のコード 例<br />
コード 例<br />
pointer_stream_better<br />
pointer_stream_good<br />
sc_combo_method<br />
sc_FIFO_port<br />
sc_multi_clock<br />
sc_RAM_port<br />
sc_sequ_cthread<br />
struct_port<br />
sum_io<br />
types_composite<br />
types_float_double<br />
types_global<br />
types_standard<br />
types_union<br />
説 明<br />
volatile キーワー ド を イ ン ターフ ェ イ スで 使 用 する 方 法 を 示 す 例<br />
明 示 的 なポ イ ン ター 演 算 を 使 用 し たマルチ リ ー ド ポインターの 例<br />
SystemC の 組 み 合 わせデザ イ ン 例<br />
SystemC FIFO ポインター 例<br />
複 数 ク ロ ッ ク を 含 む SystemC 例<br />
SystemC ブロック RAM ポインター 例<br />
SystemC シーケンシャル デザイ ン 例<br />
インターフェイスでの struct の 使 用<br />
最 上 位 イ ン ターフ ェ イ ス ポー ト の 例<br />
複 合 データ 型<br />
float 型 から double 型 への 変 換<br />
グローバル 変 数 の 使 用<br />
標 準 C 型 の 例<br />
union の 例<br />
HLS UltraFast 設 計 手 法<br />
高 位 合 成 デザ イ ン フ ローを 使 用 する には、 良 い 設 計 手 法 に 従 う こ と が 重 要 です。 UltraFast HLS 設 計 手 法 を 使 用 する<br />
と 、 結 果 をすばや く 達 成 で き、 タ イ ム トゥ マーケ ッ ト の 時 間 を 短 縮 で き ます。<br />
このセクショ ンでは、 Vivado HLS: デザ イ ン 検 証 、 ハー ド ウ ェ ア 効 率 の 高 い C コー ド 、 合 成 のス ト ラ テジ、 デザ イ ン<br />
解 析 、 最 適 化 および 検 証 を 使 用 し た 高 位 合 成 に 関 する プ ロ セスについて 説 明 し ます。<br />
この 後 のそれぞれのセクショ ンでは、Vivado HLS の 機 能 および 使 用 方 法 について 説 明 し ますが、 詳 細 を 説 明 する 前 に<br />
こ れ ら の 機 能 を どの よ う に 適 用 する か 理 解 し てお く こ と をお 勧 め し ます。<br />
テストベンチ : 生 産 性 向 上 には 必 須<br />
高 位 合 成 デザ イ ン フ ローを 初 めて 使 用 する 場 合 、 C テス トベンチを 使 用 して C シ ミュレーションを 実 行 せずに、C<br />
コー ド の 合 成 に 進 んで し ま う と い う 失 敗 を 起 こ し がちです。 こ れについては、 次 の コー ド で 示 し ます。 こ のネ ス ト 化<br />
されたループの 例 の 問 題 点 を 見 つけてみて く だ さい。<br />
高 位 合 成 japan.xilinx.com 61<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
#include Nested_Loops.h<br />
void Nested_Loops(din_t A[N], dout_t B[N]) {<br />
int i,j;<br />
dint_t acc;<br />
LOOP_I:for(i=0; i < 20; i++){<br />
LOOP_J: for(j=0; j < 20; j++){<br />
if(j=0) acc = 0;<br />
acc += A[i] * j;<br />
if(j=19) B[i] = acc / 20;<br />
}<br />
}<br />
}<br />
こ の コー ド が 予 測 どお り の 結 果 に 合 成 さ れないのは、 条 件 文 が FALSE と 評 価 され、LOOP_J の 最 初 の 反 復 の 終 わ り で<br />
J が 19 に 設 定 されているからです。 この 条 件 文 は、 j==0 および j==19 (= の 代 わ り に == を 使 用 ) にする 必 要 があ り ま<br />
す。 上 記 の コー ド はコ ンパイル、 実 行 さ れ、 問 題 な く 合 成 で き ます。 コー ド を さ ら っ と 確 認 する だけでは、 問 題 を 検<br />
出 する のは 困 難 です。<br />
近 年 、 開 発 者 は 日 常 的 に C/C++、 Perl、 Tcl、 Python、 Verilog および VHDL を 1 つま たは 複 数 使 用 する よ う になったの<br />
で、 このよ う な 小 さ な 失 敗 を 見 つけるのは 困 難 です。 合 成 後 に 機 能 的 な 問 題 を 見 つけ る のは さ ら に 困 難 で 時 間 がかか<br />
ります。<br />
C テス トベンチは、 合 成 される C 関 数 を 呼 び 出 し、 テ ス ト データ を 提 供 し、 出 力 が 正 し いかど う かをテ ス ト するプ<br />
ログラムにすぎません。C テ ス ト ベンチの 最 上 位 は main() 関 数 です。 こ の よ う な C コー ド はコ ンパイルし て 合 成 前<br />
に 実 行 で き、 合 成 前 に 結 果 が 予 測 どお り にな る かど う かを 検 証 で き ます。 本 書 では、 全 体 を と おし てアルゴ リ ズムが<br />
機 能 的 に 正 し いかど う か 検 証 する 機 能 の こ と を 「C シ ミ ュ レーシ ョ ン」 と 呼 びます。<br />
「サンプル デザ イ ンおよび 参 考 資 料 」 の Vivado HLS の 例 はすべて、 C、 C++、 または SystemC テス トベンチを 使 用 し<br />
て 提 供 さ れています。 こ れら の 例 を コ ピーし て 変 更 する と 、 C テス トベンチを 作 成 できます。<br />
直 接 合 成 を 実 行 し た 方 が 時 間 は 節 約 で き る よ う には 見 え ますが、 C テ ス ト ベンチを 使 用 する 方 法 の 方 が 実 際 には 時 間<br />
が 節 約 でき ます。<br />
結 果 の 確 認 : 生 産 性 の 上 昇<br />
HLS UltraFast 設 計 手 法 では、 合 成 前 の C シ ミ ュ レーシ ョ ン をサポー ト し て 合 成 後 の C アルゴ リ ズム と C/RTL 協 調 シ<br />
ミュレーションを 検 証 することで、RTL イ ンプ リ メ ンテーシ ョ ン を 確 認 し ます。 ど ち ら の 場 合 も、 main() 関 数 の<br />
return 値 を 使 用 し て 結 果 が 正 し いかど う か 確 認 し ます。<br />
理 想 的 なテ ス ト ベンチには、 次 のコー ド 例 の よ う に 結 果 をチェ ッ ク する 属 性 が 含 まれます。 関 数 の 合 成 結 果 は<br />
results.dat フ ァ イルに 保 存 さ れ、 正 し い 予 測 結 果 (この 例 では 「golden」 結 果 ) と 比 較 されます。<br />
int main () {<br />
...<br />
int retval=0;<br />
fp=fopen("result.dat","w");<br />
...<br />
// Call the function for synthesis<br />
loop_perfect(A,B);<br />
// Save the output results<br />
for(i=0; i
第 1 章 : 高 位 合 成<br />
}<br />
printf("Test failed !!!\n");<br />
retval=1;<br />
else {<br />
printf("Test passed !\n");<br />
}<br />
// Expect to return 0 if the results are correct<br />
return retval;<br />
Vivado HLS デザイ ン フローでは、 main() 関 数 の return 値 は 次 のよ う にな り ます。<br />
• 結 果 が 正 し い 場 合 は 値 0<br />
• 結 果 が 正 し く ない 場 合 、 値 は 0 以 外<br />
• C シミュレーションまたは C/RTL 協 調 シ ミ ュ レーシ ョ ン 後 に return 値 が 0 以 外 にな る と 、Vivado HLS ではシ ミ ュ<br />
レーシ ョ ン エラーがレポート されます。<br />
セルフチェ ッ クのテス ト ベンチを 使 用 する 場 合 、 RTL テス トベンチを 作 成 して Vivado HLS からの 出 力 が 正 しいかど<br />
う か 確 認 する 必 要 はあ り ません。C/RTL 協 調 シ ミ ュ レーシ ョ ン 中 は C シミュレーションに 使 用 されるのと 同 じテスト<br />
ベンチが 自 動 的 に 使 用 さ れ、 合 成 後 の 結 果 がテ ス ト ベンチで 検 証 さ れます。<br />
C には、 結 果 が 有 効 かど う かを 確 認 する 方 法 が 多 く あ り ます。 上 記 の 例 の 場 合 、 関 数 か ら の 合 成 結 果 が result.dat<br />
フ ァ イルに 保 存 さ れ、 予 測 結 果 を 含 むフ ァ イル と 比 較 さ れます。 結 果 は、 合 成 には 指 定 さ れていないま った く 同 じ 関<br />
数 とも 比 較 されます (テス トベンチが 実 行 されると ソフ ト ウェアで 実 行 )。 または、 テス トベンチで 計 算 された 値 と 比<br />
較 されます。<br />
重 要 : テス トベンチの main() 関 数 に return 文 がない 場 合 、 C 規 格 で return 値 が 0 であ る こ と が 検 出 さ れます。<br />
このため、C および C/RTL 協 調 シ ミ ュ レーシ ョ ンでは、 結 果 が 間 違 っていた 場 合 で も、 常 にシ ミ ュ レーシ ョ ンがパス<br />
し た と レポー ト さ れます。 結 果 を 確 認 し、 それら が 正 し い 場 合 にのみ 0 を 戻 します。<br />
セルフチェ ッ ク テ ス ト ベンチを 作 成 する こ と で、C コードには 明 らかなエラーはなく なり、RTL テス トベンチを 作 成<br />
する 必 要 はな く な り 、 合 成 か ら の 出 力 が 正 し いかど う か 検 証 で き ます。<br />
C シミュレーションの 利 点 : 速 度<br />
C のアルゴ リ ズムのシ ミ ュレーシ ョ ンは、 同 じアルゴ リ ズムの RTL をシ ミ ュレーシ ョ ンするよ り もかなり 速 く 実 行 で<br />
き ます。 も ちろん、 アルゴ リ ズムに も よ り ますが、 標 準 的 なビデオ アルゴ リ ズムの 例 について 説 明 し ます。<br />
C の 典 型 的 なビデオ アルゴ リ ズムでは 完 全 なビデオ データ のフ レームが 処 理 さ れ、 出 力 画 像 が 参 照 画 像 と 比 較 さ れ、<br />
結 果 が 正 しいかど う かが 確 認 されます。 この C シミュレーションには、 通 常 10 ~ 20 秒 かか り ます。 RTL インプリ メ<br />
ンテーシ ョ ンのシ ミ ュレーシ ョ ンの 場 合 には、 通 常 2 ~ 3 日 かか り ます。 C シ ミュレーションと C/RTL 協 調 シ ミ ュ<br />
レーシ ョ ン 間 の ラ ン タ イ ムの 違 いは、アルゴ リ ズムに も よ り ますが、こ れが 典 型 的 なビデオ アルゴ リ ズムの 日 数 です。<br />
注 記 : ビデオ アルゴ リ ズムの 例 は、Vivado HLS のアプ リ ケーシ ョ ン ノート を http://japan.xilinx.com から 参 照 して<br />
ください。<br />
ソフトウェアのシミュレーション 速 度 を 使 用 し、 C レベルで さ らに 開 発 を 進 める と、 生 産 性 はさ らに 上 が り ます。 C<br />
シ ミ ュ レーシ ョ ンの 生 産 性 の 利 点 は、 C テ ス ト ベンチがユーザーの 設 計 手 法 の 一 部 と し て 使 用 さ れる 場 合 にのみ 明 確<br />
にな り ます。<br />
ハー ド ウ ェ ア 効 率 の 高 いデー タ 型 への 移 行<br />
この HLS UltraFast 設 計 手 法 のセ ク シ ョ ンでは、 Vivado HLS 任 意 精 度 データ 型 を 使 用 する 利 点 について 説 明 し ます。<br />
任 意 精 度 データ 型 では、 変 数 を どの 幅 でで も 指 定 で き ます。 た と えば、 変 数 を 12、 22、 または 34 ビッ ト 幅 として 定<br />
義 でき ます。 標 準 C データ 型 を 使 用 する と 、 こ れら の 変 数 はそれぞれ 16、 32、 64 ビ ッ ト にする 必 要 があ り ます。 こ<br />
高 位 合 成 japan.xilinx.com 63<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
れらの 標 準 C データ 型 を 使 用 する と 、た と えは 34 ビ ッ ト のみが 必 要 な 場 合 に 64 ビッ トのハードウェアがインプリ メ<br />
ン ト さ れる と いった よ う に、 不 必 要 なハー ド ウ ェ アが イ ンプ リ メ ン ト さ れて し ま う こ と が よ く あ り ます。<br />
最 適 化 指 示 子 を 使 用 する よ り も C (および C++) の 任 意 精 度 データ 型 を 使 用 し た 方 がデータ 幅 を 制 御 で き、C アルゴ リ<br />
ズムが こ れ ら の 新 し いビ ッ ト 幅 と 解 析 さ れた 出 力 を 使 用 し てシ ミ ュ レーシ ョ ンで き ます。 た と えば、 小 さ めのビ ッ ト<br />
幅 を 使 用 し た 場 合 に 信 号 対 ノ イ ズ 比 がまだ 使 用 可 能 かど う かを 確 認 し た り 、 よ り 小 型 で 効 率 的 なアキ ュ ム レータ の 使<br />
用 を 検 証 し て も 出 力 の 精 度 が 制 限 さ れないかど う かを 検 証 する ために 使 用 し ます。<br />
こ のハー ド ウ ェ ア 効 率 の 高 いデータ 型 への 移 行 は、 よ り 小 型 で 効 率 的 なデータ 型 が 適 切 であ る と すばや く 検 証 で き る<br />
よ う なテ ス ト ベンチがあ る 場 合 にのみ、 安 全 に 生 産 的 に 実 行 で き ます。<br />
C テ ス ト ベンチを 使 用 する 利 点 と 、 設 計 手 法 の 1 つ と し てテ ス ト ベンチを 使 用 し ない 場 合 の 生 産 性 の ロ スについては、<br />
誇 張 し て も しすぎ る こ と はあ り ません。<br />
C テス ト ベンチの 使 用 に 関 する 詳 細 については、 「C テス トベンチ」 を 参 照 して く ださい。<br />
言 語 サポー ト<br />
HLS UltraFast 設 計 手 法 では、 合 成 で 何 がサポー ト さ れる かを 理 解 する こ と が 重 要 です。 Vivado HLS では、 C、 C++、<br />
SystemC が 包 括 的 にサポー ト さ れます。 C シ ミ ュ レーシ ョ ンではすべてサポー ト さ れますが、 すべての 記 述 を 同 等 の<br />
RTL イ ンプ リ メ ンテーシ ョ ンに 合 成 する こ と はで き ません。<br />
FPGA への イ ンプ リ メ ンテーシ ョ ンで コー ド を 確 認 する 場 合 は、 次 の 主 な 原 則 を 考 慮 する 必 要 があ り ます。<br />
• FPGA は 固 定 サイ ズの リ ソースで、 その 機 能 はコ ンパイル 時 に 決 ま っている 必 要 があ り ます。 ハード ウ ェ アのオ<br />
ブジェク トは、 ダイナミ ックに 作 成 したり 壊 したりできません。<br />
• FPGA と のすべての 通 信 は、 入 力 および 出 力 ポー ト を 介 し て 実 行 さ れる 必 要 があ り ます。FPGA にはオペレーテ ィ<br />
ング システム (OS) または OS リソースが 含 まれません。<br />
サポー ト されないコ ンス ト ラ ク ト<br />
システム コール<br />
システム コールは 合 成 でサポート されません。 これらのコールは、 C プ ロ グ ラ ム 実 行 時 の OS とのやり と りに 使 用 さ<br />
れます。 FPGA には、 通 信 用 の OS は 含 まれていません。 こ の 例 は、 time() および printf() です。<br />
よ く 使 用 される 関 数 の 中 には、Vivado HLS で 自 動 的 に 無 視 さ れる も の も あ り ます。 コードからそれらを 削 除 する 必 要<br />
はあ り ません。<br />
• abort()<br />
• atexit()<br />
• exit()<br />
• fprintf()<br />
• printf()<br />
• perror()<br />
• putchar()<br />
• puts()<br />
サポー ト さ れない コー ド を 削 除 する 別 の 方 法 は、 合 成 か ら それを 保 護 する こ と です。 __SYNTHESIS__ マクロは、 合<br />
成 が 実 行 される と Vivado HLS で 自 動 的 に 定 義 さ れます。 こ のマ ク ロは C シミュレーションが 実 行 されたときにコー<br />
ド を 含 め る ために 使 用 で き ますが、 合 成 が 実 行 さ れる と コー ド を 除 外 し ます。<br />
高 位 合 成 japan.xilinx.com 64<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
#ifndef __SYNTHESIS__<br />
// The following code is ignored for synthesis<br />
FILE *fp1;<br />
char filename[255];<br />
sprintf(filename,Out_apb_%03d.dat,apb);<br />
fp1=fopen(filename,w);<br />
fprintf(fp1, %d \n, apb);<br />
fclose(fp1);<br />
#endif<br />
情 報 が OS か ら 必 要 と さ れる 場 合 、 データは 合 成 で 引 数 と し て 最 上 位 関 数 に 渡 さ れる 必 要 があ り ます。 残 り のシ ス テ<br />
ムのタス クによ り、 この 情 報 が FPGA に 提 供 されます。 こ れは、 通 常 データ ポー ト を CPU に 接 続 された AXI4-Lite<br />
インターフェイスとしてインプリ メントすると 実 行 さできます。<br />
ダイナミ ック オブジェ ク ト<br />
ダイナミ ック オブジ ェ ク ト は 合 成 で き ません。 関 数 呼 び 出 し の malloc()、 alloc()、 プリプロセッサ free() および C++<br />
の new および delete では、 OS メモリ マ ッ プに 存 在 する メ モ リ リソースをダイナミックに 作 成 または 破 壊 できます。<br />
FPGA 内 で 使 用 可 能 な メ モ リ リソースは、ブロック RAM とレジスタのみです。 ブロック RAM は 配 列 が 合 成 さ れた<br />
ときに 作 成 されます。 配 列 の 値 は 1 つま たは 複 数 の ク ロ ッ ク サ イ ク ル 間 維 持 さ れる 必 要 があ り ます。 レ ジ ス タは、 変<br />
数 で 格 納 さ れた 値 を 1 または 複 数 クロック サ イ ク ル 間 維 持 する 必 要 があ る 場 合 に 作 成 さ れます。 固 定 サ イ ズの 配 列 ま<br />
たは 変 数 は、 ダイナ ミ ッ ク メ モ リ 割 り 当 ての 代 わ り に 使 用 さ れる 必 要 があ り ます。<br />
ダイナミ ック メ モ リ の 使 用 に 関 する 制 限 と 同 様 、 Vivado HLS では、 ダイナ ミ ッ クに 作 成 / 破 壊 さ れる C++ オブジェ ク<br />
ト も 合 成 でサポー ト さ れません。 こ れには、 ポ リ モーフ ィ ズム 関 数 およびダ イナ ミ ッ ク 仮 想 関 数 の 呼 び 出 し が 含 まれ<br />
ます。 新 し いハー ド ウ ェ アにな る 可 能 性 のあ る 新 し い 関 数 は、 ラ ン タ イ ム 時 にダ イナ ミ ッ ク に 作 成 する こ と はで き ま<br />
せん。<br />
同 様 の 理 由 か ら、 再 帰 は 合 成 でサポー ト さ れません。 すべてのオブジ ェ ク ト は、 コ ンパイル 時 に 既 知 のサ イ ズであ る<br />
必 要 があ り ます。 テンプレー ト を 使 用 する 場 合 、 再 帰 は 制 限 付 き でサポー ト さ れます。<br />
最 後 に、 C++ Standard Template Libraries (STL) はサポー ト されません。 これらのラ イブラ リ には、 ダイナ ミ ッ ク メモ<br />
リ 割 り 当 て と 再 帰 を 拡 張 し て 使 用 で き る 関 数 が 含 まれます。<br />
SystemC コンストラクト<br />
SC_MODULE は 別 の SC_MODULE 内 にはネス ト でき ません。 そ こ から 派 生 もでき ません。<br />
SC_THREAD コンスト ラク トはサポート されません (SC_CTHREAD はサポー ト されます)。 .<br />
コンストラクトの 制 限 付 きサポート<br />
最 上 位 関 数<br />
テンプレー ト は 合 成 でサポー ト さ れますが、 最 上 位 関 数 での 使 用 はサポー ト さ れません。<br />
C++ クラス オブジ ェ ク ト は、 合 成 では 最 上 位 にで き ません。 ク ラ スは 最 上 位 関 数 に イ ン ス タ ンシエー ト する 必 要 が<br />
あります。<br />
ポインター トゥ ポ イ ン ターは 合 成 ではサポー ト さ れますが、 最 上 位 関 数 への 引 数 と し ては 使 用 で き ません。<br />
ポインターのサポート<br />
Vivado HLS ではネイテ ィ ブ C 型 間 のポ イ ン ター 型 変 換 がサポー ト さ れますが、 一 般 的 なポ イ ン ター 型 変 換 (たとえば、<br />
ポ イ ン ター 間 の 型 変 換 で 構 造 型 を 区 別 ) はサポー ト されません。<br />
ポ イ ン ターの 配 列 は、 各 ポ イ ン ターがス カ ラーま たはス カ ラーの 配 列 を 指 定 する 場 合 にサポー ト さ れます。 ポ イ ン<br />
ターの 配 列 では、 別 のポ イ ン ターを 指 定 する こ と はで き ません。<br />
高 位 合 成 japan.xilinx.com 65<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
再 帰<br />
FPGA の 再 帰 は、 テンプレー ト を 使 用 し た 場 合 にのみサポー ト さ れます。 合 成 で 再 帰 を 実 行 する には、 終 端 ク ラ ス を<br />
サイズ 1 で 使 用 し て、 再 帰 文 で 最 終 的 な 呼 び 出 し を イ ンプ リ メ ン ト し ます。<br />
メモリ 関 数<br />
memcpy() および memset() はどちら も const 値 が 使 用 されていれば、 サポー ト されます。<br />
• memcpy() : バース ト 操 作 ま たはconst 値 での 配 列 初 期 化 に 使 用 さ れます。 メ モ リ 関 数 は 値 を 引 数 に コ ピーし た り 、<br />
引 数 か ら 最 上 位 関 数 に コ ピーし た り する 場 合 にのみ 使 用 で き ます。<br />
• memset() : 定 数 設 定 値 での 集 約 初 期 化 に 使 用 さ れます。<br />
合 成 でサポー ト さ れない コー ド 、 ま たは 制 限 付 き で し かサポー ト さ れない コー ド は、 合 成 で き る よ う にな る 前 に 変 更<br />
する 必 要 があ り ます。 言 語 サポー ト の 詳 細 は、 「コー ド 形 式 の 影 響 」 を 参 照 して く ださい。<br />
同 時 処 理 ハー ド ウ ェ アの 理 解<br />
FPGA には、 独 自 のハード ウ ェアを 使 用 して C コー ド に 各 演 算 を イ ンプ リ メ ン ト で き ます。 こ れに よ り 、 演 算 が 同 時<br />
に 実 行 でき る よ う になるので、 パフ ォーマンス を 向 上 でき ます。<br />
並 列 演 算<br />
次 の コー ド は、 単 純 な 乗 算 演 算 をい く つか 実 行 する も ので、 同 時 処 理 ハー ド ウ ェ アの 利 点 を 説 明 する ために 記 述 し て<br />
います。 こ の 例 の 場 合 、 ク ロ ッ ク 周 波 数 は 1 つ、 つま り 各 ク ロ ッ ク サイクルで 1 回 のみの 乗 算 を 実 行 する のに 十 分 な<br />
時 間 だけがあ る よ う にする ために 指 定 さ れています。<br />
この 例 には、 INTERFACE 最 適 化 指 示 子 も 含 まれています。 こ れは、 イ ン ターフ ェ イ ス を 単 純 化 する も ので、 ハー ド<br />
ウ ェ ア を 説 明 しやす く する ために 含 まれています。 イ ン ターフ ェ イ ス 最 適 化 については、 後 で 説 明 し ます。<br />
#include "foo.h"<br />
int foo(char a, char b, char c, char d) {<br />
#pragma HLS INTERFACE ap_ctrl_none register port=return<br />
int y0,y1,y2;<br />
y0 = a * b;<br />
y1 = c * y0;<br />
y2 = d * y1;<br />
return y2;<br />
}<br />
高 位 合 成 japan.xilinx.com 66<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
通 常 、 本 書 ではハー ド ウ ェ ア 図 は 示 し ていません。 ハー ド ウ ェ ア 操 作 の 基 本 事 項 の 詳 細 を 確 認 する のは、 重 要 です。<br />
合 成 後 の イ ンプ リ メ ンテーシ ョ ンは、 次 の 図 の よ う にな り ます。<br />
X-Ref Target - Figure 1-36<br />
主 な 機 能 :<br />
• 図 の 下 半 分 の ロ ジ ッ ク は、 デザ イ ンのシーケン スに 使 用 さ れます。 こ れについては、 少 し 後 で 説 明 し ますので、<br />
今 の と こ ろは 無 視 し ます。<br />
• 図 の 上 半 分 の 関 数 引 数 a、 b、 c、 d は 入 力 ポートになりました。データがポートを 介 して 入 力 され、 乗 算 され、 結<br />
果 が 次 の ク ロ ッ ク の 立 ち 上 が り エ ッ ジのレジス タに 保 存 されます。<br />
• 次 のク ロ ッ ク サイ クルで 最 後 の 乗 算 が 実 行 され、 レジス タに 入 力 され、 ap_return ポー ト を 介 して 出 力 されます。<br />
• 乗 算 器 は 3 つあ り ます。 C コー ド と 同 じ で、 専 用 リ ソ ースが 演 算 ご と に 使 用 さ れます。 専 用 リ ソース を 使 用 する<br />
利 点 がない と 合 成 で 決 まれば、 自 動 的 に リ ソース を 共 有 し よ う と し ます。<br />
• 合 成 では、 2 つの 乗 算 を 並 列 で 実 行 で き ます。<br />
次 は、 ハー ド ウ ェ ア を 同 時 処 理 する 並 列 演 算 の 1 つ 目 の 利 点 です。 単 に C コードに 表 れる y0、 y1、 y2 の 順 番 には 計<br />
算 さ れません。 演 算 の 順 番 を 並 び 替 え る と 、 2 つの 乗 算 を 並 行 に 実 行 でき、 すべての 演 算 を 3 クロック サイクルでは<br />
なく、2 クロック サイクルで 終 了 できます。<br />
合 成 後 は Vivado HLS ではこ のデザイ ンの 結 果 が 次 のよ う にレポー ト されます。<br />
+ Latency (clock cycles):<br />
図 1‐36 : 単 純 な 乗 算 器<br />
高 位 合 成 japan.xilinx.com 67<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
* Summary:<br />
+-----+-----+-----+-----+---------+<br />
| Latency | Interval | Pipeline|<br />
| min | max | min | max | Type |<br />
+-----+-----+-----+-----+---------+<br />
| 2| 2| 3| 3| none |<br />
+-----+-----+-----+-----+---------+<br />
デザ イ ンには 結 果 を 出 力 する までに 2 クロック サイクル 必 要 で、 新 しい 入 力 は 3 クロック サイクルごとに 処 理 でき<br />
ます。 こ れ ら の 結 果 は 最 適 化 指 示 子 を 使 用 する と 改 善 で き ます。<br />
パイプライン 演 算<br />
前 の 例 の 2 入 力 乗 算 が 実 行 さ れてい る 間 に、 出 力 側 の 乗 算 器 では 何 も 実 行 さ れません。 反 対 に、 出 力 乗 算 が 実 行 さ れ<br />
てい る 間 、 入 力 側 の 乗 算 器 では 何 も 実 行 さ れません。 同 時 処 理 ハー ド ウ ェ アの 別 の 利 点 は 同 時 にすべての リ ソース を<br />
使 用 するパイ プ ラ イ ン 演 算 にあ り ます。<br />
図 1-37 は、 パイプラインの 概 念 を 説 明 しています。 パイプラインがないと、 演 算 は 関 数 が 最 初 のト ランザクシ ョ ン<br />
を 完 了 する までシーケ ンシ ャルに 実 行 さ れます。 こ の 後 、 次 の ト ラ ンザ ク シ ョ ン セッ トが 実 行 されます。パイプライ<br />
ンがある と、 次 の 2 つ 目 の ト ラ ンザ ク シ ョ ンがハー ド ウ ェ ア リ ソ ースが 使 用 可 能 になった 直 後 に 開 始 さ れます。<br />
X-Ref Target - Figure 1-37<br />
前 の 例 で 関 数 がパイ プ ラ イ ン 処 理 さ れる 場 合 は、 次 の よ う にな り ます。<br />
#include "foo.h"<br />
図 1‐37 : パイプライン ビヘイビアー<br />
#pragma HLS INTERFACE ap_ctrl_none register port=return<br />
#pragma HLS PIPELINE<br />
高 位 合 成 japan.xilinx.com 68<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
int foo(char a, char b, char c, char d) {<br />
int y0,y1,y2;<br />
y0 = a * b;<br />
y1 = c * y0;<br />
y2 = d * y1;<br />
return y2;<br />
}<br />
パフォーマンスは 次 のよ う にレポート されます。<br />
+ Latency (clock cycles):<br />
* Summary:<br />
+-----+-----+-----+-----+----------+<br />
| Latency | Interval | Pipeline |<br />
| min | max | min | max | Type |<br />
+-----+-----+-----+-----+----------+<br />
| 2| 2| 1| 1| function |<br />
+-----+-----+-----+-----+----------+<br />
レイテンシは 同 じのままですが、 関 数 はクロック サ イ ク ルご と に 新 し いデータ セ ッ ト を 処 理 し 始 めます。 こ れは、パ<br />
フ ォーマン スの 優 れたデザイ ンの 場 合 は 理 想 的 です。<br />
Vivado HLS では、 関 数 と ループの 両 方 をパイ プ ラ ン 処 理 で き ます。 ループのパイ プ ラ イ ン 処 理 の 利 点 は、 次 の よ う な<br />
小 さい 例 で 確 認 できます。<br />
for(i=0; i
第 1 章 : 高 位 合 成<br />
こ の 例 の 場 合 、 元 の 関 数 にはレ イ テンシ と 8 クロック サイクルの 間 隔 があり ます。 DATAFLOW 最 適 化 が 使 用 さ れる<br />
と 、 こ の 間 隔 は 3 クロック サイクルにまで 削 減 されます。 この 例 で 示 されるタスクは 関 数 ですが、 DATAFLOW 最 適<br />
化 は 関 数 間 、 関 数 と ループ 間 、 ループ 間 で 実 行 で き ます。<br />
X-Ref Target - Figure 1-38<br />
図 1‐38 : DATAFLOW 最 適 化<br />
DATAFLOW 最 適 化 は、 タ ス ク 間 に メ モ リ チ ャ ネルを 挿 入 する と 達 成 で き ます。 デフ ォル ト では、 メ モ リ チャネルは<br />
タスク 間 で 渡 される 変 数 のサイズのピンポン バ ッ フ ァーです。 た と えば、 変 数 My_Array[1024] がデータ フ ロー 領<br />
域 の 関 数 またはループ 間 で 渡 される と、 デフ ォル ト の メ モ リ チャネルはサイズ 1024 の(つま りサイズ 1024 の 2 つの<br />
ブロック RAM) のピンポン バッファーです。<br />
データ ストリームが 1 つの タ ス ク か ら 次 の タ ス ク に 移 動 する よ う な 典 型 的 な 高 パフ ォーマン ス なシ ス テムでは、<br />
DATAFLOW コ ン フ ィ ギ ュ レーシ ョ ン を 使 用 する と 、 メ モ リ チャ ネルのサ イ ズが 絶 対 最 小 値 まで 削 減 さ れます。 次 に<br />
例 を 示 します。<br />
• func_A が 間 隔 1 でパイプラ イ ン 処 理 される と、 各 ク ロ ッ ク サ イ ク ルご と に 新 し い 値 が 出 力 さ れます。<br />
• func_B が 間 隔 1 でパイプラ イ ン 処 理 される と、 各 ク ロ ッ ク サ イ ク ルご と に 新 し い 値 が 受 信 さ れます。<br />
• DATAFLOW コンフィギュレーション 設 定 は、 GUI の [Solution] → [Solution Settings] → [General] または Tcl コマ<br />
ンドの config_dataflow で、 メ モ リ チャネルをインプリ メン トするために FIFO を 使 用 する かど う かを 指 定<br />
できます。 FIFO の 深 さは 1 に 設 定 でき ます。<br />
重 要 : メモリ チャ ネルのサ イ ズの 設 定 値 が 小 さ すぎ る と 、 デザ イ ンが 停 止 し、 デ ッ ド ロ ッ ク になって し ま う 可 能 性 が<br />
あ り ます。 次 の 推 奨 事 項 に 従 って メ モ リ チャネルのサイズを 設 定 してください。<br />
サンプルが 任 意 ( 非 ス ト リーミ ング) アクセスを 使 用 してタスク 間 で 渡 されるシステムでは、デフォルトのメモリ チャ<br />
ネルを 使 用 する こ と をお 勧 め し ます。 こ れは、 一 番 安 全 な コ ン フ ィ ギ ュ レーシ ョ ンで、 すべてのサンプルが タ ス ク 間<br />
が 安 全 に 渡 されます。<br />
高 位 合 成 japan.xilinx.com 70<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ストリーミング データ が 使 用 さ れる シ ス テムでは、 メ モ リ チャ ネルを FIFO インプリ メンテーションに 変 更 して、<br />
FIFO の 深 さ は 最 初 は 必 要 な 最 小 データ レー ト よ り 上 のレベルに 設 定 する こ と をお 勧 め し ます。 デザ イ ン を 合 成 し、<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ンがパスする かど う かの 確 認 に 進 み、 FIFO に よ り デザ イ ンが 停 止 する こ と がない よ う に<br />
し ます。 こ の 後 、 メ モ リ チャネルのサイズを 削 減 して、デザインを 合 成 し 直 し、C/RTL 協 調 シ ミ ュ レーシ ョ ンがパス<br />
する かど う かを 再 び 確 認 し ます。<br />
デシ メ ーシ ョ ン と イ ン ターポレーシ ョ ンに よ り タ ス ク でデータ が 送 信 および 受 信 さ れる レー ト が 変 更 さ れる 可 能 性<br />
のあるよ う なさ らに 複 雑 なシステムでは、 STREAM 指 示 子 を 使 用 し て タ ス ク 間 の 個 別 チ ャ ネルを 指 定 で き ます。 デ<br />
フォルトはピンポン チャネルに、 個 別 チャネルは FIFO インプリ メンテーション (またはその 逆 ) に 設 定 でき ます。<br />
同 時 処 理 ハー ド ウ ェ アの 利 点 についてのま と め<br />
専 用 ハー ド ウ ェ ア リソースを 使 用 して C コー ド で 指 定 さ れた 演 算 を イ ンプ リ メ ン ト する と 、 こ れら の 演 算 が 並 列 で<br />
実 行 で き、 パイ プ ラ イ ン 手 法 で 実 行 で き る よ う にな り ます。 こ れに よ り 、 パフ ォーマン スは 最 大 にな り ます。<br />
HLS UltraFast 設 計 手 法 の 次 の 段 階 では、 Vivado HLS でデフ ォル ト で 実 行 さ れる 最 適 化 と 指 定 さ れる 可 能 性 のあ る 最<br />
適 化 について 理 解 する 必 要 があ り ます。<br />
合 成 ス ト ラ テジ<br />
デザ イ ン を 合 成 する ス ト ラ テジを 定 義 する 最 初 の 段 階 では、Vivado HLS で 自 動 的 に 実 行 さ れる 最 適 化 と 、 使 用 可 能 な<br />
最 適 化 (オプシ ョ ン) について 理 解 し ます。<br />
デフ ォル ト の 最 適 化 ス ト ラ テジ<br />
Vivado HLS では、デフ ォル ト のビヘイ ビ アー と 制 約 に 基 づいて、 最 適 な イ ンプ リ メ ンテーシ ョ ンが 短 時 間 で 作 成 さ れ<br />
ます。 ク ロ ッ クは 主 な 制 約 で、 Vivado HLS ではこれと ターゲッ ト デバイ ス 仕 様 を 使 用 し て、 ク ロ ッ ク サイクル 内 で<br />
い く つの 演 算 が 実 行 可 能 なのか 決 定 さ れます。 ク ロ ッ ク 周 波 数 制 約 を 満 た し た 後 の Vivado HLS のパフ ォーマン ス 目<br />
標 は、 重 要 な 順 番 で 並 べる と 次 の よ う にな り ます。<br />
• [Interval] : 新 し い 入 力 間 の 間 隔 を 最 小 に し、 データ スループッ ト レー ト を 最 大 に し ます。<br />
• [Latency] : 最 小 間 隔 を 達 成 し た ら、 ま たは 内 部 ターゲ ッ ト が 指 定 さ れていない 場 合 に、 レ イ テンシを 最 小 に し ま<br />
す。<br />
• [Area]: 最 小 レ イ テンシを 達 成 し た ら、 エ リ ア を 最 小 に し ます。<br />
最 適 化 指 示 子 がない 場 合 、Vivado HLS では こ れら の 目 標 と 次 に 示 すデフ ォル ト の 合 成 ビヘイ ビ アーを 使 用 し て、 最 初<br />
のデザ イ ン を 作 成 し ます。<br />
最 上 位 関 数 引 数 の 合 成<br />
最 上 位 関 数 への 引 数 はオプシ ョ ンの IO プ ロ ト コルのデータ ポー ト に 合 成 さ れます。IO プ ロ ト コル と は、データ ポー<br />
トとシステムのほかのハードウェア ブ ロ ッ ク 間 のデータ 通 信 を 自 動 的 に 同 期 する ためのデータ ポー ト に 関 連 した 1<br />
つま たは 複 数 の 信 号 の こ と です。<br />
たとえば、ハンドシェイク プ ロ ト コルでは、 データ ポー ト 付 いている valid ポー ト に よ り データ が 読 み 込 みま たは 書<br />
き 出 しの 間 有 効 になる こ とが 示 され、 ACK (acknowledge) ポー ト に よ り データ の 読 み 込 みま たは 書 き 出 し が 示 さ れる<br />
タイミングが 示 されます。<br />
使 用 可 能 な IO プロ ト コルのタイプは、 C 引 数 の タ イ プに よ って 異 な り ます。<br />
• 値 渡 し 引 数 は、 デフ ォル ト で IO プ ロ ト コルのないデータ ポー ト です。<br />
• 参 照 渡 し 入 力 は、 デフ ォル ト で IO プ ロ ト コルのデータ ポー ト です。<br />
• 参 照 渡 し 出 力 は、 デフ ォル ト で 関 連 する 出 力 valid ポー ト に 接 続 さ れたデータ 出 力 ポー ト です。<br />
• 読 み 込 み と 書 き 出 し の 両 方 の 参 照 渡 し 引 数 は、 上 記 のデフ ォル ト で 別 々の 入 力 および 出 力 ポー ト に 分 割 さ れま<br />
す。<br />
高 位 合 成 japan.xilinx.com 71<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
• 配 列 引 数 はブ ロ ッ ク RAM メモリ ポー ト と して イ ンプ リ メ ン ト されます。<br />
デフ ォル ト では、 最 上 位 関 数 引 数 リ ス ト の 構 造 体 (struct) は 別 々の メ ンバー エレ メン トに 分 解 されます。 エレ メン ト<br />
はそれぞれ 上 記 のよ う に IO ポー ト に 合 成 さ れます。<br />
また、 IO プ ロ ト コルはデフ ォル ト で 最 上 位 関 数 用 に イ ンプ リ メ ン ト さ れます。 こ のプ ロ ト コルに よ り 、 関 数 が 演 算<br />
を 開 始 で き、 演 算 を 終 了 し て 新 し い 入 力 データ の 受 け 入 れ 準 備 がで き た ら それが 示 さ れる よ う にな り ます。 IO プロ<br />
トコルは、 関 数 の return に 関 連 付 け ら れます(C プ ロ グ ラ ムに 明 示 的 な 戻 り 値 が 指 定 さ れていない 場 合 で も、 return に<br />
関 連 付 け られます)。<br />
下 位 関 数 の 合 成<br />
関 数 は 最 終 的 な RTL デザイ ンでは 階 層 ブロ ッ ク に 合 成 されます。 C コー ド の 各 関 数 は、 独 自 のブ ロ ッ ク で 最 終 的 な<br />
RTL に 記 述 さ れます。 通 常 、 最 適 化 は 関 数 の 境 界 で 停 止 し ます。 最 適 化 指 示 子 の 中 には 再 帰 (recursive) オプシ ョ ンが<br />
あ った り 、 指 示 子 が 関 数 境 界 を 超 えて 適 用 で き る ビヘイ ビ アーの も のがあ り ます。<br />
関 数 は、 最 適 化 指 示 子 を 使 用 する と イ ン ラ イ ン 化 で き ます。 こ れに よ り 、 関 数 の 階 層 が 永 久 に 削 除 さ れる ので、 ロ<br />
ジ ッ ク の 最 適 化 を 改 善 で き ます。 Vivado HLS では、 小 さ い 関 数 を 自 動 的 に イ ン ラ イ ン 化 する と 、 結 果 の 質 を 改 善 で き<br />
ます。 最 適 化 指 示 子 の INLINE に -off オプシ ョ ン を 付 けて 使 用 する と 、 自 動 イ ン ラ イ ン を 回 避 で き ます。<br />
関 数 は、 で き る だけ 簡 単 に 実 行 する よ う にス ケジ ュール さ れます。 次 の 例 は、 foo_1 および foo_2 という 2 つの 関<br />
数 を 示 しています。<br />
void foo_1 (a,b,c,d,*x,*y) {<br />
...<br />
func_A(a,b,&x);<br />
func_B(c,d,&y);<br />
}<br />
foo_1 関 数 には、 func_A および func_B 間 のデータ 依 存 はあ り ません。 コード では 直 列 に 見 えますが、 どち らの 関<br />
数 でも 最 初 のク ロ ッ ク サ イ ク ルで 同 時 にデータ 処 理 が 開 始 さ れる アーキテ ク チャがイ ンプ リ メ ン ト さ れます。<br />
}<br />
void foo_2 (a,b,c,*x,*y) {<br />
int inter1;<br />
...<br />
func_A(a,b,inter1,&x);<br />
func_B(c,d,inter1,&y)<br />
foo_2 関 数 には、 関 数 間 にデータ 依 存 があ り ます。 inter1 内 部 変 数 は func_A から func_B に 渡 されます。 この<br />
場 合 、Vivadl HLS では func_B 関 数 を ス ケジ ュールし て、func_A 関 数 が 終 了 し てか ら のみ 開 始 さ れる よ う に し ます。<br />
ループの 合 成<br />
ループはデフ ォル ト では 閉 じ た ま まです。 つま り 、 Vivado HLS ではループのボデ ィ 内 でロジ ッ クが 合 成 されてから、<br />
ループ 終 端 制 限 に 達 成 する まで こ の ロ ジ ッ ク がシーケ ンシ ャルに 実 行 さ れます。 通 常 はループに 入 る のに 1 クロック<br />
サイクル、 出 るのに 1 クロック サイクルかかり ます。ループのサイクルへ 入 るサイクルと 出 るサイクルは、ループの<br />
前 または 後 のク ロ ッ ク サ イ ク ルの 演 算 と 統 合 で き ます。<br />
ループは 常 に 順 番 に 実 行 される よ う にスケジュールされます。 次 の 例 では、 ループ SUM_X および SUM_Y 間 に 依 存 は<br />
あ り ませんが、 コー ド に 記 述 さ れる 順 番 で 常 にス ケジ ュール さ れます。<br />
高 位 合 成 japan.xilinx.com 72<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
#include loop_sequential.h<br />
void loop_sequential(din_t A[N], din_t B[N], dout_t X[N], dout_t Y[N],<br />
dsel_t xlimit, dsel_t ylimit) {<br />
dout_t X_accum=0;<br />
dout_t Y_accum=0;<br />
int i,j;<br />
}<br />
}<br />
SUM_X:for (i=0;i
第 1 章 : 高 位 合 成<br />
パフ ォーマンス 目 的 のための 一 般 的 な 最 適 化 ス ト ラ テジ<br />
前 のセ ク シ ョ ンで 説 明 し たデフ ォル ト の 合 成 ビヘイ ビ アーに 加 えて、Vivado HLS には 多 く の 最 適 化 指 示 子 と コ ン フ ィ<br />
ギ ュ レーシ ョ ンが 含 まれてお り 、 必 要 な 結 果 にな る よ う に 合 成 を 設 定 で き ます。<br />
最 適 化 指 示 子 すべての リ ス ト は、 次 を 参 照 し て く だ さ い。 こ の リ ス ト には、 左 側 に Tcl コ マン ド を、 右 側 にそれに 該<br />
当 する プ ラ グマ 指 示 子 を 示 し ています。<br />
次 は、 最 適 化 指 示 子 すべての リ ス ト を 示 し ています。<br />
set_directive_allocation<br />
- Directive ALLOCATION<br />
set_directive_array_map<br />
- Directive ARRAY_MAP<br />
set_directive_array_partition - Directive ARRAY_PARTITION<br />
set_directive_array_reshape - Directive ARRAY_RESHAPE<br />
set_directive_data_pack<br />
- Directive DATA_PACK<br />
set_directive_dataflow<br />
- Directive DATAFLOW<br />
set_directive_dependence<br />
- Directive DEPENDENCE<br />
set_directive_expression_balance - Directive EXPRESSION_BALANCE<br />
set_directive_function_instantiate - Directive FUNCTION_INSTANTIATE<br />
set_directive_inline<br />
- Directive INLINE<br />
set_directive_interface<br />
- Directive INTERFACE<br />
set_directive_latency<br />
- Directive LATENCY<br />
set_directive_loop_flatten<br />
- Directive LOOP_FLATTEN<br />
set_directive_loop_merge<br />
- Directive LOOP_MERGE<br />
set_directive_loop_tripcount - Directive LOOP_TRIPCOUNT<br />
set_directive_occurrence<br />
- Directive OCCURRENCE<br />
set_directive_pipeline<br />
- Directive PIPELINE<br />
set_directive_protocol<br />
- Directive PROTOCOL<br />
set_directive_reset<br />
- Directive RESET<br />
set_directive_resource<br />
- Directive RESOURCE<br />
set_directive_stream<br />
- Directive STREAM<br />
set_directive_top<br />
- Directive TOP<br />
set_directive_unroll<br />
- Directive UNROLL<br />
コ ン フ ィ ギ ュ レーシ ョ ンはデフ ォル ト の 合 成 ビヘイ ビ アーを 変 更 し ます。 コ ン フ ィ ギ ュ レーシ ョ ンに 該 当 する プ ラ グ<br />
マはあ り ません。GUI では、コンフ ィ ギュ レーシ ョ ンは [Solution] → [Solution Settings] → [General] か ら 設 定 で き ます。<br />
次 に 使 用 可 能 な コ ン フ ィ ギ ュ レーシ ョ ンすべての リ ス ト を 示 し ます。<br />
config_array_partition<br />
config_bind<br />
config_compile<br />
config_dataflow<br />
config_interface<br />
config_rtl<br />
config_schedule<br />
- Config the array partition<br />
- Config the options for binding<br />
- Config the optimization<br />
- Config the dataflow pipeline<br />
- Config command for io mode<br />
- Config the options for RTL generation<br />
- Config scheduler options<br />
すべての 最 適 化 指 示 子 および 合 成 コ ン フ ィ ギ ュ レーシ ョ ンの リ ス ト を 取 得 し てお く だけでな く 、 それ ら を 使 用 する ス<br />
トラテジを 知 っておくこともお 勧 めします。<br />
高 位 合 成 を 使 用 し てデザ イ ン を 最 適 化 し よ う と する 際 には、 さ ま ざ ま な 目 標 を 設 定 で き ます。 こ の HLS UltraFast 設<br />
計 手 法 ガ イ ド では、パフ ォーマン スが 最 も 高 く な る よ う にデザ イ ン を 作 成 し、 各 ク ロ ッ ク サイクルごとに 新 しい 入 力<br />
データ を 1 サンプル 処 理 する よ う にする のが 目 標 だ と 仮 定 し て 記 述 さ れています。<br />
これが 目 標 ではない 場 合 でも、 パフ ォーマンスのためのス ト ラ テジを 理 解 し てお く 価 値 はあ り ます。 このパフ ォーマ<br />
ン ス 最 適 化 ス ト ラ テジでは、 上 記 に リ ス ト さ れる 最 適 化 それぞれについて 簡 単 に 説 明 し ます。<br />
こ こ で 説 明 さ れる 最 適 化 の 詳 細 な 説 明 については、「イ ン ターフ ェ イ スの 管 理 」 および 「デザ イ ン 最 適 化 」 を 参 照 して<br />
く だ さ い。 手 法 を 確 認 し て、 特 定 の 最 適 化 の 詳 細 を 確 認 する 前 に 高 位 合 成 最 適 化 を グ ローバルな 観 点 で 理 解 し てお く<br />
ことをお 勧 めします。<br />
高 位 合 成 japan.xilinx.com 74<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
最 初 の 最 適 化<br />
次 の 表 は、 デザ イ ンに 追 加 する かど う かを 考 慮 する 必 要 のあ る 最 初 の 指 示 子 を リ ス ト し ています。<br />
表 1‐7: 最 適 化 ス ト ラ テジの 手 順 1<br />
指 示 子 および コ ン フ ィ ギュ レーシ ョ ン<br />
INTERFACE<br />
DATA_PACK<br />
LOOP_TRIPCOUNT<br />
Config Interface<br />
説 明<br />
関 数 記 述 か ら どの よ う に RTL ポー ト が 作 成 されるかを 指 定 し<br />
ます。<br />
構 造 体 (struct) のデータ フィールドを 1 つのス カ ラー ( ワード 数<br />
がよ り 大 きい) にパッ キング し ます。<br />
変 数 境 界 のあ るループに 使 用 さ れます。 ループ 反 復 カ ウ ン ト の<br />
概 算 を 提 供 し ます。 こ れは 合 成 には 影 響 がな く 、 レポー ト にの<br />
み 影 響 し ます。<br />
こ のコ ン フ ィ ギ ュ レーシ ョ ンでは 最 上 位 関 数 の 引 数 に 関 連 付<br />
けられていない IO ポー ト が 制 御 さ れ、 最 終 的 な RTL から 未 使<br />
用 のポー ト が 削 除 で き ます。<br />
デザイ ン インターフェイスは 通 常 システムのその 他 のブロックで 定 義 されます。 IO プ ロ ト コルのタ イ プを 指 定 する<br />
と 合 成 で 何 が 達 成 で き る のかを 判 断 しやす く な る ので、 デザ イ ンの 最 適 化 に 進 む 前 に INTERFACE 指 示 子 を 使 用 し て<br />
こ れを 指 定 し てお く こ と をお 勧 め し ます。<br />
アルゴリズムがストリーミング 方 法 でデータにアクセスする 場 合 は、ストリーミング プロ ト コルの 1 つを 使 用 し て、<br />
パフォーマンスを 上 げます。<br />
ヒント : IO プ ロ ト コルが 外 部 ブ ロ ッ ク で 完 全 に 固 定 さ れ、 変 更 さ れない 場 合 は、 INTERFACE 指 示 子 を 直 接 C コード<br />
にプラグマとして 挿 入 してみることを 考 えてください。<br />
構 造 体 が 最 上 位 引 数 リ ス ト で 使 用 さ れる 場 合 は、 別 々のエレ メ ン ト に 分 解 さ れ、 構 造 体 の 各 エレ メ ン ト は 別 々のポー<br />
ト と し て イ ンプ リ メ ン ト さ れます。 ポー ト 全 体 を 単 一 のデータ ワード と してインプリ メ ン トするには、 DATA_PACK<br />
最 適 化 を 使 用 する と 有 益 な こ と があ り ます。 構 造 体 に 大 き な 配 列 が 含 まれる 場 合 は、 注 意 が 必 要 です。 配 列 の 各 エレ<br />
メ ン ト がデータ ワードにインプリ メ ン ト される と、 かな り 幅 の 広 いデータ ポー ト になる こ と があ り ます。<br />
デザ イ ン を 最 初 に 合 成 し た と き に よ く 発 生 する 問 題 は、 レ イ テンシ と 間 隔 が 数 値 ではな く ク エスチ ョ ン マーク () で<br />
レポート フ ァ イルに 表 示 さ れる こ と です。 デザイ ンに 可 変 ループ 境 界 を 含 むループがあ る 場 合 は、 Vivado HLS では<br />
レイテンシが 決 定 できません。<br />
[Analysis] 表 示 モー ド ま たは 合 成 レポー ト を 使 用 し、 合 成 で 数 値 がレポー ト さ れなかった 最 下 位 ループを 見 つけて、<br />
LOOP_TRIPCOUNT 指 示 子 を 使 用 し て 概 算 さ れた tripcount を 適 用 します。 これによ り、 レイテンシ と 間 隔 の 値 がレ<br />
ポー ト さ れる よ う にな り 、 さ ま ざ ま な 最 適 化 の ソ リ ューシ ョ ン を 比 較 で き る よ う にな り ます。<br />
注 記 : 可 変 境 界 付 き のループは 完 全 には 展 開 で き ないため、 それよ り 上 の 階 層 の 関 数 およびループはパイ プ ラ イ ンで<br />
き ません。 これについては、 次 のセ ク シ ョ ンで 説 明 し ます。<br />
最 後 に、 グ ローバル 変 数 は 通 常 合 成 では 関 数 のス コープ 内 で 書 き 出 さ れて 読 み 困 れる ので、 最 終 的 な RTL デザイ ン<br />
で IO ポー ト にな る 必 要 はあ り ません。 グ ローバル 変 数 がデザ イ ンか ら 情 報 を 入 力 ま たは 出 力 する のに 使 用 さ れる 場<br />
合 は、 イ ン ターフ ェ イ ス コンフィギュレーションを 使 用 してそれらを IO ポー ト にする こ と をお 勧 めし ます。<br />
高 位 合 成 japan.xilinx.com 75<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
パフ ォーマンスのためのパイ プ ラ イ ン<br />
高 パフ ォーマン ス デザ イ ン を 作 成 する 次 の 段 階 では、 関 数 、 ループ、 およびタ ス ク をパイ プ ラ イ ン 処 理 し ます。 次 の<br />
表 は、 こ れを 実 行 する 指 示 子 を 示 し ます。<br />
表 1‐8: 最 適 化 ス ト ラ テジの 手 順 2<br />
指 示 子 および コ ン フ ィ ギュ レーシ ョ ン<br />
PIPELINE<br />
DATAFLOW<br />
説 明<br />
ループま たは 関 数 内 での 演 算 を 同 時 処 理 で き る よ う に し て 開<br />
始 間 隔 を 削 減 し ます。<br />
タスク レベルのパイ プ ラ イ ン を 有 効 に し、 関 数 およびループが<br />
同 時 に 実 行 さ れる よ う に し ます。 間 隔 を 最 小 限 にする ために 使<br />
用 します。<br />
最 適 化 プ ロ セスの こ の 段 階 では、 で き るだけ 多 く の 同 時 処 理 演 算 を 作 成 する よ う に し ます。 PIPELINE 指 示 子 は、 関<br />
数 およびループに 適 用 で き ます。 DATAFLOW 指 示 子 がその 関 数 およびループを 含 むレベルで 使 用 さ れる と 、 それ ら<br />
を 並 列 に 実 行 で き ます。<br />
推 奨 さ れる ス ト ラ テジは、 ボ ト ムア ッ プ 方 法 です。<br />
• 関 数 およびループの 中 には、 下 位 関 数 が 含 まれる も の も あ り ます。 下 位 関 数 がそれよ り 上 位 の 関 数 と パイ プ ラ イ<br />
ン さ れていない と 、 それがパイ プ ラ イ ン さ れた と き にあ ま り 改 善 が 見 ら れない 可 能 性 があ り ます。 下 位 関 数 がパ<br />
イ プ ラ イ ン さ れていない こ と が、 こ の 問 題 の 原 因 です。<br />
• 関 数 およびループの 中 には、 下 位 ループが 含 まれる も の も あ り ます。 PIPELINE 指 示 子 が 使 用 さ れる と 、 それよ<br />
り 下 の 階 層 のループの 展 開 がすべて 自 動 的 に 解 除 されます。 これによ り 、 かな り 多 く のロ ジ ッ ク が 作 成 される 可<br />
能 性 があ り ます。 下 位 階 層 のループをパイ プ ラ イ ンする 方 が 推 奨 さ れます。<br />
可 変 境 界 付 き のループは 展 開 で き ないので、 それよ り 上 のループおよび 関 数 はパイ プ ラ イ ンで き ません。 こ こ で 使 用<br />
されるス ト ラテジでは、 これらのループをパイプラインし、 DATAFLOW 最 適 化 を 使 用 し て、 それら を 含 む 関 数 か ら<br />
のパフ ォーマン スが 最 大 にな る よ う にする か、 ループを 書 き 直 し て 可 変 境 界 を 削 除 し ます。<br />
どの 関 数 およびループをパイ プ ラ イ ンする かや DATAFLOW 指 示 子 を ど こ に 適 用 する か と いった 詳 細 については、<br />
「パイプ ラ イ ン 適 用 ス ト ラ テジ」 を 参 照 して く ださい。 ただ し、 最 適 化 プ ロ セ スの こ の 段 階 での 基 本 的 な ス ト ラ テジで<br />
は、 タ ス ク ( 関 数 およびループ) をできるだけパイプラ インします。<br />
パイプライン パフォーマンスを 有 効 にする 指 示 子<br />
C コー ド には、 関 数 ま たはループがパイ プ ラ イ ン さ れない よ う にする 記 述 を 含 め る こ と がで き た り 、 必 要 なパフ ォー<br />
マンスでパイプラ インされないよ うにする 記 述 を 含 める こ とができます。 これには、 コードを 変 更 する 必 要 があある<br />
こ と があ り ますが、 ほ と んどの 場 合 、 こ れら の 問 題 にはほかの 最 適 化 指 示 子 を 使 用 する と 対 処 で き ます。<br />
次 は、 最 適 化 指 示 子 に よ り パイ プ ラ イ ン パフ ォーマン スが 改 善 さ れる 例 です。<br />
#include "bottleneck.h"<br />
dout_t bottleneck(din_t mem[N]) {<br />
dout_t sum=0;<br />
int i;<br />
SUM_LOOP: for(i=3;i
第 1 章 : 高 位 合 成<br />
上 記 の コー ド が 合 成 さ れる と 、 次 の メ ッ セージが 表 示 さ れます。<br />
@I [SCHED-61] Pipelining loop 'SUM_LOOP'.<br />
@W [SCHED-69] Unable to schedule 'load' operation ('mem_load_2', bottleneck.c:57) on<br />
array 'mem' due to limited memory ports.<br />
@I [SCHED-61] Pipelining result:Target II:1, Final II:2, Depth:3.<br />
パイプラ イ ンで 必 要 なパフ ォーマンスが 満 た されない 場 合 は、 [Analysis] 表 示 モー ド でデザ イ ン を 確 認 し ます。 次 の<br />
図 は こ の 表 示 モー ド を 示 し ています。<br />
• 図 では メ モ リ アクセスがハイライ ト されています。<br />
• アドレスの 生 成 に 1 サ イ ク ル、 データ の 読 み 込 みに 1 サイクルの、 合 計 2 クロック サイクルかかり ます。<br />
• ブロック RAM には 最 大 2 つのデータ ポー ト までしか 使 用 できないので、 サイ クル C1 で 開 始 でき る メ モ リ 読 み<br />
込 みは 2 つだけです。<br />
• 3 つ 目 と 4 つ 目 の メ モ リ 読 み 込 みは C2 でのみ 開 始 で き ます。<br />
• 次 の メ モ リ 読 み 込 みのセ ッ ト が 開 始 で き る のは、 早 く て も サ イ ク ル C3 なので、 II は 2 にな り ます。<br />
X-Ref Target - Figure 1-39<br />
この 問 題 は、ARRAY_PARTITION 指 示 子 を 使 用 する と 解 決 で き ます。 こ の 指 示 子 では、 配 列 が よ り 小 さ な 配 列 に 分 割<br />
されるので、 よ り 多 くのデータ ポー ト が 提 供 さ れます。 次 に 示 すよ う に、 指 示 子 を 追 加 で 使 用 する と 、 配 列 mem が<br />
2 つの メ モ リ に 分 割 され、 4 つすべての 読 み 込 みが 1 クロック サイクルで 発 生 できるよ うになり ます ( 係 数 2 でサイ<br />
ク ル 分 割 する と 、 最 初 の 配 列 には 元 の 配 列 か ら エレ メ ン ト 0、 2、 4 などが、 2 つ 目 の 配 列 にはエレ メ ン ト 1、 3、 5 な<br />
どが 含 まれます)。<br />
#include "bottleneck.h"<br />
dout_t bottleneck(din_t mem[N]) {<br />
#pragma HLS ARRAY_PARTITION variable=mem cyclic factor=2 dim=1<br />
dout_t sum=0;<br />
図 1‐39 : ポー ト が 少 なすぎるためのパイプラ イン エラー<br />
高 位 合 成 japan.xilinx.com 77<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
int i;<br />
SUM_LOOP: for(i=3;i
第 1 章 : 高 位 合 成<br />
通 常 は、 ス ケジ ュール エフ ォー ト を 増 加 する こ と でス ケジ ュー リ ングが 改 善 さ れる こ と はあ ま り あ り ませんが、 オプ<br />
シ ョ ン 自 体 は 提 供 さ れています。<br />
最 適 化 指 示 子 およびコ ン フ ィ ギ ュ レーシ ョ ンが 開 始 間 隔 を 改 善 する ために 使 用 で き ない 場 合 は、 コー ド を 変 更 する 必<br />
要 があ る こ と があ り ます。 この 例 については、 「ハード ウ ェ ア 効 率 の 良 い C コー ド の 記 述 」 を 参 照 して く ださい。<br />
エリアの 改 善<br />
必 要 な 開 始 間 隔 が 満 た さ れた ら、 次 は 同 じパフ ォーマン ス を 維 持 しつつエ リ アを 削 減 し てみます。<br />
DATAFLOW 最 適 化 が 使 用 さ れる 場 合 、データ フ ロー コンフィギュレーションの config_dataflow を 使 用 して、デ<br />
フォルトのメモリ チャネルで 使 用 されるピンポン ブロック RAM を FIFO に 変 換 し、 FIFO の 深 さ を 最 低 限 必 要 なサ<br />
イ ズに 設 定 する と 、 エ リ アが 一 気 にかな り 改 善 で き ます。<br />
データ フ ロー コンフィギュレーションの config_dataflow では、すべての メ モ リ チャネルのデフォルト インプリ<br />
メンテーションを 指 定 します。 ブロック RAM を 使 用 してどの 配 列 をインプ リ メ ン ト するのか、 どれを FIFO として<br />
インプリ メン トするかを 選 択 して 指 定 するには、 STREAM 指 示 子 を 使 用 し ます。 デザ イ ンが hls::stream を 使 用<br />
してインプリ メント される 場 合 は、 メモリ チャネルが 深 さ 1 の FIFO にデフ ォル ト でなるので、 データ フ ロー コン<br />
フィギュレーションは 必 要 ありません。<br />
次 の 表 は、デザ イ ン を イ ンプ リ メ ン ト する のに 使 用 さ れる リ ソース を 最 小 限 に 抑 え る ために 考 慮 すべき その 他 の 指 示<br />
子 を リ ス ト しています。<br />
表 1‐10 : 最 適 化 ス ト ラ テジの 手 順 4<br />
ALLOCATION<br />
ARRAY_MAP<br />
ARRAY_RESHAPE<br />
LOOP_MERGE<br />
OCCURRENCE<br />
RESOURCE<br />
STREAM<br />
Config Bind<br />
Config Dataflow<br />
モード<br />
説 明<br />
使 用 さ れる、 演 算 、 コ ア、 ま たは 関 数 の 数 の 制 限 を 指 定 し ます。<br />
これによ り、ハードウェア リソースが 共 有 されるので、レイテ<br />
ンシが 増 加 さ れる 可 能 性 があ り ます。<br />
ブロック RAM リ ソ ース を 削 減 しやす く する ために 複 数 の 小 さ<br />
い 配 列 を 1 つの 大 き な 配 列 にま と めます。<br />
配 列 を 多 数 のエレ メ ン ト を 含 む も のか ら ワー ド 幅 の 広 い も の<br />
に 変 更 し ます。 多 数 のブロ ッ ク RAM を 使 用 せずにブ ロ ッ ク<br />
RAM ア ク セス を 向 上 する のに 有 益 です。<br />
連 続 するループを 結 合 し て、 全 体 的 な レ イ テンシを 削 減 し、 共<br />
有 を 増 やし て 最 適 化 を 向 上 し ます。<br />
関 数 ま たはループをパ イ プ ラ イ ン 化 する と き、 囲 んでい る ( 外<br />
側 にあ る) 関 数 /ループのコー ド よ り も 実 行 速 度 が 遅 い コー ド を<br />
含 むロ ケーシ ョ ン を 指 定 する のに 使 用 し ます。<br />
特 定 の ラ イ ブ ラ リ リソース (コア) が RTL で 変 数 ( 配 列 、 演 算<br />
式 、 関 数 の 引 数 ) をインプリ メントするために 使 用 されるよう<br />
にします。<br />
DATAFLOW 最 適 化 中 に 特 定 の 配 列 を FIFO または RAM として<br />
イ ンプ リ メ ン ト する よ う に 指 定 し ます。<br />
合 成 のバ イ ンデ ィ ング 段 階 で 使 用 する エフ ォー ト レベルを 指<br />
定 します。 使 用 さ れる 演 算 数 をグ ローバルに 最 小 限 に 抑 え る た<br />
めに 使 用 し ます。<br />
デフォル ト のメモ リ チャネルと DATAFLOW 最 適 化 での FIFO<br />
の 深 さ を 指 定 し ます。<br />
演 算 数 を 制 限 し、 どの コ ア を 演 算 の イ ンプ リ メ ン ト に 使 用 する か 選 択 する には、 ALLOCATION と RESOUCE 指 示 子<br />
を 使 用 し ます。 た と えば、 関 数 ま たはループで 乗 算 器 を 1 つだけ 使 用 する よ う に 制 限 し、 パイ プ ラ イ ン 乗 算 器 を 使 用<br />
し て イ ンプ リ メ ン ト さ れる よ う に 指 定 で き ます。 バ イ ンデ ィ ン グ コンフィギュレーション (Config Bind) を 使 用 する<br />
と 、 特 定 の 演 算 の 使 用 を グ ローバルに 制 限 で き ます。<br />
高 位 合 成 japan.xilinx.com 79<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
重 要 : 最 適 化 指 示 子 は、 指 定 し た ス コープ 内 にのみ 適 用 さ れます。<br />
開 始 間 隔 を 向 上 する ために ARRAY_PARITION 指 示 子 を 使 用 する 場 合 は、 その 代 わ り に ARRAY_RESHAPE 指 示 子 を<br />
使 用 する こ と も 考 慮 し てみて く だ さ い。 ARRAY_RESHAPE 最 適 化 は 配 列 分 割 と 同 様 の タ ス ク を 実 行 し ますが、 分 割<br />
によ り 作 成 されたエレ メン ト をよ り 大 きい 幅 のデータ ポー ト の 単 一 のブ ロ ッ ク RAM に 再 結 合 し ます。<br />
C コー ド に 類 似 の イ ンデ ッ ク ス を 持 つ 一 連 のループが 含 まれる 場 合 、 LOOP_MERGE 指 示 子 でループを 結 合 する と 、<br />
実 行 で き る よ う にな る 最 適 化 も あ り ます。<br />
パイ プ ラ イ ン 領 域 の コー ド のセ ク シ ョ ンが、 残 り の 領 域 よ り も 小 さ い 開 始 間 隔 で 動 作 する ためにのみ 必 要 な 場 合 は、<br />
OCCURENCE 指 示 子 を 使 用 し て、 こ の ロ ジ ッ ク が よ り 低 いレー ト で 実 行 さ れる よ う に 最 適 化 で き ます。<br />
レイテンシの 削 減<br />
Vivado HLS で 開 始 間 隔 が 最 小 限 に 抑 え られた ら、 レ イ テンシを 最 小 限 に 抑 え る 方 法 が 自 動 的 に 検 索 さ れます。 次 の 表<br />
に リ ス ト さ れる 最 適 化 指 示 子 を 使 用 する と 、 特 定 のレ イ テンシを 削 減 ま たは 指 定 しやす く な り ます。<br />
こ れ ら は、 ループおよび 関 数 がパイ プ ラ イ ン さ れる 場 合 は 通 常 必 要 あ り ませんが、 こ こ ではすべての 説 明 を 網 羅 する<br />
ために 記 述 してあ り ます。<br />
表 1‐11 : 最 適 化 ス ト ラ テジの 手 順 3<br />
LATENCY<br />
LOOP_FLATTEN<br />
LOOP_MERGE<br />
モード<br />
説 明<br />
最 小 および 最 大 レ イ テンシ 制 約 を 指 定 で き ます。<br />
改 善 さ れた レ イ テンシを 使 用 し、 ネ ス ト さ れたループを 1 つの<br />
ループにコ ラ プス し ます。<br />
連 続 するループを 結 合 し て、 全 体 的 な レ イ テンシを 削 減 し、 共<br />
有 を 増 やし て 最 適 化 を 向 上 し ます。<br />
必 要 な レ イ テンシを 指 定 する には、 LATENCY 指 示 子 を 使 用 し ます。 ループ 最 適 化 指 示 子 は、 ループ 階 層 を 平 坦 に し、<br />
直 列 のループを 結 合 する ために 使 用 で き ます。 こ の LATENCY を 使 用 する と 利 点 があ る のは、 通 常 ループに 入 って 出<br />
るまで 1 クロック サイ クルかかる 場 合 です。 ループ 間 の 遷 移 数 が 少 ないほど、 デザイ ンが 終 了 する までにかかる ク<br />
ロック 数 も 少 なくなります。<br />
パイプライン 適 用 ス ト ラテジ<br />
「パフ ォーマン ス 目 的 のための 一 般 的 な 最 適 化 ス ト ラ テジ」 は、 最 適 化 さ れていないデザ イ ンか ら 開 始 し て、 最 適 化<br />
を 追 加 し てパフ ォーマン スの 優 れたデザイ ンを 作 成 する 方 法 について 説 明 し ています。<br />
パフ ォーマン スの 優 れたデザ イ ン を 取 得 する のに 重 要 な 最 適 化 指 示 子 は、 PIPELINE および DATAFLOW 指 示 子 です。<br />
このセクショ ンでは、 C コー ド の さ ま ざ ま なアーキテ ク チ ャ に こ れら の 指 示 子 を 適 用 する 方 法 について 説 明 し ます。<br />
次 の コー ド は、 行 列 乗 算 を 実 行 する C コードの 例 を 示 しています。<br />
void matrixmul(<br />
mat_a_t a[MAT_A_ROWS][MAT_A_COLS],<br />
mat_b_t b[MAT_B_ROWS][MAT_B_COLS],<br />
result_t res[MAT_A_ROWS][MAT_B_COLS]) {<br />
// Iterate over the rows of the A matrix<br />
Row: for(int i = 0; i < MAT_A_ROWS; i++) {<br />
// Iterate over the columns of the B matrix<br />
Col: for(int j = 0; j < MAT_B_COLS; j++) {<br />
res[i][j] = 0;<br />
// Do the inner product of a row of A and col of B<br />
高 位 合 成 japan.xilinx.com 80<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
Product: for(int k = 0; k < MAT_B_ROWS; k++) {<br />
res[i][j] += a[i][k] * b[k][j];<br />
}<br />
}<br />
}<br />
}<br />
このコードのアーキテクチャは、 次 のよ うにまとめるこ とができます。<br />
• 入 力 および 出 力 データ は 配 列 に 含 まれます。<br />
• 関 数 ではデータ のブ ロ ッ ク が 処 理 さ れます。<br />
• 配 列 の 値 はループで 処 理 さ れます。<br />
• 多 次 元 配 列 の 場 合 、 計 算 を 実 行 する ため、 通 常 ネ ス ト さ れたループがあ り ます。<br />
上 記 の 例 の 属 性 は、 次 に 示 すよ う に さ らに 簡 潔 ( 関 数 、 ループ、 データ 入 力 および 出 力 のみ) に 要 約 でき ます。<br />
void matrixmul(<br />
data_t a[MAT_A_ROWS][MAT_A_COLS],<br />
data_t b[MAT_B_ROWS][MAT_B_COLS],<br />
data_t res[MAT_A_ROWS][MAT_B_COLS]) {<br />
Loop1: for(int i = 0; i < MAT_A_ROWS; i++) {<br />
Loop2: for(int j = 0; j < MAT_B_COLS; j++) {<br />
Loop3: for(int k = 0; k < MAT_B_ROWS; k++) {<br />
res[i][j] += a[i][k] * b[k][j];<br />
}<br />
}<br />
}<br />
}<br />
最 適 化 ス ト ラ テジの 説 明 目 的 には、 こ の コー ド 記 述 で 十 分 です。<br />
次 のセ ク シ ョ ンには、C コード アーキテ ク チャ を 多 く 示 し、 優 れたパフ ォーマン スの 演 算 のために コー ド を 最 適 化 す<br />
る 最 適 なス ト ラテジについて 説 明 します。<br />
最 上 位 ループ を 含 む 関 数 のプ ロセ ッ シング ブロック<br />
次 のコード ではデータ ブロックが 処 理 されます。 コー ド には、 複 数 のネ ス ト さ れたループを 含 む 最 上 位 ループが 含 ま<br />
れています。<br />
void foo(<br />
data_t in1[HEIGHT][WIDTH],<br />
data_t in2[HEIGHT][WIDTH],<br />
data_t out[HEIGHT][WIDTH]) {<br />
Loop1: for(int i = 0; i < HEIGHT; i++) {<br />
Loop2: for(int j = 0; j < WIDTH; j++) {<br />
out[i][j] = in1[i][j] * in2[i][j];<br />
Loop3: for(int k = 0; k < NUM_CALC; k++) {<br />
}<br />
}<br />
}<br />
データ はシーケ ンシ ャルに 処 理 さ れる ので、 イ ン ターフ ェ イ ス 配 列 は INTERFACE 指 示 子 を 使 用 し て ス ト リ ー ミ ン グ<br />
タイプ インターフェイスでインプリ メントできます。<br />
高 位 合 成 japan.xilinx.com 81<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
最 上 位 関 数 に PIPELINE 指 示 子 を 適 用 する と 、 階 層 内 のループすべてが 自 動 的 に 展 開 さ れます。 こ の 単 純 な ソ リ ュー<br />
シ ョ ンは 実 行 する のは 簡 単 ですが、 Loop2 のロジッ クが HEIGHT*WIDTH 回 数 複 製 さ れる こ と にな り ます。<br />
こ の 後 、 すべての 演 算 をパイ プ ラ イ ン さ れた 方 法 でアセンブルし 直 すためにス ケジ ュー リ ン グが 必 要 です。 こ の 小 さ<br />
い 例 で さ え、 次 のよ う にな り ます。<br />
• in1 入 力 で HEIGHT*WIDTH 回 の 読 み 込 み<br />
• in2 入 力 で HEIGHT*WIDTH 回 の 読 み 込 み<br />
• out 入 力 で HEIGHT*WIDTH 回 の 書 き 出 し<br />
• HEIGHT*WIDTH 回 の 乗 算<br />
これによ り ランタイムが 増 加 します。 スケジューリングの 目 標 の 1 つはレイテンシを 最 小 限 にするこ とにもあるの<br />
で、 で き る だけ 早 く 操 作 を 実 行 する 方 法 が 検 索 さ れます。 こ の 結 果 、 複 数 の 乗 算 器 を 含 むデザ イ ンが 作 成 さ れる 可 能<br />
性 が 高 く な り ます。<br />
データ ブ ロ ッ ク を 処 理 する C コー ド を 使 用 する 場 合 は、 ループのパイ プ ラ イ ンに 注 意 し て く だ さ い。 関 数 をパイ プ<br />
ラ イ ン し て 単 にすべてのループを 展 開 する こ と はで き ますが、 通 常 は 必 要 よ り も 多 く の リ ソース を 含 むデザ イ ンが 作<br />
成 されます。<br />
こ の 場 合 の 最 適 な ス ト ラ テジは、 ループの 1 つをパイ プ ラ イ ンする こ と にあ り ます。 こ れに よ り 、 演 算 が よ く 定 義 さ<br />
れた 構 造 にま と め ら れる ので、 優 れたパフ ォーマン ス と 最 小 限 の リ ソ ースのバ ラ ン スが 取 ら れる 可 能 性 が 上 が り 、<br />
Vivado HLS ですべてをすばや く ス ケジ ュールで き る よ う にな り ます。<br />
ヒント : パイ プ ラ イ ンする のに 一 番 最 適 なループは、 データ サンプルで 実 行 されるループ 階 層 内 の 最 下 位 ループで<br />
す。<br />
こ の コー ド の 場 合 、 処 理 する のに HEIGHT*WIDTH データ サンプルがあ り ます。Loop2 が II = 1 でパイプラ イ ン され<br />
ると、デザインは HEIGHT*WIDTH クロック サイクルで 終 了 します。 デザイ ンは、 ク ロ ッ ク ご と に 1 サンプル 処 理 し<br />
ます。<br />
パイプラインするのに Loop1 を 選 択 し た 場 合 、デザ イ ンは HEIGHT クロック サイクルで 終 了 しますが、クロッ ク サ<br />
イクルごとに WIDTH サンプルを 読 み 込 みおよび 書 き 出 し し、 WIDTH 乗 算 器 を 使 用 する 必 要 があ り ます。 各 ク ロ ッ<br />
クごとに 1 サンプルよ り 早 く 終 了 し ますが、 さ ら に 多 く の リ ソースおよびデータ ポー ト が 必 要 と な り ます。<br />
ループのパイプラ イ ンで 発 生 するその 他 の 問 題 に、 ループの 遷 移 サイ クルがあ り ます。 通 常 はループに 入 るのに 1 ク<br />
ロック サイクル、 出 るのに 1 クロック サイクルかかり ます。 ループのサイクルへ 入 るサイクルまたは 出 るサイクル<br />
は、 ループの 前 または 後 の ク ロ ッ ク サ イ ク ルの 演 算 と 統 合 で き ます。<br />
ネス ト されるループがパイプラインされると、そのネス ト されたループに LOOP_FLATTEN 最 適 化 が 自 動 的 に 適 用 さ<br />
れます。 これによ り、 Loop1 および Loop2 間 の 余 分 なサ イ ク ルが 自 動 的 に 削 除 さ れます。<br />
新 し く フラ ッ トにされた Loop_1_2 と 関 数 間 の 移 行 には、 まだ 問 題 があ り ます。 上 記 の 例 の 場 合 、 次 の よ う にな り<br />
ます。<br />
• 関 数 の 実 行 が 開 始 さ れます。<br />
• Loop1_2 前 には 論 理 演 算 はないので、 ループは 即 座 に 実 行 さ れます。<br />
• ループが 終 了 し た ら、 ループを 出 る までに 1 クロック サイクルかかり ます。<br />
• こ の 後 、 関 数 の 実 行 が 再 開 さ れます。<br />
ループが 終 了 し て 関 数 の 始 ま り に 戻 って も、 ループ 本 体 の 演 算 は 何 も 実 行 さ れません。 データ の 読 み 込 み、 処 理 、 書<br />
き 出 し は 一 時 停 止 さ れます。<br />
ループが 関 数 の 最 上 位 ループの 場 合 は、ループをパイ プ ラ イ ンする 際 に rewind オプシ ョ ン を 使 用 で き ます。rewind<br />
オプシ ョ ン を 使 用 する と 、 Vivado HLS にこ のループが 終 了 し た と きに 常 にループの 始 めに 戻 る よ う に 伝 え られます。<br />
rewind オプシ ョ ンは、 次 の 場 合 にのみ 使 用 で き ます。<br />
• ループは 関 数 の 最 上 位 ループで、 ループの 開 始 前 ま たは 終 了 後 に 論 理 演 算 はあ り ません。<br />
高 位 合 成 japan.xilinx.com 82<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
° 複 数 回 実 行 さ れる か、 ループが 無 限 に 実 行 さ れる 場 合 (コード 記 述 はできますが、 シ ミ ュレーシ ョ ンはでき<br />
ません)、 関 数 には 同 じ 演 算 が 含 まれる 必 要 があ り ます。<br />
• ループは、 DATAFLOW 最 適 化 を 使 用 する 領 域 でパイ プ ラ イ ン さ れます。<br />
こ の 場 合 、 ス ト リ ー ミ ング イ ン ターフ ェ イ ス を 使 用 し、 同 じ レベルで 動 作 するループ Loop2 をパイプラ インし、 パ<br />
イプラインの rewind オプシ ョ ンを 使 用 し ます。<br />
void foo(<br />
data_t in1[HEIGHT][WIDTH],<br />
data_t in2[HEIGHT][WIDTH],<br />
data_t out[HEIGHT][WIDTH]) {<br />
#pragma HLS INTERFACE axis port=in1<br />
#pragma HLS INTERFACE axis port=in2<br />
#pragma HLS INTERFACE axis port=out<br />
Loop1: for(int i = 0; i < HEIGHT; i++) {<br />
Loop2: for(int j = 0; j < WIDTH; j++) {<br />
#pragma HLS PIPELINE rewind<br />
out[i][j] = in1[i][j] * in2[i][j];<br />
}<br />
}<br />
}<br />
こ の 結 果 、 ク ロ ッ ク ご と に 1 サンプル 処 理 さ れ、 停 止 な く 次 のサンプル セッ トが 即 座 に 実 行 されるデザインになりま<br />
す。<br />
最 上 位 ループ を 含 む 関 数 のプ ロセ ッ シング サンプル<br />
次 のコード ではデータ サンプルが 処 理 されます。 コー ド には 最 上 位 ループが 含 まれています。<br />
void foo (data_t x) {<br />
temp = x;<br />
Loop1: for (int i=N-1;i>=0;i--) {<br />
acc+= ..some calculation..;<br />
}<br />
}<br />
データ は 本 質 的 にシーケ ンシ ャルで、 関 数 は x の 値 を 1 つずつ 読 み 込 むので、 イ ン ターフ ェ イ ス 配 列 は INTERFACE<br />
指 示 子 を 使 用 し て ス ト リ ー ミ ング タイプのインターフェイスでインプリ メントできます。<br />
間 隔 1 ( 関 数 が 呼 び 出 さ れる たびに 1 つのデータ 値 が 読 み 込 まれる) を 達 成 するには、 II = 1 でパイプラ イ ンする 必 要<br />
があ り ます。 こ れに よ り 、 ループが 展 開 さ れ、 追 加 ロ ジ ッ ク が 作 成 さ れて し まいますが、 こ れを 回 避 する 方 法 はあ り<br />
ません。 Loop1 がパイ プ ラ イ ン さ れる と 、 終 了 さ れる までに 最 小 の N クロック サイクル 分 かかり ます。 この 後 にの<br />
み、 関 数 は 次 の x 入 力 値 を 読 み 込 む こ と がで き ます。<br />
関 数 が 実 行 ご と に 1 サンプルを 処 理 する よ う なサンプル レベルで 動 作 する C コードを 処 理 する 場 合 は、 常 に 関 数 を<br />
パイプラインするス ト ラテジを 使 用 します。 サンプル ベースのデザ イ ンのループは 通 常 データ の 配 列 で 動 作 する の<br />
で、 II = 1 が 達 成 でき る よ う に、 これらの 配 列 が 分 割 される こ と がよ く あ り ます。<br />
こ の 場 合 、 関 数 foo をパイプラインします。これにより、クロックごとに 1 サンプル 処 理 するデザ イ ンにな り ます。<br />
ネス ト された 演 算 を 含 む 関 数<br />
次 のコー ド には、 複 数 のネス ト さ れたループを 含 む 最 上 位 ループが 含 まれますが、 複 数 の 演 算 を 実 行 するのは 内 部<br />
ループの Loop3 です。<br />
void foo(<br />
高 位 合 成 japan.xilinx.com 83<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
data_t in1[HEIGHT][WIDTH],<br />
data_t in2[HEIGHT][WIDTH],<br />
data_t out[HEIGHT][WIDTH]) {<br />
data_t int1[HEIGHT][WIDTH]) {<br />
data_t int2[HEIGHT][WIDTH]) {<br />
Loop1: for(int i = 0; i < HEIGHT; i++) {<br />
Loop2: for(int j = 0; j < WIDTH; j++) {<br />
int1[i][j] += in1[i][j] * in2[i][j];<br />
Loop3: for(int k = 0; k < NUM_CALC; k++) {<br />
int2[k] = ..some calculations ...<br />
}<br />
out[i][j] += int2[i][j];<br />
}<br />
}<br />
}<br />
これは 前 のブロッ ク コード 例 と 類 似 していますが、 内 部 ループの Loop3 がパイプラ イ ン される と、 最 小 の<br />
HEIGHT*WIDTH*NUM_CALC クロック サ イ ク ル 間 実 行 さ れる 点 が 異 な り ます。 処 理 する のは、HEIGHT*WIDTH デー<br />
タ サンプルのみです。 こ れに よ り 、 各 データ サンプルを 処 理 する のに 複 数 の ク ロ ッ ク サイクルが 必 要 なデザインに<br />
なります。<br />
こ れはよ く あ る 機 能 で、 最 下 位 ループでデータ の 計 算 が 実 行 さ れる こ と があ り 、 その 最 下 位 ループのパイ プ ラ イ ンに<br />
よ ってサイ クル 数 が 多 く な る こ と があ り ます。 前 述 の 例 では、データ サンプルを 処 理 する 最 下 位 ループをパイ プ ラ イ<br />
ンしました。<br />
こ こ では、 同 じ レベルで 動 作 するループ Loop2 をパイプラインし、パイプラインの rewind オプシ ョ ン を 使 用 し ます。<br />
こ の 結 果 、 ク ロ ッ ク ご と に 1 サンプルが 処 理 され、 停 止 な く 次 のサンプル セ ッ ト が 即 座 に 実 行 さ れるデザ イ ンにな り<br />
ます。<br />
シリアル ループ と 下 位 関 数 を 含 む 関 数<br />
次 の 関 数 では、 複 数 の 関 数 と ループを 順 番 に 実 行 し ます。<br />
void foo(<br />
data_t in1[HEIGHT][WIDTH],<br />
data_t in2[HEIGHT][WIDTH],<br />
data_t out[HEIGHT*WIDTH]) {<br />
data_t int1[HEIGHT][WIDTH];<br />
data_t int2[HEIGHT*WIDTH];<br />
Loop1: for(int i = 0; i < HEIGHT; i++) {<br />
Loop2: for(int j = 0; j < WIDTH; j++) {<br />
int1[i][j] = in1[i][k] * in2[k][j];<br />
}<br />
}<br />
}<br />
foo1(int1, int2);<br />
Loop3: for(int k = 0; k < HEIGHT*WIDTH; k++) {<br />
out[k] = int2[k];<br />
}<br />
}<br />
}<br />
高 位 合 成 japan.xilinx.com 84<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
こ の タ イ プの コー ド 構 造 のス ト ラ テジでは、 各 ループ と 下 位 関 数 をパイ プ ラ イ ン し てか ら、 関 数 foo で DATAFLOW<br />
最 適 化 を 使 用 し て、 ループおよび 下 位 関 数 が 並 列 で 実 行 さ れる よ う に し ます。<br />
まずは、 下 位 関 数 を 最 適 化 する こ と か ら 始 めます。 下 位 関 数 が 合 成 前 にパイ プ ラ イ ン さ れない と 、 こ の 階 層 レベルで<br />
達 成 さ れる 最 適 化 が 下 位 関 数 のパフ ォーマン スに よ り 制 限 さ れて し まいます。 下 位 関 数 は 関 数 を 最 適 化 する 最 適 化 の<br />
いずれかを 使 用 し て 最 適 化 し ておいて く だ さ い。<br />
次 に Loop2 と Loop3 をパイ プ ラ イ ン し ます。 ループはデータ フ ロー 領 域 に イ ンプ リ メ ン ト さ れるので、 パイ プ ラ イ<br />
ンの rewind オプシ ョ ンはループに 適 用 で き ます。<br />
こ の 場 合 の ソ リ ューシ ョ ンは、 すべての タ ス ク ( 下 位 関 数 およびループ) を パ イ プ ラ イ ンす る こ と です。 こ の 後 、<br />
DATAFLOW 最 適 化 を 関 数 foo に 適 用 し、 このデータフローのコンフ ィギュレーシ ョ ンを 使 用 して、 タスク 間 のメ<br />
モリ チ ャ ネルのサ イ ズを 最 小 限 に 抑 え ます。<br />
タスクのファンアウトを 含 む 関 数<br />
次 の 関 数 では、 多 く の 関 数 およびループが 順 番 に 実 行 さ れますが、 こ の 場 合 、 データ フローはポイント トゥ ポイン<br />
トの 接 続 ではありません。<br />
void foo(<br />
data_t in1[HEIGHT][WIDTH],<br />
data_t in2[HEIGHT][WIDTH],<br />
data_t out[HEIGHT*WIDTH]) {<br />
data_t int1[HEIGHT][WIDTH];<br />
data_t int2[HEIGHT*WIDTH];<br />
Loop1: for(int i = 0; i < HEIGHT; i++) {<br />
Loop2: for(int j = 0; j < WIDTH; j++) {<br />
int1[i][j] = in1[i][k] * in2[k][j];<br />
}<br />
}<br />
foo1(int1, int2);<br />
foo2(int1, int3);<br />
Loop3: for(int k = 0; k < HEIGHT*WIDTH; k++) {<br />
out[k] = int2[k] + int3[k];<br />
}<br />
}<br />
こ れは、 前 の 例 と 類 似 し てお り 、 個 別 タ ス ク のパイ プ ラ イ ン ス ト ラ テジ も 同 様 の も のが 使 用 で き ますが、 こ の 場 合 、<br />
内 部 配 列 の int1 が 下 位 関 数 の foo1 と foo2 両 方 への 入 力 と し て 使 用 さ れています。 DATAFLOW 最 適 化 は、 送 信<br />
元 と 受 信 先 がそれぞれ 1 つの 場 合 にしか 使 用 でき ません。<br />
このコード 構 造 タイプのス ト ラテジは、 int1 のファンアウ ト を 2 つの 別 々のパスに 分 割 する こ と です。 こ の 場 合 、<br />
int1 のも う 1 つのコ ピー int11 が Loop2 に 作 成 されます。<br />
void foo(<br />
data_t in1[HEIGHT][WIDTH],<br />
data_t in2[HEIGHT][WIDTH],<br />
data_t out[HEIGHT*WIDTH]) {<br />
data_t int1[HEIGHT][WIDTH];<br />
data_t int11[HEIGHT][WIDTH];<br />
data_t int2[HEIGHT*WIDTH];<br />
Loop1: for(int i = 0; i < HEIGHT; i++) {<br />
Loop2: for(int j = 0; j < WIDTH; j++) {<br />
int1[i][j] = in1[i][k] * in2[k][j];<br />
高 位 合 成 japan.xilinx.com 85<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
int11[i][j] = in1[i][k] * in2[k][j];<br />
}<br />
}<br />
}<br />
foo1(int1, int2);<br />
foo2(int11, int3);<br />
Loop3: for(int k = 0; k < HEIGHT*WIDTH; k++) {<br />
out[k] = int2[k] + int3[k];<br />
}<br />
}<br />
ま たは、 下 位 関 数 を 新 規 作 成 し、 その 関 数 を 使 用 し てデータ パス を 複 製 し ます。 新 し い 下 位 関 数 はその 他 の 関 数 と 同<br />
様 に 最 適 化 されます。 単 にパイプラ イ ン されたループのみを 含 む 場 合 、 INLINE 指 示 子 を 使 用 する と 、 ループを こ の<br />
階 層 レベルに 上 げて、 データ フ ロー 領 域 に 含 まれる よ う にする こ と がで き ます。<br />
こ の 場 合 は、 まずタ ス ク 間 に 1 つの 送 信 元 と 1 つの 受 信 先 が 使 用 できるよ うにコードを 変 更 し、 すべてのタスク ( 下<br />
位 関 数 およびループ) をパイプラ インします。 最 後 に、DATAFLOW 最 適 化 を 関 数 foo に 適 用 し、 このデータ フ ロー<br />
のコンフィギュレーショ ンを 使 用 して、 タスク 間 のメモリ チ ャ ネルのサ イ ズを 最 小 限 に 抑 え ます。<br />
複 雑 なループ 階 層 を 含 む 関 数<br />
次 の 関 数 には、 ループ と 関 数 が 順 番 に 含 まれるループが 含 まれています。<br />
void foo(<br />
data_t in1[HEIGHT][WIDTH],<br />
data_t in2[HEIGHT][WIDTH],<br />
data_t out[HEIGHT*WIDTH]) {<br />
data_t int1[WIDTH];<br />
data_t int2[WIDTH];<br />
Loop1: for(int i = 0; i < HEIGHT; i++) {<br />
Loop2: for(int j = 0; j < WIDTH; j++) {<br />
int1[j] = in1[i][j] * in2[i][j];<br />
}<br />
foo1(int1, int2);<br />
Loop3: for(int k = 0; k < WIDTH; k++) {<br />
out[i][k] = int2[k];<br />
}<br />
}<br />
}<br />
前 の 例 か ら、 タ ス ク を 個 別 にパイ プ ラ イ ン し て、 最 適 化 を 適 用 し て、 ループ と 下 位 関 数 が 並 列 で 実 行 さ れる よ う にす<br />
る 必 要 があ る のは 明 白 です。<br />
残 念 なが ら、 DATAFLOW 最 適 化 はループ 内 には 使 用 でき ません。 こ こには、 3 つの 代 替 案 を 示 し ます。 ソ リューショ<br />
ンはいくつのロジッ クが 作 成 されるかによって 異 な り ます。<br />
• Loop1 と 下 位 関 数 foo1 をパイ プ ラ イ ン し ます。 こ れに よ り 、 階 層 内 のループすべて (Loop2、 Loop3、 および<br />
下 位 関 数 foo1 内 のすべてのループ) が 展 開 されます。<br />
• Loop1 を 展 開 して、 残 り のループと 関 数 をパイプラ インします。 これによ り、 Loop1 (Loop2、 foo1 および<br />
Loop3 の 複 数 イ ン ス タ ン ス) の ロ ジ ッ ク の コ ピーが 複 数 作 成 さ れます。<br />
• Loop2、 foo および Loop3 を 新 し い 下 位 関 数 に 取 り 込 みます。 新 し い 下 位 関 数 の 中 で、 各 タ ス ク を 個 別 にパイ<br />
プラインし、 DATAFLOW を 使 用 し て 並 列 処 理 が 最 大 限 に 実 行 さ れる よ う に し ます。 こ れに よ り 、 最 初 の 2 つの<br />
オプシ ョ ンの よ う な 追 加 エ リ アな し に、 全 体 的 なパフ ォーマン スが 改 善 で き ます。<br />
高 位 合 成 japan.xilinx.com 86<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
このソ リ ューショ ンは、ループ イ ンデ ッ ク スのサ イ ズ と 、ループの 展 開 に よ って 作 成 さ れる ロ ジ ッ ク 数 に よ って 異 な<br />
ります。<br />
ハー ド ウ ェ ア 効 率 の 良 い C コー ド の 記 述<br />
C コードが CPU 用 にコ ンパイルされる と 、 C コードが 変 換 され、 コンパイラーで CPU マシン 命 令 のセ ッ ト に 最 適 化<br />
さ れます。 多 く の 場 合 、 こ の 段 階 で 開 発 者 の 仕 事 は 終 わ り です。 ただ し、 次 のい く つか、 ま たはすべてを 実 行 する た<br />
めにパフ ォーマン ス を 改 善 する 必 要 があ る こ と も あ り ます。<br />
• コ ンパイ ラーに よ って 実 行 可 能 な 最 適 化 があ る かど う かを 理 解<br />
• プロセッサ アーキテクチャをよ り 深 く 理 解 し、 アーキテクチャ 特 有 のビヘイ ビアー (た と えば、 組 み 合 わせ 分 岐<br />
の 削 減 に よ り 命 令 パイ プ ラ イ ン を 改 善 など) を 生 かすよ う にコード を 修 正<br />
• 主 な 操 作 を 並 列 で 実 行 する ための CPU 特 有 の 組 み 込 み 機 能 を 使 用 し て C コードを 変 更 ( 例 :ARM NEON 組 み 込<br />
みなど)<br />
同 じ 手 法 は、 DSP または GPU 用 に 記 述 し た コード や FPGA (FPGA デバイ スは 単 に 別 のターゲ ッ ト ) を 使 用 した 場 合<br />
に 適 用 でき ます。<br />
Vivado HLS で 合 成 された C コードが FPGA で 実 行 さ れ、 同 じ 機 能 が C シミュレーションとして 提 供 されます。 この<br />
段 階 で 開 発 者 の 仕 事 は 終 わ り な こ と も あ り ますが、<br />
通 常 は、C コードをインプリ メ ンする FPGA を 選 択 します。 FPGA に 大 量 の 並 列 アーキテ ク チ ャ を 含 め る と 、プ ロ セ ッ<br />
サの 元 々のシーケ ンシ ャル 操 作 よ り も かな り 速 く 操 作 を 実 行 で き る ので、 こ の 利 点 を 生 かす こ と をお 勧 め し ます。<br />
パフォーマンスに 優 れた FPGA デザ イ ン を 作 成 する には、 次 を 理 解 し てお く 必 要 があ り ます。<br />
• ハー ド ウ ェ アに 備 わってい る 同 時 処 理 機 能<br />
• Vivado HLS のデフ ォル ト の 最 適 化<br />
• Vivado HLS のオプシ ョ ンの 最 適 化<br />
• C コードのデザイン パフォーマンスへの 影 響<br />
最 初 の ト ピ ッ ク については、 「 同 時 処 理 ハー ド ウ ェ アの 理 解 」 を 参 照 して く ださい。 2 つ 目 と 3 つ 目 については、 「 合<br />
成 ス ト ラテジ」 を 参 照 して く ださい。こ こでは、C コー ド が 達 成 可 能 な 結 果 にどの よ う に 影 響 する かを 理 解 し、C コー<br />
ド を どの よ う に 変 更 すれば、 最 初 の 3 つの ト ピ ッ ク の 利 点 を 最 大 限 に 引 き 出 されるのかについて 説 明 し ます。<br />
典 型 的 なたたみ 込 み 関 数 の C コード<br />
こ こ では 画 像 に 適 用 さ れる 標 準 的 なたたみ 込 み 関 数 を 使 用 し て、 FPGA では 可 能 であったパフ ォーマンスが C コード<br />
に よ り どの よ う に 劣 化 する かをお 見 せし ます。 こ の 例 では、 データ でまず 水 平 たたみ 込 みが 実 行 さ れてか ら、 垂 直 た<br />
たみ 込 みが 実 行 さ れます。 画 像 のエ ッ ジのデータはたたみ 込 み 範 囲 外 にあ る ので、 最 後 にボーダー 周 囲 のデータ が 処<br />
理 されます。<br />
アルゴリズム 構 造 は、 次 のよ うにまとめることができます。<br />
template<br />
static void convolution_orig(<br />
int width,<br />
int height,<br />
const T *src,<br />
T *dst,<br />
const T *hcoeff,<br />
const T *vcoeff) {<br />
T local[MAX_IMG_ROWS*MAX_IMG_COLS];<br />
// Horizontal convolution<br />
高 位 合 成 japan.xilinx.com 87<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
HconvH:for(int col = 0; col < height; col++){<br />
HconvWfor(int row = border_width; row < width - border_width; row++){<br />
Hconv:for(int i = - border_width; i
第 1 章 : 高 位 合 成<br />
たたみ 込 みは、 データ の K サンプルと K たたみ 込 み 係 数 を 使 用 し て 実 行 さ れます。 上 記 の 図 の 場 合 、 K は 5 になっ<br />
ていますが、 この K の 値 はコー ド で 定 義 さ れます。 たたみ 込 みを 実 行 する には、 最 小 の K データ サンプルが 必 要 で<br />
す。 たたみ 込 みウ ィ ン ド ウは、 ウ ィ ン ド ウ に 画 像 外 にあ る ピ ク セルが 含 まれる 必 要 があ る ため、 最 初 のピ ク セルでは<br />
開 始 で き ません。<br />
対 称 たたみ 込 みを 実 行 する と 、 src 入 力 か ら の 最 初 の K データ サンプルが 水 平 係 数 と 最 初 の 計 算 出 力 でたたみ 込 み<br />
できます。2 つ 目 の 出 力 を 計 算 する には、 次 の K データ サンプルのセ ッ ト が 使 用 さ れます。 こ の 計 算 は、 最 後 の 出 力<br />
が 書 き 出 される まで 行 ご と に 進 みます。<br />
最 終 結 果 は、 青 色 で 示 すよ う に よ り 小 さ な 画 像 にな り ます。 垂 直 ボーダー 沿 いのピ ク セルは、 後 で 処 理 さ れます。<br />
こ の 操 作 を 実 行 する C コードは 次 のとおりです。<br />
const int conv_size = K;<br />
const int border_width = int(conv_size / 2);<br />
#ifndef __SYNTHESIS__<br />
T * const local = new T[MAX_IMG_ROWS*MAX_IMG_COLS];<br />
#else // Static storage allocation for HLS, dynamic otherwise<br />
T local[MAX_IMG_ROWS*MAX_IMG_COLS];<br />
#endif<br />
Clear_Local:for(int i = 0; i < height * width; i++){<br />
local[i]=0;<br />
}<br />
// Horizontal convolution<br />
HconvH:for(int col = 0; col < height; col++){<br />
HconvWfor(int row = border_width; row < width - border_width; row++){<br />
int pixel = col * width + row;<br />
Hconv:for(int i = - border_width; i
第 1 章 : 高 位 合 成<br />
最 後 は、 データ のスループ ッ ト がデータ アクセス パターンに よ り 制 限 さ れる 問 題 です。<br />
• 最 初 の 出 力 の 場 合 、 最 初 の K 値 が 入 力 か ら 読 み 込 まれます。<br />
• 2 つ 目 の 出 力 を 計 算 する には、 同 じ K-1 値 がデータ 入 力 ポー ト を 介 し て 読 み 戻 さ れます。<br />
• こ のデータ の 読 み 戻 し プ ロ セスは、 画 像 全 体 で 繰 り 返 さ れます。<br />
パフォーマンスの 優 れた FPGA にする には、 最 上 位 関 数 引 数 へのア ク セス を 最 小 限 に 抑 え る こ と が 重 要 課 題 の 1 つと<br />
な り ます。 最 上 位 関 数 の 引 数 は、 RTL ブロックのデータ ポートになります。 上 記 のコードの 場 合 、データは 何 度 も<br />
読 み 戻 さ れる 必 要 があ るので、 DMA 操 作 を 使 用 し てプ ロ セ ッ サか ら 直 接 ス ト リ ー ミ ン グで き ません。 入 力 を 読 み 戻<br />
すと、 FPGA がサンプルを 処 理 する レー ト も 制 限 さ れて し まいます。<br />
垂 直 たたみ 込 み<br />
次 の 段 階 では、 図 1-41 に 示 すよ う な 垂 直 たたみ 込 みを 実 行 し ます。<br />
X-Ref Target - Figure 1-41<br />
図 1‐41 : 垂 直 たたみ 込 み<br />
高 位 合 成 japan.xilinx.com 90<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
垂 直 たたみ 込 みのプ ロ セスは、 水 平 たたみ 込 み と 似 ています。 たたみ 込 み 係 数 ( この 場 合 Vcoeff) を 使 用 したたたみ<br />
込 みには、 K データ サンプルのセ ッ ト が 必 要 です。 垂 直 方 向 で 最 初 の K サンプルを 使 用 して 最 初 の 出 力 が 作 成 され<br />
たら、 次 の K 値 のセ ッ ト が 使 用 されて、 2 つ 目 の 出 力 が 作 成 さ れます。 こ のプ ロ セスは、 最 後 の 出 力 が 作 成 さ れる ま<br />
で 各 列 ご と に 続 行 さ れます。<br />
垂 直 たたみ 込 みの 後 、 水 平 および 垂 直 ボーダーの 効 果 に よ り 、 画 像 は ソース 画 像 の srce よ りも 小 さくなっています。<br />
こ れ ら の 操 作 を 実 行 する コー ド は、 次 の と お り です。<br />
Clear_Dst:for(int i = 0; i < height * width; i++){<br />
dst[i]=0;<br />
}<br />
// Vertical convolution<br />
VconvH:for(int col = border_width; col < height - border_width; col++){<br />
VconvW:for(int row = 0; row < width; row++){<br />
int pixel = col * width + row;<br />
Vconv:for(int i = - border_width; i
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-42<br />
図 1‐42 : たたみ 込 みボーダー サンプル<br />
ボーダー 領 域 は、 最 も 近 い 有 効 な 値 を 使 用 し て 作 成 さ れます。 図 に 示 す 操 作 は、 次 の コー ド で 実 行 で き ます。<br />
int border_width_offset = border_width * width;<br />
int border_height_offset = (height - border_width - 1) * width;<br />
// Border pixels<br />
Top_Border:for(int col = 0; col < border_width; col++){<br />
int offset = col * width;<br />
for(int row = 0; row < border_width; row++){<br />
int pixel = offset + row;<br />
dst[pixel] = dst[border_width_offset + border_width];<br />
}<br />
for(int row = border_width; row < width - border_width; row++){<br />
int pixel = offset + row;<br />
dst[pixel] = dst[border_width_offset + row];<br />
}<br />
高 位 合 成 japan.xilinx.com 92<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
for(int row = width - border_width; row < width; row++){<br />
int pixel = offset + row;<br />
dst[pixel] = dst[border_width_offset + width - border_width - 1];<br />
}<br />
}<br />
Side_Border:for(int col = border_width; col < height - border_width; col++){<br />
int offset = col * width;<br />
for(int row = 0; row < border_width; row++){<br />
int pixel = offset + row;<br />
dst[pixel] = dst[offset + border_width];<br />
}<br />
for(int row = width - border_width; row < width; row++){<br />
int pixel = offset + row;<br />
dst[pixel] = dst[offset + width - border_width - 1];<br />
}<br />
}<br />
Bottom_Border:for(int col = height - border_width; col < height; col++){<br />
int offset = col * width;<br />
for(int row = 0; row < border_width; row++){<br />
int pixel = offset + row;<br />
dst[pixel] = dst[border_height_offset + border_width];<br />
}<br />
for(int row = border_width; row < width - border_width; row++){<br />
int pixel = offset + row;<br />
dst[pixel] = dst[border_height_offset + row];<br />
}<br />
for(int row = width - border_width; row < width; row++){<br />
int pixel = offset + row;<br />
dst[pixel] = dst[border_height_offset + width - border_width - 1];<br />
}<br />
}<br />
こ の コー ド では、 データへの 同 じ ア ク セ スが 繰 り 返 さ れるのが 問 題 です。 dst 配 列 の FPGA 外 に 格 納 されたデータは、<br />
複 数 回 読 み 戻 さ れる 入 力 データ と し て 読 み 込 み 可 能 になってい るはずです。 最 初 のループですら、<br />
dst[border_width_offset + border_width] が 複 数 回 読 み 込 まれますが、 border_width_offset および border_width の 値 は 変 更<br />
されません。<br />
コーディ ング スタイルがパフォーマンスと FPGA インプリ メンテーションの 質 に 悪 影 響 を 与 える 問 題 の 最 後 は、 ど<br />
の よ う に 異 な る 条 件 を 指 定 する かの 構 造 にあ り ます。 for-loop で 各 条 件 (top-left、 top-row など) ごとに 操 作 が 処 理 され<br />
る 場 合 は、 次 の よ う に 最 適 化 し ます。<br />
こ の 場 合 、 最 上 位 ループ (Top_Border、 Side_Border、 Bottom_Border) のパイプラ イ ンはでき ません。 これは、<br />
下 位 ループの 中 に 変 数 境 界 (width 入 力 の 値 に 基 づ く ) があ る も のがあ る か ら です。 こ の 場 合 、 下 位 ループをパ イ プ<br />
ラ イ ン し て、 パイ プ ラ イ ン さ れたループの 各 セ ッ ト を 直 列 に 実 行 する 必 要 があ り ます。<br />
ループ 境 界 が 変 数 でな く て も、DATAFLOW 最 適 化 はループ 内 には 適 用 で き ない こ と に 注 意 し て く だ さ い。 最 上 位 ルー<br />
プをパ イ プ ラ イ ン し て 下 位 ループを 展 開 する のか、 下 位 ループを 個 別 にパ イ プ ラ イ ンする のかは、 ループの 制 限 と<br />
FPGA デバイ スで 使 用 可 能 な リ ソ ース 数 に よ って 決 ま り ます。 最 上 位 ループの 制 限 が 少 ない 場 合 は、 ループを 展 開 し<br />
てハー ド ウ ェ ア を 複 製 し てパフ ォーマン ス を 満 た し ます。 最 上 位 ループの 制 限 が 多 い 場 合 は、 下 位 ループをパイ プ ラ<br />
インして、 それらをループ (Top_Border、 Side_Border、 Bottom_Border) 内 でシーケンシャルに 実 行 する と、<br />
パフォーマンスが 落 ちます。<br />
こ の 標 準 的 なたたみ 込 みアルゴ リ ズムの 説 明 では、 FPGA インプリ メンテーションのパフォーマンスおよびサイズに<br />
悪 影 響 を 及 ぼすコーデ ィ ング スタイルをいくつか 示 します。<br />
• クロック サ イ ク ルのかか る 配 列 のデフ ォル ト 値 を 設 定 する と 、 ク ロ ッ ク サイクルがかかり、 パフォーマンスが<br />
落 ちます。<br />
高 位 合 成 japan.xilinx.com 93<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
• 読 み 込 みへのア ク セスが 複 数 あ ってか ら、 データ が 読 み 戻 さ れる 場 合 、 ク ロ ッ ク サイクルがかかってしまい、パ<br />
フォーマンスも 劣 化 します。<br />
• 任 意 ま たは ラ ンダム ア ク セス 方 法 でデータ にア ク セスする 場 合 は、データ を 配 列 に ローカルに 格 納 する 必 要 があ<br />
り、 リ ソースが 費 やされてしまいます。<br />
デー タ およびデー タ 再 利 用 の 続 行 フ ロー<br />
前 のセ ク シ ョ ンで 説 明 し たたたみ 込 みの 例 (パフ ォーマン スの 優 れた リ ソース 使 用 量 が 最 小 のデザイ ン) をインプリ<br />
メントする 際 には、システム 全 体 で FPGA イ ンプ リ メ ンテーシ ョ ンがどのよ う に 使 用 されるのかについて 考 慮 する 必<br />
要 があ り ます。 理 想 的 なビヘイ ビ アーでは、 データ サンプルが FPGA 全 体 を 一 定 し て 流 れます。<br />
• シ ス テム 中 のデータ フ ローを 最 大 限 に し ます。 データ フ ローを 制 限 する よ う な コーデ ィ ン グ 手 法 やアルゴ リ ズ<br />
ム ビヘイビアーは 避 けて く ださい。<br />
• データ を 最 大 限 に 再 利 用 し ます。 ローカル キ ャ ッ シ ュ を 使 用 し て、 データ を 読 み 戻 す 要 件 がない よ う に し、 入 力<br />
されるデータが 流 れ 続 ける よ う にする 必 要 があ り ます。<br />
最 初 の 段 階 では、 FPGA への 最 適 化 I/O 操 作 が 実 行 で き る よ う に し ます。 たたみ 込 みアルゴ リ ズムは、 画 像 で 実 行 さ<br />
れます。 画 像 か ら のデータ が 送 信 さ れて 受 信 さ れる と 、 次 の 図 に 示 すよ う な 標 準 の ラ ス ター 走 査 順 序 で 転 送 さ れます。<br />
X-Ref Target - Figure 1-43<br />
図 1‐43 : ラ ス タ ー 走 査 の 順 序<br />
データ が CPU またはシステム メモリから FPGA に 転 送 さ れる 場 合 、 通 常 は こ のス ト リ ー ミ ン グ 方 法 で 転 送 さ れます。<br />
FPGA か ら 転 送 さ れたデータ をシ ス テムに 戻 す 場 合 も、 こ の 方 法 で 実 行 する 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 94<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ストリーミング データに 対 する HLS ストリームの 使 用<br />
前 述 の コー ド を 改 善 する 方 法 の 1 つに、 通 常 hls::stream と 呼 ばれる HLS ス トリーム コ ン ス ト ラ ク ト を 使 用 する 方 法<br />
があ り ます。hls::stream オブジ ェ ク ト は、 配 列 と 同 じ 方 法 でデータ サンプルを 格 納 する ために 使 用 で き ます。hls::stream<br />
のデータには、 シーケンシャルでのみア クセスでき ます。 C コードでは、hls::stream が 無 限 の 深 さの FIFO のよ うに 動<br />
作 します。<br />
hls::stream を 使 用 して 記 述 したコードを 使 用 する と、 通 常 FPGA にパフ ォーマン スに 優 れた リ ソース 使 用 量 の 少 ない<br />
デザイ ンが 作 成 されます。 これは、hls::stream によ り、FPGA での イ ンプ リ メ ンテーシ ョ ンに 理 想 的 な コーデ ィ ン グ 形<br />
式 が 使 用 さ れるか ら です。<br />
hls::stream か ら 同 じデータ を 何 度 も 読 み 込 む こ と はで き ません。 データ が hls::stream か ら 読 み 出 さ れた ら、 こ のス ト<br />
リ ームか ら は 削 除 さ れます。<br />
hls::stream からのデータが 再 び 必 要 な 場 合 は、 キ ャ ッ シ ュに 入 力 する 必 要 があ り ます。 これも FPGA に 合 成 される よ<br />
う に コー ド を 記 述 する のに 推 奨 さ れる 方 法 の 1 つです。<br />
hls::stream を 使 用 する と 、 FPGA イ ンプ リ メ ンテーシ ョ ンに 理 想 的 な 方 法 で C コー ド が 開 発 さ れる よ う にな り ます。<br />
hls::stream は 合 成 される と 、 1 エレ メン トの 深 さの FIFO チ ャ ネル と し て 自 動 的 に イ ンプ リ メ ン ト さ れます。 こ れは、<br />
パイ プ ラ イ ン さ れた タ ス ク の 接 続 には 理 想 的 なハー ド ウ ェ アです。<br />
hls::stream を 必 ず 使 用 する 必 要 はあ り ません。 同 じ イ ンプ リ メ ンテーシ ョ ンは C コー ド の 配 列 を 使 用 する と 実 行 で き<br />
ます。 ただし、 hls::stream コ ン ス ト ラ ク ト を 使 用 する と、 優 れた コー ド に しやす く な り ます。 hls::stream の 詳 細 は、<br />
「Vivado HLS のス ト リーム ライブラリ」 を 参 照 して く ださい。<br />
hls::stream を 使 用 し た 場 合 、 新 し い 最 適 化 さ れた コー ド の 概 要 は 次 の よ う にな り ます。<br />
template<br />
static void convolution_strm(<br />
int width,<br />
int height,<br />
hls::stream &src,<br />
hls::stream &dst,<br />
const T *hcoeff,<br />
const T *vcoeff)<br />
{<br />
hls::stream hconv("hconv");<br />
hls::stream vconv("vconv");<br />
// These assertions let HLS know the upper bounds of loops<br />
assert(height < MAX_IMG_ROWS);<br />
assert(width < MAX_IMG_COLS);<br />
assert(vconv_xlim < MAX_IMG_COLS - (K - 1));<br />
// Horizontal convolution<br />
HConvH:for(int col = 0; col < height; col++) {<br />
HConvW:for(int row = 0; row < width; row++) {<br />
HConv:for(int i = 0; i < K; i++) {<br />
}<br />
}<br />
}<br />
// Vertical convolution<br />
VConvH:for(int col = 0; col < height; col++) {<br />
VConvW:for(int row = 0; row < vconv_xlim; row++) {<br />
VConv:for(int i = 0; i < K; i++) {<br />
}<br />
}<br />
Border:for (int i = 0; i < height; i++) {<br />
高 位 合 成 japan.xilinx.com 95<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
for (int j = 0; j < width; j++) {<br />
}<br />
}<br />
前 述 の コー ド と 比 較 する と 、 こ の コー ド には 明 ら かな 違 いがい く つかあ り ます。<br />
• 入 力 および 出 力 データ が hls::streams と 記 述 されるよ うになりました。<br />
• HEIGHT*WDITH サイ ズの 単 一 のローカル 配 列 の 代 わ り に、 2 つの 内 部 hls::streams が 使 用 さ れ、 水 平 および 垂 直<br />
たたみ 込 みの 出 力 が 保 存 さ れています。<br />
また、 assert 文 がい く つか 使 用 さ れ、 ループ 境 界 の 最 大 値 が 指 定 さ れています。 こ れに よ り 、 Vivado HLS で 可 変 の 境<br />
界 付 きループのレ イ テンシが 自 動 的 にレポー ト さ れ、 そのループ 境 界 が 最 適 化 さ れる よ う にな る ので、 こ の 方 法 はお<br />
勧 めです。<br />
水 平 たたみ 込 み<br />
FPGA イ ンプ リ メ ンテーシ ョ ンに と って さ ら に 効 率 的 な 方 法 で 計 算 する ために、 次 の 図 に 示 すよ う に 水 平 たたみ 込 み<br />
が 計 算 されます。<br />
X-Ref Target - Figure 1-44<br />
図 1‐44 : 水 平 たたみ 込 みのス ト リ ー ミ ング<br />
高 位 合 成 japan.xilinx.com 96<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
hls::stream を 使 用 する と 、 データへの ラ ンダム ア ク セス を 実 行 する のではな く 、 最 初 のサンプルを まず 読 み 込 む 優 れ<br />
たアルゴ リ ズムになり ます。 このアルゴ リ ズムでは、 前 の K サンプルを 使 用 し てたたみ 込 み 結 果 を 計 算 する 必 要 があ<br />
るので、 サンプルが 一 時 キャッシュの hwin にコピーされます。 最 初 の 計 算 では、 hwin に 結 果 を 計 算 するのに 十 分<br />
な 値 が 含 まれていないので、 出 力 値 は 書 き 出 されません。<br />
アルゴ リ ズムは 入 力 サンプルを 読 み 込 み 続 けて、 hwin キ ャ ッ シ ュ に 格 納 し ます。 毎 回 新 し いサンプルが 読 み 込 まれ<br />
て、 不 必 要 なサンプルが hwin か ら 出 力 さ れます。 出 力 値 が 最 初 に 書 き 出 さ れる のは、 K 番 目 の 入 力 が 読 み 込 まれて<br />
か ら です。 こ の 後 、 出 力 値 を 書 き 出 す こ と がで き ます。<br />
アルゴ リ ズムでは こ の 方 法 で、 最 後 のサンプルが 読 み 込 まれる まで 行 ご と に 処 理 さ れます。 こ の 段 階 では、 最 後 の K<br />
サンプルだけが hwin に 格 納 さ れ、 そのすべてがたたみ 込 み 計 算 に 必 要 と な り ます。<br />
こ れ ら の 操 作 を 実 行 する コー ド は、 次 の よ う にな り ます。<br />
// Horizontal convolution<br />
HConvW:for(int row = 0; row < width; row++) {<br />
HconvW:for(int row = border_width; row < width - border_width; row++){<br />
T in_val = src.read();<br />
T out_val = 0;<br />
HConv:for(int i = 0; i < K; i++) {<br />
hwin[i] = i < K - 1 hwin[i + 1] : in_val;<br />
out_val += hwin[i] * hcoeff[i];<br />
}<br />
if (row >= K - 1)<br />
hconv
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-45<br />
図 1‐45 : 垂 直 たたみ 込 みのス ト リ ー ミ ング<br />
こ れまで と 同 様 、 サンプルはス ト リ ー ミ ング 方 式 で 読 み 込 まれますが、 今 度 は hls::stream の hconv から 読 み 込 まれ<br />
ます。 こ のアルゴ リ ズムでは、 最 初 のサンプルが 処 理 でき る よ う にな る 前 に 少 な く と も K-1 行 のデータ が 必 要 です。<br />
こ れよ り 前 に 実 行 さ れた 計 算 はすべて 削 除 さ れます。<br />
ライン バッファーには、K-1 行 のデータ を 格 納 で き ます。 新 し いサンプルが 読 み 込 まれる たびに、 別 のサンプルが ラ<br />
イン バッファーから 出 力 されます。 つま り、 最 新 のサンプルが 計 算 に 使 用 されると、 そのサンプルがライン バッ<br />
フ ァーに 格 納 さ れ、 古 いサンプルが 出 力 さ れます。 こ の 結 果 、 キ ャ ッ シ ュ さ れる 必 要 があ る のは K 行 ではな く 、 K-1<br />
行 のみにな り ます。 ラ イ ン バ ッ フ ァーでは 複 数 行 が ローカルで 格 納 さ れる 必 要 があ り ますが、 たたみ 込 みのカーネル<br />
サイズ K は 常 にフル ビデオ 画 像 の 1080 行 よ り も かな り 少 ない 容 量 です。<br />
最 初 の 計 算 は、 K 行 目 の 最 初 のサンプルが 読 み 込 まれる と 実 行 さ れます。 こ の 後 、 アルゴ リ ズムは 最 後 のピ ク セルが<br />
読 み 込 まれる まで 出 力 値 に 進 みます。<br />
// Vertical convolution<br />
VConvH:for(int col = 0; col < height; col++) {<br />
高 位 合 成 japan.xilinx.com 98<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
VConvW:for(int row = 0; row < vconv_xlim; row++) {<br />
#pragma HLS DEPENDENCE variable=linebuf inter false<br />
#pragma HLS PIPELINE<br />
T in_val = hconv.read();<br />
T out_val = 0;<br />
VConv:for(int i = 0; i < K; i++) {<br />
T vwin_val = i < K - 1 linebuf[i][row] : in_val;<br />
out_val += vwin_val * vcoeff[i];<br />
if (i > 0)<br />
linebuf[i - 1][row] = vwin_val;<br />
}<br />
if (col >= K - 1)<br />
vconv
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-46<br />
次 は、 ボーダー ピ ク セルの 位 置 を 決 定 する コー ド です。<br />
図 1‐46 : ボーダー サンプルのス ト リーミ ング<br />
Border:for (int i = 0; i < height; i++) {<br />
for (int j = 0; j < width; j++) {<br />
T pix_in, l_edge_pix, r_edge_pix, pix_out;<br />
#pragma HLS PIPELINE<br />
if (i == 0 || (i > border_width && i < height - border_width)) {<br />
if (j < width - (K - 1)) {<br />
pix_in = vconv.read();<br />
borderbuf[j] = pix_in;<br />
高 位 合 成 japan.xilinx.com 100<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
}<br />
if (j == 0) {<br />
l_edge_pix = pix_in;<br />
}<br />
if (j == width - K) {<br />
r_edge_pix = pix_in;<br />
}<br />
}<br />
if (j = width - border_width - 1) {<br />
pix_out = r_edge_pix;<br />
} else {<br />
pix_out = borderbuf[j - border_width];<br />
}<br />
dst
第 1 章 : 高 位 合 成<br />
}<br />
}<br />
Border:for (int i = 0; i < height; i++) {<br />
for (int j = 0; j < width; j++) {<br />
#pragma HLS PIPELINE<br />
}<br />
}<br />
各 タ ス ク は、 同 レベルでパイ プ ラ イ ン さ れます。 ラ イ ン バ ッ フ ァーは、 レ ジ ス タ にすべて 分 割 さ れて、ブ ロ ッ ク RAM<br />
ポー ト の 不 足 に よ って 読 み 込 みま たは 書 き 出 し の 制 限 がない よ う にな り ます。 ラ イ ン バ ッ フ ァ ーには、 依 存 指 示 子 も<br />
必 要 です。 すべての タ ス ク がデータ フ ロー 領 域 で 実 行 さ れ、 タ ス ク が 同 時 処 理 さ れる よ う にな り ます。 hls::streams は<br />
1 エレ メン ト を 含 む FIFO と し て 自 動 的 に イ ンプ リ メ ン ト さ れます。<br />
効 率 的 なハー ド ウ ェ アのための C 言 語 のま と め<br />
データ 入 力 の 読 み 込 みは 最 小 限 に し ます。 データ が 1 度 ブ ロ ッ ク に 読 み 込 まれる と 、 多 く の 並 列 パスに 簡 単 に 送 られ<br />
る よ う にな り ますが、 入 力 ポー ト がパフ ォーマン スに 対 する ボ ト ルネ ッ ク にな る こ と があ り ます。 データ を 1 度 読 み<br />
込 んだ 後 、 再 利 用 する 必 要 があ る 場 合 は、 ローカル キ ャ ッ シ ュ を 使 用 し ます。<br />
配 列 、 特 に 大 き な 配 列 へのア ク セスは 最 小 限 に 抑 え ます。 配 列 はブ ロ ッ ク RAM にインプリ メン ト されます。 I/O ポー<br />
ト のよ う に、 限 られた 数 のポー ト しか 含 まれないので、パフ ォーマン スに 対 するボ ト ルネ ッ ク にな る こ と があ り ます。<br />
配 列 は 小 さ い 配 列 および 個 別 のレ ジ ス タ に さ えに 分 割 で き ますが、 大 き な 配 列 を 分 割 する と 、 使 用 さ れる レ ジ ス タ 数<br />
は 多 く な り ます。 小 さ い ローカ ラ イ ズ さ れたキ ャ ッ シ ュ を 使 用 し て 累 積 などの 結 果 を 維 持 さ せて、 最 終 結 果 が 配 列 に<br />
書 き 出 されるよ うにします。<br />
条 件 で 実 行 さ れる タ ス ク ではな く 、 パイ プ ラ イ ン さ れた タ ス ク ですら、 パイ プ ラ イ ン さ れた タ ス ク 内 で 条 件 分 岐 が 実<br />
行 さ れる よ う に し ます。 条 件 文 は、 パイ プ ラ イ ンで 別 々のパス と し て イ ンプ リ メ ン ト さ れます。 データ が 1 つのタ ス<br />
クから 次 のタスク 内 で 実 行 される 条 件 に 流 れるよ うにする と、 システムのパフォーマンスが 向 上 します。<br />
入 力 の 読 み 込 み と 同 じ 理 由 で、 出 力 の 書 き 出 し も 最 小 限 に し ます。 ポー ト がボ ト ルネ ッ クです。 追 加 ポー ト を 複 製 し<br />
て も、 単 に 問 題 がシステムに 先 送 り にな るだけです。<br />
ス ト リ ー ミ ング 方 式 でデータ を 処 理 する C コー ド の 場 合 、 hls::streams を 使 用 する と 優 れた コー ド 記 述 にな り ます。 な<br />
ぜ FPGA が 必 要 なパフォーマンスで 動 作 しないのかデバッグするよ り も、 優 れたパフォーマンスの FPGA インプリ メ<br />
ンテーシ ョ ンになる C のアルゴ リ ズム を 設 計 する 方 が 生 産 的 です。<br />
ハー ド ウ ェ ア 効 率 の 良 いデータ 型 を 使 用 し て、 ハー ド ウ ェ ア 演 算 子 が 最 適 なサ イ ズにな る よ う に し ます。 こ の ト ピ ッ<br />
クについては、 次 で 説 明 します。<br />
効 率 的 なハー ド ウ ェ アのためのデー タ 型<br />
C ベースのネ イ テ ィ ブ データ 型 は、 8 ビッ ト 境 界 (8、 16、 32、 64 ビッ ト) にあ り ます。 RTL バス (ハー ド ウ ェ アに 対<br />
応 ) では、 任 意 精 度 のデータ 長 がサポー ト さ れます。 標 準 C データ 型 を 使 用 する と 、 効 率 の 悪 いハー ド ウ ェ アにな る<br />
こ と があ り ます。 た と えば、 FPGA での 基 本 的 な 乗 算 単 位 は DSP48 マクロで、18*18 ビ ッ ト の 乗 算 器 が 提 供 さ れます。<br />
17 ビッ トの 乗 算 が 必 要 な 場 合 は、32 ビッ トの C データ 型 で こ れを イ ンプ リ メ ン ト し ない よ う に し て く だ さ い。 32<br />
ビッ トの C データ 型 の 場 合 、 乗 算 器 を イ ンプ リ メ ン ト する のに DSP48 マクロが 3 つ 必 要 にな る か ら です。<br />
任 意 精 度 データ 型 の 利 点 は、 C コー ド を ビ ッ ト 幅 の 狭 い 変 数 を 使 用 する よ う ア ッ プデー ト し、 C シミュレーションを<br />
再 実 行 し て 機 能 が 同 一 ま たは 使 用 可 能 であ る こ と を 検 証 で き る 点 です。 小 さ いビ ッ ト 幅 の 方 が 小 さ く て 高 速 なハー ド<br />
ウェア 演 算 になります。 これにより、 より 多 くのロジックが FPGA に 配 置 できるようになり、 ロジックがより 高 速 の<br />
ク ロ ッ ク 周 波 数 で 実 行 さ れる よ う にな り ます。<br />
ハー ド ウ ェ ア 効 率 の 高 いデー タ 型 の 利 点<br />
次 の コー ド では、 基 本 的 な 算 術 演 算 が 実 行 さ れます。<br />
#include "types.h"<br />
高 位 合 成 japan.xilinx.com 102<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
void apint_arith(dinA_t inA, dinB_t inB, dinC_t inC, dinD_t inD,<br />
dout1_t *out1, dout2_t *out2, dout3_t *out3, dout4_t *out4<br />
) {<br />
}<br />
// Basic arithmetic operations<br />
*out1 = inA * inB;<br />
*out2 = inB + inA;<br />
*out3 = inC / inA;<br />
*out4 = inD % inA;<br />
データ 型 dinA_t、dinB_t などはヘッダー ファイル types.h で 定 義 されています。types.h などのヘッダー ファ<br />
イルをプ ロ ジ ェ ク ト を 通 し て 使 用 する こ と を 強 く お 勧 め し ます。 こ うすることで、 標 準 C 型 か ら 任 意 精 度 型 への 移 行<br />
が 簡 単 にな り 、 任 意 精 度 型 を 最 適 なサ イ ズに 変 更 しやす く な り ます。<br />
上 記 の 例 のデータ 型 は 次 のよ う に 定 義 されている と し ます。<br />
typedef char dinA_t;<br />
typedef short dinB_t;<br />
typedef int dinC_t;<br />
typedef long long dinD_t;<br />
typedef int dout1_t;<br />
typedef unsigned int dout2_t;<br />
typedef int32_t dout3_t;<br />
typedef int64_t dout4_t;<br />
こ の 場 合 、 合 成 後 の 結 果 は 次 の よ う にな り ます。<br />
+ Timing (ns):<br />
* Summary:<br />
+---------+-------+----------+------------+<br />
| Clock | Target| Estimated| Uncertainty|<br />
+---------+-------+----------+------------+<br />
|default | 4.00| 3.85| 0.50|<br />
+---------+-------+----------+------------+<br />
+ Latency (clock cycles):<br />
* Summary:<br />
+-----+-----+-----+-----+---------+<br />
| Latency | Interval | Pipeline|<br />
| min | max | min | max | Type |<br />
+-----+-----+-----+-----+---------+<br />
| 66| 66| 67| 67| none |<br />
+-----+-----+-----+-----+---------+<br />
* Summary:<br />
+-----------------+---------+-------+--------+--------+<br />
| Name | BRAM_18K| DSP48E| FF | LUT |<br />
+-----------------+---------+-------+--------+--------+<br />
|Expression | -| -| 0| 17|<br />
|FIFO | -| -| -| -|<br />
|Instance | -| 1| 17920| 17152|<br />
|Memory | -| -| -| -|<br />
|Multiplexer | -| -| -| -|<br />
|Register | -| -| 7| -|<br />
+-----------------+---------+-------+--------+--------+<br />
|Total | 0| 1| 17927| 17169|<br />
+-----------------+---------+-------+--------+--------+<br />
|Available | 650| 600| 202800| 101400|<br />
高 位 合 成 japan.xilinx.com 103<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
+-----------------+---------+-------+--------+--------+<br />
|Utilization (%) | 0| ~0 | 8| 16|<br />
+-----------------+---------+-------+--------+--------+<br />
た と えば 次 の よ う に、 そのデータ 幅 を イ ンプ リ メ ン ト する のに 標 準 C 型 を 使 用 する 必 要 がな く 、 それよ り 小 さ い 幅<br />
で、 次 に 小 さい 標 準 C 型 よ りは 大 きいよ う なデータ 幅 である と します。<br />
typedef int6 dinA_t;<br />
typedef int12 dinB_t;<br />
typedef int22 dinC_t;<br />
typedef int33 dinD_t;<br />
typedef int18 dout1_t;<br />
typedef uint13 dout2_t;<br />
typedef int22 dout3_t;<br />
typedef int6 dout4_t;<br />
合 成 後 の 結 果 には、 最 大 ク ロ ッ ク 周 波 数 、レ イ テンシが 改 善 さ れ、エ リ ア 使 用 量 が 75% 削 減 さ れた こ と が 示 さ れます。<br />
+ Timing (ns):<br />
* Summary:<br />
+---------+-------+----------+------------+<br />
| Clock | Target| Estimated| Uncertainty|<br />
+---------+-------+----------+------------+<br />
|default | 4.00| 3.49| 0.50|<br />
+---------+-------+----------+------------+<br />
+ Latency (clock cycles):<br />
* Summary:<br />
+-----+-----+-----+-----+---------+<br />
| Latency | Interval | Pipeline|<br />
| min | max | min | max | Type |<br />
+-----+-----+-----+-----+---------+<br />
| 35| 35| 36| 36| none |<br />
+-----+-----+-----+-----+---------+<br />
* Summary:<br />
+-----------------+---------+-------+--------+--------+<br />
| Name | BRAM_18K| DSP48E| FF | LUT |<br />
+-----------------+---------+-------+--------+--------+<br />
|Expression | -| -| 0| 13|<br />
|FIFO | -| -| -| -|<br />
|Instance | -| 1| 4764| 4560|<br />
|Memory | -| -| -| -|<br />
|Multiplexer | -| -| -| -|<br />
|Register | -| -| 6| -|<br />
+-----------------+---------+-------+--------+--------+<br />
|Total | 0| 1| 4770| 4573|<br />
+-----------------+---------+-------+--------+--------+<br />
|Available | 650| 600| 202800| 101400|<br />
+-----------------+---------+-------+--------+--------+<br />
|Utilization (%) | 0| ~0 | 2| 4|<br />
+-----------------+---------+-------+--------+--------+<br />
両 方 のデザ イ ン 間 でレ イ テンシが 大 き く 違 ってい る のは、 除 算 および 余 り の 計 算 が 終 了 する のに 複 数 サ イ ク ルかか る<br />
ためです。 デザインを 標 準 C データ 型 にフ ィ ッ ト さ せる よ う にする よ り も、 正 確 なデータ 型 を 使 用 する 方 が、 高 品 質<br />
の FPGA インプリ メンテーション ( 同 じ 精 度 で よ り 高 速 で 少 量 の リ ソ ース) にな り ます。<br />
高 位 合 成 japan.xilinx.com 104<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
任 意 精 度 整 数 デー タ 型 の 概 要<br />
Vivado HLS では、 C および C++ の 整 数 および 固 定 小 数 点 の 任 意 精 度 データ 型 が 提 供 さ れてお り 、 SystemC の 一 部 で<br />
あ る 任 意 精 度 データ 型 がサポー ト さ れます。<br />
表 1‐12 : 任 意 精 度 デー タ 型<br />
言 語 整 数 デー タ 型 必 要 なヘ ッ ダー<br />
C [u]int (1024 bits) #include “ap_cint.h”<br />
C++ ap_[u]int (1024 ビッ ト)<br />
Can be extended to 32K bits wide.<br />
#include “ap_int.h”<br />
C++ ap_[u]fixed #include “ap_fixed.h”<br />
System C sc_[u]int (64 ビッ ト)<br />
sc_[u]bigint (512 ビッ ト)<br />
#include “systemc.h”<br />
System C sc_[u]fixed #define SC_INCLUDE_FX<br />
[#define SC_FX_EXCLUDE_OTHER]<br />
#include “systemc.h”<br />
Vivado HLS には、 任 意 精 度 型 を 定 義 するヘ ッ ダー ファイルもスタンドアロン パッケージとして 含 まれており、 ソー<br />
ス コー ド で 使 用 で き る よ う になっています。Vivado HLS インストール ディレク ト リのインクルード ディレク ト リに<br />
は xilinx_hls_lib_.tgz パッケージが 含 まれます。 このパッケージには、ap_cint.h で 定<br />
義 された C 任 意 精 度 データ 型 は 含 まれていません。 こ れら のデータ 型 は、 標 準 C コンパイラーとは 一 緒 に 使 用 でき<br />
ず、 Vivado HLS でのみ 使 用 で き る よ う になっています。<br />
C 言 語 での 任 意 精 度 整 数 型<br />
C 言 語 では、 ヘ ッ ダー ファイル ap_cint.h に よ り 任 意 精 度 の 整 数 データ 型 [u]int が 定 義 されます。 C 関 数 で 任 意<br />
精 度 の 整 数 データ 型 を 使 用 する には、 次 の 手 順 に 従 います。<br />
• ソース コードにヘッダー ファイル ap_cint.h を 追 加 します。<br />
• ビッ ト 型 を intN または uintN (N はビッ ト サイズを 表 す 1 ~ 1024 の 値 ) に 変 更 し ます。<br />
C++ 言 語 での 任 意 精 度 デー タ 型<br />
C++ 言 語 では、 ヘ ッ ダー ファイル ap_int.h に よ り 任 意 精 度 の 整 数 データ 型 ap_[u]int が 定 義 されます。 C++ 関<br />
数 で 任 意 精 度 の 整 数 データ 型 を 使 用 する には、 次 の 手 順 に 従 います。<br />
• ソース コードにヘッダー ファイル ap_int.h を 追 加 します。<br />
• ビッ ト 型 を ap_int または ap_uint (N はビッ ト サイズを 表 す 1 ~ 1024 の 値 ) に 変 更 し ます。<br />
次 の 例 に、 ヘッ ダー ファイルの 追 加 方 法 と、 2 つの 変 数 を 9 ビ ッ ト 整 数 型 および 10 ビ ッ ト の 符 号 な し 整 数 型 を 使 用<br />
してインプリ メントする 方 法 を 示 します。<br />
#include ap_int.h<br />
void foo_top (…) {<br />
ap_int var1;<br />
ap_uint var2;<br />
// 9-bit<br />
// 10-bit unsigned<br />
ap_[u]int データ 型 に 使 用 で き るデフ ォル ト の 最 大 幅 は、 1024 ビッ トです。 このデフォルトは、 ap_int.h ヘッ<br />
ダー ファイルを 含 める 前 に、32768 以 下 の 正 の 整 数 値 でマ ク ロ AP_INT_MAX_W を 定 義 する と 上 書 きする こ と がで き<br />
ます。<br />
高 位 合 成 japan.xilinx.com 105<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
注 意 : AP_INT_MAX_W の 値 を あ ま り 高 く 設 定 する と 、ソ フ ト ウ ェ アの コ ンパイルおよび 実 行 に 時 間 がかか る 可 能 性 が<br />
あります。<br />
次 は AP_INT_MAX_W を 上 書 きする 例 です。<br />
#define AP_INT_MAX_W 4096<br />
#include “ap_int.h”<br />
// Must be defined before next line<br />
ap_int very_wide_var;<br />
SystemC 言 語 での 任 意 精 度 デー タ 型<br />
SystemC で 使 用 さ れる 任 意 精 度 型 は、 ヘ ッ ダー ファイル systemc.h で 定 義 されています。 このヘッ ダー ファイル<br />
は、 すべ て の SystemC デザイ ンに 含 める 必 要 があ り ます。 ヘッ ダー ファイルには、SystemC の sc_int、<br />
sc_uint、 sc_bigint および sc_biguint 型 が 含 まれます。<br />
任 意 精 度 固 定 小 数 点 デー タ 型 の 概 要<br />
固 定 小 数 点 データ 型 では、 整 数 ビ ッ ト および 小 数 ビ ッ ト と し てデータ が 記 述 さ れます。 次 の 例 では、 Vivado HLS の<br />
ap_fixed 型 を 使 用 し て、 18 ビッ ト 変 数 (6 ビ ッ ト が 整 数 部 、 12 ビ ッ ト が 小 数 部 を 表 す) を 定 義 しています。 変 数 は、<br />
符 号 付 き と し て 指 定 さ れ、 量 子 化 モー ド は 正 の 無 限 大 の 方 向 に 丸 め ら る よ う に 設 定 さ れます。 オーバーフ ロー モード<br />
は 指 定 されていないので、 デフ ォル ト の 折 り 返 しモード がオーバーフ ローには 使 用 されます。<br />
#include <br />
...<br />
ap_fixed my_type;<br />
...<br />
変 数 に さ ま ざ ま なビ ッ ト 数 や 精 度 が 含 まれる よ う な 計 算 を 実 行 する 場 合 は、 2 進 小 数 点 が 自 動 的 に 揃 え ら れます。<br />
固 定 小 数 点 を 使 用 し て 実 行 さ れた C++/SystemC シ ミ ュ レーシ ョ ンのビヘイ ビ アーは、 結 果 のハー ド ウ ェ ア と 一 致 する<br />
ので、 ビ ッ ト 精 度 、 量 子 化 、 およびオーバーフ ローの 解 析 が 高 速 な C レベルのシ ミ ュレーシ ョ ンで 解 析 できます。<br />
固 定 小 数 点 型 は、 終 了 する のに 多 く の ク ロ ッ ク サ イ ク ルを 必 要 と する 浮 動 小 数 点 型 の 代 わ り に 使 用 する と 実 用 的 で<br />
す。 浮 動 小 数 点 型 の 範 囲 がすべて 必 要 と さ れない 限 り は、 固 定 小 数 点 型 で 同 じ 精 度 を イ ンプ リ メ ン ト で き、 よ り 小 型<br />
で 高 速 なハード ウ ェアにでき る こ と がよ く あ り ます。<br />
ap_fixed 型 の 識 別 子 については、 次 の 表 にま と めています。<br />
表 1‐13 : 固 定 小 数 点 の 識 別 子<br />
識 別 子<br />
説 明<br />
W<br />
ワード 長 をビッ ト 数 で 指 定<br />
I 整 数 値 を ビ ッ ト 数 で 指 定 (2 進 小 数 点 よ り 上 位 のビ ッ ト 数 )<br />
高 位 合 成 japan.xilinx.com 106<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐13 : 固 定 小 数 点 の 識 別 子<br />
Q<br />
識 別 子<br />
量 子 化 モー ド<br />
説 明<br />
結 果 の 保 存 に 使 用 さ れる 変 数 の 最 小 の 小 数 ビ ッ ト で 定 義 で き る よ り も 大 き い 精 度 が 生 成 さ れ<br />
た 場 合 の 動 作 を 指 定<br />
SystemC 型 ap_fixed 型 説 明<br />
SC_RND AP_RND 正 の 無 限 大 への 丸 め<br />
SC_RND_ZERO AP_RND_ZERO 0 への 丸 め<br />
SC_RND_MIN_INF AP_RND_MIN_INF 負 の 無 限 大 への 丸 め<br />
AP_RND_INF AP_RND_INF 無 限 大 への 丸 め<br />
AP_RND_CONV AP_RND_CONV 収 束 丸 め<br />
AP_TRN AP_TRN 負 の 無 限 大 への 切 り 捨 て<br />
AP_TRN_ZERO AP_TRN_ZERO 0 への 切 り 捨 て (デフォル ト)<br />
O<br />
オーバーフ ロー モード<br />
演 算 結 果 が 最 大 値 ( 負 の 数 値 の 場 合 は 最 小 値 ) を 超 えるビヘイビアーを 検 出 ( 値 は 結 果 変 数 に<br />
格 納 可 能 )<br />
SystemC 型 ap_fixed 型 説 明<br />
SC_SAT AP_SAT 飽 和<br />
SC_SAT_ZERO AP_SAT_ZERO 0 への 飽 和<br />
SC_SAT_SYM AP_SAT_SYM 対 称 飽 和<br />
SC_WRAP AP_WRAP 折 り 返 し (デフォル ト )<br />
SC_WRAP_SM AP_WRAP_SM 符 号 絶 対 値 の 折 り 返 し<br />
N<br />
オーバーフ ロー 折 り 返 し モー ド での 飽 和 ビ ッ ト 数 を 定 義<br />
ap_[u]fixed データ 型 に 使 用 で き るデフ ォル ト の 最 大 幅 は、1024 ビ ッ ト です。 こ のデフ ォル ト は、ap_int.h ヘッ<br />
ダー ファイルを 含 める 前 に、32768 以 下 の 正 の 整 数 値 でマ ク ロ AP_INT_MAX_W を 定 義 する と 上 書 きする こ と がで き<br />
ます。<br />
注 意 : AP_INT_MAX_W の 値 を あ ま り 高 く 設 定 する と 、ソ フ ト ウ ェ アの コ ンパイルおよび 実 行 に 時 間 がかか る 可 能 性 が<br />
あります。<br />
次 は AP_INT_MAX_W を 上 書 きする 例 です。<br />
#define AP_INT_MAX_W 4096<br />
#include “ap_fixed.h”<br />
// Must be defined before next line<br />
ap_fixed very_wide_var;<br />
高 位 合 成 を 使 用 する 場 合 は、 任 意 精 度 データ 型 の 使 用 をお 勧 め し ます。 前 の 例 で 示 し た よ う に、 任 意 精 度 データ 型 を<br />
使 用 する と 、 ハー ド ウ ェ ア イ ンプ リ メ ンテーシ ョ ンの 質 がかな り 向 上 する と い う 利 点 があ り ます。 Vivado HLS の 任<br />
意 精 度 データ 型 の 詳 細 については、 「 高 位 合 成 リ フ ァ レ ン ス ガイド」 を 参 照 して く ださい。<br />
高 位 合 成 japan.xilinx.com 107<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ハー ド ウ ェ ア 最 適 化 済 み C ライブラリの 使 用<br />
Vivado HLS には、 よ く 使 用 される C 関 数 用 の C ライブラリが 多 く 含 まれます。C ライブラリに 含 まれる 関 数 は、 合<br />
成 した と きに 優 れたパフォーマンスで 効 率 の 良 いイ ンプ リ メ ンテーシ ョ ンになる よ う に 通 常 前 も って 最 適 化 されて<br />
います。<br />
Vivado HLS に 含 まれる C ラ イブラ リ すべての 詳 細 については、 「C ラ イ ブ ラ リ の 使 用 」 を 参 照 して く ださい。 C ライ<br />
ブラ リにどの C 関 数 が 含 まれるのかを 手 法 の 一 部 と し て 理 解 し てお く こ と が 推 奨 さ れます。<br />
Vivado HLS には 次 の C 関 数 が 含 まれます。<br />
• 任 意 精 度 データ 型<br />
• HLS ストリーム ライブラリ<br />
• 数 学 関 数<br />
• 線 形 代 数 関 数<br />
• ビデオ 関 数<br />
• IP ライブラリ<br />
任 意 精 度 デー タ 型 ラ イ ブ ラ リ<br />
1 ビットから 1024 ビット (C++ 型 の 場 合 はそれ 以 上 ) の 幅 のデータ 型 を 記 述 するために、 3 つの C ライブラリが 提 供<br />
さ れています。 こ れら のデータ 型 を 使 用 する 利 点 については、 前 のセ ク シ ョ ンで 説 明 し ています。 次 の 表 は、 提 供 さ<br />
れている ラ イブラ リ のま とめです。<br />
表 1‐14 : 任 意 精 度 デー タ 型 ラ イ ブ ラ リ<br />
ライブラリ ヘッダー ファ<br />
イル<br />
ap_cin.h<br />
ap_int.h<br />
ap_fixedt.h<br />
説 明<br />
変 数 を 1 ~ 1024 任 意 ビ ッ ト サ イ ズを 使 用 し て 定 義 で き る よ う に し た C 関 数 で<br />
使 用 するデータ 型 の ラ イ ブ ラ リ<br />
変 数 を 1 ~ 1024 (オプシ ョ ンで 32768) 任 意 ビ ッ ト サ イ ズを 使 用 し て 定 義 で き る<br />
ようにした C++ 関 数 で 使 用 するデータ 型 の ラ イ ブ ラ リ<br />
固 定 小 数 点 変 数 を 1 ~ 1024 (オプシ ョ ンで 32768) 任 意 ビ ッ ト サイズを 使 用 して<br />
定 義 できるようにした C++ 関 数 で 使 用 するデータ 型 の ラ イ ブ ラ リ<br />
固 定 小 数 点 には、 整 数 ビ ッ ト と 小 数 ビ ッ ト の 範 囲 が 含 まれます。 こ のデータ 型<br />
では、 オーバーフ ローおよび 丸 めの 際 のビヘイ ビ アーを 決 定 する 量 子 化 モー ド<br />
およびオーバーフロー モード が 多 く サポー ト されます。<br />
HLS ストリーム ライブラリ<br />
Vivado HLS には、ス ト リ ー ミ ング データ 構 造 を 記 述 する ための C++ テンプレート クラスの hls::stream が 含 まれま<br />
す。 hls::stream ク ラ ス を 使 用 し て イ ンプ リ メ ン ト し た ス ト リ ームには、 次 の 属 性 があ り ます。<br />
• 値 は、 厳 密 にシーケ ンシ ャルな 順 序 で 書 き 出 し ま たは 読 み 込 み さ れます。<br />
• ス ト リ ームは 自 動 的 に 効 率 的 な 内 部 FIFO (デフォル ト の 深 さの 1 は 上 書 き) または FIFO ポー ト と してイ ンプ リ<br />
メントされます。<br />
• ブロッキング アクセスとノンブロッキング アクセスの 両 方 がサポート されます。<br />
高 位 合 成 japan.xilinx.com 108<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐15 : HLS ストリーム データ 型 ラ イブラ リ<br />
ライブラリ ヘッダー ファ<br />
イル<br />
hls_stream.h<br />
説 明<br />
ストリーミング データ を 記 述 する ための hls::stream C++ クラス<br />
を 定 義<br />
HLS ス トリーム 変 数 は、hls 名 前 空 間 ま たはス コープ 付 き 命 名 規 則 を 使 用 し て 記 述 し ます。<br />
• hls 名 前 空 間 は 次 の よ う に 使 用 し ます。<br />
#include “ap_int.h”<br />
#include “hls_stream.h”<br />
typedef ap_uint uint128_t; // 128-bit user defined type<br />
hls::stream my_wide_stream; // A stream declaration<br />
• ス コープ 付 き 命 名 規 則 は、 次 の よ う に 使 用 し ます。<br />
#include “ap_int.h”<br />
#include “hls_stream.h”<br />
using namespace hls;// Namespace specified after the header files<br />
typedef ap_uint uint128_t; // 128-bit user defined type<br />
stream my_wide_stream; // A stream declaration<br />
推 奨 : 推 奨 さ れる コー ド 記 述 方 法 は、 hls 名 前 空 間 の 方 です。<br />
わか り やす く するために、 本 書 では hls 名 前 空 間 の 形 式 を 使 用 し て HLS ス トリーム オブジェ ク ト と 記 述 しています。<br />
た と えば、 入 力 データ ス トリームをインプリメントするのに stream_in という hls::stream が 使 用 されます。<br />
hls::stream 変 数 の 利 点 については、 「ハード ウ ェア 効 率 の 良 い C コー ド の 記 述 」 を 参 照 して く ださい。<br />
数 学 関 数<br />
数 学 関 数 は、 浮 動 小 数 点 と 固 定 小 数 点 のデータ 型 両 方 に 対 し て 提 供 さ れています。 数 学 関 数 を 使 用 する 際 には、 C<br />
コード と RTL イ ンプ リ メ ンテーシ ョ ン 間 の 精 度 が 異 な る 可 能 性 があ る と い う 問 題 に 注 意 する 必 要 があ り ます。<br />
標 準 的 な 演 算 機 能 および 数 学 関 数 のすべては、 ザ イ リ ン ク ス IP ブ ロ ッ ク と し て 使 用 で き る よ う になっています。 ザ<br />
イリンクス IP ブ ロ ッ ク に 直 接 合 成 可 能 な 演 算 は、 ダ イ ナ ミ ッ ク 範 囲 全 体 で C シ ミ ュ レーシ ョ ン 結 果 と 正 確 に 一 致 し<br />
ます。 ザイ リ ンクス IP ブロ ッ クを 使 用 して 直 接 インプリ メン トできない 数 学 関 数 の 場 合 は、 C 数 学 関 数 に よ り 関 数<br />
の 合 成 可 能 な イ ンプ リ メ ンテーシ ョ ンが 提 供 さ れています。 こ の 場 合 、C シミュレーションと RTL インプリ メンテー<br />
シ ョ ン 間 で 違 いがあ る 可 能 性 があ り ます。 違 いについては、 次 の 表 に 最 大 の 相 違 を ビ ッ ト で 指 定 する ULP (Units of<br />
Least Precision) ですべて 記 載 さ れています。<br />
ULP が 0 よ り 大 き い 関 数 を 使 用 する 際 には、 結 果 の 検 証 に 誤 差 範 囲 を 使 用 する ス マー ト C テ ス ト ベンチを 使 用 する<br />
こ と をお 勧 め し ます。 こ の よ う なテ ス ト ベンチを 使 用 し ない と 、C と RTL シミュレーションの 結 果 が 異 なってしまう<br />
可 能 性 があ り ます。 詳 細 は、 「hls_math ライブラリ」 を 参 照 して く ださい。<br />
高 位 合 成 japan.xilinx.com 109<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
標 準 C の math ライブラリでサポートされるすべての 関 数 が HLS の math ラ イ ブ ラ リ で 提 供 さ れてい る わけではあ り<br />
ません。 次 の 表 に 示 す 数 学 関 数 のみが 合 成 でサポー ト さ れます。<br />
表 1‐16 : Vivado HLS の math ライブラリ<br />
abs<br />
関 数 デー タ 型 精 度 (ULP) インプリメンテーション 形 式<br />
float<br />
Exact<br />
Synthesized<br />
double<br />
atanf float 2 Synthesized<br />
ceil<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
ceilf float Exact Synthesized<br />
copysign<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
copysignf float Exact Synthesized<br />
cos<br />
float<br />
double<br />
10 Synthesized<br />
ap_fixed 28-29 Synthesized<br />
cosf float 1 Synthesized<br />
coshf float 4 Synthesized<br />
exp<br />
float<br />
double<br />
Exact<br />
LogiCore<br />
expf float Exact LogiCore<br />
fabs<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
fabsf float Exact Synthesized<br />
floorf float Exact Synthesized<br />
fmax<br />
fmin<br />
float<br />
double<br />
float<br />
double<br />
Exact<br />
Exact<br />
Synthesized<br />
Synthesized<br />
logf float 1 Synthesized<br />
floor<br />
fpclassify<br />
isfinite<br />
isinf<br />
isnan<br />
isnormal<br />
float<br />
double<br />
float<br />
double<br />
float<br />
double<br />
float<br />
double<br />
float<br />
double<br />
float<br />
double<br />
Exact<br />
Exact<br />
Exact<br />
Exact<br />
Exact<br />
Exact<br />
Synthesized<br />
Synthesized<br />
Synthesized<br />
Synthesized<br />
Synthesized<br />
Synthesized<br />
高 位 合 成 japan.xilinx.com 110<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐16 : Vivado HLS の math ライブラリ<br />
log float 1 Synthesized<br />
double 16<br />
log10 float 2 Synthesized<br />
modf<br />
double 3<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
modff float Exact Synthesized<br />
1/x ( 逆 数 ) float<br />
Exact<br />
LogiCORE IP<br />
double<br />
recip<br />
float<br />
double<br />
1 Synthesized<br />
recipf float 1 Synthesized<br />
round<br />
rsqrt<br />
float<br />
double<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
1 Synthesized<br />
rsqrtf float 1 Synthesized<br />
1/sqrt ( 逆 数 sqrt)<br />
signbit<br />
sin<br />
関 数 デー タ 型 精 度 (ULP) インプリメンテーション 形 式<br />
float<br />
double<br />
float<br />
double<br />
float<br />
double<br />
Exact<br />
Exact<br />
LogiCORE IP<br />
Synthesized<br />
10 Synthesized<br />
ap_fixed 28-29 Synthesized<br />
sincos float 1 Synthesized<br />
double 5<br />
sincosf float 1 Synthesized<br />
sinf float 1 Synthesized<br />
sinhf float 6 Synthesized<br />
sqrt<br />
tan<br />
float<br />
double<br />
Exact<br />
LogiCORE IP<br />
ap_fixed 28-29 Synthesized<br />
float<br />
double<br />
20 Synthesized<br />
tanf float 3 Synthesized<br />
trunc<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
高 位 合 成 japan.xilinx.com 111<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
HLS 数 学 関 数 は、 hls 名 前 空 間 ま たはス コープ 付 き 命 名 規 則 を 使 用 し て 記 述 し ます。<br />
• hls 名 前 空 間 は 次 の よ う に 使 用 し ます。<br />
#include “hls_math.h”<br />
data_t s = hls::sinf(angle);<br />
• ス コープ 付 き 命 名 規 則 は、 次 の よ う に 使 用 し ます。<br />
#include “hls_math.h”<br />
using namespace hls;// Namespace specified after the header files<br />
data_t s = sinf(angle);<br />
推 奨 : 推 奨 さ れる コー ド 記 述 方 法 は、 hls 名 前 空 間 の 方 です。<br />
線 形 代 数 関 数<br />
HLS 線 形 代 数 ラ イ ブ ラ リ には、 よ く 使 用 さ れる 線 形 代 数 関 数 が 多 く 含 まれます。 線 形 代 数 関 数 は、 高 いパフ ォーマン<br />
ス を 必 要 とするデザイ ンから、エ リ ア 効 率 の 良 いイ ンプ リ メ ンテーシ ョ ンを 必 要 とする 低 スループ ッ ト のデザイ ン ま<br />
で、 さ ま ざ ま なデザ イ ンで 使 用 さ れる ため、 高 パフ ォーマン ス 用 に 前 も って 最 適 化 は さ れていません。<br />
HLS 線 形 代 数 ラ イ ブ ラ リ か ら パフ ォーマン ス 指 示 子 を 追 加 する 関 数 については、 「HLS 線 形 代 数 ラ イ ブ ラ リ 」 を 参 照<br />
してください。<br />
HLS 線 形 代 数 ラ イ ブ ラ リ の 関 数 では、 次 の 表 に リ ス ト する よ う に 2 次 元 配 列 を 使 用 し て 行 列 が 表 さ れます。<br />
表 1‐17 : HLS 線 形 代 数 ラ イ ブ ラ リ<br />
関 数 デー タ 型 精 度 (ULP) インプリメンテーション 形 式<br />
cholesky<br />
float<br />
ap_fixed<br />
x_complex
第 1 章 : 高 位 合 成<br />
#include “hls_linear_algebra.h”<br />
hls::chelosky(In_Array,Out_Array);<br />
• ス コープ 付 き 命 名 規 則 は、 次 の よ う に 使 用 し ます。<br />
#include “hls_linear_algebra.h”<br />
using namespace hls;// Namespace specified after the header files<br />
chelosky(In_Array,Out_Array);<br />
推 奨 : 推 奨 さ れる コー ド 記 述 方 法 は、 hls 名 前 空 間 の 方 です。<br />
ビデオ 関 数<br />
HLS ビデオ ライブラリには、 次 が 含 まれます。<br />
• ザイ リ ンクス ビデオ データ 型<br />
• ライン バッファーと メモリ ウ ィ ン ド ウ を 作 成 するデータ 型<br />
• OpenCV ラ イ ブ ラ リ 関 数 と 互 換 性 のあ る ビデオ 関 数<br />
• ビデオ ラ イ ブ ラ リ 関 数 と 使 用 する フ ォーマ ッ ト 変 換 関 数<br />
HLS ビデオ ラ イ ブ ラ リ で 提 供 さ れるデータ 型 を 使 用 する と 、 合 成 で 作 成 さ れる 出 力 RTL がシステムで 使 用 されるザ<br />
イリンクス ビデオ IP ブロック とスムーズに 統 合 できるよ うになり ます。システムでザイ リ ンクス ビデオ IP を 使 用 す<br />
る 際 は、 IP のデータ シー ト を 参 照 し て、 ビデオ データ の 送 信 ま たは 受 信 に 使 用 する フ ォーマ ッ ト を 決 定 し て く だ さ<br />
い。 C コードで 適 切 なビデオ データ 型 を 使 用 する と 、 合 成 で 作 成 さ れる RTL をザイ リ ンクス ビデオ IP に 接 続 でき ま<br />
す。 HLS ビデオ ラ イ ブ ラ リ には、 次 のデータ 型 が 含 まれます。<br />
次 の 表 には、 HLS ビデオ ラ イ ブ ラ リ で 提 供 さ れるデータ 型 を ま と めています。<br />
表 1‐18 : HLS ビデオ ライブラリのデータ 型<br />
データ 型<br />
yuv422_8<br />
yuv444_8<br />
rgb_8<br />
yuva422_8<br />
yuva444_8<br />
rgba_8<br />
yuva420_8<br />
yuvd422_8<br />
yuvd444_8<br />
rgbd_8<br />
bayer_8<br />
luma_8<br />
LineBuffer<br />
Window<br />
説 明<br />
8 ビットの Y および U フィールドを 提 供<br />
8 ビットの Y、 U および V フィールドを 提 供<br />
8 ビットの R、 G、 および a フィールドを 提 供<br />
8 ビットの Y、 UV および a フィールドを 提 供<br />
8 ビットの Y、 U、 V および a フィールドを 提 供<br />
8 ビットの R、 G、 B および a フィールドを 提 供<br />
8 ビットの Y および aUV フィールドを 提 供<br />
8 ビットの Y、 UV および D フィールドを 提 供<br />
8 ビットの Y、 U、 V および D フィールドを 提 供<br />
8 ビットの R、 G、 B および D フィールドを 提 供<br />
8 ビットの RGB フィールドを 提 供<br />
8 ビットの Y フィールドを 提 供<br />
データ アクセス 用 のメ ソ ッ ドを 使 用 して 指 定 データ 型 のライン バッファー<br />
を 定 義<br />
データ ア ク セス 用 の メ ソ ッ ド を 使 用 し て 指 定 データ 型 の 2 次 元 メ モ リ ウィ<br />
ンドウを 定 義<br />
高 位 合 成 japan.xilinx.com 113<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
HLS のビデオ ライブラリに 含 まれるビデオ プロセッシング 関 数 は、 既 存 の OpenCV 関 数 と 互 換 性 があ り 、 同 じ よ う<br />
に 名 前 が 付 け ら れますが、 既 存 の OpenCV ビデオ ラ イ ブ ラ リ 関 数 を 直 接 置 換 する も のではあ り ません。 ビデオ プロ<br />
セッシング 関 数 では hls::Mat データ 型 が 使 用 さ れます。 こ のデータ 型 に よ り 、 関 数 がハイ パフォーマンス ハー ド ウ ェ<br />
ア と し て 合 成 およびイ ンプ リ メ ンテーシ ョ ンで き る よ う にな り ます。<br />
HLS ビデオ ライブラリには、 次 の 3 つの 関 数 タ イ プが 含 まれます。<br />
• ビデオ プロセッシング 関 数 : ビデオ 画 像 を 操 作 する ための 標 準 OpenCV 関 数 と 互 換 性 があ り ます。 こ れ ら の 関 数<br />
では hls::mat データ 型 が 使 用 さ れて、 Vivado HLS で 合 成 されます。<br />
• AXI4-Stream 関 数 : こ れら の 関 数 は hls::mat データ 型 で 指 定 し たビデオ データ を AXI4 ストリーミング デー<br />
タ 型 に 変 換 する ために 使 用 さ れます。 こ の AXI4 ストリーミング データ 型 は、 高 パフ ォーマン スの イ ン ターフ ェ<br />
イ スが 合 成 さ れる よ う に、 合 成 さ れる 関 数 への 引 数 と し て 使 用 さ れます。<br />
• OpenCV インターフェイス 関 数 : AXI4 ストリーミング データ 型 と 標 準 OpenCV データ 型 間 のデータ を 変 換 し ま<br />
す。 こ れ ら の 関 数 を 使 用 する と 、 ソ フ ト ウ ェ アで 実 行 さ れる OpenCV 関 数 と HLS で 作 成 されるハード ウ ェア ブ<br />
ロ ッ ク 間 のデータ 転 送 を AXI4 ストリーミング 関 数 を 介 して 実 行 できるようになります。<br />
3 つすべての 関 数 タ イ プで CPU と 合 成 済 みハー ド ウ ェ ア 間 でデータ がス ムーズに 転 送 で き ます。 次 の 表 には、HLS ビ<br />
デオ ラ イ ブ ラ リ で 提 供 さ れる 関 数 について ま と めています。<br />
表 1‐19 : HLS ビデオ ライブラリ<br />
関 数 のタ イ プ 関 数 精 度 (ULP)<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
AXIvideo2cvMat<br />
AXIvideo2CvMat<br />
AXIvideo2IplImage<br />
cvMat2AXIvideo<br />
AXI ビデオ ストリーム (hls::stream) 形 式 か ら<br />
データ を OpenCV の cv::Mat 形 式 に 変 換<br />
AXI ビデオ ストリーム (hls::stream) 形 式 か ら<br />
データ を OpenCVの CvMat 形 式 に 変 換<br />
AXI ビデオ ストリーム (hls::stream) 形 式 か ら<br />
データ を OpenCV の IplImage 形 式 に 変 換<br />
OpenCV の cv::Mat 形 式 か ら のデータ を AXI ビ<br />
デオ ス トリーム (hls::stream) 形 式 に 変 換<br />
CvMat2AXIvideo OpenCV の CvMat 形 式 か ら のデータ を AXI ビ<br />
デオ ス トリーム (hls::stream) 形 式 に 変 換<br />
cvMat2hlsMat OpenCV の cv::Mat 形 式 か ら のデータ を hls::Mat<br />
形 式 に 変 換<br />
CvMat2hlsMat OpenCV の CvMat 形 式 か ら のデータ を hls::Mat<br />
形 式 に 変 換<br />
CvMat2hlsWindow OpenCV の CvMat 形 式 か ら のデータ を<br />
hls::Window 形 式 に 変 換<br />
hlsMat2cvMat hls::Mat 形 式 か ら のデータ を OpenCV の cv::Mat<br />
形 式 に 変 換<br />
hlsMat2CvMat hls::Mat 形 式 か ら のデータ を OpenCV の CvMat<br />
形 式 に 変 換<br />
hlsMat2IplImage hls::Mat 形 式 か ら のデータ を OpenCV の<br />
IplImage 形 式 に 変 換<br />
hlsWindow2CvMat hls::Window 形 式 か ら のデータ を OpenCV の<br />
CvMat 形 式 に 変 換<br />
IplImage2AXIvideo OpenCV の IplImage 形 式 か ら のデータ を AXI<br />
ビデオ ス トリーム (hls::stream) 形 式 に 変 換<br />
IplImage2hlsMat OpenCV の IplImage 形 式 か ら のデータ を<br />
hls::Mat 形 式 に 変 換<br />
高 位 合 成 japan.xilinx.com 114<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐19 : HLS ビデオ ライブラリ<br />
関 数 のタ イ プ 関 数 精 度 (ULP)<br />
AXI4-Stream AXIvideo2Mat hls::Mat 形 式 と し て 格 納 さ れた 画 像 データ を<br />
AXI4 ビデオ ストリーム 形 式 (hls::stream) に 変<br />
換<br />
AXI4-Stream Mat2AXIvideo AXI4 ビデオ ストリーム (hls::stream) 形 式 で 格<br />
納 さ れた 画 像 データ を hls::Mat 形 式 の 画 像 に 変<br />
換<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
AbsDiff 2 つの 入 力 画 像 、 src1 および src2 間 の 絶 対 的 な<br />
違 いを 計 算 し て、 結 果 を dst に 保 存<br />
AddS エレメン ト ごとの 画 像 src およびスカラー scl<br />
の 合 計 を 計 算<br />
AddWeighted 2 つの 画 像 src1 と src2 の 重 み 付 き のエレ メ ン ト<br />
ごとに 合 計 を 計 算<br />
And 2 つの 画 像 、 src1 および src2 のビ ッ ト の 論 理 積<br />
をエレ メ ン ト ごとに 計 算<br />
Avg 画 像 src のエレ メ ン ト の 平 均 を 計 算<br />
AvgSdv 画 像 src のエレ メ ン ト の 平 均 を 計 算<br />
Cmp 2 つの 入 力 画 像 、 src1 と src2 のエレ メ ン ト ご と<br />
の 比 較 を 実 行<br />
CmpS 入 力 画 像 src のエレ メ ン ト と 入 力 値 の 比 較 を 実<br />
行 し、 結 果 を dst に 保 存<br />
CornerHarris この 関 数 は、Harris エッジ/コーナー 検 出 器 を イ<br />
ンプリ メ ン ト<br />
CvtColor カ ラー 画 像 と グ レース ケール 画 像 を 変 換<br />
Dilate カーネル 内 で 構 築 さ れた 指 定 さ れた 構 造 エレ<br />
メ ン ト を 使 用 し て 画 像 src を 拡 張<br />
Duplicate 入 力 画 像 src を 2 つの 出 力 画 像 dst1 と dst2 にコ<br />
ピーし、 2 つのデータ パスの 分 岐 点 に 使 用<br />
EqualizeHist 各 フレームのヒ ス ト グラムを 計 算 し、 次 のフ<br />
レームの 範 囲 を 正 規 化 する ために 使 用<br />
Erode<br />
カーネル 内 で 構 築 さ れた 指 定 さ れた 構 造 エレ<br />
メ ン ト を 使 用 し て 画 像 src を 削 減<br />
FASTX FAST コーナー 検 出 器 を イ ンプ リ メ ン ト し、<br />
コーナーの masuk ま たは 座 標 の 配 列 を 生 成<br />
Filter2D 指 定 し たカーネルを 使 用 し て 任 意 線 形 フ ィ ル<br />
ターを 画 像 src に 適 用<br />
GaussianBlur 正 規 化 さ れた 2D Gaussian Blur フィルターを 入<br />
力 に 適 用<br />
Harris Harris エ ッ ジ ま たはコーナー 検 出 器 を イ ンプ リ<br />
メント<br />
HoughLines2 ハフ ラ インの 変 換 をインプリ メ ン ト<br />
高 位 合 成 japan.xilinx.com 115<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐19 : HLS ビデオ ライブラリ<br />
関 数 のタ イ プ 関 数 精 度 (ULP)<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
Integral 積 分 画 像 の 計 算 を イ ンプ リ メ ン ト<br />
InitUndistortRectifyMap パラ メーターのセッ トに 基 づいて map1 および<br />
map2 を 生 成 (map1 および map2 は hls::Remap()<br />
に 最 適 な 入 力 )<br />
最 大 値 2 つの 入 力 画 像 、 src1 および src2 のエレ メ ン ト<br />
ご との 最 大 を 計 算 して、 結 果 を dst に 保 存<br />
MaxS 入 力 画 像 src のエレ メ ン ト と 入 力 値 の 最 大 を 計<br />
算 し、 結 果 を dst に 保 存<br />
Mean 画 像 src のエレ メ ン ト の 平 均 を 計 算 し、 結 果 の<br />
スカラーの 最 初 のチャネル 値 を 戻 す<br />
Merge 複 数 のシングルチャネル 画 像 から マルチチャ<br />
ネル 画 像 dst を 作 成<br />
最 小 値 2 つの 入 力 画 像 、 src1 および src2 のエレ メ ン ト<br />
ご との 最 小 を 計 算 して、 結 果 を dst に 保 存<br />
MinMaxLoc グ ローバル 最 小 値 および 最 大 値 と、 入 力 画 像<br />
src でのそれ ら の 位 置 を 検 出<br />
MinS 入 力 画 像 src のエレ メ ン ト と 入 力 値 の 最 小 を 計<br />
算 し、 結 果 を dst に 保 存<br />
Mul 2 つの 入 力 画 像 、 src1 と src2 のエレ メ ン ト ご と<br />
の 積 を 計 算<br />
Not 画 像 src のエレ メ ン ト ご と のビ ッ ト 反 転 を 実 行<br />
PaintMask デスティネーシ ョ ン 画 像 の 各 ピクセルを color<br />
(mask が 0 でない 場 合 ) ま たは 入 力 画 像 か ら の<br />
該 当 ピ ク セルのいずれかに 設 定<br />
Range 次 の 規 則 を 使 用 し て 画 像 src のすべての 値 を 設<br />
定 し て、 結 果 を 画 像 dst として 戻 す<br />
Remap 指 定 し た リ マ ッ プに 従 って ソ ース 画 像 src をデ<br />
スティネーショ ン 画 像 dst にリマップ<br />
Reduce 2D 画 像 src を dim ( 次 元 ) と 共 にベクター dst ま<br />
で 削 減<br />
Resize 入 力 画 像 を 双 線 補 間 を 使 用 し て 出 力 画 像 のサ<br />
イズに 変 更<br />
セッ ト 画 像 src のエレ メ ン ト を 任 意 のスカラー 値 scl<br />
に 設 定<br />
Scale 入 力 画 像 src をオプシ ョ ンの 線 形 変 換 を 使 用 し<br />
て 変 換<br />
Sobel 水 平 ま たは 垂 直 方 向 の Sobel フィルターを 計 測<br />
し、 水 平 ま たは 垂 直 方 向 の 導 関 数 を 戻 す<br />
Split 複 数 のシン グルチャ ネル 画 像 か ら のマルチ<br />
チャネル 画 像 src を 分 割<br />
SubRS スカラー 値 scl と 画 像 src 間 の 違 いを 計 算<br />
高 位 合 成 japan.xilinx.com 116<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐19 : HLS ビデオ ライブラリ<br />
関 数 のタ イ プ 関 数 精 度 (ULP)<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
SubS 画 像 src とスカラー 値 scl のエレ メ ン ト 間 の 違<br />
いを 計 算<br />
Sum 画 像 のエレ メ ン ト を 合 計 を 計 算<br />
Threshold シングルチャネル 画 像 の 各 エレ メン トに 対 し<br />
て 固 定 レベルのし きい 値 を 実 行<br />
0 画 像 src のエレ メ ン ト を 0 に 設 定<br />
HLS ビデオ データ 型 と 関 数 は、 hls 名 前 空 間 ま たはス コープ 付 き 命 名 規 則 を 使 用 し て 記 述 し ます。<br />
• hls 名 前 空 間 は 次 の よ う に 使 用 し ます。<br />
#include “hls_video.h”<br />
hls::rgb_8 video_data[1920][1080]<br />
hls::LineBuffer Buff_A;<br />
hls::Scale(img_2, img_3, 2, 0);<br />
• ス コープ 付 き 命 名 規 則 は、 次 の よ う に 使 用 し ます。<br />
#include “hls_linear_algebra.h”<br />
using namespace hls;// Namespace specified after the header files<br />
rgb_8 video_data[1920][1080]<br />
LineBuffer Buff_A;<br />
Scale(img_2, img_3, 2, 0);<br />
推 奨 : 推 奨 さ れる コー ド 記 述 方 法 は、 hls 名 前 空 間 の 方 です。<br />
IP ライブラリ<br />
Vivado HLS では FPGA に 合 成 する 際 に、 優 れたパフ ォーマン スのザ イ リ ン ク ス IP の 利 点 が 生 か されます。 次 の 表 に<br />
は、 C コー ド か ら 直 接 推 論 可 能 な C ライブラリとザイリンクス IP を リストします。<br />
次 の 表 には、 提 供 されている ラ イブラ リ を ま と めています。<br />
表 1‐20 : 任 意 精 度 デー タ 型 ラ イ ブ ラ リ<br />
ライブラリ ヘッダー ファ<br />
イル<br />
hls_fft.h<br />
hls_fft.h<br />
ap_shift_reg.h<br />
説 明<br />
ザイ リ ンクス FFT IP LogiCore を C でシ ミ ュレーシ ョ ン、ザイ リ ンク ス LogiCore<br />
ブロックを 使 用 してインプリ メン ト 可 能<br />
ザイ リ ンクス FIR IP LogiCore を C でシ ミ ュレーシ ョ ン、ザイ リ ンク ス LogiCore<br />
ブロックを 使 用 してインプリ メン ト 可 能<br />
ザイ リ ンクス SRL プリ ミティブを 使 用 して 直 接 インプリ メントされるシフト<br />
レジスタをインプリ メン トするための C++ クラスを 提 供<br />
ザイ リ ンクス FFT および FIR IP は、 hls 名 前 空 間 ま たはス コープ 付 き 命 名 規 則 を 使 用 し て 記 述 し ます。<br />
• hls 名 前 空 間 は 次 の よ う に 使 用 し ます。<br />
高 位 合 成 japan.xilinx.com 117<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
#include “hls_fft.h”<br />
#include “hls_fir.h”<br />
//Call the FFT Function<br />
hls::fft (xn1, xk1, &fft_status1, &fft_config1);<br />
// Create an instance of the FIR<br />
static hls::FIR fir1;<br />
• ス コープ 付 き 命 名 規 則 は、 次 の よ う に 使 用 し ます。<br />
#include “hls_fft.h”<br />
#include “hls_fir.h”<br />
using namespace hls;// Namespace specified after the header files<br />
//Call the FFT Function<br />
fft (xn1, xk1, &fft_status1, &fft_config1);<br />
// Create an instance of the FIR<br />
static FIR fir1;<br />
推 奨 : 推 奨 さ れる コー ド 記 述 方 法 は、 hls 名 前 空 間 の 方 です。<br />
シフ ト レジスタ クラスは、hls 名 前 空 間 を 使 用 し な く て も 直 接 使 用 で き ます。<br />
デザイ ン 解 析 および 最 適 化<br />
どの 設 計 手 法 で も 最 後 は、 デザ イ ン 解 析 と 改 善 のための 生 産 的 なプ ロ セス を 使 用 し ます。 C シミュレーション、C デ<br />
バッグ、 解 析 、 RTL 検 証 、 IP パッケージに Vivado HLS を 使 用 するプロセスについては、 「Vivado HLS の 使 用 」 を 参<br />
照 してください。 デザイン パフ ォーマン ス を 作 成 し て 改 善 する プ ロ セスは、 次 の よ う にま と め る こ と がで き ます。<br />
• C コードをシ ミ ュレーシ ョ ンして、 アルゴ リ ズムが 正 しいかど うかを 検 証<br />
• 最 初 のデザ イ ン を 合 成<br />
• デザイ ン パフォーマンスを 解 析<br />
• 新 し い ソ リ ューシ ョ ン を 作 成 し て 最 適 化 指 示 子 を 追 加<br />
• 新 しいソ リ ューシ ョ ンのパフォーマンスを 解 析<br />
• 要 件 が 満 た さ れる まで 新 し い ソ リ ューシ ョ ンおよび 最 適 化 指 示 子 を 作 成 し 続 け る<br />
• RTL が 正 しいかど う かを 検 証<br />
• デザイ ンを IP としてパッケージして、 システムに 含 有<br />
最 も 生 産 的 な 手 法 は、 C シ ミ ュ レーシ ョ ンに 時 間 を 費 やし て、 アルゴ リ ズム を 検 証 し て、 合 成 前 に 結 果 が 正 し いかど<br />
う かを 確 認 する 方 法 です。 C シ ミ ュ レーシ ョ ンの 速 度 は、 高 位 合 成 デザ イ ン フ ローの 主 な 利 点 です。 C デザイ ンが 正<br />
し いかど う かを 確 認 する のに 時 間 を 費 やす 方 が、 間 違 った 仕 様 に よ るパフ ォーマン ス 問 題 をデバ ッ グする のに 時 間 を<br />
費 やすよ り も 生 産 性 が 良 い 方 法 です。<br />
レポー ト 確 認 の 利 便 性<br />
最 初 の 合 成 結 果 が 達 成 さ れた ら、 まず 結 果 を 確 認 し ます。 合 成 レポー ト に 未 知 の 値 ( マークで 表 示 ) が 含 まれる 場 合<br />
は、 それら を 解 決 する 必 要 があ り ます。 最 適 化 指 示 子 でデザ イ ン パフォーマンスが 改 善 されるかど うか 決 定 するに<br />
は、 ソ リ ューシ ョ ン を 比 較 で き る よ う にする こ と が 重 要 です。 比 較 する には、 レ イ テンシの 値 がわかってい る 必 要 が<br />
あります。<br />
ループに 可 変 境 界 があ る 場 合 は、Vivado HLS では 終 了 する までにかか る 反 復 回 数 を 決 定 で き ません。ループの 1 反 復<br />
のレ イ テンシがわかってい る 場 合 で も、 可 変 境 界 があ る と 、 ループすべての 反 復 を 終 了 する のにかか る レ イ テンシは<br />
判 別 で き ません。<br />
高 位 合 成 japan.xilinx.com 118<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
デザイ ンのループを 確 認 し ます。 合 成 レポー ト の [Latency] → [Details] → [Loops] セ ク シ ョ ンでループを 確 認 し ます。<br />
階 層 の 上 方 向 へ こ の 未 知 の 値 を 伝 搬 さ れてい く ので、 未 知 のレ イ テンシを レポー ト するループ 階 層 の 最 下 位 ループか<br />
ら 開 始 し て く だ さ い。 ループは、 階 層 の 下 位 にあ る 可 能 性 があ り ます。 レ ポー ト の [Latency] → [Details] → [Instance]<br />
セ ク シ ョ ンで 下 位 関 数 が 未 知 の 値 を 表 示 し ていないかど う かを 確 認 し ます。 未 知 のレ イ テンシ 値 を 表 示 する 関 数 のレ<br />
ポー ト を 開 いて、 ループが 識 別 さ れる までプ ロ セス を 繰 り 返 し ます。<br />
合 成 レポー ト の 代 わ り に、 [Analysis] 表 示 モー ド を 使 用 する こ と も で き ます。<br />
可 変 境 界 ループが 認 識 さ れた ら、 LOOP_TRIPCOUNT 指 示 子 を 追 加 し てループの 反 復 回 数 を 指 定 する か、 C コードに<br />
アサーシ ョ ン を 使 用 し て 制 限 を 指 定 し ます。 詳 細 は、 「assert の 使 用 」 を 参 照 して く ださい。 LOOP_TRIPCOUNT 指 示<br />
子 を 使 用 する 場 合 は、 ソ ース コードに pragma として 追 加 します。 こ の 指 示 子 は、 すべての ソ リ ューシ ョ ンで 必 要 と<br />
されます。<br />
可 変 境 界 を 含 むその 他 のループがあ る と わかっ てい る 場 合 は、 こ れ ら のループに 対 し て 反 復 制 限 を 指 定 し て く だ さ<br />
い。 指 定 し ない 場 合 は、 最 上 位 のレ ポー ト に 実 数 が 含 まれる まで、 合 成 を 繰 り 返 し て、 同 じ ボ ト ムア ッ プ プロセスを<br />
使 用 し ます。<br />
デザイ ン 解 析<br />
デザイ ン 解 析 は、 次 の 3 つの 手 法 で 実 行 で き ます。<br />
• 合 成 レポー ト<br />
• [Analysis] 表 示 モー ド<br />
• RTL シミュレーションの 波 形<br />
ヒント : 結 果 を 解 析 する 前 に、 コ ン ソ ール ウ ィンドウかログ フ ァ イルでどの 最 適 化 が 実 行 さ れた (または 飛 ばされた<br />
か、 エラーになったか) を 確 認 し ます。<br />
合 成 レ ポー ト および [Analysis] 表 示 モー ド を 使 用 する と 、 レ イ テンシ、 間 隔 、 および リ ソース 概 算 が 解 析 で き ます。<br />
ソ リ ューシ ョ ンは 複 数 あ る 場 合 は、 GUI の [Compare Reports] ボタ ンを 使 用 して、 ソ リ ューシ ョ ンを 並 べて 比 較 し ま<br />
す。 こ の 機 能 は [Analysis] 表 示 モー ド と 同 様 、 GUI からしか 使 用 できませんが、 vivado_hls -p project_name<br />
を 使 用 する と 、 バ ッ チ モー ド を 使 用 し て 作 成 し たプ ロ ジ ェ ク ト も GUI で 開 いて 解 析 で き ます。<br />
こ れまで と 同 様 、 階 層 ご と に 改 善 し てい く 方 法 が 効 果 的 です。 最 上 位 か ら 開 始 し て、 レ イ テンシ、 間 隔 、 エ リ アのい<br />
ずれかに 対 し て 最 も 貢 献 する タ ス ク がどれか 決 定 し、 それら の タ ス ク の 詳 細 を 確 認 し ます。 目 標 を 達 成 する ためにパ<br />
フ ォーマン ス を 改 善 する 余 地 があ る と 判 断 し たループま たは 関 数 が 見 つか る まで、 階 層 を 繰 り 返 し 下 方 向 に 確 認 し て<br />
い き ます。 下 位 関 数 ま たはループを 改 善 する と 、 上 位 の も の も 徐 々に 改 善 さ れてい き ます。<br />
[Analysis] 表 示 モー ド を 使 用 し た 方 が、 合 成 レポー ト よ り も 階 層 の 上 下 移 動 が 簡 単 です。 ま た、 こ のモー ド では、 ス<br />
ケジ ュール さ れた 操 作 および リ ソース 使 用 量 が 詳 細 に 表 示 さ れ、 C コー ド の 該 当 部 分 を 表 示 で き る よ う になっていま<br />
す。 [Analysis] 表 示 モー ド に 関 する 詳 細 は、 表 1-4 の 「デザ イ ン 解 析 」 および 「デザ イ ン 最 適 化 」 チュー ト リ アルを 参<br />
照 してください。<br />
まず、 [Analysis] 表 示 モー ド の 詳 細 な ス ケジ ュール 表 示 を 使 用 し て、 マ ク ロ レベルのビヘイビアーを 詳 細 に 確 認 する<br />
と 、 効 果 的 な こ と があ り ます。 操 作 は、 通 常 コー ド が 実 行 さ れる 順 番 に リ ス ト さ れます。 Vivado HLS では、 すべてを<br />
クロック サイクル 1 でスケジュールし、 できれば 1 クロック サ イ ク ルで 終 了 する よ う に し よ う と し ます。<br />
• 操 作 が 左 上 か ら 右 下 にジグザグ 方 向 に 実 行 さ れてい る 場 合 は、データ 依 存 か コー ド 生 来 の タ ス ク が 実 行 さ れた 可<br />
能 性 があ り ます。 各 操 作 が 終 了 し ない と 、 次 の 操 作 は 開 始 で き ません。<br />
• 操 作 が 次 々にス ケジ ュール さ れていて、 多 く が 同 時 に 突 然 実 行 さ れた り する 場 合 は、 ボ ト ルネ ッ ク (I/O ポー ト や<br />
RAM ポー ト など) があ る 可 能 性 があ り 、 すべてが 並 列 で 実 行 で き る よ う にな る まで、 かな り 長 い 間 待 機 する 必 要<br />
があ り ます。<br />
デザ イ ンの 解 析 には、 合 成 レポー ト と [Analysis] 表 示 モードのほかに、 RTL シ ミ ュ レーシ ョ ンの 波 形 も 使 用 で き ま<br />
す。 RTL 検 証 中 には、 ト レース フ ァ イルが 保 存 さ れ、 適 切 なビ ューアーを 使 用 する と 表 示 で き ます。 詳 細 は、<br />
表 1-4 の 「RTL 検 証 」 のチュー ト リ アルを 参 照 し て く だ さ い。 ま たは、 IP パッケージをエクスポート して、<br />
project_name/solution_name/impl/ip/verilog or vhdl フォルダーの Vivado RTL プロジェク ト を 開 きま<br />
す。 C/RTL 協 調 シ ミ ュ レーシ ョ ンが 実 行 さ れた ら、 こ のプ ロ ジ ェ ク ト には RTL テス トベンチが 含 まれます。<br />
高 位 合 成 japan.xilinx.com 119<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
RTL を 使 用 したデザイン 解 析 には、 あま り 時 間 をかけないよ う にして く ださい。 C コー ド を 変 更 する か 最 適 化 指 示 子<br />
を 追 加 する と 、 合 成 を 実 行 し 直 し た 後 に、 異 な る 名 前 で さ ま ざ ま な RTL デザイ ンが 生 成 される 可 能 性 が 高 く な り ま<br />
す。 RTL の 詳 細 を 理 解 する ために 時 間 を 費 やす と 、 新 し いデザ イ ンが 生 成 さ れて、 別 の 名 前 と 構 造 が し よ う さ れる た<br />
びに、 何 度 も 時 間 を 費 やす こ と になって し まいます。<br />
要 約 する と 、 階 層 を 下 に 向 かって さ ら に 最 適 化 で き そ う な タ ス ク を 見 つけ る こ と が 推 奨 さ れています。<br />
デザイ ン 最 適 化<br />
最 適 化 を 実 行 する 前 に、 プ ロ ジ ェ ク ト 内 に 新 し い ソ リ ューシ ョ ン を 作 成 する こ と をお 勧 め し ます。 ソ リ ューシ ョ ン を<br />
使 用 する と 、 結 果 のセ ッ ト を 異 な る 結 果 のセ ッ ト と 比 較 で き ます。 結 果 だけでな く 、 ロ グ ファイルおよび 出 力 RTL<br />
ファイルも 比 較 できるようになります。<br />
パフ ォーマン スの 優 れたデザ イ ンの 基 本 的 な 最 適 化 ス ト ラ テジは、 次 の と お り です。<br />
• 最 初 ま たは 基 本 のデザ イ ン を 作 成<br />
• ループおよび 関 数 をパイ プ ラ イ ン<br />
• 配 列 のボ ト ルネ ッ ク やループ 依 存 などパイ プ ラ イ ン を 制 限 する 問 題 を 解 決 (ARRAY_PARTITION および<br />
DEPENDECE 指 示 子 を 使 用 )<br />
• DATAFLOW 最 適 化 を 適 用 し てループおよび 関 数 を 同 時 に 実 行<br />
• パフ ォーマンスを 満 たすためにコード を 変 更 する 必 要 のある こ と も あ り<br />
• データ フ ロー メモリ チャネルのサイズを 削 減 し、 ALLOCATION および RESOUCES 指 示 子 を 使 用 し て さ ら にエ<br />
リアを 削 減<br />
要 約 する と 、 エ リ ア 削 減 よ り も 前 に、 まず 常 にパフ ォーマン ス を 満 たすよ う にする こ と です。 ス ト ラ テジが よ り 少 な<br />
い リ ソースでデザ イ ン を 作 成 する こ と にあ る 場 合 は、 単 にパフ ォーマン ス を 改 善 する 手 順 を 飛 ばし ます。<br />
最 適 化 プ ロ セス 中 は、 合 成 後 にコ ン ソールへの 出 力 (またはログ ファイル) を 確 認 する こ と をお 勧 めします。 Vivado<br />
HLS では、 最 適 化 で 指 定 し たパフ ォーマン ス 目 標 に 達 成 で き ない 場 合 、 目 標 が 自 動 的 に 緩 め ら れ (ク ロ ッ ク 周 波 数 は<br />
例 外 )、 デザ イ ンが 達 成 で き る 目 標 で 作 成 さ れます。 こ のため、 合 成 か ら の 出 力 を 確 認 し て、 どの よ う な 最 適 化 が 実<br />
行 さ れたのか 理 解 し てお く こ と が 重 要 です。<br />
最 適 化 を 適 用 する 際 の 詳 細 は、 次 を 参 照 し て く だ さ い。<br />
• 最 適 化 の 適 用 、 Tcl 指 示 子 ま たは C コードのプラグマの 使 用 に 関 する 詳 細 は、「 最 適 化 指 示 の 適 用 」 を 参 照 して く<br />
ださい。<br />
• パフ ォーマン ス を 達 成 する ための 最 適 化 指 示 子 の 適 用 箇 所 については、 「 合 成 ス ト ラ テジ」 を 参 照 して く ださい。<br />
• 最 適 化 の 詳 細 な 説 明 については、 「デザ イ ン 最 適 化 」 を 参 照 して く ださい。<br />
ラ ン タ イム と 容 量 の 改 善<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ンで 問 題 があ った 場 合 は、 「RTL 検 証 」 の reduce_diskspace の 説 明 を 参 照 し て く だ さ<br />
い。 こ のセ ク シ ョ ンでは、 合 成 ラ ン タ イ ムに 関 する 問 題 について 説 明 し ます。<br />
Vivado HLS では、 操 作 が 階 層 別 にス ケジ ュール さ れます。 ループ 内 の 操 作 がス ケジ ュール さ れてか ら、 ループ、 下 位<br />
関 数 、 関 数 を 使 用 する 操 作 がス ケジ ュール さ れます。 高 位 合 成 の ラ ン タ イ ムは、 次 の よ う な 場 合 に 増 加 し ます。<br />
• スケジュールするオブジェク トが 多 い<br />
• 自 由 度 および 可 能 性 が 多 く て 確 認 に 時 間 がかか る<br />
Vivado HLS では、オブジ ェ ク ト がス ケジ ュール さ れます。オブジ ェ ク ト が 浮 動 小 数 点 の 乗 算 ま たは 単 一 のレ ジ ス タ で<br />
あ って も、ス ケジ ュール さ れるのはオブジ ェ ク ト です。 浮 動 小 数 点 の 乗 算 は 終 了 に 複 数 サ イ ク ルかか る 可 能 性 があ り 、<br />
高 位 合 成 japan.xilinx.com 120<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
イ ンプ リ メ ン ト に 多 く の リ ソースが 使 用 されますが、 ス ケジ ュールのレベルでは 1 つのオブジェ ク ト と し て 扱 われま<br />
す。<br />
ループの 展 開 および 配 列 の 分 割 に よ り 、 ス ケジ ュールする オブジ ェ ク ト は 増 え る ので、 ラ ン タ イ ムが 増 加 する 可 能 性<br />
は 高 くなり ます。 インライン 関 数 でもこの 階 層 レベルでスケジュールするオブジェク トは 増 えるので、 ランタイムも<br />
増 加 し ます。 こ れ ら の 最 適 化 は、 パフ ォーマン ス を 満 たすためには 必 要 であ る か も しれませんが、 すべての 配 列 を 分<br />
割 したり、 すべてのループを 展 開 したり、 すべての 関 数 をインライン 化 する 場 合 は、 ランタイムが 増 加 してしま う 可<br />
能 性 が 高 く な る ので、 注 意 が 必 要 です。 こ れら の 最 適 化 は、 前 述 の 最 適 化 ス ト ラ テジを 使 用 し、 注 意 し て 適 用 し て く<br />
ださい。<br />
パフ ォーマン ス を 達 成 する ために 配 列 を 分 割 する 必 要 があ る 場 合 は、 config_array_partition に<br />
throughput_driven オプシ ョ ン を 使 用 し て、 スループ ッ ト 要 件 に 基 づいた 配 列 のみを 分 割 する よ う に し て く だ さ い。<br />
ループを 展 開 する 必 要 があ る 場 合 、 ま たは 上 位 階 層 で PIPELINE 指 示 子 が 使 用 さ れて 自 動 的 にループが 展 開 さ れる 場<br />
合 は、 ループ 本 体 を 別 の 関 数 と して 取 り 込 むこ と を 考 慮 して く ださい。 これによ り、 ループが 展 開 されたと きにロ<br />
ジ ッ ク の コ ピーが 複 数 作 成 さ れる のではな く 、 すべての ロ ジ ッ ク が 1 つの 関 数 に 含 まれる よ う にな り 、 定 義 さ れた 階<br />
層 のオブジェ ク ト の 1 セ ッ ト は 早 めにス ケジ ュール さ れる よ う にな り ます。 展 開 さ れたループがパイ プ ラ イ ン 領 域 で<br />
使 用 さ れる 場 合 は、 こ の 関 数 をパイ プ ラ イ ンする よ う に し て く だ さ い。<br />
コー ド の 自 由 度 も ラ ン タ イ ムに 影 響 する こ と があ り ます。 Vivado HLS は、 スループ ッ ト が 最 も 高 く 、 レ イ テンシが 最<br />
も 低 く 、 エ リ アが 最 小 のデザ イ ン を 見 つけ る タ ス ク をデフ ォル ト で 与 え ら れた 上 級 設 計 者 の よ う な も のです。 高 位 合<br />
成 の 制 約 が 増 え る と 、 探 すオプシ ョ ンが 少 な く な る ので、 実 行 速 度 も 速 く な り ます。 コー ド 内 のス コープ (ループ、<br />
関 数 ま たは 領 域 ) に 対 し て レ イ テンシ 制 約 を 使 用 する こ と を 考 慮 し て く だ さ い。 LATENCY 指 示 子 を 同 じ 最 小 値 およ<br />
び 最 大 値 で 設 定 する と 、 そのス コープ 内 で 可 能 性 のあ る 最 適 化 の 検 索 が 減 少 し ます。<br />
最 後 に、 config_schedule コンフィギュレーションでスケジュール 中 に 使 用 されるエフォート レベルを 調 整 し ます。 こ<br />
れに よ る 影 響 は 上 記 の 手 法 よ り も 少 ないですが、 考 慮 する 価 値 はあ り ます。 デフ ォル ト のス ト ラ テジは、 Medium に<br />
設 定 さ れています。<br />
この 設 定 を Low にする と、 Vivado HLS では 最 初 の 結 果 を 改 善 する のにかか る 時 間 が 削 減 さ れます。 特 に 操 作 が 多 い<br />
ために、 確 認 する 組 み 合 わせが 多 く なって し ま う よ う な 場 合 は、 Low を 使 用 する こ と をお 勧 め し ます。 デザ イ ンは 理<br />
想 的 にはな ら ないか も しれませんが、 要 件 は 満 た し て、 理 想 に 近 い 状 態 にはな る 可 能 性 があ り ます。 Low 設 定 で 進 展<br />
し た ら、 デフ ォル ト 設 定 を 使 用 し て 最 終 的 な 結 果 を 作 成 し ます。<br />
Vivado HLS で run ス トラテジが High に 設 定 さ れてい る 場 合 、 制 約 が 満 た さ れた 後 で も、 さ ら に 小 型 ま たは 高 速 なデ<br />
ザ イ ンが 作 成 で き る かど う かを 判 断 する ため、 追 加 で CPU サ イ ク ルおよび メ モ リ が 使 用 さ れます。 こ の 作 業 に よ り<br />
さ ら に 質 の 高 いデザ イ ンが 作 成 さ れる 可 能 性 があ り ますが、 完 了 までに 時 間 がかか り 、 ま た よ り 多 く の メ モ リ が 必 要<br />
にな り ます。 僅 差 で 目 標 を 満 たすこ と がで き ないデザ イ ンや、 いろいろな 最 適 化 の 組 み 合 わせが 可 能 なデザ イ ンであ<br />
れば、 こ のス ト ラ テジは 有 益 と いえ るで し ょ う 。 通 常 は、 run ス トラテジはデフォルトの Medium のままにしておく<br />
ことをお 勧 めします。<br />
イ ン タ ーフ ェ イ スの 管 理<br />
C ベース デザ イ ンでは、 すべての 入 力 および 出 力 操 作 がゼ ロ 時 間 で、 フ ォーマル 関 数 引 数 に よ り 実 行 さ れます。 RTL<br />
デザ イ ンでは、 同 じ 入 力 および 出 力 操 作 をデザ イ ン イ ン ターフ ェ イ スのポー ト を 介 し て 実 行 する 必 要 があ り ます。 通<br />
常 は、 特 定 の I/O ( 入 力 / 出 力 ) プ ロ ト コルを 使 用 し て 実 行 さ れます。<br />
Vivado HLS では、 使 用 する I/O プ ロ ト コルを 指 定 する のに 次 の 2 つの 方 法 がサポー ト さ れます。<br />
• インターフェイス 合 成 : 効 率 的 な 業 界 標 準 イ ン ターフ ェ イ スに 基 づいてポー ト インターフェイスが 作 成 されま<br />
す。<br />
• 手 動 イ ン ターフ ェ イ ス 指 定 : イ ン ターフ ェ イ スの 動 作 を 入 力 ソース コー ド で 明 示 的 に 指 定 し ます。 こ れに よ り 、<br />
任 意 の I/O プ ロ ト コルが 使 用 で き る よ う にな り ます。<br />
° このソ リ ューショ ンは SystemC デザイ ンで も 提 供 されてお り 、 I/O 制 御 信 号 が イ ン ターフ ェ イ ス 宣 言 で 指 定<br />
さ れ、 その 動 作 はコー ド で 指 定 さ れます。<br />
高 位 合 成 japan.xilinx.com 121<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
° Vivado HLS では、 こ の イ ン ターフ ェ イ ス 指 定 方 法 を C および C++ デザイ ンで もサポー ト し ています。<br />
インターフェイス 合 成<br />
最 上 位 関 数 が 合 成 さ れる と 、 関 数 への 引 数 (またはパラ メーター) は RTL ポー ト に 合 成 されます。 このプロセスは、<br />
イ ン ターフ ェ イ ス 合 成 と 呼 ばれます。<br />
イ ン タ ーフ ェ イ ス 合 成 の 概 要<br />
次 の コー ド は、 イ ン ターフ ェ イ ス 合 成 全 体 の 概 要 を 示 し ています。 #include sum_io.h<br />
dout_t sum_io(din_t in1, din_t in2, dio_t *sum) {<br />
dout_t temp;<br />
*sum = in1 + in2 + *sum;<br />
temp = in1 + in2;<br />
}<br />
return temp;<br />
この 例 には、 次 が 含 まれます。<br />
• 値 渡 し 入 力 2 つ (in1 および in2)<br />
• 読 み 込 みおよび 書 き 出 し 両 方 のポ イ ン ター (sum)<br />
• 関 数 の 戻 り 値 return (temp の 値 )<br />
デフ ォル ト の イ ン ターフ ェ イ ス 合 成 設 定 では、 デザ イ ンは 図 1-47 に 示 すポー ト を 使 用 し て RTL ブロックに 合 成 され<br />
ます。<br />
X-Ref Target - Figure 1-47<br />
図 1‐47 : デフ ォル ト のイ ン タ ーフ ェ イ ス 合 成 後 の RTL ポー ト<br />
高 位 合 成 japan.xilinx.com 122<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
Vivado HLS では、 RTL デザイ ンで 次 の 3 つの タ イ プのポー ト が 作 成 さ れます。<br />
• クロックおよびリセット ポー ト : ap_clk および ap_rst です。<br />
• ブロック レベルのインターフェイス プロ ト コル : 図 1-47 では、 ap_start、 ap_done、 ap_ready および<br />
ap_idle で 示 されています。<br />
• ポー ト レベルのインターフェ イス プロ ト コル : こ れ ら は 最 上 位 関 数 と 関 数 の 戻 り 値 ( 関 数 に 戻 り 値 があ る 場 合 )<br />
の 各 引 数 ご と に 作 成 さ れます。 こ の 例 の 場 合 は、in1、in2、sum_i、sum_o、sum_o_ap_vld および ap_return<br />
です。<br />
クロックおよびリセッ ト ポー ト<br />
操 作 が 1 サ イ ク ルでは 終 了 し ない 場 合 に 作 成 さ れます。<br />
[Solution] → [Solution Settings] → [General] および config_interface コ ン フ ィ ギ ュ レーシ ョ ン を 使 用 する と 、 チ ッ<br />
プイネーブル ポー ト をオプシ ョ ンでブ ロ ッ ク 全 体 に 追 加 で き ます。<br />
リセットの 操 作 は、config_rtl コ ン フ ィ ギ ュ レーシ ョ ンで 制 御 さ れます。 リ セ ッ ト コンフィギュレーションの 詳 細 は、<br />
「クロッ ク、 リセッ ト、 および RTL 出 力 」 を 参 照 して く ださい。<br />
ブロック レベルのインターフ ェイス プロト コル<br />
ブロック レベルのインターフェ イス プ ロ ト コルは、 デフ ォル ト でデザ イ ンに 追 加 さ れます。 こ れ ら の 信 号 はポー ト<br />
レベルの I/O プ ロ ト コル と は 別 にブ ロ ッ ク を 制 御 し ます。 こ れら のポー ト は、ブ ロ ッ ク のデータ 処 理 の 開 始 (ap_start)、<br />
新 し い 入 力 を 受 け 取 る 準 備 完 了 (ap_ready)、デザインのアイドリング 状 態 (ap_idle)、 操 作 終 了 (ap_done) をそれぞれ 示<br />
します。<br />
ポー ト レベルのインターフェイス プロト コル<br />
こ の 信 号 グループは、 データ ポー ト です。 I/O プロ ト コルは、 C 引 数 のタイプとデフォルトによって 作 成 されます。<br />
図 1-49 は、 可 能 性 のあ る I/O プロ ト コルをすべてリ ス ト しています。 ブロック レベルのプロ ト コルが 使 用 されてブ<br />
ロ ッ ク の 操 作 が 開 始 さ れた ら、 ポー ト レベルの I/O プ ロ ト コルを 使 用 し て、 データ をブ ロ ッ ク 内 外 に 送 信 で き ます。<br />
デフ ォル ト では、 入 力 の 値 渡 し 引 数 と ポ イ ン ターが 単 純 な ワ イ ヤ ポー ト と し て 合 成 さ れます。 ハン ドシェ イ ク 信 号 は<br />
関 連 付 け られません。 こ のため、 上 記 の 例 の 場 合 、 入 力 ポー ト は I/O プロ ト コルなしで、 データ ポー ト のみでイ ンプ<br />
リメントされます。ポートに I/O プロ ト コルがない 場 合 (デフ ォル ト でない 場 合 ま たはデザ イ ンに 元 々ない 場 合 )、 入<br />
力 データ は 読 み 込 まれる まで 安 定 し た ま まであ る 必 要 があ り ます。<br />
デフ ォル ト では、 出 力 ポ イ ン ターは 関 連 する 出 力 Valid 信 号 を 使 用 し て イ ンプ リ メ ン ト さ れ、 出 力 データ が 有 効 にな<br />
る タ イ ミ ン グ を 示 し ます。 上 記 の 例 の 場 合 、 出 力 ポー ト が 関 連 する 出 力 Valid ポー ト (sum_o_ap_vld) を 使 用 してイン<br />
プ リ メ ン ト さ れ、 いつポー ト のデータ が 有 効 になって 読 み 込 み 可 能 にな る かを 示 すよ う になっています。 出 力 ポー ト<br />
に 関 連 付 け られた I/O ポー ト がない 場 合 は、データ を 読 み 込 むタ イ ミ ングを 判 断 する のは 困 難 です。 出 力 には 常 に I/O<br />
プ ロ ト コルを 使 用 する よ う にする こ と をお 勧 め し ます。<br />
読 み 込 み と 書 き 出 し 両 方 を 実 行 する 関 数 引 数 は、 別 々の 入 力 および 出 力 ポー ト に 分 割 さ れます。 上 記 の 例 の 場 合 、sum<br />
は 入 力 ポー ト sum_i と 、 出 力 ポー ト sum_o と 、 関 連 する I/O プロ ト コル ポー ト の sum_o_ap_vld としてインプリ<br />
メントされます。<br />
関 数 に 戻 り 値 があ る 場 合 は、 戻 り 値 を 提 供 する ための ap_return がインプリ メン ト されます。 デザインが 1 つの ト ラ<br />
ンザクシ ョ ン (C 関 数 の 1 つの 実 行 に 該 当 ) を 終 了 する と 、 ブ ロ ッ ク レベルのプロ ト コルの ap_done を 使 用 して、 そ<br />
の 関 数 が 終 了 し たかど う かが 示 さ れます。 こ れは、 ap_return ポー ト のデータ が 有 効 で 読 み 込 み 可 能 であ る こ と も<br />
示 します。<br />
注 記 : 最 上 位 関 数 の 戻 り 値 はポ イ ン ターにはで き ません。<br />
たとえば、 図 1-48 のコードはタイ ミ ング ビヘイビア-を 示 しています (そのターゲッ ト テ ク ノ ロ ジ と ク ロ ッ ク 周 波 数<br />
でクロック サイクルごとに 1 つの 加 算 が 可 能 な 場 合 )。<br />
高 位 合 成 japan.xilinx.com 123<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-48<br />
• デザイ ンは ap_start が High にアサー ト される と 開 始 されます。<br />
• ap_idle 信 号 が Low にアサー ト さ れる と 、 デザ イ ンが 動 作 中 であ る こ と を 示 し ます。<br />
• 入 力 データ は 最 初 のサ イ ク ル 後 の ク ロ ッ ク で 読 み 込 まれます。 読 み 込 まれる タ イ ミ ングは Vivado HLS で 自 動 的<br />
にス ケジ ュール さ れます。 すべての 入 力 が 読 み 込 まれた ら、 ap_ready 信 号 がアサー ト さ れます。<br />
• 出 力 sum が 計 算 さ れる と 、 データ が 有 効 であ る こ と が 関 連 する 出 力 ハン ド シ ェ イ ク (sum_o_ap_vld) で 示 されま<br />
す。<br />
• 関 数 が 終 了 し た ら、ap_done がアサー ト さ れます。これに よ り ap_return のデータが 有 効 であ る こ と も 示 されます。<br />
• ap_idle ポー ト が High にアサー ト さ れる と 、 デザ イ ンが 再 び 開 始 さ れるのを 待 ってい る 状 態 であ る こ と を 示 し ま<br />
す。<br />
イ ン タ ーフ ェ イ ス 合 成 の I/O プロト コル<br />
図 1‐48 : デフォルト 合 成 での RTL ポー ト のタ イ ミ ング<br />
インターフェイス 合 成 で 作 成 されるインターフェイスのタイプは、C 引 数 のデータ 型 、 デフ ォル ト の イ ン ターフ ェ イ<br />
ス モードおよび INTERFACE 最 適 化 指 示 子 に よ って 異 な り ます。 図 1-49 は、 各 C 引 数 のデータ 型 で 指 定 で き る イ ン<br />
ターフェイス プロ ト コル モード を 示 し ています。<br />
高 位 合 成 japan.xilinx.com 124<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 内 の D は、 それが 各 データ 型 のデフ ォル ト の イ ン ターフ ェ イ ス モード であ る こ と を 意 味 し ます。 不 正 な イ ン ター<br />
フェイスが 指 定 されると、 Vivado HLS でメッセージが 表 示 され、 デフォルトのインターフェイス モード がイ ンプ リ<br />
メントされます。<br />
X-Ref Target - Figure 1-49<br />
図 1‐49 : デー タ 型 と イ ン タ ーフ ェ イ ス 合 成 のサポー ト<br />
波 形 図 も 含 めた イ ン ターフ ェ イ ス プロ ト コルの 詳 細 については、 「インターフェイス 合 成 リ ファレンス」 を 参 照 して<br />
ください。 次 は、 各 インターフェイス モー ド の 概 要 を 示 し ています。<br />
ブロック レベルのインターフ ェイス プロト コル<br />
ブロック レベルのインターフェイス プロ ト コルは、ap_ctrl_none、 ap_ctrl_hs および ap_ctrl_chain で、 関<br />
数 または 関 数 return に 対 し てのみ 指 定 で き ます。 指 示 子 が GUI で 指 定 さ れる 場 合 は、 こ れ ら のプ ロ ト コルがその 関 数<br />
return に 適 用 さ れます。 関 数 で 戻 り 値 が 使 用 さ れない 場 合 で も、 ブ ロ ッ ク レベルのプロ ト コルは 関 数 return に 指 定 で<br />
きます。<br />
デフォル ト プロ ト コルは、 前 の 例 で 説 明 した ap_ctrl_hs です。 ap_ctrl_chain プロ ト コルは、ap_ctrl_hs と<br />
類 似 し ていますが、 追 加 の 入 力 ポー ト ap_continue が 含 まれてお り 、 このブロ ッ ク からのデータ を 受 信 するブロ ッ<br />
高 位 合 成 japan.xilinx.com 125<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ク か ら 動 作 を 続 行 する かど う かを 示 す 信 号 が 送 ら れる 点 が 異 な り ます。 関 数 が 終 了 し た と き に ap_continue ポー ト<br />
がロジッ ク 0 であれば、ブロックは 動 作 を 停 止 し、 次 のトランザクションには 進 みません。 次 のトランザクションに<br />
は、 ap_continue がロジッ ク 1 にアサー ト さ れる 場 合 にのみ 進 みます。<br />
ap_ctrl_none モー ド を 使 用 する と 、ブ ロ ッ ク レベルの I/O プロ ト コルなしにデザインがインプリ メン ト されます。<br />
関 数 return も AXI4-Lite インターフェイス (s_axilite) として 指 定 された 場 合 は、ブロック レベルのインターフェ<br />
イスのすべてのポートが AXI4-Lite インターフェイスにまとめられます。 これは、CPU などのほかのデバイ スがこの<br />
ブ ロ ッ ク の 動 作 の 開 始 および 停 止 を 設 定 および 制 御 する 際 に よ く 使 用 さ れる 方 法 です。<br />
ポー ト レベルのインターフェイス プロト コル : AXI4 インターフェイス<br />
Vivado HLS でサポー ト される AXI4 インターフェイスには、AXI4-Stream (axis)、 AXI4-Lite (s_axilite) および<br />
AXI4 マスター インターフェイス (m_axi) などがあり ます。<br />
AXI4-Stream イ ン ターフ ェ イ スは、 入 力 引 数 ま たは 出 力 引 数 にのみ 指 定 で き ます。 入 力 引 数 は、 読 み 込 みのみの 引 数<br />
で、 図 1-49 では I と 示 されています。 出 力 引 数 は、 書 き 出 し のみの 引 数 で、 図 1-49 では O と 示 されています。 AXI4<br />
-Stream イ ン ターフ ェ イ スは 読 み 込 みおよび 書 き 出 し 併 用 の 引 数 には 適 用 で き ません。 図 1-49 では I/O と 示 されてい<br />
ます。<br />
AXI4-Lite イ ン ターフ ェ イ スは、 配 列 以 外 のどのデータ 型 の 引 数 にで も 使 用 で き ます。 こ の イ ン ターフ ェ イ スの 特 徴<br />
は、 引 数 を 同 じ AXI4-Lite インターフェイスにまとめることができる 点 にあります。<br />
AXI4 マスター インターフェイスは、 配 列 とポインター (C++ の 場 合 は リ フ ァ レン ス も) にのみ 使 用 で き ます。<br />
AXI4 イ ン ターフ ェ イ スのその 他 の 機 能 については、 「AXI4 インターフェイスの 使 用 」 を 参 照 して ください。<br />
ポー ト レベルのインターフェイス プロト コル : I/O プロト コルなし<br />
ap_none および ap_stable モー ド では、 ポー ト に 追 加 する I/O ポー ト がない こ と を 指 定 で き ます。 こ れ ら のモー ド<br />
が 指 定 さ れる と 、 引 数 はその 他 の 関 連 する 信 号 がないデータ ポー ト と してイ ンプ リ メ ン ト されます。 ap_none モー<br />
ドは、 スカラー 入 力 ではデフォルトです。 ap_stable は、 デバ イ スが リ セ ッ ト モー ド の 場 合 にのみ 変 更 する コ ン<br />
フ ィ ギ ュ レーシ ョ ン 入 力 用 のモー ド です。<br />
ポー ト レベルのインターフェイス プロト コル : ワイヤ ハン ドシェ イク<br />
ap_hs インターフェイス モー ド には、 データ ポー ト を 使 用 し たツーウ ェ イ ハン ドシェ イ ク 信 号 が 含 まれており、 業<br />
界 標 準 の 有 効 (valid) と 承 認 (acknowledge) ハン ドシェ イ クに 使 用 されます。 ap_vld モード には 有 効 ポー ト のみが、<br />
ap_ack モード には 承 認 ポー ト のみが 含 まれます。<br />
ap_olvd モー ド は、 入 出 力 引 数 に 使 用 さ れます。 入 出 力 が 別 々の 入 力 ポー ト と 出 力 ポー ト に 分 割 さ れる 場 合 は、<br />
ap_none を 入 力 ポー ト に、 ap_vld を 出 力 ポー ト に 使 用 し ます。 こ れは 読 み 込 み と 書 き 出 し の 両 方 に 使 用 さ れる ポ<br />
イ ン ター 引 数 ではデフ ォル ト にな り ます。<br />
ap_hs モー ド は 配 列 に 適 用 で き る ので、 読 み 込 みま たは 書 き 出 し がシーケンシ ャル 順 序 で 実 行 さ れます。Vivado HLS<br />
では 読 み 込 みま たは 書 き 出 し ア ク セスがシーケ ンシ ャルでない 場 合 はそれが 検 出 さ れ、エ ラー メッセージが 表 示 され<br />
て 合 成 が 停 止 さ れます。 ア ク セス 順 序 が 決 定 で き ない 場 合 は、 Vivado HLS で 警 告 メ ッ セージが 表 示 されます。<br />
ポー ト レベルのインターフェイス プロト コル : メモリ インターフェイス<br />
配 列 引 数 は、 デフ ォル ト の ap_memory インターフェイスでインプリ メント されます。 これは、 データ、 アドレス、<br />
チップイネーブル、 ライ ト イネーブル ポー ト を 含 む 標 準 ブ ロ ッ ク RAM インターフェイスです。<br />
ap_memory インターフェイスは、デュアルポート インターフェイスのうちの 1 つのポー ト と し て イ ンプ リ メ ン ト さ<br />
れるこ とがあり ます。 Vivado HLS でデュ アルポー ト イ ン ターフ ェ イ ス を 使 用 する こ と で 開 始 間 隔 (II) が 削 減 される<br />
と 判 断 された 場 合 は、 デュアルポート イ ン ターフ ェ イ スが 自 動 的 に イ ンプ リ メ ン ト さ れます。 メ モ リ リソースの 指<br />
定 には RESOURE 指 示 子 が 使 用 さ れ、 指 示 子 がシングルポー ト ブロック RAM を 含 む 配 列 に 指 定 さ れる 場 合 は、 シン<br />
グルポー ト インターフェイスがインプリ メント されます。 また、 RESOURCE を 使 用 してデュアルポー ト インター<br />
フェイスが 指 定 され、 このインターフェイスを 使 用 しても 利 点 がないと Vivado HLS で 判 断 された 場 合 も、 シングル<br />
ポー ト イ ン ターフ ェ イ スが 自 動 的 に イ ンプ リ メ ン ト さ れます。<br />
高 位 合 成 japan.xilinx.com 126<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
bram インターフェイス モード は、 ap_memory と 機 能 的 には 同 じ ですが、 デザ イ ンが Vivado IP インテグレーターで<br />
使 用 さ れる 際 のポー ト の イ ンプ リ メ ン ト 方 法 が 異 な り ます。<br />
• ap_memory イ ン ターフ ェ イ スは 複 数 の 別 々のポー ト と し て 表 示 さ れます。<br />
• bram インターフェイスは、1 つのポー ト グループ と し て 表 示 されるので、 単 一 のポー ト トゥ ポー ト 接 続 を 使 用<br />
してザイ リンクス ブロック RAM に 接 続 でき ます。<br />
配 列 がシーケンシャルにアクセス される 場 合 は、 ap_fifo インターフェイスを 使 用 できます。ap_hs インターフェイ<br />
ス を 使 用 し た 場 合 と 同 様 、 データ アクセスがシーケンシャルでないと 判 断 されたら Vivado HLS は 停 止 し ます。 アク<br />
セ スがシーケ ンシ ャルかど う か 判 別 で き なかった 場 合 は 警 告 メ ッ セージが 表 示 さ れ、 シーケンシ ャルであ る と 判 断 さ<br />
れた 場 合 は メ ッ セージは 表 示 さ れません。 ap_fifo は、 読 み 込 みか 書 き 出 し のいずれかにのみ 使 用 で き、 両 方 には 使 用<br />
できません。<br />
ap_bus イ ン ターフ ェ イ ス を 使 用 する と 、 バス ブ リ ッ ジ と 通 信 で き ます。 こ の イ ン ターフ ェ イ スは 特 定 のバス 規 格 に<br />
は 従 っていませんが、 汎 用 であ る ためバス ブリッジと 共 に 使 用 でき、バス ブリッジでシステム バスをアービ ト レー<br />
ションできます。バス ブリ ッジでは、 バースト 書 き 出 しをキャッシュできるようになっている 必 要 があります。<br />
インターフェイス 合 成 と 構 造 体<br />
インターフェイスの 構 造 体 (struct) はデフ ォル ト でそれぞれの メ ンバー エレメントに 分 割 され、 ポートは 各 メンバー<br />
エレ メ ン ト ご と に 別 々に イ ンプ リ メ ン ト さ れます。 構 造 体 の 各 メ ンバー エレ メン トは、 図 1-49 に 示 すよ う に、<br />
INTERFACE 指 示 子 な し で イ ンプ リ メ ン ト さ れます。<br />
構 造 体 の 配 列 は、 複 数 の 配 列 ( 構 造 体 の 各 メ ンバーご と に 別 々の 配 列 ) としてインプリメントされます。<br />
1 つの 構 造 体 に 含 まれる エレ メ ン ト すべてを 1 つの 幅 のベク ターにパッ キングするには、 DATA_PACK 最 適 化 指 示 子<br />
を 使 用 し ます。 こ れに よ り 、 構 造 体 のすべての メ ンバーが 同 時 に 読 み 込 みおよび 書 き 出 し で き ます。 構 造 体 の メ ン<br />
バー エレ メン トは C コードの 順 番 ( 構 造 体 の 最 初 のエレ メ ン ト がベ ク ターの LSB に、 最 後 のエレ メ ン ト がベク ター<br />
の MSB) でベ ク ターに 配 置 さ れます。 構 造 体 の 配 列 は 個 別 配 列 に 分 割 さ れ、 下 か ら 上 に 順 番 にベ ク ターに 配 置 さ れま<br />
す。<br />
大 き な 配 列 を 含 む 構 造 体 に DATA_PACK 最 適 化 を 使 用 する 際 には 注 意 が 必 要 です。 配 列 に int 型 の 4096 エレ メン ト<br />
が 含 まれる 場 合 、 ベク ター (およびポート) の 幅 は 4096*32=131072 ビッ トになります。Vivado HLS ではこの RTL デ<br />
ザ イ ン を 作 成 はで き ますが、 FPGA イ ンプ リ メ ンテーシ ョ ン 中 に 論 理 合 成 で こ れが 配 線 さ れる 可 能 性 はかな り 低 く な<br />
るはずです。<br />
DATA_PACK を 使 用 した struct ポー ト が AXI4 インターフェイスを 使 用 してインプリ メント される 場 合 は、<br />
DATA_PACK に bype_pad オプシ ョ ンを 付 けてみて く ださい。 byte_pad オプシ ョ ン を 使 用 する と 、 メ ンバー エレ<br />
メ ン ト が 自 動 的 に 8 ビ ッ ト 境 界 に 揃 えられます。 このよ う に 揃 えられる よ う にするには、 ザイ リ ン ク ス IP が 必 要 な<br />
こともあります。DATA_PACK を 使 用 する AXI ポー ト を イ ンプ リ メ ン ト する 場 合 は、 それが 接 続 さ れるザイ リ ン ク ス<br />
IP の 資 料 を 参 照 し て、 バイ ト ア ラ イ メ ン ト が 必 要 かど う かを 判 断 し て く だ さ い。<br />
次 のコード 例 の struct ポー ト を イ ンプ リ メ ン ト するオプシ ョ ンは、 図 1-50 に 示 されています。<br />
typedef struct{<br />
int12 A;<br />
int18 B[4];<br />
int6 C;<br />
} my_data;<br />
void foo(my_data *a )<br />
• デフ ォル ト では、 メ ンバーが 個 別 のポー ト と し て イ ンプ リ メ ン ト さ れます。 配 列 には、 複 数 のポー ト (data、 addr<br />
など) が 含 まれます。<br />
• DATA_PACK を 使 用 する と 1 つの 幅 のポー ト にな り ます。<br />
• DATA_PACK に struct_level バイ ト パデ ィ ング を 付 けて 使 用 する と 、 次 の 8 ビ ッ ト 境 界 に 構 造 体 すべてが 揃<br />
えられます。<br />
高 位 合 成 japan.xilinx.com 127<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
• DATA_PACK に field_level バイ ト パデ ィ ン グ を 付 けて 使 用 する と 、 次 の 8 ビ ッ ト 境 界 に 各 構 造 体 メ ンバーが<br />
揃 えられます。<br />
注 記 : データ パ ッ キ ングで 作 成 さ れたポー ト ま たはバスの 最 大 ビ ッ ト 幅 は 8192 です。<br />
X-Ref Target - Figure 1-50<br />
図 1‐50 : DATA_PACK bype_pad アライメント オプシ ョ ン<br />
構 造 体 に 配 列 が 含 まれる 場 合 、 配 列 の 分 割 には ARRAY_PARTITION 指 示 子 を、 配 列 を 分 割 し てその 分 割 さ れたエレ<br />
メ ン ト を よ り 大 きい 幅 の 配 列 にま と め 戻 すには ARRAY_RESHAPE 指 示 子 を 使 用 する と 、 それ ら の 配 列 を 最 適 化 で き<br />
ます。 DATA_PACK 指 示 子 は ARRAY_RESHAPE と 同 じ 操 作 を 実 行 し、 構 造 体 のほかのエレ メ ン ト と 一 緒 に 再 形 成 さ<br />
れた 配 列 を ま と めます。<br />
構 造 体 は DATA_PACK を 使 用 し て 最 適 化 し た 後 に 分 割 ま たは 再 形 成 する こ と はで き ません。 DATA_PACK、<br />
ARRAY_PARTITION、 および ARRAY_RESHAPE 指 示 子 は 一 緒 には 使 用 でき ません。<br />
高 位 合 成 japan.xilinx.com 128<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
インターフェイス 合 成 およびマルチアクセス ポインター<br />
複 数 回 ア ク セスする ポ イ ン ターを 使 用 する と 、 合 成 後 に 予 測 し ないビヘイ ビ アーにな る こ と があ り ます。 次 の 例 はポ<br />
インターが 複 数 のアクセスを 実 行 する 例 で、 ポインター d_i に 4 度 読 み 込 まれてか ら、 ポ イ ン ター d_o に 2 度 書 き<br />
出 されています。<br />
#include pointer_stream_bad.h<br />
void pointer_stream_bad ( dout_t *d_o, din_t *d_i) {<br />
din_t acc = 0;<br />
}<br />
acc += *d_i;<br />
acc += *d_i;<br />
*d_o = acc;<br />
acc += *d_i;<br />
acc += *d_i;<br />
*d_o = acc;<br />
こ の コー ド は 合 成 後 に 入 力 ポー ト が 1 度 読 み 込 まれてか ら、 出 力 ポー ト に 1 度 書 き 出 さ れる よ う な RTL にな り ます。<br />
標 準 的 な C コ ンパイ ラー と 同 様 、Vivado HLS では 最 適 化 で 不 必 要 なポ イ ン ター ア ク セスが 削 除 さ れます。 上 記 の コー<br />
ドを d_i で 4 読 み 込 み、 d_o への 2 書 き 出 しにな る よ う にイ ンプ リ メ ン ト するには、 次 の 例 のよ う にポ イ ン ターを<br />
volatile と 指 定 する 必 要 があ り ます。<br />
#include pointer_stream_better.h<br />
void pointer_stream_better ( volatile dout_t *d_o, volatile din_t *d_i) {<br />
din_t acc = 0;<br />
}<br />
acc += *d_i;<br />
acc += *d_i;<br />
*d_o = acc;<br />
acc += *d_i;<br />
acc += *d_i;<br />
*d_o = acc;<br />
この C コー ド で も 問 題 と な る 可 能 性 があ り ます。 テ ス ト ベンチを 使 用 し た 場 合 、d_i には 1 つの 値 以 外 を 提 供 する 方<br />
法 はな く 、 最 後 の 書 き 出 し 以 外 の d_o への 書 き 出 しを 検 証 する 方 法 もあり ません。 マルチアクセス ポインターはサ<br />
ポー ト されていますが、 hls::stream ク ラ ス を 使 用 し て 必 要 なビヘイ ビ アーを イ ンプ リ メ ン ト する こ と をお 勧 め し<br />
ます。 hls::stream クラスの 詳 細 は、「Vivado HLS のス ト リーム ライブラリ」 を 参 照 して く ださい。<br />
イ ン タ ーフ ェ イ スの 指 定<br />
インターフェイス 合 成 は、 INTERFACE 指 示 子 を 使 用 する か、 コ ン フ ィ ギ ュ レーシ ョ ン 設 定 を 使 用 し て 制 御 し ます。<br />
ポー ト のイ ン ターフ ェ イ ス モー ド を 指 定 する には、GUI の [Directive] タブでポート を 右 ク リ ッ クして [Insert Directive]<br />
をク リ ックして、 [Vivado HLS Directive Editor] ダイアログ ボックスを 開 きます ( 図 1-51)。<br />
ブロック レベルの I/O プ ロ ト コルの 場 合 は、 関 数 を 選 択 し て く だ さ い。<br />
高 位 合 成 japan.xilinx.com 129<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-51<br />
図 1‐51 : ポー ト イ ン タ ーフ ェ イ スの 指 定<br />
インターフェイス モード は、 ド ロ ッ プダウ ン メ ニ ューか ら 選 択 し ます。 ポー ト オプシ ョ ンは 必 須 です。 デフォル ト<br />
では、 ポー ト にレ ジ ス タ は 付 け られません。 レ ジ ス タ を 付 け る オプシ ョ ン を 選 択 する と 、 値 渡 し 読 み 込 みすべてが 操<br />
作 の 最 初 のサ イ ク ルで 実 行 さ れます。 出 力 ポー ト では、 レ ジ ス タ を 付 け る オプシ ョ ン を 選 択 する と 、 出 力 に 必 ずレ ジ<br />
スタが 付 きます。 メモリ、FIFO、および AXI4 インターフェイスでは、 レジスタ オプシ ョ ンを 設 定 しても 変 化 はあ り<br />
ません。<br />
AXI4 インターフェイスにはオフセッ ト オプシ ョ ンおよび メ タデータ オプシ ョ ン を 使 用 で き ます。 詳 細 は、 「AXI4 イ<br />
ン ターフ ェ イ スの 使 用 」 を 参 照 して く ださい。 1 つの ト ラ ンザ ク シ ョ ンでポ イ ン ターの 読 み 出 し ま たは 書 き 込 みが 複<br />
数 回 実 行 さ れる 場 合 は、 C/RTL 協 調 シ ミ ュ レーシ ョ ン 用 に depth オプシ ョ ン を 使 用 する 必 要 があ り ます。 こ れは、 テ<br />
ス ト ベンチでデザインに 提 供 されるサンプル 数 とテス ト ベンチで 格 納 する 必 要 がある 出 力 値 の 数 を 指 定 するオプ<br />
シ ョ ンです。 ど ち ら か 数 値 の 大 き い 方 を 使 用 し て く だ さ い。<br />
depth オプシ ョ ンの 値 が 小 さすぎる と、 C/RTL 協 調 シ ミ ュ レーシ ョ ンがデ ッ ド ロ ッ ク 状 態 にな り ます。<br />
• 入 力 読 み 込 みはデータ の 待 機 中 停 止 する こ と があ り ます。 テス トベンチでは 提 供 できません。<br />
• 出 力 書 き 出 し は、 ス ト レージがフルの 状 態 でデータ を 書 き 出 そ う と する 場 合 に 停 止 する こ と があ り ます。<br />
AXI4 インターフェイスにはオフセッ ト オプシ ョ ンおよび メ タデータ オプシ ョ ン を 使 用 で き ます。 詳 細 は、 「AXI4 イ<br />
ン ターフ ェ イ スの 使 用 」 を 参 照 して く ださい。<br />
インターフェイス プ ロ ト コルは 最 上 位 関 数 に 適 用 で き ます。 レ ジ ス タ オプシ ョ ンは、 デザイ ンのどの 関 数 にでも 適<br />
用 でき ます。<br />
高 位 合 成 japan.xilinx.com 130<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
インターフェイス コンフィギュレーションは、[Solution] → [Solution Settings] をクリ ックし、 左 側 のボックスで<br />
[General] を 選 択 して [Add] をク リ ックし、[Command] ドロップダウン リストから [config_interface] を 選 択 し ます。 コ<br />
ン フ ィ ギ ュ レーシ ョ ン 設 定 を 使 用 する と 、 次 を 実 行 で き ます。<br />
• RTL デザイ ンにグ ローバル クロック イ ネーブルを 追 加 し ます。<br />
• 絡 まったポート ( 例 : デザ イ ンで 使 用 さ れない 構 造 体 のエレ メ ン ト に よ って 作 成 ) を 削 除 し ます。<br />
• すべてのグ ローバル 変 数 に RTL ポー ト を 作 成 し ます。<br />
どの C 関 数 で も グ ローバル 変 数 を 使 用 で き ます。 グ ローバル 変 数 は、 関 数 外 で 定 義 さ れます。 デフ ォル ト では、 グ<br />
ローバル 変 数 に よ り RTL ポー ト は 作 成 されません。 Vivado HLS では、 グ ローバル 変 数 は 最 終 デザ イ ン 内 にあ る と 想<br />
定 されます。config_interface コンフィギュレーション 設 定 で expose_global を 選 択 する と 、 グ ローバル 変 数<br />
のポー ト が 作 成 される よ う にな り ます。 グ ローバル 変 数 の 合 成 に 関 する 詳 細 は、 「グローバル 変 数 」 セクションで 説<br />
明 されています。<br />
SystemC のインターフ ェ イス 合 成<br />
通 常 SystemC デザイ ンでは、 イ ン ターフ ェ イ ス 合 成 はサポー ト されません。 SystemC デザイ ンの I/O ポー ト は<br />
SC_MODULE イ ン ターフ ェ イ スで 完 全 に 記 述 し て、 ポー ト の 動 作 は ソ ース コー ド に 完 全 に 記 述 する 必 要 があ り ます。<br />
イ ン ターフ ェ イ ス 合 成 は、 次 をサポー ト する ために 提 供 さ れています。<br />
• メモリのブロック RAM インターフェイス<br />
• AXI4-Stream インターフェイス<br />
• AXI4-Lite インターフェイス<br />
• AXI4-Master インターフェイス<br />
SystemC のインターフェ イ ス 合 成 を 実 行 するプロセスは、 同 じ インターフェ イ スを C または C++ デザ イ ンに 追 加 す<br />
るプロセスとは 異 なり ます。<br />
• メモリのブロック RAM インターフェイスと AXI4-Master インターフェイスでは、 SystemC データ ポー ト が<br />
Vivado HLS ポー ト に 置 換 さ れる 必 要 があ り ます。<br />
• AXI4-Stream および Slave Lite イ ン ターフ ェ イ スには 指 示 子 のみが 必 要 ですが、SystemC デザ イ ンに 指 示 子 を 追 加<br />
する 場 合 は、 別 のプ ロ セス を 実 行 さ れます。<br />
SystemC でのイ ン タ ーフ ェ イ ス 指 示 子 の 適 用<br />
指 示 子 を SystemC ソース コードにプラグマと して 追 加 する 際 にポートが SC_MODULE 宣 言 で 指 定 さ れてい る と 、 プ<br />
ラ グマ 指 示 子 は 追 加 で き ないので、 SC_MODULE で 呼 び 出 さ れた 関 数 内 に 追 加 する 必 要 があ り ます。<br />
GUI を 使 用 し て 指 示 子 を 追 加 する 場 合 :<br />
• C ソース コード と [Directives] タブを 開 きます。<br />
• 指 示 子 を 必 要 と する 関 数 を 選 択 し ます。<br />
• 右 ク リ ッ クして 関 数 に INTERFACE 指 示 子 を 指 定 し ます。<br />
指 示 子 は、 SC_MODULE のどの 関 数 にで も 適 用 で き ますが、 こ こ では 変 数 が 使 用 さ れる 関 数 に 追 加 し ます。<br />
ブロック RAM メモリ ポー ト<br />
SystemC デザ イ ンの イ ン ターフ ェ イ スに 配 列 ポー ト が 含 まれてい る と し ます。<br />
SC_MODULE(my_design) {<br />
//”RAM” Port<br />
sc_uint my_array[256];<br />
…<br />
my_array ポー ト は、 ブロ ッ ク RAM インターフェイス ポー ト ではな く 、 内 部 RAM に 合 成 されます。<br />
高 位 合 成 japan.xilinx.com 131<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
Vivado HLS ヘッダー ファイル ap_mem_if.h を 含 める と、 同 じポー ト を ap_mem_port ポー ト と し て 指 定 で き ます。 ap_mem_port データ 型 は、 指 定 し たデータおよびア ド レ ス バス 幅 で<br />
ap_memory ポー ト プ ロ ト コルを 使 用 し て、 標 準 ブ ロ ッ ク RAM インターフェイスに 合 成 されます。<br />
#include "ap_mem_if.h"<br />
SC_MODULE(my_design) {<br />
//”RAM” Port<br />
ap_mem_port my_array;<br />
…<br />
SystemC デザイ ンに ap_mem_port を 追 加 した 場 合 、 SystemC テス トベンチに ap_mem_port を 駆 動 する<br />
ap_mem_chn を 追 加 する 必 要 があ り ます。 テス ト ベンチでは、 次 のよ う に ap_mem_chn を 定 義 してインスタンスに<br />
接 続 し ます。<br />
#include "ap_mem_if.h"<br />
ap_mem_chn bus_mem;<br />
…<br />
// Instantiate the top-level module<br />
my_design U_dut (“U_dut”)<br />
U_dut.my_array.bind(bus_mem);<br />
…<br />
ヘッダー ファイル ap_mem_if.h は Vivado HLS インストール ディレク ト リ 内 の include ディレク ト リに 含 まれます。<br />
シミュレーションが Vivado HLS 外 から 実 行 される 場 合 には 含 まれるよ うにしてください。<br />
SystemC の AXI4 Stream インターフェイス<br />
AXI4-Stream インターフェイスは、 sc_fifo_in または sc_fifo_out 型 の SystemC ポー ト に 追 加 でき ます。 次 は、<br />
典 型 的 な SystemC デザ イ ンの 最 上 位 です。 典 型 的 な 例 なので、 SC_MODULE とポートはヘッダー ファイルで 定 義 さ<br />
れています。<br />
SC_MODULE(sc_FIFO_port)<br />
{<br />
//Ports<br />
sc_in clock;<br />
sc_in reset;<br />
sc_in start;<br />
sc_out done;<br />
sc_fifo_out dout;<br />
sc_fifo_in din;<br />
//Variables<br />
int share_mem[100];<br />
bool write_done;<br />
//Process Declaration<br />
void Prc1();<br />
void Prc2();<br />
//Constructor<br />
SC_CTOR(sc_FIFO_port)<br />
{<br />
//Process Registration<br />
SC_CTHREAD(Prc1,clock.pos());<br />
reset_signal_is(reset,true);<br />
SC_CTHREAD(Prc2,clock.pos());<br />
reset_signal_is(reset,true);<br />
}<br />
};<br />
高 位 合 成 japan.xilinx.com 132<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
AXI4-Stream イ ン ターフ ェ イ ス を 作 成 する には、RESOURCE 指 示 子 を 使 用 し てポー ト が AXI4-Stream リソースに 接 続<br />
さ れる よ う に 指 定 する 必 要 があ り ます。 た と えば、 上 記 の イ ン ターフ ェ イ スの 場 合 、 指 示 子 は SC_MODULE で 呼 び<br />
出 される 関 数 に 追 加 されます。 din および dout ポー ト は AXI4 Stream リ ソースが 含 められる よ う に 指 定 されていま<br />
す。<br />
#include "sc_FIFO_port.h"<br />
void sc_FIFO_port::Prc1()<br />
{<br />
//Initialization<br />
write_done = false;<br />
wait();<br />
while(true)<br />
{<br />
while (!start.read()) wait();<br />
write_done = false;<br />
for(int i=0;i
第 1 章 : 高 位 合 成<br />
SystemC の AXI4‐Lite インターフェイス<br />
AXI4-Lite インターフェイスは、 sc_in または sc_out 型 の SystemC ポー ト に 追 加 で き ます。 次 の 例 は、 典 型 的 な<br />
SystemC デザ イ ンの 最 上 位 を 示 し ています。 こ の 場 合 、 典 型 的 な 例 なので、 SC_MODULE とポートはヘッダー ファ<br />
イルで 定 義 されています。<br />
SC_MODULE(sc_sequ_cthread){<br />
//Ports<br />
sc_in clk;<br />
sc_in reset;<br />
sc_in start;<br />
sc_in a;<br />
sc_in en;<br />
sc_out sum;<br />
sc_out vld;<br />
//Variables<br />
sc_uint acc;<br />
//Process Declaration<br />
void accum();<br />
//Constructor<br />
SC_CTOR(sc_sequ_cthread){<br />
//Process Registration<br />
SC_CTHREAD(accum,clk.pos());<br />
reset_signal_is(reset,true);<br />
}<br />
};<br />
AXI4-Lite イ ン ターフ ェ イ ス を 作 成 する には、 RESOURCE 指 示 子 を 使 用 し てポー ト が AXI4-Lite リソースに 接 続 され<br />
る よ う に 指 定 する 必 要 があ り ます。 た と えば、 上 記 の イ ン ターフ ェ イ スの 場 合 、 次 の 例 の よ う に start、 a、 en、 sum<br />
および vld が 同 じ AXI4-Lite インターフェイスの slv0 にまとめられます。 すべてのポー ト が 同 じ bus_bundle 名 で<br />
指 定 さ れ、 同 じ AXI4-Lite インターフェイスにまとめられます。<br />
=#include "sc_sequ_cthread.h"<br />
void sc_sequ_cthread::accum(){<br />
//Group ports into AXI4 slave slv0<br />
#pragma HLS resource core=AXI4LiteS metadata="-bus_bundle slv0" variable=start<br />
#pragma HLS resource core=AXI4LiteS metadata="-bus_bundle slv0" variable=a<br />
#pragma HLS resource core=AXI4LiteS metadata="-bus_bundle slv0" variable=en<br />
#pragma HLS resource core=AXI4LiteS metadata="-bus_bundle slv0" variable=sum<br />
#pragma HLS resource core=AXI4LiteS metadata="-bus_bundle slv0" variable=vld<br />
//Initialization<br />
acc=0;<br />
sum.write(0);<br />
vld.write(false);<br />
wait();<br />
// Process the data<br />
while(true) {<br />
// Wait for start<br />
wait();<br />
while (!start.read()) wait();<br />
高 位 合 成 japan.xilinx.com 134<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
// Read if valid input available<br />
if (en) {<br />
acc = acc + a.read();<br />
sum.write(acc);<br />
vld.write(true);<br />
} else {<br />
vld.write(false);<br />
}<br />
}<br />
}<br />
SystemC デザ イ ンが 合 成 さ れる と 、 標 準 的 な RTL ポー ト を 含 んだ RTL デザイ ンにな り ます。[Export RTL] ツールバー<br />
ボ タ ン を 使 用 し てデザ イ ンが IP としてパッケージされると、 出 力 は AXI4-Lite インターフェイスのデザインになりま<br />
す。<br />
SystemC の AXI4 マスター インターフェイス<br />
最 も 標 準 的 な SystemC デザ イ ンの 場 合 、Vivado HLS の ap_bus I/O プロ ト コルのビヘイビアーを 使 用 してポー ト を 指<br />
定 する 必 要 はあ り ませんが、 デザ イ ンに AXI4 マスター バス インターフェイスが 必 要 な 場 合 は、 ap_bus I/O プロ ト<br />
コルが 必 要 です。<br />
SystemC デザイ ンに AXI4 Master イ ン ターフ ェ イ ス を 指 定 する には、 次 の 手 順 に 従 って く だ さ い。<br />
• Vivado HLS の AXI4M_bus_port 型 を 使 用 し て イ ン ターフ ェ イ ス を ap_bus I/O プ ロ ト コルで 作 成 し ます。<br />
• AXI4M リソースをポートに 割 り 当 てます。<br />
次 の 例 は、 bus_if という AXI4M_bus_port を SystemC デザ イ ンに 追 加 する 方 法 を 示 し ています。<br />
• ヘッダー ファイルの AXI4_if.h をデザ イ ンに 追 加 する 必 要 があ り ます。<br />
• ポー ト は AXI4M_bus_port と 定 義 し、 には 使 用 さ れるデータ 型 ( この 場 合 sc_fixed) を 指 定 し<br />
ます。<br />
注 記 : AXI4M_bus_port で 使 用 されるデータ 型 は、 8 ビッ トの 倍 数 である 必 要 があります。 また、 struct はこのデー<br />
タ 型 ではサポート されません。<br />
#include "systemc.h"<br />
#include "AXI4_if.h"<br />
#include "tlm.h"<br />
using namespace tlm;<br />
#define DT sc_fixed<br />
SC_MODULE(dut)<br />
{<br />
//Ports<br />
sc_in clock; //clock input<br />
sc_in reset;<br />
sc_in start;<br />
sc_out dout;<br />
AXI4M_bus_port bus_if;<br />
//Variables<br />
//Constructor<br />
SC_CTOR(dut)<br />
//:bus_if ("bus_if")<br />
{<br />
//Process Registration<br />
SC_CTHREAD(P1,clock.pos());<br />
高 位 合 成 japan.xilinx.com 135<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
}<br />
}<br />
reset_signal_is(reset,true);<br />
次 は、 変 数 bus_if が SystemC 関 数 でどの よ う にア ク セス さ れて、 標 準 ま たはバース ト 読 み 込 みおよび 書 き 出 し が 生<br />
成 されるのかを 示 しています。<br />
//Process Declaration<br />
void P1()<br />
{<br />
//Initialization<br />
dout.write(10);<br />
int addr = 10;<br />
DT tmp[10];<br />
wait();<br />
while(1)<br />
{<br />
tmp[0]=10;<br />
tmp[1]=11;<br />
tmp[2]=12;<br />
while (!start.read()) wait();<br />
// Port read<br />
tmp[0] = bus_if->read(addr);<br />
// Port burst read<br />
bus_if->burst_read(addr,2,tmp);<br />
// Port write<br />
bus_if->write(addr, tmp);<br />
// Port burst write<br />
bus_if->burst_write(addr,2,tmp);<br />
}<br />
dout.write(tmp[0].to_int());<br />
addr+=2;<br />
wait();<br />
}<br />
AXI4M_bus_port ポー ト ク ラ スがデザ イ ンで 使 用 さ れる と 、 次 に 示 すよ う に、 テ ス ト ベンチにそれ と 一 致 する HLS<br />
バス インターフェイス チャネルの hls_bus_chn が 含 まれる 必 要 があ り ます。<br />
#include <br />
#include "tlm.h"<br />
using namespace tlm;<br />
#include "hls_bus_if.h"<br />
#include "AE_clock.h"<br />
#include "driver.h"<br />
#ifdef __RTL_SIMULATION__<br />
#include "dut_rtl_wrapper.h"<br />
#define dut dut_rtl_wrapper<br />
#else<br />
#include "dut.h"<br />
#endif<br />
高 位 合 成 japan.xilinx.com 136<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
int sc_main (int argc , char *argv[])<br />
{<br />
sc_report_handler::set_actions("/IEEE_Std_1666/deprecated", SC_DO_NOTHING);<br />
sc_report_handler::set_actions( SC_ID_LOGIC_X_TO_BOOL_, SC_LOG);<br />
sc_report_handler::set_actions( SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, SC_LOG);<br />
sc_report_handler::set_actions( SC_ID_OBJECT_EXISTS_, SC_LOG);<br />
// hls_bus_chan<br />
// bus_variable(“name”, start_addr, end_addr)<br />
//<br />
hls_bus_chn bus_mem("bus_mem",0,1024);<br />
sc_signal<br />
sc_signal<br />
sc_signal<br />
sc_signal<br />
s_clk;<br />
reset;<br />
start;<br />
dout;<br />
AE_Clock U_AE_Clock("U_AE_Clock", 10);<br />
dut U_dut("U_dut");<br />
driver U_driver("U_driver");<br />
U_AE_Clock.reset(reset);<br />
U_AE_Clock.clk(s_clk);<br />
U_dut.clock(s_clk);<br />
U_dut.reset(reset);<br />
U_dut.start(start);<br />
U_dut.dout(dout);<br />
U_dut.bus_if(bus_mem);<br />
U_driver.clk(s_clk);<br />
U_driver.start(start);<br />
U_driver.dout(dout);<br />
int end_time = 8000;<br />
cout
第 1 章 : 高 位 合 成<br />
• 出 力 request が 書 き 出 されます。<br />
• 入 力 response[1] が 読 み 込 まれます。<br />
• 最 終 的 なデザ イ ンで、 こ の 順 序 で I/O ア ク セス を 実 行 する 必 要 があ り ます。<br />
void test (<br />
int *z1,<br />
int a,<br />
int b,<br />
int *mode,<br />
volatile int *request,<br />
volatile int response[2],<br />
int *z2<br />
) {<br />
int read1, read2;<br />
int opcode;<br />
int i;<br />
}<br />
P1:{<br />
read1 = response[0];<br />
opcode = 5;<br />
*request = opcode;<br />
read2 = response[1];<br />
}<br />
C1:{<br />
*z1 = a + b;<br />
*z2 = read1 + read2;<br />
}<br />
Vivado HLS ではこのコード を イ ンプ リ メ ン ト する 際 に、 request 書 き 出 しを response 読 み 込 み 2 つの 間 に 設 定 する 必<br />
要 はあ り ません。 コー ド はこ のよ う に I/O が 動 作 する よ う 記 述 さ れていますが、 こ の 依 存 性 を 強 制 する も のはコー ド<br />
にあ り ません。 Vivado HLS では、 I/O ア ク セスが コー ド 記 述 と 同 様 にス ケジ ュール さ れる 場 合 と 、 ほかの 順 序 が 使 用<br />
される 場 合 があり ます。<br />
こ の 場 合 、 特 定 の I/O プロトコル 動 作 を 強 制 するためにプロトコル ブ ロ ッ ク を 使 用 で き ます。ア ク セスはブ ロ ッ ク P1<br />
で 定 義 さ れた ス コープ 内 で 実 行 さ れる ので、 プ ロ ト コルを 次 の よ う にブ ロ ッ ク に 適 用 で き ます。<br />
• applet() を 定 義 する ap_utils.h ヘッダー ファイルを 含 めます。<br />
• request への 書 き 出 しの 後 、 response[1] の 読 み 込 み 前 に、 ap_wait() 文 を 配 置 し ます。<br />
° ap_wait() 文 によ り シ ミ ュ レーシ ョ ンの 動 作 が 変 わる こ と はあ り ませんが、 合 成 中 に こ こに ク ロ ッ ク が 挿 入 さ<br />
れるよ うになり ます。<br />
• ブロック P1 をプ ロ ト コル 領 域 に 指 定 し ます。<br />
° こ の よ う にする と 、 こ の 領 域 内 のコー ド がそのま ま ス ケジ ュー リ ン グ さ れます。 I/O と ap_wait() 文 の 順 序 が<br />
変 更 さ れる こ と はあ り ません。<br />
次 の よ う に 指 示 子 を 適 用 し ます。<br />
set_directive_protocol test P1 -mode floating<br />
コードを 次 のよ うに 変 更 します。<br />
#include "ap_utils.h"// Added include file<br />
void test (<br />
int *z1,<br />
int a,<br />
高 位 合 成 japan.xilinx.com 138<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
int b,<br />
int *mode,<br />
volatile int *request,<br />
volatile int response[2],<br />
int *z2<br />
) {<br />
int read1, read2;<br />
int opcode;<br />
int i;<br />
}<br />
P1:{<br />
read1 = response[0];<br />
opcode = 5;<br />
ap_wait();// Added ap_wait statement<br />
*request = opcode;<br />
read2 = response[1];<br />
}<br />
C1:{<br />
*z1 = a + b;<br />
*z2 = read1 + read2;<br />
}<br />
こ れに よ り 、 コー ド に 指 定 さ れた と お り の I/O 動 作 が 得 ら れます。<br />
• 入 力 response[0] が 読 み 込 まれます。<br />
• 出 力 request が 書 き 出 されます。<br />
• 入 力 response[1] が 読 み 込 まれます。<br />
-mode floating オプシ ョ ン を 使 用 する と 、 データ の 依 存 性 で 許 容 さ れる 場 合 は、 ほかの コー ド を こ のブ ロ ッ ク と 並 列 実<br />
行 でき ます。 このオプシ ョ ンを fixed に 設 定 する と 、 並 列 実 行 さ れません。<br />
AXI4 インターフェイスの 使 用<br />
AXI4‐Stream インターフェイス<br />
AXI4-Stream イ ン ターフ ェ イ スは、 入 力 引 数 、 配 列 、 ま たはポ イ ン ターに 適 用 で き ます。 AXI4-Stream インターフェ<br />
イスによりシーケンシャル ス ト リ ー ミ ン グ 方 式 でデータ が 転 送 さ れる ので、 読 み 込 みで も あ り 書 き 出 し で も あ る 引 数<br />
と は 一 緒 に 使 用 で き ません。<br />
デザイ ンに AXI4-Stream を 使 用 する には、 基 本 的 に 次 の 2 つの 方 法 があ り ます。<br />
• サイドチャネルなしで AXI4-Stream を 使 用<br />
• サイドチャネルありで AXI4-Stream を 使 用<br />
この 2 つ 目 の 方 法 では、 C コー ド に 直 接 使 用 で き る よ う に、 AXI4-Stream 規 格 の 一 部 のサ イ ド チャ ネルがオプシ ョ ン<br />
で 使 用 でき ます。<br />
サイ ドチャネルなしの AXI4‐Stream<br />
AXI4-Stream は、 データ 型 に AXI4 サイドチャネル エレメン トが 含 まれない 場 合 は、 サイ ドチャネルなしで 使 用 され<br />
ます。 次 は、 データ 型 が 標 準 C の int 型 の 例 を 示 し ています。 この 例 では、 両 方 のイ ン ターフ ェ イ スが AXI4-Stream<br />
を 使 用 してインプ リ メ ン ト されます。<br />
void example(int A[50], int B[50]) {<br />
高 位 合 成 japan.xilinx.com 139<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
//Set the HLS native interface types<br />
#pragma HLS INTERFACE axis port=A<br />
#pragma HLS INTERFACE axis port=B<br />
int i;<br />
for(i = 0; i < 50; i++){<br />
B[i] = A[i] + 5;<br />
}<br />
}<br />
合 成 後 は、 図 1-52 に 示 すよ う に、 どち らの 引 数 もデータ ポー ト と 標 準 AXI4-Stream の TVALID および TREADY ポー<br />
ト を 使 用 し て イ ンプ リ メ ン ト さ れます。<br />
X-Ref Target - Figure 1-52<br />
サイ ドチャネルありの AXI4‐Stream<br />
サイドチャネルは、AXI4-Stream 規 格 の 一 部 のオプシ ョ ンの 信 号 で、C コー ド で 直 接 参 照 おおび 制 御 で き ます。Vivado<br />
HLS の include ディレク ト リには ap_axi_sdata.h フ ァ イルが 含 まれます。 こ のヘッ ダー ファイルには、 次 の 構<br />
造 体 (struct) が 含 まれます。<br />
#include "ap_int.h"<br />
図 1‐52 : サイ ドチャネルなしの AXI4‐Stream インターフェイス<br />
template<br />
struct ap_axis{<br />
ap_int data;<br />
ap_uint keep;<br />
ap_uint strb;<br />
ap_uint user;<br />
ap_uint last;<br />
ap_uint id;<br />
ap_uint dest;<br />
};<br />
template<br />
struct ap_axiu{<br />
ap_uint data;<br />
ap_uint keep;<br />
ap_uint strb;<br />
ap_uint user;<br />
ap_uint last;<br />
ap_uint id;<br />
ap_uint dest;<br />
};<br />
ど ち ら の 構 造 体 に も 最 上 位 メ ンバー と し て、 オプシ ョ ンの AXI4-Stream サ イ ド チャ ネル 信 号 の 名 前 と 一 致 する 変 数 が<br />
含 まれます。 構 造 体 には こ れら の 名 前 のエレ メ ン ト が 含 まれる 場 合 は、 提 供 さ れてい るヘ ッ ダー フ ァ イルを 使 用 する<br />
高 位 合 成 japan.xilinx.com 140<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
必 要 はあ り ません。 ユーザーは、 ユーザー 定 義 の 構 造 体 を 作 成 で き ます。 上 記 の 構 造 体 では ap_int 型 とテンプレー<br />
トが 使 用 されているので、 このヘッダー ファイルは C++ デザ イ ンでのみ 使 用 で き ます。<br />
注 記 : valid および ready 信 号 は、 AXI4-Stream では 必 須 の 信 号 なので、 Vivado HLS で 常 にイ ンプ リ メ ン ト されます。<br />
こ れ ら は、 構 造 体 を 使 用 し て 制 御 する こ と がで き ません。<br />
次 の 例 は、サイ ド チャネルを C コー ド で 直 接 使 用 する 方 法 と イ ン ターフ ェ イ スでの イ ンプ リ メ ン ト 方 法 を 示 し ていま<br />
す。 こ の 例 の 場 合 、 符 号 付 き 32 ビ ッ ト のデータ 型 が 使 用 さ れています。<br />
#include "ap_axi_sdata.h"<br />
void example(ap_axis A[50], ap_axis B[50]){<br />
//Map ports to Vivado HLS interfaces<br />
#pragma HLS INTERFACE axis port=A<br />
#pragma HLS INTERFACE axis port=B<br />
int i;<br />
for(i = 0; i < 50; i++){<br />
B[i].data = A[i].data.to_int() + 5;<br />
B[i].keep = A[i].keep;<br />
B[i].strb = A[i].strb;<br />
B[i].user = A[i].user;<br />
B[i].last = A[i].last;<br />
B[i].id = A[i].id;<br />
B[i].dest = A[i].dest;<br />
}<br />
}<br />
合 成 後 は、 ど ち ら の 引 数 もデータ ポー ト と 標 準 AXI4-Stream の TVALID および TREADY プロ ト コル ポー ト 、 および<br />
構 造 体 で 記 述 し たオプシ ョ ンのポー ト すべてを 使 用 し て イ ンプ リ メ ン ト さ れます。<br />
X-Ref Target - Figure 1-53<br />
構 造 体 の AXI4‐Stream へのパ ッ キング<br />
図 1‐53 : Pcore : AXI4‐Stream インターフェイス<br />
AXI4-Stream イ ン ターフ ェ イ ス を 使 用 する ザ イ リ ン ク ス IP には、 通 常 1 つの 幅 のベク ター ( 異 なるデータ を 表 すさ ま<br />
ざまなフィールドのベクターを 含 む) が 使 用 さ れます。 こ のデータ は、 通 常 構 造 体 (struct) を 使 用 して C で 記 述 されま<br />
す。<br />
最 上 位 関 数 への 引 数 が 構 造 体 であれば、 デフ ォル ト で 別 々のエレ メ ン ト に 分 割 さ れます。 構 造 体 の 各 メ ンバーは 別 々<br />
のポー ト と してインプ リ メ ン ト されます。 AXI4-Stream イ ン ターフ ェ イ スが 構 造 体 に 適 用 さ れる 場 合 は、 デフ ォル ト<br />
高 位 合 成 japan.xilinx.com 141<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
で 複 数 の AXI4-Stream インターフェイス ポー ト が 作 成 さ れ、その 各 ポー ト が 構 造 体 の 別 の メ ンバーを ス ト リ ー ミ ン グ<br />
します。<br />
最 上 位 イ ン ターフ ェ イ スの 配 列 のエレ メ ン ト が 構 造 体 の 場 合 は、 複 数 の 配 列 ポー ト ( 各 ポー ト は 構 造 体 メ ンバーの 配<br />
列 ) としてインプリメントされます。<br />
構 造 体 と AXI4-Stream イ ン ターフ ェ イ ス を 使 用 する 際 には、 構 造 体 のすべてのエレ メ ン ト を 1 つの 幅 のベク ター ( 配<br />
列 の 場 合 は、 よ り 大 き なベ ク ターの 配 列 に) まとめて、データがザイリンクス IP で 必 要 と される フ ィ ール ド に 揃 え ら<br />
れる よ う にする 方 法 が よ く 使 用 さ れます。<br />
1 つの 構 造 体 に 含 まれる エレ メ ン ト すべてを 1 つの 幅 のベク ターにパッ キングするには、 DATA_PACK 最 適 化 指 示 子<br />
を 使 用 し ます。 構 造 体 のパ ッ キング 方 法 およびバイ ト パデ ィ ング オプシ ョ ンを 使 用 して 大 きなベク ター 内 でデータ<br />
フ ィ ール ド を 揃 え る 方 法 については、 「イ ン ターフ ェ イ ス 合 成 と 構 造 体 」 を 参 照 して く ださい。<br />
DATA_PACK 指 示 子 を 付 けて、AXI-Streamサ イ ド チャ ネル 信 号 を 使 用 し て 構 造 体 をパ ッ キングする 必 要 はあ り ません。<br />
こ れ ら の 信 号 は 自 動 的 に 構 造 体 にパ ッ キ ング さ れます。<br />
AXI4‐Lite インターフェイス<br />
AXI4 スレーブ インターフェイスは、デザインを CPU やマイクロコントローラーなどのフォームで 制 御 できるように<br />
するために 使 用 されます。 Vivado HLS に 含 まれる AXI4 Slave Lite インターフェイスの 機 能 は、 次 のとおりです。<br />
• 複 数 のポー ト を 同 じ AXI4 Slave Lite インターフェイスにまとめることができます。<br />
• デザイ ンが IP カタログ または EDK 環 境 用 の PCore としてエクスポートされると、 出 力 には C 関 数 と ヘ ッ ダー<br />
フ ァ イルが 含 まれ、 プ ロ セ ッ サで 実 行 さ れる コー ド で 使 用 さ れます。<br />
次 は、 関 数 return も 含 めた 複 数 の 引 数 が AXI4 Slave Lite インターフェイスとしてインプリ メント される 例 を 示 してい<br />
ます。 各 インターフェイスで bundle オプシ ョ ンに 同 じ 名 前 が 使 用 されるので、 各 ポートが 同 じ AXI4 Slave Lite イン<br />
ターフェイスにま とめられます。<br />
void example(char *a, char *b, char *c)<br />
{<br />
#pragma HLS INTERFACE s_axilite port=return bundle=BUS_A<br />
#pragma HLS INTERFACE s_axilite port=a bundle=BUS_A<br />
#pragma HLS INTERFACE s_axilite port=b bundle=BUS_A<br />
#pragma HLS INTERFACE s_axilite port=c bundle=BUS_A<br />
}<br />
*c += *a + *b;<br />
合 成 後 は、 イ ンプ リ メ ン ト さ れたポー ト は 図 1-54 のよ うになり ます。 図 1-54 の 割 り 込 みポー ト は、 AXI4 Slave Lite<br />
インターフェイスに 関 数 return を 含 める こ とで 作 成 されます。 割 り 込 みは、 ブロ ッ ク レベルのプロ ト コル ap_done<br />
ポー ト ( 関 数 が 終 了 し た こ と を 示 す) か ら 駆 動 さ れます。<br />
高 位 合 成 japan.xilinx.com 142<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-54<br />
C ドライバー ファイル<br />
図 1‐54 : まとめられた RTL ポー ト を 含 む AXI4 Slave Lite インターフェイス<br />
AXI4 Slave Lite イ ン ターフ ェ イ スがデザ イ ンに 追 加 さ れる と 、C ドライバー フ ァ イルのセ ッ ト が 自 動 的 に 作 成 さ れま<br />
す。 こ れら の C ドライバー ファイルには、CPU で 実 行 さ れる どの ソ フ ト ウ ェ アに も 統 合 で き る API が 含 まれ、 AXI4<br />
Slave Lite インターフェイスを 介 してデバイスとの 通 信 に 使 用 されます。<br />
C ドライバー ファイルは、 デザインが IP カタログか Pcore フォーマッ トで IP と してパッケージされると 作 成 されま<br />
す。 IP のパッ ケージに 関 しては、 「RTL デザイ ンのエ ク スポー ト 」 を 参 照 して く ださい。<br />
ドライバー ファイルは、 スタンドアロン モード と Linux モー ド 用 に 作 成 さ れます。 ス タ ン ド ア ロ ン モード の 場 合 、<br />
ド ラ イバーがその 他 のザイ リ ン ク ス スタンドアロン ドライバーと 同 じように 使 用 されます。Linux モー ド の 場 合 、 す<br />
べての C ファイル (.c) とヘッダー ファイル (.h) がソフ ト ウェア プロジェク トにコピーされます。<br />
高 位 合 成 japan.xilinx.com 143<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ドライバー ファイルと API 関 数 には、 最 上 位 関 数 か ら の 名 前 が 一 部 使 用 さ れます。 上 記 の 例 の 場 合 、 最 上 位 関 数 の<br />
名 前 は example です。 最 上 位 関 数 が DUT であれば、 example は DUT にな り ます。 ド ラ イバー ファイルはパッケージ<br />
済 み IP 内 (solution ディレク ト リ 内 の impl ディレク ト リ) に 作 成 されます。<br />
表 1‐21 : C ドライバー ファイル (example と い う 名 前 のデザイ ンの 場 合 )<br />
ファイル パス 使 用 モー ド 説 明<br />
data/example.mdd Standalone ド ライバー 定 義 ファイル。 Pcore をエクスポートする<br />
と、 このファイルの 名 前 は example_top_v2_1_0.mdd に<br />
なります。<br />
data/example.tcl スタンドアロン ソフト ウェアを SDK プ ロ ジ ェ ク ト に 統 合 する ために<br />
SDK で 使 用 。 Pcore をエクスポートする と、 このファ<br />
イルの 名 前 は example_top_v2_1_0.tcl にな り ます。<br />
src/xexample_hw.h 両 方 すべての 内 部 レ ジ ス タ のア ド レ ス オフセッ ト を 定 義<br />
src/xexample.h 両 方 API 定 義<br />
src/xexample.c 両 方 Standard API インプリ メンテーション<br />
src/xexample_sinit.c ス タ ン ド ア ロ ン 初 期 化 API インプリ メンテーション<br />
src/xexample_linux.c Linux 初 期 化 API インプリ メンテーション<br />
src/Makefile スタンドアロン Makefile<br />
xexample.h ファイルでは 次 の 2 つの 構 造 体 が 定 義 さ れます。<br />
• XExample_Config : これは、 IP インスタンスのコンフィギュレーション 情 報 ( 各 AXI4 Slave Lite インターフェイ<br />
スのベース アドレス) を 維 持 する ために 使 用 さ れます。<br />
• XExample : これは IP インスタンス ポ イ ン ターを 維 持 する ために 使 用 さ れます。ほ と んどの API ではこのイ ンス<br />
タンス ポ イ ン ターを 最 初 の 引 数 と し て 認 識 し ます。<br />
標 準 API インプリ メンテーションは、 xexample.c、 xexample_sinit.c、 xexample_linux.c ファイルに 提 供<br />
さ れてお り 、 次 の 操 作 を 実 行 する 関 数 が 含 まれます。<br />
• デバイ ス を 初 期 化<br />
• デバイ ス を 制 御 し、 そのス テータ ス を ク エ リ ー<br />
• レ ジ ス タ の 読 み 込 み/ 書 き 出 し<br />
• 割 り 込 みの 設 定 、 監 視 および 制 御<br />
次 の 表 は、 C ドライバー ファイルで 提 供 される API 関 数 をそれぞれ リ ス ト し ています。<br />
表 1‐22 : C ドライバーの API 関 数<br />
API 関 数<br />
XExample_Initialize<br />
XExample_CfgInitialize<br />
XExample_LookupConfig<br />
説 明<br />
この API は InstancePtr に 値 を 書 き 込 まれ、その 後 ほかの API で 使 用<br />
できます。 MMU がシ ス テムで 使 用 さ れる 場 合 を 除 き、 こ の API を<br />
呼 び 出 し てデバイ ス を 初 期 化 する こ と をお 勧 め し ます。<br />
デバイ ス コ ン フ ィ ギ ュ レーシ ョ ン を 初 期 化 し ます。 シ ス テムで<br />
MMU が 使 用 さ れる 場 合 は、 こ の 関 数 を 呼 び 出 す 前 に XDut_Config<br />
変 数 のベース ア ド レ ス を 仮 想 ベース アドレスに 置 換 します。 Linux<br />
システムでは 使 用 できません。<br />
ID を 指 定 してデバイ スのコンフ ィ ギュレーシ ョ ン 情 報 を 取 得 し ま<br />
す。 コ ン フ ィ ギ ュ レーシ ョ ン 情 報 には、 物 理 ベース アドレスが 含 ま<br />
れます。 Linux システムでは 使 用 できません。<br />
高 位 合 成 japan.xilinx.com 144<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐22 : C ドライバーの API 関 数<br />
XExample_Release<br />
XExample_Start<br />
XExample_IsDone<br />
XExample_IsIdle<br />
Linux で UIO デバイ ス を リ リ ース し ます。 munmap でマッ ピングを<br />
削 除 し ます。 プ ロ セスが 終 了 する と 、 マ ッ ピ ン グは 自 動 的 に 削 除 さ<br />
れます。 Linux シ ス テムでのみ 使 用 で き ます。<br />
デバイ ス を 起 動 し ます。 こ の 関 数 は、 デバイ スの ap_start ポー ト<br />
をアサート します。デバイスに ap_start ポー ト があ る 場 合 にのみ<br />
使 用 で き ます。<br />
デバイ スが 前 の 実 行 を 終 了 し たかど う かをチェ ッ ク し ます。 この 関<br />
数 では、 デバイ スの ap_done ポー ト の 値 が 戻 さ れます。 デバイ スに<br />
ap_done ポー ト があ る 場 合 にのみ 使 用 で き ます。<br />
デバイ スがア イ ド ル ステートかど うかをチェックします。 この 関 数<br />
では、 デバイ スの ap_idle ポー ト の 値 が 戻 さ れ ま す。 デバ イ ス に<br />
ap_idle ポー ト があ る 場 合 にのみ 使 用 で き ます。<br />
XExample_IsReady<br />
デバイ スが 次 の 入 力 を 受 信 する 準 備 ができ ているかど う かを<br />
チェッ ク します。 この 関 数 では、 デバイスの ap_ready ポー ト の 値 が<br />
戻 さ れます。 デバイ スに ap_ready ポー ト があ る 場 合 にのみ 使 用 で き<br />
ます。<br />
XExample_Continue ap_continue ポートをアサートします。デバイスに ap_continue ポー<br />
ト があ る 場 合 にのみ 使 用 で き ます。<br />
XExample_EnableAutoRestart<br />
XExample_DisableAutoRestart<br />
XExample_Set_ARG<br />
API 関 数<br />
XExample_Set_ARG_vld<br />
XExample_Set_ARG_ack<br />
デバイ スでの 自 動 再 開 を イ ネーブルに し ます。 こ れが 設 定 さ れる<br />
と、 デバイスは 現 在 のト ランザクショ ンが 終 了 したら、 次 のト ラン<br />
ザ ク シ ョ ン を 自 動 的 に 開 始 し ます。<br />
自 動 再 開 をデ ィ スエーブルに し ます。<br />
ARG ポー ト に 値 (top 関 数 のス カ ラー 引 数 ) を 書 き 込 みます。ARG が<br />
入 力 ポー ト の 場 合 にのみ 使 用 で き ます。<br />
ARG_vld ポー ト をアサー ト し ます。 ARG が 入 力 ポー ト で、 ap_hs ま<br />
たは ap_vld インターフェイス プロ ト コルを 使 用 してインプリ メン<br />
ト さ れる 場 合 にのみ 使 用 で き ます。<br />
ARG_ack ポー ト をアサー ト し ます。 ARG が 出 力 ポー ト で、 ap_hs ま<br />
たは ap_ack インターフェイス プロ ト コルを 使 用 してインプリ メン<br />
ト さ れる 場 合 にのみ 使 用 で き ます。<br />
XExample_Get_ARG<br />
ARG か ら 値 を 読 み 込 みます。 ARG ポー ト がデバイ スの 出 力 ポー ト<br />
の 場 合 にのみ 使 用 で き ます。<br />
XExample_Get_ARG_vld ARG_vld か ら 値 を 読 み 込 みます。 ARG がデバイ スの 出 力 ポー ト で、<br />
ap_hs または ap_vld インターフェイス プ ロ ト コルを 使 用 し て イ ンプ<br />
リ メ ン ト さ れる 場 合 にのみ 使 用 で き ます。<br />
XExample_Get_ARG_ack ARG_ack か ら 値 を 読 み 込 みます。 ARG がデバイ スの 入 力 ポー ト で、<br />
ap_hs または ap_vld インターフェイス プ ロ ト コルを 使 用 し て イ ンプ<br />
リ メ ン ト さ れる 場 合 にのみ 使 用 で き ます。<br />
XExample_InterruptGlobalEnable<br />
XExample_InterruptGlobalDisable<br />
XExample_InterruptEnable<br />
XExample_InterruptDisable<br />
説 明<br />
割 り 込 み 出 力 を イ ネーブルに し ます。 割 り 込 み 関 数 は、ap_start があ<br />
る 場 合 にのみ 使 用 で き ます。<br />
割 り 込 み 出 力 をデ ィ スエーブルに し ます。<br />
割 り 込 みソース を イ ネーブルに し ます。 最 大 で 2 つの 割 り 込 みソー<br />
ス (ap_done には source 0、 ap_ready には source 1) がある 可 能 性 があ<br />
ります。<br />
割 り 込 みソース をデ ィ スエーブルに し ます。<br />
高 位 合 成 japan.xilinx.com 145<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐22 : C ドライバーの API 関 数<br />
API 関 数<br />
XExample_InterruptClear<br />
XExample_InterruptGetEnabled<br />
XExample_InterruptGetStatus<br />
説 明<br />
割 り 込 みス テータ ス を ク リ アに し ます。<br />
割 り 込 みソースが イ ネーブルかど う かをチェ ッ ク し ます。<br />
割 り 込 みソースがト リガーされたかど うかをチェッ クします。<br />
API 関 数 の 詳 細 は、 「AXI4 Slave Lite の C ドライバーのリファレンス」 を 参 照 して ください。<br />
ハー ド ウ ェ アの 制 御<br />
ハー ド ウ ェ ア ヘッダー ファイル (この 例 の 場 合 xexample_hw.h) には、 AXI4 Slave Lite にま とめられたポートのメ<br />
モリ マップ ロケーションのリストが 含 まれます。<br />
// 0x00 :Control signals<br />
// bit 0 - ap_start (Read/Write/SC)<br />
// bit 1 - ap_done (Read/COR)<br />
// bit 2 - ap_idle (Read)<br />
// bit 3 - ap_ready (Read)<br />
// bit 7 - auto_restart (Read/Write)<br />
// others - reserved<br />
// 0x04 :Global Interrupt Enable Register<br />
// bit 0 - Global Interrupt Enable (Read/Write)<br />
// others - reserved<br />
// 0x08 :IP Interrupt Enable Register (Read/Write)<br />
// bit 0 - Channel 0 (ap_done)<br />
// others - reserved<br />
// 0x0c :IP Interrupt Status Register (Read/TOW)<br />
// bit 0 - Channel 0 (ap_done)<br />
// others - reserved<br />
// 0x10 :Data signal of a<br />
// bit 7~0 - a[7:0] (Read/Write)<br />
// others - reserved<br />
// 0x14 : reserved<br />
// 0x18 :Data signal of b<br />
// bit 7~0 - b[7:0] (Read/Write)<br />
// others - reserved<br />
// 0x1c : reserved<br />
// 0x20 :Data signal of c_i<br />
// bit 7~0 - c_i[7:0] (Read/Write)<br />
// others - reserved<br />
// 0x24 : reserved<br />
// 0x28 :Data signal of c_o<br />
// bit 7~0 - c_o[7:0] (Read)<br />
// others - reserved<br />
// 0x2c :Control signal of c_o<br />
// bit 0 - c_o_ap_vld (Read/COR)<br />
// others - reserved<br />
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on<br />
Handshake)<br />
AXI4 Slave Lite インターフェイスのレジスタを 正 しくプログラムするには、ハードウェア ポー ト がどのよ う に 操 作 さ<br />
れるのかを 理 解 しておく 必 要 があり ます。 「イ ン ターフ ェ イ ス 合 成 」 で 説 明 し たよ う に、 ブロ ッ クは 同 じポー ト プロ<br />
ト コルで 操 作 さ れます。<br />
た と えば、 ブ ロ ッ ク 操 作 を 開 始 する には、 ap_start レジスタを 1 に 設 定 する 必 要 があ り ます。 次 にデバイ スがレ ジ<br />
スタから AXI4 Slave Lite イ ン ターフ ェ イ スにま と め られた 入 力 を 読 み 込 みます。 ブ ロ ッ ク が 操 作 を 終 了 する と、<br />
高 位 合 成 japan.xilinx.com 146<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ap_done、ap_idle、および ap_ready がハー ド ウ ェ アの 出 力 ポー ト に よ り 設 定 さ れ、AXI4 Slave Lite インターフェ<br />
イ スにま と め られた 出 力 ポー ト の 結 果 が 適 切 な レ ジ ス タ か ら 読 み 込 まれます。こ れは、 図 1-48に 示 す 操 作 と 同 じ です。<br />
上 記 の 例 の 関 数 引 数 c のインプリ メンテーショ ンは、 ハードウェア ポー ト がどの よ う に 動 作 する のかを 理 解 する 重<br />
要 性 を 示 し ています。 関 数 引 数 c は 読 み 込 みおよび 書 き 出 し の 両 方 なので、 「イ ン ターフ ェ イ ス 合 成 」 に 示 すよ う に、<br />
入 力 ポー ト c_i と 出 力 ポート c_o として 別 々にインプリメントされます。<br />
AXI4 Slave Lite インターフェイスをプログラムするのに 最 初 に 推 奨 されるフローは、 関 数 を 1 度 だけ 実 行 する フ ロー<br />
です。<br />
• 割 り 込 み 関 数 を 使 用 し て、 割 り 込 みの 動 作 方 法 を 決 定 し ます。<br />
• ブ ロ ッ ク の 入 力 ポー ト にレ ジ ス タ 値 を 読 み 込 みます。 上 記 の 例 の 場 合 、 こ れは API 関 数 の XExample_Set_a、<br />
XExample_Set_b および XExample_Set_c_i を 使 用 して 実 行 されます。<br />
• XExample_Start を 使 用 して ap_start ビッ トを 1 に 設 定 し、 関 数 の 実 行 を 開 始 します。 このレジスタには、<br />
上 記 のヘ ッ ダー ファイルに 記 述 されているように、 セルフ ク リ ーニン グ 機 能 があ り ます。 ト ラ ンザ ク シ ョ ンが<br />
1 つ 終 了 する と 、 ブ ロ ッ ク は 操 作 を 一 時 停 止 し ます。<br />
• 関 数 が 実 行 さ れます。 生 成 さ れた 割 り 込 みを 処 理 し ます。<br />
• 出 力 レ ジ ス タ を 読 み 込 みます。 上 記 の 例 の 場 合 、 こ れは API 関 数 の XExample_Get_c_o_vld (データ が 有 効 な<br />
ことを 確 認 ) と XExample_Get_c_o を 使 用 して 実 行 されます。<br />
° AXI4 Slave Lite インターフェイスのレジスタは、 ポート と 同 じ I/O プ ロ ト コルに 従 います。 こ の 場 合 、 出 力<br />
valid がロジッ ク 1 に 設 定 されて、 データが 有 効 かど う かを 示 し ます。<br />
• 次 の ト ラ ンザク シ ョ ンでも 繰 り 返 し ます。<br />
2 つ 目 に 推 奨 さ れる フ ローは、 ブ ロ ッ ク の 継 続 実 行 です。 こ のモー ド の 場 合 、 AXI4 Slave Lite インターフェイスに 含<br />
まれる 入 力 ポー ト は、 コ ン フ ィ ギ ュ レーシ ョ ン を 実 行 する ポー ト のみであ るべき です。 ブ ロ ッ ク は 通 常 CPU よ りも<br />
速 く 実 行 さ れる 必 要 があ り ます。 ブ ロ ッ ク が 入 力 を 待 つ 必 要 があ る 場 合 、 ブ ロ ッ ク はほ と んどの 時 間 を 待 機 に 費 やす<br />
ことになります。<br />
• 割 り 込 み 関 数 を 使 用 し て、 割 り 込 みの 動 作 方 法 を 決 定 し ます。<br />
• ブ ロ ッ ク の 入 力 ポー ト にレ ジ ス タ 値 を 読 み 込 みます。 上 記 の 例 の 場 合 、 こ れは API 関 数 の XExample_Set_a、<br />
XExample_Set_a および XExample_Set_c_i を 使 用 して 実 行 されます。<br />
• API の XExample_EnableAutoRestart を 使 用 し て 自 動 開 始 関 数 を 設 定 し ます。<br />
• 関 数 が 実 行 さ れます。 各 ポー ト の I/O プ ロ ト コルに よ り 、 ブ ロ ッ ク を 介 し て 処 理 さ れるデータ が 同 期 さ れます。<br />
• 生 成 さ れた 割 り 込 みを 処 理 し ます。 出 力 レ ジ ス タ には こ の 操 作 中 ア ク セスで き ますが、 データ はよ く 変 更 さ れる<br />
可 能 性 があ り ます。<br />
• API 関 数 の XExample_DisableAutoRestart を 使 用 して、 さ らに 実 行 がされないよ う にし ます。<br />
• 出 力 レ ジ ス タ を 読 み 込 みます。 上 記 の 例 の 場 合 、 こ れは API 関 数 の XExample_Get_c_o および<br />
XExample_Set_c_o_vld を 使 用 して 実 行 されます。<br />
ソフトウェアの 制 御<br />
API 関 数 は、 CPU で 実 行 される ソ フ ト ウ ェアで 使 用 する と、 ハード ウ ェア ブロッ クを 制 御 できます。 プロセスの 概<br />
要 は 次 の とお り です。<br />
• ハー ド ウ ェ ア インスタンスのインスタンスを 作 成<br />
• デバイ ス コンフィギュレーションを 検 索<br />
• デバイ ス を 初 期 化<br />
• HLS ブロックの 入 力 パラ メーターを 設 定<br />
• デバイ ス を 開 始 し て 結 果 を 読 み 込 み<br />
こ のプ ロ セス を 抽 象 化 する と 、 次 の よ う にな り ます。 ソ フ ト ウ ェ ア 制 御 の 例 すべては、 表 1-4 に 示 す Zynq チュート<br />
リ アルを 参 照 し て く だ さ い。<br />
高 位 合 成 japan.xilinx.com 147<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
#include "xexample.h" // Device driver for HLS HW block<br />
#include “xparameters.h”<br />
// HLS HW instance<br />
XExample HlsExample;<br />
XExample_Config *ExamplePtr<br />
int main() {<br />
int res_hw;<br />
// Look Up the device configuration<br />
ExamplePtr = XExample_LookupConfig(XPAR_XEXAMPLE_0_DEVICE_ID);<br />
if (!ExamplePtr) {<br />
print("ERROR:Lookup of accelerator configuration failed.\n\r");<br />
return XST_FAILURE;<br />
}<br />
// Initialize the Device<br />
status = XExample_CfgInitialize(&HlsExample, ExamplePtr);<br />
if (status != XST_SUCCESS) {<br />
print("ERROR:Could not initialize accelerator.\n\r");<br />
exit(-1);<br />
}<br />
//Set the input parameters of the HLS block<br />
XExample_Set_a(&HlsExample, 42);<br />
XExample_Set_b(&HlsExample, 12);<br />
XExample_Set_c_i(&HlsExample, 1);<br />
// Start the device and read the results<br />
XExample_Start(&HlsExample);<br />
do {<br />
res_hw = XExample_Get_c_o(&HlsExample);<br />
} while (XExample_Get_c_o(&HlsExample) == 0); // wait for valid data output<br />
print("Detected HLS peripheral complete.Result received.\n\r");<br />
}<br />
IP インテグレーターでの AXI4 Slave Lite インターフェイスのカスタマイズ<br />
AXI4 Slave Lite インターフェイスを 使 用 した HLS の RTL デザイ ンが Vivado IP イ ンテグ レーターのデザ イ ンに 統 合 さ<br />
れる と、 ブロ ッ クをカスタマイズできます。 IP インテグレーターのブロック 図 で HLS ブロッ クを 選 択 し、 右 ク リ ッ<br />
クして [Customize Block] をクリ ックします。<br />
高 位 合 成 japan.xilinx.com 148<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ア ド レ ス 幅 はデフ ォル ト で 必 要 最 小 限 のサ イ ズに 設 定 さ れます。 こ れを 変 更 し て、 ア ド レ ス サイズが 32 ビッ ト 未 満<br />
のブ ロ ッ ク に 接 続 し ます。<br />
X-Ref Target - Figure 1-55<br />
AXI4 Master インターフェイスの 使 用<br />
AXI4 Master インターフェイスは 配 列 またはポインター/ リファレンス 引 数 で 使 用 され、 次 の 2 つのモード で 使 用 され<br />
ます。<br />
• 個 々のデータ 転 送<br />
• C の memcpy 関 数 を 使 用 し たバース ト モー ド のデータ 転 送<br />
個 別 のデータ 転 送 には、 次 の 例 に 示 すよ う に、 データ が 最 上 位 関 数 か ら 読 み 込 むか 最 上 位 関 数 へ 書 き 出 す と い う 特 徴<br />
があ り ます。<br />
または<br />
void bus (int *d) {<br />
static int acc = 0;<br />
acc += *d;<br />
*d = acc;<br />
}<br />
図 1‐55 : IP インテグレーターでの AXI4 Slave Lite インターフェイスのカスタマイズ<br />
void bus (int *d) {<br />
static int acc = 0;<br />
int i;<br />
for (i=0;i
第 1 章 : 高 位 合 成<br />
acc += d[i];<br />
d[i] = acc;<br />
}<br />
}<br />
ど ち ら の 場 合 もデータ は AXI4 Master イ ン ターフ ェ イ スで 単 純 な 読 み 込 みま たは 書 き 出 し 操 作 (1 度 に 1 アドレス、 1<br />
データ 値 ) として 転 送 されます。<br />
バース ト 転 送 モー ド では、 データ が 1 つのベース アドレスを 使 用 して 転 送 され、 複 数 のシーケンシャル データ サン<br />
プルが 後 に 続 く ので、 よ り 高 いデータ スループ ッ ト が 処 理 でき ます。バース ト モー ド は、 合 成 で 最 上 位 レベルのデー<br />
タ の 読 み 込 みま たは 書 き 出 し に C の memcpy が 使 用 さ れた 場 合 にのみ 実 行 で き ます。<br />
注 記 : C の memcpy 関 数 は、AXI4 Master イ ン ターフ ェ イ スで 指 定 さ れた 最 上 位 関 数 の 引 数 のデータ 転 送 に 使 用 さ れた<br />
場 合 の 合 成 でのみサポー ト されます。<br />
次 の 例 は、 バース ト モー ド のコ ピーを 示 し ています。 最 上 位 関 数 の 引 数 a は AXI4 Master インターフェイスとして 指<br />
定 されています。<br />
重 要 : AXI4 Master イ ン ターフ ェ イ ス を 使 用 する 場 合 、 使 用 さ れる C/RTL 協 調 シ ミ ュ レーシ ョ ンで 示 し た よ う に、 ブ<br />
ロック レベルの I/O プロ ト コル 信 号 を AXI4 Slave Lite インターフェイスにまとめる 必 要 があります。<br />
void example(volatile int *a){<br />
#pragma HLS INTERFACE m_axi depth=50 port=a<br />
#pragma HLS INTERFACE s_axilite port=return bundle=AXILiteS<br />
//Port a is assigned to an AXI4-master interface<br />
int i;<br />
int buff[50];<br />
//memcpy creates a burst access to memory<br />
memcpy(buff,(const int*)a,50*sizeof(int));<br />
for(i=0; i < 50; i++){<br />
buff[i] = buff[i] + 100;<br />
}<br />
memcpy((int *)a,buff,50*sizeof(int));<br />
}<br />
この 例 が 合 成 されると、 次 のインターフェイスになり ます (AXI4 イ ン ターフ ェ イ スは 非 展 開 で 表 示 )。<br />
X-Ref Target - Figure 1-56<br />
図 1‐56 : IP インテグレーターでの AXI4 Slave Lite インターフェイスのカスタマイズ<br />
IP インテグレーターでの AXI4 Master インターフェイスのカスタマイズ<br />
AXI4 Master インターフェイスを 使 用 した HLS の RTL デザイ ンが Vivado IP インテグレーターのデザインに 統 合 され<br />
ると、ブロックをカスタマイズできます。IP インテグレーターのブロック 図 で HLS ブロックを 選 択 し、 右 クリック<br />
して [Customize Block] をクリ ックします。<br />
高 位 合 成 japan.xilinx.com 150<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
次 の 図 は、 上 記 のデザイ ンの [Re-Customise IP] ダイアログ ボックスを 示 しています。 このデザインには、 AXI Slave<br />
Lite インターフェイスも 含 まれています。<br />
X-Ref Target - Figure 1-57<br />
図 1‐57 : IP インテグレーターでの AXI4 Master インターフェイスのカスタマイズ<br />
デザイ ン 最 適 化<br />
この 章 では、 Vivado HLS でパフ ォーマンスおよびエ リ アの 目 標 を 満 たすマイ ク ロ アーキテクチャが 生 成 される よ う<br />
にする ための、 さ ま ざ ま な 最 適 化 および 手 法 を 説 明 し ます。<br />
Vivado HLS で 提 供 さ れる 最 適 化 指 示 子 すべての リ ス ト は、 表 1-23 を 参 照 して く ださい。<br />
表 1‐23 : Vivado HLS の 最 適 化 指 示 子<br />
ALLOCATION<br />
ARRAY_MAP<br />
モード<br />
説 明<br />
使 用 さ れる、 演 算 、 コ ア、 ま たは 関 数 の 数 の 制 限 を 指 定 し ます。<br />
これによ り、ハードウェア リソースが 共 有 されるので、レイテ<br />
ンシが 増 加 さ れる 可 能 性 があ り ます。<br />
ブロック RAM リ ソ ース を 削 減 しやす く する ために 複 数 の 小 さ<br />
い 配 列 を 1 つの 大 き な 配 列 にま と めます。<br />
高 位 合 成 japan.xilinx.com 151<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐23 : Vivado HLS の 最 適 化 指 示 子<br />
モード<br />
ARRAY_PARTITION<br />
ARRAY_RESHAPE<br />
DATA_PACK<br />
DATAFLOW<br />
DEPENDENCE<br />
EXPRESSION_BALANCE<br />
FUNCTION_INSTANTIATE<br />
INLINE<br />
INTERFACE<br />
LATENCY<br />
LOOP_FLATTEN<br />
LOOP_MERGE<br />
LOOP_TRIPCOUNT<br />
OCCURRENCE<br />
PIPELINE<br />
PROTOCOL<br />
RESET<br />
RESOURCE<br />
説 明<br />
大 き な 配 列 を 複 数 の 小 さ な 配 列 に 分 割 する か、 個 別 のレ ジ ス タ<br />
に 分 割 し て、 データへのア ク セス を 改 善 し、 ブ ロ ッ ク RAM の<br />
ボトルネックをなくします。<br />
配 列 を 多 数 のエレ メ ン ト を 含 む も のか ら ワー ド 幅 の 広 い も の<br />
に 変 更 し ます。 多 数 のブロ ッ ク RAM を 使 用 せずにブ ロ ッ ク<br />
RAM ア ク セス を 向 上 する のに 有 益 です。<br />
構 造 体 (struct) のデータ フィールドを 1 つのス カ ラー ( ワード 数<br />
がよ り 大 きい) にパッ キング し ます。<br />
タスク レベルのパイ プ ラ イ ン を 有 効 に し、 関 数 およびループが<br />
同 時 に 実 行 さ れる よ う に し ます。 間 隔 を 最 小 限 にする ために 使<br />
用 します。<br />
ループ キ ャ リ ー 依 存 を 克 服 で き、ループがパイ プ ラ イ ンで き る<br />
ような (またはよ り 小 さい 間 隔 でパイプラインできるよ うな)<br />
追 加 情 報 を 提 供 する ために 使 用 し ます。<br />
自 動 演 算 調 整 をオフにで き ます。<br />
同 じ 関 数 の 異 な る イ ン ス タ ン ス を ローカルで 最 適 化 で き ます。<br />
関 数 を イ ン ラ イ ン 化 し、 関 数 の 階 層 をすべて 削 除 し ます。 関 数<br />
境 界 を 超 えた ロ ジ ッ ク 最 適 化 を イ ネーブルに し、 関 数 呼 び 出 し<br />
のオーバーヘ ッ ド を 削 減 する こ と でレ イ テンシ/ 間 隔 を 改 善 す<br />
るためにn 使 用 します。<br />
関 数 記 述 か ら どの よ う に RTL ポー ト が 作 成 されるかを 指 定 し<br />
ます。<br />
最 小 および 最 大 レ イ テンシ 制 約 を 指 定 で き ます。<br />
改 善 さ れた レ イ テンシを 使 用 し、 ネ ス ト さ れたループを 1 つの<br />
ループにコ ラ プス し ます。<br />
連 続 するループを 結 合 し て、 全 体 的 な レ イ テンシを 削 減 し、 共<br />
有 を 増 やし て 最 適 化 を 向 上 し ます。<br />
変 数 境 界 のあ るループに 使 用 さ れます。 ループ 反 復 カ ウ ン ト の<br />
概 算 を 提 供 し ます。 こ れは 合 成 には 影 響 がな く 、 レポー ト にの<br />
み 影 響 し ます。<br />
関 数 ま たはループをパ イ プ ラ イ ン 化 する と き、 囲 んでい る ( 外<br />
側 にあ る) 関 数 /ループのコー ド よ り も 実 行 速 度 が 遅 い コー ド を<br />
含 むロ ケーシ ョ ン を 指 定 する のに 使 用 し ます。<br />
ループま たは 関 数 内 での 演 算 を 同 時 処 理 で き る よ う に し て 開<br />
始 間 隔 を 削 減 し ます。<br />
プロ ト コル 領 域 になるコードの 領 域 を 指 定 します。プロ ト コル<br />
領 域 は、 手 動 で イ ン ターフ ェ イ ス プ ロ ト コルを 指 定 する ために<br />
使 用 し ます。<br />
特 定 のス テー ト 変 数 (グローバルまたはスタティ ック) のリ<br />
セ ッ ト を 追 加 ま たは 削 除 する ために 使 用 し ます。<br />
特 定 の ラ イ ブ ラ リ リソース (コア) が RTL で 変 数 ( 配 列 、 演 算<br />
式 、 関 数 の 引 数 ) をインプリ メントするために 使 用 されるよう<br />
にします。<br />
高 位 合 成 japan.xilinx.com 152<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐23 : Vivado HLS の 最 適 化 指 示 子<br />
STREAM<br />
UNROLL<br />
モード<br />
説 明<br />
DATAFLOW 最 適 化 中 に 特 定 の 配 列 を FIFO または RAM として<br />
イ ンプ リ メ ン ト する よ う に 指 定 し ます。<br />
for ループを 展 開 し、 複 数 の 操 作 を 1 つにま と めた ものではな<br />
く 、 複 数 の 個 別 の 操 作 を 作 成 し ます。<br />
Vivado HLS には、 最 適 化 指 示 子 だけでな く 、 多 く の コ ン フ ィ ギ ュ レーシ ョ ン 設 定 が 提 供 さ れています。 コ ン フ ィ ギ ュ<br />
レーシ ョ ン 設 定 は 合 成 のデフ ォル ト 設 定 を 変 更 する ために 使 用 さ れます。 コ ン フ ィ ギ ュ レーシ ョ ン 設 定 については、<br />
表 1-24を 参 照 して ください。<br />
表 1‐24 : Vivado HLS のコンフ ィギュレーシ ョ ン<br />
GUI 指 示 子<br />
Config Array Partition<br />
Config Bind<br />
Config Compile<br />
Config Dataflow<br />
Config Interface<br />
Config RTL<br />
Config Schedule<br />
説 明<br />
グローバル 配 列 を 含 めた 配 列 の 分 割 方 法 を 決 定 し、 分 割 が 配 列<br />
ポー ト に 影 響 する かど う か 決 定 し ます。<br />
合 成 のバイ ンデ ィ ン グ 段 階 で 使 用 する エフ ォー ト レベルを 指<br />
定 します。 使 用 さ れる 演 算 数 を グ ローバルに 最 小 限 に 抑 え る た<br />
めに 使 用 し ます。<br />
自 動 ループ パ イ プ ラ イ ンおよび 浮 動 小 数 点 の math 最 適 化 など<br />
の 合 成 特 有 の 最 適 化 を 制 御 し ます。<br />
デフォル ト のメモ リ チャネルと DATAFLOW 最 適 化 での FIFO<br />
の 深 さ を 指 定 し ます。<br />
最 上 位 関 数 の 引 数 に 関 連 付 け ら れていない I/O ポー ト が 制 御 さ<br />
れ、 最 終 的 な RTL か ら 未 使 用 のポー ト が 削 除 で き ます。<br />
フ ァ イ ルお よ びモジ ュ ールの 命 名 、 リ セ ッ ト 形 式 、 FSM エン<br />
コーディ ングを 含 めた 出 力 RTL を 制 御 できます。<br />
合 成 のス ケジ ュー リ ン グ 段 階 中 に 使 用 する エフ ォー ト レベル<br />
および 出 力 メ ッ セージの 詳 細 度 を 決 定 し ます。<br />
最 適 化 およびコ ン フ ィ ギ ュ レーシ ョ ンの 適 用 方 法 の 詳 細 は、「 最 適 化 指 示 の 適 用 」 を 参 照 して く ださい。 コンフ ィ ギュ<br />
レーシ ョ ンには、 [Solution] → [Solution Settings] → [General] を 使 用 してアクセスでき、 [Add] ボ タ ンで 追 加 で き ます。<br />
最 適 化 は、 通 常 のデザ イ ンへの 適 用 方 法 の コ ンテキ ス ト に 含 まれます。<br />
クロック、 リセットおよび RTL 出 力 については、 一 緒 に 説 明 し ます。 ターゲ ッ ト デバイ ス ご と の ク ロ ッ ク 周 波 数 は、<br />
最 適 化 を 駆 動 する 主 な 制 約 です。 高 位 合 成 ではターゲ ッ ト デバイ ス ターゲ ッ ト デバイ スか ら 各 ク ロ ッ ク サイクルへ<br />
なるべく 多 くの 演 算 を 配 置 しよう とされます。 最 終 的 な RTL で 使 用 される リ セ ッ ト 形 式 は、 FSM エンコーディ ング<br />
スタイルなどの 設 定 と 共 に config_rtl コ ン フ ィ ギ ュ レーシ ョ ン を 使 用 し て 制 御 さ れます。<br />
[Optimizing for Throughput] では、 タ ス ク がパイ プ ラ イ ン さ れてパフ ォーマン スが 改 善 さ れ、 タ ス ク 間 のデータ フロー<br />
が 改 善 さ れ、 構 造 が 最 適 化 さ れてパフ ォーマン ス を 制 限 し てい る 可 能 性 のあ る ア ド レ ス 問 題 が 改 善 さ れる 通 常 の 方 法<br />
が 実 行 されます。<br />
[Optimizing for Latency] では、 レ イ テンシ 制 約 と ループ 反 復 の 手 法 が 使 用 さ れ、 終 了 する のに 必 要 な ク ロ ッ ク サイク<br />
ル 数 が 削 減 されます。<br />
操 作 数 を 制 御 し、 ハー ド ウ ェ アで 操 作 がどの よ う に イ ンプ リ メ ン ト さ れる か と いった、 操 作 の イ ンプ リ メ ンテーシ ョ<br />
ン 方 法 に 集 中 する こ と が、 エ リ ア 改 善 の 基 本 的 な 手 法 です。<br />
高 位 合 成 japan.xilinx.com 153<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
クロック、 リセッ ト、 および RTL 出 力<br />
ク ロ ッ ク 周 波 数 の 指 定<br />
C および C++ デザイ ンでは、 ク ロ ッ ク 1 つのみがサポー ト されます。 デザイ ン 内 のすべての 関 数 に、 同 じ ク ロ ッ ク が<br />
適 用 さ れます。<br />
SystemC デザイ ンでは、 各 SC_MODULE に 異 なる ク ロ ッ ク を 指 定 でき ます。SystemC デザイ ンで 複 数 の ク ロ ッ ク を 指<br />
定 する には、 create_clock コマンドに -name オプシ ョ ン を 使 用 し て 複 数 の 名 前 を 指 定 し て ク ロ ッ ク を 作 成 し、<br />
CLOCK 指 示 子 ま たはプ ラ グマを 使 用 し て、 指 定 の ク ロ ッ ク で 合 成 する SC_MODULE を 含 む 関 数 を 指 定 し ます。 各<br />
SC_MODULE の 合 成 には、 1 つの ク ロ ッ ク のみを 使 用 で き ます。 複 数 の ク ロ ッ ク を 最 上 位 ポー ト か ら 個 々のブ ロ ッ ク<br />
に 接 続 し ている 場 合 などは、 複 数 のク ロ ッ ク を 関 数 を 介 し て 分 配 でき ますが、 各 SC_MODULE はそれぞれ 1 つの ク<br />
ロ ッ ク にのみ 応 答 し ます。<br />
クロック 周 期 は、[Solution] → [Solution Settings] で ns に 指 定 し ます。 Vivado HLS では、 ク ロ ッ クのばらつきの 概 念 を<br />
使 用 し て、 ユーザー 定 義 の タ イ ミ ン グ マージンが 提 供 さ れます。 ク ロ ッ ク 周 波 数 と デバイ ス ターゲッ ト 情 報 を 使 用<br />
し てデザ イ ンの 操 作 の タ イ ミ ン グが 概 算 さ れますが、 最 終 的 な コ ンポーネン ト 配 置 およびネ ッ ト 配 線 はわか り ませ<br />
ん。 これらの 操 作 は、 出 力 RTL の 論 理 合 成 で 実 行 さ れます。 こ の よ う な 場 合 、 Vivado HLS では 正 確 な 遅 延 は 判 別 で<br />
きません。<br />
クロックのばらつき (Clock Uncertainty) とは、 クロック 周 期 (Clock Period) か ら 合 成 で 使 用 さ れた ク ロ ッ ク 周 波 数 を 差<br />
し 引 いた 値 です ( 図 1-58)。<br />
X-Ref Target - Figure 1-58<br />
図 1‐58 : ク ロ ッ ク 周 期 と マージン<br />
こ れに よ り 、 ユーザー 指 定 のマージンが 使 用 さ れ、 論 理 合 成 や 配 置 配 線 などのダ ウ ン ス ト リ ーム プロセスで 操 作 を 完<br />
了 する のに 十 分 な タ イ ミ ング マージンが 供 給 されます。 FPGA デバイ スのほ と んどが 使 用 さ れる 場 合 、 セルを 接 続 す<br />
る ためにセルを 配 置 し てネ ッ ト を 配 線 する のは 理 想 的 な 方 法 ではない こ と があ り 、 タ イ ミ ン グ 遅 延 が 予 想 外 に 大 き く<br />
なってしま う こ とがあり ます。 このよ うな 状 況 の 場 合 、 タイ ミ ング マージンが 増 加 して も、 各 ク ロ ッ ク サイクルに<br />
ロ ジ ッ ク が 多 く パ ッ ク さ れすぎて し ま う よ う なデザ イ ンは 作 成 さ れず、 理 想 的 な 配 置 配 線 オプシ ョ ン よ り も 少 ない 場<br />
合 でも RTL 合 成 でタイミングを 満 たすことができるようになります。<br />
デフ ォル ト では、 ク ロ ッ ク のばらつきはサ イ ク ル 時 間 の 12.5% です。 こ の 値 は、 ク ロ ッ ク 周 期 と は 別 に 明 確 に 指 定 す<br />
ることができます。<br />
Vivado HLS ではすべての 制 約 (タイミング、 スループット、 レイテンシ) を 満 たそ う と されますが、 制 約 を 満 たすこ<br />
とができない 場 合 は、 常 に RTL デザイ ンが 出 力 されます。<br />
高 位 合 成 japan.xilinx.com 154<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
クロッ ク 周 期 によ り 推 論 されるタイ ミ ング 制 約 を 満 たすこ とができない 場 合 は、Vivado HLS で 次 のよ う な<br />
SCHED-644 と い う メ ッ セージが 表 示 さ れ、 達 成 可 能 な 最 良 のパフ ォーマン スのデザ イ ンが 出 力 さ れます。<br />
@W [SCHED-644] Max operation delay ( 2.39ns) exceeds the effective<br />
cycle time<br />
Vivado HLS で 特 定 のパスの タ イ ミ ン グ 要 件 が 満 た さ れない 場 合 で も、ほかのすべてのパスではタ イ ミ ン グが 達 成 さ れ<br />
ます。こ れに よ り 、ダ ウ ン ス ト リ ームの 論 理 合 成 でエ ラーのあ ったパスに 対 し て よ り 高 い 最 適 化 レベルを 使 用 する か、<br />
特 別 な 処 理 を 実 行 する こ と で、 タ イ ミ ングを 満 たす こ と がで き る かをユーザーが 評 価 で き ます。<br />
重 要 : 合 成 後 に 制 約 レポー ト を 確 認 し て、 すべての 制 約 が 満 た さ れたかど う か 確 認 する こ と が 重 要 です。 高 位 合 成 で<br />
生 成 さ れた 出 力 デザ イ ンがすべてのパフ ォーマン ス 制 約 を 満 たすわけではない と い う 点 に 留 意 し て く だ さ い。デザ イ<br />
ン レポートの 「Performance Estimates」 セクシ ョ ンを 確 認 してください。<br />
合 成 が 終 了 する と 、 デザ イ ン レポー ト が 階 層 の 各 関 数 ご と に 生 成 され、 solution のレポート フ ォルダーで 確 認 で き ま<br />
す。 デザ イ ン 全 体 のワース ト ケース タ イ ミ ン グは、 各 関 数 レポー ト にレポー ト さ れます。 階 層 の 各 レポー ト をすべ<br />
て 参 照 する 必 要 はあ り ません。<br />
タ イ ミ ング 違 反 が 最 適 化 やダ ウ ン ス ト リ ーム プロセスで 修 正 できないほど 大 きい 場 合 は、 よ り 高 速 のテク ノロジを<br />
ターゲ ッ ト する 前 に、 正 確 な レ イ テンシの 指 定 および 正 確 な イ ンプ リ メ ンテーシ ョ ン コ ア を 指 定 する 手 法 を 確 認 し て<br />
みて く ださい。<br />
リセッ トの 指 定<br />
RTL コ ン フ ィ ギ ュ レーシ ョ ン 設 定 で 最 も 重 要 なのは、 通 常 リ セ ッ ト 動 作 の 選 択 です。 リ セ ッ ト 動 作 について 説 明 する<br />
前 に、 初 期 化 と リ セ ッ ト の 違 いを 理 解 し てお く こ と が 重 要 です。<br />
初 期 化 動 作<br />
C では、 変 数 は static 修 飾 子 で 定 義 さ れ、 グ ローバルに 定 義 さ れた 変 数 はデフ ォル ト で 0 に 初 期 化 されます。 これら<br />
の 変 数 に 初 期 値 を 指 定 する こ と も 可 能 です。 変 数 の 初 期 値 を 指 定 し た 場 合 、 C コードの 初 期 値 はコンパイル 時 ( 時 間<br />
0) に 割 り 当 て ら れ、 その 後 再 び 割 り 当 て ら れる こ と はあ り ません。 ど ち ら の 場 合 も 同 じ 初 期 値 が RTL にインプリ メ<br />
ントされます。<br />
• RTL シミュレーション 中 は、 変 数 が C コー ド と 同 じ 値 で 初 期 化 さ れます。<br />
• 同 じ 変 数 は、 FPGA をプ ロ グ ラ ムする ために 使 用 さ れる ビ ッ ト ス ト リ ームで 初 期 化 さ れます。 デバイ スに 電 源 投<br />
入 さ れる と 、 変 数 が 初 期 化 ス テー ト で 開 始 さ れます。<br />
変 数 は、 C コー ド と 同 じ 初 期 ス テー ト で 開 始 し ますが、 こ の 初 期 ス テー ト に 強 制 的 に 戻 す 方 法 はあ り ません。 こ れ ら<br />
の 初 期 ステー ト に 戻 すには、 変 数 を リ セ ッ ト と 一 緒 にイ ンプ リ メ ン ト する 必 要 があ り ます。<br />
リ セ ッ ト 動 作 の 制 御<br />
リセット ポー ト は、リ セ ッ ト 信 号 が 適 用 された と きに リ セ ッ ト ポートに 接 続 されたレジスタおよびブロ ッ ク RAM を<br />
初 期 値 に 戻 すために FPGA で 使 用 されます。RTL のリセット ポー ト の 動 作 は、 図 1-59 に 示 す config_rtl コンフィ<br />
ギ ュ レーシ ョ ン を 使 用 し て 制 御 さ れます。<br />
このコンフィギュレーショ ンには、 図 1-59 に 示 すよ う に、 [Solution] → [Solution Settings] → [General] → [Add] →<br />
[config_rtl] か ら 設 定 で き ます。<br />
高 位 合 成 japan.xilinx.com 155<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
.<br />
X-Ref Target - Figure 1-59<br />
図 1‐59 : RTL コンフィギュレーション<br />
リ セ ッ ト 設 定 には、 リ セ ッ ト の 極 性 、 リ セ ッ ト が 同 期 か 非 同 期 かのど ち ら かを 設 定 する こ と がで き ますが、 reset オプ<br />
シ ョ ン を 使 用 する と 、 リ セ ッ ト 信 号 を 適 用 し た と き に リ セ ッ ト する レ ジ ス タ を 指 定 で き ます。<br />
重 要 : AXI4 インターフェイスがデザインで 使 用 される 場 合 は、 config_rtl コ ン フ ィ ギ ュ レーシ ョ ンの 設 定 に 関 係<br />
な く 、 リ セ ッ ト 極 性 は 自 動 的 にア ク テ ィ ブ Low に 変 更 されます。 これは、 AXI4 規 格 の 要 件 です。<br />
[reset] オプシ ョ ンには、 次 の 4 つの 設 定 があ り ます。<br />
• [none] : デザイ ンに リ セ ッ ト は 追 加 されません。<br />
• [control] : これはデフ ォル ト で、 すべての 制 御 レ ジ ス タ が リ セ ッ ト にな り ます。 制 御 レ ジ ス タは、 ス テー ト マシ<br />
ンに 使 用 されるレジスタで、 I/Oプ ロ ト コル 信 号 を 生 成 する ために 使 用 さ れます。 こ の 設 定 に よ り 、 デザ イ ンは<br />
その 動 作 ス テー ト を 即 座 に 開 始 で き る よ う にな り ます。<br />
高 位 合 成 japan.xilinx.com 156<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
• [state]: こ のオプシ ョ ンに よ り 、 レ ジ ス タ を 制 御 する リ セ ッ ト と ( 制 御 設 定 どお り )、 C コードのスタティ ッ ク 変 数<br />
およびグ ローバル 変 数 か ら 派 生 し た レ ジ ス タ ま たは メ モ リ が 追 加 さ れます。 こ の 設 定 に よ り 、 リ セ ッ ト が 適 用 さ<br />
れたら、 C コー ド で 初 期 化 さ れた ス タ テ ィ ッ ク およびグ ローバル 変 数 がそれら の 初 期 化 値 に リ セ ッ ト さ れます。<br />
• [all] : デザインのすべてのレジスタおよびメモリにリ セッ ト を 追 加 します。<br />
RESET 指 示 子 を 使 用 する と 、 さ ら に 詳 細 に リ セ ッ ト を 制 御 で き ます。 変 数 がス タ テ ィ ッ ク ま たはグ ローバルの 場 合 、<br />
RESET 指 示 子 を 使 用 し て リ セ ッ ト を 明 確 に 追 加 する か、 RESET 指 示 子 の off オプシ ョ ン を 使 用 し て リ セ ッ ト さ れる<br />
ものから その 変 数 を 削 除 でき ます。 これはス タ テ ィ ッ ク 配 列 またはグ ローバル 配 列 がデザイ ンに 含 まれる 場 合 に 特 に<br />
便 利 な こ と があ り ます。<br />
重 要 : 配 列 の 効 果 を 考 慮 する 場 合 は、 リ セ ッ ト の state または all オプシ ョ ンを 使 用 するのが 重 要 と な り ます。<br />
配 列 の 初 期 化 と リ セ ッ ト<br />
配 列 は、 ス タ テ ィ ッ ク 変 数 と し て 定 義 さ れる こ と が 多 いので、 すべてのエレ メ ン ト が 0 に 初 期 化 さ れる こ と が 多 く 、<br />
通 常 ブ ロ ッ ク RAM としてインプリメントされます。 リセット オプシ ョ ンの state または all が 使 用 される と 、 す<br />
べてのエレ メ ン ト がブロ ッ ク RAM と し て イ ンプ リ メ ン ト さ れる よ う にな り 、 リ セ ッ ト 後 にそれ ら の 初 期 値 に 戻 り ま<br />
す。 こ れに よ り 、 RTL デザ イ ンに 不 適 切 な 属 性 が 2 つがで き て し ま う 可 能 性 があ り ます。<br />
• 電 源 投 入 時 の 初 期 化 と は 異 な り 、 明 示 的 な リ セ ッ ト では RTL デザイ ンでブロ ッ ク RAM 内 の 各 ア ド レ スに 反 復 的<br />
に 値 を 設 定 する 必 要 あ り (N が 大 きい 場 合 は 多 数 の ク ロ ッ ク サイクルがかかるこ とあり)。<br />
• デザ イ ンのすべての 配 列 に 追 加 さ れる 場 合 、 reset<br />
リセット ロジックがこのようなブロック RAM ごとに 配 置 されないように、サイクル オーバーヘッ ド がないよ う にし<br />
て、 RAM のすべてのエレ メ ン ト が リ セ ッ ト される よ う にするには、 次 の 手 順 に 従 って く だ さい。<br />
• デフォル ト の control リセット モード と RESET 指 示 子 を 使 用 して、 リ セッ ト するスタテ ィ ッ ク またはグロー<br />
バル 変 数 を 個 別 に 指 定 し ます。<br />
• または、state リセット モー ド を 使 用 し てか ら、 RESET 指 示 子 に 対 し て off オプシ ョ ン を 使 用 し て 特 定 のス タ<br />
テ ィ ッ ク ま たはグ ローバル 変 数 か ら リ セ ッ ト を 削 除 し ます。<br />
RTL 出 力<br />
Vivado HLS の RTL 出 力 の さ ま ざ ま 特 性 は、 図 1-59 に し 示 すよ う に config_rtl コマンドを 使 用 して 制 御 できます。<br />
• RTL ステート マシンで 使 用 さ れる FSM エンコーディ ングのタイプを 指 定<br />
• –header オプシ ョ ン を 使 用 し て、 すべての RTL フ ァ イルに 著 作 権 情 報 な どのコ メ ン ト 文 字 列 を 追 加<br />
• prefix オプシ ョ ン を 使 用 し て 独 自 の 名 前 を 指 定 ( これがすべての RTL 出 力 フ ァ イルに 追 加 )<br />
デフォル ト の FSM コーディ ング スタイルは auto です。 auto エン コーデ ィ ン グ を 使 用 する と 、 Vivado HLS でコー<br />
ディング スタイルが 決 定 されますが、 ザイリンクス 合 成 ツール (Vivado および ISE) で 論 理 合 成 中 に FSM スタイルを<br />
抽 出 し て 再 イ ンプ リ メ ン ト する こ と がで き ます。 それ 以 外 のエン コーデ ィ ン グ スタイル (bin、 onehot) が 選 択 される<br />
場 合 は、 エン コーデ ィ ング ス タ イルはザ イ リ ン ク ス 論 理 合 成 ツールでは 最 適 化 し 直 すこ と がで き ません。<br />
RTL 出 力 フ ァ イルの 名 前 は、 合 成 の 最 上 位 関 数 の 名 前 か ら 派 生 さ れます。 異 な る RTL ブ ロ ッ ク が 同 じ 最 上 位 関 数 か<br />
ら 作 成 さ れる 場 合 、 RTL ファイルは 同 じ 名 前 になり、 同 じ RTL プロジェク トにまとめるこ とはできません。 prefix<br />
オプシ ョ ン を 使 用 する と 、 RTL フ ァ イルが 同 じ 最 上 位 関 数 か ら 生 成 で き る ので (デフ ォル ト では 最 上 位 関 数 と 同 じ 名<br />
前 になる)、 同 じデ ィ レ ク ト リ に 簡 単 にま と め る こ と がで き ます。<br />
スループ ッ ト の 最 適 化<br />
スループ ッ ト を 改 善 、 ま たは 開 始 間 隔 (II) を 削 減 する ためにデザ イ ン を 最 適 化 する フ ローについては、 「 合 成 ス ト ラ<br />
テジ」 を 参 照 し て く だ さ い。 こ こ では、 それを 実 行 する ために 使 用 さ れる 最 適 化 手 法 について 説 明 し ます。<br />
高 位 合 成 japan.xilinx.com 157<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
タスクのパイプライン<br />
パイ プ ラ イ ン 処 理 をする と 、 操 作 が 同 時 に 実 行 で き る よ う にな り ます。 タ ス ク では、 次 の 操 作 を 開 始 する 前 にすべて<br />
の 操 作 を 完 了 し てお く 必 要 はあ り ません。 パイ プ ラ イ ン 処 理 は、 関 数 およびループに 適 用 さ れます。 関 数 のパイ プ ラ<br />
イ ンでのスループ ッ ト の 改 善 については、 図 1-60 を 参 照 して く ださい。<br />
X-Ref Target - Figure 1-60<br />
図 1‐60 : 関 数 のパイ プ ラ イ ン 処 理<br />
パイ プ ラ イ ン 処 理 さ れていない 場 合 、 関 数 で 入 力 が 3 クロック サ イ ク ルご と に 読 み 込 まれて、 値 が 2 サイクルごとに<br />
出 力 さ れます。 関 数 の 開 始 間 隔 (II) は 3 で、 レ イテンシは 2 です。 パイ プ ラ イ ン 処 理 を 実 行 する と 、 新 し い 入 力 は 各<br />
サ イ ク ルで 読 み 込 まれます (II=1)。 出 力 レ イ テンシまたは 使 用 さ れる リ ソースに 変 更 はあ り ません。<br />
ループのパイ プ ラ イ ン 処 理 では、 図 1-61 に 示 すよ う に、 ループが 同 時 処 理 さ れる よ う に イ ンプ リ メ ン ト さ れます。<br />
図 1-61 (A) には、 デフ ォル ト の 順 次 操 作 を 示 し ます。 各 入 力 は 3 クロック サイクルごとに 処 理 され (II=3)、 最 後 の 出<br />
力 が 書 き 出 される までに 8 クロック サイクルかかり ます。<br />
図 1-61 (B) に 示 すパイプラ イ ン 処 理 されたループでは、 入 力 サンプルが 各 ク ロ ッ ク サ イ ク ルで 読 み 込 まれ、 最 終 的 な<br />
出 力 は 4 クロック サイ クル 後 に 書 き 出 されます。デザイ ンの 変 更 は 制 御 ロ ジ ッ ク のみに 加 え られるので、 同 じハード<br />
ウェア リ ソ ースで 開 始 間 隔 (II) と レ イ テンシの 両 方 を 向 上 で き ます。<br />
高 位 合 成 japan.xilinx.com 158<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-61<br />
図 1‐61 : ループのパイプ ラ イ ン 処 理<br />
タスクは PIPELINE 指 示 子 を 使 用 し てパイ プ ラ イ ン さ れます。 指 定 し なければ 開 始 間 隔 (II) はデフ ォル ト で 1 ですが、<br />
明 示 的 に 指 定 する こ と も で き ます。<br />
パイ プ ラ イ ンは 下 の 階 層 ではな く 、 特 定 の タ ス ク に 適 用 さ れます。 下 の 階 層 のループはすべて 自 動 的 に 展 開 さ れます。<br />
指 定 し た タ ス ク の 下 の 階 層 の 下 位 関 数 はすべて 個 別 にパイ プ ラ イ ン さ れる 必 要 があ り ます。 下 位 関 数 がパイ プ ラ イ ン<br />
される と、 それよ り 上 のパイプラインされたタスクでパイプライン パフ ォーマン スの 利 点 を 生 かす こ と がで き ます。<br />
反 対 に、 そのパイ プ ラ イ ン さ れた タ ス ク よ り も 下 の 下 位 関 数 はパイ プ ラ イ ン さ れず、 パイ プ ラ イ ンのパフ ォーマン ス<br />
が 限 定 さ れて し ま う 可 能 性 があ り ます。<br />
パイプラインされた 関 数 とループのビヘイビアーには 違 いがあります。<br />
• 関 数 の 場 合 、 パイ プ ラ イ ンは 永 遠 に 実 行 さ れて、 終 了 し ません。<br />
• ループの 場 合 、 パイ プ ラ イ ンはループのすべての 反 復 が 終 了 する まで 実 行 さ れます。<br />
このビヘイビアーの 違 いについては、 図 1-62 を 参 照 して く ださい。<br />
高 位 合 成 japan.xilinx.com 159<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-62<br />
図 1‐62 : 関 数 およびループのパイ プ ラ イ ン ビヘイビアー<br />
ビヘイ ビ アーの 違 いは、 パイ プ ラ イ ンへの 入 力 および 出 力 の 処 理 方 法 に 違 いがあ る こ と を 示 し ています。 上 の 図 に 示<br />
すよ う に、 パイ プ ラ イ ン さ れた 関 数 は 新 し い 入 力 を 読 み 込 み 続 けて、 新 し い 出 力 を 書 き 出 し 続 け ます。 反 対 に、 ルー<br />
プは 次 のループの 開 始 前 にまずそのループ 内 の 操 作 をすべて 終 了 する 必 要 があ る ので、 パイ プ ラ イ ン さ れたループに<br />
よりデータ ス トリームに 「バブル」 (ループが 最 後 の 反 復 の 実 行 を 終 了 し た と き に 新 し い 入 力 が 読 み 込 まれないポ イ<br />
ン ト と 、 ループが 新 し いループ 反 復 を 開 始 する と き に 新 し い 出 力 が 書 き 出 さ れないポ イ ン ト ) が 発 生 し ます。<br />
パイプラインされたループの 巻 き 戻 しによるパフォーマンス 改 善<br />
関 数 内 の 最 上 位 ループま たは DATAFLOW 最 適 化 の 領 域 で 使 用 さ れループは、 PIPELINE 指 示 子 に rewind オプシ ョ<br />
ンを 付 けると、 継 続 して 実 行 されるよ うにできます。<br />
次 の 図 は、 ループをパイプラ イ ンする 際 に rewind オプシ ョ ン を 使 用 し た 場 合 の 動 作 を 示 し ています。 ループは、 ルー<br />
プ 反 復 カ ウ ン ト の 終 了 直 後 に 再 実 行 さ れます。<br />
高 位 合 成 japan.xilinx.com 160<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-63<br />
ループが 関 数 の 最 上 位 ループの 場 合 、 そのループ よ り も 前 の C コー ド では 操 作 が 何 も 実 行 で き ません。 関 数 が 再 実 行<br />
さ れる よ う になってい る 場 合 、 ま たはループが 直 後 に 再 実 行 さ れる よ う になってい る 場 合 、 関 数 の 結 果 は 同 じ にな る<br />
はずです。<br />
ループが DATAFLOW 最 適 化 の 領 域 で 使 用 さ れる 場 合 、 ループは 関 数 階 層 であ る かの よ う に、 自 動 的 に イ ンプ リ メ ン<br />
トされます。<br />
パイプラインのフラ ッシュ<br />
図 1‐63 : rewind オプシ ョ ンを 使 用 したループのパイプライン<br />
パイ プ ラ イ ンは、 データ がパイ プ ラ イ ンの 入 力 に 入 って く る 限 り 実 行 さ れ 続 け ます。 処 理 するデータ がなければ、 パ<br />
イ プ ラ イ ンは 一 時 停 止 し ます。 こ れは 次 の 図 で 示 し ています。 入 力 データ の valid 信 号 が Low になる と、 データがな<br />
い こ と を 示 し ます。 処 理 するデータ が 新 し く 入 って く れば、 パイ プ ラ イ ンは 動 作 を 再 開 し ます。<br />
X-Ref Target - Figure 1-64<br />
図 1‐64 : rewind オプシ ョ ンを 使 用 したループのパイプライン<br />
場 合 に よ っては、 空 にで き た り 、 フ ラ ッ シ ュ ( 一 掃 ) で き るパイ プ ラ イ ンが 必 要 な こ と も あ り ます。 こ れを 実 行 する に<br />
は、 flush オプシ ョ ン を 使 用 し ます。 パイ プ ラ イ ン を フ ラ ッ シ ュする と 、 パイ プ ラ イ ンの 開 始 時 にデータ valid 信 号<br />
に よ り データ がない こ と が 示 さ れた と き に、 新 し い 入 力 の 読 み 込 みは 停 止 さ れますが、 処 理 は 継 続 さ れ、 最 後 の 入 力<br />
が 処 理 されて 出 力 される まで、 1 段 ずつパイ プ ラ イ ン 段 が 閉 鎖 さ れてい き ます。<br />
高 位 合 成 japan.xilinx.com 161<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
重 要 : パイプラインのフラッシュ 機 能 は、 パイプラインされた 関 数 でのみサポート されます。<br />
ループの 自 動 パイ プ ラ イ ン<br />
config_compile コ ン フ ィ ギ ュ レーシ ョ ンに よ り 、 ループは 反 復 回 数 に 基 づいて 自 動 的 にパイ プ ラ イ ン さ れる よ う<br />
にな り ます。このコンフ ィ ギュレーシ ョ ンには、[Solution] → [Solution Settings] → [General] → [Add] → [config_compile]<br />
からアクセスできます。<br />
pipeline_loops オプシ ョ ンで 反 復 回 数 を 設 定 し ます。 こ の 制 限 よ り も 下 の 反 復 カ ウ ン ト のループはすべて 自 動 的<br />
にパイプラ イ ン されます。 デフ ォル ト は 0 で、 ループの 自 動 パイ プ ラ イ ンは 実 行 さ れな く なっています。<br />
次 はそのコー ド 例 です。<br />
for (y = 0; y < 480; y++) {<br />
for (x = 0; x < 640; x++) {<br />
for (i = 0; i < 5; i++) {<br />
// do something 5 times<br />
…<br />
}<br />
}<br />
}<br />
pipelined_loops オプシ ョ ンが 10 ( 値 は 5 よ り 上 ですが 5*640 よ りも 下 ) に 設 定 される と 、 次 のパイプラ イ ンが 自<br />
動 的 に 実 行 さ れます。<br />
for (y = 0; y < 480; y++) {<br />
for (x = 0; x < 640; x++) {<br />
#pragma HLS PIPELINE II=1<br />
for (i = 0; i < 5; i++) {<br />
// This loop will be automatically unrolled<br />
// do something 5 times in parallel<br />
…<br />
}<br />
}<br />
}<br />
自 動 的 にパイプラ イ ン されないよ う にするループがデザイ ンに 含 まれる 場 合 は、 そのループに 対 し て、 PIPELINE 指<br />
示 子 の off オプシ ョ ン を 適 用 し ます。off オプションを 使 用 すると、ループの 自 動 パイプラインがされなくなります。<br />
パイプライン エ ラーの 対 処 方 法<br />
タ ス ク がパイプラ イ ン される と、 その 階 層 のループすべてが 自 動 的 に 展 開 されます。 これはパイプラ イ ンには 必 要 で<br />
すが、 ループに 変 数 境 界 があ る 場 合 は、 展 開 で き ません。 こ れに よ り 、 タ ス ク がパイ プ ラ イ ン さ れな く な り ます。 デ<br />
ザイ ンから このよ う なループを 削 除 する 方 法 については、 「 可 変 ループ 境 界 」 を 参 照 して く ださい。<br />
パイ プ ラ イ ン を 改 善 するための 配 列 の 分 割<br />
タスクをパイプラインすると、 次 のようなエラー メ ッ セージが 表 示 さ れる こ と が よ く あ り ます。<br />
@I [SCHED-61] Pipelining loop 'SUM_LOOP'.<br />
@W [SCHED-69] Unable to schedule 'load' operation ('mem_load_2', bottleneck.c:57) on<br />
array 'mem' due to limited memory ports.<br />
@I [SCHED-61] Pipelining result:Target II:1, Final II:2, Depth:3.<br />
この 例 では、 メモリ ポー ト の 数 が 限 られている ために メ モ リ への load (write) 操 作 がス ケジ ュールで き ないため、<br />
Vivado HLS で 指 定 し た 開 始 間 隔 (II) 1 に 到 達 で き なかった こ と を 示 す メ ッ セージが 表 示 さ れ、 最 終 的 な II が 必 要 な 1<br />
ではな く 、 2 である こ とがレポート されています。<br />
高 位 合 成 japan.xilinx.com 162<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
こ の 問 題 は、 通 常 配 列 が 原 因 で 発 生 し ます。 配 列 は、 ブ ロ ッ ク RAM ( 最 大 で も 2 つのデータ ポー ト しかない) として<br />
インプリ メント されます。 これにより、 read/write (または load/store) 集 中 型 アルゴ リ ズムのスループ ッ ト を 制 限 でき<br />
ます。 配 列 (1 つのブロ ッ ク RAM リソース) を 複 数 の 小 型 の 配 列 ( 複 数 のブ ロ ッ ク RAM) に 分 割 する こ と に よ り 、ポー<br />
ト 数 が 効 率 的 に 増 加 し、 バン ド 幅 を 向 上 で き る こ と があ り ます。<br />
配 列 は、 ARRAY_PARTITION 指 示 子 を 使 用 する と 分 割 で き ます。 Vivado HLS には、 3 タ イ プの 配 列 分 割 方 法 があ り<br />
ます ( 図 1-65)。 3 つの 分 割 方 式 は 次 の と お り です。<br />
• block : 元 の 配 列 の 連 続 し たエレ メ ン ト が 同 じ サ イ ズのブ ロ ッ ク に 分 割 さ れます。<br />
• cyclic : 元 の 配 列 の 交 互 のエレ メ ン ト が 同 じサイ ズのブロ ッ ク に 分 割 されます。<br />
• complete : デフ ォル ト では 配 列 がその 個 別 エレ メ ン ト に 分 割 さ れます。 1 つの メ モ リ は 複 数 のレ ジ ス タ に 分 解 さ<br />
れます。<br />
X-Ref Target - Figure 1-65<br />
block および cyclic パーテ ィ シ ョ ンの 場 合 は、 factor オプシ ョ ン を 使 用 する と 作 成 さ れる 配 列 数 を 指 定 で き ます。<br />
図 1-65 では、 factor オプシ ョ ン 2 が 使 用 さ れ、 配 列 が 2 つの 配 列 に 分 割 さ れています。 配 列 のエレ メ ン ト 数 が こ の 係<br />
数 の 整 数 倍 ではない 場 合 、 最 終 的 な 配 列 に 含 まれる エレ メ ン ト は 少 な く な り ます。<br />
多 次 元 配 列 を 分 割 する 際 は、 次 元 (dimension) オプシ ョ ン を 使 用 する と、 どの 次 元 を 分 割 する か 指 定 で き ます。<br />
図 1-66 は、 次 の コー ド 例 を 分 割 する ために、 次 元 (dimension) オプショ ンを 使 用 したと ころを 示 しています。<br />
void foo (...){<br />
int my_array[10][6][4];<br />
...<br />
}<br />
図 1‐65 : 配 列 の 分 割<br />
図 の 例 では、 3 次 元 を 4 つの 別 々の 配 列 に 分 割 し た 例 と 、 1 次 元 を 10 の 別 々の 配 列 に 分 割 し た 例 を 示 し ています。 次<br />
元 に 0 が 指 定 さ れる 場 合 は、 すべての 次 元 が 分 割 さ れます。<br />
高 位 合 成 japan.xilinx.com 163<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-66<br />
図 1‐66 : 配 列 次 元 の 分 割<br />
配 列 の 自 動 分 割<br />
config_array_partition コ ン フ ィ ギ ュ レーシ ョ ンでは、 エレ メ ン ト 数 に 基 づいて 配 列 が 自 動 的 に 分 割 さ れます。<br />
このコンフィギュレーショ ンには、 [Solution] → [Solution Settings] → [General] → [Add] → [config_array_partition] から<br />
アクセスできます。<br />
分 割 の し き い 値 は 調 整 が 可 能 で、 throughput_driven オプシ ョ ン を 使 用 する と、 分 割 を 完 全 に 自 動 化 で き ます。<br />
throughput_driven オプシ ョ ンが 選 択 さ れる と 、 Vivado HLS で 配 列 が 自 動 的 に 分 割 さ れ、 指 定 し た スループ ッ ト<br />
が 達 成 されます。<br />
FALSE 依 存 の 削 除 によ るループのパイ プ ラ イ ン 改 善<br />
ループのパイ プ ラ イ ンは、 ループのキ ャ リ ー 依 存 に よ り 回 避 で き ます。 複 雑 な 条 件 下 では、 自 動 依 存 解 析 が 保 守 的 す<br />
ぎ、 FALSE 依 存 を フ ィ ルターで 除 去 で き ない こ と があ り ます。<br />
こ の 例 の 場 合 、 Vivado HLS では cols の 値 が 認 識 されず、 buff_A[1][cols] への 書 き 込 み と buff_A[1][cols]<br />
の 読 み 出 し 間 の 依 存 性 が 常 にあ る と 仮 定 さ れています。<br />
高 位 合 成 japan.xilinx.com 164<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
void foo(int rows, int cols, ...)<br />
for (row = 0; row < rows + 1; row++) {<br />
for (col = 0; col < cols + 1; col++) {<br />
#pragma HLS PIPELINE II=1<br />
if (col < cols) {<br />
buff_A[2][col] = buff_A[1][col]; // read from buff_A[1][col]<br />
buff_A[1][col] = buff_A[0][col]; // write to buff_A[1][col]<br />
buff_B[1][col] = buff_B[0][col];<br />
temp = buff_A[0][col];<br />
}<br />
この 問 題 は、 図 1-67に 示 されています。<br />
cols=0 の 場 合 :<br />
• rows ループの 次 の 反 復 が 即 座 に 開 始 さ れる<br />
• buff_A[0][cols] か ら の 読 み 込 みは 書 き 出 し と 同 時 に 発 生 不 可 能<br />
X-Ref Target - Figure 1-67<br />
このよ うにアルゴリズムでは、 cols が 0 にな る 可 能 性 は 低 いのですが、 Vivado HLS ではデータ 依 存 に 関 する 仮 定 は<br />
で き ません。 こ の 問 題 を 回 避 する には、 DEPENDENCE 指 示 子 を 指 定 し て、 Vivado HLS に 依 存 に 関 する 情 報 を 入 力 し<br />
ます。 こ の 場 合 、 ループ 反 復 間 ( 次 の 場 合 buff_A および buff_B の 両 方 ) の 依 存 性 はない こ と を 記 述 し ます。<br />
void foo(int rows, int cols, ...)<br />
図 1‐67 : 配 列 次 元 の 分 割<br />
for (row = 0; row < rows + 1; row++) {<br />
for (col = 0; col < cols + 1; col++) {<br />
#pragma HLS PIPELINE II=1<br />
#pragma AP dependence variable=buff_A inter false<br />
#pragma AP dependence variable=buff_B inter false<br />
if (col < cols) {<br />
buff_A[2][col] = buff_A[1][col]; // read from buff_A[1][col]<br />
buff_A[1][col] = buff_A[0][col]; // write to buff_A[1][col]<br />
buff_B[1][col] = buff_B[0][col];<br />
temp = buff_A[0][col];<br />
}<br />
高 位 合 成 japan.xilinx.com 165<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
注 記 : 実 際 に 依 存 性 が false ではないのに false に 指 定 する と 、 ハー ド ウ ェ アが 不 正 にな る 可 能 性 があ り ます。 依 存 性<br />
は 指 定 する 前 に 正 し い こ と (true または false) を 確 認 して く ださい。<br />
依 存 性 を 指 定 する 場 合 、 主 に 二 種 類 あ り ます。<br />
• [Inter] : 同 じループの 異 な る 反 復 の 間 の 依 存 性 を 指 定 し ます。<br />
° こ の タ イ プの 依 存 性 を false に 設 定 する と 、 ループが 展 開 さ れていない 場 合 ま たは 部 分 的 に 展 開 さ れてい る<br />
場 合 に 並 列 実 行 が 可 能 にな り 、 true に 設 定 する と 並 列 実 行 は 不 可 能 にな り ます。<br />
• [Intra] : ループの 同 じ 反 復 内 での 依 存 性 を 指 定 し ます。 た と えば、 同 じ 反 復 の 最 初 と 最 後 に 配 列 にア ク セ スする<br />
ような 場 合 です。<br />
° こ の タ イ プの 依 存 性 を false に 設 定 する と 、 Vivado HLS に よ り ループ 内 で 操 作 を 自 由 に 移 動 で き、 パフ ォー<br />
マン ス ま たはエ リ ア を 向 上 で き る 可 能 性 が 高 く な り ます。 true に 設 定 する と 、 操 作 は 指 定 の 順 序 で 実 行 する<br />
必 要 があ り ます。<br />
データ の 依 存 性 は 解 消 する のが よ り 困 難 で、 通 常 ソース コー ド の 変 更 が 必 要 にな り ます。 ス カ ラ ー データ の 依 存 性<br />
は、 次 のよ う にな り ます。<br />
while (a != b) {<br />
if (a > b) a -= b;<br />
else b -= a;<br />
}<br />
こ のループの 次 の 反 復 は、 現 在 の 反 復 が 完 了 し て a と b の 値 がア ッ プデー ト さ れる まで 開 始 で き ません ( 図 1-68)。<br />
X-Ref Target - Figure 1-68<br />
図 1‐68 : スカラー デー タの 依 存 性<br />
ループの 反 復 を 始 め る のに 前 のループ 反 復 の 結 果 が 必 要 な 場 合 、 ループのパイ プ ラ イ ン 処 理 は 不 可 能 です。 Vivado<br />
HLS で 指 定 し た 開 始 間 隔 (II) でパイ プ ラ イ ンがで き ない 場 合 は、 開 始 間 隔 を 増 加 し ます。 パイ プ ラ イ ン 処 理 がま った<br />
く 不 可 能 な 場 合 は、 パイ プ ラ イ ン 処 理 が 停 止 さ れ、 パイ プ ラ イ ン 処 理 さ れていないデザ イ ンが 出 力 さ れます。<br />
最 適 なループ 展 開 によ るパイ プ ラ イ ンの 改 善<br />
Vivado HLS ではデフォルトで、ループは 非 展 開 のままになります。つまり、ループは 1 つのエンティティとして 処 理<br />
され、 ループのすべての 操 作 は 同 じハード ウ ェ ア リソースを 使 用 してインプリメントされます。<br />
UNROLL を 使 用 する と 、 ループを 展 開 ま たは 一 部 展 開 で き ます。<br />
図 1-69 に、 ループ 展 開 の 利 点 と 、 ループを 展 開 する 際 の 考 慮 事 項 を 示 し ます。 図 1-69 の 例 では、 a[i]、 b[i] およ<br />
び c[i] 配 列 がブ ロ ッ ク RAM にマップされる と 仮 定 しています。 図 1-69 か ら まず 最 初 にわか る こ と は、 ループの<br />
展 開 を 適 用 し ただけで 多 数 の イ ンプ リ メ ンテーシ ョ ン を 作 成 で き る と い う こ と です。<br />
高 位 合 成 japan.xilinx.com 166<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-69<br />
図 1‐69 : ループの 展 開<br />
• 非 展 開 のループ : ループが 展 開 さ れていない 場 合 、 各 反 復 は 異 な る ク ロ ッ ク サイクルで 実 行 されます。 このイン<br />
プリ メンテーションは 4 クロック サイクルかかり、 1 つの 乗 算 器 のみが 必 要 で、 各 ブ ロ ッ ク RAM はシングル<br />
ポー ト RAM にでき ます。<br />
• 部 分 的 に 展 開 さ れた ループ : この 例 では、ループが 係 数 2 で 部 分 的 に 展 開 さ れています。 こ の イ ンプ リ メ ンテー<br />
ションには、 各 RAM に 対 し て 同 じ ク ロ ッ ク サイクルで 2 つの 読 み 込 みま たは 書 き 出 し をサポー ト する ために、<br />
乗 算 器 2 つとデュアル ポー ト RAM が 必 要 ですが、 イ ンプ リ メ ンテーシ ョ ンには 2 クロック サイクル ( 非 展 開 の<br />
ループのバージ ョ ンの 開 始 間 隔 と レ イ テンシで 半 分 ずつ) しかかか り ません。<br />
• 完 全 に 展 開 さ れた ループ : ループ 操 作 すべてを 完 全 に 展 開 し た 例 は、 1 クロック サイ クルで 実 行 でき ますが、 乗<br />
算 器 が 4 つ 必 要 で、4 つの 読 み 込 み 操 作 と 4 つの 書 き 出 し 操 作 を 同 じ ク ロ ッ ク サ イ ク ルで 実 行 する 必 要 があ り ま<br />
す。 ブ ロ ッ ク RAM には 最 大 で 2 つのポー ト しか 含 める こ と ができないので、 このイ ンプ リ メ ンテーシ ョ ンでは<br />
配 列 が 分 割 さ れる 必 要 があ り ます。<br />
ループ 展 開 は、 デザ イ ンのループご と に UNROLL 指 示 子 を 適 用 する と 実 行 で き ます。 ま たは、 関 数 に UNROLL 指 示<br />
子 を 適 用 する と 、 UNROLL 指 示 子 をその 関 数 のス コープ 内 のすべてのループに 適 用 で き ます。<br />
高 位 合 成 japan.xilinx.com 167<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ループが 完 全 に 展 開 さ れる 場 合 、 データ 依 存 性 で 許 容 さ れる 限 り 、 すべての 操 作 が 並 列 処 理 で 実 行 さ れます。 ループ<br />
の 1 回 の 反 復 の 操 作 に 前 の 反 復 か ら の 結 果 が 必 要 な 場 合 、 それらは 並 列 では 実 行 さ れませんが、 データ が 使 用 可 能 に<br />
な る と すぐに 実 行 さ れます。 ループを 完 全 に 展 開 する と 、 ループ 本 体 に ロ ジ ッ ク の コ ピーが 複 数 含 まれます。<br />
次 のサンプル コー ド は、 最 適 なデザ イ ン を 作 成 する ためのループ 展 開 の 使 用 方 法 を 示 し ています。 次 の 例 では、 デー<br />
タ が 配 列 に イ ン ター リ ーブ さ れたチャ ネル と し て 格 納 さ れます。ループが II=1 でパイ プ ラ イ ン さ れる 場 合 は、 単 に 各<br />
チャネルが 8 番 目 のブ ロ ッ ク サ イ ク ルご と に 読 み 込 まれて 書 き 出 さ れます。<br />
// Array Order :0 1 2 3 4 5 6 7 8 9 10 etc. 16 etc...<br />
// Sample Order:A0 B0 C0 D0 E0 F0 G0 H0 A1 B1 C2 etc. A2 etc...<br />
// Output Order:A0 B0 C0 D0 E0 F0 G0 H0 A0+A1 B0+B1 C0+C2 etc. A0+A1+A2 etc...<br />
#define CHANNELS 8<br />
#define SAMPLES 400<br />
#define N CHANNELS * SAMPLES<br />
void foo (dout_t d_o[N], din_t d_i[N]) {<br />
int i, rem;<br />
// Store accumulated data<br />
static dacc_t acc[CHANNELS];<br />
// Accumulate each channel<br />
For_Loop: for (i=0;i
第 1 章 : 高 位 合 成<br />
}<br />
a[i] = b[i] + c[i];<br />
ループを 係 数 2 で 展 開 する と 、 次 の 例 の よ う にコー ド が 変 更 さ れます。 このコードでは、 機 能 が 同 じになるよ うに、<br />
break コ ン ス ト ラ ク ト が 使 用 さ れています。<br />
for(int i = 0; i < N; i += 2) {<br />
a[i] = b[i] + c[i];<br />
if (i+1 >= N) break;<br />
a[i+1] = b[i+1] + c[i+1];<br />
}<br />
N は 変 数 なので、 Vivado HLS で 最 大 値 を 特 定 でき ない 場 合 があ り ます ( 入 力 ポー ト で 駆 動 さ れてい る 可 能 性 あ り )。 展<br />
開 係 数 (この 場 合 は 2) が 最 大 反 復 カ ウ ン ト N の 整 数 係 数 だ と わかってい る 場 合 は、 skip_exit_check オプシ ョ ン<br />
で exit チェ ッ ク と 関 連 する ロ ジ ッ ク を 削 除 し ます。 非 展 開 の 結 果 は、 次 の よ う にな り ます。<br />
for(int i = 0; i < N; i += 2) {<br />
a[i] = b[i] + c[i];<br />
a[i+1] = b[i+1] + c[i+1];<br />
}<br />
こ れに よ り エ リ アが 最 小 限 に 抑 え ら れ、 制 御 ロ ジ ッ ク が 簡 略 化 さ れます。<br />
タスク レベルのパイプライン : データ フロー 最 適 化<br />
DATAFLOW 最 適 化 では、 一 連 のシーケ ンシ ャル タスク ( 関 数 ま たはループ) が 使 用 されて ( 図 1-70)、 並 列 処 理 アーキ<br />
テクチャが 作 成 されます ( 図 1-71)。データフロー パイ プ ラ イ ン 処 理 は、デザ イ ンのスループ ッ ト を 向 上 する 優 れた 方<br />
法 です。<br />
X-Ref Target - Figure 1-70<br />
図 1‐70 : 順 次 関 数 記 述<br />
X-Ref Target - Figure 1-71<br />
図 1‐71 : 並 列 処 理 アーキテ ク チ ャ<br />
図 1-71 に 示 すチ ャ ネルに よ り 、 タ ス ク は 前 の タ ス ク がすべての 演 算 を 完 了 する まで 待 機 せずに 開 始 さ れる よ う にな<br />
ります。 図 1-72 は、 DATAFLOW 最 適 化 に よ り タ ス ク を 重 ねて 実 行 し て、 デザ イ ン 全 体 のスループ ッ ト を 向 上 し て レ<br />
イ テンシを 削 減 する と こ ろ を 示 し ています。<br />
データ フ ロー パイ プ ラ イ ン 処 理 が 使 用 さ れていない 図 1-72 の (A) では、 func_A が 開 始 し てか ら 再 び 新 し い 入 力 を<br />
処 理 できるようになるのに 8 サイクルかかり、 func_C によ り 出 力 が 書 き 出 されるまでに 8 サイクルかかり ます。<br />
図 1-72 の (B) では、 func_A が 開 始 し てから 3 クロック サイクルごとに 新 しい 入 力 を 処 理 し 始 め (よ り 小 さ い 開 始 間<br />
隔 にな り )、 最 終 的 な 値 が 出 力 に 書 き 出 さ れる までに 5 サイクルかかり ます (レイテンシが 短 縮 されます)。<br />
高 位 合 成 japan.xilinx.com 169<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-72<br />
図 1‐72 : データ フロー パイプライン 処 理<br />
重 要 : 各 タスクの 引 数 は、 データフロー パイ プ ラ イ ン 処 理 を 使 用 する ためには 2 回 しか 使 用 でき ません。 1 回 は 1 つ<br />
の タ ス ク の 送 信 側 で、 も う 1 回 は 別 の タ ス ク の 受 信 側 と し て (return 引 数 を 含 む) 使 用 し ます。<br />
DATAFLOW 最 適 化 では、 条 件 付 き で 実 行 さ れる タ ス ク を 最 適 化 で き ません。 次 は、 こ の 問 題 を 示 す 例 です。<br />
void foo(boolean cond) {<br />
if (cond)<br />
Loop1: for(int i = 0; i < HEIGHT; i++) {<br />
...Loop1 Body<br />
}<br />
} else {<br />
Loop2: for(int j = 0; j < WIDTH; j++) {<br />
...Loop2 Body<br />
}<br />
}<br />
Loop3: for(int k = 0; k < NUM_CALC; k++) {<br />
...Loop3 Body<br />
}<br />
}<br />
高 位 合 成 japan.xilinx.com 170<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
Loop1 および Loop2 の 条 件 付 き の 実 行 に よ り 、 こ れ ら の 最 適 化 さ れるループ 間 のデータ フ ローは 実 行 さ れな く な り ま<br />
す。 各 ループは、 前 のループがすべての 操 作 を 完 了 し た 場 合 にのみ、 実 行 が 開 始 さ れます。 DATAFLOW 最 適 化 を 使<br />
用 する には、 コー ド を 次 の よ う に 変 更 する 必 要 があ り ます。<br />
void foo(boolean cond) {<br />
#pragma HLS DATAFLOW<br />
Loop1: for(int i = 0; i < HEIGHT; i++) {<br />
if (cond) {<br />
...Loop1 Body<br />
}<br />
}<br />
Loop2: for(int j = 0; j < WIDTH; j++) {<br />
(cond) {<br />
...Loop2 Body<br />
}<br />
}<br />
Loop3: for(int k = 0; k < NUM_CALC; k++) {<br />
...Loop3 Body<br />
}<br />
この 後 、 DATAFLOW 最 適 化 では、 データ が 使 用 可 能 にな る と すぐに 各 ループがデータ を 処 理 し 始 め、 可 能 な 限 り 最<br />
大 のスループ ッ ト になる よ う にされます。<br />
重 要 : データ フ ロー 最 適 化 を 使 用 する には、 各 タ ス ク の 引 数 は 2 回 しか 使 用 でき ません。 1 回 は 1 つのタ ス クの 送 信<br />
側 で、 も う 1 回 は 別 の タ ス ク の 受 信 側 と し て (return 引 数 を 含 む) 使 用 し ます。<br />
DATAFLOW 最 適 化 は、 関 数 ス コープにのみ 適 用 で き ます。 DATAFLOW 最 適 化 はループ 内 には 使 用 でき ません。 最<br />
適 化 は、 ス コープ 内 の タ ス ク にのみ 適 用 で き ます。 下 位 関 数 に 関 数 が 追 加 で 含 まれていて、 それ も DATAFLOW 最 適<br />
化 の 利 点 を 受 け る 可 能 性 があ る 場 合 は、 その 下 位 関 数 の 中 の 関 数 を イ ン ラ イ ン 化 し て DATAFLOW 最 適 化 を 適 用 する<br />
必 要 があ り ます。<br />
データ フ ロー メモリ チャネルの 設 定<br />
タ ス ク 間 のチャ ネルは、 データ の 送 信 側 と 受 信 側 のア ク セス パターンによって、ピンポン バッファーまたは FIFO で<br />
インプリ メント されます。<br />
• パラ メーター ( 送 信 側 ま たは 受 信 側 ) が 配 列 の 場 合 、 チャ ネルはピ ンポン バッファーとして、 標 準 メモリ アクセ<br />
ス を 使 用 し てア ド レ ス 信 号 と 制 御 信 号 と 共 に イ ンプ リ メ ン ト さ れます。<br />
• スカラー、 ポインター、 リ ファレンス パ ラ メ ーター、 および 関 数 return の 場 合 は、 チャ ネルが FIFO としてイン<br />
プリ メントされます。<br />
ス カ ラー 値 の 場 合 、 最 大 チャ ネル サイズは 1 で、 1 つの 関 数 か ら 別 の 関 数 に 渡 す こ と ので き る 値 は 1 つのみです。 配<br />
列 を 使 用 する 場 合 、 チ ャ ネル ( メモリ) のエレ メ ン ト 数 は 受 信 側 配 列 ま たは 送 信 側 配 列 の 最 大 サ イ ズで 定 義 さ れます。<br />
これによ り 、 チャネルに 常 に 損 失 な しにサンプルすべてを 維 持 でき る よ う にな り ますが、 場 合 によ っては、 これは 控<br />
えめすぎる 設 定 である こ とがあ り ます。<br />
たとえば、 タスクが 間 隔 1 でパイ プ ラ イ ン さ れる 場 合 がその 例 です。 こ の 場 合 、 送 信 側 ブ ロ ッ ク ま たはループが 新 し<br />
いデータ 値 を 出 力 する と 、 受 信 側 ブ ロ ッ ク ま たはループでそれが 読 み 込 まれる ので、 チャ ネルは 1 つの 値 のみを 維 持<br />
する 必 要 があ り ます。 こ の 場 合 、 元 の 配 列 サ イ ズで 定 義 さ れた メ モ リ は 無 駄 にな り ます。<br />
関 数 イ ン ターフ ェ イ ス 間 で 使 用 さ れるデフ ォル ト のチャ ネルは、config_dataflow コンフィギュレーションを 使 用<br />
し て 指 定 で き ます。 こ のコ ン フ ィ ギ ュ レーシ ョ ンでは、デザ イ ンのチャ ネルすべてのデフ ォル ト チャネルが 設 定 され<br />
ます。 チャネルで 使 用 される メモ リ サ イ ズを 削 減 する には、 FIFO を 使 用 できます。 FIFO を 使 用 する と 、 深 さ (FIFO<br />
のエレ メ ン ト 数 ) を fifo_depth オプシ ョ ン を 使 用 し て 明 確 に 指 定 で き ます。<br />
高 位 合 成 japan.xilinx.com 171<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
FIFO チャ ネルのサ イ ズを 指 定 する と 、 デフ ォル ト の 設 定 が 上 書 き さ れます。 指 定 し た FIFO サイズよ り もデザインの<br />
タ ス ク が 高 いレー ト でサンプルを 生 成 ま たは 消 費 する 場 合 は、 FIFO が 空 またはフルになって、デザイ ンが 停 止 し、 読<br />
み 込 み (または 書 き 出 し) がで き な く な り 、 停 止 し た ま ま 回 復 で き ない 状 態 にな り ます。 こ の 効 果 は、 協 調 シ ミ ュ レー<br />
シ ョ ン を 実 行 する 場 合 、 ま たは こ のブ ロ ッ ク が 完 全 なシ ス テムで 使 用 さ れる 場 合 にのみ 見 ら れます。<br />
こ の よ う な 場 合 、 デフ ォル ト の 深 さ で FIFO を 使 用 して、 C/RTL 協 調 シ ミ ュ レーシ ョ ンで 問 題 がなかったかど う かを<br />
確 認 し てか ら、 FIFO のサイズを 削 減 して、 C/RTL 協 調 シ ミ ュ レーシ ョ ンがそれで も 問 題 ないかど う かを 確 認 する こ<br />
とをお 勧 めします。RTL 協 調 シ ミ ュ レーシ ョ ンがエ ラーにな る 場 合 は、 FIFO のサイズが 小 さすぎて、 停 止 を 回 避 で<br />
き なかった 可 能 性 があ り ます。<br />
ブロック RAM または FIFO と し ての 配 列 の 指 定<br />
complete パーテ ィ シ ョ ンで 配 列 を レ ジ ス タ に 削 減 し ておかない 限 り 、 デフ ォル ト ではすべての 配 列 がブ ロ ッ ク RAM<br />
エレメント としてインプリ メントされます。 ブロック RAM ではな く FIFO を 使 用 する には、 STREAM 指 示 子 を 使 用<br />
し て 配 列 を ス ト リ ー ミ ング と し て 指 定 する 必 要 があ り ます。<br />
次 の 配 列 は、 自 動 的 にス ト リ ー ミ ング と し て 指 定 さ れます。<br />
• 最 上 位 関 数 イ ン ターフ ェ イ スの 配 列 は ap_fifo、axis または ap_hs インターフェイス タ イ プに 設 定 さ れる と 、<br />
自 動 的 にス ト リ ー ミ ング と し て 設 定 さ れます。<br />
• config_dataflow コンフィギュレーションでデフォルトのメモリ チャネルが FIFO と し て 設 定 さ れる 場 合 、<br />
DATAFLOW 最 適 化 が 適 用 さ れる 領 域 の 配 列 は 自 動 的 にス ト リ ー ミ ングに 設 定 さ れます。<br />
FIFO がイ ンプ リ メ ンテーシ ョ ンに 必 要 な 場 合 は、 その 他 の 配 列 はすべて STREAM 指 示 子 を 使 用 し て ス ト リ ー ミ ン グ<br />
と し て 指 定 さ れる 必 要 があ り ます。<br />
STREAM 指 示 子 は、 config_dataflow コンフィギュレーションで 指 定 したデフォルトのインプリメンテーション<br />
から DATAFLOW 領 域 の 配 列 を 変 更 する ために も 使 用 さ れます。<br />
• config_dataflow default_channel がピンポン バ ッ フ ァー と し て 設 定 さ れる 場 合 、 配 列 に STREAM 指 示 子<br />
を 適 用 する と 、 その 配 列 を FIFO としてインプリメントできます。<br />
° FIFO イ ンプ リ メ ンテーシ ョ ン を 使 用 する ためには、 配 列 がス ト リ ー ミ ン グ 手 法 でア ク セ ス さ れる 必 要 があ<br />
ります。<br />
• config_dataflow default_channel が FIFO と し て 指 定 さ れる 場 合 、STREAM 指 示 子 に off を 適 用 する と 、<br />
その 配 列 を ピ ンポン バッファーとしてインプリ メン トできます。<br />
レ イ テンシの 最 適 化<br />
レ イ テンシ 制 約 の 使 用<br />
Vivado HLS では、 どのスコープでもレイテンシ 制 約 の 使 用 がサポート されます。 レイテンシ 制 約 は LATENCY 指 示<br />
子 を 使 用 し て 指 定 さ れます。<br />
最 大 ま たは 最 小 の LATENCY 制 約 を ス コープに 設 定 する と 、 Vivado HLS では 関 数 のすべての 操 作 が 指 定 の ク ロ ッ ク<br />
サ イ ク ル 内 で 完 了 する よ う 処 理 さ れます。<br />
ループに 適 用 さ れた LATENCY 指 示 子 では、 ループの 1 回 の 反 復 に 必 要 な レ イ テンシを 指 定 し ます。 つま り 、 次 の 例<br />
の よ う に、 ループ 本 体 のレ イ テンシを 指 定 し ます。<br />
_A: for (i=0; i
第 1 章 : 高 位 合 成<br />
Region_All_Loop_A:{<br />
#pragma HLS latency max=10<br />
Loop_A: for (i=0; i
第 1 章 : 高 位 合 成<br />
• Sub ループを 抜 け るのに 1 クロック サイクル<br />
• 合 計 11 クロック サイクル<br />
この 単 純 な 例 では、 ADD ループの else 分 岐 で 問 題 を 解 決 で き る こ と は 簡 単 にわか り ますが、 よ り 複 雑 な コー ド では<br />
そ う 簡 単 にはわか ら ない 可 能 性 も あ る ので、 よ り わか り やすい コー ド 記 述 を 使 用 する こ と をお 勧 め し ます。<br />
LOOP_MERGE 最 適 化 指 示 子 を 使 用 する と 、 ループが 自 動 的 に 結 合 さ れる よ う にで き ます。 LOOP_MERGE 指 示 子 は、<br />
適 用 さ れた ス コープ 内 のループすべてを 結 合 し よ う と し ます。 上 記 の 例 の 場 合 、 ループの 結 合 に よ り 、 終 了 する のに<br />
6 ク ロ ッ ク し か 必 要 のない 図 1-73 の (B) の よ う な 制 御 構 造 が 作 成 さ れます。<br />
ループを 結 合 する と、 ループ 内 のロ ジ ッ ク が 一 緒 に 最 適 化 される よ う にな り ます。 上 記 の 例 の 場 合 、 デュ アル ポー ト<br />
ブロック RAM を 使 用 する と 、 加 算 および 乗 算 が 並 列 で 実 行 で き る よ う にな り ます。<br />
現 時 点 では、 Vivado HLS でのループ 統 合 には、 次 のよ う な 制 限 があ り ます。<br />
• ループの 範 囲 がすべて 変 数 であ る 場 合 は、 同 じ 値 であ る 必 要 があ り ます。<br />
• ループの 範 囲 が 定 数 であ る 場 合 は、 最 大 定 数 値 が 結 合 さ れたループの 範 囲 と し て 使 用 さ れます。<br />
• 変 数 範 囲 と 定 数 範 囲 の 両 方 を 使 用 するループは 結 合 で き ません。<br />
• 結 合 さ れるループの 間 の コー ド に よ る 影 響 がない こ と を 確 認 し ます。 つま り 、 こ の コー ド を 複 数 回 実 行 し た と き<br />
に、 同 じ 結 果 が 得 ら れる よ う に し ます。 た と えば、 a=b は 使 用 でき ますが、 a=a+1 は 使 用 でき ません。<br />
• ループに FIFO ア ク セスが 含 まれてい る 場 合 は 結 合 で き ません。 ループを 結 合 する と 、 FIFO の 読 み 込 みおよび 書<br />
き 出 し の 順 番 が 変 更 さ れる こ と があ り ます。<br />
ネッ ト リスト ループの 平 坦 化 によ る レ イ テンシの 改 善<br />
前 のセ ク シ ョ ンで 説 明 し た 連 続 するループ と 同 じ よ う に、 展 開 さ れていないネ ス ト ( 入 れ 子 ) になったループ 間 を 移 動<br />
するのにも ク ロ ッ ク サイ クルが 追 加 で 必 要 です。 外 側 のループから 内 側 のループに、 内 側 のループから 外 側 のループ<br />
に 移 動 する のに 1 クロック サイクルかかり ます。<br />
次 に 示 す 例 では、 ループ Outer を 実 行 する のに 200 クロック サイクル 余 分 にかかるこ とになり ます。<br />
void foo_top { a, b, c, d} {<br />
...<br />
Outer: while(j
第 1 章 : 高 位 合 成<br />
ネス ト された ループに 指 示 子 を 適 用 する 際 は、 ループ 本 体 を 含 む 最 内 側 のループに 適 用 する 必 要 があ り ます。<br />
set_directive_loop_flatten top/Inner<br />
ループのフ ラ ッ ト 化 は、 GUI の [Vivado HLS Directive Editor] ダイアログ ボックスを 使 用 しても 指 定 できます。 個 々の<br />
ループに、 ま たは 関 数 レベルで 指 示 子 を 適 用 し て 関 数 に 含 まれるすべてのループに 設 定 で き ます。<br />
エ リ アの 最 適 化<br />
データ 型 と ビ ッ ト 幅<br />
C 関 数 での 変 数 のビ ッ ト 幅 は、RTL インプリ メンテーションで 使 用 されるストレージ エレ メ ン ト のサ イ ズ と 演 算 子 に<br />
直 接 影 響 し ます。 変 数 に 12 ビットのみが 必 要 なのに 整 数 型 (32 ビット) で 指 定 されている と、 大 型 で 低 速 の 32 ビッ<br />
ト 演 算 子 が 使 用 さ れ、 1 クロック サ イ ク ルで 実 行 で き る 演 算 の 数 が 削 減 し、 開 始 間 隔 (II) およびレ イ テンシが 増 加 す<br />
る 可 能 性 があ り ます。<br />
• データ 型 には、 適 切 な 精 度 を 使 用 し ます。 詳 細 は、 「 効 率 的 なハー ド ウ ェ アのためのデータ 型 」 を 参 照 して く だ<br />
さい。<br />
• RAM またはレジスタとしてインプリ メント される 配 列 のサイズを 確 認 してください。 大 きすぎるエレメントが<br />
あると、 ハードウェア リソースでエリアが 無 駄 になります。<br />
• 乗 算 、 除 算 、 対 数 演 算 、 その 他 の 複 雑 な 算 術 演 算 に 特 に 注 目 し ます。 こ れら の 変 数 が 必 要 以 上 に 大 き い 場 合 、 エ<br />
リ アおよびパフ ォーマン スの 両 方 に 悪 影 響 を 与 え ます。<br />
関 数 のイ ン ラ イ ン 化<br />
関 数 を イ ン ラ イ ン 化 する と 、 階 層 関 数 が 削 除 さ れます。 関 数 は、 INLINE 指 示 子 を 使 用 し て イ ン ラ イ ン 化 さ れます。<br />
関 数 を イ ン ラ イ ン 化 する と 、 関 数 内 にコ ンポーネン ト が よ り 共 有 で き る よ う にな る か、 呼 び 出 し 関 数 の ロ ジ ッ ク で 最<br />
適 化 で き る よ う にな る ので、 エ リ アが 改 善 さ れる こ と があ り ます。 こ の タ イ プの 関 数 イ ン ラ イ ン 化 も Vivado HLS で<br />
自 動 的 に 実 行 さ れます。 小 さ い 関 数 は 自 動 的 に イ ン ラ イ ン 化 さ れます。<br />
イ ン ラ イ ン 化 によ り 、 関 数 の 共 有 を さ らに 制 御 でき ます。 関 数 が 共 有 される よ う にするには、 それらが 同 じ 階 層 レベ<br />
ル 内 で 使 用 さ れて い る 必 要 が あ り ま す。 こ の コ ー ド 例 の 場 合 、 foo_top 関 数 に よ り foo が 2 回 呼 び 出 さ れて、<br />
foo_sub 関 数 が 呼 び 出 さ れています。<br />
foo_sub (p, q) {<br />
int q1 = q + 10;<br />
foo(p1,q);// foo_3<br />
...<br />
}<br />
void foo_top { a, b, c, d} {<br />
...<br />
foo(a,b);//foo_1<br />
foo(a,c);//foo_2<br />
foo_sub(a,d);<br />
...<br />
}<br />
foo_sub 関 数 を イ ン ラ イ ン 化 し、 ALLOCATION 指 示 子 を 使 用 し て、 foo 関 数 の 1 イ ン ス タ ン スのみを 指 定 する と 、<br />
foo 関 数 の 1 イ ン ス タ ン スのみを 含 むデザ イ ン ( 上 記 の 1/3 のエ リ ア) にな り ます。<br />
foo_sub (p, q) {<br />
#pragma HLS INLINE<br />
int q1 = q + 10;<br />
foo(p1,q);// foo_3<br />
...<br />
}<br />
高 位 合 成 japan.xilinx.com 175<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
void foo_top { a, b, c, d} {<br />
#pragma HLS ALLOCATION instances=foo limit=1 function<br />
...<br />
foo(a,b);//foo_1<br />
foo(a,c);//foo_2<br />
foo_sub(a,d);<br />
...<br />
}<br />
INLINE 指 示 子 に recursive オプシ ョ ンを 使 用 する と、 指 定 し た 関 数 の 下 のすべての 関 数 が 繰 り 返 し イ ン ラ イ ン 化<br />
できます。 recursive オプシ ョ ン を 最 上 位 関 数 に 使 用 する と 、 デザ イ ンのすべての 関 数 階 層 が 削 除 さ れます。<br />
INLINE off オプシ ョ ン を 使 用 する と 、 関 数 が イ ン ラ イ ン 化 さ れな く な り ます。 こ のオプシ ョ ン を 使 用 する と 、Vivado<br />
HLS で 関 数 が 自 動 的 に イ ン ラ イ ン 化 さ れな く な り ます。<br />
INLINE 指 示 子 を 使 用 する と 、 ソ ース コードに 変 更 を 加 えずにコードの 構 造 を 大 き く 変 更 できるので、 アーキテク<br />
チャ 探 索 の 効 果 的 な 手 法 と し て 使 用 で き ます。<br />
多 く の 配 列 の 1 つの 大 き な 配 列 へのマ ッ プ<br />
C コード 内 に 小 さい 配 列 が 多 く あ る 場 合 は、 それら を 1 つの 大 き な 配 列 にマ ッ プする と 、 通 常 必 要 なブ ロ ッ ク RAM<br />
の 数 が 削 減 されます。<br />
各 配 列 はブ ロ ッ ク RAM にマップされます。 FPGA で 提 供 さ れる 基 本 的 なブ ロ ッ ク RAM の 単 位 は 18K です。 多 く の<br />
小 さい 配 列 で 18K がフルで 使 用 さ れない 場 合 、 小 さ い 配 列 を 1 つの 大 き な 配 列 にマ ッ プする と ブロ ッ ク RAM リソー<br />
ス を 効 率 的 に 使 用 で き ます。 ブ ロ ッ ク RAM が 18K を 超 え る 場 合 は、 それら が 複 数 の 18K に 自 動 的 にマ ッ プされま<br />
す。 合 成 レポー ト で [Utilization Report] → [Details] → [Memory] を 確 認 して、 デザインのブロ ッ ク RAM を 完 全 に 理 解<br />
しておいてください。<br />
ARRAY_MAP 指 示 子 では、 複 数 の 小 さ い 配 列 を 1 つの 大 きい 配 列 にマ ッ プするための 2 つの 方 法 がサポー ト されて<br />
います。<br />
• 水 平 マ ッ プ : 元 の 配 列 を 連 結 し て、 新 し い 配 列 を 作 成 し ます。 物 理 的 には、 要 素 数 の 多 い 1 つの 配 列 に イ ンプ リ<br />
メントされます。<br />
• 垂 直 マ ッ プ : 元 の 配 列 のワー ド を 連 結 し て、 新 し い 配 列 を 作 成 し ます。 物 理 的 には、 ビ ッ ト 幅 の 広 い 1 つの 配 列<br />
にインプリ メン ト されます。<br />
水 平 配 列 マ ッ プ<br />
次 のコード 例 には 2 つの 配 列 が 含 まれてお り 、 2 つの RAM コンポーネントにマップされます。<br />
void foo (...){<br />
int8 array1[M];<br />
int12 array2[N];<br />
...<br />
loop_1: for(i=0;i
第 1 章 : 高 位 合 成<br />
#pragma HLS ARRAY_MAP variable=array2 instance=array3 horizontal<br />
...<br />
loop_1: for(i=0;i
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-75<br />
図 1‐75 : オ フ セ ッ ト を 使 用 し た 水 平 マ ッ プ<br />
上 記 の 例 の 新 し く 作 成 さ れた 配 列 array3 は、 新 しい イ ン ス タ ン スにマ ッ プ された 変 数 のいずれかに RESOURCE 指<br />
示 子 を 適 用 する と 、 特 定 のブ ロ ッ ク RAM にマップでき ます。<br />
図 1-76 に 示 すブロ ッ ク RAM インプリ メンテーションは、 図 1-74 のマップ (オフセッ ト 使 用 なし) に 該 当 し ます。<br />
高 位 合 成 japan.xilinx.com 178<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-76<br />
水 平 マ ッ プに よ り ブ ロ ッ ク RAM コンポーネントの 数 を 削 減 できるので、 エリアは 改 善 されますが、 ブロック RAM<br />
ポー ト の 数 は 減 ったので、 スループ ッ ト およびパフ ォーマン スに 影 響 する 可 能 性 があ り ます。 こ の 制 限 を 解 消 する た<br />
め、 Vivado HLS では 垂 直 マ ッ プがサポー ト さ れています。<br />
垂 直 マ ッ プ<br />
図 1‐76 : 水 平 マ ッ プの メ モ リ<br />
垂 直 マ ッ プの 場 合 、 配 列 は 連 結 さ れて、 よ り 高 い 帯 域 幅 の 配 列 が 生 成 さ れます。 垂 直 マ ッ プは、 INLINE 指 示 子 に 垂<br />
直 オプシ ョ ン を 使 用 する と 適 用 さ れます。 図 1-77 は、 前 述 の 例 に 垂 直 マ ッ プを 適 用 し た 結 果 を 示 し ています。<br />
void foo (...){<br />
int8 array1[M];<br />
int12 array2[N];<br />
#pragma HLS ARRAY_MAP variable=array2 instance=array3 horizontal<br />
#pragma HLS ARRAY_MAP variable=array1 instance=array3 horizontal<br />
...<br />
loop_1: for(i=0;i
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-77<br />
図 1‐77 : 垂 直 マ ッ プ<br />
垂 直 マ ッ プでは、 コ マン ド で 指 定 さ れた 順 に 配 列 がマ ッ プ さ れます。 最 初 の 配 列 が LSB か ら 開 始 し、 最 後 の 配 列 は<br />
MSB で 終 了 し ます。 垂 直 マ ッ プの 後 、 新 し く 作 成 された 配 列 が 1 つのブロ ッ ク RAM コンポーネントにインプリ メン<br />
トされます ( 図 1-76)。<br />
X-Ref Target - Figure 1-78<br />
配 列 のマ ッ プおよび 注 意 事 項<br />
図 1‐78 : 垂 直 マ ッ プの メ モ リ<br />
重 要 : 配 列 変 換 のオブジ ェ ク ト は、 適 用 さ れる その 他 の 指 示 子 よ り も 前 に ソ ース コードに 含 まれている 必 要 があ り ま<br />
す。<br />
高 位 合 成 japan.xilinx.com 180<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
horizonal マ ッ プを 使 用 し て 分 割 さ れた 配 列 か ら のエレ メ ン ト を 1 つの 配 列 にマ ッ プする には、 分 割 さ れる 配 列 の<br />
エレ メン ト をそれぞれ ARRAY_MAP 指 示 子 で 指 定 する 必 要 があ り ます。 た と えば、 次 の Tcl コマンドは accum 配 列<br />
を 分 割 して、 結 果 のエレ メ ン ト を 一 緒 にマップし 戻 しています。<br />
#pragma HLS array_partition variable=m_accum cyclic factor=2 dim=1<br />
#pragma HLS array_partition variable=v_accum cyclic factor=2 dim=1<br />
#pragma HLS array_map variable=m_accum[0] instance=mv_accum horizontal<br />
#pragma HLS array_map variable=v_accum[0] instance=mv_accum horizontal<br />
#pragma HLS array_map variable=m_accum[1] instance=mv_accum_1 horizontal<br />
#pragma HLS array_map variable=v_accum[1] instance=mv_accum_1 horizontal<br />
グ ローバル 配 列 も マ ッ プでき ますが、 結 果 の 配 列 イ ン ス タ ン スがグ ローバルにな り 、 同 じ 配 列 インスタンスにマップ<br />
されたローカル 配 列 もすべてグ ローバルにな り ます。 異 な る 関 数 の ローカル 配 列 が 同 じ ターゲ ッ ト 配 列 にマ ッ プ さ れ<br />
る と 、 その ターゲ ッ ト 配 列 イ ン ス タ ン スはグ ローバルにな り ます。<br />
配 列 の 関 数 引 数 は、 それら が 同 じ 関 数 に 対 する 引 数 の 場 合 にのみマ ッ プ さ れる こ と があ り ます。<br />
配 列 の 変 更<br />
ARRAY_RESHAPE 指 示 子 を 使 用 する と 、ARRAY_MAP の 垂 直 モード で ARRAY_PARTITIONING がま とめられ、 分 割<br />
属 性 の 利 点 は 残 し た ま ま、 ブ ロ ッ ク RAM の 数 が 削 減 されます。<br />
次 はそのコー ド 例 です。<br />
void foo (...){<br />
int array1[N];<br />
int array2[N];<br />
int array3[N];<br />
#pragma HLS ARRAY_RESHAPE variable=array1 block factor=2 dim=1<br />
#pragma HLS ARRAY_RESHAPE variable=array2 cycle factor=2 dim=1<br />
#pragma HLS ARRAY_RESHAPE variable=array3 complete dim=1<br />
...<br />
}<br />
高 位 合 成 japan.xilinx.com 181<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ARRAP_RESHAPE 指 示 子 では 配 列 が 図 1-79 に 示 すよ う に 変 形 さ れます。<br />
X-Ref Target - Figure 1-79<br />
関 数 のイ ンス タ ンシエーシ ョ ン<br />
関 数 の イ ン ス タ ンシエーシ ョ ンは、 関 数 階 層 を 保 持 し なが ら、 関 数 の 特 定 の イ ン ス タ ン スに 対 し て ローカル 最 適 化 を<br />
実 行 する 最 適 化 手 法 です。 こ れに よ り 関 数 呼 び 出 し 周 辺 の 制 御 ロ ジ ッ ク が 簡 略 化 さ れ、 レ イ テンシおよびスループ ッ<br />
ト が 向 上 する こ と があ り ます。<br />
FUNCTION_INSTATIATE 指 示 子 では、 関 数 が 呼 び 出 さ れた と き に 関 数 の 一 部 の 入 力 が 定 数 であ る こ と があ る と い う<br />
事 実 を 利 用 し て、 周 辺 の 制 御 構 造 を 簡 略 化 し、 よ り 最 適 化 さ れた よ り 小 さ い 関 数 ブ ロ ッ ク を 作 成 し ます。 こ れを 例 を<br />
使 用 し て 説 明 し ます。<br />
次 のよ う なコード があ る と し ます。<br />
図 1‐79 : 配 列 の 変 更<br />
void foo_sub(bool mode){<br />
#pragma HLS FUNCTION_INSTANTIATE variable=mode<br />
if (mode) {<br />
// code segment 1<br />
} else {<br />
// code segment 2<br />
}<br />
}<br />
void foo(){<br />
#pragma HLS FUNCTION_INSTANTIATE variable=select<br />
foo_sub(true);<br />
foo_sub(false);<br />
}<br />
foo_sub 関 数 は 複 数 回 実 行 さ れる よ う に 記 述 さ れてい る のは 明 ら かですが、 mode が ture であるか false であるかに<br />
よ って、 排 他 的 であ る 場 合 と ない 場 合 があ り ます。 foo_sub 関 数 の 各 インスタンスは 同 じようにインプリ メント さ<br />
れます。 こ れは 関 数 の 再 利 用 およびエ リ ア 最 適 化 の 面 では 有 益 ですが、 関 数 内 の 制 御 ロ ジ ッ ク が 必 要 以 上 に 複 雑 に<br />
なってしまいます。<br />
高 位 合 成 japan.xilinx.com 182<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
FUNCTION_INSTATIATE 最 適 化 を 使 用 する と 、 各 イ ン ス タ ン ス を 個 別 に 最 適 化 で き る ので、 機 能 およびエ リ アが 削<br />
減 されます。 FUNCTION_INSTATIATE 最 適 化 を 実 行 する と 、 上 記 のコー ド は 2 つの 別 々の 関 数 を 含 む も のに 変 更 さ<br />
れ、 それぞれが 次 に 示 すよ う に、 可 能 性 のあ る 別 々のモー ド 値 に 最 適 化 さ れます。<br />
void foo_sub1() {<br />
// code segment 1<br />
}<br />
void foo_sub1() {<br />
// code segment 2<br />
}<br />
void A(){<br />
B1();<br />
B2();<br />
}<br />
イ ン ラ イ ン 化 をい く つも 適 用 し た り コー ド を 変 更 し た り し ない と 関 数 共 有 が 困 難 な 場 合 と 同 様 、 関 数 が 異 な る 階 層 レ<br />
ベルで 使 用 さ れる 場 合 、FUNCTION_INSTATIATE を 使 用 する こ と でエ リ アが 改 善 さ れる こ と があ り ます。 ローカルで<br />
最 適 化 さ れた 小 さ い コ ピーの 方 が、 共 有 で き ない 大 き い コ ピーが 多 数 あ る よ り も 効 率 的 です。<br />
ハー ド ウ ェ ア リソースの 制 御<br />
Vivado HLS の 合 成 では、 次 の 基 本 的 な タ ス ク が 実 行 さ れます。<br />
• まず、 C、 C++、 または SystemC のソース コー ド が 演 算 子 を 含 む 内 部 データベースにエ ラ ボレー ト さ れます。<br />
° 演 算 子 では、 加 算 、 乗 算 、 配 列 の 読 み 込 みおよび 書 き 出 し など、 C コー ド の 演 算 が 示 さ れます。<br />
• ハー ド ウ ェ ア 演 算 を イ ンプ リ メ ン ト する コ アには 演 算 子 が 含 まれます。<br />
° コ アは、 デザ イ ン 作 成 のために 使 用 さ れる 特 定 ハー ド ウ ェ ア コンポーネント ( 加 算 器 、 乗 算 器 、 パイ プ ラ イ<br />
ン 乗 算 器 、 ブ ロ ッ ク RAM など) です。<br />
各 段 階 ご と に 制 御 が 提 供 さ れる ので、 ハー ド ウ ェ ア イ ンプ リ メ ンテーシ ョ ン を よ り 精 度 の 高 い 粒 度 で 制 御 で き ます。<br />
演 算 子 数 の 制 限<br />
デフォル ト では Vivado HLS はまずパフ ォーマン ス を 最 大 限 に し よ う と する ため、 場 合 に よ っては、 エ リ ア 削 減 のた<br />
め 明 示 的 に 演 算 子 の 数 を 制 限 する 必 要 があ り ます。デザ イ ンの 演 算 子 数 を 制 限 する 方 法 はエ リ ア 削 減 には 効 率 的 な 方<br />
法 で、 演 算 を 共 有 させる こ と でエ リ アは 削 減 しやす く な り ます。<br />
ALLOCATION 指 示 子 を 使 用 する と 、 演 算 子 、 コ ア、 ま たは 関 数 がデザ イ ンで 使 用 さ れる 数 を 制 限 で き ます。 た と え<br />
ば、 foo というデザインには 乗 算 が 317 あるのに FPGA には 乗 算 器 リ ソース (DSP48) が 256 しかない 場 合 、 次 の<br />
ALLOCATION 指 示 子 を 使 用 する と 、 最 大 256 の 乗 算 (mul) 演 算 子 を 含 むデザ イ ンが 作 成 さ れます。<br />
dout_t array_arith (dio_t d[317]) {<br />
static int acc;<br />
int i;<br />
#pragma HLS ALLOCATION instances=mul limit=256 operation<br />
for (i=0;i
第 1 章 : 高 位 合 成<br />
デザ イ ンのコ アおよび 関 数 の 数 を 制 限 する のに ALLOCATION 指 示 子 も 使 用 さ れてい る ので、 演 算 を 指 定 する のに<br />
type オプシ ョ ンが 使 用 さ れています。 演 算 の 前 に 演 算 子 の 数 が 制 限 さ れる よ う に 指 定 し てお く と 、 最 終 的 なデザ イ ン<br />
で 使 用 される コ アの 数 を 少 な く でき ます。<br />
表 1-25 には ALLOCATION 指 示 子 を 使 用 し て 制 御 で き る 演 算 がすべて リ ス ト さ れています。<br />
表 1‐25 : Vivado HLS の 演 算 子<br />
演 算 子<br />
説 明<br />
add<br />
ashr<br />
dadd<br />
dcmp<br />
ddiv<br />
dmul<br />
drecip<br />
drem<br />
drsqrt<br />
dsub<br />
dsqrt<br />
fadd<br />
fcmp<br />
fdiv<br />
fmul<br />
frecip<br />
frem<br />
frsqrt<br />
fsub<br />
fsqrt<br />
icmp<br />
lshr<br />
mul<br />
sdiv<br />
shl<br />
srem<br />
sub<br />
udiv<br />
urem<br />
整 数 の 加 算<br />
四 則 演 算 右 シフ ト<br />
倍 精 度 浮 動 小 数 点 の 加 算<br />
倍 精 度 浮 動 小 数 点 の 比 較<br />
倍 精 度 浮 動 小 数 点 の 除 算<br />
倍 精 度 浮 動 小 数 点 の 乗 算<br />
倍 精 度 浮 動 小 数 点 の 逆 数<br />
倍 精 度 浮 動 小 数 点 の 剰 余<br />
倍 精 度 浮 動 小 数 点 の 逆 数 平 方 根<br />
倍 精 度 浮 動 小 数 点 の 減 算<br />
倍 精 度 浮 動 小 数 点 の 平 方 根<br />
単 精 度 浮 動 小 数 点 の 加 算<br />
単 精 度 浮 動 小 数 点 の 比 較<br />
単 精 度 浮 動 小 数 点 の 除 算<br />
単 精 度 浮 動 小 数 点 の 乗 算<br />
単 精 度 浮 動 小 数 点 の 逆 数<br />
単 精 度 浮 動 小 数 点 の 剰 余<br />
単 精 度 浮 動 小 数 点 の 逆 数 平 方 根<br />
単 精 度 浮 動 小 数 点 の 減 算<br />
単 精 度 浮 動 小 数 点 の 平 方 根<br />
整 数 比 較<br />
論 理 演 算 右 シフ ト<br />
乗 算<br />
符 号 付 き 除 算<br />
左 シフ ト<br />
符 号 付 き 剰 余<br />
減 算<br />
符 号 な し 除 算<br />
符 号 な し 剰 余<br />
高 位 合 成 japan.xilinx.com 184<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
演 算 子 のグローバルな 最 小 化<br />
ALLOCATION 指 示 子 は、 ほかの 指 示 子 と 同 様 、 ス コープ ( 関 数 、 ループ、 領 域 ) 内 で 指 定 されます。 config_bind<br />
コ ン フ ィ ギ ュ レーシ ョ ン を 使 用 する と 、 デザ イ ンで 全 体 で 演 算 子 が 最 小 限 に 抑 え ら れます。<br />
デザ イ ン 全 体 で 演 算 子 を 最 小 限 に 抑 え る には、 config_bind コンフィギュレーションに min_op オプシ ョ ンを 付 け<br />
て 実 行 し ます。 表 1-25 に リ ス ト さ れる 演 算 子 はすべて こ の 方 法 で 制 限 で き ます。<br />
コ ン フ ィ ギ ュ レーシ ョ ン を 適 用 する と、 その ソ リ ューシ ョ ンで 実 行 さ れるすべての 合 成 操 作 に 適 用 さ れます。 ソ<br />
リ ューシ ョ ン を 一 旦 閉 じ てか ら 開 き 直 し て も、 指 定 し た コ ン フ ィ ギ ュ レーシ ョ ンが 新 し い 合 成 操 作 すべてに 適 用 さ れ<br />
ます。<br />
config_bind コンフ ィ ギュ レーシ ョ ンの 適 用 されたコンフ ィ ギュ レーシ ョ ンはすべて reset オプシ ョ ン を 使 用 す<br />
るか、 open_solution -reset を 使 用 してソ リ ューシ ョ ンを 開 く と、 削 除 できます。<br />
ハー ド ウ ェ ア コアの 制 御<br />
合 成 が 実 行 さ れる と 、 Vivado HLS では ク ロ ッ ク で 指 定 さ れた タ イ ミ ン グ 制 約 、 ターゲ ッ ト デバイ スで 指 定 された 遅<br />
延 、 ユーザーの 指 定 し た 指 示 子 が 使 用 さ れ、 演 算 子 を イ ンプ リ メ ン ト する のにどの コ ア を 使 用 する のかが 決 定 さ れま<br />
す。 た と えば、 乗 算 器 演 算 を イ ンプ リ メ ン ト する 場 合 、 Vivado HLS で 組 み 合 わせ 乗 算 器 コ アが 使 用 さ れる こ と も あれ<br />
ば、 パイ プ ラ イ ン 乗 算 器 コ アが 使 用 さ れる こ と も あ り ます。<br />
合 成 中 に 演 算 子 にマ ッ プ さ れる コ アは、 演 算 子 と 同 じ 方 法 で 制 限 で き ます。 乗 算 演 算 子 の 合 計 数 を 制 限 する 代 わ り に、<br />
組 み 合 わせ 乗 算 器 コ アの 数 を 制 限 し て、 残 り の 乗 算 がパイ プ ラ イ ン 乗 算 器 を 使 用 し て 実 行 さ れる よ う にする こ と も で<br />
きます ( 逆 を 実 行 する こ と も 可 能 )。 これは、コアに 対 し、ALLOCATION 指 示 子 に type オプシ ョ ン を 指 定 する と 実<br />
行 でき ます。<br />
RESOURCE 指 示 子 を 使 用 する と 、 特 定 の 演 算 にどの コ アを 使 用 する か 明 確 に 指 定 で き ます。 次 の 例 の 場 合 、 2 段 のパ<br />
イ プ ラ イ ン 乗 算 器 が 変 数 の 乗 算 を イ ンプ リ メ ン ト する のに 指 定 さ れています。 次 のコマン ド では、 変 数 c に 対 し て 2<br />
段 のパイ プ ラ イ ン 乗 算 器 を 使 用 する こ と が Vivado HLS に 伝 え られます。 変 数 d にどのコアを 使 用 するかは、 Vivado<br />
HLS で 決 定 されます。<br />
int foo (int a, int b) {<br />
int c, d;<br />
#pragma HLS RESOURCE variable=c core=Mul2S<br />
c = a*b;<br />
d = a*c;<br />
return d;<br />
}<br />
次 の 例 の 場 合 、 RESOURSE 指 示 子 で 変 数 temp の 加 算 演 算 が 指 定 さ れ、 AddSub_DSP コアを 使 用 してインプリ メント<br />
されます。 これによ り、 最 終 的 なデザインで 演 算 が DSP48 プリ ミティブを 使 用 してインプリ メントされるようにな<br />
ります (デフ ォル ト では、 加 算 演 算 は LUT を 使 用 してインプ リ メ ン ト されます)。<br />
void apint_arith(dinA_t inA, dinB_t inB,<br />
dout1_t *out1<br />
) {<br />
dout2_t temp;<br />
#pragma HLS RESOURCE variable=temp core=AddSub_DSP<br />
}<br />
temp = inB + inA;<br />
*out1 = temp;<br />
高 位 合 成 japan.xilinx.com 185<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
list_core コ マン ド は、 ラ イ ブ ラ リ で 使 用 可 能 な コ アの 詳 細 を 表 示 する のに 使 用 さ れます。 list_core は Tcl コマンド イ<br />
ン ターフ ェ イ スでのみ 使 用 で き ます。 デバイ スは set_part コ マン ド を 使 用 し て 指 定 する 必 要 があ り ます。 デバイ スが<br />
選 択 されていない 場 合 は、 コマン ドの 影 響 はあ り ません。<br />
• list_core コマンドに –operation オプシ ョ ン を 使 用 する と 、 ラ イ ブ ラ リ にあ る コ アの う ち、 指 定 さ れた 演 算 で<br />
インプリ メントできるものをすべてリスト します。<br />
表 1-26 には 標 準 RTL 演 算 ( 加 算 、 乗 算 、 比 較 など) を イ ンプ リ メ ン ト する のに 使 用 さ れる コ ア を リ ス ト し ています。<br />
表 1‐26 : ファンクション コア<br />
コア<br />
AddSub<br />
AddSubnS<br />
AddSub_DSP<br />
Cmp<br />
Div<br />
Mul<br />
Mul2S<br />
Mul3S<br />
Mul4S<br />
Mul5S<br />
Mul6S<br />
MulnS<br />
Sel<br />
説 明<br />
加 算 器 および 減 算 器 の 両 方 を イ ンプ リ メ ン ト する のに 使 用 し ます。<br />
N 段 のパイプラ イ ン 加 算 器 または 減 算 器 です。 Vivado HLS で 必 要 なパイ プ ラ イ ン 段 数 が 決 定<br />
されます。<br />
DSP48 を 使 用 して add または sub 演 算 が イ ンプ リ メ ン ト さ れる よ う に し ます (DSP48 内 の 加 算<br />
器 ま たは 減 算 器 が 使 用 さ れます)。<br />
コンパレータ<br />
除 算 器<br />
組 み 合 わせ 乗 算 器<br />
2 段 パイ プ ラ イ ン 乗 算 器<br />
3 段 パイ プ ラ イ ン 乗 算 器<br />
4 段 パイ プ ラ イ ン 乗 算 器<br />
5 段 パイ プ ラ イ ン 乗 算 器<br />
6 段 パイ プ ラ イ ン 乗 算 器<br />
N 段 パイ プ ラ イ ン 乗 算 器 Vivado HLS で 必 要 なパイ プ ラ イ ン 段 数 が 決 定 さ れます。<br />
ジ ェ ネ リ ッ ク な 選 択 演 算 子 。 通 常 、 マルチプレ ク サ と し て イ ンプ リ メ ン ト さ れます。<br />
演 算 で 浮 動 小 数 点 型 が 使 用 さ れる 場 合 は、 標 準 的 な コ アのほかに、 次 の 浮 動 小 数 点 コ アが 使 用 さ れます。 浮 動 小 数 点<br />
コ アがデバイ スでサポー ト されているかど う かは、 各 デバイ スの 資 料 を 参 照 し て く だ さい。<br />
表 1‐27 : 浮 動 小 数 点 コ ア<br />
コア<br />
FAddSub<br />
FAddSub_nodsp<br />
FAddSub_fulldsp<br />
FCmp<br />
FDiv<br />
FMul<br />
FMul_nodsp<br />
FMul_meddsp<br />
FMul_fulldsp<br />
FMul_maxdsp<br />
FRSqrt<br />
浮 動 小 数 点 の 加 算 器 ま たは 減 算 器<br />
説 明<br />
DSP48 プ リ ミ テ ィ ブな し で イ ンプ リ メ ン ト さ れる 浮 動 小 数 点 の 加 算 器 ま たは 減 算 器<br />
DSP48 プ リ ミ テ ィ ブだけを 使 用 し て イ ンプ リ メ ン ト さ れる 浮 動 小 数 点 の 加 算 器 ま た<br />
は 減 算 器<br />
浮 動 小 数 点 のコ ンパレータ<br />
浮 動 小 数 点 の 除 算 器<br />
浮 動 小 数 点 の 乗 算 器<br />
DSP48 プ リ ミ テ ィ ブな し で イ ンプ リ メ ン ト さ れる 浮 動 小 数 点 の 乗 算 器<br />
DSP48 プ リ ミ テ ィ ブが 調 整 さ れて イ ンプ リ メ ン ト さ れる 浮 動 小 数 点 の 乗 算 器<br />
DSP48 プ リ ミ テ ィ ブのみを 使 用 し て イ ンプ リ メ ン ト さ れる 浮 動 小 数 点 の 乗 算 器<br />
最 大 数 の DSP48 プ リ ミ テ ィ ブが イ ンプ リ メ ン ト さ れる 浮 動 小 数 点 の 乗 算 器<br />
DSP48 プ リ ミ テ ィ ブな し で イ ンプ リ メ ン ト さ れる 浮 動 小 数 点 の 乗 算 器<br />
高 位 合 成 japan.xilinx.com 186<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐27 : 浮 動 小 ( 続 き) ( 続 き) 数 点 コ ア ( 続 き)<br />
コア<br />
FRSqrt_nodsp<br />
FRSqrt_fulldsp<br />
FRecip<br />
FRecip_nodsp<br />
DSP48 プ リ ミ テ ィ ブな し で イ ンプ リ メ ン ト さ れる 浮 動 小 数 点 の 組 み 合 わせ 乗 算 器<br />
DSP48 プ リ ミ テ ィ ブのみを 使 用 し て イ ンプ リ メ ン ト される 浮 動 小 数 点 の 組 み 合 わせ<br />
乗 算 器<br />
浮 動 小 数 点 の 逆 数<br />
説 明<br />
DSP48 プ リ ミ テ ィ ブな し で イ ンプ リ メ ン ト さ れる 浮 動 小 数 点 の 逆 数<br />
FRecip_fulldsp<br />
FSqrt<br />
DAddSub<br />
DAddSub_nodsp<br />
DAddSub_fulldsp<br />
DCmp<br />
DDiv<br />
DMul<br />
DMul_nodsp<br />
DMul_meddsp<br />
DMul_fulldsp<br />
DMul_maxdsp<br />
DRSqrt<br />
DRecip<br />
DSqrt<br />
DSP48 プ リ ミ テ ィ ブのみを 使 用 し て イ ンプ リ メ ン ト さ れる 浮 動 小 数 点 の 逆 数<br />
浮 動 小 数 点 の 平 方 根<br />
倍 精 度 の 浮 動 小 数 点 の 加 算 器 ま たは 減 算 器<br />
DSP48 プ リ ミ テ ィ ブな し で イ ンプ リ メ ン ト さ れる 倍 精 度 の 浮 動 小 数 点 の 加 算 器 ま た<br />
は 減 算 器<br />
DSP48 プ リ ミ テ ィ ブのみを 使 用 し て イ ンプ リ メ ン ト さ れる 倍 精 度 の 浮 動 小 数 点 の 加<br />
算 器 ま たは 減 算 器<br />
倍 精 度 の 浮 動 小 数 点 の コ ンパレータ<br />
倍 精 度 の 浮 動 小 数 点 の 除 算 器<br />
倍 精 度 の 浮 動 小 数 点 の 乗 算 器<br />
DSP48 プ リ ミ テ ィ ブな し で イ ンプ リ メ ン ト さ れる 倍 精 度 の 浮 動 小 数 点 の 乗 算 器<br />
DSP48 プ リ ミ テ ィ ブが 調 整 さ れて イ ンプ リ メ ン ト さ れる 倍 精 度 の 浮 動 小 数 点 の 乗 算<br />
器<br />
DSP48 プ リ ミ テ ィ ブのみを 使 用 し て イ ンプ リ メ ン ト さ れる 倍 精 度 の 浮 動 小 数 点 の 乗<br />
算 器<br />
最 大 数 の DSP48 プ リ ミ テ ィ ブが イ ンプ リ メ ン ト さ れる 倍 精 度 の 浮 動 小 数 点 の 乗 算 器<br />
倍 精 度 浮 動 小 数 点 の 逆 数 平 方 根<br />
倍 精 度 の 浮 動 小 数 点 の 逆 数<br />
倍 精 度 浮 動 小 数 点 の 平 方 根<br />
表 1-28 にはレジス タやメ モ リ などのス ト レージ エレメントをインプリ メントするコアがリストされています。<br />
表 1‐28 : ストレージ コア<br />
コア<br />
FIFO<br />
FIFO_BRAM<br />
FIFO_LUTRAM<br />
FIFO_SRL<br />
RAM_1P<br />
RAM_1P_BRAM<br />
RAM_1P_LUTRAM<br />
説 明<br />
FIFO。 Vivado HLS でブロ ッ ク RAM または 分 散 RAM のいずれかで RTL にインプリ メ<br />
ン ト する かが 決 定 さ れます。<br />
ブロック RAM でインプリ メン ト される FIFO。<br />
分 散 RAM としてインプリメントされる FIFO。<br />
SRL でインプリ メン ト される FIFO。<br />
シングル ポー ト RAM。 Vivado HLS でブロ ッ ク RAM または 分 散 RAM のいずれかで<br />
RTL に イ ンプ リ メ ン ト する かが 決 定 さ れます。<br />
シングル ポー ト RAM で、 ブロ ッ ク RAM を 使 用 してインプ リ メ ン ト されます。<br />
シングル ポー ト RAM で、 分 散 RAM としてインプリメントされます。<br />
高 位 合 成 japan.xilinx.com 187<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐28 : ストレージ コア ( 続 き)<br />
コア<br />
RAM_2P<br />
RAM_2P_BRAM<br />
RAM_2P_LUTRAM<br />
RAM_T2P_BRAM<br />
RAM_2P_1S<br />
ROM_1P<br />
ROM_1P_BRAM<br />
ROM_1P_LUTRAM<br />
ROM_1P_1S<br />
ROM_2P<br />
ROM_2P_BRAM<br />
RAM_2P_LUTRAM<br />
説 明<br />
読 み 込 みポー ト と 書 き 出 し ポー ト を 別 々に 使 用 するデュ アル ポー ト RAM。Vivado HLS<br />
でブロ ッ ク RAM または 分 散 RAM のいずれかで RTL にインプリ メン トするかが 決 定<br />
されます。<br />
読 み 込 みポー ト と 書 き 出 し ポー ト を 別 々に 使 用 するデュ アル ポー ト RAMで、ブロ ッ ク<br />
RAM を 使 用 してインプ リ メ ン ト されます。<br />
読 み 込 みポー ト と 書 き 出 し ポー ト を 別 々に 使 用 するデュ アル ポー ト RAMで、 分 散<br />
RAM としてインプリメントされます。<br />
入 力 および 出 力 の 両 方 で 読 み 込 みポー ト と 書 き 出 し ポー ト の 両 方 をサポー ト するデュ<br />
アル ポー ト RAM で、 ブロ ッ ク RAM を 使 用 してインプ リ メ ン ト されます。<br />
デュアル ポー ト 非 同 期 RAM で、 LUT にインプリ メン ト されます。<br />
シングル ポー ト ROM。 Vivado HLS でブロ ッ ク RAM または LUT のいずれかを 使 用 し<br />
て RTL に イ ンプ リ メ ン ト する かが 決 定 さ れます。<br />
シングル ポー ト ROM で、 ブロ ッ ク RAM を 使 用 してインプ リ メ ン ト されます。<br />
シングル ポー ト ROM で、 分 散 ROM としてインプリメントされます。<br />
デュアル ポー ト 非 同 期 ROM で、 LUT にインプリ メン ト されます。<br />
デュアル ポー ト ROM。 Vivado HLS でブロ ッ ク RAM または 分 散 ROM のいずれかで<br />
RTL に イ ンプ リ メ ン ト する かが 決 定 さ れます。<br />
デュアル ポー ト ROM で、 ブロ ッ ク RAM を 使 用 してインプ リ メ ン ト されます。<br />
デュアル ポー ト ROM で、 分 散 ROM としてインプリメントされます。<br />
こ の リ ソース 指 示 子 は、 リ ソースの ターゲ ッ ト と し て 割 り 当 て ら れてい る 変 数 を 使 用 し ます。 た と えば、 RESOURCE<br />
指 示 子 で out1 の 乗 算 に 3 段 のパイプライン 乗 算 器 が 使 用 されてインプリ メント されると 指 定 されているとします。<br />
void foo(...){<br />
#pragma HLS RESOURCE variable=out1 core=Mul4S<br />
}<br />
// Basic arithmetic operations<br />
*out1 = inA * inB;<br />
*out2 = inB + inA;<br />
*out3 = inC / inA;<br />
*out4 = inD % inA;<br />
代 入 で 複 数 の 同 じ 演 算 子 が 指 定 さ れてい る 場 合 、 各 演 算 子 に 対 し 変 数 は 1 つとなるよ うにコードを 変 更 する 必 要 があ<br />
り ます。 た と えば、 こ の 例 の 最 初 の 乗 算 (inA * inB) がパイ プ ラ イ ン 乗 算 器 を 使 用 し て イ ンプ リ メ ン ト さ れる 場 合 は、<br />
次 のよ う にな り ます。<br />
*out1 = inA * inB * inC;<br />
これは、 次 のよ う に 変 更 する 必 要 があ り ます。<br />
#pragma HLS RESOURCE variable=out1 core=Mul4S<br />
Result_tmp = inA * inB;<br />
*out1 = Result_tmp * inC;<br />
指 示 子 は Result_tmp に 指 定 されます。<br />
高 位 合 成 japan.xilinx.com 188<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
ハー ド ウ ェ ア コ アのグローバル 最 適 化<br />
config_bind コンフィギュレーションはバインディング プロセスを 制 御 します。 このコンフィギュレーショ ンで<br />
は、 コ アを 演 算 子 にバイ ンデ ィ ングする 際 にどれ く ら いのエフ ォー ト を 使 用 する のか 指 示 で き ます。 デフ ォル ト では<br />
タ イ ミ ングおよびエ リ ア 間 で 最 適 なバ ラ ン スにな る コ アが 選 択 さ れます。 config_bind は、 どの 演 算 子 が 使 用 さ れ<br />
る かに も 影 響 し ます。<br />
config_bind -effort [low | medium | high] -min_op -reset<br />
config_bind コマンドは、アクティブ ソ リ ューシ ョ ン 内 でのみ 指 定 で き ます。 こ のバイ ンデ ィ ン グ 操 作 のデフ ォル<br />
トの run ス トラテジは medium です。<br />
• [Low Effort] : 共 有 にかけ る 時 間 を 少 な く し ます。 ラ ン タ イ ムは 高 速 にな り ますが、 最 終 的 な RTL は 大 き く な る 可<br />
能 性 があ り ます。 共 有 の 可 能 性 がほ と んど ない と わかってい る 場 合 や、 必 要 がな く 、 可 能 性 を 探 すためにCPU サ<br />
イ ク ルを 無 駄 に し た く ない 場 合 などに 便 利 です。<br />
• [Medium Effort] : デフォル ト で、 Vivado HLS は 操 作 を 共 有 し よ う と し ますが、 合 理 的 な 時 間 で 終 了 する よ う に し<br />
ます。<br />
• [High Effort] : 最 大 限 に 共 有 し よ う と し ます。 ラ ン タ イ ムに 制 限 はあ り ません。 共 有 のすべての 可 能 性 のあ る 組 み<br />
合 わせが 確 認 される まで 続 行 されます。<br />
論 理 演 算 式 の 最 適 化<br />
合 成 中 は、 駆 動 電 流 の 削 減 やビ ッ ト 幅 の 最 小 化 など、 複 数 の 最 適 化 が 実 行 さ れます。 こ の よ う な 自 動 最 適 化 の 中 には、<br />
演 算 調 整 も 含 まれます。<br />
演 算 調 整 では、 バ ラ ン スの 取 れた ツ リ ーを 構 築 し て レ イ テンシを 削 減 する よ う に、 演 算 子 が 並 び 替 え ら れます。<br />
• 整 数 の 演 算 調 整 はデフ ォル ト でオンになっていますが、 オフになってい る こ と も あ り ます。<br />
• 浮 動 小 数 点 の 場 合 、 演 算 調 整 はデフ ォル ト でオフになっていますが、 オンになってい る こ と も あ り ます。<br />
たとえば、 次 の 例 の += および *= の よ う な 代 入 演 算 子 を 使 用 し たかな り シーケ ンシ ャルな コー ド があ る と し ます。<br />
data_t foo_top (data_t a, data_t b, data_t c, data_t d)<br />
{<br />
data_t sum;<br />
}<br />
sum = 0;<br />
sum += a;<br />
sum += b;<br />
sum += c;<br />
sum += d;<br />
return sum;<br />
演 算 調 整 が 使 用 さ れない 場 合 、 加 算 にそれぞれ 1 クロック サイクルかかるとすると、sum の 計 算 が 終 了 する のに 4 ク<br />
ロック サイクルかかるこ とになり ます ( 図 1-80)。<br />
高 位 合 成 japan.xilinx.com 189<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-80<br />
図 1‐80 : 加 算 器 ツ リ ー<br />
ただし、 加 算 (a+b と c+d) は 並 列 で 実 行 で き る ので、 レ イ テンシを 削 減 で き ます。 こ の よ う に 計 算 が 調 整 さ れる と 、<br />
計 算 は 2 クロック サイクルで 終 了 します ( 図 1-81)。 演 算 調 整 を 使 用 する と 共 有 はで き ないので、エ リ アが 増 加 し ます。<br />
X-Ref Target - Figure 1-81<br />
図 1‐81 : 調 整 後 の 加 算 器 ツ リ ー<br />
整 数 の 演 算 調 整 は、 EXPRESSION_BALANCE 最 適 化 指 示 子 に off オプシ ョ ン を 付 けて 使 用 する と オフにで き ます。<br />
float および double 型 を 合 成 する 際 には、Vivado HLS が C コー ド で 実 行 さ れる 演 算 順 序 を 維 持 し て、C シミュレーショ<br />
ン と 結 果 が 同 じ にな る よ う に し ます。 飽 和 および 切 り 捨 てがあ る ため、 O1 および O2 は 次 のコード 例 と 同 じになると<br />
は 限 り ません。<br />
A=B*C;<br />
D=E*F;<br />
O1=A*D<br />
A=B*F;<br />
D=E*C;<br />
O2=A*D;<br />
float および double 型 を 使 用 する 場 合 に 演 算 調 整 をオンにする には、 config_compile コンフィギュレーションを 使<br />
用 します。[Solution] → [Solution Settings] → [General] → [Add] [config_compile] で [unsafe_math_operations]<br />
をオンにしてください。<br />
unsafe_math_operations を 使 用 する と 、 no_signed_zeros 最 適 化 も 使 用 さ れます。<br />
no_signed_zeros 最 適 化 が 使 用 さ れる と 、 float および double 型 で 次 の 演 算 式 が 同 じ にな る よ う にな り ます。<br />
x – 0.0 = x;<br />
高 位 合 成 japan.xilinx.com 190<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
x + 0.0 = x;<br />
0.0 – x = -x;<br />
x – x = 0.0;<br />
x*0.0 = 0.0;<br />
no_signed_zeros 最 適 化 が 使 用 さ れない 場 合 、 上 記 の 演 算 式 は 丸 めのために 同 じ にはな り ません。 こ の 最 適 化 は、<br />
config_compile コ ン フ ィ ギ ュ レーシ ョ ンで こ のオプシ ョ ンのみをオンにする と 、 演 算 調 整 な し で 使 用 する こ と も<br />
できます。<br />
ヒント : unsafe_math_operations および no_signed_zero 最 適 化 が 使 用 さ れる と、 RTL インプリ メンテーションが C シ<br />
ミ ュ レーシ ョ ン と は 異 な る 結 果 にな り ます。 テ ス ト ベンチでは、 結 果 の 小 さ な 違 いは 無 視 可 能 なので、 範 囲 を 確 認 し、<br />
厳 密 な 比 較 は 実 行 し ない よ う に し て く だ さ い。<br />
RTL 検 証<br />
合 成 後 の 検 証 は、 C/RTL 協 調 シ ミ ュ レーシ ョ ン 機 能 ( 合 成 前 の C テ ス ト ベンチを 再 利 用 し て 出 力 RTL の 検 証 実 行 ) を<br />
使 用 し て 自 動 化 さ れています。<br />
RTL の 自 動 検 証<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ンでは、C テス トベンチを 使 用 して RTL デザ イ ンが 自 動 的 に 検 証 さ れます。 検 証 プ ロ セ ス<br />
には、 図 1-82 に 示 すよ う に 3 つの 段 階 があ り ます。<br />
• C シ ミ ュ レーシ ョ ンが 実 行 さ れ、 最 上 位 関 数 ま たは Device-Under-Test (DUT) への 入 力 が 入 力 ベ ク ター と し て 保 存<br />
されます。<br />
• こ の 入 力 ベ ク ターは Vivado HLS で 作 成 された RTL を 使 用 して RTL シミュレーションに 使 用 されます。RTL から<br />
の 出 力 が 出 力 ベ ク ター と し て 保 存 さ れます。<br />
• RTL シ ミ ュ レーシ ョ ンか ら の 出 力 ベ ク ターが C テ ス ト ベンチに 適 用 さ れ、 合 成 の 関 数 の 後 に 結 果 が 正 し いかど う<br />
かが 検 証 さ れます。 C テ ス ト ベンチで 結 果 の 検 証 が 実 行 さ れます。<br />
次 は、 検 証 の 進 捗 状 況 を 示 すために Vivado HLS で 表 示 される メ ッ セージです。<br />
C シミュレーション :<br />
[SIM-14] Instrumenting C test bench (wrapc)<br />
[SIM-302] Generating test vectors(wrapc)<br />
こ の 段 階 では、 C シミュレーションが 実 行 されているので、C テス トベンチによって 書 き 出 されるメ ッセージはすべ<br />
てコンソール ビューかログ ファイルに 出 力 されます。<br />
RTL シミュレーション :<br />
[SIM-333] Generating C post check test bench<br />
[SIM-12] Generating RTL test bench<br />
[SIM-323] Starting Verilog simulation (Issued when Verilog is the RTL verified)<br />
[SIM-322] Starting Verilog simulation (Issued when VHDL is the RTL verified)<br />
[SIM-11] Starting SystemC simulation (Issued when SystemC is the verified RTL)<br />
こ の 段 階 では、RTL シ ミ ュ レーシ ョ ンからの メ ッセージはすべてコン ソール ビューかログ ファイルに 出 力 されます。<br />
C テス トベンチの 結 果 チェック :<br />
[SIM-316] Starting C post checking<br />
[SIM-1000] C/RTL co-simulation finished:PASS (If test bench returns a 0)<br />
高 位 合 成 japan.xilinx.com 191<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
[SIM-4] C/RTL co-simulation finished:FAIL (If the test bench returns non-zero)<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ン フローの C テ ス ト ベンチの 重 要 性 については、 次 に 説 明 し ます。<br />
X-Ref Target - Figure 1-82<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ン 機 能 を 問 題 な く 使 用 する には、 次 が 必 要 です。<br />
• テス トベンチがセルフチェックで、 問 題 がなかった 場 合 は 0 を、 問 題 があ った 場 合 は 0 以 外 の 値 を 戻 す 必 要 あ り<br />
• 正 しいインターフェイス 合 成 オプシ ョ ンが 選 択 されている<br />
• サー ド パーテ ィ シ ミ ュ レータ が 検 索 パスで 指 定 さ れてい る 必 要 あ り<br />
• デザイ ン イ ン ターフ ェ イ スの 配 列 ま たは 構 造 体 (struct) では 次 に リ ス ト する 最 適 化 指 示 子 ま たは 最 適 化 指 示 子 の<br />
組 み 合 わせは 使 用 で き ません。<br />
テストベンチ 要 件<br />
RTL デザイ ンが 元 の C コー ド と 同 じ 結 果 にな る かど う かを 検 証 する には、 検 証 を 実 行 する ために 使 用 さ れる テ ス ト ベ<br />
ンチがセルフチェ ッ ク になってい る 必 要 があ り ます。 次 の 例 は、 テ ス ト ベンチのセルフチェ ッ ク の 重 要 な 機 能 を 示 し<br />
ています。<br />
int main () {<br />
int ret=0;<br />
…<br />
図 1‐82 : RTL 検 証 フ ロー<br />
高 位 合 成 japan.xilinx.com 192<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
}<br />
// Execute (DUT) Function<br />
…<br />
// Write the output results to a file<br />
…<br />
// Check the results<br />
ret = system("diff --brief -w output.dat output.golden.dat");<br />
if (ret != 0) {<br />
printf("Test failed !!!\n");<br />
ret=1;<br />
} else {<br />
printf("Test passed !\n");<br />
}<br />
…<br />
return ret;<br />
• 既 知 の 良 い 結 果 が 存 在 する ので、 こ の 例 の 場 合 、 関 数 か ら の 出 力 がフ ァ イルに 保 存 さ れてか ら、 既 知 の 良 い 結 果<br />
(output.golden.dat ファイル) と 比 較 されます。<br />
° こ のチェ ッ ク を 実 行 する 方 法 は 多 く あ り 、 こ れはその 1 例 にすぎません。<br />
• 結 果 が 正 し い 場 合 は 値 0 を 戻 します。<br />
• 結 果 が 正 し く ない 場 合 は 0 以 外 の 値 を 戻 し ます。<br />
° どの よ う な 値 で も 戻 さ れる 可 能 性 があ り ます。 洗 練 さ れたテ ス ト ベンチであれば、 相 違 点 やエ ラーの タ イ プ<br />
に よ って 異 な る 値 を 戻 す 可 能 性 があ り ます。<br />
上 記 の よ う なテ ス ト ベンチを 使 用 する と 、 結 果 がチェ ッ ク さ れて 生 産 性 が 改 善 さ れる ので、 ユーザーが 手 動 で 検 証 す<br />
る 必 要 はあ り ません。<br />
注 意 : テス トベンチが 0 を 戻 しても、 RTL 結 果 がセルフチェ ッ ク さ れず、 結 果 が 本 当 に 正 し いかど う かを 確 認 で き な<br />
いこ とがあります。 このよ うな 場 合 でも、 上 記 のよ うな SIM-1 メ ッ セージが 表 示 さ れて、 結 果 が 実 際 にチェ ッ ク さ れ<br />
たわけでな く てもシ ミ ュレーシ ョ ン テス トがパスしたこ とが 示 されます。<br />
イ ン タ ーフ ェ イ ス 合 成 要 件<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ン を 使 用 し て RTL デザ イ ン を 検 証 する には、 次 の 条 件 の 中 か ら 1 つまたは 複 数 の 条 件 が<br />
満 た されている 必 要 があ り ます。<br />
• 最 上 位 関 数 が ap_ctrl_hs または ap_ctrl_chain 関 数 レベルの イ ン ターフ ェ イ ス を 使 用 し て 合 成 さ れてい る<br />
• ま たは、 デザ イ ンが 純 粋 に 組 み 合 わせであ る<br />
• ま たは、 最 上 位 関 数 の 開 始 間 隔 (II) が 1 になっている<br />
• または、 インターフェイスがすべてス ト リーミ ング 配 列 である (ap_fifo、 ap_hs または axis インターフェ<br />
イス モード でイ ンプ リ メ ン ト - hls::stream 変 数 は 自 動 的 に ap_fifo インターフェイスとしてインプリ メン<br />
ト )<br />
こ れ ら の 条 件 のいずれかが 満 た さ れない 場 合 、 次 の メ ッ セージが 表 示 さ れて C/RTL 協 調 シ ミ ュ レーシ ョ ンが 停 止 さ れ<br />
ます。<br />
@E [SIM-345] Cosim only supports the following 'ap_ctrl_none' designs:(1)<br />
combinational designs; (2) pipelined design with task interval of 1; (3) designs with<br />
array streaming or hls_stream ports.<br />
@E [SIM-4] *** C/RTL co-simulation finished:FAIL ***<br />
高 位 合 成 japan.xilinx.com 193<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
RTL シミュレータのサポート<br />
上 記 の 要 件 が 満 た さ れれば、 C/RTL 協 調 シ ミ ュ レーシ ョ ンで 表 1-29 に 示 す RTL タ イ プ と シ ミ ュ レータ の 組 み 合 わせ<br />
を 使 用 して、 RTL デザイ ンを 検 証 でき ます。<br />
表 1‐29 : cosim_design シミュレーション サポー ト<br />
RTL<br />
SystemC OSCI<br />
Vivado シミュ<br />
レーシ ョ ン<br />
(XSim)<br />
ISE Simulator<br />
(ISim)<br />
ModelSim<br />
VCS<br />
(Linux のみ)<br />
Riviera<br />
(PC のみ)<br />
SystemC サポートあり サポートなし サポートなし サポートなし サポートなし サポートなし<br />
Verilog サポー ト なし サポー ト あ り サポー ト あ り サポー ト あ り サポー ト あ り サポー ト あ り<br />
VHDL サポー ト なし サポー ト あ り サポー ト あ り サポー ト あ り サポー ト なし サポー ト あ り<br />
デフォル ト のシ ミ ュレータは 次 のとおり です。<br />
• 7 シリーズ、Zynq およびそれ 以 降 のデバイスの 場 合 は Vivado シミュレータ<br />
• 7 シリーズおよび Zynq よ り も 前 のデバイ スの 場 合 は ISE Simulator<br />
SystemC RTL 出 力 を 検 証 する 際 、 Vivado HLS ではビル ト イ ンの SystemC カーネルで RTL が 検 証 さ れます。 合 成 さ れ<br />
たデザイ ンが SystemC デザイ ン (C ソース コード) で、 デザイ ンのシ ミ ュ レーシ ョ ンに RTL シミュレータが 必 要 な 場<br />
合 は、 C コ ンパイ ラー 機 能 を 持 つ ModelSim シ ミ ュ レータ を 使 用 する 必 要 があ り ます。 こ の タ イ プの RTL シミュレー<br />
ションは、その 他 の RTL シミュレータではサポートされません。SystemC デザイ ンは、 ビル ト イ ンの OSCI カーネル<br />
を 使 用 して 完 全 にシ ミ ュレーシ ョ ンできます。<br />
表 1-29 に 示 すサード パーテ ィ シミュレータ (ModelSim、VCS、Riviera) のいずれかを 使 用 して RTL デザイ ンの 1 つを<br />
検 証 する には、 そのシ ミ ュ レータ の 実 行 フ ァ イルがシ ス テム 検 索 パスに 含 まれてお り 、 適 切 な ラ イ セン スが 使 用 可 能<br />
な 状 態 になっている 必 要 があ り ます。 これらのシ ミ ュ レータの 設 定 の 詳 細 については、サード パーテ ィ ベンダーにお<br />
問 い 合 わせ く ださい。<br />
サポー ト されない 最 適 化<br />
イ ン ターフ ェ イ スの 配 列 ま たは 構 造 体 内 の 配 列 ご と に 複 数 の 変 換 が 実 行 さ れる よ う な 場 合 、 自 動 RTL 検 証 はサポー<br />
トされません。<br />
自 動 検 証 が 実 行 さ れる よ う にする には、 関 数 イ ン ターフ ェ イ スの 配 列 、 ま たは 関 数 イ ン ターフ ェ イ スの 構 造 体 内 の 配<br />
列 で 次 の 最 適 化 のいずれかを 使 用 する 必 要 があ り ます ( 複 数 は 使 用 でき ません)。<br />
• 同 じサイズの 配 列 の 垂 直 マップ<br />
• RESHAPE<br />
• PARTITION<br />
• 構 造 体 の DATA_PACK<br />
次 の 最 適 化 が 最 上 位 関 数 イ ン ターフ ェ イ スで 使 用 さ れる と 、C/RTL 協 調 シ ミ ュ レーシ ョ ンに よ る 検 証 は 実 行 で き ませ<br />
ん。<br />
• 水 平 マ ッ プ<br />
• 異 な る サ イ ズの 配 列 の 垂 直 マ ッ プ<br />
• ほかの 構 造 体 を メ ンバー と し て 含 む 構 造 体 の DATA_PACK<br />
浮 動 小 数 点 コ アのシ ミ ュ レーシ ョ ン<br />
デザ イ ンが 浮 動 小 数 点 コ ア を 含 めて イ ンプ リ メ ン ト さ れる 場 合 は、 浮 動 小 数 点 コ アのビ ッ ト 精 度 モデルが RTL シミュ<br />
レータで 使 用 できるようになっている 必 要 があります。 これは、 次 を 使 用 して RTL シミュレーションが 実 行 された<br />
場 合 は、 自 動 的 に 設 定 さ れます。<br />
高 位 合 成 japan.xilinx.com 194<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
• SystemC RTL<br />
• ザイ リ ンクス Vivado シミュレータを 使 用 した Verilog および VHDL<br />
• ザイ リ ンクス ISim シ ミ ュレータを 使 用 した Verilog および VHDL<br />
• Mentor Graphics 社 の Questa SIM シ ミ ュレータを 使 用 した Verilog および VHDL<br />
その 他 のサポー ト される HDL シ ミ ュ レータ の 場 合 、ザ イ リ ン ク ス 浮 動 小 数 点 ラ イ ブ ラ リ が 前 も って コ ンパイルされ、<br />
シ ミ ュ レータ の ラ イ ブ ラ リ に 追 加 さ れてい る 必 要 があ り ます。 浮 動 小 数 点 シ ミ ュ レーシ ョ ン ライブラリをコンパイル<br />
する 方 法 については、 Vivado HLS ではな く Vivado Design Suite の 資 料 を 参 照 する か、 -help オプシ ョ ンを 使 用 して く<br />
ださい。 これには、Vivado Design Suite の GUI または Vivado Tcl シェルを 開 いて、Tcl コマンド プロンプトに<br />
compile_simlib –help と 入 力 します。<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ンの 使 用<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ンは、 GUI からツールバー ボ タ ン を 使 用 し て 実 行 し ます。<br />
X-Ref Target - Figure 1-83<br />
図 1‐83 : [Cosimulation] ツールバー ボタン<br />
次 のよ うなダイアログ ボックスが 表 示 されます ( 図 1-84)。<br />
高 位 合 成 japan.xilinx.com 195<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-84<br />
シミュレーションする RTL (SystemC、 Verilog または VHDL) を 選 択 します。 Verilog または VHDL を 選 択 した 場 合 は、<br />
ドロップダウン メ ニ ューでシ ミ ュ レータ が 選 択 で き ます。デフ ォル ト および 表 示 さ れる 可 能 性 のあ る 選 択 肢 について<br />
は、 「RTL シミュレータのサポート」 を 参 照 して く ださい。<br />
設 定 で き る オプシ ョ ンは 次 の と お り です。<br />
図 1‐84 : [C/RTL Co‐simulation] ダイアログ ボックス<br />
• [Setup Only] :シ ミ ュ レーシ ョ ンを 実 行 するのに 必 要 なフ ァ イル (ラ ッパー、アダプター、スクリプトなど) がすべ<br />
て 作 成 されますが、 シ ミ ュ レータは 実 行 されません。 シ ミ ュ レーシ ョ ンは、 RTL シミュレーション フォルダー<br />
/sim/ 内 から コマン ド シ ェルで 実 行 で き ます。<br />
• [Dump Trace] : 関 数 ご と に ト レース ファイルが 生 成 され、 /sim/ フォルダーに 保 存 されます。 ト<br />
レース ファイルの 使 用 については、 選 択 した RTL シミュレータの 資 料 を 参 照 してください。 ドロップダウン メ<br />
ニューでは、 ト レース フ ァ イルに 保 存 する 信 号 を 選 択 (すべて、 最 上 位 ポー ト のみ、 ま たは 階 層 の 各 関 数 のポー<br />
ト ) できます。<br />
• [Optimizing Compile] : 高 位 最 適 化 が 使 用 さ れて C テス トベンチがコンパイルされます。 SystemC を 選 択 した 場 合<br />
は、 こ の 高 位 最 適 化 を 使 用 し て RTL デザインも コンパイルされます。 このオプシ ョ ンを 使 用 する と、 コンパイ<br />
ル 時 間 は 増 加 し ますが、 シ ミ ュ レーシ ョ ンの 実 行 は 高 速 にな り ます。<br />
高 位 合 成 japan.xilinx.com 196<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
• [Reduce Disk Space] : 図 1-82 に 示 すフ ローでは、 RTL シミュレーションを 実 行 する 前 にすべてのトランザクショ<br />
ンの 結 果 が 保 存 さ れますので、 データ ファイルが 大 きくなることもあります。reduce_diskspace オプシ ョ ン<br />
を 使 用 する と 、 1 度 に 1 つの ト ラ ンザク シ ョ ンが 実 行 でき る よ う にな り 、 フ ァ イルに 必 要 なデ ィ ス ク 容 量 は 削 減<br />
できます。 関 数 が C テス トベンチで N 回 実 行 さ れる 場 合 、 reduce_diskspace オプシ ョ ン を 使 用 する と 、 RTL<br />
シミュレーションが 別 々に N 回 実 行 さ れる よ う にな り 、 シ ミ ュ レーシ ョ ンの 実 行 速 度 が 遅 く な り ます。<br />
[Input Arguments] では、 テ ス ト ベンチで 必 要 と さ れる 引 数 を 指 定 で き ます。<br />
RTL シ ミ ュ レーシ ョ ンの 実 行<br />
Vivado HLS は 次 のプロ ジ ェ ク ト 下 位 ディレク ト リの RTL シミュレーションを 実 行 します。<br />
/sim/<br />
説 明 :<br />
• SOLUTION はソ リ ューショ ンの 名 前<br />
• RTL はシ ミ ュ レーシ ョ ンに 選 択 さ れた RTL のタイプ<br />
協 調 シ ミ ュ レーシ ョ ン 中 に C テス トベンチによ り 書 き 出 されたファイルとシミ ュレータで 生 成 されたト レース ファ<br />
イルはすべて こ のデ ィ レ ク ト リ に 保 存 さ れます。 た と えば、 C テ ス ト ベンチが 比 較 の 出 力 結 果 を 保 存 する 場 合 は、 こ<br />
のデ ィ レ ク ト リ の 出 力 フ ァ イルを 確 認 し、 予 測 結 果 と それを 比 較 し ます。<br />
RTL デザイ ンのエ ク スポー ト<br />
Vivado HLS フローの 最 後 の 段 階 では、 ザイ リンクス デザイ ン フ ローのその 他 のツールで 使 用 でき る よ う に、 RTL デ<br />
ザインを IP (Intellectual Property) のブロ ッ ク と してエク スポー ト し ます。 RTL デザ イ ンは、 次 の 出 力 形 式 にパ ッ ケー<br />
ジできます。<br />
• IP カタログ フォーマッ トの IP (Vivado Design Suite で 使 用 )<br />
• System Generator for DSP IP (Vivado System Generator for DSP で 使 用 )<br />
• System Generator for DSP (ISE) IP (ISE System Generator for DSP で 使 用 )<br />
• EDK IP 用 の Pcore (EDK で 使 用 )<br />
• 合 成 済 みデザ イ ン チェッ クポイン ト (.dcp)<br />
高 位 合 成 japan.xilinx.com 197<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
表 1‐30 : [RTL Export] の 選 択 肢<br />
フォーマット 下 位 フォルダー コメント<br />
IP Catalog ip Vivado IP カタログに 追 加 できる ZIP ファイルが 含 まれま<br />
す。 ip フォルダーに ZIP ファイルの 内 容 ( 解 凍 済 み) も 含 ま<br />
れます。<br />
7 シリーズまたは Zynq よりも 古 い FPGA デバイ スの 場 合 、<br />
このオプショ ンは 使 用 できません。<br />
System Generator for DSP sysgen この 出 力 は、 System Generator for DSP の Vivado エデ ィ シ ョ<br />
ンに 追 加 で き ます。<br />
7 シリーズまたは Zynq よりも 古 い FPGA デバイ スの 場 合 、<br />
このオプショ ンは 使 用 できません。<br />
System Generator for DSP (ISE) sysgen この 出 力 は、System Generator for DSP の ISE エデ ィ シ ョ ンに<br />
追 加 で き ます。<br />
Pcore for EDK pcore こ の 出 力 は Xilinx Platform Studio に 追 加 でき ます。<br />
合 成 済 みデザ イ ン チェッ ク<br />
ポイント (.dcp)<br />
ip<br />
このオプショ ンでは、 Vivado Design Suite のデザイ ンに 直 接<br />
追 加 で き る Vivado チェッ クポイン ト ファイルが 作 成 されま<br />
す。<br />
これには、 RTL 合 成 が 実 行 さ れてい る 必 要 があ り ます。 こ<br />
のオプシ ョ ンを 選 択 した 場 合 は、 [Evaluate] は 自 動 的 にオン<br />
にな り ます。<br />
7 シ リーズまたは Zynq よ りも 古 い FPGA デバイ スの 場 合 、<br />
このオプショ ンは 使 用 できません。<br />
Vivado デザイ ン フローにエクスポートできるのは、 7 シ リーズおよび Zynq® デバイ ス を ターゲ ッ ト にするデザイ ン<br />
のみです。 た と えば、 ターゲ ッ ト が Virtex-6® デバイ スの 場 合 、 Vivado IP カタログ、System Generator for DSP (Vivado)<br />
ま たは 合 成 済 みデザ イ ン チェッ クポイン ト (.dsp) などのパッケージ オプシ ョ ンは、 これらの IP パッケージ フォー<br />
マッ トが Vivado デザイ ン フ ローでしか 使 用 でき ないので、 使 用 でき ません。<br />
パ ッ ケージ さ れた 出 力 形 式 のほか、 RTL ファイルを //impl ディレク ト リの<br />
下 にあ る verilog および vhdl ディレク ト リからスタンドアロン ファイル (パ ッ ケージ 済 みフ ォーマ ッ ト の 一 部 ではな<br />
く ) として 入 手 できます。<br />
RTL ファイル 以 外 にも、 これらのディレクト リには Vivado Design Suite 用 のプロ ジェ ク ト ファイルが 含 まれます。<br />
project.xpr ファイルを 開 く と、 デザイン (Verilog または VHDL) がデザ イ ンの 解 析 さ れる Vivado プロジェク トに<br />
開 きます。Vivado HLS プ ロ ジ ェ ク ト で 協 調 シ ミ ュ レーシ ョ ンが 実 行 さ れる と 、その C/RTL 協 調 シ ミ ュ レーシ ョ ン ファ<br />
イルが Vivado プ ロ ジ ェ ク ト 内 に 表 示 さ れます。<br />
RTL 合 成<br />
Vivado HLS での 合 成 結 果 のレポー ト には、 ク ロ ッ ク 周 波 数 、 レ ジ ス タ 数 、 LUT および ブロッ ク RAM 数 などのRTL<br />
合 成 後 に 予 測 さ れる 結 果 の 概 算 が 含 まれます。 Vivado HLS ではダウンス ト リ ーム RTL 合 成 での 正 確 な 最 適 化 結 果 が<br />
わか らず、 実 際 の 配 線 遅 延 も わか らず、 配 置 配 線 後 の 最 終 的 な タ イ ミ ン グ も わか ら ないので、 こ れ ら の 結 果 はあ く ま<br />
で も 概 算 です。<br />
デザ イ ン をエ ク ス ポー ト する 前 には、 ロ ジ ッ ク 合 成 を 実 行 し て、 概 算 の 正 確 さ を 確 認 する こ と がで き ます。 図 1-85 の<br />
[Evaluate] オプシ ョ ンをオンにしておく と、 エク スポー ト プロセス 中 に RTL 合 成 が 開 始 さ れ、 RTL デザイ ンがゲー ト<br />
に 合 成 されます。<br />
高 位 合 成 japan.xilinx.com 198<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
注 記 : RTL 合 成 オプシ ョ ンはレポー ト さ れる 概 算 を 確 認 する ために 提 供 さ れています。 ほんどの 場 合 、 こ れら の RTL<br />
結 果 はパ ッ ケージ さ れる IP には 含 まれません。<br />
X-Ref Target - Figure 1-85<br />
図 1‐85 : [Export RTL Dialog] ダイアログ ボックス<br />
ほとんどのエクスポート 形 式 では、RTL 合 成 が verilog または vhdl ディレク ト リ ( 図 1-85 のドロップダウン メニュー<br />
を 使 用 して RTL 合 成 用 に 選 択 さ れた 方 の HDL いずれか) で 実 行 されますが、 その RTL 合 成 の 結 果 はパ ッ ケージ さ れ<br />
る IP には 含 まれません。<br />
次 のエ ク ス ポー ト 形 式 を 使 用 する と 、 合 成 済 み RTL がパッ ケージ される IP に 含 まれる よ う にでき ます。<br />
• [Pcore for EDK] : デザ イ ンの 一 部 ま たはすべてを 合 成 済 み RTL と し てエ ク ス ポー ト で き ます。 詳 細 は、 次 の「PCore<br />
形 式 でのエ ク ス ポー ト 」 セ ク シ ョ ン を 参 照 し て く だ さ い。<br />
• [Synthesized Checkpoint (.dcp)] : デザイ ン チェ ッ ク ポ イ ン ト は 常 に 合 成 済 み RTL と し てエ ク ス ポー ト さ れます。こ<br />
の 形 式 を 使 用 する 場 合 、 [Evaluate] オプシ ョ ンは 使 用 でき ません。 RTL は 常 に 実 行 されます。<br />
高 位 合 成 japan.xilinx.com 199<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
IP カ タ ログ 形 式 用 のパ ッ ケージ<br />
合 成 および RTL 検 証 が 終 了 し た ら、 [Export RTL] ツールバー アイコン ( 図 1-86) をクリックして、[Export RTL Dialog]<br />
ダイアログ ボックスを 開 きます。<br />
X-Ref Target - Figure 1-86<br />
[Format Selection] セクションで [IP Catalog] を 選 択 します ( 図 1-86)。<br />
[Configuration] をクリ ックすると、エクスポート されるパッケージに 次 の ID タグを 埋 め 込 むことができます。 これら<br />
のフ ィ ール ド を 使 用 する と 、 Vivado IP カタログ 内 でパッケージされた RTL が 識 別 しやす く な り ます。<br />
configuration 情 報 は、 デザ イ ンが IP カタログに 読 み 込 まれる 際 に、 同 じデザインの 複 数 インスタンス 間 を 区 別<br />
する ために 使 用 さ れます。 た と えば、 イ ンプ リ メ ンテーシ ョ ンが IP カタログ 用 にパッケージされてから、 新 しいソ<br />
リューションが 作 成 されて IP としてパッケージされると、 新 しいソリューションにはデフォルトで 同 じ 名 前 とコン<br />
フ ィ ギ ュ レーシ ョ ン 情 報 が 含 まれます。 新 し い ソ リ ューシ ョ ンは IP カタログに 追 加 されると、 同 じ IP のアップデー<br />
ト バージ ョ ン と し て 認 識 さ れ、 IP カ タ ロ グに 追 加 さ れた 最 新 バージ ョ ンの 方 が 使 用 さ れる よ う にな り ます。<br />
または、 config_rtl コンフィギュレーションに prefix を 使 用 する と 、 出 力 デザ イ ンおよびフ ァ イルの 名 前 に 独<br />
自 の 接 頭 辞 を 付 け る こ と がで き ます。<br />
configuration 設 定 に 値 を 指 定 し ない 場 合 は、 次 の 値 が 使 用 さ れます。<br />
• [Vendor] : xilinx.com<br />
• [Library] : hls<br />
• [Version] : 1.0<br />
• [Description] : An IP generated by Vivado HLS<br />
• [Display Name] : このフィールドはデフォルトでは 空 白 になります。<br />
• [Taxonomy] : このフィールドはデフォルトでは 空 白 になります。<br />
パッケージ プロセスが 終 了 した 後 //impl/ip ディレク ト リの ZIP ファイル<br />
アーカイブを Vivado IP カタ ログにインポー ト する と、 ほかの Vivado デザイ ン (RTL または IP インテグレーター) で<br />
使 用 で き ます。<br />
ソフトウェア ドライバー ファイル<br />
図 1‐86 : [Export RTL] ツールバー ボタン<br />
AXI4-Slave-Lite イ ン ターフ ェ イ ス を 含 むデザ イ ンの 場 合 、 エ ク ス ポー ト プロセスでソフ ト ウェア ドライバー ファイ<br />
ルのセ ッ ト が 作 成 さ れます。 こ れら の C ドライバー ファイルは SDK C プロジェク トに 含 めて、 AXI4-Slave-Lite ポー<br />
トにアクセスするために 使 用 できます。<br />
ソフトウェア ドライバー ファイルは、//impl/ip/drivers ディレク ト リ<br />
に 書 き 込 まれ、 パッ ケージの ZIP アーカイブに 含 められます。 C ドライバー ファイルの 詳 細 については、「AXI4-Lite<br />
インターフェイス」 を 参 照 して く ださい。<br />
System Generator への IP のエクスポー ト<br />
合 成 および RTL 検 証 が 終 了 し た ら、 [Export RTL] ツールバー アイコン ( 図 1-87) をクリックして、[Export RTL Dialog]<br />
ダイアログ ボックスを 開 きます。<br />
高 位 合 成 japan.xilinx.com 200<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
System Generator for DSP にエク スポー ト するプロセスは、 System Generator for DSP の ISE バージ ョ ン を 使 用 し ている<br />
か、Vivado バージ ョ ン を 使 用 する かで 異 な り ます。 デザ イ ン フ ローに 最 適 なツールを ど ち ら か 選 択 し て く だ さ い。 次<br />
の 例 では、 Vivado バージ ョ ンが 使 用 されます ( 図 1-87)。<br />
X-Ref Target - Figure 1-87<br />
IP ブ ロ ッ ク の 配 置 配 線 後 の リ ソ ースおよびタ イ ミ ン グ 統 計 が 必 要 な 場 合 は、 [Evaluate] をオンに し、 必 要 な RTL 言 語<br />
を 指 定 します。<br />
[OK] をクリックして IP パッケージを 生 成 します。 このパッケージは、<br />
//impl/sysgen デ ィ レ ク ト リ に 書 き 込 まれます。 このデ ィ レ ク ト リ には、<br />
System Generator へデザ イ ン を イ ンポー ト する ために 必 要 な も のがすべて 含 まれます。<br />
[Evaluate] をオンにした 場 合 は、RTL 合 成 が 実 行 さ れ、 最 終 的 な タ イ ミ ングおよび リ ソ ースがレ ポー ト さ れますが、 IP<br />
パ ッ ケージには 含 まれません。 詳 細 については、 前 述 の 「RTL 合 成 」 を 参 照 し て く だ さ い。<br />
System Generator への RTL のインポート<br />
Vivado HLS で 生 成 された System Generator パッケージは、 次 の 手 順 で System Generator にインポートできます。<br />
1. System Generator デザイ ン 内 で 右 ク リ ッ ク し、 XilinxBlockAdd オプシ ョ ンを 使 用 して 新 しいブロ ッ ク を イ ンス タ<br />
ンシエート します。<br />
2. ダイアログ ボックスのリストをスクロールダウンし、 [Vivado HLS] を 選 択 します。<br />
3. 新 し く インスタンシエート した Vivado HLS ブロックをダブルクリックし、[Block Parameters] ダイアログ ボック<br />
スを 開 きます。<br />
4. Vivado HLS ブロックがエクスポート された solution デ ィ レ ク ト リ を 参 照 し ます。 上 記 の 例 の<br />
//impl/sysgen の 場 合 、 /<br />
ディレク ト リを 参 照 し、 [apply] をク リ ックします。<br />
ポー ト の 最 適 化<br />
図 1‐87 : System Generator への RTL のエクスポー ト<br />
最 上 位 関 数 の 引 数 が 合 成 プ ロ セス 中 に 1 つの 複 合 ポー ト にま と められる と、そのポー ト のタ イプ 情 報 はわから ないの<br />
で、 System Generator IP ブロックには 含 まれません。<br />
高 位 合 成 japan.xilinx.com 201<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
こ のため、 ポー ト で 再 形 成 、 マ ッ ピ ン グ、 データ パ ッ キング 最 適 化 など を 使 用 し た 場 合 は、 これらの 複 合 ポー ト に 対<br />
してポート タイプ 情 報 を System Generator で 指 定 する 必 要 があ り ます。<br />
System Generator で タ イ プ 情 報 を 手 動 で 指 定 する には、 まず 複 合 ポー ト がどの よ う に 作 成 さ れたか 理 解 し ておいてか<br />
ら、Vivado HLS ブロックをシステムのほかのブロックに 接 続 する 際 に System Generator 内 でス ラ イ スおよび 再 変 換 ブ<br />
ロ ッ ク を 使 用 し ます。<br />
例 :<br />
• R、 G、 B の 3 つの 8 ビ ッ ト 入 出 力 ポー ト が 24 ビッ ト 入 力 ポート (RGB_in) と 24 ビッ ト 出 力 ポート (RGB_out) に<br />
パッキングされているとします。<br />
IP ブロックが System Generator に 含 まれる 際 には、 次 のよ うになっている 必 要 があ り ます。<br />
• 24 ビッ ト 入 力 ポート (RGB_in) は、 3 つの 8 ビ ッ ト 入 力 信 号 (Rin、 Gin、 Bin) を 正 し く ま とめた System Generator<br />
ブ ロ ッ ク で 駆 動 さ れる 必 要 があ り ます。<br />
• 24 ビッ ト 出 力 ポート (RGB_out) は、 3 つの 8 ビ ッ ト 入 力 信 号 (Rout、 Bout、 Gout) に 正 し く 分 割 される 必 要 があ り<br />
ます。<br />
複 合 タ イ プのポー ト に 接 続 する ためのス ラ イ スおよび 再 変 換 ブ ロ ッ ク の 使 用 方 法 にの 詳 細 については、 System<br />
Generator の 資 料 を 参 照 し て く だ さ い。<br />
Pcore フォーマットでのエクスポート<br />
合 成 および RTL 検 証 が 終 了 し た ら、 [Export RTL] ツールバー アイコン ( 図 1-88) をクリックして、[Export RTL Dialog]<br />
ダイアログ ボックスを 開 きます。<br />
[Format Selection] セクションで [Pcore for EDK] を 選 択 し ます ( 図 1-88)。<br />
X-Ref Target - Figure 1-88<br />
図 1‐88 : RTL を Pcore としてエクスポート<br />
高 位 合 成 japan.xilinx.com 202<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
[Configuration] ダイアログ ボ ッ ク ス を 使 用 する と 、IP の 設 定 およびイ ンプ リ メ ンテーシ ョ ン を カ ス タ マ イ ズで き ます。<br />
Pcore パッケージのバージ ョ ン 情 報 フ ィールド もそこでカスタマイズでき る こ とがあ り ます。 何 も 指 定 しない 場 合 、デ<br />
フォルトは、 1.00.a です。<br />
[Configuration] ダイアログ ボックスでは、 pcore の 一 部 またはすべてに 対 し てネ ッ ト リ ス ト (.ngc ファイル) が 生 成 で<br />
き る よ う にでき ます。 デザイ ンのネ ッ ト リ ス ト を 生 成 する 利 点 は、 デザイ ンが XPS 内 でエラ ボレー ト された と きに<br />
同 じ ネ ッ ト リ ス ト が 使 用 さ れる こ と にあ り ます。 次 の よ う なネ ッ ト リ ス ト オプシ ョ ンがあ り ます。<br />
none : デフ ォル ト の 設 定 で、 ネ ッ ト リ ス ト は 生 成 さ れません。 IP には RTL フ ァ イルのみが 含 まれます。<br />
ip : ザイ リ ンクス IP がある 場 合 はそのネッ ト リ ス ト が 生 成 されます。 ザイ リ ンク ス IP のネッ ト リ ス ト が 生 成 されま<br />
す。 こ れに よ り 、 すべてのザ イ リ ン ク ス IP が 合 成 され、 IP パッケージに 含 まれるよ うになります。<br />
top : 最 上 位 デザ イ ンのネ ッ ト リ ス ト が 生 成 さ れます。 デザ イ ン 全 体 が 合 成 さ れ、 結 果 がパ ッ ケージ さ れた IP に 含 ま<br />
れます。<br />
IP ブ ロ ッ ク の 配 置 配 線 後 の リ ソ ースおよびタ イ ミ ン グ 統 計 が 必 要 な 場 合 は、 [Evaluate] をオンに し、 必 要 な RTL 言 語<br />
を 指 定 します。 [OK] をクリ ックして Pcore パ ッ ケージを 生 成 し ます。 こ のパ ッ ケージは、<br />
//impl/pcores ディレク ト リに 書 き 込 まれます。<br />
[Evaluate] をオンにした 場 合 は、RTL 合 成 が 実 行 さ れ、 最 終 的 な タ イ ミ ングおよび リ ソ ースがレ ポー ト さ れますが、 IP<br />
パッ ケージには 含 まれません。 このプロセスの 詳 細 については、 「RTL 合 成 」 を 参 照 して く ださい。<br />
Vivado HLS 生 成 の Pcore パッケージは、 pcore ディレク ト リの 内 容 を EDK プロジェク トの pcore ディレク ト リにコ<br />
ピーする と、 EDK 環 境 に イ ンポー ト で き ます。<br />
ソフトウェア ドライバー ファイル<br />
AXI4-Slave-Lite イ ン ターフ ェ イ ス を 含 むデザ イ ンの 場 合 、 エ ク ス ポー ト プロセスでソフ ト ウェア ドライバー ファイ<br />
ルのセ ッ ト が 作 成 さ れます。 こ れら の C ドライバー ファイルは SDK C プロジェク トに 含 めて、 AXI4-Slave-Lite ポー<br />
トにアクセスするために 使 用 できます。<br />
ソフトウェア ドライバー ファイルは、 pcore 内 の include ディレク ト リ ( 例 :<br />
//impl/pcores//inlcude) に 書 き 込 まれま<br />
す。 こ れ ら のフ ァ イルの 使 用 方 法 については、 「イ ン ターフ ェ イ スの 指 定 」 を 参 照 して く ださい。<br />
合 成 済 みチ ェ ッ クポイ ン ト のエ ク スポー ト<br />
合 成 および RTL 検 証 が 終 了 し た ら、 [Export RTL] ツールバー アイコン ( 図 1-89) をクリックして、[Export RTL Dialog]<br />
ダイアログ ボックスを 開 きます。<br />
高 位 合 成 japan.xilinx.com 203<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 1 章 : 高 位 合 成<br />
X-Ref Target - Figure 1-89<br />
図 1‐89 : RTL の 合 成 済 みチ ェ ッ クポイ ン ト へのエ ク スポー ト<br />
デザイ ンがデザイ ン チェッ クポイン ト IP と し てパ ッ ケージ さ れる 場 合 、 パ ッ ケージ よ り も 前 にまず 合 成 を 実 行 する<br />
必 要 があ り ます。 IP をパッケージする 際 は、 [Evaluate] オプシ ョ ンはオフにし ます。<br />
[OK] をクリ ックしてデザイン チェッ クポイン ト パ ッ ケージを 生 成 し ます。 こ のパ ッ ケージは、<br />
//impl/ip ディレク ト リに 書 き 込 まれます。 デザイン チェッ クポイン ト<br />
ファイルは、 その 他 のデザイン チェッ クポイン ト と 同 じよ うに Vivado プロジェク トで 使 用 できます。<br />
高 位 合 成 japan.xilinx.com 204<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章<br />
C ライブラリの 使 用<br />
Vivado HLS の C ラ イ ブ ラ リ の 概 要<br />
Vivado HLS の C ラ イ ブ ラ リ を 使 用 する と 、 共 通 のハー ド ウ ェ ア デザイ ン コ ン ス ト ラ ク ト および 関 数 を C で 簡 単 に 記<br />
述 して RTL に 合 成 でき ます。 Vivado HLS には 次 の C ライブラリが 含 まれます。<br />
• 任 意 精 度 データ 型 ラ イ ブ ラ リ<br />
• HLS ストリーム ライブラリ<br />
• hls_math ライブラリ<br />
• HLS ビデオ ライブラリ<br />
• HLS IP ライブラリ<br />
• HLS 線 形 代 数 ラ イ ブ ラ リ<br />
各 C ライブラリはそのライブラリ ヘッダー ファイルを 含 めると、 デザインで 使 用 できるようになります。 これ<br />
らのヘッダー ファイルは、 Vivado HLS のインス トール ディレク ト リ 内 の include ディレク ト リにあります。<br />
重 要 : Vivado HLS C ライブラリのヘッダー ファイルは、 デザインが Vivado HLS で 使 用 される 場 合 は include パスに<br />
含 める 必 要 はあ り ません。 ラ イブラ リ ヘッダー フ ァ イルへのパスは、 自 動 的 に 追 加 さ れます。<br />
任 意 精 度 デー タ 型 ラ イ ブ ラ リ<br />
ネイティブ C データ 型 は、 8 ビッ ト 境 界 (8、 16、 32、 64 ビッ ト) にあ り ます。 RTL バス (ハー ド ウ ェ アに 対 応 ) では、<br />
任 意 の 幅 がサポー ト さ れます。 HLS では、 任 意 精 度 のビ ッ ト 幅 の 仕 様 を 使 用 で き る よ う に し、 ネ イ テ ィ ブ C データ<br />
型 の 制 限 に 依 存 ない よ う にする 機 構 が 必 要 です。 た と えば、 17 ビ ッ ト 乗 算 器 が 必 要 な 場 合 、 32 ビ ッ ト 乗 算 器 に イ ン<br />
プリ メントしなければならないような 制 限 はあるべきではありません。<br />
Vivado HLS では、 C および C++ の 整 数 および 固 定 小 数 点 の 任 意 精 度 データ 型 の 両 方 が 提 供 さ れてお り 、 SystemC の<br />
一 部 であ る 任 意 精 度 データ 型 がサポー ト さ れます。<br />
任 意 精 度 データ 型 の 利 点 は、 C コー ド を ビ ッ ト 幅 の 狭 い 変 数 を 使 用 する よ う ア ッ プデー ト し、 C シミュレーションを<br />
再 実 行 し て 機 能 が 同 一 ま たは 使 用 可 能 であ る こ と を 検 証 で き る 点 です。<br />
高 位 合 成 japan.xilinx.com 205<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
任 意 精 度 デー タ 型<br />
Vivado HLS では、 任 意 精 度 の 整 数 データ 型 が 提 供 さ れています ( 表 2-1)。 こ れ ら の 整 数 データ 型 では、 指 定 の 幅 の 制<br />
限 内 の 整 数 値 を 制 御 で き ます。<br />
表 2‐1: 整 数 デー タ 型<br />
言 語 整 数 デー タ 型 必 要 なヘ ッ ダー<br />
C [u]int (1024 ビット) gcc #include “ap_cin.h”<br />
C++ ap_[u]int (1024 ビッ ト) #include “ap_int.h”<br />
System C sc_[u]int (64 ビッ ト)<br />
sc_[u]bigint (512 ビッ ト)<br />
#include “systemc.h”<br />
注 記 : Vivado HLS には、 任 意 精 度 型 を 定 義 するヘ ッ ダー ファイルもスタンドアロン パッケージとして 含 まれており、<br />
ソース コー ド で 使 用 で き る よ う になっています。Vivado HLS インストール ディレク ト リの include ディレク ト リには<br />
xilinx_hls_lib_.tgz パッケージが 含 まれます。<br />
C 言 語 での 整 数 任 意 精 度 型<br />
C 言 語 では、 ヘ ッ ダー ファイル ap_cint.h に よ り 任 意 精 度 の 整 数 データ 型 [u]int が 定 義 されます。<br />
注 記 : xilinx_hls_lib_.tgz パッケージには、ap_cint.h で 定 義 された C 任 意 精 度 データ 型 は 含 まれていま<br />
せん。 これらのデータ 型 は、 標 準 C コ ンパイ ラー と は 一 緒 に 使 用 で きず、 Vivado HLS cpcc コンパイラーでのみ 使 用<br />
できるようになっています。 詳 細 は、「C 言 語 での 任 意 精 度 データ 型 の 検 証 」 を 参 照 し て く だ さ い。<br />
C 関 数 で 任 意 精 度 の 整 数 データ 型 を 使 用 する には、 次 の 手 順 に 従 います。<br />
• ソース コードにヘッダー ファイル ap_cint.h を 追 加 します。<br />
• ビ ッ ト 型 を、 符 号 付 き の 型 の 場 合 は intN、 符 号 な し の 型 の 場 合 は uintN (N はビッ ト サイズを 表 す 1 ~ 1024 の<br />
値 ) に 変 更 し ます。<br />
次 の 例 に、 ヘッ ダー ファイルの 追 加 方 法 と、 2 つの 変 数 を 9 ビ ッ ト 整 数 型 および 10 ビ ッ ト の 符 号 な し 整 数 型 を 使 用<br />
してインプリ メントする 方 法 を 示 します。<br />
#include ap_cint.h<br />
void foo_top (…) {<br />
int9 var1;<br />
uint10 var2;<br />
// 9-bit<br />
// 10-bit unsigned<br />
C++ 言 語 での 整 数 任 意 精 度 型<br />
ヘッダー ファイル ap_int.h では、 表 2-2 にリストされるように、C++ の 任 意 精 度 整 数 データ 型 の ap_[u]int 型<br />
が 定 義 されます。 C++ 関 数 で 任 意 精 度 の 整 数 データ 型 を 使 用 する には、 次 の 手 順 に 従 います。<br />
• ソース コードにヘッダー ファイル ap_int.h を 追 加 します。<br />
• ビ ッ ト 型 を、 符 号 付 き の 型 の 場 合 は ap_int、 符 号 な し の 型 の 場 合 は ap_uint (N はビッ ト サイズを 表<br />
す 1 ~ 1024 の 値 ) に 変 更 し ます。<br />
次 の 例 に、 ヘッ ダー ファイルの 追 加 方 法 と、 2 つの 変 数 を 9 ビ ッ ト 整 数 型 および 10 ビ ッ ト の 符 号 な し 整 数 型 を 使 用<br />
してインプリ メントする 方 法 を 示 します。<br />
#include ap_int.h<br />
void foo_top (…) {<br />
高 位 合 成 japan.xilinx.com 206<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
ap_int var1;<br />
ap_uint var2;<br />
// 9-bit<br />
// 10-bit unsigned<br />
SystemC 言 語 での 任 意 精 度 整 数 型<br />
SystemC で 使 用 さ れる 任 意 精 度 型 は、 ヘ ッ ダー ファイル systemc.h で 定 義 されています。 このヘッ ダー ファイル<br />
は、 すべての SystemC デザイ ンに 含 める 必 要 があ り ます。 ヘッ ダー ファイルには、SystemC sc_int、 sc_uint、<br />
sc_bigint、 および sc_biguint 型 が 含 まれます。<br />
任 意 精 度 の 固 定 小 数 点 デー タ 型<br />
固 定 小 数 点 データ 型 を 使 用 し て 実 行 さ れた C++/SystemC シ ミ ュ レーシ ョ ンの 動 作 は、 合 成 で 作 成 さ れたハー ド ウ ェ ア<br />
の 結 果 と 一 致 し、 ビ ッ ト 精 度 、 量 子 化 、 およびオーバーフ ローの 影 響 を 高 速 の C レベル シ ミュレーションで 解 析 で<br />
きるので、 HLS を 使 用 する 場 合 、 固 定 小 数 点 データ 型 の 使 用 は 特 に 重 要 です。<br />
Vivado HLS では、 C++ および SystemC に 任 意 精 度 の 固 定 小 数 点 データ 型 を 使 用 で き ます ( 表 2-2)。<br />
表 2‐2: 固 定 小 数 点 デー タ 型<br />
言 語 固 定 小 数 点 デー タ 型 必 要 なヘ ッ ダー<br />
C -- なし -- -- なし --<br />
C++ ap_[u]fixed #include “ap_fixed.h”<br />
System C sc_[u]fixed #define SC_INCLUDE_FX<br />
[#define SC_FX_EXCLUDE_OTHER]<br />
#include “systemc.h”<br />
こ れ ら のデータ 型 は、 指 定 の 合 計 幅 および 整 数 幅 の 制 限 内 での 浮 動 小 数 点 値 を 制 御 し ます ( 図 2-1)。<br />
X-Ref Target - Figure 2-1<br />
図 2‐1: 固 定 小 数 点 デー タ 型<br />
高 位 合 成 japan.xilinx.com 207<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
表 2-3 に、 固 定 小 数 点 でサポー ト さ れる 演 算 の 概 要 を 示 し ます。<br />
表 2‐3: 固 定 小 数 点 の 識 別 子<br />
W<br />
識 別 子<br />
ワード 長 をビッ ト 数 で 指 定<br />
説 明<br />
I<br />
Q<br />
整 数 値 を ビ ッ ト 数 で 指 定 ( 整 数 部 のビ ッ ト 数 )<br />
量 子 化 モー ド<br />
結 果 の 保 存 に 使 用 さ れる 変 数 の 最 小 の 小 数 ビ ッ ト で 定 義 で き る よ り も 大 き い 精 度 が 生 成 さ れ<br />
た 場 合 の 動 作 を 指 定<br />
SystemC 型 ap_fixed 型 説 明<br />
SC_RND AP_RND 正 の 無 限 大 への 丸 め<br />
SC_RND_ZERO AP_RND_ZERO 0 への 丸 め<br />
SC_RND_MIN_INF AP_RND_MIN_INF 負 の 無 限 大 への 丸 め<br />
AP_RND_INF AP_RND_INF 無 限 大 への 丸 め<br />
AP_RND_CONV AP_RND_CONV 収 束 丸 め<br />
AP_TRN AP_TRN 負 の 無 限 大 への 切 り 捨 て<br />
AP_TRN_ZERO AP_TRN_ZERO 0 への 切 り 捨 て (デフォル ト)<br />
O<br />
オーバーフ ロー モード<br />
演 算 結 果 が 最 大 可 能 値 ( 負 の 数 値 の 場 合 は 最 小 可 能 値 ) を 超 えるビヘイビアーを 検 出 ( 値 は 結<br />
果 を 格 納 する ために 使 用 さ れる 変 数 に 格 納 可 能 )<br />
SystemC 型 ap_fixed 型 説 明<br />
SC_SAT AP_SAT 飽 和<br />
SC_SAT_ZERO AP_SAT_ZERO 0 への 飽 和<br />
SC_SAT_SYM AP_SAT_SYM 対 称 飽 和<br />
SC_WRAP AP_WRAP 折 り 返 し (デフォル ト )<br />
SC_WRAP_SM AP_WRAP_SM 符 号 絶 対 値 の 折 り 返 し<br />
N<br />
オーバーフ ロー 折 り 返 し モー ド での 飽 和 ビ ッ ト 数 を 定 義<br />
ap_fixed を 使 用 した 例<br />
次 の 例 では、 Vivado HLS の ap_fixed 型 を 使 用 し て、 18 ビッ ト 変 数 (6 ビ ッ ト が 整 数 部 、 12 ビ ッ ト が 小 数 部 を 表 す)<br />
を 定 義 し ています。 変 数 は 符 号 付 き で、 量 子 化 モー ド は 正 の 無 限 大 へ 丸 め られ、 オーバーフ ローにはデフ ォル ト の 折<br />
り 返 しモードが 使 用 されます。<br />
#include <br />
...<br />
ap_fixed my_type;<br />
...<br />
sc_fixed を 使 用 した 例<br />
次 の sc_fixed 型 の 例 では、 22 ビ ッ ト 変 数 が 整 数 部 21 ビ ッ ト で 定 義 さ れてお り 、 最 小 精 度 は 0.5 です。 0 への 丸 めが 使<br />
用 されているので 0.5 未 満 の 結 果 はすべて 0 に 丸 められ、 飽 和 が 指 定 されています。<br />
#define SC_INCLUDE_FX<br />
高 位 合 成 japan.xilinx.com 208<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
#define SC_FX_EXCLUDE_OTHER<br />
#include <br />
...<br />
sc_fixed my_type;<br />
...<br />
C の 任 意 精 度 整 数 デー タ 型<br />
C のネイテ ィ ブ データ 型 は、 8 ビッ ト 境 界 (8、 16、 32、 64 ビット) にあ り ます。 RTL 信 号 および 演 算 では、 任 意 の<br />
ビッ ト 長 がサポートされます。Vivado HLS では C++ の 任 意 精 度 データ 型 が 提 供 さ れてお り 、 C コー ド の 変 数 および<br />
演 算 を 任 意 のビ ッ ト 幅 (6 ビッ ト、 17 ビッ ト、 234- ビッ トなど、 最 大 1024 ビッ トまで) で 指 定 でき ます。<br />
Vivado HLS では、C++ の 任 意 精 度 データ 型 も 提 供 さ れてお り 、 SystemC の 一 部 であ る 任 意 精 度 データ 型 がサポー ト さ<br />
れます。 こ れ ら のデータ 型 については、 C++ および SystemC コー ド 記 述 方 法 でそれぞれ 説 明 し ます。<br />
C の 任 意 精 度 デー タ 型 の 利 点<br />
任 意 精 度 データ 型 を 使 用 する 利 点 は、 次 の と お り です。<br />
• ハード ウ ェアの 質 の 改 善<br />
たとえば 17 ビ ッ ト の 乗 算 器 が 必 要 な 場 合 、 計 算 で 調 度 17 ビ ッ ト が 使 用 さ れる よ う に 指 定 する ために 任 意 精 度 型<br />
を 使 用 できます。<br />
任 意 精 度 データ 型 を 使 用 し ない 場 合 、 こ の よ う な 乗 算 (17 ビッ ト) は 32 ビ ッ ト の 整 数 データ 型 を 使 用 し て イ ンプ<br />
リ メ ン ト する 必 要 があ る ので、 複 数 の DSP48 コンポーネントを 使 用 して 乗 算 がインプリ メント されることにな<br />
ります。<br />
• 正 確 な C シ ミ ュ レーシ ョ ンおよび 解 析<br />
C コー ド の 任 意 精 度 データ 型 を 使 用 する と 、 正 確 なビ ッ ト 幅 を 使 用 し て C シ ミ ュ レーシ ョ ン を 実 行 で き、 合 成 前<br />
にアルゴ リ ズムの 機 能 (および 精 度 ) を 検 証 できます。<br />
C 言 語 では、ヘ ッ ダー ファイル ap_cint.h に よ り 任 意 精 度 の 整 数 データ 型 [u]int#W が 定 義 さ れます。 次 に 例 を 示 し ます。<br />
• int8は 8 ビ ッ ト の 符 号 付 き 整 数 データ 型 を 表 し ます。<br />
• uint234は 234 ビ ッ ト の 符 号 な し 整 数 データ 型 を 表 し ます。<br />
ap_cint.h ファイルは、 次 のディレク ト リに 含 まれます。<br />
$HLS_ROOT/includ<br />
説 明 :<br />
• $HLS_ROOT は Vivado HLS のインス トール ディレク ト リです。<br />
例 2-1 のコー ド は、 前 述 の 基 本 的 な 演 算 例 ( 例 3-22) の コー ド を 繰 り 返 し た も のです。 どち ら の 例 で も 合 成 さ れる 最 上<br />
位 関 数 のデータ 型 は dinA_t、 dinB_t などと 指 定 されています。<br />
高 位 合 成 japan.xilinx.com 209<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
#include apint_arith.h<br />
void apint_arith(din_A inA, din_B inB, din_C inC, din_D inD,<br />
out_1 *out1, dout_2 *out2, dout_3 *out3, dout_4 *out4<br />
) {<br />
}<br />
// Basic arithmetic operations<br />
*out1 = inA * inB;<br />
*out2 = inB + inA;<br />
*out3 = inC / inA;<br />
*out4 = inD % inA;<br />
例 2‐1 : 基 本 的 演 算<br />
2 つの 例 の 違 いは、データ 型 の 定 義 方 法 です。C 関 数 で 任 意 精 度 の 整 数 データ 型 を 使 用 する には、 次 の 手 順 に 従 います。<br />
• ソース コードにヘッダー ファイル ap_cint.h を 追 加 します。<br />
• ネイティブ C 型 を 次 の 任 意 精 度 に 変 更 し ます。<br />
° intN<br />
または<br />
° uintN<br />
説 明 :<br />
- N は 1 ~ 1024 のビッ ト サイズを 表 します。<br />
データ 型 はヘ ッ ダー ファイル apint_arith.h で 定 義 さ れます。 詳 細 は、 例 2-2を 参 照 して ください。 例 3-22 と 比 較 する<br />
と、 次 のことがわかります。<br />
• 入 力 データ 型 は 単 に 実 際 の 入 力 データ の 最 大 サ イ ズを 表 すために 削 減 さ れています。た と えば、8 ビッ ト 入 力 inA<br />
は 6 ビ ッ ト 入 力 に 削 減 さ れています。<br />
• 出 力 は さ ら に 正 確 に 改 良 さ れています。た と えば inA と inB の 合 計 であ る out2 は 32 ビッ トではなく 13 ビッ トだ<br />
けであ る 必 要 があ り ます。<br />
#include <br />
#include ap_cint.h<br />
// Previous data types<br />
//typedef char dinA_t;<br />
//typedef short dinB_t;<br />
//typedef int dinC_t;<br />
//typedef long long dinD_t;<br />
//typedef int dout1_t;<br />
//typedef unsigned int dout2_t;<br />
//typedef int32_t dout3_t;<br />
//typedef int64_t dout4_t;<br />
typedef int6 dinA_t;<br />
typedef int12 dinB_t;<br />
typedef int22 dinC_t;<br />
typedef int33 dinD_t;<br />
typedef int18 dout1_t;<br />
typedef uint13 dout2_t;<br />
typedef int22 dout3_t;<br />
高 位 合 成 japan.xilinx.com 210<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
typedef int6 dout4_t;<br />
void apint_arith(dinA_t inA,dinB_t inB,dinC_t inC,dinD_t inD,dout1_t<br />
*out1,dout2_t *out2,dout3_t *out3,dout4_t *out4);<br />
例 2‐2 : 基 本 演 算 APINT 型<br />
例 2-2 が 合 成 される と、 例 3-22 と 同 じ 機 能 のデザイン (データ は 例 2-2 で 指 定 された 範 囲 内 ) にな り ます。 ビ ッ ト 幅<br />
が 少 ない と ロ ジ ッ ク も 削 減 さ れる ので、 最 終 RTL デザ イ ンでは、 エ リ アは 小 さ く 、 ク ロ ッ ク 速 度 は 高 速 にな り ます。<br />
関 数 は、 合 成 前 に コ ンパイルおよび 検 証 さ れる 必 要 があ り ます。<br />
C 言 語 での 任 意 精 度 デー タ 型 の 検 証<br />
任 意 精 度 型 を 作 成 する には、 ap_cint.h ファイルのビッ ト サ イ ズを 定 義 する ための 属 性 を 追 加 し ます。 gcc などの<br />
標 準 C コンパイラでは、 ヘッダー ファイルで 使 用 される 属 性 がコンパイルされますが、 その 属 性 の 意 味 は 解 釈 でき<br />
ません。 標 準 C コ ンパイ ラ で 最 終 的 な 実 行 フ ァ イルが 作 成 さ れる と 、 次 の よ う な メ ッ セージが 表 示 さ れます。<br />
$HLS_ROOT/include/etc/autopilot_dt.def:1036: warning: bit-width attribute directive<br />
Ignored<br />
この 後 、シミ ュレーショ ンにネイティブ C データ 型 が 使 用 さ れますが、 コー ド のビ ッ ト 精 度 動 作 は 結 果 に 反 映 さ れま<br />
せん。 た と えば、2 進 数 記 述 100 の 3 ビ ッ ト の 整 数 値 は gcc (またはその 他 のサードパーティ C コンパイラ) によ り -4<br />
ではな く 、 10 進 数 値 の 4 として 処 理 されます。<br />
注 記 : この 問 題 は、 C 任 意 精 度 型 を 使 用 する 場 合 にのみ 発 生 し、 C++ または SystemC の 任 意 精 度 型 を 使 用 する 場 合 は<br />
発 生 し ません。<br />
Vivado HLS では、 任 意 精 度 型 が 使 用 さ れてい る と 認 識 さ れる と 、 独 自 のビル ト イ ン C コンパイラの apcc が 使 用 さ<br />
れ、 この 問 題 が 自 動 的 に 回 避 されます。 このコ ンパイ ラは gcc と 互 換 性 があ り ますが、 任 意 精 度 型 と 演 算 は 正 し く<br />
解 釈 さ れます。 apcc コンパイラは、 コマンド プロンプトで gcc を apcc に 変 更 する と 起 動 で き ます。<br />
$ apcc -o foo_top foo_top.c tb_foo_top.c<br />
$ ./foo_top<br />
C コー ド で 任 意 精 度 型 を 使 用 する と 、Cデザイ ンを Vivado HLS の C デバッガーで 解 析 できなくなります。デザインを<br />
デバ ッ グする 必 要 があ る 場 合 は、 次 のいずれかの 方 法 に 従 って く だ さ い。<br />
• printf または fprintf 関 数 を 使 用 し て 解 析 用 にデータ 値 を 出 力 し ます。<br />
• 任 意 精 度 型 をネ イ テ ィ ブ C 型 (int、 char、 short など) に 置 き 換 え ます。 こ の 方 法 を 使 用 する と 、 アルゴ リ ズム 自<br />
体 の 演 算 はデバ ッ グ しやす く な り ますが、 そのアルゴ リ ズムのビ ッ ト 精 度 結 果 の 解 析 には 役 立 ち ません。<br />
• C 関 数 を C++ に 変 更 し、 デバッ ガーの 制 限 がない C++ 任 意 精 度 型 を 使 用 し ます。<br />
整 数 拡 張<br />
任 意 精 度 演 算 の 結 果 がネ イ テ ィ ブビ ッ ト 値 の 8、 16、 32、 64 ビ ッ ト 境 界 を 越 え る 場 合 は、 注 意 が 必 要 です。 次 の 例 で<br />
は、 2 つの 18 ビ ッ ト 値 が 乗 算 さ れ、 結 果 が 36 ビ ッ ト に 格 納 さ れています。<br />
#include ap_cint.h<br />
int18 a,b;<br />
int36 tmp;<br />
tmp = a * b;<br />
整 数 拡 張 は、 次 の 方 法 を 使 用 する と 発 生 し ます。 結 果 は、 予 測 と 異 な る 可 能 性 があ り ます。<br />
整 数 拡 張 では、 C コ ンパイ ラ で 次 が 実 行 さ れます。<br />
• 乗 算 結 果 を 18 ビッ トから 次 のネイティブ ビッ ト サイズ (32 ビット) に 拡 張 し ます。<br />
高 位 合 成 japan.xilinx.com 211<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
• その 結 果 を 32 ビッ ト 変 数 の tmp に 代 入 し ます。<br />
こ れに よ り 、 動 作 と 不 正 な 結 果 が 図 2-2 に 示 すよ う にな り ます。<br />
X-Ref Target - Figure 2-2<br />
Vivado HLS では、 C シミュレーション 同 じ 結 果 になるので、32 ビ ッ ト の 乗 算 結 果 が 36 ビ ッ ト の 結 果 に 符 号 拡 張 さ れ<br />
るハー ド ウ ェ アが 作 成 さ れます。<br />
整 数 拡 張 問 題 は、 演 算 子 入 力 を 出 力 サ イ ズの 型 に 変 更 する と 回 避 で き ます。 図 2-3 は、 乗 算 前 に 乗 算 器 への 入 力 を 36<br />
ビ ッ ト 値 に 変 換 する 例 を 示 し ています。 こ れで C シ ミュレーション 中 に 正 しい ( 予 測 どお り の) 結 果 にな り 、 RTL で<br />
予 測 さ れた 36 ビッ ト 乗 算 になります。<br />
#include ap_cint.h<br />
typedef int18 din_t;<br />
typedef int36 dout_t;<br />
dout_t apint_promotion(din_t a,din_t b) {<br />
dout_t tmp;<br />
}<br />
tmp = (dout_t)a * (dout_t)b;<br />
return tmp;<br />
例 2‐3 : 整 数 拡 張 を 回 避 するための 型 変 換<br />
整 数 拡 張 を 避 け る ための 型 変 換 は、 演 算 結 果 が 次 のネ イ テ ィ ブ 境 界 (8、 16、 32 または 64) よ り も 大 き い 場 合 にのみ 必<br />
要 です。 こ れは、 加 算 および 減 算 よ り も 乗 算 で よ く 発 生 し ます。<br />
整 数 拡 張 問 題 は、 C++ または SystemC の 任 意 精 度 型 を 使 用 する 場 合 は 発 生 し ません。<br />
C の 任 意 精 度 整 数 型 : リファレンス 情 報<br />
図 2‐2: 整 数 拡 張<br />
こ れら のデータ 型 の 詳 細 については、 「 高 位 合 成 リ フ ァ レ ン ス ガイド」 の 章 を 参 照 してください。 「C の 任 意 精 度 型 」<br />
には、 次 の 情 報 が 含 まれています。<br />
• 任 意 精 度 の 整 数 に (64 ビッ トを 超 える 値 も 含 めて) 定 数 および 初 期 値 を 代 入 する 方 法<br />
• 表 示 、 連 結 、 ビ ッ ト ス ラ イ ス、 範 囲 選 択 な どの Vivado HLS のヘルパー 関 数 の 詳 細<br />
• シフ ト 演 算 ( 負 のシフ ト 値 は 反 対 方 向 でシフ ト にな る) の 記 述 も 含 めた 演 算 子 の 動 作 の 詳 細<br />
高 位 合 成 japan.xilinx.com 212<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
C++ の 任 意 精 度 整 数 型<br />
C++ のネイテ ィ ブ データ 型 は、 8 ビッ ト 境 界 (8、 16、 32、 64 ビット) にあ り ます。 RTL 信 号 および 演 算 では、 任 意 の<br />
ビッ ト 長 がサポートされます。<br />
Vivado HLS では C++ の 任 意 精 度 データ 型 が 提 供 さ れてお り 、C コー ド の 変 数 および 演 算 を 任 意 のビ ッ ト 幅 (6 ビッ ト、<br />
17 ビッ ト、 234- ビッ トなど、 最 大 1024 ビッ トまで) で 指 定 でき ます。<br />
ヒント : デフ ォル ト の 幅 の 最 大 許 容 幅 は 1024 ビ ッ ト です。 こ のデフ ォル ト は、 ap_int.h ヘッダー ファイルを 含 める 前<br />
に、 32768 以 下 の 正 の 整 数 値 でマ ク ロ AP_INT_MAX_W を 定 義 する と 上 書 きする こ と がで き ます。<br />
C++ では SystemC 規 格 で 定 義 さ れた 任 意 精 度 型 の 使 用 がサポー ト さ れる ので、 単 に SystemC ヘッダー ファイルの<br />
systemc.h を 含 めるだけで、 SystemC データ 型 が 使 用 で き ます。 SystemC のデータ 型 については、 「SystemC の 合 成 」 を<br />
参 照 し て く だ さ い。<br />
任 意 精 度 データ 型 には、 ネ イ テ ィ ブ C++ データ 型 よ り も 次 の よ う な 利 点 があ り ます。<br />
• ハード ウ ェアの 質 の 改 善 :たとえば 17 ビ ッ ト の 乗 算 器 が 必 要 な 場 合 、 計 算 で 調 度 17 ビッ トが 使 用 されるように<br />
指 定 する ために 任 意 精 度 型 を 使 用 で き ます。<br />
° 任 意 精 度 データ 型 を 使 用 し ない 場 合 、 こ の よ う な 乗 算 (17 ビッ ト) は 32 ビ ッ ト の 整 数 データ 型 を 使 用 し て イ<br />
ンプ リ メ ン ト する 必 要 があ る ので、 複 数 の DSP48 コ ンポーネン ト を 使 用 し て 乗 算 が イ ンプ リ メ ン ト さ れる<br />
ことになります。<br />
• 正 確 な C++ シミュレーション/ 解 析 :C++ コー ド の 任 意 精 度 データ 型 を 使 用 する と 、 正 確 なビ ッ ト 幅 を 使 用 し て<br />
C++ シ ミ ュ レーシ ョ ン を 実 行 で き、 合 成 前 にアルゴ リ ズムの 機 能 (および 精 度 ) を 検 証 できます。<br />
C++ の 任 意 精 度 型 には、 C の 任 意 精 度 型 で 発 生 する よ う な 問 題 はあ り ません。<br />
• C++ 任 意 精 度 型 は、 標 準 C++ コンパイラーでコンパイルされます ( 「C 言 語 での 任 意 精 度 データ 型 の 検 証 」 に 示<br />
すよ うに、 appc と 同 等 のものは C++ にはあ り ません)。<br />
• C++ 任 意 精 度 型 には、 整 数 拡 張 問 題 はあ り ません。<br />
ファイル 拡 張 子 を .c から .cpp に 変 更 するのは 珍 し く ないので、 フ ァ イルは 上 記 のよ う な 問 題 がない 場 合 は<br />
C++ としてコンパイルできます。<br />
C++ 言 語 では、 ヘ ッ ダー ファイル ap_int.h に よ り 任 意 精 度 の 整 数 データ 型 ap_(u)int が 定 義 さ れます。 た と え<br />
ば、ap_int は 8 ビ ッ ト の 符 号 付 き 整 数 データ 型 を 表 し、ap_uint は 234 ビ ッ ト の 符 号 な し 整 数 データ 型 を 表 し<br />
ます。<br />
ap_int.h ファイルは、$HLS_ROOT/include ディレク ト リ ($HLS_ROOT は Vivado HLS のインス トール ディレク ト リ) に<br />
あります。<br />
例 2-4 のコー ド は、 前 述 の 基 本 的 な 演 算 例 ( 例 3-22 および 例 2-1) のコードを 繰 り 返 したものです。 この 例 で 合 成 され<br />
る 最 上 位 関 数 のデータ 型 は dinA_t、 dinB_t などと 指 定 されています。<br />
高 位 合 成 japan.xilinx.com 213<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
#include cpp_ap_int_arith.h<br />
void cpp_ap_int_arith(din_A inA, din_B inB, din_C inC, din_D inD,<br />
dout_1 *out1, dout_2 *out2, dout_3 *out3, dout_4 *out4<br />
) {<br />
}<br />
// Basic arithmetic operations<br />
*out1 = inA * inB;<br />
*out2 = inB + inA;<br />
*out3 = inC / inA;<br />
*out4 = inD % inA;<br />
例 2‐4 : C++ 型 で 書 き 直 した 基 本 演 算<br />
このアップデートでは、 C++ 任 意 精 度 型 が 使 用 さ れています。<br />
• ソース コードにヘッダー ファイル ap_int.h を 追 加 します。<br />
• ネイティブ C++ 型 を 任 意 精 度 型 ap_int または ap_uint に 変 更 し ます。 ここでの N のビッ ト サイズは 1 ~<br />
1024 にな り ます ( 前 述 し た と お り 、 こ れは 必 要 であれば 32 ビッ トに 拡 張 できます)。<br />
データ 型 はヘ ッ ダー ファイル cpp_ap_int_arith.h で 定 義 されます ( 例 2-2)。<br />
例 3-22 と 比 較 する と 、 入 力 データ 型 は 単 に 実 際 の 入 力 データ の 最 大 サ イ ズを 表 すよ う に 削 減 さ れています ( 例 : 8 ビッ<br />
ト 入 力 inA を 6 ビッ ト 入 力 に 削 減 )。 出 力 は さ ら に 正 確 に 改 良 さ れています。 たとえば inA と inB の 合 計 であ る out2 は<br />
32 ビッ トではなく 13 ビッ トだけ 必 要 です。<br />
高 位 合 成 japan.xilinx.com 214<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
#ifndef _CPP_AP_INT_ARITH_H_<br />
#define _CPP_AP_INT_ARITH_H_<br />
#include <br />
#include ap_int.h<br />
#define N 9<br />
// Old data types<br />
//typedef char dinA_t;<br />
//typedef short dinB_t;<br />
//typedef int dinC_t;<br />
//typedef long long dinD_t;<br />
//typedef int dout1_t;<br />
//typedef unsigned int dout2_t;<br />
//typedef int32_t dout3_t;<br />
//typedef int64_t dout4_t;<br />
typedef ap_int dinA_t;<br />
typedef ap_int dinB_t;<br />
typedef ap_int dinC_t;<br />
typedef ap_int dinD_t;<br />
typedef ap_int dout1_t;<br />
typedef ap_uint dout2_t;<br />
typedef ap_int dout3_t;<br />
typedef ap_int dout4_t;<br />
void cpp_ap_int_arith(dinA_t inA,dinB_t inB,dinC_t inC,dinD_t inD,dout1_t<br />
*out1,dout2_t *out2,dout3_t *out3,dout4_t *out4);<br />
#endif<br />
例 2‐5 : C++ 任 意 精 度 型 を 使 用 し た 基 本 演 算<br />
例 2-4 が 合 成 される と、 例 3-22 および 例 2-2 と 同 じ 機 能 を 持 つデザインにな り ます。 テス ト ベンチをでき る 限 り 例<br />
2-2 のよ うにするには、 C++ カウント 演 算 を 使 用 して 結 果 をファイルに 出 力 するよ り も、 ビルト イン ap_int メソッド<br />
の .to_int() を 使 用 して ap_int の 結 果 を 標 準 fprintf 関 数 で 使 用 さ れる 整 数 型 に 変 換 し ます。<br />
fprintf(fp, %d*%d=%d; %d+%d=%d; %d/%d=%d; %d mod %d=%d;\n,<br />
inA.to_int(), inB.to_int(), out1.to_int(),<br />
inB.to_int(), inA.to_int(), out2.to_int(),<br />
inC.to_int(), inA.to_int(), out3.to_int(),<br />
inD.to_int(), inA.to_int(), out4.to_int());<br />
C++ の 任 意 精 度 整 数 型 : リファレンス 情 報<br />
こ の メ ソ ッ ド 、 合 成 動 作 、 ap_(u)int 任 意 精 度 データ 型 を 使 用 し たすべての 側 面 な どの 詳 細 については、 「C++ の<br />
任 意 精 度 型 」 を 参 照 し て く だ さ い。 こ のセ ク シ ョ ンには、 次 の 項 目 が 含 まれます。<br />
• 任 意 精 度 の 整 数 に (1024 ビットを 超 える 値 も 含 めて) 定 数 および 初 期 値 を 代 入 する 方 法<br />
• 表 示 、 連 結 、 ビ ッ ト ス ラ イ ス、 範 囲 選 択 な どの Vivado HLS のヘルパー メソッドの 詳 細<br />
• シフ ト 演 算 ( 負 のシフ ト 値 は 反 対 方 向 でシフ ト にな る) の 記 述 も 含 めた 演 算 子 の 動 作 の 詳 細<br />
高 位 合 成 japan.xilinx.com 215<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
C++ の 任 意 精 度 (AP) 固 定 小 数 点 型<br />
C++ 関 数 を 使 用 する と 、 Vivado HLS に 含 まれる 任 意 精 度 の 固 定 小 数 点 型 の 利 点 を 生 かす こ と がで き ます。 図 2-3 は、<br />
こ れ ら の 固 定 小 数 点 型 の 基 本 的 な 機 能 を ま と めています。<br />
• ワー ド は 符 号 付 き (ap_fixed) または 符 号 なし (ap_ufixed) にでき ます。<br />
• 任 意 サ イ ズのワー ド 幅 W は 定 義 でき ます。<br />
• 整 数 部 I の 桁 数 によ り 、 ワード W-I の 整 数 部 も 定 義 さ れます ( 図 2-3 では B)。<br />
• 丸 めま たは 量 子 化 (Q) のタイプを 選 択 できます。<br />
• オーバーフ ロー ビヘイビアー (O および N) を 選 択 できます。<br />
X-Ref Target - Figure 2-3<br />
図 2‐3: 任 意 精 度 の 固 定 小 数 点 型<br />
任 意 精 度 の 固 定 小 数 点 型 は、 ヘ ッ ダー ファイル ap_fixed.h が コー ド に 含 まれてい る と 使 用 で き ます。<br />
ヒント : 任 意 精 度 の 固 定 小 数 点 データ 型 の 方 が C シミュレーション 中 により 多 くのメモリを 必 要 とします。ap_[u] 固<br />
定 小 数 点 データ 型 のかな り 大 き な 配 列 を 使 用 する 場 合 は、 282 ページの 「 配 列 」 の C シミュレーションの 説 明 を 参 照<br />
してください。<br />
固 定 小 数 点 型 を 使 用 する と 、 次 の よ う な 利 点 があ り ます。<br />
• 小 数 を 簡 単 に 記 述 で き ます。<br />
• 整 数 部 および 小 数 部 のビ ッ ト 数 が 異 な る 変 数 の 場 合 、 小 数 点 のア ラ イ メ ン ト が 処 理 さ れます。<br />
• 結 果 を 正 確 に 示 すだけの 小 数 部 ビ ッ ト が 足 ら ない 場 合 のため、 多 く の 丸 めの 実 行 を 処 理 する オプシ ョ ンがあ り ま<br />
す。<br />
• 結 果 が 整 数 部 ビ ッ ト よ り も 大 き い 場 合 のため、 多 く の 変 数 のオーバーフ ローを 処 理 する オプシ ョ ン も あ り ます。<br />
これらの 属 性 は、 例 2-6 のコードに 含 まれています。 まず、 ヘッダー ファイル ap_fixed.h が 含 まれ、 ap_fixed 型 が<br />
typedef 文 に よ り 定 義 さ れます。<br />
• 10 ビッ ト 入 力 :8 ビ ッ ト 整 数 値 + 2 小 数 部<br />
• 6 ビット 入 力 :3 ビ ッ ト 整 数 値 + 3 小 数 部<br />
• 累 算 用 の 22 ビッ ト 変 数 :17 ビ ッ ト 整 数 値 + 5 小 数 部<br />
• 結 果 用 の 36 ビッ ト 変 数 :30 ビ ッ ト 整 数 値 + 6 小 数 部<br />
関 数 には、 演 算 実 行 後 の 小 数 点 のア ラ イ メ ン ト を 管 理 する コー ド は 含 まれません。 こ れは、 自 動 的 に 実 行 さ れます。<br />
#include ap_fixed.h<br />
typedef ap_ufixed din1_t;<br />
typedef ap_fixed din2_t;<br />
typedef ap_fixed dint_t;<br />
typedef ap_fixed dout_t;<br />
高 位 合 成 japan.xilinx.com 216<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
dout_t cpp_ap_fixed(din1_t d_in1, din2_t d_in2) {<br />
}<br />
static dint_t sum;<br />
sum =+ d_in1;<br />
return sum * d_in2;<br />
例 2‐6 : AP_Fixed 小 数 点 の 例<br />
表 2-4 は、 量 子 化 モードおよびオーバーフ ロー モード を 示 し ています。 詳 細 は、「C++ の 任 意 精 度 (AP) 固 定 小 数 点 型 」<br />
を 参 照 して く ださい。<br />
ヒント : 標 準 ハー ド ウ ェ ア 演 算 ( 折 り 返 しおよび 切 り 捨 て) のデフ ォル ト ビヘイビア 以 上 を 実 行 する 量 子 化 モードお<br />
よびオーバーフロー モー ド を 使 用 する と 、 さ ら に 多 く の 関 連 ハー ド ウ ェ アを 含 む 演 算 子 にな り ます。 負 の 無 限 大 への<br />
丸 めや 対 称 的 な 飽 和 などの さ ら にア ド バン ス なモー ド を イ ンプ リ メ ン ト する ために、ロ ジ ッ ク (LUT) が 必 要 にな り ま<br />
す。<br />
表 2‐4: 固 定 小 数 点 の 識 別 子<br />
識 別 子 説 明<br />
W<br />
ワード 長 をビッ ト 数 で 指 定<br />
I 整 数 値 を ビ ッ ト 数 で 指 定 ( 整 数 部 のビ ッ ト 数 )<br />
Q<br />
O<br />
N<br />
量 子 化 モー ド を 指 定 。 量 子 化 モー ド は、 結 果 の 保 存 に 使 用 さ れる 変 数 の 最 小 の 小 数 ビ ッ ト<br />
で 定 義 で き る よ り も 大 き い 精 度 が 生 成 さ れた 場 合 の 動 作 を 指 定<br />
モード<br />
AP_RND<br />
AP_RND_ZERO<br />
AP_RND_MIN_INF<br />
AP_RND_INF<br />
AP_RND_CONV<br />
説 明<br />
正 の 無 限 大 への 丸 め<br />
0 への 丸 め<br />
負 の 無 限 大 への 丸 め<br />
無 限 大 への 丸 め<br />
収 束 丸 め<br />
AP_TRN<br />
負 の 無 限 大 への 切 り 捨 て<br />
AP_TRN_ZERO 0 への 切 り 捨 て (デフォル ト)<br />
オーバーフ ロー モー ド を 指 定 。 オーバーフ ロー モー ド は、 結 果 の 保 存 に 使 用 さ れる 変 数<br />
よ り も 多 く のビ ッ ト が 生 成 さ れた 場 合 の 動 作 を 指 定<br />
モード<br />
AP_SAT<br />
AP_SAT_ZERO<br />
説 明<br />
飽 和<br />
0 への 飽 和<br />
AP_SAT_SYM 対 称 飽 和<br />
AP_WRAP 折 り 返 し (デフォル ト)<br />
AP_WRAP_SM 符 号 絶 対 値 の 折 り 返 し<br />
折 り 返 しモードでの 飽 和 ビッ ト 数<br />
ap_(u)fixed 型 を 使 用 する と 、 C++ シ ミ ュ レーシ ョ ンのビ ッ ト 精 度 は 正 し く な り ます。 高 速 シ ミ ュ レーシ ョ ン を 使 用 す<br />
る と 、 アルゴ リ ズム と その 精 度 を 検 証 で き ます。 合 成 後 、 RTL では 同 じ ビ ッ ト 精 度 の 動 作 にな り ます。<br />
任 意 精 度 の 固 定 小 数 点 型 を 使 用 する と 、 リ テ ラ ル 値 を 自 由 に 代 入 で き ます。 例 2-7 と 一 緒 に 使 用 さ れる テ ス ト ベンチ<br />
( 例 2-6) に 示 すよ う に、 in1 および in2 の 値 は 宣 言 済 みで、 定 数 値 が 代 入 さ れています。<br />
高 位 合 成 japan.xilinx.com 217<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
演 算 子 に 関 し て リ テ ラ ル 値 を 代 入 する 際 は、 まず リ テ ラ ル 値 を ap_(u)fixed 型 に 変 換 する 必 要 があ り ます。 こ う し ない<br />
と、 C コンパイラおよび Vivado HLS でこのリテラル 値 が 整 数 または float/double 型 と し て 認 識 さ れ、 最 適 な 演 算 子 が<br />
検 索 されなくなります。 次 の 例 に 示 すように、in1 = in1 + din1_t(0.25) の 代 入 では、 リ テ ラル 値 0.25 が ap_fixed 型 に 変<br />
換 されます。<br />
#include <br />
#include <br />
#include <br />
#include <br />
#include <br />
using namespace std;<br />
#include ap_fixed.h<br />
typedef ap_ufixed din1_t;<br />
typedef ap_fixed din2_t;<br />
typedef ap_fixed dint_t;<br />
typedef ap_fixed dout_t;<br />
dout_t cpp_ap_fixed(din1_t d_in1, din2_t d_in2);<br />
int main()<br />
{<br />
ofstream result;<br />
din1_t in1 = 0.25;<br />
din2_t in2 = 2.125;<br />
dout_t output;<br />
int retval=0;<br />
result.open(result.dat);<br />
// Persistent manipulators<br />
result
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
C++ の 任 意 精 度 固 定 小 数 点 型 : リファレンス 情 報<br />
こ の メ ソ ッ ド 、 合 成 動 作 、 ap_(u)fixed 任 意 精 度 固 定 小 数 点 データ 型 を 使 用 し たすべての 側 面 などの 詳 細 について<br />
は、 「C++ の 任 意 精 度 (AP) 固 定 小 数 点 型 」 を 参 照 し て く だ さ い。 こ のセ ク シ ョ ンには、 次 の 項 目 が 含 まれます。<br />
• 任 意 精 度 の 整 数 に (1024 ビットを 超 える 値 も 含 めて) 定 数 および 初 期 値 を 代 入 する 方 法<br />
• オーバーフ ロー モー ド および 飽 和 モー ド の 詳 細<br />
• 表 示 、 連 結 、 ビ ッ ト ス ラ イ ス、 範 囲 選 択 な どの Vivado HLS のヘルパー メソッドの 詳 細<br />
• シフ ト 演 算 ( 負 のシフ ト 値 は 反 対 方 向 でシフ ト にな る) の 記 述 も 含 めた 演 算 子 の 動 作 の 詳 細<br />
Vivado HLS のス ト リーム ライブラリ<br />
ストリーミング データ と は、 データ サンプルが 最 初 のサンプルから シーケンシャル 順 に 送 信 される タ イプのデータ<br />
転 送 の こ と です。 ス ト リ ー ミ ングには、 ア ド レ ス 管 理 は 必 要 あ り ません。<br />
ストリーミング データ を 使 用 するデザ イ ンは C で 記 述 する のが 困 難 な 場 合 があ り ます。 「マルチア ク セス ポインター<br />
インターフェイス : ス トリーミング データ」 の 説 明 の と お り 、 複 数 の 読 み 出 しおよび 書 き 込 みを 実 行 する ためにポ イ<br />
ン ターを 使 用 する と 、 型 修 飾 子 と テ ス ト ベンチの 構 築 方 法 が 記 述 さ れる ので、 問 題 が 発 生 する 可 能 性 があ り ます。<br />
Vivado HLS には、ス ト リ ー ミ ング データ 構 造 を 記 述 する ための C++ テンプレート クラスの hls::stream が 含 まれま<br />
す。 hls::stream ク ラ ス を 使 用 し て イ ンプ リ メ ン ト し た ス ト リ ームには、 次 の 属 性 があ り ます。<br />
• C コードでは、 hls::stream が 無 限 深 さ の FIFO の よ う に 動 作 し ます。 hls::stream のサ イ ズを 定 義 する 必 要 は<br />
ありません。<br />
• こ れ ら は、 シーケ ンシ ャルに 読 み 出 さ れて 書 き 込 まれます。 1 つのデータが hls::stream か ら 読 み 出 さ れる と 、<br />
それが 再 び 読 み 出 さ れる こ と はあ り ません。<br />
• 最 上 位 イ ン ターフ ェ イ スの hls::stream は ap_fifo インターフェイスを 使 用 してデフォルトでインプリ メン<br />
トされます。<br />
• hls::stream は、 合 成 で 深 さ 1 の FIFO としてインプリメントされます。このデフォルト サ イ ズを 変 更 する には、<br />
最 適 化 指 示 子 の STREAM を 使 用 します。<br />
このセクショ ンでは、ス ト リーミング データ を 使 用 し たデザ イ ン を hls::stream ク ラ ス を 使 用 し て よ り 簡 単 に 記 述 す<br />
る 方 法 を 示 します。 このセクシ ョ ンの ト ピッ クには、 次 が 含 まれます。<br />
• ス ト リ ーム を 使 用 し た 記 述 と ス ト リ ームの RTL インプリ メンテーションの 概 要<br />
• グローバル ストリーム 変 数 の 規 則<br />
• ス ト リ ームの 使 用 方 法<br />
• 読 み 出 しおよび 書 き 込 みのブ ロ ッ キ ング<br />
• 読 み 出 しおよび 書 き 込 みの ノ ンブ ロ ッ キ ング<br />
• FIFO の 深 さの 制 御<br />
注 記 : hls::stream クラスは 常 に C++ リ フ ァ レ ン ス 引 数 と し て 関 数 間 で 使 用 さ れます。 た と えば、 &my_stream です。<br />
重 要 : hls::stream クラスは、C++ デザ イ ンでのみ 使 用 さ れます。<br />
C 記 述 と RTL インプリメンテーション<br />
ストリームは、 ソフトウェア (および RTL 協 調 シ ミ ュ レーシ ョ ン 中 のテ ス ト ベンチ) では 無 限 大 のキューと して 記 述<br />
されます。 ス ト リームを C++ でシ ミ ュ レーシ ョ ンする ために、 深 さ を 指 定 する 必 要 はあ り ません。 ス ト リ ームは 関<br />
高 位 合 成 japan.xilinx.com 219<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
数 内 ま たは 関 数 への イ ン ターフ ェ イ スに 使 用 で き ます。 内 部 ス ト リ ームは 関 数 パ ラ メ ーター と し て 渡 す こ と がで き ま<br />
す。<br />
ストリームは C++ ベースのデザ イ ンでのみ 使 用 で き ます。 各 hls::stream オブジェ ク ト は 1 プロセスで 書 き 込 まれ、<br />
1 プ ロ セ スで 読 み 出 さ れる よ う にする 必 要 があ り ます。 た と えば、 DATAFLOW デザイ ンでは、 各 ス ト リ ームグには<br />
1 つの 送 信 プ ロ セス と 1 つの 受 信 プ ロ セスだけが 含 まれます。<br />
RTL では、 ス ト リ ームが FIFO インターフェイス と してインプリ メ ン ト されますが、 オプシ ョ ンでフル ハン ドシェ イ<br />
ク インターフェイス ポー ト (ap_hs) を 使 用 してインプ リ メ ン ト できます。 デフォル ト のインターフェ イ ス ポー ト は<br />
ap_fifo ポー ト です。 FIFO の 深 さにはオプシ ョ ンで STREAM 指 示 子 を 使 用 で き ます。<br />
グローバルおよびローカル ストリーム<br />
ストリームは、ローカルまたはグローバルのいずれかに 定 義 できます。ローカル ス トリームは 常 に 内 部 FIFO として<br />
イ ンプ リ メ ン ト さ れます。 グ ローバル ス トリームは 内 部 FIFO ま たはポー ト と し て イ ンプ リ メ ン ト さ れる 可 能 性 があ<br />
ります。<br />
• 読 み 出 し 専 用 ま たは 書 き 込 み 専 用 のグ ローバルに 定 義 さ れた ス ト リ ームは、 最 上 位 RTL ブロックの 外 部 ポート<br />
として 推 論 されます。<br />
• 最 上 位 関 数 よ り 下 位 の 階 層 での 読 み 出 しおよび 書 き 込 み 両 方 用 のグ ローバルに 定 義 さ れた ス ト リ ームは、 内 部<br />
FIFO としてインプリメントされます。<br />
グローバル ス コープで 定 義 される ス ト リ ームは、その 他 のグ ローバル 変 数 と 同 じ 規 則 に 従 います。 グ ローバル 変 数 の<br />
合 成 の 詳 細 は、 「データ 型 と ビ ッ ト 幅 」 を 参 照 して く ださい。<br />
HLS ス ト リ ームの 使 用<br />
hls::stream オブジ ェ ク ト を 使 用 する には、 ヘ ッ ダー ファイルの hls_stream.h を 含 めます。 ス ト リ ー ミ ング データ オ<br />
ブジェク トは、 型 と 変 数 名 を 指 定 して 定 義 します。 次 の 例 では、 128 ビ ッ ト の 符 号 な し 整 数 型 が 定 義 さ れて、<br />
my_wide_stream と い う ス ト リ ーム 変 数 を 作 成 する ために 使 用 さ れています。<br />
#include “ap_int.h”<br />
#include “hls_stream.h”<br />
typedef ap_uint uint128_t; // 128-bit user defined type<br />
hls::stream my_wide_stream; // A stream declaration<br />
ス ト リ ームでは、 ス コープ 付 き の 命 名 規 則 を 使 用 する 必 要 があ る ので、 上 記 の 例 の よ う にス コープ 付 き (hls::) の 命<br />
名 規 則 を 使 用 する こ と をお 勧 め し ますが、 hls 名 前 空 間 が 使 用 さ れる 場 合 は、 上 記 の 例 は 次 の よ う に 記 述 し 直 す こ と<br />
ができ ます。<br />
#include <br />
#include <br />
using namespace hls;<br />
typedef ap_uint uint128_t; // 128-bit user defined type<br />
stream my_wide_stream; // hls:: no longer required<br />
ストリームが hls::stream として 指 定 されている 場 合 は、T 型 は 次 のいずれかにな り ます。<br />
• C++ ネイティブ データ 型<br />
• Vivado HLS 任 意 精 度 型 ( 例 : ap_int、 ap_ufixed)<br />
• 上 記 のいずれかの 型 を 含 んだユーザー 定 義 の 構 造 体<br />
注 記 : メソッド ( メ ンバー 関 数 ) を 含 む 通 常 のユーザー 定 義 の ク ラ ス (または 構 造 ) は、 ス ト リ ーム 変 数 の 型 (T) として<br />
使 用 さ れるべき ではあ り ません。<br />
高 位 合 成 japan.xilinx.com 220<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
ス ト リ ームには、 オプシ ョ ンで 名 前 を 付 け る こ と がで き ます。 ス ト リ ームに 名 前 を 定 義 する と 、 その 名 前 がレポー ト<br />
で 使 用 さ れる よ う にな り ます。 た と えば、 Vivado HLS では 入 力 ス ト リ ームか ら のすべてのエレ メ ン ト がシ ミ ュ レー<br />
シ ョ ン 中 に 読 み 出 さ れる よ う になってい る かど う かが 自 動 的 に 確 認 さ れます。 次 の 2 つのス ト リ ームがあ る と し ま<br />
す。<br />
stream bytestr_in1;<br />
stream bytestr_in2("input_stream2");<br />
ス ト リ ー ム に 残 っ た ま ま の エ レ メ ン ト が あ れば、 次 の よ う に 警 告 メ ッ セージ が 表 示 さ れ ま す。 この 例 の 場 合 、<br />
bytetr_in2 に 関 する メ ッセージが 表 示 されています。<br />
WARNING:Hls::stream 'hls::stream.1' contains leftover data, which may<br />
result in RTL simulation hanging.<br />
WARNING:Hls::stream 'input_stream2' contains leftover data, which may result in RTL<br />
simulation hanging.<br />
ス ト リ ームが 関 数 を 出 入 り する 際 は、 次 の 例 のよ う に リ フ ァ レ ン ス ご と に 渡 される 必 要 があ り ます。<br />
void stream_function (<br />
hls::stream &strm_out,<br />
hls::stream &strm_in,<br />
uint16_t strm_len<br />
)<br />
Vivado HLS では、 ブロ ッ キングおよびノ ンブロ ッ キング アクセスのメソッド 両 方 がサポート されます。<br />
• ノンブロッキング アクセスは、 FIFO インターフェイスとしてのみインプリ メントできます。<br />
• ap_fifo ポー ト と してイ ンプ リ メ ン ト される ス ト リ ー ミ ング ポー ト と AXI4 Stream リソースを 使 用 して 定 義 され<br />
るスト リーミング ポー ト には、 ノ ンブロ ッ キング アクセスを 使 用 しないでください。<br />
ス ト リ ーム を 使 用 し たデザ イ ン 例 全 体 は、 次 を ク リ ッ ク し た Vivado HLS のサンプル デザイ ン 例 に 含 まれます。 GUI<br />
のウェルカム 画 面 からデザイン 例 に 含 まれる hls_stream の 例 を 参 照 し て く だ さい。<br />
読 み 出 し および 書 き 込 みのブ ロ ッ キング<br />
hls::stream オブジ ェ ク ト への 基 本 的 なア ク セ スは 読 み 出 しおよび 書 き 込 みのブ ロ ッ キ ングで、 こ れは ク ラ ス メソッ<br />
ドを 使 用 して 達 成 できます。 これらのメソッドは、 空 のスト リーム FIFO か ら の 読 み 出 しや、 フル ス トリーム FIFO<br />
への 書 き 込 みが 実 行 さ れよ う と し た 場 合 、ま たは ap_hs インターフェイス プロ ト コルにマップされたス ト リームに 対<br />
してフル ハン ド シ ェ イ ク が 達 成 さ れる まで、 実 行 を 停 止 (ブロック) します。<br />
書 き 込 み メ ソ ッ ド のブ ロ ッ キング<br />
次 の 例 では、 src_var 変 数 がス ト リ ームに 含 まれています。<br />
// Usage of void write(const T & wdata)<br />
hls::stream my_stream;<br />
int src_var = 42;<br />
my_stream.write(src_var);<br />
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
my_stream > 演 算 子 はオーバーロー ド さ れ、 C++ ス ト リ ームのス ト リ ーム 抽 出 演 算 子 ( 例 : iostreams、 filestreams など) のよ うに<br />
使 用 で き ます。 hls::stream は LHS 引 数 、 およびデス テ ィ ネーシ ョ ン 変 数 の RHS として 提 供 されています。<br />
// Usage of void operator >> (T & rdata)<br />
hls::stream my_stream;<br />
int dst_var;<br />
my_stream >> dst_var;<br />
ノ ン ブ ロ ッ キング 読 み 出 し および 書 き 込 み<br />
読 み 出 しおよび 書 き 込 みの ノ ンブ ロ ッ キ ング メ ソ ッ ド も 提 供 さ れています。 こ れに よ り 、 空 のス ト リ ーム FIFO から<br />
の 読 み 出 しやフル ス トリーム FIFO への 書 き 込 みがあ って も、 実 行 を 続 行 させる こ と がで き ます。<br />
これらのメ ソ ッ ドは、 アクセスのステータスを 示 すブール 値 を 戻 します ( 問 題 なければ true、 それ 以 外 は false)。<br />
hls::stream ス ト リ ームのス テータ ス をテ ス ト する ために、 別 の メ ソ ッ ド も 提 供 さ れています。<br />
ヒント : ノンブロッキング アクセスの 詳 細 なメソッドはどれも、 ap_hs プロ ト コルが 選 択 された hls::stream イン<br />
ターフェイスでは 使 用 できません。<br />
C シ ミ ュレーシ ョ ン 中 、 ス ト リームには 無 限 サイズが 含 まれます。 このため、 ス ト リームがフルの 場 合 は C シ ミュ<br />
レーシ ョ ンで 検 証 はで き ません。 こ れ ら の メ ソ ッ ド は、 FIFO サイズ (デフォル ト サイズの 1 か STREAM 指 示 子 で 定<br />
義 された 任 意 のサイズ) が 定 義 さ れた 場 合 の RTL シ ミ ュ レーシ ョ ン 中 にのみ 検 証 で き ます。<br />
ノンブロッキング 書 き 込 み<br />
このメ ソッ ドでは、src_var 変 数 を my_stream ス トリームに 含 めようとし、 含 まれる 場 合 はブール 値 true が 戻 される よ<br />
う に し ています。 それ 以 外 の 場 合 は false が 戻 さ れて、 キ ューは 影 響 を 受 け ません。<br />
// Usage of void write_nb(const T & wdata)<br />
hls::stream my_stream;<br />
高 位 合 成 japan.xilinx.com 222<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
int src_var = 42;<br />
if (my_stream.write_nb(src_var)) {<br />
// Perform standard operations<br />
...<br />
} else {<br />
// Write did not occur<br />
return;<br />
}<br />
フルかど うかのテス ト<br />
bool full(void)<br />
このメ ソッ ドは、 hls::stream オブジ ェ ク ト がフルの 場 合 にのみ true を 戻 します。<br />
// Usage of bool full(void)<br />
hls::stream my_stream;<br />
int src_var = 42;<br />
bool stream_full;<br />
stream_full = my_stream.full();<br />
ノンブロッキング 読 み 出 し<br />
bool read_nb(T & rdata)<br />
こ の メ ソ ッ ド では、 ス ト リ ームか ら 値 を 読 み 出 そ う と し、 問 題 な く 読 み 出 せた 場 合 は true が 戻 されます。 それ 以 外 の<br />
場 合 は false が 戻 さ れて、 キ ューは 影 響 を 受 け ません。<br />
// Usage of void read_nb(const T & wdata)<br />
hls::stream my_stream;<br />
int dst_var;<br />
if (my_stream.read_nb(dst_var)) {<br />
// Perform standard operations<br />
...<br />
} else {<br />
// Read did not occur<br />
return;<br />
}<br />
空 かど う かのテス ト<br />
bool empty(void)<br />
hls::stream が 空 の 場 合 にのみ true を 戻 します。<br />
// Usage of bool empty(void)<br />
hls::stream my_stream;<br />
int dst_var;<br />
bool stream_empty;<br />
fifo_empty = my_stream.empty();<br />
高 位 合 成 japan.xilinx.com 223<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
次 の 例 は、 ノ ンブロ ッ キング アクセスとフル/ 空 のテ ス ト を 組 み 合 わせて、 RTL FIFO がフルまたは 空 の 場 合 にエラー<br />
を どの よ う に 処 理 する かを 示 し ています。<br />
#include hls_stream.h<br />
using namespace hls;<br />
typedef struct {<br />
short data;<br />
bool valid;<br />
bool invert;<br />
} input_interface;<br />
bool invert(stream& in_data_1,<br />
stream& in_data_2,<br />
stream& output<br />
) {<br />
input_interface in;<br />
bool full_n;<br />
// Read an input value or return<br />
if (!in_data_1.read_nb(in))<br />
if (!in_data_2.read_nb(in))<br />
return false;<br />
// If the valid data is written, return not-full (full_n) as true<br />
if (in.valid) {<br />
if (in.invert)<br />
full_n = output.write_nb(~in.data);<br />
else<br />
full_n = output.write_nb(in.data);<br />
}<br />
return full_n;<br />
}<br />
RTL の FIFO の 深 さの 制 御<br />
ストリーミング データ を 使 用 する ほ と んどのデザ イ ンでは、 デフ ォル ト の RTL FIFO の 深 さ 1 は 十 分 な 深 さ です。 こ<br />
れは、 ス ト リ ー ミ ング データ が 通 常 1 度 に 1 サンプルを 処 理 する か ら です。<br />
インプリ メンテーションで FIFO の 深 さ が 1 よ り 多 く 必 要 なマルチレー ト デザイ ンの 場 合 は、STREAM 指 示 子 を 使 用<br />
して RTL シ ミ ュ レーシ ョ ンが 終 了 する ために 必 要 な 深 さ を 設 定 する 必 要 があ り ます。FIFO の 深 さ が 十 分 でない 場 合 、<br />
RTL 協 調 シ ミ ュ レーシ ョ ンは 停 止 し ます。<br />
このため、ス ト リーム オブジェ ク ト は GUI の [Directives] タ ブには 表 示 さ れないので、 STREAM 指 示 子 を [Directives]<br />
タ ブか ら は 直 接 適 用 で き ません。<br />
hls::stream オブジェ ク ト が 宣 言 されている (または 引 数 リ ス トに 使 用 されているか 存 在 している) 関 数 で 右 ク リ ッ ク<br />
します。<br />
• STREAM 指 示 子 を 選 択 し ます。<br />
• variable フ ィ ール ド には、 そのス ト リ ーム 変 数 名 を 入 力 し ます。<br />
または、 次 のいずれかを 実 行 します。<br />
• directives.tcl ファイルで STREAM 指 示 子 を 手 動 で 指 定 し ます。<br />
• source にプ ラ グマ と し て 追 加 し ます。<br />
高 位 合 成 japan.xilinx.com 224<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ンのサポー ト<br />
Vivado HLS の C/RTL 協 調 シ ミ ュ レーシ ョ ン 機 能 では、 最 上 位 イ ン ターフ ェ イ スに hls::stream メンバーを 含 む 構 造<br />
またはクラスはサポート されません。 Vivado HLS では こ れ ら の 構 造 および ク ラ スは 合 成 でサポー ト さ れます。<br />
typedef struct {<br />
hls::stream a;<br />
hls::stream b;<br />
} strm_strct_t;<br />
void dut_top(strm_strct_t indata, strm_strct_t outdata) { … }<br />
こ れ ら の 制 限 は、 最 上 位 関 数 の 引 数 と グ ローバルに 宣 言 さ れたオブジ ェ ク ト の 両 方 に 適 用 さ れます。 ス ト リ ームの 構<br />
造 体 が 合 成 に 使 用 さ れる 場 合 は、 外 部 の RTL シミュレータとユーザーの 作 成 した HDL テス トベンチを 使 用 してデザ<br />
イ ン を 検 証 する 必 要 があ り ます。 内 部 リ ン ケージの 厳 し い hls::stream オブジェ ク ト には、 このよ う な 制 限 はあ り ま<br />
せん。<br />
hls_math ライブラリ<br />
Vivado HLS の math ライブラリ (hls_math.h) は、 標 準 C (math.h) および C++ (cmath.h) ライブラリの 合 成 をサポートす<br />
る ために 提 供 さ れています。 サポー ト には、 浮 動 小 数 点 および 固 定 小 数 点 の 関 数 が 含 まれます。<br />
標 準 C の math ライブラリでサポートされるすべての 関 数 が HLS の math ラ イ ブ ラ リ で 提 供 さ れてい る わけではあ り<br />
ません。 次 の 表 に 示 す 数 学 関 数 のみが 合 成 でサポー ト さ れます。<br />
表 2‐5:Vivado HLS の math ライブラリ<br />
abs<br />
関 数 デー タ 型 精 度 (ULP) インプリメンテーション 形 式<br />
float<br />
Exact<br />
Synthesized<br />
double<br />
atanf float 2 Synthesized<br />
ceil<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
ceilf float Exact Synthesized<br />
copysign<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
copysignf float Exact Synthesized<br />
cos<br />
float<br />
double<br />
10 Synthesized<br />
ap_fixed 28-29 Synthesized<br />
cosf float 1 Synthesized<br />
coshf float 4 Synthesized<br />
exp<br />
float<br />
double<br />
Exact<br />
LogiCore<br />
expf float Exact LogiCore<br />
fabs<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
fabsf float Exact Synthesized<br />
高 位 合 成 japan.xilinx.com 225<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
表 2‐5:Vivado HLS の math ライブラリ<br />
floorf float Exact Synthesized<br />
fmax<br />
fmin<br />
float<br />
double<br />
float<br />
double<br />
Exact<br />
Exact<br />
Synthesized<br />
Synthesized<br />
logf float 1 Synthesized<br />
floor<br />
fpclassify<br />
isfinite<br />
isinf<br />
isnan<br />
isnormal<br />
float<br />
double<br />
float<br />
double<br />
float<br />
double<br />
float<br />
double<br />
float<br />
double<br />
float<br />
double<br />
Exact<br />
Exact<br />
Exact<br />
Exact<br />
Exact<br />
Exact<br />
Synthesized<br />
Synthesized<br />
Synthesized<br />
Synthesized<br />
Synthesized<br />
Synthesized<br />
log float 1 Synthesized<br />
double 16<br />
log10 float 2 Synthesized<br />
modf<br />
double 3<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
modff float Exact Synthesized<br />
1/x ( 逆 数 ) float<br />
Exact<br />
LogiCORE IP<br />
double<br />
recip<br />
float<br />
double<br />
1 Synthesized<br />
recipf float 1 Synthesized<br />
round<br />
rsqrt<br />
float<br />
double<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
1 Synthesized<br />
rsqrtf float 1 Synthesized<br />
1/sqrt ( 逆 数 sqrt)<br />
signbit<br />
関 数 デー タ 型 精 度 (ULP) インプリメンテーション 形 式<br />
float<br />
double<br />
float<br />
double<br />
Exact<br />
Exact<br />
LogiCORE IP<br />
Synthesized<br />
高 位 合 成 japan.xilinx.com 226<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
表 2‐5:Vivado HLS の math ライブラリ<br />
sin<br />
関 数 デー タ 型 精 度 (ULP) インプリメンテーション 形 式<br />
float<br />
double<br />
10 Synthesized<br />
ap_fixed 28-29 Synthesized<br />
sincos float 1 Synthesized<br />
double 5<br />
sincosf float 1 Synthesized<br />
HLS math ライブラリの 使 用<br />
hls_math.h ラ イ ブ ラ リ は、 合 成 が 実 行 さ れる と 自 動 的 に 使 用 さ れます。 オプシ ョ ンで C ソースに 含 めるこ と もできま<br />
す。 標 準 C math ラ イ ブ ラ リ の 使 用 と C ソースの hls_math.h ラ イ ブ ラ リ の 使 用 の 違 いは、 C および C/RTL シミュレー<br />
シ ョ ンの 結 果 だけです。<br />
こ れは、 上 記 の 表 に リ ス ト さ れる よ う に、 イ ンプ リ メ ン ト さ れた 関 数 の 精 度 に 関 連 し ます。<br />
HLS math ラ イ ブ ラ リの 精 度<br />
HLS math 関 数 の 中 には、 浮 動 小 数 点 LogicCORE を 使 用 してインプ リ メ ン ト される ものもあ り ます。これらの 関 数 は、<br />
演 算 の 全 範 囲 で 標 準 C ラ イ ブ ラ リ の 関 数 と 常 に 完 全 に 一 致 し ます。 その 他 の math 関 数 は、 hls_math.h か ら 合 成 可 能<br />
なビ ッ ト 概 算 関 数 と し て イ ンプ リ メ ン ト さ れます。 場 合 に よ っては、 ビ ッ ト 概 算 の HLS math ライブラリ 関 数 には 標<br />
準 C 関 数 と 同 じ 精 度 はあ り ません。 ビ ッ ト 概 算 イ ンプ リ メ ンテーシ ョ ンでは、 C/C++ バージ ョ ン と は 異 な る 下 位 アル<br />
ゴ リ ズム を 使 用 し て 結 果 が 達 成 さ れる こ と があ り ます。<br />
関 数 の 精 度 は、 ULP (Unit of Least Precision) を 単 位 と して 指 定 されます。 浮 動 小 数 点 を 使 用 する と 、 LSB ( 最 下 位 ビ ッ<br />
ト ) が 常 に 値 1 または 0 のいずれかになる とは 限 り ません。 LSB の 正 確 な 値 は 指 数 の 値 によ って 異 な り ます。 ULP で<br />
は 演 算 の 全 範 囲 でどれ く ら い イ ンプ リ メ ンテーシ ョ ンが 正 確 かを 測 定 さ れます。 1 ULP の 精 度 は、 演 算 全 範 囲 で 結 果<br />
が 数 学 的 に 正 確 な 答 えから 1 LSB 異 な る 可 能 性 を 示 し ています。 こ の 場 合 、 相 対 的 なエ ラーがかな り 少 ない こ と を 示<br />
しています。<br />
こ の 精 度 の 違 いは、 C シミュレーションと C/RTL 協 調 シ ミ ュ レーシ ョ ンの 両 方 に 影 響 し ます ( 詳 細 は 後 で 説 明 )。<br />
また、 次 の 7 つの 関 数 の 場 合 、 コ ンパイルおよび C シ ミ ュ レーシ ョ ンの 実 行 に 使 用 する C 標 準 に よ って 精 度 が 異 な<br />
ることがあります。<br />
• copysign<br />
• fpclassify<br />
sinf float 1 Synthesized<br />
sinhf float 6 Synthesized<br />
sqrt<br />
tan<br />
float<br />
double<br />
Exact<br />
LogiCORE IP<br />
ap_fixed 28-29 Synthesized<br />
float<br />
double<br />
20 Synthesized<br />
tanf float 3 Synthesized<br />
trunc<br />
float<br />
double<br />
Exact<br />
Synthesized<br />
高 位 合 成 japan.xilinx.com 227<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
• isinf<br />
• isfinite<br />
• isnan<br />
• isnormal<br />
• signbit<br />
C90 モード<br />
isinf、isnan、および copysign だけは、 通 常 システム ヘッダー フ ァ イルで 提 供 され、 倍 精 度 で 動 作 し ます。 特 に copysign<br />
は 常 に 倍 精 度 の 結 果 を 戻 し ます。 こ れに よ り 、 浮 動 小 数 点 を 戻 さ なければいけない 場 合 、 double-to-float 変 換 ブ ロ ッ ク<br />
がハー ド ウ ェ アに 導 入 さ れる ので、 合 成 後 で 予 想 外 の 結 果 になって し ま う こ と があ り ます。<br />
C99 モード (‐std=c99)<br />
7 つの 関 数 はすべて、 シ ス テム ヘッダー ファイルにより __isnan(double) および __isnan(float) にリダイレクトされる<br />
と い う 予 測 の 元 提 供 されています。 通 常 の GCC ファイルは isnormal を リダイレクトはしませんが、それを fpclassify<br />
を 使 用 してインプ リ メ ン ト し ます。<br />
math.h を 使 用 した C++<br />
7 つの 関 数 はすべて、 通 常 システム ヘッダー フ ァ イルで 提 供 され、 倍 精 度 で 動 作 し ます。<br />
copysign は 常 に 倍 精 度 の 結 果 を 戻 し ます。 こ れに よ り 、 浮 動 小 数 点 を 戻 さ なければいけない 場 合 、 double-to-float 変 換<br />
ブ ロ ッ ク がハー ド ウ ェ アに 導 入 さ れる ので、 合 成 後 で 予 想 外 の 結 果 になって し ま う こ と があ り ます。<br />
cmath を 使 用 した C++<br />
C99 モード (-std=c99) と 同 様 ですが、 次 の 点 が 異 な り ます。<br />
° システム ヘッダー フ ァ イルは 通 常 異 な り ます。<br />
° 関 数 は、 次 の 場 合 適 切 にオーバーロー ド さ れます。<br />
- float()snan(double)<br />
- isinf(double)<br />
copysign および copysignf は namespace std; を 使 用 した 場 合 でもビル ト イン として 処 理 されます。<br />
cmath および namespace std を 使 用 した C++<br />
問 題 な し。 最 適 な 結 果 と な る ので、 次 の 使 用 をお 勧 め し ます。<br />
• C の 場 合 は -std=c99<br />
• C および C++ の 場 合 は -fno-builtin<br />
検 証 および math 関 数<br />
標 準 C math ライブラリが C ソースで 使 用 さ れる と 、 C シ ミ ュ レーシ ョ ン 結 果 および C/RTL 協 調 シ ミ ュ レーシ ョ ン 結<br />
果 が 異 な り ます。 ソース コードの math 関 数 のいずれかの 精 度 が 正 確 な も の と 異 なってい る 場 合 ( 上 記 の math 関 数 の<br />
表 に 記 述 )、 RTL がシ ミ ュレーシ ョ ンされたと きの 結 果 が 異 な り ます。<br />
hls_math.h ライブラリが C コードに 含 まれる と、 C シミュレーションと RTL 協 調 シ ミ ュ レーシ ョ ンの 結 果 は 同 じ<br />
にな り ます。 ただし、 hls_math.h を 使 用 した C シミュレーションの 結 果 は、 標 準 C ラ イ ブ ラ リ を 使 用 し た 結 果 と<br />
同 じにはなり ません。hls_math.h ラ イ ブ ラ リ を 使 用 する と 、 単 に C シミュレーションが C/RTL 協 調 シ ミ ュ レーシ ョ<br />
ン 結 果 と 一 致 する よ う にな り ます。<br />
ど ち ら の 場 合 も 同 じ RTL イ ンプ リ メ ンテーシ ョ ンが 作 成 さ れます。<br />
高 位 合 成 japan.xilinx.com 228<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
次 では、 math 関 数 を 使 用 し た 場 合 に 検 証 を 実 行 する ために 使 用 する 可 能 性 のあ る オプシ ョ ンについて 説 明 し ます。<br />
検 証 オプシ ョ ン 1 : 標 準 math ラ イ ブ ラ リ および 違 いの 検 証<br />
このオプションでは、 標 準 C math ライブラリがソース コー ド で 使 用 さ れます。 合 成 さ れる 関 数 の 中 に 正 確 な 精 度 が<br />
あ る 場 合 、 C/RTL 協 調 シ ミ ュ レーシ ョ ンが C シ ミ ュ レーシ ョ ン と 異 な り ます。 次 は、 こ の 方 法 を 示 す 例 です。<br />
#include <br />
#include <br />
#include <br />
#include <br />
#include <br />
using namespace std;<br />
typedef float data_t;<br />
data_t cpp_math(data_t angle) {<br />
data_t s = sinf(angle);<br />
data_t c = cosf(angle);<br />
return sqrtf(s*s+c*c);<br />
}<br />
例 2‐8 : 標 準 C math ライブラリの 例<br />
こ の 場 合 、 C シミュレーションと C/RTL 協 調 シ ミ ュ レーシ ョ ン 間 の 結 果 は 異 な り ます。 シ ミ ュ レーシ ョ ン 出 力 を 比 較<br />
する 際 は、 テ ス ト ベンチか ら 書 き 出 さ れる 結 果 がシ ミ ュ レーシ ョ ンの 実 行 さ れる 作 業 デ ィ レ ク ト リ に 保 存 さ れます。<br />
• C シミュレーション ://csim/build フォルダー<br />
• C/RTL 協 調 シ ミ ュ レーシ ョ ン : //sim/ フォルダー<br />
はプロジェ ク ト フォルダー、 はソ リ ューショ ン フ ォルダーの 名 前 、 は 検 証 される RTL の<br />
タイプ (verilog、 vhdl または systemc) にな り ます。 図 2-4 は、 合 成 前 の 結 果 フ ァ イル ( 左 側 ) と 合 成 後 の RTL 結 果 フ ァ<br />
イル ( 右 側 ) の 典 型 的 な 比 較 を 示 し ています。 出 力 は 3 列 目 に 表 示 さ れています。<br />
X-Ref Target - Figure 2-4<br />
図 2‐4: 合 成 前 後 のシ ミ ュ レーシ ョ ンの 違 い<br />
高 位 合 成 japan.xilinx.com 229<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
合 成 前 のシ ミ ュ レーシ ョ ン と 合 成 後 のシ ミ ュ レーシ ョ ン 結 果 は 小 数 点 分 異 な り ます。 こ れら の 小 数 点 部 分 を 最 終 RTL<br />
イ ンプ リ メ ンテーシ ョ ンで 使 用 する かど う かは、 ユーザーが 決 定 する 必 要 があ り ます。<br />
こ れ ら の 違 いを 処 理 する のに 推 奨 さ れる フ ローは、 結 果 をチェ ッ ク し てエ ラーの 許 容 範 囲 内 に 収 ま る かど う かを 確 認<br />
する テ ス ト ベンチを 使 用 する フ ローです。 こ れは、 同 じ 関 数 を 2 バージ ョ ン ( 合 成 用 に 1 つ、 参 照 用 に 1 つ) 作 成 する<br />
と 実 行 で き ます。 こ の 例 の 場 合 、 cpp_math 関 数 のみが 合 成 されます。<br />
#include <br />
#include <br />
#include <br />
#include <br />
#include <br />
using namespace std;<br />
typedef float data_t;<br />
data_t cpp_math(data_t angle) {<br />
data_t s = sinf(angle);<br />
data_t c = cosf(angle);<br />
return sqrtf(s*s+c*c);<br />
}<br />
data_t cpp_math_sw(data_t angle) {<br />
data_t s = sinf(angle);<br />
data_t c = cosf(angle);<br />
return sqrtf(s*s+c*c);<br />
}<br />
デザイ ンを 検 証 する テス ト ベンチでは、 次 の 例 のよ う に diff 変 数 を 使 用 し、 両 方 の 関 数 の 出 力 を 比 較 し てその 違 い<br />
が 判 断 されます。 C シ ミ ュ レーシ ョ ン 中 にはどち らの 関 数 で も 同 じ 出 力 にな り ます。 C/RTL 協 調 シ ミ ュ レーシ ョ ン 中<br />
は、 cpp_math 関 数 で 異 な る 結 果 が 出 力 さ れ、 その 結 果 の 違 いがチェ ッ ク さ れます。<br />
int main() {<br />
data_t angle = 0.01;<br />
data_t output, exp_output, diff;<br />
int retval=0;<br />
for (data_t i = 0; i output) exp_output - output : output - exp_output);<br />
if (diff > 0.0000005) {<br />
printf("Difference %.10f exceeds tolerance at angle %.10f \n", diff, angle);<br />
retval=1;<br />
}<br />
angle = angle + .1;<br />
}<br />
if (retval != 0) {<br />
printf("Test failed !!!\n");<br />
retval=1;<br />
} else {<br />
printf("Test passed !\n");<br />
}<br />
// Return 0 if the test passes<br />
return retval;<br />
高 位 合 成 japan.xilinx.com 230<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
}<br />
違 いの さ が 0.00000005 まで 低 下 さ れた 場 合 、 次 のテ ス ト ベンチで C/RTL 協 調 シ ミ ュ レーシ ョ ン 中 のエラーの 差 が 示<br />
されます。<br />
Difference 0.0000000596 at angle 1.1100001335<br />
Difference 0.0000000596 at angle 1.2100001574<br />
Difference 0.0000000596 at angle 1.5100002289<br />
Difference 0.0000000596 at angle 1.6100002527<br />
etc..<br />
標 準 C math ライブラリ (math.h および cmath.h) を 使 用 する 場 合 、 精 度 の 違 いが 許 容 可 能 かど う かを 検 証 する ための "<br />
スマート" テス トベンチを 作 成 します。<br />
検 証 オプシ ョ ン 2 : HLS math ライブラリおよび 違 いの 確 認<br />
別 の 検 証 オプシ ョ ンは、 ソース コードを HLS math ラ イ ブ ラ リ を 使 用 する よ う に 変 換 する 方 法 です。 こ のオプシ ョ ン<br />
を 使 用 する 場 合 、 C シミュレーションおよび C/RTL 協 調 シ ミ ュ レーシ ョ ン 結 果 間 に 違 いはあ り ません。 次 の 例 では、<br />
上 記 の コー ド を hls_math.h ラ イ ブ ラ リ を 使 用 する よ う に 変 更 し ています。<br />
注 記 :このオプショ ンは、 C++ でのみ 使 用 可 能 です。<br />
• hls_math.h ヘッダー ファイルを 含 めます。<br />
• math 関 数 を 同 等 の hls:: 関 数 に 置 き 換 え ます。<br />
#include <br />
#include "hls_math.h"<br />
#include <br />
#include <br />
#include <br />
#include <br />
using namespace std;<br />
typedef float data_t;<br />
data_t cpp_math(data_t angle) {<br />
data_t s = hls::sinf(angle);<br />
data_t c = hls::cosf(angle);<br />
return hls::sqrtf(s*s+c*c);<br />
}<br />
HLS math ライブラリを 使 用 した C シ ミュレーション 結 果 と 標 準 C math ライブラリを 使 用 して 前 に 取 得 したシミュ<br />
レーシ ョ ン 結 果 間 には 違 いがあ り ます。 これらの 違 いは、 オプシ ョ ン 1 に 類 似 し た "スマート" テス トベンチを 使 用<br />
した C シ ミ ュ レーシ ョ ンで 検 証 する 必 要 があ り ます。<br />
math 関 数 が 多 く あ り 、 コード のア ッ プデー ト が 大 変 な 場 合 は、 3 つ 目 のオプシ ョ ン を 使 用 で き ます。<br />
検 証 オプシ ョ ン 3 : HLS math ライブラリおよび 違 いの 確 認<br />
HLS math ライブラリ ファイル lib_hlsm.cpp をデザイン ファイルとして 含 めると、Vivado HLS では C シミュレー<br />
ションに HLS math ラ イ ブ ラ リ が 使 用 さ れます。 こ のオプシ ョ ンは、 オプシ ョ ン 2 と 同 じですが、 C コー ド を 変 更 す<br />
る 必 要 のない と こ ろが 違 います。<br />
HLS math ライブラリ ファイルは、Vivado HLS インストール ディレク ト リの src ディレク ト リに 含 まれます。 ファイ<br />
ルをローカル フ ォルダーに 単 にコ ピーし て、 フ ァ イルを 標 準 のデザイ ン ファイルとして 追 加 します。<br />
注 記 :このオプショ ンは、 C++ でのみ 使 用 可 能 です。<br />
高 位 合 成 japan.xilinx.com 231<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
HLS math ファイルを 使 用 した C シ ミ ュ レーシ ョ ン 結 果 と こ のフ ァ イルを 追 加 し ないで 前 に 取 得 し たシ ミ ュ レーシ ョ<br />
ン 結 果 間 には 違 いがあ り ます。 これらの 違 いは、 オプシ ョ ン 1 に 類 似 し た "スマート" テス トベンチを 使 用 した C シ<br />
ミ ュ レーシ ョ ンで 検 証 する 必 要 があ り ます。<br />
検 証 オプシ ョ ン 4 : HLS math マ ク ロおよび 違 いの 確 認<br />
最 後 の 検 証 オプシ ョ ンは、ヘ ッ ダー ファイル hls_fpo.h で 定 義 した HLS math マ ク ロ を 使 用 する 方 法 です。ヘ ッ ダー<br />
ファイルは、Vivado HLS インストール ディレク ト リの include ディレク ト リにあります。 このソ リ ューションは、 オ<br />
プシ ョ ン 2 および 3 と 同 様 、 C シ ミ ュ レーシ ョ ン 結 果 で HLS math ラ イ ブ ラ リ が 使 用 さ れる よ う にな り 、 C/RTL 協 調<br />
シ ミ ュ レーシ ョ ンでも 結 果 が 同 じ よ う にな り ますが、 デザイ ンが C++ である 必 要 はあ り ません。<br />
• hls_fpo.h ヘッダー ファイルを 含 めます。<br />
• math 関 数 を 同 等 の HLS_FPO_ マクロに 置 き 換 えます。<br />
固 定 小 数 点 の 数 学 関 数<br />
固 定 小 数 点 の 数 学 関 数 も 提 供 さ れています。 固 定 小 数 点 の イ ンプ リ メ ンテーシ ョ ンは、 float または double 型 で 使 用<br />
されるのと 同 じ hls_math.h ラ イ ブ ラ リ を 使 用 し て 呼 び 出 す こ と がで き ます。 固 定 小 数 点 型 の 場 合 、 関 数 値 の 精 度<br />
は 少 し 落 ちますが、 RTL インプリ メンテーションはより 小 さく 高 速 になります。<br />
固 定 小 数 点 型 の 関 数 は、 float 型 の 変 数 を 使 用 し た 関 数 に 代 わる ものなので、 32 ビッ トの 入 力 と 戻 り 値 に 固 定 されま<br />
す。 整 数 ビ ッ ト 数 は、 32 までの 値 にできます。<br />
HLS math ラ イ ブ ラ リ には、 よ く 使 用 さ れる math 関 数 の 一 部 に 対 し て 固 定 小 数 点 の イ ンプ リ メ ンテーシ ョ ンが 提 供 さ<br />
れています。 こ れ ら の 関 数 を 使 用 する 方 法 は 次 の と お り です。<br />
• 固 定 小 数 点 の イ ンプ リ メ ンテーシ ョ ンがサポー ト さ れる かど う かについては、 表 2-5 を 参 照 して く ださい。<br />
• math 関 数 を ap_fixed 型 を 使 用 し てア ッ プデー ト し ます。<br />
• C シ ミ ュ レーシ ョ ン を 実 行 し て、 デザ イ ンが 必 要 な 精 度 でまだ 動 作 する かど う かを 検 証 し ます。 C シミュレー<br />
ションは、RTL イ ンプ リ メ ンテーシ ョ ン と 同 じ ビ ッ ト 精 度 型 を 使 用 し て 実 行 さ れます。<br />
• デザイ ンを 合 成 し ます。<br />
固 定 小 数 点 の math 関 数 を 使 用 する 場 合 、 入 力 型 に 10 進 数 ポ イ ン ト を 含 め る 必 要 があ り ます ( 符 号 な し の 場 合 は W >=<br />
I、 I >=0、 符 号 付 きの 場 合 I >= 1)。 結 果 の 型 は、 先 頭 ビットの 中 には 0 になる 可 能 性 が 高 いものの、 入 力 と 同 じ 幅 と<br />
整 数 ビ ッ ト にな り ます。<br />
負 の 数 の sqrt() は 0 を 戻 し ます。<br />
よくある 合 成 エラー<br />
次 は math 関 数 を 合 成 する 際 に よ く 発 生 する 使 用 エ ラーです。 こ れ ら は math 関 数 の 合 成 の 利 点 を 生 かすために、 C 関<br />
数 を C++ 関 数 へ 変 換 し た 場 合 に よ く 発 生 し ます。<br />
C++ の cmath.h<br />
C++ の cmath.h ヘッダー フ ァ イルが 使 用 さ れる と 、 浮 動 小 数 点 関 数 (sinf および cosf など) が 使 用 でき ます。 これらは<br />
ハー ド ウ ェ アで 32 ビッ ト 演 算 になります。cmath.h ヘッダー フ ァ イルは 標 準 関 数 (sin、 cos など) もオーバーロードす<br />
るので、 float および double 型 にも 使 用 でき ます。<br />
C の math.h<br />
C の math.h ライブラリが 使 用 される 場 合 は、32 ビ ッ ト の 浮 動 小 数 点 演 算 を 合 成 する ために、 浮 動 小 数 点 関 数 (sinf、<br />
cosf など) が 必 要 です。 すべての 標 準 関 数 呼 び 出 し (sin、 cos など) は 合 成 さ れる と 倍 精 度 および 64 ビ ッ ト の 倍 精 度 演<br />
算 にな り ます。<br />
高 位 合 成 japan.xilinx.com 232<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
注 意<br />
math.h サポー ト の 利 点 を 生 かすために C 関 数 を C++ に 変 換 する 場 合 は、Vivado HLS で 合 成 する 前 に 新 し い C++ コー<br />
ド が 正 し く コ ンパイルされる よ う にする 必 要 があ り ます。 た と えば、 sqrtf() が math.h と 一 緒 にコードで 使 用 される 場<br />
合 は、 それをサポー ト するために 次 のコード を C++ コードに 追 加 する 必 要 があ り ます。<br />
#include <br />
extern “C” float sqrtf(float);<br />
「float および double 型 」 に 示 し た よ う に、 double および float 型 の 混 合 に 関 する 警 告 メ ッ セージに 従 って、 型 変 換 に<br />
よ って 不 必 要 なハー ド ウ ェ アが 作 成 さ れない よ う に し ます。<br />
Vivado HLS の video ライブラリ<br />
video ライブラリには、 ビデオ デザイ ンを C++ で 記 述 する のに 役 立 つ 関 数 が 複 数 含 まれます。 こ のセ ク シ ョ ンでは、<br />
次 の 点 について 説 明 し ます。<br />
• データ 型<br />
• メモリ ライン バッファー<br />
• メモリ ウィンドウ<br />
• ビデオ 関 数<br />
video ライブラリの 使 用<br />
Vivado HLS ビデオ ライブラリには、hls_video.h ヘッダー フ ァ イルを 使 用 する 必 要 があ り ます。 こ のヘ ッ ダー ファイ<br />
ルには、Vivado HLS で 提 供 されるすべてのイ メ ージおよびビデオ プ ロ セス 専 用 のビデオ 型 および 関 数 が 含 まれます。<br />
Vivado HLS video ラ イ ブ ラ リ を 使 用 する 場 合 、 次 の 要 件 も 満 た し てい る 必 要 があ り ます。<br />
デザイ ンが C++ で 記 述 されて hls namespace が 使 用 されている 必 要 があ り ます。<br />
#include <br />
hls::rgb_8 video_data[1920][1080]<br />
ま たは、 次 の よ う にス コープ 付 き 命 名 規 則 を 使 用 で き ますが、 推 奨 さ れる コー ド 記 述 方 法 は、 hls 命 名 規 則 を 使 用 す<br />
る 方 法 です。<br />
#include <br />
using namespace hls;<br />
rgb_8 video_data[1920][1080]<br />
ビデオ データ 型<br />
HLS ビデオ ラ イ ブ ラ リ で 提 供 さ れるデータ 型 を 使 用 する と 、 合 成 で 作 成 さ れる 出 力 RTL がシステムで 使 用 されるザ<br />
イリンクス ビデオ IP ブ ロ ッ ク と ス ムーズに 統 合 で き る よ う にな り ます。<br />
システムでザイ リ ンクス ビデオ IP を 使 用 する 際 は、 IP のデータ シー ト を 参 照 し て、 ビデオ データ の 送 信 ま たは 受 信<br />
に 使 用 する フ ォーマ ッ ト を 決 定 し て く だ さ い。 C コードで 適 切 なビデオ データ 型 を 使 用 する と 、 合 成 で 作 成 さ れる<br />
RTL をザイ リ ンクス ビデオ IP に 接 続 でき ます。<br />
高 位 合 成 japan.xilinx.com 233<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
ラ イブラ リ には、 次 のデータ 型 が 含 まれます。 すべてのデータ 型 で 8 ビッ ト データ のみがサポー ト さ れます。<br />
表 2‐6:ビデオ データ 型<br />
データ 型 名 フ ィ ールド 0 (8 ビット) フィールド 1 (8 ビット) フィールド 2 (8 ビット) フィールド 3 (8 ビット)<br />
yuv422_8 Y UV 使 用 な し 使 用 な し<br />
yuv444_8 Y U V 使 用 な し<br />
rgb_8 G B R 使 用 な し<br />
yuva422_8 Y UV a 使 用 な し<br />
yuva444_8 Y U V a<br />
rgba_8 G B R a<br />
yuva420_8 Y aUV 使 用 な し 使 用 な し<br />
yuvd422_8 U UV D 使 用 な し<br />
yuvd444_8 Y U V D<br />
rgbd_8 G B R D<br />
bayer_8 RGB 使 用 な し 使 用 な し 使 用 な し<br />
luma_8 Y 使 用 な し 使 用 な し 使 用 な し<br />
hls_video.h ライブラリを 含 めたら、データ 型 がソース コードで 自 由 に 使 用 できるようになります。<br />
#include “hls_video.h”<br />
hls::rgb_8 video_data[1920][1080]<br />
メモリ ライン バッファー<br />
LineBuffer クラスは、ユーザーのアルゴリズム コード 内 でラ イン バ ッ フ ァーを 簡 単 に 宣 言 および 管 理 可 能 にする C++<br />
ク ラスです。このクラスには、ライン バ ッ フ ァ を イ ン ス タ ンシエー ト および 操 作 する ために 必 要 な メ ソ ッ ド がすべて<br />
含 まれます。 LineBuffer ク ラ スは、 すべてのデータ 型 で 使 用 で き ます。<br />
LineBuffer ク ラ スの 主 な 機 能 は、 次 の と お り です。<br />
• パ ラ メ ーター 指 定 に よ るすべてのデータ 型 のサポー ト<br />
• ユーザー 定 義 の 行 数 および 列 数<br />
• メ モ リ のバン ド 幅 を 増 加 する ために 行 を 別 々の メ モ リ バン ク へ 自 動 的 にバンキング<br />
• アルゴ リ ズム デザインのライン バッ フ ァーの 使 用 およびデバッグをする メ ソ ッ ドすべてを 提 供<br />
LineBuffer クラスには、 次 のメソッドが 含 まれます。<br />
• shift_up();<br />
• shift_down()<br />
• insert_bottom()<br />
• insert_top()<br />
• getval(row,column)<br />
高 位 合 成 japan.xilinx.com 234<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
LineBuffer の 使 用 方 法 を 説 明 する ため、 次 のデータ セ ッ ト がすべての 例 の 最 初 にあ る と 仮 定 さ れます。<br />
表 2‐7:LineBuffer 例 のデー タ セッ ト<br />
列 0 列 1 列 2 列 3 列 4<br />
行 2 1 2 3 4 5<br />
行 1 6 7 8 9 10<br />
行 0 11 12 13 14 15<br />
ライン バッファーは、LineBuffer データ 型 を 使 用 し てアルゴ リ ズムに イ ン ス タ ンシエー ト で き ます。 次 の 例 では、<br />
上 記 の 表 のデータに 対 し て LineBuffer 変 数 を 指 定 し ています。<br />
// hls::LineBuffer variable;<br />
hls::LineBuffer Buff_A;<br />
LineBuffer クラスでは、 ライン バ ッ フ ァ ーを イ ン ス タ ンシエー ト する ブ ロ ッ ク に 入 力 さ れるデータは、 ラ ス ター 走 査<br />
順 に 並 び 替 え られるので、 新 し いデータ がそれぞれ 前 のデータ と は 別 の 列 に 格 納 さ れます。<br />
新 し い 値 を 挿 入 する 場 合 は、 前 の 有 限 数 値 は 列 に 保 存 さ れた 状 態 のま まで、 その 列 の 行 間 の 垂 直 シフ ト が 必 要 にな り<br />
ます。 シフ ト が 終 了 し た ら、 新 し いデータ 値 は 列 の 最 上 部 ま たは 最 下 部 のいずれかに 挿 入 で き ます。<br />
たとえば、 値 100 をライン バッファー セッ トの 列 2 の 最 上 部 に 挿 入 する には、 次 を 使 用 し ます。<br />
Buff_A.shift_down(2);<br />
Buff_A.insert_top(100,2);<br />
これによ り、 表 2-8 に 示 すよ う な 新 しいデータ セッ トになります。<br />
表 2‐8:shift_down および insert_top を 使 用 した 後 のデータ セッ ト<br />
列 0 列 1 列 2 列 3 列 4<br />
行 2 1 2 100 4 5<br />
行 1 6 7 3 9 10<br />
行 0 11 12 8 14 15<br />
値 100 をライン バッファー セッ ト ( 表 2-7) の 列 2 の 最 下 部 に 挿 入 する には、 次 を 使 用 し ます。<br />
Buff_A.shift_up(2);<br />
Buff_A.insert_bottom(100,2);<br />
これによ り、 表 2-9 に 示 すよ う な 新 しいデータ セッ トになります。<br />
表 2‐9:shift_up および insert_bottom を 使 用 した 後 のデータ セッ ト<br />
列 0 列 1 列 2 列 3 列 4<br />
行 2 1 2 8 4 5<br />
行 1 6 7 13 9 10<br />
行 0 11 12 100 14 15<br />
shift メソッドと insert メ ソ ッ ド のどち ら も 処 理 する 列 の 値 を 必 要 と し ます。<br />
LineBuffer イ ン ス タ ン スで 格 納 さ れた 値 はすべて getval(row,column) メソッドで 取 り 出 すことができます。このメソッ<br />
ドでは、 ライン バ ッ フ ァ ー 内 のどの 位 置 の 値 で も 戻 すこ と がで き ます。 た と えば、 次 の 場 合 、 変 数 Value に 値 9 が 代<br />
入 されます。<br />
Value = Buff_A.getval(1,3);<br />
高 位 合 成 japan.xilinx.com 235<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
メモリ ウィンドウ バッファー<br />
メモリ ウィンドウ C++ クラスを 使 用 すると、2 次 元 の メ モ リ ウ ィ ン ド ウ を 宣 言 および 管 理 で き ます。 こ の ク ラ スの<br />
主 な 機 能 は、 次 の と お り です。<br />
• パ ラ メ ーター 指 定 に よ るすべてのデータ 型 のサポー ト<br />
• ユーザー 定 義 の 行 数 および 列 数<br />
• 最 大 バン ド 幅 のため、 個 別 レ ジ ス ターへの 自 動 パーテ ィ シ ョ ン<br />
• メモリ ウ ィ ン ド ウ を 使 用 およびデバ ッ グする メ ソ ッ ド すべてを 提 供<br />
メモリ ウ ィンドウ クラスは、 次 のメソッドでサポートされます。<br />
• shift_up();<br />
• shift_down()<br />
• shift_left()<br />
• shift_right()<br />
• insert(value,row,column)<br />
• insert_bottom()<br />
• insert_top()<br />
• insert_left()<br />
• insert_right()<br />
• getval(row, column)<br />
メモリ ウ ィ ン ド ウ の 使 用 方 法 を 説 明 する ため、 すべての 例 の 最 初 に 次 のデータ セ ッ ト が 使 用 さ れます。<br />
表 2‐10 : メモリ ウィンドウ 例 のデータ セッ ト<br />
列 0 列 1 列 2<br />
行 2 1 2 3<br />
行 1 6 7 8<br />
行 0 11 12 13<br />
メモリ ウ ィ ン ド ウは、 次 のデータ 型 を 使 用 し てアルゴ リ ズムにイ ン ス タ ンシエー ト でき ます。 次 の 例 では、 上 記 の 表<br />
のデータに 対 し て Window 変 数 を 指 定 し ています。<br />
// hls::Window variable;<br />
hls::Window Buff_B;<br />
Window クラスには、メモリ ウ ィ ン ド ウ 内 に 格 納 さ れたデータ を 上 下 左 右 に 移 動 する メ ソ ッ ド が 含 まれます。 こ れ ら<br />
のシフ ト 操 作 に よ り 、 新 し いデータ 用 に メ モ リ ウ ィ ン ド ウ 内 のスペース を 空 け る こ と がで き ます。<br />
データ セ ッ ト か ら 開 始 し て、 次 のシフ ト が 実 行 さ れた と し ます。<br />
Buff_B.shift_up();<br />
こ れは、 次 の 結 果 にな り ます。<br />
Window Size3x3<br />
Col0 1 2<br />
Row 267 8<br />
Row 1111213<br />
Row 0New dataNew dataNew data<br />
高 位 合 成 japan.xilinx.com 236<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
同 様 に、 表 2-10 のデータ セ ッ ト か ら 開 始 し て、 次 のシフ ト が 実 行 さ れた と し ます。<br />
Buff_B.shift_down();<br />
こ れは、 次 の 結 果 にな り ます。<br />
Window Size3x3<br />
Col 0 1 2<br />
Row 2New dataNew dataNew data<br />
Row 11 2 3<br />
Row 06 7 8<br />
また、 次 を 実 行 したとします。<br />
Buff_B.shift_left();<br />
データ が 左 にシフ ト さ れて、 次 の よ う にな り ます。<br />
Window Size3x3<br />
Col012<br />
Row 223New data<br />
Row 178New data<br />
Row 01213New data<br />
最 後 に 次 を 実 行 し た と し ます。<br />
Buff_B.shift_right();<br />
こ の 結 果 、 次 の よ う にな り ます。<br />
Window Size3x3<br />
Col0 1 2<br />
Row 2New data12<br />
Row 1New data67<br />
Row 0New data1112<br />
Window クラスを 使 用 すると、 メモリ ウ ィ ンド ウ 内 にデータを 挿 入 したり、 データを 取 得 したりできます。 メモリ<br />
ウ ィ ン ド ウ の 境 界 上 にデータ のブ ロ ッ ク 挿 入 をする こ と も で き ます。<br />
データ を メ モ リ ウ ィ ン ド ウ のいずれかの 位 置 に 挿 入 する には、 次 を 使 用 し ます。<br />
insert(value,row,column<br />
たとえば、 値 100 は 次 を 実 行 する と メ モ リ ウ ィンドウの 行 1 列 1 に 挿 入 でき ます。<br />
Buff_B.insert(100,1,1);<br />
こ の 結 果 、 次 の よ う にな り ます。<br />
Window Size3x3<br />
Col012<br />
Row 2123<br />
Row 161008<br />
Row 0111213<br />
ブロック レベルの 挿 入 には、 バウ ンダ リ 上 に 挿 入 するデータ エレ メ ン ト の 配 列 を 指 定 する 必 要 があ り ます。 window<br />
ク ラ スで 提 供 さ れる メ ソ ッ ド は、 次 の と お り です。<br />
• insert_bottom<br />
• insert_top<br />
• insert_left<br />
高 位 合 成 japan.xilinx.com 237<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
• insert_right<br />
たとえば、C が 3 エレ メ ン ト の 配 列 で、 各 配 列 の 値 は 50 で、 メ モ リ ウ ィ ンド ウの 最 下 部 バウンダ リに 値 50 を 挿 入 す<br />
る 場 合 は、 次 の よ う に 指 定 し ます。<br />
char C[3] = {50, 50, 50};<br />
Buff_B.insert_bottom(C);<br />
こ の 結 果 、 次 の よ う にな り ます。<br />
Window Size3x3<br />
Col012<br />
Row 2123<br />
Row 161008<br />
Row 0505050<br />
window クラスのその 他 のエッジ 挿 入 メソッドは、insert_bottom() メ ソ ッ ド と 同 じ よ う に 使 用 で き ます。<br />
メモリ ウ ィ ン ド ウ か らデータ を 取 得 する には、 次 を 使 用 し ます。<br />
getval(row,column)<br />
次 に 例 を 示 し ます。<br />
A = Buff_B.getval(0,1);<br />
これは 次 のよ うになり ます。<br />
A = 50<br />
ビデオ 関 数<br />
HLS のビデオ ライブラリに 含 まれるビデオ プロセッシング 関 数 は、 既 存 の OpenCV 関 数 と 互 換 性 があ り 、 同 じ よ う<br />
に 名 前 が 付 け ら れますが、 既 存 の OpenCV ビデオ ラ イ ブ ラ リ 関 数 を 直 接 置 換 する も のではあ り ません。 ビデオ プロ<br />
セッシング 関 数 では hls::Mat データ 型 が 使 用 さ れます。 こ のデータ 型 に よ り 、 関 数 がハイ パフォーマンス ハー ド ウ ェ<br />
ア と し て 合 成 およびイ ンプ リ メ ンテーシ ョ ンで き る よ う にな り ます。<br />
HLS ビデオ ライブラリには、 次 の 3 つの 関 数 タ イ プが 含 まれます。<br />
• OpenCV インターフェイス 関 数 :AXI4 ストリーミング データ 型 と 標 準 OpenCV データ 型 間 のデータ を 変 換 し ま<br />
す。 こ れ ら の 関 数 を 使 用 する と 、 ソ フ ト ウ ェ アで 実 行 さ れる OpenCV 関 数 と HLS で 作 成 されるハード ウ ェア ブ<br />
ロ ッ ク 間 のデータ 転 送 を AXI4 ストリーミング 関 数 を 介 して 実 行 できるようになります。<br />
• AXI4-Stream 関 数 : こ れ ら の 関 数 は hls::mat データ 型 で 指 定 し たビデオ データ を AXI4 ストリーミング データ<br />
型 に 変 換 する ために 使 用 さ れます。 こ の AXI4 ストリーミング データ 型 は、 高 パフ ォーマン スの イ ン ターフ ェ イ<br />
スが 合 成 さ れる よ う に、 合 成 さ れる 関 数 への 引 数 と し て 使 用 さ れます。<br />
• ビデオ プロセッシング 関 数 :ビデオ イ メ ージを 操 作 する ための 標 準 OpenCV 関 数 と 互 換 性 があ り ます。 こ れ ら の<br />
関 数 では hls::mat データ 型 が 使 用 さ れて、 Vivado HLS で 合 成 されます。<br />
OpenCV インターフェイス 関 数<br />
OpenCV 関 数 を 使 用 し た 典 型 的 なビデオ シ ス テムの 場 合 、OpenCV 関 数 を 使 用 し てほ と んどのアルゴ リ ズムが CPU に<br />
残 ったままにな り ます。 FPGA ファブ リ ッ クでのアクセラレーシ ョ ンが 必 要 なアルゴ リ ズムだけが 合 成 されるので、<br />
Vivado HLS の video 関 数 を 使 用 する よ う にア ッ プデー ト さ れます。<br />
AXI4 ストリーミング プロ ト コルは CPU に 残 ったま まのコード と 合 成 される 関 数 間 のイ ン ターフ ェ イ ス と し て よ く<br />
使 用 さ れる ので、 CPU で 実 行 される OpenCV コード と FPGA フ ァ ブ リ ッ ク で 実 行 さ れる 合 成 済 みハー ド ウ ェ ア 関 数<br />
間 のデータ 転 送 を 可 能 にする ために、 OpenCV 関 数 が 提 供 さ れています。<br />
高 位 合 成 japan.xilinx.com 238<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
データ を 合 成 さ れる 関 数 に 渡 す 前 に 変 換 する ために イ ン ターフ ェ イ ス 関 数 を 使 用 する と 、 ハイ パフォーマンス シス<br />
テムにで き ます。 こ の 関 数 、 た と えば hls::Mat には、 データの 転 送 だけでな く 、 Vivado HLS の video ライブラリ デー<br />
タ 型 と OpenCV データ 形 式 間 を 変 換 する 機 能 が 含 まれます。<br />
OpenCV 関 数 を 使 用 する には、 ヘ ッ ダー ファイル hls_opencv.h を 含 め る 必 要 があ り ます。 こ れら の 関 数 は、 CPU に<br />
残 ったコードで 使 用 されます。<br />
AXI4‐Stream 関 数<br />
AXI4 Stream 関 数 は、 合 成 さ れる 関 数 のデータ を 転 送 する ために 使 用 さ れます。 合 成 さ れる ビデオ 関 数 では、 画 像 に<br />
hls::Mat データ 型 が 使 用 さ れます。<br />
次 に 説 明 する AXI4-Stream I/O 関 数 を 使 用 する と 、 hls::Mat データ 型 と OpenCV インターフェイス 関 数 で 使 用 される<br />
AXI4-Stream データ 型 (hls::stream) を 変 換 できます。<br />
ビデオ プロセッシング 関 数<br />
Vivado HLS ビデオ ライブラリに 含 まれるビデオ プロセッシング 関 数 は、ビデオ イ メ ージを 操 作 する ための も のです。<br />
こ れ ら のほ と んどの 関 数 が 同 じ よ う な 使 用 方 法 の 該 当 する OpenCV 関 数 を 促 進 する よ う に 設 計 さ れています。<br />
ビデオ 関 数 の 使 用<br />
次 の 例 は、 3 種 類 のビデオ 関 数 がそれぞれどの よ う に 使 用 する か 示 し ています。 下 記 のテ ス ト ベンチでは、 次 の よ う<br />
なフローになり ます。<br />
• データ は 標 準 OpenCV 画 像 データ と し て 開 始 さ れます。<br />
• これが OpenCV イ ン ターフ ェ イ ス 関 数 の 1 つを 使 用 して AXI4-Stream 形 式 に 変 換 さ れます。<br />
• 合 成 では 関 数 への 入 力 および 出 力 に AXI4-Stream 形 式 が 使 用 さ れます。<br />
• 最 後 に、 データ が 標 準 OpenCV 形 式 データ に 変 換 し 戻 さ れます。<br />
このプロセスによ り、 標 準 OpenCV 関 数 ( 多 くのソフト ウェア アプ リ ケーシ ョ ンで 使 用 ) を 使 用 して 動 作 する よ う に<br />
で き ます。 テ ス ト ベンチは、 次 を 使 用 する と CPU で 実 行 でき ます。<br />
#include "hls_video.h"<br />
int main (int argc, char** argv) {<br />
// Load data in OpenCV image format<br />
IplImage* src = cvLoadImage(INPUT_IMAGE);<br />
IplImage* dst = cvCreateImage(cvGetSize(src), src->depth, src->nChannels);<br />
AXI_STREAM src_axi, dst_axi;<br />
// Convert OpenCV format to AXI4 Stream format<br />
IplImage2AXIvideo(src, src_axi);<br />
// Call the function to be synthesized<br />
image_filter(src_axi, dst_axi, src->height, src->width);<br />
// Convert the AXI4 Stream data to OpenCV format<br />
AXIvideo2IplImage(dst_axi, dst);<br />
// Standard OpenCV image functions<br />
cvSaveImage(OUTPUT_IMAGE, dst);<br />
opencv_image_filter(src, dst);<br />
cvSaveImage(OUTPUT_IMAGE_GOLDEN, dst);<br />
cvReleaseImage(&src);<br />
cvReleaseImage(&dst);<br />
char tempbuf[2000];<br />
高 位 合 成 japan.xilinx.com 239<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
sprintf(tempbuf, "diff --brief -w %s %s", OUTPUT_IMAGE, OUTPUT_IMAGE_GOLDEN);<br />
int ret = system(tempbuf);<br />
if (ret != 0) {<br />
printf("Test Failed!\n");<br />
ret = 1;<br />
} else {<br />
printf("Test Passed!\n");<br />
}<br />
return ret;<br />
}<br />
合 成 さ れる 関 数 image_filter は、 次 に 示 し ます。 この 関 数 の 特 徴 は 次 の と お り です。<br />
• 入 力 データ 型 は AXI4-Stream 形 式 のデータ です。<br />
• AXI4-Stream 形 式 のデータ は AXI4-Stream 関 数 を 使 用 し て hls::mat 形 式 に 変 換 さ れます。<br />
• ビデオ 処 理 関 数 ( 同 等 の OpenCV 関 数 と 同 じ 方 法 で 名 前 が 付 け られる) では、 画 像 が 処 理 さ れ、 高 品 質 の FPGA イ<br />
ンプ リ メ ンテーシ ョ ンに 合 成 されます。<br />
• データ は AXI4-Stream 形 式 に 変 換 し 戻 されて、 出 力 されます。<br />
#include "hls_video.h"<br />
typedef hls::stream<br />
AXI_STREAM;<br />
typedef hls::Scalar<br />
RGB_PIXEL;<br />
typedef hls::Mat RGB_IMAGE;<br />
void image_filter(AXI_STREAM& INPUT_STREAM, AXI_STREAM& OUTPUT_STREAM, int rows, int<br />
cols) {<br />
//Create AXI streaming interfaces for the core<br />
RGB_IMAGE img_0(rows, cols);<br />
RGB_IMAGE img_1(rows, cols);<br />
RGB_IMAGE img_2(rows, cols);<br />
RGB_IMAGE img_3(rows, cols);<br />
RGB_IMAGE img_4(rows, cols);<br />
RGB_IMAGE img_5(rows, cols);<br />
RGB_PIXEL pix(50, 50, 50);<br />
// Convert AXI4 Stream data to hls::mat format<br />
hls::AXIvideo2Mat(INPUT_STREAM, img_0);<br />
// Execute the video pipelines<br />
hls::Sobel(img_0, img_1);<br />
hls::SubS(img_1, pix, img_2);<br />
hls::Scale(img_2, img_3, 2, 0);<br />
hls::Erode(img_3, img_4);<br />
hls::Dilate(img_4, img_5);<br />
// Convert the hls::mat format to AXI4 Stream format<br />
hls::Mat2AXIvideo(img_5, OUTPUT_STREAM);<br />
}<br />
3 つのすべての 種 類 の 関 数 を 使 用 する こ と で、 FPGA にビデオ 関 数 に イ ンプ リ メ ン ト で き、 合 成 用 に 最 適 化 さ れる ビ<br />
デオ 関 数 と OpenCV 関 数 間 のデータ と、 テス ト ベンチに 残 るデータ (CPU で 実 行 ) 間 のス ムース なデータ 転 送 が 維 持<br />
できます。<br />
高 位 合 成 japan.xilinx.com 240<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
次 の 表 には、 HLS ビデオ ラ イブラ リ で 提 供 される 関 数 についてま と めています。<br />
表 2‐11 : HLS ビデオ ライブラリ<br />
関 数 のタ イ プ 関 数 精 度 (ULP)<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
OpenCV インター<br />
フェイス<br />
AXIvideo2cvMat<br />
AXIvideo2CvMat<br />
AXIvideo2IplImage<br />
cvMat2AXIvideo<br />
AXI ビデオ ストリーム (hls::stream) 形 式 か ら<br />
データ を OpenCV の cv::Mat 形 式 に 変 換<br />
AXI ビデオ ストリーム (hls::stream) 形 式 か ら<br />
データ を OpenCVの CvMat 形 式 に 変 換<br />
AXI ビデオ ストリーム (hls::stream) 形 式 か ら<br />
データ を OpenCV の IplImage 形 式 に 変 換<br />
OpenCV の cv::Mat 形 式 か ら のデータ を AXI ビ<br />
デオ ス トリーム (hls::stream) 形 式 に 変 換<br />
CvMat2AXIvideo OpenCV の CvMat 形 式 か ら のデータ を AXI ビ<br />
デオ ス トリーム (hls::stream) 形 式 に 変 換<br />
cvMat2hlsMat<br />
CvMat2hlsMat<br />
OpenCV の cv::Mat 形 式 か ら のデータ を hls::Mat<br />
形 式 に 変 換<br />
OpenCV の CvMat 形 式 か ら のデータ を hls::Mat<br />
形 式 に 変 換<br />
CvMat2hlsWindow OpenCV の CvMat 形 式 か ら のデータ を<br />
hls::Window 形 式 に 変 換<br />
hlsMat2cvMat<br />
hlsMat2CvMat<br />
hls::Mat 形 式 か ら のデータ を OpenCV の cv::Mat<br />
形 式 に 変 換<br />
hls::Mat 形 式 か ら のデータ を OpenCV の CvMat<br />
形 式 に 変 換<br />
hlsMat2IplImage hls::Mat 形 式 か ら のデータ を OpenCV の<br />
IplImage 形 式 に 変 換<br />
hlsWindow2CvMat<br />
IplImage2AXIvideo<br />
hls::Window 形 式 か ら のデータ を OpenCV の<br />
CvMat 形 式 に 変 換<br />
OpenCV の IplImage 形 式 か ら のデータ を AXI ビ<br />
デオ ス トリーム (hls::stream) 形 式 に 変 換<br />
IplImage2hlsMat OpenCV の IplImage 形 式 か ら のデータ を<br />
hls::Mat 形 式 に 変 換<br />
AXI4-Stream AXIvideo2Mat hls::Mat 形 式 と し て 格 納 さ れた 画 像 データ を<br />
AXI4 ビデオ ストリーム 形 式 (hls::stream) に 変<br />
換<br />
AXI4-Stream Mat2AXIvideo AXI4 ビデオ ストリーム (hls::stream) 形 式 で 格<br />
納 されたイ メージ データ を hls::Mat 形 式 の 画 像<br />
に 変 換<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
AbsDiff<br />
AddS<br />
AddWeighted<br />
And<br />
2 つの 入 力 画 像 、 src1 および src2 間 の 絶 対 的 な<br />
違 いを 計 算 し て、 結 果 を dst に 保 存<br />
エレ メン ト ごとの 画 像 src およびスカラー scl<br />
の 合 計 を 計 算<br />
2 つの 画 像 src1 と src2 の 重 み 付 き のエレ メ ン ト<br />
ごとに 合 計 を 計 算<br />
2 つの 画 像 、 src1 および src2 のビ ッ ト の 論 理 積<br />
をエレ メ ン ト ごとに 計 算 します。<br />
高 位 合 成 japan.xilinx.com 241<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
表 2‐11 : HLS ビデオ ライブラリ<br />
関 数 のタ イ プ 関 数 精 度 (ULP)<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
Avg<br />
AvgSdv<br />
Cmp<br />
CmpS<br />
CornerHarris<br />
CvtColor<br />
Dilate<br />
Duplicate<br />
EqualizeHist<br />
Erode<br />
画 像 src のエレ メ ン ト の 平 均 を 計 算<br />
画 像 src のエレ メ ン ト の 平 均 を 計 算<br />
2 つの 入 力 画 像 、 src1 と src2 のエレ メ ン ト ご と<br />
の 比 較 を 実 行<br />
入 力 画 像 src のエレ メ ン ト と 入 力 値 の 比 較 を 実<br />
行 し、 結 果 を dst に 保 存<br />
この 関 数 は、 Harris エッジ/コーナー 検 出 器 を イ<br />
ンプリ メ ン ト<br />
カ ラー 画 像 と グ レース ケール 画 像 を 変 換<br />
カーネル 内 で 構 築 された 指 定 された 構 造 エレ<br />
メ ン ト を 使 用 し て 画 像 src を 拡 張<br />
入 力 画 像 src を 2 つの 出 力 画 像 dst1 と dst2 にコ<br />
ピーし、 2 つのデータ パスの 分 岐 点 に 使 用<br />
各 フレームの ヒ ス ト グラムを 計 算 し、 次 のフ<br />
レームの 範 囲 を 正 規 化 する ために 使 用<br />
カーネル 内 で 構 築 された 指 定 された 構 造 エレ<br />
メ ン ト を 使 用 し て 画 像 src を 削 減<br />
FASTX FAST コーナー 検 出 器 を イ ンプ リ メ ン ト し、<br />
コーナーの masuk または 座 標 の 配 列 を 生 成 し<br />
ます。<br />
Filter2D<br />
GaussianBlur<br />
Harris<br />
HoughLines2<br />
Integral<br />
InitUndistortRectifyMap<br />
Max<br />
MaxS<br />
Mean<br />
Merge<br />
指 定 し たカーネルを 使 用 し て 任 意 線 形 フ ィ ル<br />
ターを 画 像 src に 適 用<br />
正 規 化 さ れた 2D Gaussian Blur フィルターを 入<br />
力 に 適 用<br />
Harris エッジまたはコーナー 検 出 器 をインプリ<br />
メント<br />
ハフ ラインの 変 換 をインプリ メント<br />
積 分 画 像 の 計 算 を イ ンプ リ メ ン ト<br />
パラ メーターのセッ トに 基 づいて map1 および<br />
map2 を 生 成 (map1 および map2 は hls::Remap()<br />
に 最 適 な 入 力 )<br />
2 つの 入 力 画 像 、 src1 および src2 のエレ メ ン ト<br />
ご との 最 大 を 計 算 して、 結 果 を dst に 保 存<br />
入 力 画 像 src のエレ メ ン ト と 入 力 値 の 最 大 を 計<br />
算 し、 結 果 を dst に 保 存<br />
画 像 src のエレ メ ン ト の 平 均 を 計 算 し、 結 果 の<br />
スカラーの 最 初 のチャネル 値 を 戻 す<br />
複 数 のシングルチャネル 画 像 から マルチチャ<br />
ネル 画 像 dst を 作 成<br />
高 位 合 成 japan.xilinx.com 242<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
表 2‐11 : HLS ビデオ ライブラリ<br />
関 数 のタ イ プ 関 数 精 度 (ULP)<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
ビデオ プロセッ<br />
シング<br />
最 小 値<br />
MinMaxLoc<br />
MinS<br />
2 つの 入 力 画 像 、 src1 および src2 のエレ メ ン ト<br />
ご との 最 小 を 計 算 して、 結 果 を dst に 保 存<br />
グ ローバル 最 小 値 および 最 大 値 と 、 入 力 画 像 src<br />
でのそれ ら の 位 置 を 検 出<br />
入 力 画 像 src のエレ メ ン ト と 入 力 値 の 最 小 を 計<br />
算 し、 結 果 を dst に 保 存<br />
Mul 2 つの 入 力 画 像 、 src1 と src2 のエレ メ ン ト ご と<br />
の 積 を 計 算<br />
Not<br />
PaintMask<br />
Range<br />
Remap<br />
Reduce<br />
画 像 src のエレ メ ン ト ご と のビ ッ ト 反 転 を 実 行<br />
デスティネーシ ョ ン 画 像 の 各 ピクセルを color<br />
(mask が 0 でない 場 合 ) ま たは 入 力 画 像 か ら の<br />
該 当 ピ ク セルのいずれかに 設 定<br />
次 の 規 則 を 使 用 し て 画 像 src のすべての 値 を 設<br />
定 し て、 結 果 を 画 像 dst として 戻 す<br />
指 定 し た リ マ ッ プに 従 って ソース 画 像 src をデ<br />
スティネーショ ン 画 像 dst にリマップ<br />
2D イメージ src を dim ( 次 元 ) と 共 にベクター<br />
dst まで 削 減<br />
Resize 入 力 画 像 を 双 線 補 間 を 使 用 し て 出 力 イ メ ージ<br />
のサイズに 変 更<br />
セッ ト<br />
Scale<br />
Sobel<br />
Split<br />
SubRS<br />
SubS<br />
Sum<br />
Threshold<br />
画 像 src のエレ メ ン ト を 任 意 のスカラー 値 scl<br />
に 設 定<br />
入 力 画 像 src をオプシ ョ ンの 線 形 変 換 を 使 用 し<br />
て 変 換<br />
水 平 ま たは 垂 直 方 向 の Sobel フィルターを 計 測<br />
し、 水 平 ま たは 垂 直 方 向 の 導 関 数 を 戻 す<br />
複 数 のシングルチャ ネル 画 像 か ら のマルチ<br />
チャネル 画 像 src を 分 割<br />
スカラー 値 scl と 画 像 src 間 の 違 いを 計 算<br />
画 像 src とスカラー 値 scl のエレ メ ン ト 間 の 違<br />
いを 計 算<br />
画 像 のエレ メ ン ト を 合 計 を 計 算<br />
シングルチャネル 画 像 の 各 エレ メン トに 対 し<br />
て 固 定 レベルのし きい 値 を 実 行<br />
0 画 像 src のエレ メ ン ト を 0 に 設 定<br />
上 記 の 例 に 示 すよ う に、 ビデオ 関 数 は OpenCV 関 数 に 直 接 置 き 換 わ る も のではあ り ません。 ビデオ 関 数 では、 入 力 お<br />
よび 出 力 配 列 を 使 用 し てデータ が 処 理 さ れます。 通 常 はテンプレー ト パラ メーターが 使 用 されます。<br />
HLS ビデオ ラ イ ブ ラ リ の 関 数 すべての 説 明 については、 「 高 位 合 成 リ フ ァ レ ン ス ガイド」 を 参 照 して く ださい。<br />
高 位 合 成 japan.xilinx.com 243<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
パフ ォーマンスのためのビデオ 関 数 の 最 適 化<br />
HLS ビデオ 関 数 は、 前 も って コ ンパイル さ れてお り 、 高 品 質 高 パフ ォーマン スの イ ンプ リ メ ンテーシ ョ ンにな る よ う<br />
になっています。 関 数 には、 各 ク ロ ッ ク ご と に 1 サンプルのレー ト でデータ を 処 理 する のに 必 要 な 最 適 化 指 示 子 が 既<br />
に 含 まれています。<br />
ビデオ 関 数 の 正 確 なパフ ォーマン ス 測 定 は、 ク ロ ッ ク レート と ターゲッ ト デバイ ス 仕 様 に よ って 異 な り ます。 合 成<br />
後 に 達 成 さ れる 最 終 的 なパフ ォーマン スに 関 する 詳 細 は、 合 成 レポー ト を 参 照 し て く だ さ い。<br />
次 の 例 は 前 の 例 を 繰 り 返 し た も のですが、 完 全 に 高 パフ ォーマン スのデザ イ ン を 達 成 する ために 必 要 な 最 適 化 のみに<br />
焦 点 を あてています。<br />
• 関 数 は 既 にパイ プ ラ イ ン さ れてい る ので、 DATAFLOW 最 適 化 を 追 加 する と 、 パイ プ ラ イ ン 関 数 が 並 列 で 実 行 さ<br />
れるよ うになり ます。<br />
• こ の 例 の 場 合 、データ 型 は hls::stream なので、 自 動 的 に 深 さ 1 の FIFO としてインプリメントされます。 デー<br />
タフロー メモリ チャ ネルのサ イ ズを 制 御 する ために config_dataflow コンフィギュレーションを 使 用 する<br />
必 要 はあ り ません。<br />
• AXI4-Stream インターフェイス (axis) を 使 用 し て 入 力 ポー ト および 出 力 ポー ト を イ ンプ リ メ ン ト する と 、 高 パ<br />
フォーマンスのスト リーミング インターフェイスになります。<br />
• オプシ ョ ンで、AXI4 Slave Lite インターフェイスを 使 用 してブロック レベルのプロ ト コルをインプ リ メ ン トする<br />
と 、 合 成 済 みブ ロ ッ ク が CPU か ら 制 御 で き る よ う にな り ます。<br />
#include "hls_video.h"<br />
typedef hls::stream<br />
AXI_STREAM;<br />
typedef hls::Scalar<br />
RGB_PIXEL;<br />
typedef hls::Mat RGB_IMAGE;<br />
void image_filter(AXI_STREAM& INPUT_STREAM, AXI_STREAM& OUTPUT_STREAM, int rows, int<br />
cols) {<br />
#pragma HLS INTERFACE axis port=INPUT_STREAM<br />
#pragma HLS INTERFACE axis port=OUTPUT_STREAM<br />
#pragma HLS dataflow<br />
//Create AXI streaming interfaces for the core<br />
RGB_IMAGE img_0(rows, cols);<br />
RGB_IMAGE img_1(rows, cols);<br />
RGB_IMAGE img_2(rows, cols);<br />
RGB_IMAGE img_3(rows, cols);<br />
RGB_IMAGE img_4(rows, cols);<br />
RGB_IMAGE img_5(rows, cols);<br />
RGB_PIXEL pix(50, 50, 50);<br />
// Convert AXI4 Stream data to hls::mat format<br />
hls::AXIvideo2Mat(INPUT_STREAM, img_0);<br />
// Execute the video pipelines<br />
hls::Sobel(img_0, img_1);<br />
hls::SubS(img_1, pix, img_2);<br />
hls::Scale(img_2, img_3, 2, 0);<br />
hls::Erode(img_3, img_4);<br />
hls::Dilate(img_4, img_5);<br />
// Convert the hls::mat format to AXI4 Stream format<br />
hls::Mat2AXIvideo(img_5, OUTPUT_STREAM);<br />
}<br />
高 位 合 成 japan.xilinx.com 244<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
HLS IP ライブラリ<br />
Vivado HLS には、 多 く のザイ リ ン ク ス IP ブロックをインプリ メン トするための C ライブラリが 提 供 されています。<br />
この C ラ イ ブ ラ リ を 使 用 する と 、 次 のザ イ リ ン ク ス IP ブロックが C ソース コー ド か ら 直 接 推 論 で き、 FPGA で 高 品<br />
質 のイ ンプ リ メ ンテーシ ョ ンになる よ う にな り ます。<br />
表 2‐12 : HLS IP ライブラリ<br />
ライブラリ ヘッダー ファ<br />
イル<br />
hls_fft.h<br />
hls_fft.h<br />
ap_shift_reg.h<br />
説 明<br />
ザイ リ ンクス FFT IP LogiCore を C でシ ミ ュレーシ ョ ン、ザイ リ ンク ス LogiCore<br />
ブロックを 使 用 してインプリ メン ト 可 能<br />
ザイ リ ンクス FIR IP LogiCore を C でシ ミ ュレーシ ョ ン、ザイ リ ンク ス LogiCore<br />
ブロックを 使 用 してインプリ メン ト 可 能<br />
ザイ リ ンクス SRL プリ ミティブを 使 用 して 直 接 インプリ メントされるシフト<br />
レジスタをインプリ メン トするための C++ クラスを 提 供<br />
FFT IP ライブラリ<br />
ザイ リ ンクス FFT ブロックは、hls_fft.h ラ イ ブ ラ リ を 使 用 する と C デザ イ ン 内 で 呼 び 出 すこ と がで き ます。 こ の<br />
IP については、 ザ イ リ ン ク スの 資 料 、『LogiCORE IP Fast Fourier Transform 製 品 ガ イ ド (AXI)』 (PG109) を 参 照 して く<br />
ださい。 このセクショ ンでは、 FFT を C++ コードでコンフ ィギュレーシ ョ ンする 方 法 について 説 明 します。<br />
重 要 : IP をその 多 く の 機 能 を 使 用 し て イ ンプ リ メ ン ト する 方 法 については、 『LogiCORE IP Fast Fourier Transform 製 品<br />
ガイド (AXI)』 (PG109)を 参 照 して く ださい。 本 書 では、 Vivado HLS を 使 用 して C モデルを 使 用 およびイ ンプ リ メ ン<br />
ト する 方 法 について 説 明 し ています。<br />
次 は、 C++ コードで FFT を 使 用 する 5 つの 手 順 です。<br />
• コードに hls_fft.h ライブラリを 含 める<br />
• 定 義 済 みの struct である hls::ip_fft::params_t を 使 用 し てデフ ォル ト のパ ラ メ ーターを 設 定 する<br />
• ランタイム コ ン フ ィ ギ ュ レーシ ョ ン を 定 義 する<br />
• FFT 関 数 を 呼 び 出 す<br />
• ランタイム ステータスをチェックする (オプシ ョ ン)<br />
次 の コー ド 例 は、 こ れ ら の 各 手 順 を ま と めて 実 行 し た も のです。 各 手 順 については、 詳 細 を 後 でそれぞれ 説 明 し ます。<br />
まず、 ソース コードに FFT ライブラリを 含 めます。このヘッダー ファイルは、Vivado HLS のインス トール ディレク<br />
トリの include ディレク ト リに 含 まれます (こ のデ ィ レ ク ト リ はシ ミ ュ レーシ ョ ンおよび 合 成 中 に 自 動 的 に 検 索 さ れ<br />
ます)。<br />
#include "hls_fft.h"<br />
FFT の static パ ラ メ ーターを 定 義 し ます。 こ れには、 ダ イ ナ ミ ッ ク には 変 更 し ない 入 力 幅 、 チ ャ ネル 数 、 アーキテ ク<br />
チャ タイプなどが 含 まれます。FFT ライブラリには、パラメーターを 指 定 した struct の hls::ip_fft::params_t<br />
が 含 まれ、 すべての static パ ラ メ ーターがデフ ォル ト 値 で 初 期 化 で き る よ う になっています。<br />
高 位 合 成 japan.xilinx.com 245<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
こ の 例 の 場 合 、 出 力 順 序 のデフ ォル ト 値 、 およびコ ン フ ィ ギ ュ レーシ ョ ン ポー ト と ステータ ス ポー ト の 幅 が、 定 義<br />
済 み struct に 基 づいて、 ユーザー 定 義 の struct である param1 を 使 用 して 上 書 き されています。<br />
struct param1 : hls::ip_fft::params_t {<br />
static const unsigned ordering_opt = hls::ip_fft::natural_order;<br />
static const unsigned config_width = FFT_CONFIG_WIDTH;<br />
static const unsigned status_width = FFT_STATUS_WIDTH;<br />
};<br />
ランタイム コンフィギュレーションとランタイム ス テータ ス 両 方 のデータ 型 と 変 数 を 定 義 し ます。 こ れら の 値 はダ<br />
イナ ミ ッ ク にで き る ので、 変 更 可 能 で API からアクセスされる C コードの 変 数 と して 定 義 されます。<br />
typedef hls::ip_fft::config_t config_t;<br />
typedef hls::ip_fft::status_t status_t;<br />
config_t fft_config1;<br />
status_t fft_status1;<br />
次 に、 • ランタイム コンフィギュレーションを 設 定 します。 この 例 では、direction 変 数 の 値 に 基 づいて FFT ( 前 方 向 ま<br />
たは 逆 方 向 ) が 設 定 されるほか、 スケー リ ング スケジュールの 値 も 設 定 されています。<br />
fft_config1->setDir(direction);<br />
fft_config1->setSch(0x2AB);<br />
HLS namespace と 定 義 済 み static コンフィギュレーション ( この 例 では param1) を 使 用 して FFT 関 数 を 呼 び 出 し ます。<br />
関 数 のパ ラ メ ーターは、 順 に、 入 力 データ、 出 力 データ、 出 力 ス テータ ス、 入 力 コ ン フ ィ ギ ュ レーシ ョ ン を 示 し てい<br />
ます。<br />
hls::fft (xn1, xk1, &fft_status1, &fft_config1);<br />
最 後 に 出 力 ステータ ス をチェ ッ ク し ます。 この 例 では、 オーバーフ ロー フ ラ グがチェ ッ ク さ れて、 結 果 が ovflo 変 数<br />
に 格 納 されます。<br />
*ovflo = fft_status1->getOvflo();<br />
FFT C ラ イ ブ ラ リ を 使 用 し たデザ イ ン 例 は、[Help] → [Welcome] → [Open Example Project] → [Design Examples] → [FFT]<br />
をク リ ックして 表 示 される Vivado HLS のサンプルに 含 まれます。<br />
FFT の static パラ メーター<br />
FFT の static パラ メーターでは、 FFT のコンフィギュレーシ ョ ン 方 法 のほか、 FFT のサイズなどの 固 定 パラ メーター<br />
(サイズがダイナミ ックに 変 更 可 能 かどうか、 インプリ メンテーションがパイプライン 処 理 されるか radix_4_burst_io<br />
が 使 用 されるか) が 指 定 されます。<br />
hls_fft.h ヘッダー ファイルでは static パ ラ メ ーターのデフ ォル ト 値 の 設 定 に 使 用 可 能 な<br />
hls::ip_fft::params_t という struct が 定 義 さ れています。 デフ ォル ト 値 が 使 用 さ れる 場 合 、 パ ラ メ ーター 指 定<br />
された struct を FFT 関 数 と 一 緒 に 直 接 使 用 で き ます。<br />
hls::fft<br />
(xn1, xk1, &fft_status1, &fft_config1);<br />
こ れは、 パ ラ メ ーターの 一 部 をデフ ォル ト 値 以 外 の 値 に 変 更 する ために も よ く 使 用 さ れます。 こ れは、 デフ ォル ト の<br />
パ ラ メ ーター 指 定 さ れた struct に 基 づいて 新 し いユーザー 定 義 のパ ラ メ ーター 指 定 さ れた struct が 作 成 さ れ、 一 部 の<br />
デフォルト 値 が 変 更 されるこ とで 実 行 されます。<br />
次 の 例 では、 新 しいユーザー struct の my_fft_config が 新 し い 出 力 順 序 の 値 (natural_order に 変 更 ) と 共 に 定 義 され<br />
ています。 FFT に 対 する その 他 すべての static パラ メーターでは、 デフォルト 値 が 使 用 されます ( 表 2-14)。<br />
struct my_fft_config : hls::ip_fft::params_t {<br />
static const unsigned ordering_opt = hls::ip_fft::natural_order;<br />
};<br />
高 位 合 成 japan.xilinx.com 246<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
hls::fft<br />
(xn1, xk1, &fft_status1, &fft_config1);<br />
パ ラ メ ーター 指 定 struct の hls::ip_fft::params_t については、 表 2-13 を 参 照 して ください。パラ メーターのデ<br />
フ ォル ト 値 および 使 用 可 能 な 値 の リ ス ト については、 表 2-14 を 参 照 して く ださい。<br />
パラ メ ーターおよびその 設 定 の 詳 細 については、ザイ リ ン ク ス 資 料 の『LogiCORE IP Fast Fourier Transform v9.0 Product<br />
Guide (AXI)』 (PG109) を 参 照 して ください。<br />
表 2‐13 : FTT の struct パラ メーター<br />
パラ メーター<br />
説 明<br />
input_width<br />
output_width<br />
status_width<br />
config_width<br />
max_nfft<br />
has_nfft<br />
channels<br />
arch_opt<br />
phase_factor_width<br />
ordering_opt<br />
ovflo<br />
scaling_opt<br />
rounding_opt<br />
mem_data<br />
mem_phase_factors<br />
mem_reorder<br />
stages_block_ram<br />
mem_hybrid<br />
データ 入 力 ポー ト 幅<br />
データ 出 力 ポー ト 幅<br />
出 力 ス テータ ス ポー ト 幅<br />
入 力 コ ン フ ィ ギ ュ レーシ ョ ン ポー ト 幅<br />
FFT データ セッ トのサイズを 1
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
表 2‐14 : FTT の struct パラ メーターの 値 ( 続 き)<br />
output_width unsigned 16 input_width ~ (input_width +<br />
max_nfft + 1)<br />
status_width unsigned 8 FFT コンフィギュレーションに<br />
よって 異 なる<br />
config_width unsigned 16 FFT コンフィギュレーションに<br />
よって 異 なる<br />
max_nfft unsigned 10 3-16<br />
has_nfft bool false True、 False<br />
channels unsigned 1 1-12<br />
arch_opt unsigned pipelined_streaming_io automatically_select<br />
pipelined_streaming_io<br />
radix_4_burst_io<br />
radix_2_burst_io<br />
radix_2_lite_burst_io<br />
phase_factor_width unsigned 16 8-34<br />
ordering_opt unsigned bit_reversed_order bit_reversed_order<br />
natural_order<br />
ovflo bool true false<br />
true<br />
scaling_opt unsigned scaled scaled<br />
unscaled<br />
block_floating_point<br />
rounding_opt unsigned truncation truncation<br />
convergent_rounding<br />
mem_data unsigned block_ram block_ram<br />
distributed_ram<br />
mem_phase_factors unsigned block_ram block_ram<br />
distributed_ram<br />
mem_reorder unsigned block_ram block_ram<br />
distributed_ram<br />
stages_block_ram unsigned (max_nfft < 10) 0 :<br />
(max_nfft - 9)<br />
0-11<br />
mem_hybrid bool false false<br />
true<br />
complex_mult_type unsigned use_mults_resources use_luts<br />
use_mults_resources<br />
use_mults_performance<br />
butterfly_type unsigned use_luts use_luts<br />
use_xtremedsp_slices<br />
FFT IP の 機 能 について 表 2-14 に 記 載 さ れていない も のは 現 時 点 では Vivado HLS インプリ メンテーションでサポー<br />
トされていません。<br />
高 位 合 成 japan.xilinx.com 248<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
FFT のランタイム コンフィギュレーションとランタイム ステータス<br />
FFT では、 コンフ ィ ギュ レーシ ョ ン ポー ト と ステータ ス ポー ト を 介 したモニタ リ ングによ り 、 ラ ン タ イ ム コンフィ<br />
ギュレーションとランタイム ステータスがサポートされます。これらのポートは FFT 関 数 への 引 数 と し て 定 義 さ れ、<br />
次 の 例 では fft_status1 および fft_config1 変 数 と し て 記 載 さ れています。<br />
hls::fft (xn1, xk1, &fft_status1, &fft_config1);<br />
ランタイム コンフィギュレーションとランタイム ステータスは、 FFT の C ラ イ ブ ラ リ か ら 定 義 済 み struct を 使 用 し<br />
てアクセスできます。<br />
• hls::ip_fft::config_t<br />
• hls::ip_fft::status_t<br />
注 記 : どちらの 場 合 も、 struct には static パ ラ メ ーター 指 定 struct が 必 要 で、 例 では param1 として 記 載 されています。<br />
static パラ メ ーター 指 定 の struct の 詳 細 は、 前 のセ ク シ ョ ンを 参 照 し て く ださい。<br />
ランタイム コンフィギュレーションの struct を 使 用 する と 、 C コー ド で 次 を 実 行 で き ます。<br />
• ランタイム コンフィギュレーションがイネーブルの 場 合 は、 FFT 長 を 設 定<br />
• FFT の 方 向 を 前 方 向 ま たは 逆 方 向 に 設 定<br />
• スケーリング スケジュールを 設 定<br />
FFT 長 は、 次 の よ う に 設 定 で き ます。<br />
typedef hls::ip_fft::config_t config_t;<br />
config_t fft_config1;<br />
// Set FFT length to 512 => log2(512) =>9<br />
fft_config1-> setNfft(9);<br />
FFT の 方 向 は、 次 の よ う に 設 定 で き ます。<br />
typedef hls::ip_fft::config_t config_t;<br />
config_t fft_config1;<br />
// Forward FFT<br />
fft_config1->setDir(1);<br />
// Inverse FFT<br />
fft_config1->setDir(0);<br />
FFT のスケーリ ング スケジュールは、 次 のよ うに 設 定 できます。<br />
typedef hls::ip_fft::config_t config_t;<br />
config_t fft_config1;<br />
fft_config1->setSch(0x2AB);<br />
出 力 ス テータ ス ポー ト には 定 義 済 み struct を 使 用 し てア ク セスで き、 次 が 判 断 さ れます。<br />
• FFT 中 にオーバーフ ローが 発 生 し たかど う か<br />
• ブ ロ ッ ク の 指 数 値<br />
FFT オーバーフ ロー モード は、 次 のよ う にチェ ッ ク でき ます。<br />
typedef hls::ip_fft::status_t status_t;<br />
status_t fft_status1;<br />
// Check the overflow flag<br />
bool *ovflo = fft_status1->getOvflo();<br />
ブ ロ ッ ク の 指 数 値 は、 次 を 使 用 する と 取 得 で き ます。<br />
typedef hls::ip_fft::status_t status_t;<br />
高 位 合 成 japan.xilinx.com 249<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
status_t fft_status1;<br />
// Obtain the block exponent<br />
unsigned int *blk_exp = fft_status1-> getBlkExp();<br />
FFT 関 数 の 使 用<br />
FFT 関 数 は、 Vivado HLS の namespace で 定 義 さ れ、 次 の よ う に 呼 び 出 すこ と がで き ます。<br />
hls::fft (<br />
INPUT_DATA_ARRAY,<br />
OUTPUT_DATA_ARRAY,<br />
OUTPUT_STATUS,<br />
INPUT_RUN_TIME_CONFIGURATIOn);<br />
STATIC_PARAM は、 「FFT の static パラ メーター」 セクショ ンで 説 明 した static パ ラ メ ーター 指 定 の struct で、 FFT の<br />
static パラ メーターを 定 義 します。<br />
入 力 データ も 出 力 データ も 配 列 (INPUT_DATA_ARRAY および OUTPUT_DATA_ARRAY) と して 関 数 に 提 供 されます。 最<br />
終 的 な イ ンプ リ メ ンテーシ ョ ンでは、 FFT RTL ブロッ クのポートは AXI4-Stream ポー ト と してイ ンプ リ メ ン ト されま<br />
す。 データ フ ロー 最 適 化 (set_directive_dataflow) を 使 用 し た 領 域 では、 配 列 がス ト リ ー ミ ング 配 列 と し て イ<br />
ンプ リ メ ン ト されるので、 常 に FFT 関 数 を 使 用 する こ と をお 勧 め し ます。 ま たは、 ど ち ら の 配 列 も<br />
set_directive_stream コマンドを 使 用 してス ト リーミ ングと して 指 定 します。<br />
重 要 : FFT は、 パイ プ ラ イ ン さ れた 領 域 では 使 用 で き ません。 高 度 なパフ ォーマン スの 演 算 が 必 要 な 場 合 、 FFT の 前<br />
後 でループま たは 関 数 をパイ プ ラ ン し て、 その 領 域 のループおよび 関 数 すべてでデータ フ ロー 最 適 化 を 使 用 し ます。<br />
配 列 のデータ 型 は、 float または ap_fixed のいずれかにでき ます。<br />
重 要 : 浮 動 小 数 点 データ 型 を 使 用 する 場 合 は、 変 数 を static 修 飾 子 を 使 用 して 定 義 しておく 必 要 があ り ます。<br />
typedef float data_t;<br />
static complex xn[FFT_LENGTH];<br />
static complex xk[FFT_LENGTH];<br />
固 定 小 数 点 データ 型 を 使 用 する 場 合 は、 Vivado HLS 任 意 精 度 型 の ap_fixed を 使 用 する 必 要 があ り ます。<br />
#include "ap_fixed.h"<br />
typedef ap_fixed data_in_t;<br />
typedef ap_fixed data_out_t;<br />
#include <br />
typedef std::complex cmpxData;<br />
typedef std::complex cmpxDataOut;<br />
どちらの 場 合 も FFT には 同 じ 正 しいデータ サ イ ズでパラ メ ーターを 付 け る 必 要 があ り ます。 浮 動 小 数 点 データ 型 の<br />
場 合 、 データ 幅 は 常 に 32 ビ ッ ト で、 その 他 のサ イ ズを 指 定 し て も 無 効 と 判 断 さ れます。<br />
ヒント : FFT の 入 力 および 出 力 幅 は、 サポー ト さ れる 範 囲 内 の 任 意 の 値 に コ ン フ ィ ギ ュ レーシ ョ ンで き ます。 入 力 お<br />
よび 出 力 パ ラ メ ーターに 接 続 さ れる 変 数 は、 8 ビ ッ ト の イ ンプ リ メ ン ト で 定 義 さ れる 必 要 があ り ます。 た と えば、 出<br />
力 幅 が 33 ビ ッ ト と し て コ ン フ ィ ギ ュ レーシ ョ ン さ れる 場 合 は、 出 力 変 数 は 40 ビ ッ ト 変 数 と し て 定 義 する 必 要 があ り<br />
ます。<br />
FFT のマルチチャ ネル 機 能 は、 入 力 データ と 出 力 データ の 2 次 元 配 列 を 使 用 する と 使 用 で き ます。 こ の 場 合 、 配 列<br />
データ は 最 初 に 次 元 が 書 く チャ ネルを、 2 つ 目 の 次 元 が FFT データ を 表 すよ う に コ ン フ ィ ギ ュ レーシ ョ ン さ れる 必 要<br />
があ り ます。<br />
typedef float data_t;<br />
static complex xn[CHANNEL][FFT_LENGTH];<br />
static complex xk[CHANELL][FFT_LENGTH];<br />
高 位 合 成 japan.xilinx.com 250<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
OUTPUT_STATUS および INPUT_RUN_TIME_CONFIGURATION は、 「FFT ランタイム コンフィギュレーション」 の<br />
セ ク シ ョ ンで 説 明 さ れた struct です。<br />
注 記 :FFT を 使 用 したデザインは、 HDL (Verilog または VHDL) を 使 用 してしか 検 証 できません。 SystemC RTL を 使 用<br />
した RTL 協 調 シ ミ ュ レーシ ョ ンは、 FFT を 使 用 したデザインではサポー ト されません。<br />
FFT C ラ イ ブ ラ リ を 使 用 し たデザ イ ン 例 は、[Help] → [Welcome] → [Open Example Project] → [Design Examples] → [FFT]<br />
をク リ ックして 表 示 される Vivado HLS のサンプルに 含 まれます。<br />
FIR フ ィルター IP ライブラリ<br />
ザイ リ ンクス FIR ブロックは、hls_fir.h ラ イ ブ ラ リ を 使 用 する と C++ デザ イ ン 内 で 呼 び 出 すこ と がで き ます。 こ<br />
の IP については、 ザ イ リ ン ク ス の 資 料 、 『LogiCORE IP FIR Compiler v7.1』 (PG149) を 参 照 して く ださい。 このセク<br />
ションでは、FIR を C++ コードでコンフ ィギュレーシ ョ ンする 方 法 について 説 明 します。<br />
重 要 : IP をその 多 く の 機 能 を 使 用 し て イ ンプ リ メ ン ト する 方 法 については、『LogiCORE IP FIR Compiler v7.1』 (PG149)<br />
を 参 照 し て く だ さ い。 本 書 では、 Vivado HLS を 使 用 して C モデルを 使 用 およびイ ンプ リ メ ン ト する 方 法 について 説<br />
明 しています。<br />
次 は、 C++ コードで FIR を 使 用 する 4 つの 手 順 です。<br />
• コードに hls_fir.h ライブラリを 含 める<br />
• 定 義 済 みの struct である hls::ip_fir::params_t を 使 用 してデフォルトのパラ メーターを 設 定 する<br />
• FIR 関 数 を 呼 び 出 す<br />
• ラ ン タ イ ム 入 力 コ ン フ ィ ギ ュ レーシ ョ ン を 定 義 する (オプシ ョ ン)<br />
次 の コー ド 例 は、 こ れ ら の 各 手 順 を ま と めて 実 行 し た も のです。 各 手 順 については、 詳 細 を 後 でそれぞれ 説 明 し ます。<br />
まず、 ソース コードに FIR ライブラリを 含 めます。ヘッダー ファイルは、Vivado HLS インストール ディレク ト リの<br />
include ディレク ト リにあります。 このファイルは、 Vivado HLS を 実 行 する と 自 動 的 に 検 索 さ れます。 Vivado HLS 内<br />
で コ ンパイルする 場 合 は、 こ のデ ィ レ ク ト リ へのパス を 指 定 する 必 要 はあ り ません。<br />
#include "hls_fir.h"<br />
FIR の static パラ メ ーターを 定 義 し ます。 こ れには、 入 力 幅 、 係 数 、 フ ィ ルター レート (single、 decimation、 hilbert) な<br />
どの static 属 性 が 含 まれます。 FIR ラ イ ブ ラ リ には、 パ ラ メ ーター 指 定 struct の hls::ip_fir::params_t が 含 ま<br />
れ、 すべての static パラ メーターがデフォルト 値 で 初 期 化 できるよ うになっています。<br />
次 の 例 では、 係 数 が coeff_vec 配 列 にあ る と 定 義 さ れ、 定 義 済 み struct に 基 づいたユーザー 定 義 の myconfig とい<br />
う struct を 使 用 し て、その 係 数 の 数 のデフ ォル ト 値 、 入 力 幅 および 量 子 化 (quantization) モー ド が 上 書 き さ れています。<br />
struct myconfig : hls::ip_fir::params_t {<br />
static const double coeff_vec[sg_fir_srrc_coeffs_len];<br />
static const unsigned num_coeffs = sg_fir_srrc_coeffs_len;<br />
static const unsigned input_width = INPUT_WIDTH;<br />
static const unsigned quantization = hls::ip_fir::quantize_only;<br />
};<br />
HLS namespace と 定 義 済 み static パラ メーター (この 例 では myconfig) を 使 用 して FIR 関 数 の イ ン ス タ ン ス を 作 成 し<br />
てから、 run メ ソ ッ ド で 関 数 を 呼 び 出 し てを 呼 び 出 し て、 関 数 を 実 行 し ます。 時 間 数 の 引 数 は、 順 に、 入 力 データ、<br />
出 力 データ です。<br />
static hls::FIR fir1;<br />
fir1.run(fir_in, fir_out);<br />
オプシ ョ ンで、 ラ ン タ イ ム 入 力 コ ン フ ィ ギ ュ レーシ ョ ン を 使 用 する こ と がで き ます。 FIR のモード の 中 には、 この 入<br />
力 のデータ に よ って イ ン ター リ ーブ さ れたチ ャ ネル 中 や 係 数 リ ロー ド が 必 要 になった 場 合 に 係 数 の 使 用 方 法 が 異 な<br />
る こ と があ り ます。 こ の コ ン フ ィ ギ ュ レーシ ョ ンはダ イナ ミ ッ ク にで き る ので、 変 数 と し て 定 義 さ れます。 こ の 入 力<br />
高 位 合 成 japan.xilinx.com 251<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
コ ンフ ィ ギ ュ レーシ ョ ンに 必 要 なモード の 詳 細 については、 ザイ リ ン ク ス 資 料 の 『LogiCORE IP FIR Compiler v7.1』<br />
(PG149) を 参 照 して ください。<br />
ランタイム 入 力 コンフィギュレーションが 使 用 される 場 合 、 FIR 関 数 は 入 力 データ、 出 力 データ、 および 入 力 コ ン<br />
フィギュレーションの 3 つの 引 数 を 使 用 し て 呼 び 出 さ れます。<br />
// Define the configuration type<br />
typedef ap_uint config_t;<br />
// Define the configuration variable<br />
config_t fir_config = 8;<br />
// Use the configuration in the FFT<br />
static hls::FIR fir1;<br />
fir1.run(fir_in, fir_out, &fir_config);<br />
FIR C ラ イ ブ ラ リ を 使 用 し たデザ イ ン 例 は、[Help] → [Welcome] → [Open Example Project] → [Design Examples] → [FIR]<br />
をク リ ックして 表 示 される Vivado HLS のサンプルに 含 まれます。<br />
FIR の static パラ メーター<br />
FIR の static パラ メーターでは、FIR IP のパラ メ ーターが 指 定 さ れ、 入 力 幅 と 出 力 幅 、 小 数 ビ ッ ト 、 係 数 値 、 イ ン ター<br />
ポレーショ ン レート、およびデシメーシ ョ ン レー ト などのダ イナ ミ ッ ク でないもが 指 定 される 方 法 が 定 義 されます。<br />
これらのコ ンフ ィ ギ ュ レーシ ョ ンのほ と んどにデフ ォル ト 値 があ り ますが、 係 数 にはデフ ォル ト 値 はあ り ません。<br />
hls_fir.h ヘッダー ファイルではほとんどの static パ ラ メ ーターのデフ ォル ト 値 の 設 定 に 使 用 可 能 な<br />
hls::ip_fir::params_t という struct が 定 義 されています。<br />
重 要 : 係 数 にはデフ ォル ト 値 は 定 義 さ れません。 こ のため、 FIR を 直 接 初 期 化 する ために 定 義 済 みの struct を 使 用 す<br />
るのはお 勧 めし ません。 static パ ラ メ ーター 指 定 を 実 行 する には、 係 数 を 指 定 する 新 し いユーザー 定 義 の struct を 常 に<br />
使 用 する 必 要 があ り ます。<br />
次 の 例 では、 新 しいユーザー struct の my_config が 新 し い 係 数 値 を 使 用 し て 定 義 さ れています。 係 数 は 配 列<br />
coeff_vec 内 にあ る と 指 定 されています。 FIR に 対 する その 他 すべてのパ ラ メ ーターでは、 デフ ォル ト 値 が 使 用 さ<br />
れます ( 表 2-16)。<br />
struct myconfig : hls::ip_fir::params_t {<br />
static const double coeff_vec[sg_fir_srrc_coeffs_len];<br />
};<br />
static hls::FIR fir1;<br />
fir1.run(fir_in, fir_out);<br />
パ ラ メ ーター 指 定 struct の hls::ip_fir::params_t に 使 用 されるパラ メ ーターについては、 表 2-15 を 参 照 して く<br />
だ さ い。 パ ラ メ ーターのデフ ォル ト 値 および 使 用 可 能 な 値 の リ ス ト については、 表 2-16 を 参 照 して く ださい。<br />
パラ メ ーターおよびその 設 定 の 詳 細 については、 ザイ リ ン ク ス 資 料 の 『LogiCORE IP FIR Compiler v7.1』 (PG149) を 参<br />
照 してください。<br />
表 2‐15 : FIR の struct パラ メーター<br />
パラ メーター<br />
説 明<br />
input_width<br />
input_fractional_bits<br />
output_width<br />
output_fractional_bits<br />
coeff_width<br />
データ 入 力 ポー ト 幅<br />
入 力 ポー ト の 小 数 ビ ッ ト の 数<br />
データ 出 力 ポー ト 幅<br />
出 力 ポー ト の 小 数 ビ ッ ト の 数<br />
係 数 のビ ッ ト 幅<br />
高 位 合 成 japan.xilinx.com 252<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
表 2‐15 : FIR の struct パラ メーター ( 続 き)<br />
coeff_fractional_bits<br />
num_coeffs<br />
coeff_sets<br />
input_length<br />
output_length<br />
num_channels<br />
total_number_coeff<br />
coeff_vec[total_num_co<br />
eff]<br />
filter_type<br />
rate_change<br />
interp_rate<br />
decim_rate<br />
zero_pack_factor<br />
rate_specification<br />
hardware_oversampling<br />
_rate<br />
sample_period<br />
sample_frequency<br />
quantization<br />
best_precision<br />
coeff_structure<br />
output_rounding_mode<br />
filter_arch<br />
optimization_goal<br />
inter_column_pipe_leng<br />
th<br />
column_config<br />
config_method<br />
coeff_padding<br />
係 数 の 小 数 ビ ッ ト の 数<br />
係 数 の 数<br />
係 数 セ ッ ト の 数<br />
入 力 データ のサンプル 数<br />
出 力 データ のサンプル 数<br />
処 理 さ れるデータ のチャ ネル 数 を 指 定<br />
係 数 の 総 数<br />
係 数 配 列<br />
フィルターに 使 用 されるフィルター タイプをインプリ メント<br />
整 数 ま たは 小 数 レー ト の 変 更 を 指 定<br />
インターポレーション レート<br />
デシ メーシ ョ ン レート<br />
インターポレーションで 使 用 される 係 数 0 の 数<br />
レー ト を 周 波 数 ま たは 周 期 と し て 指 定<br />
オーバーサンプ リ ングのレー ト を 指 定<br />
ハー ド ウ ェ アのオーバーサンプ リ ング 周 期<br />
ハー ド ウ ェ アのオーバーサンプ リ ング 周 波 数<br />
使 用 さ れる 量 子 化 方 法<br />
最 適 な 精 度 を イ ネーブルま たはデ ィ スエーブル<br />
使 用 する 係 数 構 造 の タ イ プ<br />
出 力 で 使 用 さ れる 丸 めの タ イ プ<br />
シ ス ト リ ッ ク ま たは 転 置 型 アーキテ ク チャ を 選 択<br />
最 適 化 目 標 を 速 度 ま たはエ リ アに 指 定<br />
DSP 列 間 に 必 要 なパイ プ ラ イ ン 長<br />
DSP48 列 数 を 指 定<br />
DSP48 列 のコ ンフ ィ ギュ レーシ ョ ン 方 法 を 指 定<br />
フィルターの 先 頭 に 追 加 される 0 パデ ィ ングの 数<br />
整 数 ま たはブール 型 ではないパ ラ メ ーター 値 を 指 定 する 際 は、 Vivado HLS の FIR namespace を 使 用 する 必 要 があ り ま<br />
す。<br />
たとえば、 rate_change に 使 用 可 能 な 値 は 表 2-16 に integer および fixed_fractional と 記 述 されています。<br />
C プログラムでは rate_change = hls::ip_fir::integer および rate_change =<br />
hls::ip_fir::fixed_fractional を 使 用 する 必 要 があ り ます。<br />
表 2‐16 : FIR の struct パラ メーターの 値<br />
パラ メーター C タイプ デフォルト 値 有 効 な 値<br />
input_width unsigned 16 制 限 な し<br />
高 位 合 成 japan.xilinx.com 253<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
表 2‐16 : FIR の struct パラ メーターの 値 ( 続 き)<br />
input_fractional_bits unsigned 0 input_width のサイズによ り 制 限<br />
output_width unsigned 24 制 限 な し<br />
output_fractional_bits unsigned 0 output_width のサイズによ り 制 限<br />
coeff_width unsigned 16 制 限 な し<br />
coeff_fractional_bits unsigned 0 coeff_width のサイズによ り 制 限<br />
num_coeffs bool 21 フル<br />
coeff_sets unsigned 1 1-1024<br />
input_length unsigned 21 制 限 な し<br />
output_length unsigned 21 制 限 な し<br />
num_channels unsigned 1 1-1024<br />
total_number_coeff unsigned 21 num_coeffs * coeff_sets<br />
coeff_vec[total_num_co<br />
eff]<br />
double array なし 該 当 なし<br />
filter_type unsigned single_rate single_rate、 interpolation、 decimation、<br />
hibert、 interpolated<br />
rate_change unsigned integer integer、 fixed_fractional<br />
interp_rate unsigned 1 2-1024<br />
decim_rate unsigned 1 2-1024<br />
zero_pack_factor unsigned 1 2-8<br />
rate_specification unsigned period frequency、 period<br />
hardware_oversampling<br />
_rate<br />
unsigned 1 制 限 な し<br />
sample_period bool 1 制 限 な し<br />
sample_frequency unsigned 0.001 制 限 な し<br />
quantization unsigned integer_coefficients integer_coefficients、 quantize_only、<br />
maximize_dynamic_range<br />
best_precision unsigned false false<br />
true<br />
coeff_structure unsigned non_synmetric inferred、 non_symmetric、 symmetric、<br />
negative_symmetric、 half_band、 hilbert<br />
output_rounding_mode unsigned full_precision full_precision、 truncate_lsbs、<br />
non_symmetric_rounding_down、<br />
non_symmetric_rounding_up、<br />
symmetric_rounding_to_zero、<br />
symmetric_rounding_to_infinity、<br />
convergent_rounding_to_even、<br />
convergent_rounding_to_odd<br />
filter_arch unsigned systolic_multiply_accumu<br />
late<br />
systolic_multiply_accumulate、<br />
transpose_multiply_accumulate<br />
optimization_goal unsigned area area、 speed<br />
inter_column_pipe_leng<br />
th<br />
unsigned 4 1-16<br />
高 位 合 成 japan.xilinx.com 254<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
表 2‐16 : FIR の struct パラ メーターの 値 ( 続 き)<br />
column_config unsigned 1 使 用 さ れる DSP48 の 数 によ って 制 限<br />
config_method unsigned single single、 by_channel<br />
coeff_padding bool false false<br />
true<br />
FIR IP の 機 能 について 表 2-16 に 記 載 さ れていない も のは 現 時 点 では Vivado HLS インプリ メンテーションでサポート<br />
されていません。<br />
FIR 関 数 の 使 用<br />
FIR 関 数 は、 Vivado HLS の namespace で 定 義 さ れ、 次 の よ う に 呼 び 出 すこ と がで き ます。<br />
// Create an instance of the FIR<br />
static hls::FIR fir1;<br />
// Execute the FIR instance fir1<br />
fir1.run(INPUT_DATA_ARRAY, OUTPUT_DATA_ARRAY);<br />
STATIC_PARAM は、 「FIR の static パラ メーター」 セクショ ンで 説 明 した static パ ラ メ ーター 指 定 の struct で、 FIR の<br />
static パラ メーターを 定 義 します。<br />
入 力 データ も 出 力 データ も 配 列 (INPUT_DATA_ARRAY および OUTPUT_DATA_ARRAY) と し て 関 数 に 提 供 さ れます。<br />
最 終 的 な イ ンプ リ メ ンテーシ ョ ンでは、 FIRT IP のこれらのポートは AXI4-Stream ポー ト と してイ ンプ リ メ ン ト され<br />
ます。 データ フ ロー 最 適 化 (set_directive_dataflow) を 使 用 し た 領 域 では、 配 列 がス ト リ ー ミ ング 配 列 と し て<br />
インプリ メント されるので、 常 に FIR 関 数 を 使 用 する こ と をお 勧 め し ます。 ま たは、 ど ち ら の 配 列 も<br />
set_directive_stream コマンドを 使 用 してス ト リーミ ングと して 指 定 します。<br />
重 要 : FIR は、 パイプラ イ ン された 領 域 では 使 用 でき ません。 高 度 なパフ ォーマンスの 演 算 が 必 要 な 場 合 、 FIR の 前<br />
後 でループま たは 関 数 をパイ プ ラ ン し て、 その 領 域 のループおよび 関 数 すべてでデータ フ ロー 最 適 化 を 使 用 し ます。<br />
FIR のマルチチ ャ ネル 機 能 は、 シン グル 入 力 およびシン グル 出 力 配 列 のデータ を イ ン ター リ ーブする こ と でサポー ト<br />
されます。<br />
• 入 力 配 列 のサ イ ズは、 すべてのサンプル (num_channels * input_length) に 十 分 な 大 き さ であ る 必 要 があ り ます。<br />
• 出 力 配 列 のサ イ ズは、 すべての 出 力 サンプル (num_channels * output_length) を 含 め る よ う に 指 定 する 必 要 があ り<br />
ます。<br />
次 のコード 例 は、 2 チャ ネルで、 データ がどの よ う に イ ン ター リ ーブ さ れる かを 示 し ています。 こ の 例 では、 最 上 位<br />
関 数 に 入 力 データ のチ ャ ネルが 2 つ (din_i、 din_q) および 出 力 データのチャネルが 2 つ (dout_i、 dout_q) 含 ま<br />
れています。 2 つの 関 数 がフ ロ ン ト エン ド (fe) とバックエンド (be) で FIR 入 力 配 列 のデータ を 正 し く 並 べて、 FIR 出<br />
力 配 列 か ら それを 抽 出 する ために 使 用 さ れています。<br />
void dummy_fe(din_t din_i[LENGTH], din_t din_q[LENGTH], din_t out[FIR_LENGTH]) {<br />
for (unsigned i = 0; i < LENGTH; ++i) {<br />
out[2*i] = din_i[i];<br />
out[2*i + 1] = din_q[i];<br />
}<br />
}<br />
void dummy_be(dout_t in[FIR_LENGTH], dout_t dout_i[LENGTH], dout_t dout_q[LENGTH]) {<br />
for(unsigned i = 0; i < LENGTH; ++i) {<br />
dout_i[i] = in[2*i];<br />
dout_q[i] = in[2*i+1];<br />
}<br />
}<br />
void fir_top(din_t din_i[LENGTH], din_t din_q[LENGTH],<br />
dout_t dout_i[LENGTH], dout_t dout_q[LENGTH]) {<br />
高 位 合 成 japan.xilinx.com 255<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
din_t fir_in[FIR_LENGTH];<br />
dout_t fir_out[FIR_LENGTH];<br />
static hls::FIR fir1;<br />
}<br />
dummy_fe(din_i, din_q, fir_in);<br />
fir1.run(fir_in, fir_out);<br />
dummy_be(fir_out, dout_i, dout_q);<br />
注 記 : FIR を 使 用 したデザインは、 HDL (Verilog または VHDL) を 使 用 してしか 検 証 できません。 SystemC RTL を 使 用<br />
した RTL 協 調 シ ミ ュ レーシ ョ ンは、 FIT を 使 用 したデザインではサポー ト されません。<br />
オプシ ョ ンの FIR ランタイム コンフィギュレーション<br />
演 算 モー ド に よ っては、 係 数 の 使 用 方 法 を コ ン フ ィ ギ ュ レーシ ョ ンする ため、 FIR に 別 の 入 力 が 必 要 な こ と も あ り ま<br />
す。 こ の 入 力 コ ン フ ィ ギ ュ レーシ ョ ンに 必 要 なモー ド の 詳 細 については、 ザ イ リ ン ク ス 資 料 の 『LogiCORE IP FIR<br />
Compiler v7.1』 (PG149) を 参 照 して ください。<br />
こ の 入 力 コ ン フ ィ ギ ュ レーシ ョ ンは、 標 準 8 ビット データ 型 の ap_int.h を 使 用 して C コードで 実 行 できます。 この 例<br />
では、 fir_top.h ヘッダー ファイルで FIR と ap_fixed ラ イブラ リ の 使 用 が 指 定 され、 多 く のデザイ ン パラ メー<br />
ター 値 が 定 義 さ れた 後 、 それら に 基 づいて 固 定 小 数 点 型 がい く つか 定 義 さ れています。<br />
#include "ap_fixed.h"<br />
#include "hls_fir.h"<br />
const unsigned FIR_LENGTH = 21;<br />
const unsigned INPUT_WIDTH = 16;<br />
const unsigned INPUT_FRACTIONAL_BITS = 0;<br />
const unsigned OUTPUT_WIDTH = 24;<br />
const unsigned OUTPUT_FRACTIONAL_BITS = 0;<br />
const unsigned COEFF_WIDTH = 16;<br />
const unsigned COEFF_FRACTIONAL_BITS = 0;<br />
const unsigned COEFF_NUM = 7;<br />
const unsigned COEFF_SETS = 3;<br />
const unsigned INPUT_LENGTH = FIR_LENGTH;<br />
const unsigned OUTPUT_LENGTH = FIR_LENGTH;<br />
const unsigned CHAN_NUM = 1;<br />
typedef ap_fixed s_data_t;<br />
typedef ap_fixed m_data_t;<br />
typedef ap_uint config_t;<br />
最 上 位 コー ド には、 ヘ ッ ダー ファイルの 情 報 が 含 まれ、 C コード と FIR コ ン フ ィ ギ ュ レーシ ョ ンが 一 致 する よ う に、<br />
ビ ッ ト 幅 を 指 定 するのに 使 用 したのと 同 じ 定 数 値 を 使 用 して static パラ メーターで 指 定 された struct 構 造 体 が 作 成 さ<br />
れ、 係 数 が 指 定 さ れます。 最 上 位 では、ヘ ッ ダー ファイルで 8 ビット データ と し て 定 義 さ れた 入 力 コ ン フ ィ ギ ュ レー<br />
ションが FIR に 渡 されます。<br />
#include "fir_top.h"<br />
struct param1 : hls::ip_fir::params_t {<br />
static const double coeff_vec[total_num_coeff];<br />
static const unsigned input_length = INPUT_LENGTH;<br />
static const unsigned output_length = OUTPUT_LENGTH;<br />
static const unsigned num_coeffs = COEFF_NUM;<br />
static const unsigned num_coeffs = COEFF_NUM;<br />
};<br />
const double param1::coeff_vec[total_num_coeff] =<br />
{6,0,-4,-3,5,6,-6,-13,7,44,64,44,7,-13,-6,6,5,-3,-4,0,6};<br />
高 位 合 成 japan.xilinx.com 256<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
void dummy_fe(s_data_t in[INPUT_LENGTH], s_data_t out[INPUT_LENGTH],<br />
config_t* config_in, config_t* config_out)<br />
{<br />
*config_out = *config_in;<br />
for(unsigned i = 0; i < INPUT_LENGTH; ++i)<br />
out[i] = in[i];<br />
}<br />
void dummy_be(m_data_t in[OUTPUT_LENGTH], m_data_t out[OUTPUT_LENGTH])<br />
{<br />
for(unsigned i = 0; i < OUTPUT_LENGTH; ++i)<br />
out[i] = in[i];<br />
}<br />
// DUT<br />
void fir_top(s_data_t in[INPUT_LENGTH],<br />
m_data_t out[OUTPUT_LENGTH],<br />
config_t* config)<br />
{<br />
s_data_t fir_in[INPUT_LENGTH];<br />
m_data_t fir_out[OUTPUT_LENGTH];<br />
config_t fir_config;<br />
// Create struct for config<br />
static hls::FIR fir1;<br />
//==================================================<br />
// Dataflow process<br />
dummy_fe(in, fir_in, config, &fir_config);<br />
fir1.run(fir_in, fir_out, &fir_config);<br />
dummy_be(fir_out, out);<br />
//==================================================<br />
}<br />
FIR C ラ イ ブ ラ リ を 使 用 し たデザ イ ン 例 は、[Help] → [Welcome] → [Open Example Project] → [Design Examples] → [FIR]<br />
をク リ ックして 表 示 される Vivado HLS のサンプルに 含 まれます。<br />
SRL IP ライブラリ<br />
C コー ド は、 再 利 用 、 読 みやすさ、 パフ ォーマン ス などの 複 数 の 要 件 を 満 たすよ う に 記 述 さ れます。 現 時 点 では、 C<br />
コー ド は 高 位 合 成 後 に 最 適 なハー ド ウ ェ アが 得 ら れる よ う に 記 述 さ れていません。<br />
ただ し、 再 利 用 、 読 みやすさ、 パフ ォーマン ス 要 件 と 同 様 に、 特 定 の コー ド 記 述 方 法 ま たはあ ら か じ め 定 義 さ れた コ<br />
ン ス ト ラ ク ト を 使 用 する こ と に よ り 、 合 成 結 果 が よ り 適 切 なハー ド ウ ェ アにな る よ う に、 ま たはアルゴ リ ズム を よ り<br />
簡 単 に 検 証 し て C でハー ド ウ ェ ア を よ り 適 切 に 記 述 で き る よ う で き ます。<br />
SRL リ ソースへの 直 接 マ ッ プ<br />
多 くの C アルゴ リ ズムでは、 データ を 配 列 内 で 順 次 シ フ ト し ます。 配 列 の 開 始 に 新 し い 値 を 追 加 し、 既 存 のデータ を<br />
配 列 内 でシフ ト し、 最 も 古 いデータ 値 は 破 棄 さ れます。 こ の 操 作 は、 ハー ド ウ ェ アではシフ ト レジスタと してインプ<br />
リメントされます。<br />
C からシフ ト レ ジ ス タ を イ ンプ リ メ ン ト する 場 合 、 配 列 を 個 々のエレ メ ン ト に 完 全 にパーテ ィ シ ョ ン し、RTL 内 のエ<br />
レ メ ン ト 間 のデータ 依 存 性 か ら シフ ト レジスタを 暗 示 させるのが 最 も 一 般 的 です。<br />
高 位 合 成 japan.xilinx.com 257<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
論 理 合 成 では、 通 常 RTL シフ ト レジスタがシフ ト レ ジ ス タ を 効 率 的 に イ ンプ リ メ ン ト するザイ リ ン ク ス SRL リソー<br />
スに イ ンプ リ メ ン ト さ れます。 問 題 は、 論 理 合 成 で RTL シフ ト レジスタが SRL コンポーネントを 使 用 してインプリ<br />
メントされない 場 合 があることです。<br />
• シフ ト レ ジ ス タ の 中 央 にあ るデータ にア ク セスする 場 合 、 論 理 合 成 では SRL を 直 接 推 論 で き ません。<br />
• SRL が 最 適 であ って も、 ほかの 要 因 に よ り 論 理 合 成 でシ フ ト レジスタがフ リ ップフロップにインプリ メン ト さ<br />
れる こ と があ り ます。 論 理 合 成 は、 複 雑 なプ ロ セスです。<br />
Vivado HLS では、C++ クラス (ap_shift_reg) が 提 供 されてお り 、C コードで 定 義 されたシフ ト レジスタが SRL リソー<br />
ス を 使 用 し て 常 に イ ンプ リ メ ン ト さ れる よ う になっています。ap_shift_reg クラスでは、SRL コンポーネントでサポー<br />
ト さ れる さ ま ざ ま な 読 み 出 しおよび 書 き 込 みア ク セス を 実 行 する 方 法 が 2 つあ り ます。<br />
シフ ト レ ジス タからの 読 み 出 し<br />
読 み 出 し メ ソ ッ ド では、 シフ ト レ ジ ス タ の 指 定 し た 位 置 か ら 読 み 出 し をする こ と がで き ます。<br />
Vivado HLS には、 ap_shift_reg ク ラ ス を 定 義 する ap_shift_reg.h ヘッダー ファイルがスタンドアロン パッケージ<br />
と して 含 まれてお り、 ユーザーのソース<br />
コードで 使 用 できるようになっています。<br />
xilinx_hls_lib_.tgz パッケージは、Vivado HLS インストール ディレク ト リの include ディレク ト<br />
リに 含 まれます。<br />
// Include the Class<br />
#include ap_shift_reg.h<br />
// Define a variable of type ap_shift_reg<br />
// - Sreg must use the static qualifier<br />
// - Sreg will hold integer data types<br />
// - Sreg will hold 4 data values<br />
static ap_shift_reg Sreg;<br />
int var1;<br />
// Read location 2 of Sreg into var1<br />
var1 = Sreg.read(2);<br />
データの 読 み 出 しおよび 書 き 込 みして、 シフ ト<br />
shift メ ソ ッ ド では、 読 み 出 し、 書 き 込 みおよびシ フ ト 操 作 を 実 行 で き ます。<br />
// Include the Class<br />
#include ap_shift_reg.h<br />
// Define a variable of type ap_shift_reg<br />
// - Sreg must use the static qualifier<br />
// - Sreg will hold integer data types<br />
// - Sreg will hold 4 data values<br />
static ap_shift_reg Sreg;<br />
int var1;<br />
// Read location 3 of Sreg into var1<br />
// THEN shift all values up one and load In1 into location 0<br />
var1 = Sreg.shift(In1,3);<br />
読 み 出 し および 書 き 込 みし て、 シ フ ト を イ ネーブル 制 御<br />
shift メ ソ ッ ド では イ ネーブル 入 力 も サポー ト さ れてお り 、 シフ ト 操 作 を 変 数 で 制 御 およびイ ネーブルにで き ます。<br />
高 位 合 成 japan.xilinx.com 258<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
// Include the Class<br />
#include ap_shift_reg.h<br />
// Define a variable of type ap_shift_reg<br />
// - Sreg must use the static qualifier<br />
// - Sreg will hold integer data types<br />
// - Sreg will hold 4 data values<br />
static ap_shift_reg Sreg;<br />
int var1, In1;<br />
bool En;<br />
// Read location 3 of Sreg into var1<br />
// THEN if En=1<br />
// Shift all values up one and load In1 into location 0<br />
var1 = Sreg.shift(In1,3,En);<br />
ap_shift_reg ク ラ ス を 使 用 する と 、Vivado HLS で 各 シフ ト レ ジ ス タ に 対 し て 固 有 の RTL コ ンポーネン ト が 作 成 さ れま<br />
す。 論 理 合 成 が 実 行 さ れる と 、 こ の コ ンポーネン ト が SRL リソースに 合 成 されます。<br />
HLS 線 形 代 数 ラ イ ブ ラ リ<br />
HLS 線 形 代 数 ラ イ ブ ラ リ には、 よ く 使 用 さ れる 線 形 代 数 関 数 が 多 く 含 まれます。 HLS 線 形 代 数 ラ イ ブ ラ リ の 関 数 で<br />
は、 次 の 表 に リ ス ト する よ う に 2 次 元 配 列 を 使 用 し て 行 列 が 表 さ れます。<br />
表 2‐17 : HLS 線 形 代 数 ラ イ ブ ラ リ<br />
関 数 デー タ 型 精 度 (ULP) インプリメンテーション 形 式<br />
cholesky<br />
float<br />
ap_fixed<br />
x_complex
第 2 章 : C ラ イ ブ ラ リ の 使 用<br />
線 形 代 数 関 数 では、 すべて 2 次 元 配 列 を 使 用 し て 行 列 が 示 さ れます。 すべての 関 数 で、 実 数 および 複 素 数 データ に 対<br />
し て 浮 動 小 数 点 ( 単 精 度 ) 入 力 がサポー ト さ れます。 関 数 のサブセ ッ ト では、 実 数 および 複 素 数 データ に 対 し て<br />
ap_fixed ( 固 定 小 数 点 ) 入 力 がサポー ト さ れます。 精 度 および 丸 めビヘイ ビ アーは、 必 要 であればユーザーが 定 義 で<br />
きます。<br />
すべての 線 形 代 数 関 数 の 詳 細 は、 第 4 章 の 「 高 位 合 成 リ フ ァ レ ン ス ガイド」 を 参 照 して く ださい。<br />
線 形 代 数 ラ イ ブ ラ リ の 使 用<br />
HLS 線 形 代 数 関 数 は、 hls 名 前 空 間 ま たはス コープ 付 き 命 名 規 則 を 使 用 し て 記 述 し ます。<br />
• hls 名 前 空 間 は 次 の よ う に 使 用 し ます。<br />
#include “hls_linear_algebra.h”<br />
hls::chelosky(In_Array,Out_Array);<br />
• ス コープ 付 き 命 名 規 則 は、 次 の よ う に 使 用 し ます。<br />
#include “hls_linear_algebra.h”<br />
using namespace hls;// Namespace specified after the header files<br />
chelosky(In_Array,Out_Array);<br />
線 形 代 数 関 数 は、 高 いパフ ォーマン ス を 必 要 と するデザ イ ンか ら、 エ リ ア 効 率 の 良 い イ ンプ リ メ ンテーシ ョ ン を 必 要<br />
とする 低 スループッ トのデザインまで、 さまざまなデザインで 使 用 されるため、 高 パフォーマンス 用 に 前 もって 最 適<br />
化 はされていません。<br />
線 形 代 数 関 数 に 最 適 化 を 適 用 する には、 GUI で hls_linear_algebra.h ヘッダー ファイルを 開 きます。<br />
• Ctrl キーを 押 しながら #include “hls_linear_algebra.h をクリックします。<br />
• または、 [Explorer] タブを 使 用 して、 [Includes] フ ォルダーの 下 のフ ァ イルを 確 認 し ます。<br />
ヘッダー フ ァ イルを 情 報 ペイ ンで 開 いて、 [Directive] タブを 使 用 して 最 適 化 を [Directive] として 追 加 します。 最 適 化<br />
がプ ラ グマ と し て 追 加 さ れる と 、 ラ イ ブ ラ リ に 配 置 さ れ (フ ァ イルの 書 き 込 み 権 限 が 必 要 )、 ヘッダーファイルがデザ<br />
イ ンに 追 加 されるたびにその 指 示 子 が 適 用 される よ う にな り ます。<br />
高 位 合 成 japan.xilinx.com 260<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章<br />
高 位 合 成 コーデ ィ ング スタイル<br />
本 章 では、 さ ま ざ ま な C、 C++、 SystemC のコンス ト ラク トがどのよ うに FPGA ハー ド ウ ェ ア インプリ メンテーショ<br />
ンに 合 成 さ れるかについて 説 明 し ます。<br />
重 要 : 本 書 で C コード と 記 述 されている 場 合 は、 特 に 記 述 のない 限 り、C だけでな く C++、SystemC に も 該 当 し ます。<br />
本 書 のコー ド 例 はそれぞれ Vivado HLS リ リースの 一 部 と して 含 まれています。 次 のいずれかの 方 法 を 使 用 する と、<br />
コード 例 を 入 手 できます。<br />
• 最 初 のウ ェルカ ム 画 面 で [Open Example Project Examples] を ク リ ッ ク 。 最 初 のウ ェルカ ム 画 面 は [Help] →<br />
[Welcome] を ク リ ッ クする と、 いつで も 表 示 でき ます。<br />
• Vivado HLS インストール ディレク ト リの examples/coding ディレク ト リ<br />
コー ド 例 のデ ィ レ ク ト リ 名 は、 例 で 使 用 さ れる 合 成 の 最 上 位 関 数 と 同 じ 名 前 にな り ます。 こ のガ イ ド の 例 には、 関 連<br />
するヘッダー ファイルについて 記 述 されていることがよくあります。 ヘッダー ファイルは、 本 章 の 一 部 のデザイン<br />
でのみ 表 示 し ています。 すべてのヘ ッ ダー フ ァ イルは、 例 を 含 むデ ィ レ ク ト リ か ら 表 示 で き ます。<br />
ヒント : ヘッダー フ ァ イルでは、 通 常 最 上 位 関 数 およびテ ス ト ベンチのデータ 型 が 定 義 さ れます。<br />
サポー ト されない C コンストラクト<br />
Vivado HLS では、 C 言 語 が 広 範 囲 にわたってサポー ト さ れいますが、 合 成 がで きず、 後 のデザ イ ン フローでエラー<br />
を 発 生 させる C コンストラクトもあります。このセクションでは、このような 関 数 が 合 成 され FPGA デバイ スにイ ン<br />
プ リ メ ン ト される 場 合 の、 コード 変 更 が 必 要 な 箇 所 について 説 明 し ます。<br />
合 成 する には、 次 が 必 要 です。<br />
• デザイ ンのすべての 機 能 を 含 める 必 要 あ り<br />
• OS へのシステム コールで 実 行 できる 機 能 はなし<br />
• C コ ン ス ト ラ ク ト が 固 定 サ イ ズ ま たは 境 界 のあ る サ イ ズであ る 必 要 あ り<br />
• こ れ ら の コ ン ス ト ラ ク ト の イ ンプ リ メ ンテーシ ョ ンが 曖 昧 ではない 必 要 あ り<br />
システム コール<br />
システム コールは、 C プログラムを 実 行 している OS で 一 部 のタ ス クが 実 行 されるので、 合 成 でき ません。<br />
Vivado HLS はよ く 使 用 される、 printf() および printf(stdout,) の よ う なデータ を 表 示 する だけでアルゴ リ ズムの 実 行 に<br />
は 影 響 のないシ ス テム コールは 無 視 しますが、 通 常 はシステム コールは 合 成 で き ないので、 合 成 前 に 関 数 か ら 削 除<br />
しておく 必 要 があります。 getc()、 time()、 sleep() などのシステム コールも、 OS に 呼 び 出 し を 実 行 する ので 合 成 で き<br />
ません。<br />
高 位 合 成 japan.xilinx.com 261<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
Vivado HLS では、 合 成 が 実 行 された と きに macro __SYNTHESIS__ が 定 義 されます。 これによ り 、 __SYNTHESIS__<br />
macro を 使 用 し て、 デザ イ ンか ら 合 成 不 可 能 な コー ド を 削 除 で き る よ う にな り ます。<br />
例 3-1 は、 下 位 関 数 か ら の 中 間 結 果 が 保 存 さ れるハー ド ド ラ イ ブのフ ァ イルに 保 存 さ れる コー ド 例 を 示 し ています。<br />
__SYNTHESIS__ マ ク ロ を 使 用 する と 、 合 成 不 可 能 なフ ァ イルの 書 き 出 し が 合 成 中 に 無 視 さ れる よ う にな り ます。<br />
#include hier_func4.h<br />
int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub)<br />
{<br />
*outSum = *in1 + *in2;<br />
*outSub = *in1 - *in2;<br />
}<br />
int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB)<br />
{<br />
*outA = *in1 >> 1;<br />
*outB = *in2 >> 2;<br />
}<br />
void hier_func4(din_t A, din_t B, dout_t *C, dout_t *D)<br />
{<br />
dint_t apb, amb;<br />
sumsub_func(&A,&B,&apb,&amb);<br />
#ifndef __SYNTHESIS__<br />
FILE *fp1;// The following code is ignored for synthesis<br />
char filename[255];<br />
sprintf(filename,Out_apb_%03d.dat,apb);<br />
fp1=fopen(filename,w);<br />
fprintf(fp1, %d \n, apb);<br />
fclose(fp1);<br />
#endif<br />
shift_func(&apb,&amb,C,D);<br />
}<br />
例 3‐1 : デバ ッ グ 用 のフ ァ イルの 書 き 出 し<br />
__SYNTHESIS__ マ ク ロ を 使 用 する と 、 C 関 数 か ら コー ド 自 体 を 削 除 せずに、 合 成 不 可 能 な コー ド を 削 除 で き ます。<br />
ただ し、 こ のマ ク ロ を 使 用 する と 、 シ ミ ュ レーシ ョ ン 用 の C コー ド と 合 成 用 の C コードが 異 なる こ とにな り ます。<br />
注 意 : __SYNTHESIS__ マクロを C コー ド の 機 能 を 変 更 する ために 使 用 する と 、 C シミュレーションと C 合 成 の 結 果<br />
が 異 な り ます。 こ のよ う な コード のエラーはデバッ グ しに く いので、 機 能 を 変 更 する ために __SYNTHESIS__ マクロ<br />
を 使 用 する のはお 勧 めで き ません。<br />
ダイナミ ック メモリの 使 用<br />
システム 内 のメモリ 割 り 当 てを 管 理 するシステム コール、 たとえば malloc()、 alloc()、 および free() は、 OS のメモリ<br />
にあ る リ ソース を 使 用 し、 ラ ン タ イ ム 中 に 作 成 および リ リ ース さ れます。 ハー ド ウ ェ ア インプリ メンテーションを 合<br />
成 で き る よ う にする には、 デザ イ ンに 必 要 な リ ソースがすべて 指 定 さ れ、 含 まれてい る 必 要 があ り ます。<br />
メモリ 割 り 当 てのシステム コールは、 合 成 前 にデザ イ ンか ら 削 除 する 必 要 があ り ますが、 ダ イナ ミ ッ ク メモリ 操 作<br />
がデザ イ ンの 機 能 を 定 義 する ために 使 用 さ れてい る ので、 同 等 の 範 囲 が 制 限 さ れた 表 現 に 変 換 する 必 要 があ り ます。<br />
例 3-2 は、 malloc() を 使 用 するデザ イ ンが 合 成 可 能 なバージ ョ ンに 変 換 さ れる 例 を 示 し ています。<br />
例 3-2 の 例 には、 次 の 2 つのコー ド 記 述 方 法 が 示 さ れます。<br />
高 位 合 成 japan.xilinx.com 262<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
• デザイ ンでは __SYNTHESIS__ マ ク ロ を 使 用 し ません。<br />
合 成 可 能 なバージ ョ ン と 合 成 不 可 能 なバージ ョ ン 間 を 選 択 にユーザー 定 義 の NO_SYNTH マクロが 使 用 されま<br />
す。 こ れに よ り 、 同 じ コー ド が C でシ ミ ュレーシ ョ ンされて、 Vivado HLS で 合 成 される よ う にな り ます。<br />
• malloc() を 使 用 する 元 のデザ イ ンのポ イ ン ターは、 固 定 サ イ ズのエレ メ ン ト 用 に 書 き 直 す 必 要 はあ り ません。<br />
固 定 サ イ ズの リ ソースは 作 成 で き、 既 存 ポ イ ン ターは 単 に 固 定 サ イ ズの リ ソ ース を 指 定 する よ う にで き ます。 こ<br />
の 方 法 に よ り 、 既 存 デザ イ ン を 手 動 で 書 き 直 す 必 要 はな く な り ます。<br />
#include malloc_removed.h<br />
#include <br />
//#define NO_SYNTH<br />
dout_t malloc_removed(din_t din[N], dsel_t width) {<br />
#ifdef NO_SYNTH<br />
long long *out_accum = malloc (sizeof(long long));<br />
int* array_local = malloc (64 * sizeof(int));<br />
#else<br />
long long _out_accum;<br />
long long *out_accum = &_out_accum;<br />
int _array_local[64];<br />
int* array_local = &_array_local[0];<br />
#endif<br />
int i,j;<br />
LOOP_SHIFT:for (i=0;i2;<br />
}<br />
*out_accum=0;<br />
LOOP_ACCUM:for (j=0;j
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
次 の コー ド は、 ラ ン タ イ ムで 新 し い 関 数 を 作 成 する ので、 合 成 で き ません。<br />
Class A {<br />
public:<br />
virtual void bar() {…};<br />
};<br />
void fun(A* a) {<br />
a->bar();<br />
}<br />
A* a = 0;<br />
if (base)<br />
a = new A();<br />
else<br />
a = new B();<br />
foo(a);<br />
ポインターの 制 限<br />
一 般 的 なポイ ン タ ーの 型 変 換<br />
例 3‐3 : 合 成 できないコードのコード 例<br />
Vivado HLS では、 一 般 的 なデータ 型 間 のポ イ ン ター 型 の 変 換 はサポー ト さ れませんが、 ネ イ テ ィ ブ C 型 の 間 ではサ<br />
ポー ト さ れます。 ポ イ ン ター 型 変 換 の 詳 細 は、 319 ページを 参 照 して ください。<br />
ポインターの 配 列<br />
ポ イ ン ターの 配 列 は、 各 ポ イ ン ターがス カ ラーま たはス カ ラーの 配 列 を 指 定 する 場 合 に、 合 成 でサポー ト さ れます。<br />
ポ イ ン ターの 配 列 では、 別 のポ イ ン ターを 指 定 する こ と はで き ません。 ポ イ ン ターの 配 列 の 詳 細 は、 319 ページを 参<br />
照 してください。<br />
再 帰 関 数<br />
再 帰 関 数 は 合 成 で き ません。 再 帰 関 数 は、 次 の よ う な 再 帰 が 恒 久 的 に 繰 り 返 さ れる 可 能 性 のあ る 関 数 に 適 用 さ れます。<br />
unsigned foo (unsigned n)<br />
{<br />
if (n == 0 || n == 1) return 1;<br />
return (foo(n-2) + foo(n-1));<br />
}<br />
Vivado HLS では 有 限 数 の 関 数 呼 び 出 し があ る 末 尾 再 帰 はサポー ト さ れません。<br />
unsigned foo (unsigned m, unsigned n)<br />
{<br />
if (m == 0) return n;<br />
if (n == 0) return m;<br />
return foo(n, m%n);<br />
}<br />
C++ では、 テンプレー ト で 末 尾 再 帰 を イ ンプ リ メ ン ト で き ます。 C_++ については、 次 で 説 明 し ます。<br />
高 位 合 成 japan.xilinx.com 264<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
標 準 テンプレー ト ライブラリ<br />
C++ 標 準 テンプレー ト ライブラリ (STL) には、 再 帰 関 数 が 含 まれてお り 、 ダ イナ ミ ッ ク メモリ 割 り 当 てが 使 用 され<br />
ます。 そのため、 STL は 合 成 でき ません。 STL を 使 用 する 場 合 は、 再 帰 、 ダ イ ナ ミ ッ ク メモリ 割 り 当 て、ダイナミ ッ<br />
クなオブジェク トの 作 成 / 削 除 な どの 特 性 を 持 たない 同 じ 機 能 の ローカル 関 数 を 作 成 し ます。<br />
C テストベンチ<br />
ブロックの 合 成 では、 まず C 関 数 が 正 し いかど う かが 検 証 さ れます。 こ の 手 順 は、 テ ス ト ベンチで 実 行 さ れます。 テ<br />
ス ト ベンチが 良 い と 、 生 産 性 がかな り あが り ます。<br />
C 関 数 は、 RTL シ ミ ュ レーシ ョ ン よ り も かな り 速 く 実 行 さ れる ので、 合 成 よ り も 前 に C を 使 用 してアルゴ リ ズムを 開<br />
発 および 検 証 し た 方 が、 レ ジ ス タ トランスファー レベル (RTL) を 開 発 する よ り も 生 産 性 が 向 上 し ます。<br />
• C の 開 発 時 間 を 効 率 的 に 使 用 する には、 既 知 の 良 い 結 果 に 対 し て 関 数 の 結 果 をチェ ッ ク する テ ス ト ベンチを 用 意<br />
する こ と が 重 要 にな り ます。 アルゴ リ ズムが 正 し い こ と がわかってい る ので、 合 成 前 に コー ド 変 更 を 検 証 で き ま<br />
す。<br />
• Vivado HLS では C テ ス ト ベンチを 再 利 用 し て、 RTL デザイ ンが 検 証 されます。 Vivado HLS を 使 用 する 場 合 は<br />
RTL テ ス ト ベンチを 作 成 する 必 要 はあ り ません。 テ ス ト ベンチで 最 上 位 関 数 か ら の 結 果 がチェ ッ ク さ れる と 、 そ<br />
の RTL がシ ミ ュ レーシ ョ ンで 検 証 で き ます。<br />
合 成 用 の 最 上 位 関 数 はテ ス ト ベンチ と は 分 けて 記 述 し、 ヘ ッ ダー フ ァ イルを 使 用 する よ う にする 方 法 が 推 奨 さ れま<br />
す。 例 3-4 は、 hier_func 関 数 が 次 の 2 つの 関 数 を 呼 び 出 すデザ イ ン を 示 し ています。<br />
• sumsub_func : 加 算 および 減 算 を 実 行<br />
• shift_func : シフ ト を 実 行<br />
次 のデータ 型 はヘ ッ ダー ファイル (hier_func.h) で 定 義 されています。<br />
#include hier_func.h<br />
int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub)<br />
{<br />
*outSum = *in1 + *in2;<br />
*outSub = *in1 - *in2;<br />
}<br />
int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB)<br />
{<br />
*outA = *in1 >> 1;<br />
*outB = *in2 >> 2;<br />
}<br />
void hier_func(din_t A, din_t B, dout_t *C, dout_t *D)<br />
{<br />
dint_t apb, amb;<br />
}<br />
sumsub_func(&A,&B,&apb,&amb);<br />
shift_func(&apb,&amb,C,D);<br />
例 3‐4 : 階 層 デザイ ンのコ ー ド 例<br />
最 上 位 関 数 には 複 数 の 下 位 関 数 を 含 め る こ と がで き ますが、 合 成 で き る のは 1 つの 最 上 位 関 数 のみです。 複 数 の 関 数<br />
を 合 成 する には、 それら を 1 つの 最 上 位 関 数 にま と めます。<br />
高 位 合 成 japan.xilinx.com 265<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
hier_func 関 数 を 合 成 する 方 法 は、 次 の と お り です。<br />
1. 例 3-4 に 示 すよ う にフ ァ イルをデザイ ン ファイルとして Vivado HLS プロジェク トに 追 加 します。<br />
2. その 最 上 位 関 数 を hier_func と 指 定 します。<br />
合 成 後 :<br />
• 最 上 位 関 数 に 対 する 引 数 ( 例 3-4 では A、 B、 C, および D) は RTL ポー ト に 合 成 さ れます。<br />
• 最 上 位 に 含 まれる 関 数 ( 例 3-4 では sumsub_func および shift_func) は 階 層 ブ ロ ッ ク に 合 成 さ れます。<br />
例 3-4 のヘッ ダー ファイル (hier_func.h) には、 マク ロの 使 用 方 法 が 記 述 されてお り、 typedef 文 を 使 用 する こ とで、<br />
コー ド が さ ら にポータ ブルにな り 、 読 みやす く な る と こ ろ を 示 し ています。 次 は、 typedef 文 でデータ 型 を 許 可 し、 最<br />
終 的 な FPGA インプリ メンテーションでエリアとパフォーマンスの 両 方 が 改 善 されるよ うに 変 数 のビッ ト 幅 を 指 定<br />
しています。<br />
#ifndef _HIER_FUNC_H_<br />
#define _HIER_FUNC_H_<br />
#include <br />
#define NUM_TRANS 40<br />
typedef int din_t;<br />
typedef int dint_t;<br />
typedef int dout_t;<br />
void hier_func(din_t A, din_t B, dout_t *C, dout_t *D);<br />
#endif<br />
例 3‐5 : 階 層 デザイ ン 例 のヘ ッ ダー ファイル<br />
この 例 のヘッダー ファイルには、デザイン フ ァ イルでは 必 須 でない NUM_TRANS の よ う な 定 義 がい く つか 含 まれま<br />
す。 こ れ ら の 定 義 は、 同 じヘ ッ ダー ファイルも 含 んだテストベンチで 使 用 されます。<br />
例 3-6268 ページは、 例 3-4265 ページのデザイ ンのテス ト ベンチを 示 し ています。<br />
高 位 合 成 japan.xilinx.com 266<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
テストベンチの 例<br />
#include hier_func.h<br />
int main() {<br />
// Data storage<br />
int a[NUM_TRANS], b[NUM_TRANS];<br />
int c_expected[NUM_TRANS], d_expected[NUM_TRANS];<br />
int c[NUM_TRANS], d[NUM_TRANS];<br />
//Function data (to/from function)<br />
int a_actual, b_actual;<br />
int c_actual, d_actual;<br />
// Misc<br />
int retval=0, i, i_trans, tmp;<br />
FILE *fp;<br />
// Load input data from files<br />
fp=fopen(tb_data/inA.dat,r);<br />
for (i=0; i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
}<br />
fclose(fp);<br />
// Check outputs against expected<br />
for (i = 0; i < NUM_TRANS-1; ++i) {<br />
if(c[i] != c_expected[i]){<br />
retval = 1;<br />
}<br />
if(d[i] != d_expected[i]){<br />
retval = 1;<br />
}<br />
}<br />
// Print Results<br />
if(retval == 0){<br />
printf(<br />
printf(<br />
printf(<br />
} else {<br />
printf(<br />
printf(<br />
printf(<br />
}<br />
*** *** *** *** \n);<br />
Results are good \n);<br />
*** *** *** *** \n);<br />
*** *** *** *** \n);<br />
Mismatch: retval=%d \n, retval);<br />
*** *** *** *** \n);<br />
}<br />
// Return 0 if outputs are corre<br />
return retval;<br />
例 3‐6 : テストベンチの 例<br />
生 産 的 なテス ト ベンチ<br />
例 3-6 は、 次 の よ う な 生 産 的 なテ ス ト ベンチの 属 性 をい く つか 示 し ています。<br />
• 合 成 さ れる 最 上 位 関 数 (hier_func) は、 NUM_TRANS マクロの 定 義 (ヘッダー ファイル 例 3-5 で 指 定 ) どおり、 ト<br />
ラ ンザ ク シ ョ ン 複 数 回 分 実 行 さ れる ので、 多 く の 異 な るデータ 値 が 適 用 および 検 証 で き ます。 テ ス ト ベンチは、<br />
実 行 さ れる さ ま ざ ま なテ ス ト でのみ 有 効 です。<br />
• 関 数 出 力 は、 既 知 の 良 い 値 に 対 し て 比 較 さ れます。 既 知 の 良 い 値 は、 こ の 例 ではフ ァ イルか ら 読 み 込 まれますが、<br />
テ ス ト ベンチの 一 部 と し て 計 算 させる こ と も で き ます。<br />
• main() 関 数 の 戻 り 値 は、 次 のよ う に 設 定 されます。<br />
° 結 果 が 正 し い と 確 認 さ れた 場 合 は 0<br />
° 結 果 が 既 知 の 良 い 値 と 一 致 し なかった 場 合 は 0 以 外 の 値<br />
ヒント : テス トベンチが 0 を 戻 さ ない 場 合 、Vivado HLS で 実 行 される RTL 検 証 ではシ ミ ュ レーシ ョ ン エラーがレポー<br />
トされます。 自 動 RTL 検 証 を 利 用 する には、 結 果 が 正 し い と 確 認 さ れた と き に 0 を 戻 すよ う にテス ト ベンチを 記 述<br />
しておきます。<br />
1 または 0 を 超 え る 値 を 渡 す 関 数 戻 り 値 を 使 用 する 際 は、 C 規 格 では 戻 り ス テータ スの 下 位 バイ ト のみがプ ロ セ ス を<br />
呼 び 出 すのに 使 用 可 能 になってい る こ と に 留 意 し て く だ さ い。<br />
こ れ ら の 属 性 を 含 むテ ス ト ベンチを 使 用 する と 、 合 成 前 の C 関 数 への 変 更 を 素 早 く テ ス ト し て 検 証 で き、RTL で 再 利<br />
用 でき るので、 RTL の 検 証 が 簡 単 にな り ます。<br />
高 位 合 成 japan.xilinx.com 268<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
デザイ ン ファイルとテストベンチ ファイル<br />
Vivado HLS では RTL 検 証 に C テ ス ト ベンチが 再 利 用 さ れる ので、テ ス ト ベンチおよび 関 連 フ ァ イルを Vivado HLS に<br />
追 加 する と き にテ ス ト ベンチ と し て 指 定 する 必 要 があ り ます。<br />
テ ス ト ベンチに 関 連 付 け ら れた フ ァ イルは、 次 の よ う なフ ァ イルです。<br />
• テス トベンチによ りアクセスされるファイル<br />
• テ ス ト ベンチが 正 し く 動 作 する ために 必 要 なフ ァ イル<br />
このよ うなファイルの 例 は、 例 3-6 に 示 す inA.dat や inB.dat などで、これらは Vivado HLS プロジェク トにテス トベン<br />
チ フ ァ イル と し て 追 加 する 必 要 があ り ます。<br />
Vivado HLS プ ロ ジ ェ ク ト でテ ス ト ベンチを 指 定 する ために、デザ イ ン と テ ス ト ベンチを 別 々のフ ァ イルに 分 け る 必 要<br />
はあ り ませんが、 推 奨 は さ れます。<br />
例 3-4 は、 例 3-7 と 同 じデザ イ ンですが、 最 上 位 関 数 の 名 前 が 2 つの 例 の 区 別 を 付 け る ため、 hier_func2 に 変 更 されて<br />
いる 点 のみが 違 います。<br />
hier_func が hier_func2 に 変 更 されている 点 を 除 く と 、 同 じヘッ ダー ファイルとテストベンチが 使 用 されているので、<br />
sumsum_func 関 数 を 最 上 位 関 数 と し て 合 成 する ためには Vivado HLS で 次 を 変 更 する 必 要 があ り ます。<br />
• Vivado HLS で sumsub_func を 最 上 位 関 数 と し て 設 定 し ます。<br />
• 例 3-7 のファ イルをデザイン ファイルとプロジェクト フ ァ イルの 両 方 と し て 追 加 し ます。 こ れに よ り 、<br />
sumsub_func よりも 上 位 にある hier_func2 関 数 はテ ス ト ベンチの 一 部 にな る ので、 RTL シミュレーションに 含 め<br />
る 必 要 があ り ます。<br />
sumsub_func 関 数 は main() 関 数 内 に イ ン ス タ ンシエー ト さ れていな く て も、 残 り の 関 数 (hier_func2 および shift_func)<br />
によ り、 正 し く 動 作 していて、 テス トベンチの 一 部 であるこ とが 確 認 されます。<br />
#include hier_func2.h<br />
int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub)<br />
{<br />
*outSum = *in1 + *in2;<br />
*outSub = *in1 - *in2;<br />
}<br />
int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB)<br />
{<br />
*outA = *in1 >> 1;<br />
*outB = *in2 >> 2;<br />
}<br />
void hier_func2(din_t A, din_t B, dout_t *C, dout_t *D)<br />
{<br />
dint_t apb, amb;<br />
}<br />
sumsub_func(&A,&B,&apb,&amb);<br />
shift_func(&apb,&amb,C,D);<br />
例 3‐7 : 新 しい 最 上 位<br />
高 位 合 成 japan.xilinx.com 269<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
テストベンチとデザイン フ ァ イルの 結 合<br />
デザイ ン ファイルとテストベンチを 1 つのデザイ ン ファイルに 含 めることもできます。 例 3-8 は 例 3-4 ~ 例 3-6 と 同<br />
じ 機 能 を 持 ちますが、すべてが 1 つのフ ァ イルにま と め ら れてい る 点 が 異 な り ます。 他 の 例 と 区 別 する ため、hier_func<br />
関 数 の 名 前 は hier_func3 に 変 更 し ています<br />
重 要 : テス トベンチとデザインが 1 つのファイルになっている 場 合 は、ファイルをデザイン ファイルとテストベンチ<br />
ファイルの 両 方 として Vivado HLS プ ロ ジ ェ ク ト に 追 加 する 必 要 があ り ます。<br />
テス ト ベンチおよび 最 上 位 デザイ ンのコー ド 例<br />
#include <br />
#define NUM_TRANS 40<br />
typedef int din_t;<br />
typedef int dint_t;<br />
typedef int dout_t;<br />
int sumsub_func(din_t *in1, din_t *in2, dint_t *outSum, dint_t *outSub)<br />
{<br />
*outSum = *in1 + *in2;<br />
*outSub = *in1 - *in2;<br />
}<br />
int shift_func(dint_t *in1, dint_t *in2, dout_t *outA, dout_t *outB)<br />
{<br />
*outA = *in1 >> 1;<br />
*outB = *in2 >> 2;<br />
}<br />
void hier_func3(din_t A, din_t B, dout_t *C, dout_t *D)<br />
{<br />
dint_t apb, amb;<br />
}<br />
sumsub_func(&A,&B,&apb,&amb);<br />
shift_func(&apb,&amb,C,D);<br />
int main() {<br />
// Data storage<br />
int a[NUM_TRANS], b[NUM_TRANS];<br />
int c_expected[NUM_TRANS], d_expected[NUM_TRANS];<br />
int c[NUM_TRANS], d[NUM_TRANS];<br />
//Function data (to/from function)<br />
int a_actual, b_actual;<br />
int c_actual, d_actual;<br />
// Misc<br />
int retval=0, i, i_trans, tmp;<br />
FILE *fp;<br />
// Load input data from files<br />
fp=fopen(tb_data/inA.dat,r);<br />
for (i=0; i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
a[i] = tmp;<br />
}<br />
fclose(fp);<br />
fp=fopen(tb_data/inB.dat,r);<br />
for (i=0; i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
}<br />
}<br />
// Return 0 if outputs are correct<br />
return retval;<br />
例 3‐8 : テス ト ベンチおよび 最 上 位 デザイ ン<br />
関 数<br />
最 上 位 関 数 は、 合 成 後 に 最 上 位 RTL デザ イ ンにな り 、 下 位 関 数 は RTL デザイ ンではブロ ッ ク に 合 成 されます。<br />
重 要 : 最 上 位 関 数 は、 static 関 数 にはで き ません。<br />
合 成 後 、 デザ イ ンの 各 関 数 に 対 し て 独 自 の 合 成 レ ポー ト と RTL HDL ファイル (Verilog、 VHDL、 SystemC) が 作 成 され<br />
ます。<br />
関 数 のイ ン ラ イ ン 化<br />
下 位 関 数 は、 オプシ ョ ンで イ ン ラ イ ン 化 し て、 その ロ ジ ッ ク と 周 囲 の 関 数 の ロ ジ ッ ク と を 統 合 で き ます。 イ ン ラ イ ン<br />
化 する 関 数 に よ り 最 適 化 が 改 善 さ れる こ と はあ り ますが、 ラ ン タ イ ムは 増 加 し ます。 よ り 多 く の ロ ジ ッ ク と 可 能 性 が<br />
メ モ リ に 保 持 さ れて 解 析 さ れます。<br />
ヒント : Vivado HLS では、 小 さ い 関 数 の イ ン ラ イ ン 化 が 自 動 的 に 実 行 さ れます。 小 さ い 関 数 の 自 動 イ ン ラ イ ン 化 をオ<br />
フにする には、 その 関 数 に 対 する inline 指 示 子 を off に 設 定 し ます。<br />
関 数 が イ ン ラ イ ン 化 さ れる と 、 その 関 数 に 対 する レ ポー ト および 別 の RTL ファイルは 作 成 されません。 ロジックお<br />
よびループは 1 つ 上 の 階 層 の 関 数 と 統 合 さ れます。<br />
コー ド 形 式 の 影 響<br />
関 数 の コー ド 記 述 方 法 は、 主 に 関 数 の 引 数 およびイ ン ターフ ェ イ スに 影 響 し ます。<br />
関 数 への 引 数 サ イ ズが 正 確 に 記 述 さ れていれば、Vivado HLS で こ の 情 報 がデザ イ ンに 伝 搬 さ れます。すべての 変 数 に<br />
対 し て 任 意 精 度 型 を 作 成 する 必 要 はあ り ません。 次 の 例 では、 2 つの 整 数 が 乗 算 されますが、 下 位 の 24 ビッ トのみが<br />
結 果 に 使 用 さ れます。<br />
#include ap_cint.h<br />
int24 foo(int x, int y) {<br />
int tmp;<br />
}<br />
tmp = (x * y);<br />
return tmp<br />
このコードが 合 成 されると、 出 力 が 24 ビッ トに 切 り 捨 てられた 32 ビ ッ ト 乗 算 器 にな り ます。<br />
例 3-9 のよ うに 入 力 のサイズが 正 し く 12 ビッ ト 型 (int12) になっていれば、 最 終 RTL では 24 ビ ッ ト 乗 算 器 が 使 用 さ<br />
れます。<br />
高 位 合 成 japan.xilinx.com 272<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include ap_cint.h<br />
typedef int12 din_t;<br />
typedef int24 dout_t;<br />
dout_t func_sized(din_t x, din_t y) {<br />
int tmp;<br />
}<br />
tmp = (x * y);<br />
return tmp<br />
例 3‐9 : サイズの 正 しい 関 数 引 数<br />
2 つの 関 数 入 力 に 任 意 精 度 型 を 使 用 する だけで、Vivado HLS では 24 ビ ッ ト 乗 算 器 を 使 用 するデザ イ ンが 作 成 さ れ、12<br />
ビ ッ ト 型 がデザ イ ンに 伝 搬 さ れます。 階 層 内 のすべての 関 数 の 引 数 のサ イ ズを 正 し く 記 述 する こ と をお 勧 め し ます。<br />
通 常 は、 変 数 が 関 数 イ ン ターフ ェ イ スか ら、 特 に 最 上 位 関 数 イ ン ターフ ェ イ スか ら 直 接 駆 動 さ れる と 、 最 適 化 の 中 に<br />
実 行 さ れない も のがでて く る こ と があ り ます。 典 型 的 な 例 は、 入 力 がループ イ ンデ ッ ク スの 上 位 制 限 と し て 使 用 さ れ<br />
る 場 合 です。<br />
ループ<br />
ループはアルゴ リ ズムの 動 作 を 示 す 簡 単 な 方 法 で、 C コード でよ く 使 用 されます。 ループは 合 成 でサポー ト され、 パ<br />
イ プ ラ イ ン 化 、 展 開 、 部 分 展 開 、 統 合 、 平 坦 化 で き ます。<br />
最 適 化 の 展 開 、 部 分 展 開 、 平 坦 化 、 統 合 に よ り 、 コー ド を 変 更 し たかの よ う にループ 構 造 を 効 率 的 に 変 更 で き る ので、<br />
ループの 最 適 化 に 必 要 な コー ド 変 更 を 最 小 限 に 抑 え る こ と がで き ます。 ただ し、 特 定 の 状 況 に し か 適 用 で き ない 最 適<br />
化 も あ り 、 そのために コー ド を 変 更 する 必 要 のあ る こ と も あ り ます。<br />
推 奨 : ループ イ ンデ ッ ク ス 変 数 にグ ローバル 変 数 を 使 用 する と 、 実 行 さ れない 最 適 化 があ る ため、 使 用 し ないで く だ<br />
さい。<br />
可 変 ループ 境 界<br />
Vivado HLS で 適 用 でき る 最 適 化 の 中 には、 ループに 可 変 境 界 があ る と 実 行 されないものがあ り ます。 例 3-10 では、<br />
ループ 境 界 が 可 変 幅 (width) で 決 定 さ れ、 最 上 位 入 力 か ら 駆 動 さ れます。 こ の 例 の 場 合 、 Vivado HLS ではループが<br />
いつ 終 了 する のか 判 断 で き ないので、 ループには 可 変 境 界 があ る と 考 え ら れます。<br />
高 位 合 成 japan.xilinx.com 273<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include ap_cint.h<br />
#define N 32<br />
typedef int8 din_t;<br />
typedef int13 dout_t;<br />
typedef uint5 dsel_t;<br />
dout_t code028(din_t A[N], dsel_t width) {<br />
dout_t out_accum=0;<br />
dsel_t x;<br />
LOOP_X:for (x=0;x
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
tripcount 指 示 子 を 使 用 し て も、 合 成 結 果 には 影 響 はあ り ません。 tripcount 指 示 子 に 対 し てユーザーが 指 定 し た 値 は、<br />
レポー ト にのみ 使 用 さ れます。 tripcount の 値 は Vivado HLS で 数 がレポー ト される よ う にするだけですが、 さ まざま<br />
な ソ リ ューシ ョ ンか ら のレポー ト を 比 較 する こ と がで き ます。 こ の 同 じループ 境 界 情 報 を 合 成 に 使 用 する には、 C<br />
コー ド をア ッ プデー ト する 必 要 があ り ます。 詳 細 は、 312 ページを 参 照 して ください。<br />
tripcount 指 示 子 を 使 用 し て も、 合 成 結 果 には 影 響 あ り ません。<br />
次 は、 よ り 低 い 開 始 間 隔 の 例 3-10 を 最 適 化 する 手 順 を 示 し ています。<br />
• ループを 展 開 し、 並 列 累 算 が 行 われる よ う に し ます。<br />
• 配 列 入 力 を 分 割 し ない と 、 並 列 累 算 が 1 つの メ モ リ ポー ト に 制 限 さ れます。<br />
こ れ ら の 最 適 化 が 適 用 さ れる と 、 Vivado HLS で 可 変 境 界 ループに 関 する 最 大 の 問 題 を 示 す メ ッ セージが 表 示 さ れま<br />
す。<br />
@W [XFORM-503] Cannot unroll loop 'LOOP_X' in function 'code028': cannot completely<br />
unroll a loop with a variable trip count.<br />
可 変 境 界 ループは 展 開 で き ないので、 unroll 指 示 子 が 適 用 できないだけでな く 、 そのループの 上 のレベルのパイプラ<br />
イ ン 処 理 も で き ません。<br />
重 要 : ループまたは 関 数 がパイ プ ラ イ ン 処 理 される と、 Vivado HLS はその 関 数 またはループの 下 の 階 層 ですべての<br />
ループを 展 開 し ます。 こ の 階 層 に 可 変 境 界 を 含 むループがあ る と 、 パイ プ ラ イ ン 処 理 はで き ません。<br />
こ の 問 題 は、 ループ 内 で 条 件 付 き 実 行 を 使 用 し、 ループの 繰 り 返 し 回 数 を 固 定 値 にする と 回 避 でき ます。 例 3-10 の<br />
コードは、 例 3-11 の よ う に 書 き 直 すこ と ができ ます。 こ の 例 では、 ループ 境 界 は 可 変 幅 の 最 大 値 に 設 定 さ れ、 ルー<br />
プ 本 体 は 条 件 付 き で 実 行 さ れます。<br />
#include ap_cint.h<br />
#define N 32<br />
typedef int8 din_t;<br />
typedef int13 dout_t;<br />
typedef uint5 dsel_t;<br />
dout_t loop_max_bounds(din_t A[N], dsel_t width) {<br />
dout_t out_accum=0;<br />
dsel_t x;<br />
LOOP_X:for (x=0;x
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
ループのパイ プ ラ イ ン 処 理<br />
ループをパイ プ ラ イ ン 処 理 する 際 は、 通 常 一 番 内 部 のループをパイ プ ラ イ ン 処 理 する と 、 エ リ ア と パフ ォーマン スの<br />
最 適 なバランスがわかります。 これにより、 ランタイムも 最 速 になります。 例 3-12 のコードは、 ループおよび 関 数<br />
をパイプラ イン 処 理 した 場 合 の ト レードオフを 示 しています。<br />
#include loop_pipeline.h<br />
dout_t loop_pipeline(din_t A[N]) {<br />
int i,j;<br />
static dout_t acc;<br />
LOOP_I:for(i=0; i < 20; i++){<br />
LOOP_J: for(j=0; j < 20; j++){<br />
acc += A[i] * j;<br />
}<br />
}<br />
}<br />
return acc;<br />
例 3‐12 : ループのパイ プ ラ イ ン<br />
一 番 内 側 のループ (LOOP_J) がパイプラ イ ン 処 理 される と、 ハード ウ ェアには LOOP_J のコピーが 1 つ ( 乗 算 器 1 つ)<br />
でき、 Vivado HLS はその 外 側 のループ (LOOP_I) を 使 用 して LOOP_J に 新 し いデータ を 提 供 し ます。 乗 算 器 演 算 1 つ<br />
と 配 列 アクセス 1 回 のみを ス ケジ ュールする 必 要 があ り ます。 これらをスケジュールしておく と、 ループの 繰 り 返 し<br />
は 1 つのループ 本 体 のエンテ ィ テ ィ (20X20 のループ 繰 り 返 し) としてスケジュールできます。<br />
ヒント : ループま たは 関 数 がパイ プ ラ イ ン 処 理 さ れる 場 合 は、 そのループま たは 関 数 の 下 の 階 層 にあ るループを 展 開<br />
する 必 要 があ り ます。<br />
外 側 のループ (LOOP_I) がパイプラ イ ン 処 理 される と、 内 部 のループ (LOOP_J) が 展 開 され、 そのループの 本 体 のコ<br />
ピーが 20 個 作 成 さ れます。 こ のため、 乗 算 器 20 個 と 配 列 アクセス 20 回 をスケジュールする 必 要 があ り ます。 これ<br />
で LOOP_I の 各 繰 り 返 し を 1 つのエンティティとしてスケジュールできるようになります。<br />
最 上 位 関 数 がパイ プ ラ イ ン 処 理 さ れる 場 合 は、 ど ち ら のループ も 展 開 する 必 要 があ り ます。 こ のため、 乗 算 器 400 個<br />
と 配 列 アクセス 400 回 を ス ケジ ュールする 必 要 があ り ます。 ただ し、Vivado HLS で 400 個 の 乗 算 器 が 作 成 さ れる こ と<br />
はほぼあ り ません。 こ れは、 ほ と んどのデザ イ ンで、 データ 依 存 性 のために 最 大 の 並 列 処 理 がで き ない こ と が よ く あ<br />
るからです。 た と えば、 こ の 例 の 場 合 、 デュ アル ポー ト RAM が A[N] に 使 用 されて も、 デザイ ンはク ロ ッ ク サイク<br />
ルの A[N] の 2 つの 値 にしかア ク セスでき ません。<br />
パイ プ ラ イ ン 処 理 する 階 層 レベルを 選 択 する と 、 た と えば 一 番 内 側 のループをパイ プ ラ イ ン 処 理 し た と き に、 ほ と ん<br />
どのアプ リ ケーシ ョ ンで 一 般 的 に 許 容 される スループ ッ ト で 最 小 のハード ウ ェ アが 提 供 されます。 階 層 の 上 位 をパイ<br />
プラ イ ン 処 理 する と、 すべての 下 位 ループが 展 開 されるので、 スケジ ュールするために さ らに 多 く の 演 算 が 作 成 され<br />
ますが (ラ ン タ イ ム と メ モ リ 容 量 に 影 響 する 可 能 性 あ り )、 スループ ッ ト と レ イ テンシの 観 点 か ら、 通 常 はパフ ォーマ<br />
ンスの 最 も 高 いデザインになります。<br />
上 記 のオプシ ョ ン を ま と め る と 、 次 の よ う にな り ます。<br />
• LOOP_J のパイプラ イ ン :<br />
レイテンシは 約 400 サイクル (20X20) にな り、100 個 未 満 の LUT およびレ ジ ス タ が 必 要 にな り ます (I/O 制 御 およ<br />
び FSM は 常 にあ り ます)。<br />
• LOOP_I のパイプラ イ ン :<br />
レイテンシは 約 20 サ イ ク ルにな り ますが、 数 百 個 の LUT およびレ ジ ス タ が 必 要 にな り ます。 ロ ジ ッ ク 数 は、 最<br />
初 のオプシ ョ ンの 約 20 倍 の 数 から ロ ジ ッ ク 最 適 化 で 処 理 される ロ ジ ッ ク を 引 いた 数 にな り ます。<br />
高 位 合 成 japan.xilinx.com 276<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
• パイプライン 関 数 loop_pipeline<br />
レイテンシは 約 10 個 (デュアル ポー ト アクセス 20 回 ) にな り ますが、 何 千 個 も の LUT およびレ ジ ス タ が 必 要 と<br />
なります。 ロジック 数 は 最 初 のオプションの 約 400 倍 から ロ ジ ッ ク 最 適 化 で 処 理 される ロ ジ ッ ク を 引 いた 数 にな<br />
ります。<br />
不 完 全 なネス ト ループ<br />
一 番 内 側 のループ 階 層 がパイ プ ラ イ ン 処 理 さ れる と 、 Vivado HLS はネス ト された ( 入 れ 子 になった) ループを フ ラ ッ<br />
トにして、ループの 遷 移 (ループの 入 出 時 にループ インデックスで 実 行 されるチェック) によって 発 生 したサイクル<br />
を 削 除 する こ と で、 レ イ テンシを 削 減 し て スループ ッ ト 全 体 を 改 善 し ます。 こ の よ う なチェ ッ ク は、 1 つのループか<br />
ら 次 のループへの 遷 移 の 際 にクロッ ク 遅 延 を 発 生 させます。 例 3-12 の よ う に 一 番 内 側 のループをパイ プ ラ イ ン 処 理<br />
する と、 Vivado HLS で 次 の よ う な メ ッ セージが 表 示 さ れます。<br />
@I [XFORM-541] Flattening a loop nest 'LOOP_I' in function 'loop_pipeline'.<br />
ネス ト ループは、 ループが 完 全 ま たは 半 完 全 であ る 場 合 にのみフ ラ ッ ト にで き ます。<br />
• 完 全 ループ<br />
° 一 番 内 側 のループにのみ 本 体 が 含 まれます。<br />
° ループ 文 間 に 指 定 さ れる ロ ジ ッ ク はあ り ません。<br />
° ループ 境 界 は 定 数 です。<br />
• 半 完 全 ループ<br />
° 一 番 内 側 のループにのみ 本 体 が 含 まれます。<br />
° ループ 文 間 に 指 定 さ れる ロ ジ ッ ク はあ り ません。<br />
° 一 番 外 側 のループは 可 変 にで き ます。<br />
例 3-13 は、 ループ ネ ス ト が 不 完 全 な 例 を 示 し ています。<br />
#include loop_imperfect.h<br />
void loop_imperfect(din_t A[N], dout_t B[N]) {<br />
}<br />
int i,j;<br />
dint_t acc;<br />
LOOP_I:for(i=0; i < 20; i++){<br />
acc = 0;<br />
LOOP_J: for(j=0; j < 20; j++){<br />
acc += A[i] * j;<br />
}<br />
B[i] = acc / 20;<br />
}<br />
例 3‐13 : 不 完 全 なネス ト ループ<br />
高 位 合 成 japan.xilinx.com 277<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
LOOP_I 内 (LOOP_J 外 側 ) の acc および 配 列 B[N] への 代 入 があ る と、 ループがフ ラ ッ ト にな ら ないよ う にでき ます。<br />
例 3-13 の LOOP_J がパイプラ イ ン 処 理 される と、 合 成 レポー ト には 次 のよ う に 表 示 されます。<br />
+ Summary of loop latency (clock cycles):<br />
+ LOOP_I:<br />
* Trip count:20<br />
* Latency: 480<br />
+ LOOP_J:<br />
* Trip count: 20<br />
* Latency: 21<br />
* Pipeline II: 1<br />
* Pipeline depth:2<br />
• パイプラインの 深 さによ り、LOOP_J を 1 回 反 復 する のに 2 クロックかかるのがわかります。これはデバイス テ<br />
クノロジおよびクロック 周 期 によって 異 なります。<br />
• 新 しい 反 復 は、 各 クロ ッ ク サイクルごとに 開 始 できます。 Pipeline II は 1 です。 II はループ 本 体 の 各 新 規 実 行 間<br />
のサ イ ク ルを 示 す 開 始 間 隔 の こ と です。<br />
• 最 初 の 反 復 が 結 果 を 出 力 する までに 2 サ イ ク ルかか り ます。 パイ プ ラ イ ン 処 理 のため、 続 く 反 復 実 行 は 前 の 反 復<br />
を 使 用 し て 平 行 に 実 行 さ れ、 1 ク ロ ッ ク 後 に 値 を 出 力 し ます。 ループのレ イ テンシの 合 計 は、 2 + 残 りの 19 回 の<br />
反 復 ご と に 1 で、 21 にな り ます。<br />
• LOOP_I は 20 反 復 を 実 行 する のに 480 クロックを 必 要 とするので、LOOP_I の 各 反 復 は 24 クロック サイクルで<br />
す。 つま り 、 LOOP_J への 入 出 には 3 サ イ ク ルのオーバーヘ ッ ド があ り ます (24 – 21 = 3)。<br />
不 完 全 なループ ネス ト の 場 合 、 またはループをフ ラ ッ ト にできない 場 合 、 ループの 入 出 のために ク ロ ッ ク サイクル<br />
が 追 加 されます。 例 3-13 のコードは、 ネス ト されたループを 完 全 にし、 フラッ トにできるよ うにするために 記 述 し<br />
直 す こ と がで き ます。<br />
例 3-14 は、 例 3-13 と 同 じ 機 能 ですが、 ループがフ ラ ッ ト にでき る よ う に、 条 件 文 を LOOP_J ループに 追 加 し た と こ<br />
ろを 示 しています。<br />
#include loop_perfect.h<br />
void loop_perfect(din_t A[N], dout_t B[N]) {<br />
}<br />
int i,j;<br />
dint_t acc;<br />
LOOP_I:for(i=0; i < 20; i++){<br />
LOOP_J: for(j=0; j < 20; j++){<br />
if(j==0) acc = 0;<br />
acc += A[i] * j;<br />
if(j==19) B[i] = acc / 20;<br />
}<br />
}<br />
例 3‐14 : 完 全 なネス ト ループ<br />
例 3-14 が 合 成 される と 、 こ のループはフ ラ ッ ト にな り ます。<br />
@I [XFORM-541] Flattening a loop nest 'LOOP_I' in function 'loop_perfect'.<br />
合 成 レポー ト には、 レ イ テンシの 改 善 が 示 さ れます。<br />
+ Summary of loop latency (clock cycles):<br />
+ LOOP_I_LOOP_J:<br />
* Trip count: 400<br />
* Latency: 401<br />
高 位 合 成 japan.xilinx.com 278<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
* Pipeline II: 1<br />
* Pipeline depth:2<br />
デザイ ンにネス ト ループが 含 まれる 場 合 は、 結 果 を 解 析 して、 なるべく 多 くのループがフラッ トになるようにしま<br />
す。 ログ ファイルまたは 上 記 のような 合 成 レポートで、ループ ラベルが 統 合 さ れたかど う かを 確 認 し て く だ さ い<br />
(LOOP_I および LOOP_J は LOOP_I_LOOP_J としてレポートされるようになります)。<br />
ループの 並 列 処 理<br />
Vivado HLS では、 レ イ テンシを 削 減 する ために、 ロ ジ ッ クおよび 関 数 がで き る だけ 早 い 段 階 でス ケジ ュール さ れま<br />
す。 こ れを 実 行 する ため、 な るべ く 多 く の ロ ジ ッ ク 演 算 および 関 数 が 並 列 にス ケジ ュール さ れますが、 ループを 並 列<br />
に 実 行 する こ と はで き ません。<br />
例 3-15 が 合 成 される と、SUM_X ループがス ケジ ュールされ、その 後 SUM_Y ループがス ケジ ュール されます。 SUM_Y<br />
ループの 開 始 は SUM_X ループの 完 了 を 待 つ 必 要 がな く て も、 SUM_X の 後 にスケジ ュールされます。<br />
#include loop_sequential.h<br />
void loop_sequential(din_t A[N], din_t B[N], dout_t X[N], dout_t Y[N],<br />
dsel_t xlimit, dsel_t ylimit) {<br />
dout_t X_accum=0;<br />
dout_t Y_accum=0;<br />
int i,j;<br />
}<br />
}<br />
SUM_X:for (i=0;i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include loop_functions.h<br />
void sub_func(din_t I[N], dout_t O[N], dsel_t limit) {<br />
int i;<br />
dout_t accum=0;<br />
}<br />
SUM:for (i=0;i b)<br />
a -= b;<br />
else<br />
b -= a;<br />
}<br />
こ の 場 合 、 ループはパイ プ ラ イ ン 処 理 で き ません。 ループの 次 の 反 復 は 前 の 反 復 が 終 了 する まで 開 始 で き ないか ら で<br />
す。<br />
すべてのループ 依 存 性 が こ の よ う に 極 端 なわけではあ り ませんが、 ほかの 演 算 が 終 了 する まで 開 始 で き ない 演 算 があ<br />
る こ と に 注 意 し て く だ さ い。ソ リ ューシ ョ ン と し ては、 最 初 の 演 算 がで き る だけ 早 い 段 階 で 実 行 さ れる よ う に し ます。<br />
ループ 依 存 性 はすべてのデータ 型 で 発 生 する 可 能 性 はあ り ますが、 特 に 配 列 を 使 用 する 場 合 に よ く 発 生 し ます。 こ れ<br />
については、 次 の 「 配 列 」 セ ク シ ョ ンで 説 明 し ます。<br />
高 位 合 成 japan.xilinx.com 280<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
C++ クラスのループの 展 開<br />
ループを C++ ク ラ ス で 使 用 する 場 合 、 ループ 帰 納 変 数 が ク ラ スのデータ メ ンバーにな ら ない よ う に 注 意 する 必 要 が<br />
あ り ます。 ループ 帰 納 変 数 が ク ラ スのデータ メ ンバーになる と、 ループを 展 開 でき な く な り ます。<br />
こ の 例 では、 ループ 帰 納 変 数 k がクラス foo_class のメンバーです。<br />
template <br />
class foo_class {<br />
private:<br />
pe_mac mac;<br />
public:<br />
T0 areg;<br />
T0 breg;<br />
T2 mreg;<br />
T1 preg;<br />
T0 shift[N];<br />
int k;<br />
// Class Member<br />
T0 shift_output;<br />
void exec(T1 *pcout, T0 *dataOut, T1 pcin, T3 coeff, T0 data, int col)<br />
{<br />
Function_label0:;<br />
#pragma HLS inline off<br />
SRL:for (k = N-1; k >= 0; --k) {<br />
#pragma HLS unroll// Loop will fail UNROLL<br />
if (k > 0)<br />
shift[k] = shift[k-1];<br />
else<br />
shift[k] = data;<br />
}<br />
*dataOut = shift_output;<br />
shift_output = shift[N-1];<br />
}<br />
*pcout = mac.exec1(shift[4*col], coeff, pcin);<br />
};<br />
UNROLL プ ラ グマ 指 示 子 で 指 定 し た よ う に Vivado HLS でループを 展 開 でき る よ う にするには、 コード を 記 述 し 直<br />
して k をクラス メ ンバーか ら はずす 必 要 があ り ます。<br />
template <br />
class foo_class {<br />
private:<br />
pe_mac mac;<br />
public:<br />
T0 areg;<br />
T0 breg;<br />
T2 mreg;<br />
T1 preg;<br />
T0 shift[N];<br />
T0 shift_output;<br />
void exec(T1 *pcout, T0 *dataOut, T1 pcin, T3 coeff, T0 data, int col)<br />
{<br />
Function_label0:;<br />
int k;<br />
// Local variable<br />
#pragma HLS inline off<br />
SRL:for (k = N-1; k >= 0; --k) {<br />
#pragma HLS unroll// Loop will unroll<br />
高 位 合 成 japan.xilinx.com 281<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
if (k > 0)<br />
shift[k] = shift[k-1];<br />
else<br />
shift[k] = data;<br />
}<br />
*dataOut = shift_output;<br />
shift_output = shift[N-1];<br />
}<br />
*pcout = mac.exec1(shift[4*col], coeff, pcin);<br />
};<br />
配 列<br />
コード 形 式 によ って 合 成 後 の 配 列 のイ ンプ リ メ ンテーシ ョ ンがどのよ う に 変 わるかについて 説 明 する 前 に、 C シミュ<br />
レーシ ョ ンなど 合 成 が 実 行 さ れる 前 に 発 生 する 可 能 性 のあ る 問 題 について 説 明 し ます。<br />
次 のよ う にかな り 大 き な 配 列 が 指 定 される 場 合 は、 C シ ミ ュ レーシ ョ ンで メ モ リ 不 足 に よ り エ ラーにな る 可 能 性 があ<br />
り ます。 こ の 例 は、 合 成 用 の 関 数 は 示 さず、 大 き な 配 列 と 任 意 精 度 型 の 大 き な 配 列 が ラ ン タ イ ム メモリにどのように<br />
影 響 を 与 え る かを 示 し ています。<br />
#include ap_cint.h<br />
int main() {<br />
int i, acc;<br />
// Use an arbitrary precision type<br />
int32 la0[10000000], la1[10000000];<br />
for (i=0 ; i < 10000000; i++) {<br />
acc = acc + la0[i] + la1[i];<br />
}<br />
return 0;<br />
}<br />
シ ミ ュ レーシ ョ ンは メ モ リ 不 足 でエ ラーにな る こ と があ り ます。 こ れは、 メ モ リ に 存 在 する ス タ ッ ク に 配 列 が 配 置 さ<br />
れ、 OS で 管 理 されて ローカル デ ィ ス ク 空 間 を 使 用 する ヒ ープには 配 置 さ れないためです。<br />
こ れに よ り 、デザ イ ンが 実 行 する と メ モ リ 不 足 にな り 、 次 の よ う に、 状 況 に よ っては 問 題 が 悪 化 する こ と も あ り ます。<br />
• PC では 使 用 可 能 な メ モ リ が 大 型 の Linux ボ ッ ク ス よ り も 少 ない こ と が よ く あ り 、 使 用 可 能 な メ モ リ が 少 ない こ<br />
とがあります。<br />
• 任 意 精 度 型 を 使 用 する と 、 標 準 C 型 よ り も 多 く の メ モ リ が 必 要 にな る ので、 こ の 問 題 が 悪 化 する 可 能 性 があ り ま<br />
す。<br />
• C++ および SystemC の よ り 複 雑 な 固 定 小 数 点 任 意 精 度 型 を 使 用 する と 、 さ ら に 多 く の メ モ リ が 必 要 と な る ので、<br />
問 題 が 悪 化 する 可 能 性 があ り ます。<br />
次 の 例 のよ う に、 シ ミ ュ レーシ ョ ンにはダイナ ミ ッ ク メモリ 割 り 当 てを、 合 成 には 固 定 サイズの 配 列 を 使 用 して、 問<br />
題 を 回 避 し て く だ さ い。 こ の 場 合 、 こ 必 要 な メ モ リ は ヒ ープに 割 り 当 て ら れ、 OS で 管 理 されるので、 ローカル ディ<br />
スク 空 間 が 使 用 できるようになります。<br />
こ の よ う な コー ド への 変 更 は、 シ ミ ュ レーシ ョ ン さ れる コー ド と 合 成 さ れる コー ド が 異 なって し ま う ため、 理 想 的 で<br />
はあ り ませんが、 デザ イ ン を 実 行 する には こ れし か 方 法 がない 場 合 があ り ます。 こ れを 実 行 し た 場 合 は、 C テス トベ<br />
ンチでこ の 配 列 にア ク セスするすべての 点 が 記 述 される よ う にし て く ださ い。 これによ り 、 cosim_design で 実 行<br />
される RTL シミュレーションでメモリ ア ク セスが 正 しいかど う かが 検 証 される よ う にな り ます。<br />
高 位 合 成 japan.xilinx.com 282<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include ap_cint.h<br />
int main() {<br />
int i, acc;<br />
#ifdef __SYNTHESIS__<br />
// Use an arbitrary precision type & array for synthesis<br />
int32 la0[10000000], la1[10000000];<br />
#else<br />
// Use an arbitrary precision type & dynamic memory for simulation<br />
int32 la0 = malloc(10000000 * sizeof(int32));<br />
int32 la1 = malloc(10000000 * sizeof(int32));<br />
#endif<br />
for (i=0 ; i < 10000000; i++) {<br />
acc = acc + la0[i] + la1[i];<br />
}<br />
return 0;<br />
}<br />
配 列 は、 通 常 合 成 後 に メ モ リ (RAM、 ROM、 または FIFO) としてインプリメントされます。285 ページに 記 述 し た よ<br />
う に、 最 上 位 関 数 イ ン ターフ ェ イ スの 配 列 は メ モ リ 外 部 にア ク セ スする RTL ポー ト と して 合 成 されます。 デザイ ン<br />
に 対 し て 内 部 にあ る 配 列 は、 最 適 化 設 定 に よ って 内 部 ブ ロ ッ ク RAM、LUTRAM ま たはレ ジ ス タ と し て 合 成 さ れます。<br />
ループ と 同 様 、 配 列 も 簡 単 な コー ド 構 文 なので、 C プログラムでよ く 使 用 されます。 また、 ループのよ うに、 Vivado<br />
HLS には 多 く の 最 適 化 が 含 まれ、 コー ド を 修 正 し な く て も RTL の イ ンプ リ メ ンテーシ ョ ン を 最 適 化 する ための 指 示<br />
子 が 含 まれます。<br />
配 列 に よ り RTL で 問 題 と な るのは、 次 のよ う な 場 合 です。<br />
• 配 列 ア ク セスがパフ ォーマン スの 障 害 と なって し ま う こ と が よ く あ り ます。 メ モ リ と し て イ ンプ リ メ ン ト さ れる<br />
と、 メモリ ポー ト の 数 に よ り データへのア ク セスが 制 限 さ れます。<br />
• 配 列 初 期 化 は、 注 意 し て 実 行 し ない と 、 RTL での リ セ ッ ト および 初 期 化 が 不 必 要 に 長 く なって し ま う こ と があ り<br />
ます。<br />
• 読 み 込 みア ク セスのみを 必 要 と する 配 列 は、 RTL では ROM と し て イ ンプ リ メ ン ト さ れる よ う にする 必 要 があ り<br />
ます。<br />
Vivado HLS では、 ポイ ン ターの 配 列 がサポー ト されます。 詳 細 は、300 ページを 参 照 して く ださい。 各 ポインターは、<br />
ス カ ラーま たはス カ ラーの 配 列 のみを 指 定 で き ます。<br />
注 記 : 配 列 はサ イ ズ 指 定 する 必 要 があ り ます。<br />
サポー ト される 例 :Array[10];<br />
サポー ト されない 例 :Array[];<br />
高 位 合 成 japan.xilinx.com 283<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
配 列 ア ク セス とパフ ォーマンス<br />
例 3-17 の コー ド では、 配 列 へのア ク セ スに よ り 最 終 RTL デザイ ンでパフ ォーマン スが 制 限 されます。 mem[N] 配 列<br />
へのア ク セスが 3 回 あ り 、 合 計 結 果 が 作 成 さ れています。<br />
#include array_mem_bottleneck.h<br />
dout_t array_mem_bottleneck(din_t mem[N]) {<br />
dout_t sum=0;<br />
int i;<br />
SUM_LOOP:for(i=2;i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include array_mem_perform.h<br />
dout_t array_mem_perform(din_t mem[N]) {<br />
din_t tmp0, tmp1, tmp2;<br />
dout_t sum=0;<br />
int i;<br />
tmp0 = mem[0];<br />
tmp1 = mem[1];<br />
SUM_LOOP:for (i = 2; i < N; i++) {<br />
tmp2 = mem[i];<br />
sum += tmp2 + tmp1 + tmp0;<br />
tmp0 = tmp1;<br />
tmp1 = tmp2;<br />
}<br />
}<br />
return sum;<br />
例 3‐18 : パフォーマンス アクセスを 使 用 した 配 列 と メモリ<br />
Vivado HLS には、 配 列 の イ ンプ リ メ ン ト およびア ク セス 方 法 を 変 更 で き る 最 適 化 指 示 子 が 多 く あ り ます。 通 常 、 こ の<br />
よ う な 指 示 子 が 使 用 さ れる 場 合 、 コー ド を 変 更 する 必 要 はあ り ません。 配 列 は、 ブ ロ ッ ク ま たは 個 別 エレ メ ン ト に 分<br />
割 でき ます。 Vivado HLS で 配 列 が 個 別 エレ メ ン ト に 分 割 さ れる こ と も あ り ます。 こ れは、 自 動 分 割 のコ ン フ ィ ギ ュ<br />
レーシ ョ ン 設 定 を 使 用 する と 指 定 で き ます。<br />
配 列 が 複 数 のブロ ッ ク に 分 割 される と 、 1 つの 配 列 は 複 数 の RTL RAM ブロック としてインプリ メン ト されます。 エ<br />
レメントに 分 割 される 場 合 、 各 エレメントは RTL でレジスタ と してインプリ メン ト されます。 どちらの 場 合 も、 分<br />
割 で さ ら に 多 く のエレ メ ン ト が 並 列 にア ク セスで き る よ う にな り 、 パフ ォーマン スが 向 上 し ます。 デザイ ンの ト レー<br />
ド オフは、 パフ ォーマン ス と それを 達 成 する ために 必 要 な RAM またはレジスタの 数 です。<br />
FIFO アクセス<br />
配 列 ア ク セスに 特 に 注 意 が 必 要 なのは、 配 列 が FIFO と し て イ ンプ リ メ ン ト さ れる 場 合 です。 よ く あ る のは、 dataflow<br />
最 適 化 を 使 用 する 場 合 です。<br />
FIFO へのア ク セスは、 位 置 0 か ら 開 始 し てシーケンシ ャルな 順 番 であ る 必 要 があ り ます。 ま た、 配 列 が 複 数 位 置 で<br />
読 み 込 まれる 場 合 、 コー ド では FIFO ア ク セスの 順 番 を 厳 し く 指 定 する 必 要 があ り ます。 複 数 フ ァ ンア ウ ト を 含 む 配<br />
列 は、 ア ク セ スの 順 番 を 指 定 する コー ド を 追 加 し ない と 、 FIFO としてインプリメントできないことがよくあります。<br />
イ ン タ ーフ ェ イ スの 配 列<br />
Vivado HLS では、 配 列 が メ モ リ エレ メ ン ト にデフ ォル ト で 合 成 さ れます。 配 列 が 最 上 位 関 数 への 引 数 と し て 使 用 さ<br />
れる と、 メモリはオフチップである と 仮 定 され、インターフェイス ポー ト が メ モ リ にア クセスするために 合 成 されま<br />
す。<br />
Vivado HLS には、 こ れ ら のポー ト の 作 成 方 法 を 設 定 する 機 能 があ り ます。<br />
• メモリは、 シングルまたはデュアル ポー ト RAM として 指 定 できます。<br />
• インターフェイスは、 FIFO インターフェイスとして 指 定 できます。<br />
• インターフェイスは、 ap_bus インターフェイスとして 指 定 できます。<br />
• Vivado HLS の 配 列 最 適 化 指 示 子 (Array_Partition、 Array_Map および Array_Reshape) を 使 用 する と 、 配 列 の 構 造 を<br />
設 定 し 直 せ、 I/O ポー ト の 数 も 変 更 で き ます。<br />
データへのア ク セスが メ モ リ (RAM または FIFO) ポー ト からに 制 限 されるため、 イ ン ターフ ェ イ スの 配 列 によ り パ<br />
フ ォーマン スに 障 害 が 出 る こ と があ り ます。 こ れら の 障 害 は、 通 常 指 示 子 を 使 用 する と 回 避 で き ます。<br />
高 位 合 成 japan.xilinx.com 285<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
合 成 可 能 な コー ド で 配 列 を 使 用 する 場 合 は、 配 列 を 必 ずサ イ ズ 指 定 する 必 要 があ り ます。 た と えば、 例 3-19 の 宣 言<br />
d_i[4] が d_i[] に 変 更 される と 、 Vivado HLS でデザ イ ンが 合 成 で き ない こ と を 示 す メ ッ セージが 表 示 さ れます。<br />
@E [SYNCHK-61] array_RAM.c:52: unsupported memory access on variable 'd_i' which is (or contains) an array with<br />
unknown size at compile time.<br />
配 列 イ ン タ ーフ ェ イ ス<br />
どのタイプの RAM を 使 用 する か (シングル ポー ト とデュアル ポー ト のどち らの RAM ポー ト を 作 成 するか) を 明 示<br />
的 に 指 定 する には、 resource 指 示 子 を 使 用 し ます。 resource 指 示 子 が 指 定 さ れない 場 合 、 Vivado HLS では 次 が 使 用 さ<br />
れます。<br />
• シングル ポー ト RAM (デフォル ト )<br />
• 開 始 間 隔 やレ イ テンシが 削 減 さ れる 場 合 はデュ アル ポー ト RAM<br />
インターフェイスで 配 列 をリコンフィギュレーションするには、 partition、 map および reshape 指 示 子 を 指 定 し ます。<br />
配 列 は 複 数 の 小 さい 配 列 に 分 割 でき、 それぞれに 別 のイ ン ターフ ェ イ ス を 使 用 でき ます。 これには、 配 列 のすべての<br />
エレ メン ト をスカラー エレ メ ン ト に 分 割 で き る 機 能 も 含 まれます。 関 数 イ ン ターフ ェ イ スの 場 合 は、 配 列 のすべての<br />
エレ メ ン ト に 対 し てそれぞれ 別 のポー ト が 作 成 さ れます。 こ れに よ り 並 列 ア ク セスは 最 大 にな り ますが、 さ ら にポー<br />
ト が 作 成 さ れる ため、 上 の 階 層 で 配 線 問 題 が 発 生 する こ と があ り ます。<br />
同 様 に、 小 さ い 配 列 が 1 つの 大 きな 配 列 にま と められ、 1 つのイ ン ターフ ェ イ スになって し ま う こ と があ り ます。 こ<br />
の 場 合 、 オフチ ッ プ ブロック RAM へのマ ッ プは 改 善 さ れますが、 パフ ォーマン スに 障 害 が 出 る 可 能 性 があ る こ と に<br />
注 意 し て く だ さ い。 こ れら の ト レー ド オフは Vivado HLS の 最 適 化 指 示 子 を 使 用 する と 発 生 する ので、 コー ド 自 体 に<br />
は 影 響 し ません。<br />
例 3-19 に 示 す 関 数 の 配 列 引 数 は、 デフ ォル ト でシン グル ポー ト RAM インターフェイスに 合 成 されます。<br />
#include array_RAM.h<br />
void array_RAM (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {<br />
int i;<br />
}<br />
For_Loop: for (i=0;i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
Vivado HLS では、 ア クセスがシーケンシャルであるかど う かが 判 断 されます。<br />
表 3‐1:Vivado HLS のシーケンシャル アクセス 解 析<br />
シーケンシャル アクセス<br />
Vivado HLS の 動 作<br />
○ • FIFO ポー ト を イ ンプ リ メ ン ト<br />
× • エラー メッセージを 表 示<br />
• 合 成 を 停 止<br />
中 間 • 警 告 を 表 示<br />
• FIFO ポー ト を イ ンプ リ メ ン ト<br />
注 記 : ア ク セスが 実 際 にシーケンシ ャルではなかった 場 合 、 RTL シ ミ ュ レーシ ョ ン 不 一 致 にな り ます。<br />
例 3-20 は、 Vivado HLS がアクセスがシーケンシャルかど う か 判 断 できない 例 を 示 しています。 この 例 では、 d_i と<br />
d_o の 両 方 が 合 成 中 にFIFO インターフェイスを 使 用 してインプリ メン ト されるよ うに 指 定 されています。<br />
#include array_FIFO.h<br />
void array_FIFO (dout_t d_o[4], din_t d_i[4], didx_t idx[4]) {<br />
int i;<br />
}<br />
// Breaks FIFO interface d_o[3] = d_i[2];<br />
For_Loop: for (i=0;i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
最 上 位 イ ン ターフ ェ イ スに 配 列 を イ ンプ リ メ ン ト ま たは 最 適 化 する のに、 コー ド を 変 更 する 必 要 は 通 常 あ り ません。<br />
イ ン ターフ ェ イ スの 配 列 のコード を 変 更 する 必 要 があ るのは、 配 列 が 構 造 体 (struct) の 一 部 であ る 場 合 のみです。<br />
配 列 の 初 期 化<br />
推 奨 : 298 ページで 示 すとお り 、 必 須 ではあ り ませんが、 static 修 飾 子 を 使 用 し て メ モ リ と し て イ ンプ リ メ ン ト さ れる<br />
配 列 を 指 定 する こ と をお 勧 め し ます。 こ れに よ り 、 Vivado HLS で RTL のメモリを 使 用 して 配 列 をインプリ メントで<br />
きるようになるほか、 static 型 の 初 期 化 動 作 を 使 用 で き る よ う にな り ます。<br />
次 のコー ド 例 では、 配 列 は 値 のセ ッ ト を 使 用 し て 初 期 化 さ れます。 関 数 が 実 行 さ れる たびに、 coeff 配 列 に こ れら の<br />
値 が 代 入 さ れます。 合 成 後 、 coeff をインプリ メントする RAM が 実 行 さ れる たびに、 こ れ ら の 値 が 読 み 込 まれます。<br />
シングル ポー ト RAM の 場 合 は、 8 クロック サイクルかかり ます。1024 の 配 列 の 場 合 、 当 然 1024 クロック サイクル<br />
かか り ます。 こ の 間 、 coeff によ っては 演 算 が 行 われません。<br />
int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8, -2};<br />
次 のコード では、 static 修 飾 子 を 使 用 し て coeff 配 列 を 定 義 し ています。 配 列 は 実 行 開 始 時 に 指 定 し た 値 で 初 期 化 さ れ<br />
ます。 関 数 が 実 行 されるたびに、 coeff 配 列 には 前 の 実 行 か ら の 値 が 記 録 さ れます。 C コードでは、 static 配 列 は メ モ<br />
リが RTL で 動 作 する よ う に 動 作 し ます。<br />
static int coeff[8] = {-2, 8, -4, 10, 14, 10, -4, 8, -2};<br />
また、 変 数 に static 修 飾 子 が 含 まれる 場 合 、 Vivado HLS はRTL デザイ ンおよび FPGA ビッ トスト リームの 変 数 を 初 期<br />
化 し ます。 こ れに よ り 、 メ モ リ を 初 期 化 する のに 複 数 ク ロ ッ ク サ イ ク ル も 必 要 な く な り 、 大 容 量 メ モ リ の 初 期 化 が 使<br />
用 オーバーヘ ッ ド にな ら な く な り ます。<br />
リセットを 適 用 した (デフォル ト ではない) 後 に static 変 数 がその 初 期 ス テー ト を 戻 すかど う かは、 RTL コンフィギュ<br />
レーシ ョ ン コ マン ド で 指 定 で き ます。 メ モ リ が リ セ ッ ト 後 に 初 期 ス テー ト に 戻 る のであれば、 使 用 オーバーヘ ッ ド に<br />
なり、 値 をリセットするのに 複 数 サイクルが 必 要 となり、 値 はそれぞれ 各 メモリ アド レスに 書 き 出 される 必 要 があ り<br />
ます。<br />
ROM のインプリ メン ト<br />
例 3-31 に 示 すよ う に、Vivado HLS では メ モ リ を 合 成 する のに static 修 飾 子 、その メ モ リ を ROM に 推 論 する のに const<br />
修 飾 子 を 使 用 し て 配 列 を 指 定 する 必 要 はあ り ません。 Vivado HLS は、 デザ イ ンの 解 析 を 実 行 し、 最 も 最 適 なハー ド<br />
ウ ェ ア を 作 成 し よ う と し ますが、<br />
メモリにする 配 列 には static 修 飾 子 を 使 用 する こ と をお 勧 め し ます。 こ れは、 「 配 列 の 初 期 化 」 に 示 すよ う に、 static<br />
型 が RTL の メ モ リ と ほぼ 同 じ よ う に 動 作 する ためです。<br />
Vivado HLS では 常 に ROM がデザ イ ン 解 析 で 使 用 さ れる よ う に 推 論 さ れる わけではないので、 配 列 が 読 み 込 み 専 用 の<br />
場 合 は、 const 修 飾 子 も 推 奨 さ れます。 ローカルの static (グローバル 以 外 ) 配 列 は 読 み 込 みの 前 に 書 き 出 さ れる 必 要 が<br />
あるというのが ROM の 自 動 推 論 の 一 般 的 な 規 則 です。 次 の 例 の よ う に 指 定 する と 、ROM が 推 論 されやす く な り ます。<br />
• 配 列 をそれを 使 用 する 関 数 でで き る だけ 早 い 段 階 で 初 期 化 し ます。<br />
• 書 き 出 しをま とめます。<br />
• array(ROM) 初 期 化 書 き 出 し を 初 期 化 コー ド 以 外 の コー ド で イ ン ター リ ーブ し ない よ う に し ます。<br />
• 異 なる 値 を 同 じ 配 列 エレ メ ン ト に 格 納 しないよ う にし ます ( 書 き 出 しはすべてコード 内 でま とめます)。<br />
• エレ メ ン ト 値 の 計 算 は、 初 期 化 ループ カ ウ ン ター 変 数 を 除 いて、 定 数 以 外 (コンパイル 時 ) のデザイ ン 変 数 に 依<br />
存 しないよ うにします。<br />
ROM を 初 期 化 する のに 複 雑 な 代 入 が 使 用 さ れる 場 合 、 た と えば math.h ラ イ ブ ラ リ か ら の 関 数 例 では、 配 列 初 期 化 を<br />
別 々の 関 数 に 配 置 する と 、 ROM が 推 論 される よ う にでき ます。 例 3-21 では、 sin_table[256] 配 列 が メ モ リ と し て 推 論<br />
され、 RTL 合 成 後 は ROM としてインプリメントされます。<br />
高 位 合 成 japan.xilinx.com 288<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include array_ROM_math_init.h<br />
#include <br />
void init_sin_table(din1_t sin_table[256])<br />
{<br />
int i;<br />
for (i = 0; i < 256; i++) {<br />
dint_t real_val = sin(M_PI * (dint_t)(i - 128) / 256.0);<br />
sin_table[i] = (din1_t)(32768.0 * real_val);<br />
}<br />
}<br />
dout_t array_ROM_math_init(din1_t inval, din2_t idx)<br />
{<br />
short sin_table[256];<br />
init_sin_table(sin_table);<br />
return (int)inval * (int)sin_table[idx];<br />
}<br />
例 3‐21 : math.h を 使 用 した ROM の 初 期 化<br />
ヒント : sin() 関 数 の 結 果 は 定 数 値 にな る ので、 sin() 関 数 を イ ンプ リ メ ン ト する のに、 RTL デザイ ンでコ アは 必 要 あ り<br />
ません。 sin() 関 数 は 表 3-2 にリストされるコアの 1 つではないので、 C の 合 成 でサポー ト されません (C++ で math.h<br />
関 数 を 使 用 する 場 合 は、 「SystemC の 合 成 」 を 参 照 して く ださい)。<br />
データ 型<br />
実 行 ファイルへコンパイルされる C 関 数 で 使 用 さ れるデータ 型 は、 結 果 の 精 度 、 メ モ リ 要 件 、 パフ ォーマン スに 影 響<br />
します。<br />
• 32 ビット 整 数 の int データ 型 には、 さ ら に 多 く のデータ を 保 持 で き る ので、 8 ビッ トの char 型 よ り も 精 度 が 高 く<br />
な り ますが、 さ らに 多 く のス ト レージが 必 要 と な り ます。<br />
• 64 ビッ トの long long 型 が 32 ビッ ト シ ス テムで 使 用 さ れる と 、 こ の よ う な 値 を 読 み 込 みおよび 書 き 出 しする た<br />
めに 通 常 複 数 ア ク セスが 必 要 にな る ので、 ラ ン タ イ ムに 影 響 がでます。<br />
同 様 に、 C 関 数 が RTL インプリ メンテーションに 合 成 される 場 合 も、 データ 型 が RTL デザ イ ンの 精 度 、 エ リ ア、 パ<br />
フ ォーマン スに 影 響 し ます。 変 数 に 使 用 さ れるデータ 型 に よ り 、 必 要 な 演 算 子 のサ イ ズが 決 ま る ので、 RTL のエ リ ア<br />
およびパフォーマンスも 決 ま り ます。<br />
Vivado HLS では、 固 定 長 整 数 型 を 含 むすべての 標 準 C データ 型 の 合 成 がサポー ト さ れます。<br />
• (unsigned) char、 (unsigned) short、 (unsigned) int<br />
• (unsigned) long、 (unsigned) long long<br />
• (unsigned) intN_t (N は stdint.h で 定 義 される 8、 16、 32 および 64)<br />
• float、 double<br />
固 定 長 整 数 型 を 使 用 する と 、 デザ イ ン をシ ス テムのすべてのデータ 型 間 でポータ ブルにで き ます。<br />
整 数 型 (unsigned) long は 64 ビッ トを 64 ビッ ト OS、 32 ビットを 32 ビッ ト OS と し て イ ンプ リ メ ン ト し ます。 合 成 で<br />
はこのビヘイビアが 比 較 され、Vivado HLS が 実 行 される OS タ イ プに よ って、 異 な る サ イ ズの 演 算 子 が 生 成 さ れるの<br />
で、 異 な る RTL デザイ ンが 生 成 されます。<br />
• 32 ビ ッ ト の 場 合 、(unsigned) long データ 型 の 代 わ り に、(unsigned) int または (unsigned)int32_t を 使 用 する 必 要 があ<br />
ります。<br />
高 位 合 成 japan.xilinx.com 289<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
• 64 ビ ッ ト の 場 合 、 (unsigned)long データ 型 の 代 わ り に、 (unsigned)long long または (unsigned)int64_t を 使 用 する 必<br />
要 があ り ます。<br />
すべての 変 数 のデータ 型 を 1 つの 共 通 のヘ ッ ダー フ ァ イルで 定 義 する こ と をお 勧 め し ます。 こ のフ ァ イルは、すべて<br />
のソース ファイルに 含 めることができます。<br />
• 通 常 の 高 位 合 成 プ ロ ジ ェ ク ト フ ロー 中 には、た と えばサ イ ズを 削 減 し た り 、ハー ド ウ ェ ア インプリ メンテーショ<br />
ン を も っ と 効 率 的 にで き る よ う にする ために、 変 更 可 能 なデータ 型 があ り ます。<br />
• 抽 象 度 の 高 いレベルで 変 更 を し てお く 利 点 の 1 つは、 新 しいデザイ ン イ ンプ リ メ ンテーシ ョ ン を 素 早 く 作 成 で き<br />
る 点 にあ り ます。 通 常 同 じ フ ァ イルが 後 のプ ロ ジ ェ ク ト で 使 用 さ れますが、 別 の (よ り 小 型 、 よ り 大 型 、 ま たは<br />
よ り 正 確 な) データ 型 を 使 用 する こ と も で き ます。<br />
これらのタスクはどちらも、データ 型 が 1 つの 箇 所 で 変 更 で き る 場 合 は、よ り 簡 単 に 達 成 で き ます。 または、 複 数 ファ<br />
イルを 編 集 します。<br />
ヒント : ヘッダー フ ァ イルでマ ク ロ を 使 用 する 場 合 は、 常 に 独 自 の 名 前 を 使 用 し て く だ さ い。 た と えば、 _TYPES_H<br />
という 名 前 のマクロがヘッダー フ ァ イルで 定 義 さ れてい る 場 合 、よ く あ る 名 前 なのでほかのフ ァ イルで 定 義 さ れてい<br />
る 可 能 性 があ り 、 ほかの コー ド を イ ネーブルま たはデ ィ スエーブルし て し ま って、 予 測 で き ない 問 題 が 発 生 する こ と<br />
もあります。<br />
標 準 デー タ 型<br />
例 3-22 は、 実 行 さ れる 基 本 的 な 演 算 子 のい く つかを 示 し ています。<br />
#include types_standard.h<br />
void types_standard(din_A inA, din_B inB, din_C inC, din_D inD,<br />
dout_1 *out1, dout_2 *out2, dout_3 *out3, dout_4 *out4<br />
){<br />
}<br />
// Basic arithmetic operations<br />
*out1 = inA * inB;<br />
*out2 = inB + inA;<br />
*out3 = inC / inA;<br />
*out4 = inD % inA;<br />
例 3‐22 : 基 本 的 演 算<br />
例 3-22 のデータ 型 はヘッ ダー ファイル cpp_ap_int_arith.h で 定 義 されています ( 例 3-23)。 こ れには、 次 のデータ 型 を<br />
どの よ う に 使 用 する かが 示 さ れています。<br />
• 標 準 符 号 付 き 型<br />
• 符 号 な し 型<br />
• 固 定 長 整 数 型 (stdint.h ヘッダー ファイルを 含 有 )<br />
#include <br />
#include <br />
#define N 9<br />
typedef char din_A;<br />
typedef short din_B;<br />
typedef int din_C;<br />
typedef long long din_D;<br />
高 位 合 成 japan.xilinx.com 290<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
typedef int dout_1;<br />
typedef unsigned char dout_2;<br />
typedef int32_t dout_3;<br />
typedef int64_t dout_4;<br />
void types_standard(din_A inA,din_B inB,din_C inC,din_D inD,dout_1<br />
*out1,dout_2 *out2,dout_3 *out3,dout_4 *out4);<br />
例 3‐23 : 基 本 的 な 演 算 デー タ 型 定 義<br />
こ れ ら のデータ 型 は、 合 成 後 、 次 の 演 算 子 およびポー ト サイズになり ます。<br />
• out1 結 果 を 計 算 する ために 使 用 さ れる 乗 算 器 は 24 ビ ッ ト 乗 算 器 にな り ます。こ れは 8 ビッ トの char 型 が 16 ビッ<br />
トの short で 乗 算 されるには、 24 ビ ッ ト 乗 算 器 が 必 要 だか ら です。 結 果 は、 出 力 ポー ト 幅 と 一 致 する よ う に 32<br />
ビ ッ ト まで 符 号 拡 張 さ れます。<br />
• out2 に 使 用 さ れる 加 算 器 は 8 ビ ッ ト です。 出 力 が 8 ビッ トの unsigned char 型 なので、inB (16 ビッ トの short) の 下<br />
位 8 ビッ トのみが 8 ビッ トの char 型 の inA へ 追 加 さ れます。<br />
• out3 (32 ビ ッ ト の 固 定 幅 型 ) 出 力 の 場 合 、8 ビットの char 型 の inA が 32 ビッ ト 値 に 拡 張 され、32 ビッ ト (int 型 ) の<br />
inC 入 力 を 使 用 し て 32 ビ ッ ト の 除 算 演 算 が 実 行 さ れます。<br />
• 64 ビット モジ ュールの 演 算 は 64 ビットの long long 型 inD と 64 ビ ッ ト に 符 号 拡 張 さ れた 8 ビットの char 型 inA<br />
を 使 用 して 実 行 され、 64 ビ ッ ト の 出 力 結 果 out4 が 作 成 されます。<br />
out1 結 果 が 示 すよ う に、 Vivado HLS では 可 能 な 限 り 最 小 の 演 算 子 が 使 用 さ れ、 結 果 が 拡 張 さ れて、 必 要 な 出 力 ビ ッ<br />
ト 幅 に 一 致 する よ う に さ れます。 out2 結 果 の 場 合 、 入 力 の 1 つが 16 ビッ トであっても、8 ビッ ト 出 力 しか 必 要 でない<br />
ため、 8 ビ ッ ト 加 算 器 が 使 用 で き ます。 out3 および out4 結 果 が 示 すよ う に、 すべてのビ ッ ト が 必 要 であれば、 フルサ<br />
イ ズの 演 算 子 が 合 成 さ れます。<br />
float および double 型<br />
Vivado HLS では、 合 成 で float および double 型 がサポー ト されます。 どち らのデータ 型 も IEEE-754 規 格 に 従 って 合<br />
成 されます。<br />
• 単 精 度 32 ビッ ト<br />
° 仮 数 部 24 ビッ ト<br />
° 指 数 部 8 ビッ ト<br />
• 単 精 度 64 ビッ ト<br />
° 仮 数 部 53 ビッ ト<br />
° 指 数 部 11 ビッ ト<br />
float および double 型 は、 標 準 演 算 (+、 -、 * など) に 使 用 する だけでな く 、 math.h (C++ の 場 合 は cmath.h) でもよ く 使<br />
用 さ れます。 こ のセ ク シ ョ ンでは、 標 準 演 算 のサポー ト について 説 明 さ れます。 C および C++ の math ライブラリを<br />
合 成 する 方 法 の 詳 細 は、 「hls_math ライブラリ」 を 参 照 して く ださい。<br />
例 3-24 は、 例 3-22 で 使 用 されたヘッ ダー ファイルに double および float データ 型 を 定 義 し た も のです。<br />
高 位 合 成 japan.xilinx.com 291<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include <br />
#include <br />
#include <br />
#define N 9<br />
typedef double din_A;<br />
typedef double din_B;<br />
typedef double din_C;<br />
typedef float din_D;<br />
typedef double dout_1;<br />
typedef double dout_2;<br />
typedef double dout_3;<br />
typedef float dout_4;<br />
void types_float_double(din_A inA,din_B inB,din_C inC,din_D inD,dout_1<br />
*out1,dout_2 *out2,dout_3 *out3,dout_4 *out4);<br />
例 3‐24 : float および double 型<br />
このアップデート されたヘッダー ファイルは、sqrtf() 関 数 が 使 用 さ れる 例 3-25 で 使 用 されます。<br />
#include types_float_double.h<br />
void types_float_double(<br />
din_A inA,<br />
din_B inB,<br />
din_C inC,<br />
din_D inD,<br />
dout_1 *out1,<br />
dout_2 *out2,<br />
dout_3 *out3,<br />
dout_4 *out4<br />
) {<br />
}<br />
// Basic arithmetic & math.h sqrtf()<br />
*out1 = inA * inB;<br />
*out2 = inB + inA;<br />
*out3 = inC / inA;<br />
*out4 = sqrtf(inD);<br />
例 3‐25 : float および double 型 の 使 用<br />
例 3-25 が 合 成 される と、 64 ビ ッ ト の 倍 精 度 乗 算 、 加 算 、 除 算 演 算 子 にな り ます。 こ れ ら の 演 算 子 は 適 切 な 浮 動 小 数<br />
点 のザイ リ ン ク ス CORE Generator コアでインプリ メント されます。<br />
sqrtf() を 使 用 する 平 方 根 は、 32 ビ ッ ト の 単 精 度 浮 動 小 数 点 コ アを 使 用 し て イ ンプ リ メ ン ト さ れます。<br />
倍 精 度 の 平 方 根 関 数 sqrt() が 使 用 される と 、 inD で 使 用 さ れる 単 精 度 float 型 の 型 変 換 のために ロ ジ ッ ク が 追 加 さ れま<br />
す。 out4: sqrt() は 倍 精 度 (double) 関 数 、 sqrtf() は 単 精 度 (float) 関 数 です。<br />
C 関 数 では、 float-to-double および double-to-float 変 換 ユニ ッ ト がハー ド ウ ェ アで 推 論 さ れる ので、 float 型 と double 型<br />
を 混 合 する 場 合 には 注 意 が 必 要 です。<br />
高 位 合 成 japan.xilinx.com 292<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
次 のよ う なコード があ る と し ます。<br />
float foo_f = 3.1459;<br />
float var_f = sqrt(foo_f);<br />
これは 次 のよ うなハードウェアになり ます。<br />
wire(foo_t)<br />
→ Float-to-Double Converter unit<br />
→ Double-Precision Square Root unit<br />
→ Double-to-Float Converter unit<br />
→ wire (var_f)<br />
sqrtf() 関 数 を 使 用 する と 、 次 が 可 能 にな り ます。<br />
• ハー ド ウ ェ アで 型 コ ンバーターの 必 要 がな く な る<br />
• エ リ アが 節 約 さ れる<br />
• タ イ ミ ングが 改 善 さ れる<br />
float 型 および double 型 の 演 算 は、 浮 動 小 数 点 演 算 子 の LogicCORE コアに 合 成 されます。 表 3-2 は、 各 ザイ リ ン ク ス<br />
フ ァ ミ リ で 使 用 可 能 な コ ア を 示 し ています。<br />
テ ク ノ ロ ジで 特 定 の LogiCORE エレメン トがサポート されない ( 表 3-2 で X で 表 示 される) 場 合 は、デザ イ ンが 合 成 で<br />
きず、 エラー メ ッ セージが 表 示 さ れて、 エ ラー メ ッ セージが 表 示 さ れて Vivado HLS が 停 止 し ます。<br />
表 3‐2: 浮 動 小 数 点 コ ア<br />
コア 7 シリーズ Virtex‐6 Virtex‐5 Virtex‐4 Spartan‐6 Spartan‐3<br />
FAddSub X X X X X X<br />
FAddSub_nodsp X X X - - -<br />
FAddSub_fulldsp X X X - - -<br />
FCmp X X X X X X<br />
FDiv X X X X X X<br />
FMul X X X X X X<br />
FExp_nodsp<br />
FExp_meddsp<br />
FExp_fulldsp<br />
X<br />
X<br />
X<br />
FMul_nodsp X X X - X X<br />
FMul_meddsp X X X - X X<br />
FMul_fulldsp X X X - X X<br />
FMul_maxdsp X X X - X X<br />
DAddSub X X X X X X<br />
DAddSub_nodsp X X X - - -<br />
DAddSub_fulldsp X X X - - -<br />
DCmp X X X X X X<br />
DDiv X X X X X X<br />
DMul X X X X X X<br />
DExp_nodsp<br />
X<br />
高 位 合 成 japan.xilinx.com 293<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
表 3‐2: 浮 動 小 数 点 コ ア ( 続 き)<br />
コア 7 シリーズ Virtex‐6 Virtex‐5 Virtex‐4 Spartan‐6 Spartan‐3<br />
DExp_meddsp<br />
DExp_fulldsp<br />
X<br />
X<br />
DMul_nodsp X X X - X X<br />
DMul_meddsp X X X - - -<br />
DMul_fulldsp X X X - X X<br />
DMul_maxdsp X X X - X X<br />
表 3-2 のコアでは、 多 数 の DSP48 が 使 用 されるか、 1 つも 使 用 されないよ うなコア ( 例 : DMul_nodsp および<br />
DMul_maxdsp) で 演 算 がイ ンプ リ メ ン ト される こ と があ り ます。 Vivado HLS はデフ ォル ト では 最 大 数 の DSP48 を 含<br />
むコ ア を 使 用 し て 演 算 を イ ンプ リ メ ン ト し ます。 ま たは、 resource 指 示 子 を 使 用 し てどのコ アを 使 用 するべき か 明 示<br />
的 に 指 定 する こ と も で き ます。<br />
float および double 型 を 合 成 する 際 には、Vivado HLS が C コー ド で 実 行 さ れる 演 算 順 序 を 維 持 し て、C シミュレーショ<br />
ン と 結 果 が 同 じ にな る よ う に し ます。 飽 和 および 切 り 捨 てのため、 次 は 単 精 度 および 倍 精 度 演 算 で 必 ずし も 同 じ にな<br />
るわけではあり ません。<br />
A=B*C;<br />
D=E*F;<br />
O1=A*D<br />
A=B*F;<br />
D=E*C;<br />
O2=A*D;<br />
float および double 型 を 使 用 する 場 合 、 O1 と O2 は 必 ずし も 同 じにな るわけではあ り ません。<br />
ヒント : デザ イ ンに よ っては、 ループの 展 開 や 部 分 展 開 などの 最 適 化 に よ り 、 並 列 計 算 の 利 点 を 生 かす こ と ので き な<br />
い 場 合 も あ り ます。 これは、float および double 型 を 合 成 する 際 に Vivado HLS で 演 算 順 序 が 厳 し く 守 られるか ら です。<br />
C++ デザイ ンの 場 合 は、 Vivado HLS の 最 も よ く 使 用 さ れる 数 学 関 数 のビ ッ ト を 概 算 する 機 能 を 使 用 で き ます。<br />
復 号 デー タ 型<br />
Vivado HLS では、 合 成 で 復 号 データ 型 がサポー ト さ れます。<br />
• struct<br />
• enum<br />
• union<br />
構 造 体<br />
構 造 体 が 最 上 位 関 数 への 引 数 と し て 使 用 さ れる と 、 合 成 で 作 成 さ れる ポー ト はその 構 造 体 の メ ンバーを 直 接 反 映 し た<br />
ものになります。 スカラー メ ンバーは 標 準 的 な ス カ ラー ポー ト と して、 配 列 はデフ ォル ト で メ モ リ ポー ト と してイ<br />
ンプ リ メ ン ト されます。<br />
例 3-26 の 場 合 、 struct data_t がヘッ ダー フ ァ イルで 定 義 さ れています。 こ の 構 造 体 には、 次 の 2 つのデータ メンバー<br />
が 含 まれます。<br />
• short 型 (16 ビッ ト) の 符 号 な しベク ター A<br />
• 4 つの unsigned char 型 (8 ビッ ト) の 配 列 B<br />
typedef struct {<br />
unsigned short A;<br />
unsigned char B[4];<br />
} data_t;<br />
高 位 合 成 japan.xilinx.com 294<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
data_t struct_port(data_t i_val, data_t *i_pt, data_t *o_pt);<br />
例 3‐26 : ヘッダー フ ァ イルの 構 造 体 宣 言<br />
例 3-27 では、 構 造 体 が 渡 し 値 引 数 (i_val から o_val の 戻 り 値 ) とポインター (*i_pt から *o_pt) の 両 方 と し て 使 用 され<br />
ています。<br />
#include struct_port.h<br />
data_t struct_port(<br />
data_t i_val,<br />
data_t *i_pt,<br />
data_t *o_pt<br />
) {<br />
data_t o_val;<br />
int i;<br />
// Transfer pass-by-value structs<br />
o_val.A = i_val.A+2;<br />
for (i=0;iA = i_pt->A+3;<br />
for (i=0;iB[i] = i_pt->B[i]+3;<br />
}<br />
}<br />
return o_val;<br />
例 3‐27 : 渡 し 値 およびポイ ン タ ー と し ての 構 造 体<br />
すべての 関 数 引 数 および 関 数 戻 し 値 は 次 の よ う にポー ト に 合 成 さ れます。<br />
• struct エレ メン ト A は 16 ビッ ト ポー ト にな り ます。<br />
• struct エレ メン ト B は 4 つのエレ メ ン ト にア ク セスする RAM ポー ト にな り ます。<br />
Vivado HLS で 合 成 で き る 構 造 体 のサ イ ズや 複 雑 さ に 制 限 はあ り ません。 構 造 体 には 必 要 なだけの 配 列 次 元 および メ ン<br />
バーを 含 める こ と ができ ます。 構 造 体 のイ ンプ リ メ ンテーシ ョ ンでの 唯 一 の 制 限 は、 ス ト リ ー ミ ング と し て (たとえ<br />
ば 配 列 が FIFO インターフェイスとして) イ ンプ リ メ ン ト さ れる 場 合 にあ り ます。 こ の 場 合 、 その イ ン ターフ ェ イ スの<br />
配 列 に 適 用 する の と 同 じ 一 般 規 則 に 従 う 必 要 があ り ます。<br />
構 造 体 のエレ メ ン ト は、 データ パ ッ キ ング 最 適 化 に よ り 1 つのベク ターにパッ ク でき ます。 この 最 適 化 の 実 行 に 関<br />
する 詳 細 は、 set_directive_data_pack コマンドを 参 照 してください。 また、 config_interface コマンドに<br />
-trim_dangling_ports オプシ ョ ン を 使 用 する と 、 構 造 体 の 未 使 用 のエレ メ ン ト を イ ン ターフ ェ イ スか ら 削 除 で き<br />
ます。<br />
列 挙 型<br />
例 3-28 のヘッ ダー ファイルでは、 enum 型 をいくつか 定 義 し、 それらを struct で 使 用 し ています。 この struct が 別 の<br />
struct で 使 用 さ れる と 、 複 雑 なデータ 型 がわか り やす く 記 述 で き ます。<br />
例 3-28 は、 複 雑 な 定 義 文 (MAD_NSBSAMPLES) の 指 定 および 合 成 方 法 を 示 し ています。<br />
#include <br />
高 位 合 成 japan.xilinx.com 295<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
enum mad_layer {<br />
MAD_LAYER_I = 1,<br />
MAD_LAYER_II = 2,<br />
MAD_LAYER_III = 3<br />
};<br />
enum mad_mode {<br />
MAD_MODE_SINGLE_CHANNEL = 0,<br />
MAD_MODE_DUAL_CHANNEL = 1,<br />
MAD_MODE_JOINT_STEREO = 2,<br />
MAD_MODE_STEREO = 3<br />
};<br />
enum mad_emphasis {<br />
MAD_EMPHASIS_NONE = 0,<br />
MAD_EMPHASIS_50_15_US = 1,<br />
MAD_EMPHASIS_CCITT_J_17 = 3<br />
};<br />
typedef<br />
signed int mad_fixed_t;<br />
typedef struct mad_header {<br />
enum mad_layer layer;<br />
enum mad_mode mode;<br />
int mode_extension;<br />
enum mad_emphasis emphasis;<br />
unsigned long long bitrate;<br />
unsigned int samplerate;<br />
unsigned short crc_check;<br />
unsigned short crc_target;<br />
int flags;<br />
int private_bits;<br />
} header_t;<br />
typedef struct mad_frame {<br />
header_t header;<br />
int options;<br />
mad_fixed_t sbsample[2][36][32];<br />
} frame_t;<br />
# define MAD_NSBSAMPLES(header) \<br />
((header)->layer == MAD_LAYER_I 12 :\<br />
(((header)->layer == MAD_LAYER_III && \<br />
((header)->flags & 17)) 18 :36))<br />
void types_composite(frame_t *frame);<br />
例 3‐28 : enum、 struct および 複 雑 な 定 義<br />
例 3-28 では、 例 3-29 で 定 義 された struct および enum 型 が 使 用 さ れています。 enum が 最 上 位 関 数 への 引 数 で 使 用 さ<br />
れる と、 標 準 の C コンパイル ビヘイ ビ アに 準 拠 する ために 32 ビッ ト 値 として 合 成 されます。enum 型 がデザイ ン 内<br />
部 に 対 し て 指 定 さ れる 場 合 、 Vivado HLS で 必 要 なビ ッ ト 数 まで 最 適 化 で 減 ら さ れます。<br />
高 位 合 成 japan.xilinx.com 296<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
例 3-29 は、 合 成 中 に printf 文 が 無 視 さ れる よ う に 記 述 し ています。<br />
#include types_composite.h<br />
void types_composite(frame_t *frame)<br />
{<br />
if (frame->header.mode != MAD_MODE_SINGLE_CHANNEL) {<br />
unsigned int ns, s, sb;<br />
mad_fixed_t left, right;<br />
ns = MAD_NSBSAMPLES(&frame->header);<br />
printf(Samples from header %d \n, ns);<br />
}<br />
}<br />
for (s = 0; s < ns; ++s) {<br />
for (sb = 0; sb < 32; ++sb) {<br />
left = frame->sbsample[0][s][sb];<br />
right = frame->sbsample[1][s][sb];<br />
frame->sbsample[0][s][sb] = (left + right) / 2;<br />
}<br />
}<br />
frame->header.mode = MAD_MODE_SINGLE_CHANNEL;<br />
例 3‐29 : 複 雑 なデー タ 型 の 使 用<br />
共 用 体 (union)<br />
例 3-30 では、 double および struct を 使 用 して union が 作 成 されています。 C コンパイルと 異 なり、 union のすべての<br />
フ ィ ール ド に 合 成 で 必 ず 同 じ メ モ リ ( 合 成 の 場 合 、 レ ジ ス タ) が 使 用 される と は 限 り ません。 Vivado HLS では、 最 も<br />
適 し たハー ド ウ ェ ア を 提 供 する よ う に、 最 適 化 が 実 行 さ れます。<br />
#include types_union.h<br />
dout_t types_union(din_t N, dinfp_t F)<br />
{<br />
union {<br />
struct {int a; int b; } intval;<br />
double fpval;<br />
} intfp;<br />
unsigned long long one, exp;<br />
// Set a floating-point value in union intfp<br />
intfp.fpval = F;<br />
// Slice out lower bits and add to shifted input<br />
one = intfp.intval.a;<br />
exp = (N & 0x7FF);<br />
}<br />
return ((exp
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
for (int i = 0; i < 6; ++i)<br />
if (i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
Vivado HLS は static の 初 期 化 動 作 に 従 って、 初 期 化 中 にレ ジ ス タへ 値 0 を 割 り 当 て る か、 指 定 さ れた 初 期 化 値 に 割 り<br />
当 てます。 つま り 、 static 変 数 は RTL コード と FPGA ビ ッ ト ス ト リ ームで 初 期 化 さ れます。 リ セ ッ ト 信 号 がアサー ト<br />
さ れる たびに 変 数 が 初 期 化 し 直 さ れる わけではあ り ません。<br />
static 初 期 化 値 をシ ス テム リ セ ッ ト 時 にイ ンプ リ メ ン ト する 方 法 については、RTL コンフィギュレーション (config_rtl<br />
コマンド) を 参 照 して ください。<br />
const<br />
const 型 では、 変 数 の 値 がア ッ プデー ト さ れない こ と を 指 定 し ます。 変 数 は 読 み 込 まれますが、 書 き 出 さ れる こ と は<br />
ないので、 初 期 化 さ れる 必 要 があ り ます。 ほ と んどの const 変 数 は、 通 常 RTL デザイ ンでは 定 数 に 削 減 されます。<br />
Vivado HLS は 定 数 伝 搬 を 実 行 し て、 不 必 要 なハー ド ウ ェ ア を 削 除 し ます<br />
配 列 の 場 合 、 const 変 数 は 最 終 RTL デザイ ンで ROM としてインプリメントされます ( 小 さい 配 列 では Vivado HLS で<br />
自 動 分 割 が 実 行 さ れないため)。 const 修 飾 子 で 指 定 さ れた 配 列 は、 static の 場 合 と 同 様 、 RTL および FPGA ビッ トスト<br />
リームで 初 期 化 されます。 これらは 書 き 出 されるこ とがないため、 リセッ トする 必 要 はあり ません。<br />
Vivado HLS の 最 適 化<br />
例 3-31 では、 配 列 が static または const 修 飾 子 で 指 定 さ れていな く て も、 Vivado HLS で ROM がインプリ メン ト され<br />
る 例 を 示 しています。 これは、Vivado HLS でどのよ う にデザイ ンが 解 析 され、 最 適 な イ ンプ リ メ ンテーシ ョ ンが 判 断<br />
さ れるかを 示 し ています。 修 飾 子 の 有 無 に よ る 影 響 はあ り ますが、 最 終 的 な RTL はこれによって 決 定 はされません。<br />
#include array_ROM.h<br />
dout_t array_ROM(din1_t inval, din2_t idx)<br />
{<br />
din1_t lookup_table[256];<br />
dint_t i;<br />
for (i = 0; i < 256; i++) {<br />
lookup_table[i] = 256 * (i - 128);<br />
}<br />
}<br />
return (dout_t)inval * (dout_t)lookup_table[idx];<br />
例 3‐31 : static または const を 使 用 しない ROM インプリメンテーションのコード 例<br />
例 3-31 の 場 合 、 Vivado HLS で lookup_table 変 数 が 最 終 RTL でメモリ エレメントになるのが 最 適 なインプリ メンテー<br />
シ ョ ンであ る と 判 断 で き ます。 配 列 で こ れを 達 成 する 方 法 については、 288 ページを 参 照 して ください。<br />
グローバル 変 数<br />
グ ローバル 変 数 はコー ド 内 で 自 由 に 使 用 で き、 完 全 に 合 成 可 能 です。デフ ォル ト ではグ ローバル 変 数 は RTL インター<br />
フェイスのポート としては 公 開 されません。<br />
グローバル 変 数 のコード 例<br />
例 3-32 では、 グ ローバル 変 数 のデフ ォル ト の 合 成 ビヘイ ビアが 示 され、 3 つのグ ローバル 変 数 が 使 用 されています。<br />
この 例 では 配 列 が 使 用 されますが、 Vivado HLS ではすべてのタ イプのグ ローバル 変 数 タ イプがサポー ト されていま<br />
す。<br />
• 値 は 配 列 Ain か ら 読 み 込 まれます。<br />
• 配 列 Aint は Ain からの 値 を 変 換 して Aout に 渡 すために 使 用 さ れます。<br />
• 出 力 は 配 列 Aout に 書 き 出 されます。<br />
高 位 合 成 japan.xilinx.com 299<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
din_t Ain[N];<br />
din_t Aint[N];<br />
dout_t Aout[N/2];<br />
void types_global(din1_t idx) {<br />
int i,lidx;<br />
}<br />
// Move elements in the input array<br />
for (i=0; iN-1)<br />
lidx=i-N;<br />
Aint[lidx] = Ain[lidx+idx] + Ain[lidx];<br />
}<br />
// Sum to half the elements<br />
for (i=0; i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
• ポ イ ン ターが 同 じ 関 数 内 で 複 数 回 ア ク セス ( 読 み 込 みま たは 書 き 出 し) される 場 合<br />
詳 細 は、 306 ページを 参 照 して く ださい。<br />
• ポ イ ン ターの 配 列 を 使 用 する 場 合 、 各 ポ イ ン ターが 別 のポ イ ン ターではな く 、 ス カ ラーま たはス カ ラー 配 列 を 指<br />
定 する 必 要 あ り<br />
• ポ イ ン ターの 型 変 換 は 標 準 C 型 間 の 変 換 の 場 合 にのみサポー ト あ り<br />
ポ イ ン ターのサポー ト される 合 成 には、 ポ イ ン ターが 複 数 のオブジェ ク ト を 指 定 する 場 合 も 含 まれます ( 例 3-33)。<br />
#include pointer_multi.h<br />
dout_t pointer_multi (sel_t sel, din_t pos) {<br />
static const dout_t a[8] = {1, 2, 3, 4, 5, 6, 7, 8};<br />
static const dout_t b[8] = {8, 7, 6, 5, 4, 3, 2, 1};<br />
dout_t* ptr;<br />
if (sel)<br />
ptr = a;<br />
else<br />
ptr = b;<br />
}<br />
return ptr[pos];<br />
例 3‐33 : 複 数 のポイ ン タ ー ターゲッ ト<br />
ダブルポインターも 合 成 ではサポート されますが、 最 上 位 インターフェイスでは ( 最 上 位 関 数 への 引 数 と し ては) サ<br />
ポー ト されません。ダブルポイ ン ターが 複 数 の 関 数 で 使 用 される と、Vivado HLS ではすべての 関 数 をそれが 使 用 さ れ<br />
る 箇 所 で イ ン ラ イ ン 化 し ます。 複 数 の 関 数 を イ ン ラ イ ン 化 する と 、 ラ ン タ イ ムが 増 加 し ます。<br />
#include pointer_double.h<br />
data_t sub(data_t ptr[10], data_t size, data_t**flagPtr)<br />
{<br />
data_t x, i;<br />
}<br />
x = 0;<br />
// Sum x if AND of local index and double-pointer index is true<br />
for(i=0; i=0 & pos < 10)<br />
*(array+pos) = x;<br />
// Pass same index (as pos) as pointer to another function<br />
return sub(array, 10, &ptrFlag);<br />
高 位 合 成 japan.xilinx.com 301<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
}<br />
例 3‐34 : ダブルポインター<br />
ポインターの 配 列 も 合 成 できます。 例 3-35 では、 ポ イ ン ターの 配 列 がグ ローバル 配 列 の 2 次 元 の 開 始 位 置 を 格 納 す<br />
る ために 使 用 さ れています。 ポ イ ン ターの 配 列 内 のポ イ ン ターは、 ス カ ラーま たはス カ ラーの 配 列 のみを 指 定 で き、<br />
ほかのポイ ンターを 指 定 する こ とはでき ません。<br />
#include pointer_array.h<br />
data_t A[N][10];<br />
data_t pointer_array(data_t B[N*10]) {<br />
data_t i,j;<br />
data_t sum1;<br />
// Array of pointers<br />
data_t* PtrA[N];<br />
// Store global array locations in temp pointer array<br />
for (i=0; i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#define N 1024<br />
typedef int data_t;<br />
typedef char dint_t;<br />
data_t pointer_cast_native (data_t index, data_t A[N]) {<br />
dint_t* ptr;<br />
data_t i =0, result = 0;<br />
ptr = (dint_t*)(&A[index]);<br />
}<br />
// Sum from the indexed value as a different type<br />
for (i = 0; i < 4*(N/10); ++i) {<br />
result += *ptr;<br />
ptr+=1;<br />
}<br />
return result;<br />
例 3‐36 : ネイティブ 型 を 使 用 したポインター 型 変 換<br />
Vivado HLS では、 一 般 的 なデータ 型 間 のポ イ ン ター 型 変 換 はサポー ト さ れません。 た と えば、 符 号 付 き の 値 の struct<br />
複 合 型 が 作 成 さ れる と 、 ポ イ ン ターを 型 変 換 し て 符 号 な し の 値 を 代 入 する こ と はで き ません。<br />
struct {<br />
short first;<br />
short second;<br />
} pair;<br />
// Not supported for synthesis<br />
*(unsigned*)pair = -1U;<br />
こ の よ う な 場 合 、 値 はネ イ テ ィ ブ 型 を 使 用 し て 代 入 する 必 要 があ り ます。<br />
struct {<br />
short first;<br />
short second;<br />
} pair;<br />
// Assigned value<br />
pair.first = -1U;<br />
pair.second = -1U;<br />
インターフェイスのポインター<br />
ポ イ ン ターは、 最 上 位 関 数 への 引 数 と し て 使 用 で き ます。 ポ イ ン ターは 目 標 どお り の RTL インターフェイスおよび<br />
デザ イ ン を 合 成 後 に 達 成 する 際 、 問 題 の 原 因 と な る こ と があ る ので、 合 成 中 にポ イ ン ターがどの よ う に イ ンプ リ メ ン<br />
ト さ れるか 理 解 する のが 重 要 にな り ます。<br />
基 本 的 なポイ ン タ ー<br />
例 3-37 の よ う な、 最 上 位 イ ン ターフ ェ イ スに 基 本 的 なポ イ ン ターを 含 む 関 数 は、 Vivado HLS では 問 題 と な り ません。<br />
ポインターは 単 純 なワイヤ インターフェイスかハンドシェイクを 使 用 したインターフェイス プロ ト コルのいずれか<br />
に 合 成 でき ます。<br />
ヒント : FIFO イ ン ターフ ェ イ ス と し て 合 成 する には、ポ イ ン ターを 読 み 込 み 専 用 ま たは 書 き 出 し 専 用 にする 必 要 があ<br />
ります。<br />
高 位 合 成 japan.xilinx.com 303<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include pointer_basic.h<br />
void pointer_basic (dio_t *d) {<br />
static dio_t acc = 0;<br />
}<br />
acc += *d;<br />
*d = acc;<br />
例 3‐37 : 基 本 的 なポイ ン タ ー インターフェイス<br />
イ ン ターフ ェ イ スのポ イ ン ターは、 関 数 呼 び 出 し ご と に 1 度 だけ 読 み 込 みま たは 書 き 出 し さ れます。 こ こ でのテ ス ト<br />
ベンチは、 例 3-38 に 示 し ます。<br />
#include pointer_basic.h<br />
int main () {<br />
dio_t d;<br />
int i, retval=0;<br />
FILE *fp;<br />
// Save the results to a file<br />
fp=fopen(result.dat,w);<br />
printf( Din Dout\n, i, d);<br />
// Create input data<br />
// Call the function to operate on the data<br />
for (i=0;i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
ポインター 演 算<br />
ポ イ ン ター 演 算 (pointer_arith) を 使 用 する と 、RTL に 合 成 可 能 な イ ン ターフ ェ イ スが 制 限 さ れます。 例 3-39 は 同 じ コー<br />
ドですが、 データ 値 を 2 つ 目 の 値 か ら 累 積 する ために、 単 純 なポ イ ン ター 演 算 が 使 用 さ れてい る 点 が 異 な り ます。<br />
#include pointer_arith.h<br />
void pointer_arith (dio_t *d) {<br />
static int acc = 0;<br />
int i;<br />
}<br />
for (i=0;i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
これは、 シ ミ ュ レーシ ョ ンする と、 次 のよ う な 出 力 にな り ます。<br />
Din Dout<br />
0 1<br />
1 3<br />
2 6<br />
3 10<br />
Test passed!<br />
ポインター 演 算 では、 ポインター データへ 順 番 どお り にア ク セス さ れません。 ワ イ ヤ、 ハン ド シ ェ イ ク ま たは FIFO<br />
インターフェイスの 場 合 は、 順 序 どおりにアクセスされます。<br />
• ワイヤ イ ン ターフ ェ イ スはデザ イ ンがデータ を 消 費 する か、 書 き 出 す 準 備 がで き た と き にデータ を 読 み 込 みま<br />
す。<br />
• ハン ドシェ イ クおよび FIFO イ ン ターフ ェ イ スは、 制 御 信 号 が 処 理 を 進 め る 許 可 を し た と き に 読 み 込 みおよび 書<br />
き 出 しします。<br />
どち ら の 場 合 も、 データは 順 序 通 り にエレ メ ン ト 0 から 到 着 する ( 書 き 出 される) 必 要 があ り ます。 例 3-39 では、 最<br />
初 のデータ 値 が イ ンデ ッ ク ス 1 か ら 読 み 込 まれる よ う に 記 述 さ れています (i が 0 で 開 始 され、 0+1=1)。 これは、テス<br />
トベンチの d[5] 配 列 か ら 2 つ 目 のエレ メ ン ト です。<br />
これがハードウェアにインプリ メン ト される 際 には、 何 らかのデータ インデックス 形 式 が 必 要 になります。 Vivado<br />
HLS では、 ワ イヤ、 ハン ド シェ イ ク または FIFO イ ン ターフ ェ イ ス を 使 用 する と こ れはサポー ト さ れません。 例 3-39<br />
のコードは、ap_bus イ ン ターフ ェ イ ス を 使 用 し てのみ 合 成 で き ます。 こ の イ ン ターフ ェ イ スでは、 データ がア ク セ ス<br />
( 読 み 込 みま たは 書 き 出 し) された と き にデータ に イ ンデ ッ ク ス を 付 け る ためのア ド レ スが 提 供 さ れます。<br />
ま たは、 ポ イ ン ターではな く 、 イ ン ターフ ェ イ スの 配 列 を 使 用 し て コー ド を 変 更 する 必 要 があ り ます。 詳 細 は、 例<br />
3-41を 参 照 して く ださい。 これは RAM インターフェイス (ap_memory) を 使 用 する と、 合 成 できます。 このインター<br />
フェイスは、 アドレスを 付 けてデータのインデックスを 作 成 できるので、 順 序 どおりでなくても 実 行 できます。<br />
ワイヤ、 ハンドシェイク、 FIFO インターフェイスは、 スト リーミング データ でのみ 使 用 で き、 ポ イ ン ター 演 算 と 一<br />
緒 には 使 用 でき ません (0 か らデータ の イ ンデ ッ ク ス を 作 成 し て、 順 番 に 進 め る 場 合 は 例 外 )。<br />
ap_bus および ap_memory インターフェイス タイプについては、 次 を 参 照 してください。<br />
• 第 1 章 「 高 位 合 成 」<br />
• 第 4 章 「 高 位 合 成 リ フ ァ レ ン ス ガイド」<br />
#include array_arith.h<br />
void array_arith (dio_t d[5]) {<br />
static int acc = 0;<br />
int i;<br />
}<br />
for (i=0;i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
• Vivado HLS 内 で 協 調 シ ミ ュ レーシ ョ ン を 使 用 し て RTL を 検 証 する 場 合 、 最 上 位 関 数 では、 こ の よ う な 引 数 に 指<br />
定 したポート イ ン ターフ ェ イ スのア ク セス 数 を 含 め る 必 要 があ り ます。<br />
• 合 成 の 前 に C を 検 証 し、 目 的 を 確 認 し、 C 記 述 が 正 し い こ と を 確 認 し て く だ さ い。<br />
関 数 の 引 数 が 複 数 回 ア ク セス さ れる 必 要 があ る 場 合 は、 ス ト リ ーム を 使 用 し てデザ イ ン を 記 述 する こ と をお 勧 め し ま<br />
す。 ス ト リ ーム を 使 用 する と 、 こ のセ ク シ ョ ンで 示 すよ う な 問 題 は 発 生 し ません。 サンプル デザイ ンを 使 用 し た 場<br />
合 、 表 3-3 「サンプル デザイ ンのシナ リ オ」 は340 ページに 説 明 されています。<br />
表 3‐3:サンプル デザイ ンのシナ リ オ<br />
サンプル デザイ ン<br />
pointer_stream_bad<br />
pointer_stream_better<br />
表 示<br />
同 じ 関 数 内 でポ イ ン ターに 複 数 回 ア ク セスする 場 合 に volatile 修<br />
飾 子 が 必 要 な 理 由<br />
このようなポインターが 最 上 位 インターフェイスに 含 まれるデ<br />
ザ イ ンで 目 的 どお り の 動 作 が 正 し く 記 述 さ れている かど う かを<br />
確 認 する ために、C テ ス ト ベンチを 使 用 し てデザ イ ン を 検 証 する<br />
必 要 があ る 理 由<br />
例 3-42 では、 入 力 ポイ ン ターの d_i が 4 回 読 み 込 まれ、 出 力 ポ イ ン ターの d_o が 2 回 書 き 出 さ れ、 ア ク セスが FIFO<br />
インターフェイスによりインプリ メント ( 最 終 的 な RTL インプリ メンテーションからスト リーミング データ を 読 み<br />
込 みおよび 書 き 出 し) されるよ うにしています 。<br />
#include pointer_stream_bad.h<br />
void pointer_stream_bad ( dout_t *d_o, din_t *d_i) {<br />
din_t acc = 0;<br />
}<br />
acc += *d_i;<br />
acc += *d_i;<br />
*d_o = acc;<br />
acc += *d_i;<br />
acc += *d_i;<br />
*d_o = acc;<br />
例 3‐42 : マルチアクセス ポインター インターフェイス<br />
例 3-43 は、 こ のデザ イ ン を 検 証 する テ ス ト ベンチを 示 し ています。<br />
#include pointer_stream_bad.h<br />
int main () {<br />
din_t d_i;<br />
dout_t d_o;<br />
int retval=0;<br />
FILE *fp;<br />
// Open a file for the output results<br />
fp=fopen(result.dat,w);<br />
// Call the function to operate on the data<br />
for (d_i=0;d_i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
retval = system(diff --brief -w result.dat result.golden.dat);<br />
if (retval != 0) {<br />
printf(Test failed !!!\n);<br />
retval=1;<br />
} else {<br />
printf(Test passed !\n);<br />
}<br />
}<br />
// Return 0 if the test<br />
return retval;<br />
例 3‐43 : マルチアクセス ポインターのテストベンチ<br />
揮 発 性 デー タの 理 解<br />
例 3-42 のコー ド は、 入 力 ポ イ ン ター d_i および 出 力 ポ イ ン ター d_o を、RTL で FIFO (またはハンドシェーク) インター<br />
フェイスとしてインプリメントすることを 意 図 して 記 述 されています。 これにより、 次 のことが 確 実 になります。<br />
• アップスト リームの 送 信 ブロックは、RTL ポー ト d_i で 読 み 込 みが 実 行 さ れる たびに 新 し いデータ を 供 給 し ます。<br />
• ダウンス ト リームの 受 信 ブロックは、 RTL ポー ト d_o で 書 き 出 しが 実 行 されるたびに 新 しいデータを 受 信 しま<br />
す。<br />
このコードが 標 準 C コ ンパイ ラ で コ ンパイルされる 場 合 、 各 ポ イ ン ターへの 複 数 ア ク セスが 1 つのア ク セスに 削 減 さ<br />
れます。 コ ンパイ ラ については、 d_i 上 のデータ が 関 数 の 実 行 中 に 変 化 する こ と が 示 さ れないので、 関 係 あ る のは d_o<br />
への 最 終 の 書 き 出 し のみです。 ほかの 書 き 出 し は、 関 数 が 完 了 する までに 上 書 き さ れます。<br />
Vivado HLS での 処 理 は、 gcc コ ンパイ ラ の 動 作 と 一 致 し てお り 、 複 数 の 読 み 込 みおよび 書 き 出 し は 1 つの 読 み 込 み 操<br />
作 および 1 つの 書 き 出 し 操 作 に 最 適 化 さ れます。 RTL が 検 証 される と、 各 ポー ト では 1 つの 読 み 込 みおよび 書 き 出 し<br />
操 作 のみが 実 行 されます。<br />
こ のデザイ ンの 基 本 的 な 問 題 は、 テス ト ベンチ と デザイ ンで RTL ポー ト のイ ンプ リ メ ン ト 方 法 が 設 計 者 の 意 図 どお<br />
り に 記 述 されていないこ とにあ り ます。<br />
• RTL ポー ト は、 ト ラ ンザ ク シ ョ ン 中 に 複 数 回 読 み 込 みおよび 書 き 出 し (データ 入 力 および 出 力 がス ト リ ー ミ ン グ<br />
) されるはずです。<br />
• テス トベンチは 1 つの 入 力 値 だけを 提 供 し、1 つの 出 力 値 だけを 戻 し ます。 例 3-42 の C シミュレーションの 結 果<br />
は 次 のよ う にな り ます。 各 入 力 が 4 回 累 積 さ れますが、 読 み 込 まれて 各 回 で 累 積 さ れる のは 同 じ 値 で、 4 回 別 の<br />
読 み 込 みがあ る わけではあ り ません。<br />
Din Dout<br />
0 0<br />
1 4<br />
2 8<br />
3 12<br />
このデザインは volatile 修 飾 子 を 使 用 する と 、RTL ポー ト に 複 数 回 読 み 込 みおよび 書 き 出 し がで き る よ う にな り ます。<br />
詳 細 は、 例 3-44を 参 照 して く ださい。<br />
volatile キーワー ド を 使 用 する と 、 C コンパイラ (および Vivado HLS) でポインター ア ク セ スに 関 する 仮 定 が さ れない<br />
ので、 データ が 揮 発 性 であ り 変 化 する 可 能 性 があ る と 解 釈 さ れます。<br />
ヒント : ポインター ア ク セスは 最 適 化 し ないで く だ さ い。<br />
高 位 合 成 japan.xilinx.com 308<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include pointer_stream_better.h<br />
void pointer_stream_better ( volatile dout_t *d_o, volatile din_t *d_i) {<br />
din_t acc = 0;<br />
}<br />
acc += *d_i;<br />
acc += *d_i;<br />
*d_o = acc;<br />
acc += *d_i;<br />
acc += *d_i;<br />
*d_o = acc;<br />
例 3‐44 : マルチアクセス volatile ポインター インターフェイス<br />
例 3-44 は 例 3-42 と 同 じよ うにシミ ュレーションされますが、 volatile 修 飾 子 によ り 、 次 のよ う な 状 態 にな り ます。<br />
• ポインター ア ク セスの 最 適 化 が さ れな く な り ます。<br />
• 意 図 し た と お り 、 入 力 ポー ト d_i で 読 み 込 みが 4 回 実 行 さ れ、 出 力 ポー ト d_o で 書 き 出 しが 2 回 実 行 さ れる RTL<br />
デザイ ンにな り ます。<br />
volatile キーワード を 使 用 しても、 このコード 形 式 (ポ イ ン ターに 複 数 回 ア ク セスする) には、 関 数 と テス ト ベンチに<br />
読 み 込 みおよび 書 き 出 し が 明 示 的 に 記 述 さ れていない と い う 問 題 がまだあ り ます。<br />
こ の 場 合 、 読 み 込 みは 4 回 実 行 さ れますが、 同 じデータ が 4 回 読 み 込 まれます。 書 き 出 し は 2 回 別 々にあ り 、 それぞ<br />
れ 正 しいデータで 実 行 されますが、 テス ト ベンチは 最 後 の 書 き 出 しのデータのみを 取 り 込 みます。<br />
ヒント : 中 間 ア ク セス を 表 示 する には、cosim_design をイネーブルにして RTL シミュレーション 中 にトレース ファイ<br />
ルを 作 成 し、 適 切 なビ ューアーでその ト レース ファイルを 確 認 します。<br />
例 3-44 は、 ワ イ ヤ インターフェイスを 使 用 してインプリ メントできます。FIFO インターフェイスが 指 定 される 場 合<br />
は、 Vivado HLS で 各 読 み 込 みごとに 新 しいデータをス ト リーミ ングする RTL テス トベンチが 作 成 されます。 テス ト<br />
ベンチから 使 用 でき る 新 しいデータはないので、 RTL の 検 証 はエ ラーにな り ます。 テ ス ト ベンチでは、 正 し く 読 み 込<br />
みおよび 書 き 出 し が 記 述 さ れません。<br />
ストリーミング データ インターフェイスの 記 述<br />
ハー ド ウ ェ ア シ ス テムには 並 列 処 理 機 能 があ る ので、 ソ フ ト ウ ェ ア と 違 って ス ト リ ー ミ ン グ データ の 利 点 を 生 かす<br />
こ と がで き ます。 データ はデザ イ ンに 連 続 し て 提 供 さ れ、 デザ イ ンか らデータは 連 続 し て 出 力 さ れます。 RTL デザイ<br />
ンは 既 存 データ を 処 理 し 終 わ る 前 に 新 し いデータ を 受 信 で き ます。<br />
例 3-44 に 示 すよ う に、 ソ フ ト ウ ェ アでのス ト リ ー ミ ング データ の 記 述 は、 特 に 既 存 のハー ド ウ ェ ア インプリ メン<br />
テーシ ョ ン ( 既 に 並 列 /ス ト リ ー ミ ング 処 理 機 能 が 存 在 し、 記 述 する 必 要 あ り ) を 表 すソ フ ト ウ ェアを 記 述 する 際 に 重<br />
要 です。<br />
こ れには、 次 の よ う な 複 数 の 方 法 があ り ます。<br />
• volatile 修 飾 子 を 追 加 し ます ( 例 3-44)。 テ ス ト ベンチには 一 意 の 読 み 込 みおよび 書 き 出 し が 記 述 さ れないので、 元<br />
の C テス トベンチを 使 用 した RTL シミュレーションはエラーになりますが、 トレース フ ァ イルの 波 形 を 確 認 す<br />
る と 、 正 し い 読 み 込 みおよび 書 き 出 し が 実 行 さ れた こ と がわか り ます。<br />
• 一 意 の 読 み 込 みおよび 書 き 出 し を 明 示 的 に 記 述 する よ う に コー ド を 変 更 し ます。 詳 細 は、 例 3-45を 参 照 して く だ<br />
さい。<br />
• ストリーミング データ 型 を 使 用 する よ う にコー ド を 変 更 し ます。 ス ト リ ー ミ ン グ データ 型 を 使 用 する と 、 ス ト<br />
リーミング データ を 使 用 し てハー ド ウ ェ アが 適 切 に 記 述 さ れる よ う にな り ます。 詳 細 は、 第 1 章 「 高 位 合 成 」 を<br />
参 照 し て く だ さ い。<br />
高 位 合 成 japan.xilinx.com 309<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
例 3-45 のコードは、 テス トベンチから 4 つの 異 な る 値 が 読 み 込 まれ、 2 つの 異 なる 値 が 書 き 出 されるよ うにアップ<br />
デー ト し た コー ド です。 ポ イ ン ターのア ク セスはシーケンシ ャルで ロ ケーシ ョ ン 0 か ら 開 始 する ので、 合 成 ではス ト<br />
リーミング インターフェイスが 使 用 されます。<br />
#include pointer_stream_good.h<br />
void pointer_stream_good ( volatile dout_t *d_o, volatile din_t *d_i) {<br />
din_t acc = 0;<br />
}<br />
acc += *d_i;<br />
acc += *(d_i+1);<br />
*d_o = acc;<br />
acc += *(d_i+2);<br />
acc += *(d_i+3);<br />
*(d_o+1) = acc;<br />
例 3‐45 : 明 示 的 なマルチアクセスの volatile ポインター インターフェイス<br />
テ ス ト ベンチがア ッ プデー ト さ れ、 関 数 が 各 ト ラ ンザ ク シ ョ ンで 4 つの 固 有 の 値 が 読 み 込 まれる よ う に 記 述 さ れま<br />
す。 こ のテ ス ト ベンチは、 1 つのトランザクションのみを 記 述 しています。 複 数 のトランザクションを 記 述 するには、<br />
入 力 データ セ ッ ト を 増 加 し、 関 数 を 複 数 回 呼 び 出 す 必 要 があ り ます。<br />
#include pointer_stream_good.h<br />
int main () {<br />
din_t d_i[4];<br />
dout_t d_o[4];<br />
int i, retval=0;<br />
FILE *fp;<br />
// Create input data<br />
for (i=0;i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
}<br />
return retval;<br />
例 3‐46 : 明 示 的 なマルチア ク セスの volatile ポインターのテストベンチ<br />
このテス ト ベンチによ り 、 次 のよ う な 結 果 のアルゴ リ ズムが 検 証 されます。<br />
• 1 つの ト ラ ンザ ク シ ョ ンから 2 つの 出 力 が 生 成 されます。<br />
• 出 力 は 最 初 の 2 つの 入 力 読 み 込 みが 累 算 さ れた も の と 、 次 の 2 つの 入 力 読 み 込 み と 最 初 の 出 力 が 累 算 さ れた も の<br />
にな り ます。<br />
Din Dout<br />
0 1<br />
1 6<br />
2<br />
3<br />
ポ イ ン ターが 関 数 イ ン ターフ ェ イ スで 複 数 回 ア ク セス さ れる 際 に 注 意 すべき 最 後 の 問 題 は、RTL シミュレーションの<br />
記 述 です。<br />
マルチアクセス ポインターおよび RTL シミュレーション<br />
イ ン ターフ ェ イ スのポ イ ン ターが 複 数 回 ア ク セス さ れた 場 合 、Vivado HLS では 関 数 イ ン ターフ ェ イ スか ら 何 度 読 み 込<br />
みおよび 書 き 出 し が 実 行 さ れたか 判 別 で き ません。 値 がい く つ 読 み 込 まれる か、 ま たは 書 き 出 さ れる かを Vivado HLS<br />
に 示 すよ う な 関 数 イ ン ターフ ェ イ スの 引 数 はあ り ません。<br />
void pointer_stream_good (volatile dout_t *d_o, volatile din_t *d_i)<br />
例 3‐47 : volatile ポインター インターフェイス<br />
配 列 の 最 大 サ イ ズなど、 イ ン ターフ ェ イ スに 値 がい く つ 必 要 かを 示 すよ う な も のがない 限 り 、Vivado HLS では 1 つの<br />
値 が 仮 定 さ れ、 1 つの 入 力 および 1 つの 出 力 用 のみの C/RTL 協 調 シ ミ ュ レーシ ョ ンが 作 成 さ れます。<br />
RTL ポー ト が 実 際 には 複 数 の 値 を 読 み 込 みま たは 書 き 出 しする 場 合 、 RTL 協 調 シ ミ ュ レーシ ョ ンが 停 止 し ます。 RTL<br />
協 調 シ ミ ュ レーシ ョ ンには RTL デザイ ンに 接 続 される 送 信 ブロ ッ ク と 受 信 ブロ ッ ク が 記 述 されます。 複 数 の 値 が 記<br />
述 さ れる と 、 複 数 の 値 が 読 み 込 みま たは 書 き 出 し さ れる 場 合 に RTL デザイ ンは 停 止 し ます ( 読 み 込 む 値 がないか 書 き<br />
出 すスペースがないため)。<br />
インターフェイスでマルチアクセス ポ イ ン ターが 使 用 さ れる 場 合 、イ ン ターフ ェ イ スでの 読 み 込 みま たは 書 き 出 し の<br />
最 大 回 数 を Vivado HLS に 示 す 必 要 があ り ます。 イ ン ターフ ェ イ ス を 指 定 する 場 合 、 [Vivaod HLS Directive Editor] ダイ<br />
アログ ボックスの [Directive] で [INTERFACE] を 選 択 し、 [depth] オプシ ョ ン を 設 定 し ます ( 図 3-1)。<br />
高 位 合 成 japan.xilinx.com 311<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
X-Ref Target - Figure 3-1<br />
図 3‐1 : [Vivado HLS Directive Editor] ダイアログ ボックス :[depth] オプシ ョ ン<br />
上 記 の 例 では、 引 数 ま たはポー ト d_i が 深 さ 4 の FIFO イ ン ターフ ェ イ スにな る よ う に 設 定 さ れています。 こ れに よ<br />
り、 RTL 協 調 シ ミ ュ レーシ ョ ンで RTL を 正 し く 検 証 する のに 十 分 な 値 が 供 給 さ れます。<br />
C++ クラスおよびテンプレート<br />
C++ クラスは、Vivado HLS での 合 成 で 完 全 にサポー ト さ れています。 合 成 の 最 上 位 は、 関 数 であ る 必 要 があ り ます。<br />
ク ラ スは、 合 成 では 最 上 位 にで き ません。 ク ラ スの メ ンバー 関 数 を 合 成 する には、 ク ラ ス 自 体 を 関 数 に イ ン ス タ ンシ<br />
エー ト する 必 要 があ り ます。 最 上 位 ク ラ スは、 単 にテス ト ベンチにイ ン ス タ ンシエー ト し ないよ う にし て く だ さい。<br />
例 3-48 は、CFir クラス ( 次 で 説 明 するヘ ッ ダー ファイルで 定 義 ) が 最 上 位 関 数 の cpp_FIR にインスタンシエート され、<br />
FIR フ ィ ルターを イ ンプ リ メ ン ト する ために 使 用 さ れる コー ド を 示 し ています。<br />
高 位 合 成 japan.xilinx.com 312<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include cpp_FIR.h<br />
// Top-level function with class instantiated<br />
data_t cpp_FIR(data_t x)<br />
{<br />
static CFir fir1;<br />
cout
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
};<br />
// Load FIR coefficients<br />
template<br />
const coef_T CFir::c[N] = {<br />
#include cpp_FIR.inc<br />
};<br />
// FIR main algorithm<br />
template<br />
data_T CFir::operator()(data_T x) {<br />
int i;<br />
acc_t acc = 0;<br />
data_t m;<br />
}<br />
loop: for (i = N-1; i >= 0; i--) {<br />
if (i == 0) {<br />
m = x;<br />
shift_reg[0] = x;<br />
} else {<br />
m = shift_reg[i-1];<br />
if (i != (N-1))<br />
shift_reg[i] = shift_reg[i - 1];<br />
}<br />
acc += m * c[i];<br />
}<br />
return acc;<br />
// Operator for displaying results<br />
template<br />
ostream& operator
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
// Open a file to saves the results<br />
result.open(result.dat);<br />
// Apply stimuli, call the top-level function and saves the results<br />
for (int i = 0; i
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
• Vivado HLS では、 base オブジェ ク ト ポ イ ン ターがグ ローバル 変 数 の 場 合 はサポー ト されません。 次 はその 例 で<br />
す。<br />
Base *base_ptr;<br />
void func()<br />
{<br />
……<br />
base_prt->virtual_function();<br />
……<br />
}<br />
• base オブジェ ク ト ポ イ ン ターはク ラ ス 定 義 の メ ンバー 変 数 にはでき ません。 次 に 例 を 示 し ます。<br />
// Static elaboration cannot bind base object pointer with correct data type.<br />
class A<br />
{<br />
…..<br />
Base *base_ptr;<br />
void set_base(Base *base_ptr);<br />
void some_func();<br />
…..<br />
};<br />
void A::set_base(Base *ptr)<br />
{<br />
this.base_ptr = ptr;<br />
}<br />
void A::some_func()<br />
{<br />
….<br />
base_ptr->virtual_function();<br />
….<br />
}<br />
• base オブジェ ク ト ポインターまたはリファレンスがコンス ト ラクターの 関 数 パラメーター リストにある 場 合<br />
は、 Vivado HLS でそれは 変 換 されません。 これについては、 ISO C++ 規 格 のセ ク シ ョ ン 12.7 に 記 述 されていま<br />
す。 ビヘイ ビ アは 定 義 さ れない こ と も あ り ます。<br />
class A {<br />
A(Base *b) {<br />
b-> virtual _ function ();<br />
}<br />
};<br />
グローバル 変 数 およびク ラ ス<br />
ク ラ スでグ ローバル 変 数 を 使 用 する のは、 推 奨 さ れません。 使 用 する と 、 一 部 の 最 適 化 が 実 行 さ れない こ と があ り ま<br />
す。 例 3-51 318 ページ では、 フ ィ ルターの コ ンポーネン ト を 作 成 する のに ク ラ スが 使 用 さ れています (polyd_cell ク<br />
ラ スはシフ ト 、 乗 算 、 累 算 を 実 行 する コ ンポーネン ト と し て 使 用 さ れます)。<br />
高 位 合 成 japan.xilinx.com 316<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
ループ インデックスの C++ クラス データ メンバーのコード 例<br />
typedef long long acc_t;<br />
typedef int mult_t;<br />
typedef char data_t;<br />
typedef char coef_t;<br />
#define TAPS 3<br />
#define PHASES 4<br />
#define DATA_SAMPLES 256<br />
#define CELL_SAMPLES 12<br />
// Use k on line 73 static int k;<br />
template <br />
class polyd_cell {<br />
private:<br />
public:<br />
T0 areg;<br />
T0 breg;<br />
T2 mreg;<br />
T1 preg;<br />
T0 shift[N];<br />
int k; //line 73<br />
T0 shift_output;<br />
void exec(T1 *pcout, T0 *dataOut, T1 pcin, T3 coeff, T0 data, int col)<br />
{<br />
Function_label0:;<br />
if (col==0) {<br />
SHIFT:for (k = N-1; k >= 0; --k) {<br />
if (k > 0)<br />
shift[k] = shift[k-1];<br />
else<br />
shift[k] = data;<br />
}<br />
*dataOut = shift_output;<br />
shift_output = shift[N-1];<br />
}<br />
*pcout = (shift[4*col]* coeff) + pcin;<br />
};<br />
}<br />
// Top-level function with class instantiated<br />
void cpp_class_data (<br />
acc_t<br />
*dataOut,<br />
coef_t<br />
coeff1[PHASES][TAPS],<br />
coef_t<br />
coeff2[PHASES][TAPS],<br />
data_t dataIn[DATA_SAMPLES],<br />
int<br />
row<br />
) {<br />
acc_t pcin0 = 0;<br />
acc_t pcout0, pcout1;<br />
data_t dout0, dout1;<br />
int col;<br />
static acc_t accum=0;<br />
static int sample_count = 0;<br />
高 位 合 成 japan.xilinx.com 317<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
static polyd_cell<br />
polyd_cell0;<br />
static polyd_cell<br />
polyd_cell1;<br />
COL:for (col = 0; col
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
//Tail recursive call<br />
template struct fibon_s {<br />
template<br />
static T fibon_f(T a, T b) {<br />
return fibon_s::fibon_f(b, (a+b));<br />
}<br />
};<br />
// Termination condition<br />
template struct fibon_s {<br />
template<br />
static T fibon_f(T a, T b) {<br />
return b;<br />
}<br />
};<br />
void cpp_template(data_t a, data_t b, data_t &dout){<br />
dout = fibon_s::fibon_f(a,b);<br />
}<br />
例 3‐52 : テンプレートを 使 用 した C++ の 末 尾 再 帰<br />
assert の 使 用<br />
C の assert マ ク ロは、 範 囲 情 報 を アサー ト する のに 使 用 さ れる 場 合 、 合 成 でサポー ト さ れます。 た と えば、 変 数 と ルー<br />
プ 境 界 の 上 限 を 指 定 で き ます。<br />
可 変 ループ 境 界 があ る 場 合 、 高 位 合 成 ではそのループの 反 復 すべてのレ イ テンシを 決 定 する こ と がで きず、 レ イ テン<br />
シがクエスチ ョ ン マーク () で 表 示 されます。 tripcount 指 示 子 はループ 境 界 の 高 位 合 成 に 情 報 を 渡 すためには 使 用 で<br />
き ますが、 こ の 情 報 はレポー ト 目 的 にのみ 使 用 さ れ、 合 成 結 果 には 影 響 し ません (tripcount 指 示 子 の 有 無 に 関 係 な く<br />
同 じサイズのハード ウェアが 作 成 されます)。<br />
次 のコード 例 は、 assert を 使 用 し て 高 位 合 成 に 変 数 の 最 大 範 囲 を 伝 え、 さ ら に 適 し たハー ド ウ ェ ア を 作 成 する ために<br />
どのよ うに assert を 使 用 する かを 示 し ています。<br />
assert を 使 用 する 前 に、 assert マ ク ロ を 定 義 するヘ ッ ダー フ ァ イルを 含 め る 必 要 があ り ます。 こ の 例 では、 こ れはヘ ッ<br />
ダー ファイルに 含 まれます。<br />
高 位 合 成 japan.xilinx.com 319<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#ifndef _loop_sequential_assert_H_<br />
#define _loop_sequential_assert_H_<br />
#include <br />
#include <br />
#include ap_cint.h<br />
#define N 32<br />
typedef int8 din_t;<br />
typedef int13 dout_t;<br />
typedef uint8 dsel_t;<br />
void loop_sequential_assert(din_t A[N], din_t B[N], dout_t X[N], dout_t Y[N], dsel_t<br />
xlimit, dsel_t ylimit);<br />
#endif<br />
例 3‐53 : 可 変 ループ 境 界 ( 修 正 後 )<br />
メイン コード では、 各 ループの 前 に 次 の 2 つの assert 文 を 記 述 し ます。<br />
assert(xlimit
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include loop_sequential_assert.h<br />
void loop_sequential_assert(din_t A[N], din_t B[N], dout_t X[N], dout_t Y[N], dsel_t<br />
xlimit, dsel_t ylimit) {<br />
}<br />
dout_t X_accum=0;<br />
dout_t Y_accum=0;<br />
int i,j;<br />
assert(xlimit
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
assert マクロが 使 用 される 場 合 、 レポートには SUM_X および SUM_Y ループの ト リ ッ プカ ウ ン ト が 32 および 16 で<br />
あることが 示 されます。 assert は 32 および 16 を 超 えない 値 がアサー ト されるので、 高 位 合 成 ではレポー ト で これが<br />
使 用 で き ます。<br />
* Loop Latency:<br />
+----------+-----------+----------+<br />
|Target II |Trip Count |Pipelined |<br />
+----------+-----------+----------+<br />
|- SUM_X |1 ~ 32 |no |<br />
|- SUM_Y |1 ~ 16 |no |<br />
+----------+-----------+----------+<br />
また、 tripcount 指 示 子 を 使 用 する 場 合 と 異 な り 、 assert 文 を 使 用 する と 最 適 なハー ド ウ ェ ア を 提 供 で き ます。 assert が<br />
ない 場 合 、 最 終 的 なハー ド ウ ェ アでは 最 大 256 ループ 反 復 にサイ ズを 合 わせた 変 数 およびカ ウ ン ターが 使 用 されま<br />
す。<br />
* Expression:<br />
+----------+------------------------+-------+---+----+<br />
|Operation |Variable Name |DSP48E |FF |LUT |<br />
+----------+------------------------+-------+---+----+<br />
|+ |X_accum_1_fu_182_p2 |0 |0 |13 |<br />
|+ |Y_accum_1_fu_209_p2 |0 |0 |13 |<br />
|+ |indvar_next6_fu_158_p2 |0 |0 |9 |<br />
|+ |indvar_next_fu_194_p2 |0 |0 |9 |<br />
|+ |tmp1_fu_172_p2 |0 |0 |9 |<br />
|+ |tmp_fu_147_p2 |0 |0 |9 |<br />
|icmp |exitcond1_fu_189_p2 |0 |0 |9 |<br />
|icmp |exitcond_fu_153_p2 |0 |0 |9 |<br />
+----------+------------------------+-------+---+----+<br />
|Total | |0 |0 |80 |<br />
+----------+------------------------+-------+---+----+<br />
変 数 範 囲 をアサー ト する コー ド は、 よ り 小 型 の RTL では 可 能 性 のあ る 最 大 範 囲 結 果 よ り も 小 さ く な り ます。<br />
* Expression:<br />
+----------+------------------------+-------+---+----+<br />
|Operation |Variable Name |DSP48E |FF |LUT |<br />
+----------+------------------------+-------+---+----+<br />
|+ |X_accum_1_fu_176_p2 |0 |0 |13 |<br />
|+ |Y_accum_1_fu_207_p2 |0 |0 |13 |<br />
|+ |i_2_fu_158_p2 |0 |0 |6 |<br />
|+ |i_3_fu_192_p2 |0 |0 |5 |<br />
|icmp |tmp_2_fu_153_p2 |0 |0 |7 |<br />
|icmp |tmp_9_fu_187_p2 |0 |0 |6 |<br />
+----------+------------------------+-------+---+----+<br />
|Total | |0 |0 |50 |<br />
+----------+------------------------+-------+---+----+<br />
アサー ト は、 デザ イ ンの 変 数 の 範 囲 を 示 すために 使 用 で き ます。 アサー ト を 使 用 する 場 合 、 すべての 可 能 性 のあ る 状<br />
況 に 適 用 さ れる C シ ミ ュ レーシ ョ ン を 実 行 する こ と が 重 要 にな り ます。 こ れに よ り 、 高 位 合 成 で 使 用 さ れる アサー ト<br />
が 有 効 にな り ます。<br />
高 位 合 成 japan.xilinx.com 322<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
SystemC の 合 成<br />
Vivado HLS では、 ハー ド ウ ェ ア 記 述 に 使 用 さ れる C++ クラス ライブラリである SystemC (IEEE 規 格 1666) がサポー<br />
ト さ れます。 こ の ラ イ ブ ラ リ は、 www.systemc.org か ら 入 手 で き ます。<br />
Vivado HLS では、 次 がサポー ト されます。<br />
• SystemC バージ ョ ン 2.1<br />
• SystemC Synthesizable Subset ( ドラフト 1.3)<br />
このセクショ ンでは、 Vivado HLS を 使 用 して SystemC 関 数 を 合 成 する 際 の 詳 細 について 説 明 し ます。 こ こ に 含 まれ<br />
る 情 報 は、 前 述 の 「C の 合 成 」 および 「C++ の 合 成 」 の 章 の 情 報 に 記 載 さ れなかった も ので、 合 成 の 基 本 的 な コー ド<br />
規 則 を 理 解 する には、 こ れら の 章 を 理 解 し てお く 必 要 があ り ます。<br />
重 要 : C および C++ デザ イ ンの 場 合 と 同 様 、 合 成 では 最 上 位 関 数 が C コ ンパイルの 最 上 位 sc_main() の 下 にあ る 必 要<br />
があ り ます。 sc_main() は 合 成 では 最 上 位 関 数 にはで き ません。<br />
デザイ ンの 記 述<br />
合 成 の 最 上 位 は、 SC_MODULE である 必 要 があ り ます。 SystemC コンス ト ラクター プロセスの SC_METHOD 、<br />
SC_CTHREAD および SC_HAS_PROCESS を 使 用 し て 記 述 さ れる 場 合 、ま たは SC_MODULES がほかの SC_MODULES<br />
内 に イ ン ス タ ンシエー ト さ れる 場 合 、 デザ イ ンは 合 成 で き ます。<br />
デザイ ンの 最 上 位 の SC_MODULE はテンプレート にはできません。 テンプレート は 下 位 モジュールでのみ 使 用 でき<br />
ます。<br />
モジュールのコンス ト ラ ク ターでは、 モジュールの 定 義 またはインスタンシエー ト しかできず、 機 能 を 含 める こ とが<br />
できません。<br />
SC_MODULE は 別 の SC_MODULE 内 には 定 義 でき ません( こ れ ら は 後 に 示 す 方 法 で 定 義 で き ます)。<br />
高 位 合 成 japan.xilinx.com 323<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
SC_ MODULE のコード 例<br />
このセクショ ンでは、 SC_ MODULE のコード 例 を 示 します。<br />
SC_ MODULE の 例 1<br />
モジュールが 別 のモジュール 内 で 定 義 される 場 合 (SC_ MODULE の 例 1)、 モジュールがネストされないバージョン<br />
(SC_ MODULE の 例 2) に 変 換 する 必 要 があ り ます。<br />
SC_MODULE(nested1)<br />
{<br />
SC_MODULE(nested2)<br />
{<br />
sc_in in0;<br />
sc_out out0;<br />
SC_CTOR(nested2)<br />
{<br />
SC_METHOD(process);<br />
sensitive
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
SC_ MODULE の 例 2<br />
SC_MODULE(nested2)<br />
{<br />
sc_in in0;<br />
sc_out out0;<br />
SC_CTOR(nested2)<br />
{<br />
SC_METHOD(process);<br />
sensitive
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
SC_ MODULE の 例 4<br />
次 の SC_ MODULE の 例 4 のよ うな 場 合 は、 SC_ MODULE の 例 5 に 示 すよ う に 変 換 する 必 要 があ り ます。<br />
SC_MODULE(dut) {<br />
sc_in in0;<br />
sc_outout0;<br />
SC_HAS_PROCESS(dut);<br />
dut(sc_module_name nm);<br />
…<br />
};<br />
dut::dut(sc_module_name nm)<br />
{<br />
SC_METHOD(process);<br />
sensitive
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
};<br />
}<br />
//Process Registration<br />
SC_METHOD(half_adder);<br />
sensitive
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
// Create a 10ns period clock signal<br />
sc_clock s_clk(s_clk,10,SC_NS);<br />
tb_init U_tb_init(U_tb_init);<br />
sc_combo_method U_dut(U_dut);<br />
tb_driver U_tb_driver(U_tb_driver);<br />
// Generate a clock and reset to drive the sim<br />
U_tb_init.clk(s_clk);<br />
U_tb_init.reset(s_reset);<br />
// Connect the DUT<br />
U_dut.a(s_a);<br />
U_dut.b(s_b);<br />
U_dut.sum(s_sum);<br />
U_dut.carry(s_carry);<br />
// Drive stimuli from dat* ports<br />
// Capture results at out* ports<br />
U_tb_driver.clk(s_clk);<br />
U_tb_driver.reset(s_reset);<br />
U_tb_driver.dat_a(s_a);<br />
U_tb_driver.dat_b(s_b);<br />
U_tb_driver.out_sum(s_sum);<br />
U_tb_driver.out_carry(s_carry);<br />
// Sim for 200<br />
int end_time = 200;<br />
cout
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
推 奨 : Vivado HLS で 使 用 されるすべての SystemC テス トベンチ ファイルに、レポート ハン ド ラー 関 数 ( 例 3-62) を 追<br />
加 する 必 要 があ り ます。<br />
sc_report_handler::set_actions(/IEEE_Std_1666/deprecated, SC_DO_NOTHING);<br />
sc_report_handler::set_actions( SC_ID_LOGIC_X_TO_BOOL_, SC_LOG);<br />
sc_report_handler::set_actions( SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, SC_LOG);<br />
sc_report_handler::set_actions( SC_ID_OBJECT_EXISTS_, SC_LOG);<br />
これらの 設 定 によ り、 RTL シ ミ ュ レーシ ョ ン 中 に メ ッ セージが 過 多 に 表 示 さ れる こ と はな く な り ます。<br />
こ れ ら の メ ッ セージの 中 で 最 も 重 要 なのは、 次 の 警 告 文 です。<br />
Warning:(W212) sc_logic value 'X' cannot be converted to bool<br />
合 成 済 みデザ イ ン 周 辺 に 配 置 さ れる アダプ ターは、 未 知 の 値 (X) で 開 始 されます。 すべての SystemC 型 で 未 知 の 値<br />
(X) がサポー ト されるわけではあ り ません。 こ の 警 告 は、 未 知 の 値 (X) が 未 知 の 値 をサポー ト し ないデータ 型 に 割 り<br />
当 て られた 場 合 、 ス テ ィ ミ ュ ラ スがテ ス ト ベンチか ら 適 用 さ れる 前 などに 表 示 さ れますが、 通 常 は 無 視 し て も 問 題 あ<br />
りません。<br />
例 3-62 のテ ス ト ベンチは、 最 後 に 結 果 のチェ ッ ク を 実 行 し、<br />
結 果 が 正 し い 場 合 は 値 0 を 戻 し ます。 こ の 場 合 、 結 果 は tb_driver 関 数 内 で 検 証 さ れますが、 戻 り 値 はチェ ッ ク さ れた<br />
後 、 最 上 位 テ ス ト ベンチに 戻 さ れます。<br />
if (U_tb_driver.retval != 0) {<br />
printf(Test failed !!!\n);<br />
} else {<br />
printf(Test passed !\n);<br />
}<br />
return U_tb_driver.retval;<br />
SC_MODULES のインスタンシエート<br />
SC_MODULE の 階 層 イ ン ス タ ンシエーシ ョ ンは 合 成 でき ます ( 例 3-63) 例 3-63 では、 例 3-60 か ら の 半 加 算 器 デザ イ ン<br />
(sc_combo_method) の 2 つの イ ン ス タ ン スが 全 加 算 器 デザ イ ン を 作 成 する ために イ ン ス タ ンシエーシ ョ ン さ れていま<br />
す。<br />
高 位 合 成 japan.xilinx.com 329<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include <br />
#include sc_combo_method.h<br />
SC_MODULE(sc_hier_inst){<br />
//Ports<br />
sc_in a, b, carry_in;<br />
sc_out sum, carry_out;<br />
//Variables<br />
sc_signal carry1, sum_int, carry2;<br />
//Process Declaration<br />
void full_adder();<br />
//Half-Adder Instances<br />
sc_combo_methodU_1, U_2;<br />
//Constructor<br />
SC_CTOR(sc_hier_inst)<br />
:U_1(U_1)<br />
,U_2(U_2)<br />
{<br />
// Half-adder inst 1<br />
U_1.a(a);<br />
U_1.b(b);<br />
U_1.sum(sum_int);<br />
U_1.carry(carry1);<br />
// Half-adder inst 2<br />
U_2.a(sum_int);<br />
U_2.b(carry_in);<br />
U_2.sum(sum);<br />
U_2.carry(carry2);<br />
};<br />
}<br />
//Process Registration<br />
SC_METHOD(full_adder);<br />
sensitive
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
• データ には 関 連 するハン ド シ ェ イ ク 信 号 が 含 まれる ので、 合 成 前 後 に 同 じ テ ス ト ベンチを 使 用 し てデータ が 処 理<br />
されるよ うにできます。<br />
• クロックの SC_CTHREAD は、 関 数 が 実 行 さ れる タ イ ミ ング を 記 述 する ために 使 用 さ れます。<br />
• SC_CTHREAD では、 リ セ ッ ト 動 作 がサポー ト されます。<br />
#include <br />
SC_MODULE(sc_sequ_cthread){<br />
//Ports<br />
sc_in clk;<br />
sc_in reset;<br />
sc_in start;<br />
sc_in a;<br />
sc_in en;<br />
sc_out sum;<br />
sc_out vld;<br />
//Variables<br />
sc_uint acc;<br />
//Process Declaration<br />
void accum();<br />
//Constructor<br />
SC_CTOR(sc_sequ_cthread){<br />
};<br />
}<br />
//Process Registration<br />
SC_CTHREAD(accum,clk.pos());<br />
reset_signal_is(reset,true);<br />
例 3‐65 : SystemC の SC_CTHREAD<br />
例 3-66 は accum 関 数 を 示 し ています。 .この 例 では、 次 を 示 しています。<br />
• コ ア 記 述 プ ロ セスは、 無 限 の while() ループで、 中 に wait() 文 が 含 まれます。<br />
• 変 数 の 初 期 化 は、 無 限 の while() ループ よ り も 前 に 実 行 さ れます。 こ の コー ド は、 リ セ ッ ト が SC_CTHREAD で<br />
認 識 さ れる と 実 行 さ れます。<br />
• データ 読 み 込 みおよび 書 き 出 し は、 ハン ド シ ェ イ ク プ ロ ト コルで 確 認 さ れます。<br />
高 位 合 成 japan.xilinx.com 331<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#include sc_sequ_cthread.h<br />
void sc_sequ_cthread::accum(){<br />
//Initialization<br />
acc=0;<br />
sum.write(0);<br />
vld.write(false);<br />
wait();<br />
// Process the data<br />
while(true) {<br />
// Wait for start<br />
while (!start.read()) wait();<br />
}<br />
// Read if valid input available<br />
if (en) {<br />
acc = acc + a.read();<br />
sum.write(acc);<br />
vld.write(true);<br />
} else {<br />
vld.write(false);<br />
}<br />
wait();<br />
}<br />
例 3‐66 : SystemC の SC_CTHREAD 関 数<br />
複 数 ク ロ ッ クの 合 成<br />
SystemC では、 C および C++ 合 成 と は 異 な り 、 複 数 ク ロ ッ ク を 使 用 するデザ イ ンがサポー ト さ れます。 複 数 ク ロ ッ ク<br />
デザ イ ンでは、 各 ク ロ ッ ク に 関 連 する 機 能 が SC_CTHREAD で 取 り 込 まれる 必 要 があ り ます。<br />
例 3-67 は 2 つの ク ロ ッ ク (clock および clock2) を 含 むデザ イ ン を 示 し ています。<br />
• クロックの 1 つは Prc1 関 数 を 実 行 する SC_CTHREAD をアクティベートするために 使 用 されます。<br />
• もう 1 つは Prc2 関 数 を 実 行 する SC_CTHREAD をアクティベートするために 使 用 されます。<br />
合 成 後 は、Prc1 関 数 に 関 連 するすべてのシーケンシ ャル ロジックに clock が 付 き、clock2 は Prc2 関 数 のシーケンシ ャ<br />
ル ロ ジ ッ ク すべてを 駆 動 し ます。<br />
高 位 合 成 japan.xilinx.com 332<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
#includesystemc.h<br />
#includetlm.h<br />
using namespace tlm;<br />
SC_MODULE(sc_multi_clock)<br />
{<br />
//Ports<br />
sc_in clock;<br />
sc_in clock2;<br />
sc_in reset;<br />
sc_in start;<br />
sc_out done;<br />
sc_fifo_out dout;<br />
sc_fifo_in din;<br />
//Variables<br />
int share_mem[100];<br />
bool write_done;<br />
//Process Declaration<br />
void Prc1();<br />
void Prc2();<br />
//Constructor<br />
SC_CTOR(sc_multi_clock)<br />
{<br />
//Process Registration<br />
SC_CTHREAD(Prc1,clock.pos());<br />
reset_signal_is(reset,true);<br />
};<br />
}<br />
SC_CTHREAD(Prc2,clock2.pos());<br />
reset_signal_is(reset,true);<br />
例 3‐67 : SystemC の 複 数 ク ロ ッ ク デザイ ン<br />
通 信 チ ャ ネル<br />
スレッド、 メソッド、モジュール (スレッドおよびメソッドを 含 む) 間 の 通 信 は、 チャ ネルを 使 用 し てのみ 実 行 する 必<br />
要 があ り ます。 ス レ ッ ド 間 の 通 信 には 単 純 な 変 数 は 使 用 でき ません。<br />
異 なるプロセス (スレッド、 メソッド) 間 の 通 信 には sc_buffer または sc_signal の 使 用 をお 勧 めし ますが、 最 初 の 値 の<br />
読 み 込 み 前 に 複 数 の 値 が 書 き 出 さ れる よ う な 場 合 は、 sc_fifo および tlm_fifo を 使 用 できます。<br />
sc_fifo および tlm_fifo の 場 合 、 合 成 では 次 の メ ソ ッ ド がサポー ト さ れます。<br />
• ノ ンブ ロ ッ キ ングの 読 み 込 み/ 書 き 出 し<br />
• ブ ロ ッ キ ングの 読 み 込 み/ 書 き 出 し<br />
• num_available()/num_free()<br />
• nb_can_put()/nb_can_get()<br />
高 位 合 成 japan.xilinx.com 333<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
最 上 位 SystemC ポー ト<br />
SystemC デザイ ンに 含 まれるポー ト は、 ソース コードで 指 定 されます。 C および C++ と 異 なり、 SystemC の 場 合 、<br />
Vivado HLS でサポー ト される メ モ リ インターフェイスでしかインターフェイス 合 成 しか 実 行 されません。 詳 細 は、<br />
285 ページを 参 照 して く ださい。<br />
最 上 位 イ ン ターフ ェ イ スのポー ト は、 すべて 次 のいずれかの 型 を 使 用 し てい る 必 要 があ り ます。<br />
• sc_in_clk<br />
• sc_in<br />
• sc_out<br />
• sc_inout<br />
• sc_fifo_in<br />
• sc_fifo_out<br />
• ap_mem_if<br />
サポー ト される メ モ リ インターフェイスを 除 き、デザインとテストベンチ 間 のすべてのハンドシェイクは SystemC 関<br />
数 で 明 示 的 に 記 述 し てお く 必 要 があ り ます。 サポー ト さ れる メ モ リ インターフェイスは、 次 のとおりです。<br />
• sc_fifo_in<br />
• sc_fifo_out<br />
• ap_mem_if<br />
Vivado HLS は、 タ イ ミ ング 要 件 を 満 たすために 必 要 であれば、 SystemC デザイ ンに ク ロ ッ ク サイクルを 追 加 するこ<br />
と があ り ます。 合 成 後 の ク ロ ッ ク 数 は 異 な る 可 能 性 があ る ので、 SystemC デザイ ンではテス ト ベンチを 使 用 し てすべ<br />
てのデータ 転 送 にハン ド シェ イ ク 信 号 を 付 ける 必 要 があ り ます。<br />
Vivado HLS では、 TLM 2.0 を 使 用 した ト ランザクシ ョ ン レベルの 記 述 およびイベン ト ベースの 記 述 は 合 成 ではサ<br />
ポー ト されません。<br />
SystemC のインターフ ェ イス 合 成<br />
通 常 、 Vivado HLS では SystemC の イ ン ターフ ェ イ ス 合 成 は 実 行 さ れませんが、 RAM および FIFO ポー ト などの メ モ<br />
リ インターフェイスではインターフェイス 合 成 がサポート されることがあります。<br />
RAM ポー ト の 合 成<br />
C および C++ の 合 成 と は 異 な り 、 Vivado HLS は 配 列 ポー ト を RTL の RAM には 変 換 し ません。 次 の SystemC コード<br />
の 場 合 、 Vivado HLS の 指 示 子 を 使 用 し て 配 列 ポー ト を 個 々のエレ メ ン ト に 分 割 する 必 要 があ り ます。<br />
こうしないと、 このコードは 合 成 できません。<br />
SC_MODULE(dut)<br />
{<br />
sc_in in0[N];<br />
sc_outout0[N];<br />
};<br />
…<br />
SC_CTOR(dut)<br />
{<br />
…<br />
}<br />
例 3‐68 : RAM ポー ト の 合 成 コー ド 例<br />
高 位 合 成 japan.xilinx.com 334<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
こ れら の 配 列 を 個 々のエレ メ ン ト に 分 割 する 指 示 子 は、 次 の と お り です。<br />
set_directive_array_partition dut in0 -type complete<br />
set_directive_array_partition dut out0 -type complete<br />
N が 大 き な 数 の 場 合 は、 RTL インターフェイスに 多 くのスカラー ポー ト が 作 成 さ れます。<br />
例 3-69 は、RAM インターフェイスが SystemC シ ミ ュ レーシ ョ ンでどの よ う に 記 述 さ れ、Vivado HLS で 完 全 に 合 成 さ<br />
れるかを 示 しています。 例 3-69 では、 配 列 が RAM ポー ト に 合 成 可 能 な ap_mem_if 型 に 置 き 換 え られています。<br />
• ap_mem_port 型 を 使 用 する には、 Vivado HLS インストール ディレク ト リの include/ap_sysc ディレク ト リに<br />
ある ap_mem_if.h ヘッダー フ ァ イルを 含 め る 必 要 があ り ます。<br />
° Vivado HLS 環 境 では、 include/ap_sysc デ ィ レ ク ト リ が 自 動 的 に 含 まれます。<br />
• din および dout の 配 列 は ap_mem_port 型 に 置 き 換 え られています。 このフ ィ ール ド については 例 3-69で 説 明 し<br />
ます<br />
#includesystemc.h<br />
#include ap_mem_if.h<br />
SC_MODULE(sc_RAM_port)<br />
{<br />
//Ports<br />
sc_in clock;<br />
sc_in reset;<br />
sc_in start;<br />
sc_out done;<br />
//sc_out dout[100];<br />
//sc_in din[100];<br />
ap_mem_port dout;<br />
ap_mem_port din;<br />
//Variables<br />
int share_mem[100];<br />
sc_signal write_done;<br />
//Process Declaration<br />
void Prc1();<br />
void Prc2();<br />
//Constructor<br />
SC_CTOR(sc_RAM_port)<br />
: dout (dout),<br />
din (din)<br />
{<br />
//Process Registration<br />
SC_CTHREAD(Prc1,clock.pos());<br />
reset_signal_is(reset,true);<br />
};<br />
}<br />
SC_CTHREAD(Prc2,clock.pos());<br />
reset_signal_is(reset,true);<br />
例 3‐69 : SystemC の RAM インターフェイス<br />
高 位 合 成 japan.xilinx.com 335<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
ap_mem_port 型 のフ ォーマ ッ ト は、 次 の とお り です。<br />
ap_mem_port (, < address_type>, , )<br />
• data_type は 格 納 さ れたデータ エレ メ ン ト に 使 用 さ れるデータ 型 です。 例 3-69 では、 これらは 標 準 の int 型 です。<br />
• address_type はア ド レス バスに 使 用 さ れるデータ 型 です。 こ のデータ 型 には、 配 列 内 のすべてのエレ メ ン ト をア<br />
ド レ ス 指 定 する のに 十 分 なデータ ビ ッ ト が 含 まれる 必 要 があ り ます。 含 まれない 場 合 、 C シミュレーションでエ<br />
ラーになり ます。<br />
• number_of_elements は 記 述 さ れる 配 列 に 含 まれる エレ メ ン ト 数 を 指 定 し ます。<br />
• Mem_Target は、 こ のポー ト を 接 続 する メ モ リ を 指 定 する ので、 最 終 RTL の I/O ポー ト を 決 定 し ます。 使 用 可<br />
能 なターゲッ ト の リ ス ト は、 表 3-4を 参 照 して く ださい。<br />
表 3-4 のメモリ ターゲ ッ ト は、 合 成 で 作 成 さ れる ポー ト と デザ イ ン 内 での 操 作 のス ケジ ュール 方 法 に 影 響 し ます。 た<br />
とえば、 デュアル ポー ト RAM の 場 合 、 次 の よ う にな り ます。<br />
• I/O ポー ト 数 はシングル ポー ト RAM の 2 倍 にな り ます。<br />
• 内 部 操 作 が 並 列 で 実 行 さ れる よ う にス ケジ ュールで き る こ と があ り ます ( ループおよびデータ 依 存 性 の よ う な<br />
コード コ ン ス ト ラ ク ト で 許 容 さ れる 場 合 のみ)。<br />
表 3‐4:SystemC の ap_mem_port のメモリ ターゲッ ト<br />
ターゲッ ト<br />
RAM<br />
RAM_1P<br />
RAM_2P<br />
RAM_T2P<br />
ROM_1P<br />
ROM_2P<br />
シングル ポー ト RAM<br />
デュアル ポー ト RAM<br />
説 明<br />
入 力 および 出 力 の 両 方 で 読 み 込 みポー ト と 書 き 出 し ポー ト の 両 方 をサポー ト するデュ アル ポー ト<br />
RAM<br />
シングル ポー ト ROM<br />
デュアル ポー ト ROM<br />
ap_mem_port が イ ン ターフ ェ イ スで 定 義 さ れる と 、 変 数 はほかの 配 列 と 同 じ 方 法 で コー ド か ら ア ク セ ス さ れる よ う に<br />
なります。<br />
dout[i] = share_mem[i] + din[i];<br />
例 3-69 をサポートするテス トベンチは、 例 3-70 のよ うになり ます。ap_mem_port 型 はテス ト ベンチの ap_mem_chn 型<br />
でサポー ト さ れる 必 要 があ り ます。 ap_mem_chn 型 は ap_mem_if.h ヘッダー ファイルで 定 義 されます。 サポー ト さ<br />
れるフ ィールドは、 ap_mem_port と 同 じです。<br />
SystemC の RAM インターフェイスのテストベンチ<br />
#ifdef __RTL_SIMULATION__<br />
#include sc_RAM_port_rtl_wrapper.h<br />
#define sc_RAM_port sc_RAM_port_RTL_wrapper<br />
#else<br />
#include sc_RAM_port.h<br />
#endif<br />
#include tb_init.h<br />
#include tb_driver.h<br />
#include ap_mem_if.h<br />
int sc_main (int argc , char *argv[])<br />
{<br />
sc_report_handler::set_actions(/IEEE_Std_1666/deprecated, SC_DO_NOTHING);<br />
sc_report_handler::set_actions( SC_ID_LOGIC_X_TO_BOOL_, SC_LOG);<br />
sc_report_handler::set_actions( SC_ID_VECTOR_CONTAINS_LOGIC_VALUE_, SC_LOG);<br />
高 位 合 成 japan.xilinx.com 336<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
sc_report_handler::set_actions( SC_ID_OBJECT_EXISTS_, SC_LOG);<br />
sc_signal s_reset;<br />
sc_signal s_start;<br />
sc_signal s_done;<br />
ap_mem_chn dout;<br />
ap_mem_chn din;<br />
// Create a 10ns period clock signal<br />
sc_clock s_clk(s_clk,10,SC_NS);<br />
tb_init<br />
sc_RAM_port<br />
tb_driver<br />
U_tb_init(U_tb_init);<br />
U_dut(U_dut);<br />
U_tb_driver(U_tb_driver);<br />
// Generate a clock and reset to drive the sim<br />
U_tb_init.clk(s_clk);<br />
U_tb_init.reset(s_reset);<br />
U_tb_init.done(s_done);<br />
U_tb_init.start(s_start);<br />
// Connect the DUT<br />
U_dut.clock(s_clk);<br />
U_dut.reset(s_reset);<br />
U_dut.done(s_done);<br />
U_dut.start(s_start);<br />
U_dut.dout(dout);<br />
U_dut.din(din);<br />
// Drive inputs and Capture outputs<br />
U_tb_driver.clk(s_clk);<br />
U_tb_driver.reset(s_reset);<br />
U_tb_driver.start(s_start);<br />
U_tb_driver.done(s_done);<br />
U_tb_driver.dout(dout);<br />
U_tb_driver.din(din);<br />
// Sim<br />
int end_time = 1100;<br />
cout
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
合 成 後 、 各 FIFO ポー ト にはデータ ポー ト および 次 の よ う な 関 連 する FIFO 制 御 信 号 が 含 まれます。<br />
• 入 力 には empty および read ポー ト<br />
• 出 力 には full および write ポー ト<br />
FIFO を 使 用 する と 、 データ 転 送 を 同 期 する のに 必 要 なハン ド シ ェ イ ク が RTL テス トベンチに 追 加 されます。<br />
#includesystemc.h<br />
#includetlm.h<br />
using namespace tlm;<br />
SC_MODULE(sc_FIFO_port)<br />
{<br />
//Ports<br />
sc_in clock;<br />
sc_in reset;<br />
sc_in start;<br />
sc_out done;<br />
sc_fifo_out dout;<br />
sc_fifo_in din;<br />
//Variables<br />
int share_mem[100];<br />
bool write_done;<br />
//Process Declaration<br />
void Prc1();<br />
void Prc2();<br />
//Constructor<br />
SC_CTOR(sc_FIFO_port)<br />
{<br />
//Process Registration<br />
SC_CTHREAD(Prc1,clock.pos());<br />
reset_signal_is(reset,true);<br />
};<br />
}<br />
SC_CTHREAD(Prc2,clock.pos());<br />
reset_signal_is(reset,true);<br />
例 3‐71 : SystemC の FIFO インターフェイス<br />
サポー ト されない SystemC コンストラクト<br />
モジュールおよびコンスト ラクター<br />
• SC_MODULE は 別 の SC_MODULE 内 にはネス ト でき ません。<br />
• SC_MODULE は 別 の SC_MODULE からは 派 生 できません。<br />
• Vivado HLS では、 SC_THREAD がサポー ト されません。<br />
• クロック 付 きバージョンの SC_CTHREAD はサポー ト されます。<br />
高 位 合 成 japan.xilinx.com 338<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
モジ ュールのイ ンス タ ンシエーシ ョ ン<br />
SC_MODULE は new を 使 用 してインス タンシエー ト できません。 「モジ ュールのイ ン ス タ ンシエーシ ョ ンの 例 1」 の<br />
コード (SC_MODULE(TOP) は 「モジュールのイ ンス タ ンシエーシ ョ ンの 例 2」 の よ う に 変 更 する 必 要 があ り ます。<br />
{<br />
sc_in din;<br />
sc_out dout;<br />
M1 *t0;<br />
}<br />
SC_CTOR(TOP){<br />
t0 = new M1(t0);<br />
t0->din(din);<br />
t0->dout(dout);<br />
}<br />
SC_MODULE(TOP)<br />
{<br />
sc_in din;<br />
sc_out dout;<br />
M1 t0;<br />
例 3‐72 : モジュールのインスタンシエーシ ョ ンの 例 1<br />
}<br />
SC_CTOR(TOP)<br />
: t0(“t0”)<br />
{<br />
t0.din(din);<br />
t0.dout(dout);<br />
}<br />
モジュールのコンス ト ラクター<br />
例 3‐73 : モジュールのインスタンシエーシ ョ ンの 例 2<br />
モジュール コ ン ス ト ラ ク ター と 一 緒 に 使 用 で き る のは name パラ メーターのみです。データ 型 int の 変 数 temp には 次<br />
を 渡 すこ とができません。 次 に 例 を 示 し ます。<br />
SC_MODULE(dut) {<br />
sc_in in0;<br />
sc_outout0;<br />
int var;<br />
SC_HAS_PROCESS(dut);<br />
dut(sc_module_name nm, int temp)<br />
:sc_module(nm),var(temp)<br />
{ … }<br />
};<br />
仮 想 関 数<br />
例 3‐74 : モジュール コンストラクターのコード 例<br />
Vivado HLS では、 仮 想 関 数 がサポー ト さ れません。 た と えば、 次 の コー ド は 仮 想 関 数 を 使 用 し てい る ので、 合 成 で き<br />
ません。<br />
高 位 合 成 japan.xilinx.com 339<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 3 章 : 高 位 合 成 コーデ ィ ング スタイル<br />
SC_MODULE(DUT)<br />
{<br />
sc_in in0;<br />
sc_outout0;<br />
virtual int foo(int var1)<br />
{<br />
return var1+10;<br />
}<br />
};<br />
{<br />
}<br />
…<br />
void process()<br />
int var=foo(in0.read());<br />
out0.write(var);<br />
最 上 位 イ ン タ ーフ ェ イ ス ポー ト<br />
例 3‐75 : 仮 想 関 数 のコー ド 例<br />
Vivado HLS では sc_out ポー ト の 読 み 込 みがサポー ト さ れません。 た と えば、 次 のコー ド は、 out0 に 読 み 込 みがあ る<br />
ため、 サポー ト されません。<br />
SC_MODULE(DUT)<br />
{<br />
sc_in in0;<br />
sc_outout0;<br />
…<br />
void process()<br />
{<br />
int var=in0.read()+out0.read();<br />
out0.write(var);<br />
}<br />
};<br />
例 3‐76 : 最 上 位 イ ン タ ーフ ェ イ ス ポー ト のコード 例<br />
高 位 合 成 japan.xilinx.com 340<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章<br />
高 位 合 成 リ フ ァ レ ンス ガイド<br />
コマンド リファレンス<br />
add_files<br />
説 明<br />
現 在 のプ ロ ジ ェ ク ト にデザ イ ン ソース ファイルを 追 加 します。<br />
ツールは、 デザイン ソースに 含 まれるヘッダー ファイルを 現 在 のディレク ト リで 検 索 します。 ほかのディレク ト リ<br />
に 保 存 されているヘッ ダー フ ァ イルを 使 用 する には、 -cflags オプシ ョ ンを 使 用 して、 検 索 パスにそれらのディ レ<br />
ク ト リ を 追 加 し ます。<br />
構 文<br />
説 明 :<br />
add_files [OPTIONS] <br />
• は、 デザ イ ンの 記 述 を 含 むソース ファイルをリストします。<br />
オプシ ョ ン<br />
-tb<br />
デザ イ ンのテ ス ト ベンチの 一 部 と し て 使 用 さ れる フ ァ イルを 指 定 し ます。<br />
これらのファイルは 合 成 されませんが、 cosim_design コ マン ド に よ り 合 成 後 検 証 が 実 行 さ れる と き に 使 用 さ れます。<br />
このオプショ ンが 使 用 されているときは、ソース ファイルのリストにデザイン ファイルを 含 めることはできません。<br />
デザイ ン ファイルおよびテストベンチ フ ァ イルを 追 加 する には、 別 の add_files コマンドを 使 用 します。<br />
-cflags <br />
GCC コンパイル オプシ ョ ンの 文 字 列 です。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
プロジェク トに 3 つのデザイ ン ファイルを 追 加 します。<br />
add_files a.cpp<br />
add_files b.cpp<br />
高 位 合 成 japan.xilinx.com 341<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
add_files c.cpp<br />
1 コ マン ド 行 で 複 数 のフ ァ イルを 追 加 し ます。<br />
add_files "a.cpp b.cpp c.cpp"<br />
次 の 例 は、USE_RANDOM というマクロを 有 効 にするコンパイラ フラグと 共 に SystemC ファイルを 追 加 し、ヘッダー<br />
フ ァ イルを 検 索 する ための 追 加 のサブデ ィ レ ク ト リ ./lib_functions を 指 定 しています。<br />
add_files top.cpp -cflags "-DUSE_RANDOM -I./lib_functions"<br />
-tb オプシ ョ ン を 使 用 し てプ ロ ジ ェ ク ト にテ ス ト ベンチ ファイルを 追 加 します。この 例 では、1 コマンド 行 で 次 の 複<br />
数 のフ ァ イルを 追 加 し ています。<br />
• a_test.cpp テス トベンチ<br />
• テ ス ト ベンチで 読 み 出 さ れるすべてのデータ ファイル :<br />
° input_stimuli.dat<br />
° out.gold.dat<br />
add_files -tb "a_test.cpp input_stimuli.dat out.gold.dat"<br />
前 の 例 にあ る テス ト ベンチのデータ ファイルが、 たとえば test_data というディレク ト リに 保 存 されている 場 合<br />
は、 個 々のフ ァ イルを 指 定 する 代 わ り に、 こ のデ ィ レ ク ト リ をプ ロ ジ ェ ク ト に 追 加 する こ と がで き ます。<br />
add_files -tb a_test.cpp<br />
add_files -tb test_data<br />
close_project<br />
説 明<br />
現 在 のプロジェク トを 閉 じます。 現 在 プロジェク トは Vivado HLS セッションでアクティブではなくなります。<br />
close_project コマンドの 特 徴 は 次 のとおりです。<br />
• プロジェク トやソ リ ューショ ン 用 のコマンドが 入 力 できなくなり ます。<br />
• 必 須 ではあ り ません。 新 し いプ ロ ジ ェ ク ト が 開 かれる と 、 現 在 のプ ロ ジ ェ ク ト を 閉 じ ます。<br />
構 文<br />
close_project<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
close_project<br />
• 現 在 のプ ロ ジ ェ ク ト を 閉 じ ます。<br />
• すべての 結 果 を 保 存 し ます。<br />
高 位 合 成 japan.xilinx.com 342<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
close_solution<br />
説 明<br />
現 在 の ソ リ ューシ ョ ン を 閉 じ ます。 現 在 ソ リ ューシ ョ ンは Vivado HLS セッションでアクティブではなくなります。<br />
close_solution コ マン ド には 次 の 特 徴 があ り ます。<br />
• ソリューション 用 のコマンドが 入 力 できなくなります。<br />
• 必 須 ではあり ません。 新 しいソ リ ューシ ョ ンが 開 かれる と、 現 在 のソ リ ューシ ョ ンを 閉 じます。<br />
構 文<br />
close_solution<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
close_solution<br />
• 現 在 のプ ロ ジ ェ ク ト を 閉 じ ます。<br />
• すべての 結 果 を 保 存 し ます。<br />
config_array_partition<br />
説 明<br />
配 列 の 分 割 のデフ ォル ト 動 作 を 指 定 し ます。<br />
構 文<br />
config_array_partition [OPTIONS]<br />
オプシ ョ ン<br />
-auto_partition_threshold <br />
配 列 ( 定 数 指 数 のない も の も 含 む) を 分 割 する ための し き い 値 を 設 定 し ます。<br />
指 定 さ れた し き い 値 よ り も エレ メ ン ト 数 が 少 ない 配 列 は、 イ ン ターフ ェ イ スやコ ア 仕 様 が 配 列 に 適 用 さ れていない 限<br />
り 、 個 々のエレ メ ン ト に 自 動 的 に 分 割 さ れます。 デフ ォル ト は 4 です。<br />
-auto_promotion_threshold <br />
定 数 イ ンデ ッ ク ス を 使 用 し て 配 列 を 分 割 する ための し き い 値 を 設 定 し ます。<br />
指 定 さ れた し き い 値 よ り も エレ メ ン ト 数 が 少 な く 、ま た 定 数 イ ンデ ッ ク ス を 持 つ (インデックスは 変 数 ではない) 配 列<br />
は、 個 々のエレ メ ン ト に 自 動 的 に 分 割 さ れます。 デフ ォル ト は 64 です。<br />
-exclude_extern_globals<br />
スループ ッ ト に 基 づいた 自 動 分 割 か ら 外 部 グ ローバル 配 列 を 除 外 し ます。<br />
高 位 合 成 japan.xilinx.com 343<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
デフォル ト では、 -throughput_driven オプシ ョ ンが 指 定 されている と、 外 部 グローバル 配 列 が 分 割 されます。<br />
-throughput_driven も 選 択 されていないと、 このオプシ ョ ンは 効 果 があり ません。<br />
-include_ports<br />
I/O 配 列 の 自 動 分 割 を 有 効 に し ます。<br />
1 つの 配 列 I/O ポー ト が 複 数 のポー ト に 分 割 さ れ、 各 ポー ト のサ イ ズは 個 々の 配 列 エレ メ ン ト のサ イ ズにな り ます。<br />
-scalarize_all<br />
デザイ ンのすべての 配 列 を 個 々のエレ メ ン ト に 分 割 し ます。<br />
-throughput_driven<br />
スループ ッ ト に 基 づいて 配 列 の 自 動 分 割 を 有 効 に し ます。<br />
配 列 を 個 々のエレ メ ン ト に 分 割 する こ と で 指 定 のスループ ッ ト 要 件 を 満 たすこ と がで き る かど う かは Vivado HLS<br />
で 判 断 されます。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
エレ メン ト 数 が 12 未 満 の 配 列 (グローバル 配 列 を 除 く) をすべて 個 々のエレ メ ン ト に 分 割 し ます。<br />
config_array_partition auto_partition_threshold 12 -exclude_extern_globals<br />
スループ ッ ト を 改 善 する ため、 関 数 イ ン ターフ ェ イ スの 配 列 を 含 め、 どの 配 列 を 分 割 する かが Vivado HLS で 判 断 さ<br />
れます。<br />
config_array_partition -throughput_driven -include_ports<br />
グ ローバル 配 列 を 含 む、 デザイ ンのすべての 配 列 を 個 々のエレ メ ン ト に 分 割 し ます。<br />
config_array_partition -scalarize_all<br />
config_bind<br />
説 明<br />
マイクロ アーキテクチャ バインディングのデフォルト オプシ ョ ン を 設 定 し ます。<br />
バイ ンデ ィ ングは、 加 算 、 乗 算 、 シフ ト などの 演 算 子 が 特 定 の RTL インプリ メンテーションにマップされるプロセ<br />
スの こ と を 指 し ます。 た と えば、 乗 算 (mult) 演 算 は 組 み 合 わせ、 ま たはパイ プ ラ イ ン さ れた RTL 乗 算 器 と し て イ ン<br />
プリ メントされます。<br />
構 文<br />
config_bind [OPTIONS]<br />
オプシ ョ ン<br />
-effort (low|medium|high)<br />
ラ ン タ イ ム と 最 適 化 の ト レー ド オフ と 制 御 する 最 適 化 エフ ォー ト レベルを 設 定 し ます。<br />
• デフォル ト は medium です。<br />
高 位 合 成 japan.xilinx.com 344<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• low は、 最 適 化 があ ま り 実 行 で き ない よ う なケース、 た と えば、 すべての if-else 文 の 各 分 岐 に 相 互 排 他 的 な<br />
演 算 子 があ り 、 演 算 子 の 共 有 がで き ない よ う な 場 合 に ラ ン タ イ ム を 向 上 し ます。<br />
• high は、 ラ ン タ イ ムが 長 く な り ますが、 通 常 結 果 を 向 上 させる こ と がで き ます。<br />
-min_op <br />
特 定 演 算 子 の イ ン ス タ ン ス 数 を 最 小 限 に 抑 え る よ う にする オプシ ョ ンです。 こ の よ う な 演 算 子 が 複 数 コー ド に 含 まれ<br />
る 場 合 、 最 も 少 ない 数 の RTL リソース (コア) で 演 算 子 が 共 有 さ れる よ う にな り ます。<br />
次 の 演 算 子 は 引 数 と し て 指 定 で き ます。<br />
• add - 加 算<br />
• sub - 減 算<br />
• mul - 乗 算<br />
• icmp - 整 数 比 較<br />
• sdiv - 符 号 付 き 除 算<br />
• udiv - 符 号 な し 除 算<br />
• srem - 符 号 付 き 剰 余<br />
• urem - 符 号 な し 剰 余<br />
• lshr - 論 理 右 シフ ト<br />
• ashr - 四 則 演 算 右 シフ ト<br />
• shl - 左 シフ ト<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
Vivado HLS に 次 が 命 令 されます。<br />
• バインディング プロセスでのエフォート レベルを 上 げる<br />
• 演 算 子 を イ ンプ リ メ ン ト する ため、 さ ら に 多 く のオプシ ョ ン を 試 す<br />
• よ り よ い リ ソース 使 用 率 でデザ イ ンが 生 成 さ れる よ う にする<br />
config_bind -effort high<br />
乗 算 演 算 子 の 数 を 最 小 限 に 抑 え る ので、 RTL の 乗 算 器 の 数 は 最 小 にな り ます。<br />
config_bind -min_op mul<br />
config_dataflow<br />
説 明<br />
• データ フ ロー パイプラインのデフォルト 動 作 を 指 定 します (set_directive_dataflow コマンドによ り インプリ メン<br />
トされる)。<br />
• デフォル ト のチャネル メモリ タ イ プおよびその 深 さ を 指 定 する こ と がで き ます。<br />
構 文<br />
config_dataflow [OPTIONS]<br />
高 位 合 成 japan.xilinx.com 345<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
オプシ ョ ン<br />
-default_channel (fifo|pingpong)<br />
データ フ ロー パ イ プ ラ イ ンが 使 用 さ れてい る と き、 関 数 間 ま たはループ 間 のデータ をバ ッ フ ァ ーに 入 力 する のに、<br />
pingpong 形 式 で コ ン フ ィ ギ ュ レーシ ョ ン さ れてい る RAM メモリがデフォルトで 使 用 されます。 スト リーミング<br />
データ が 使 用 さ れてい る 場 合 (データ の 読 み 込 みおよび 書 き 出 し がが 常 に 逐 次 行 われる 場 合 ) は、 FIFO メモリの 方 が<br />
効 果 的 で、 デフ ォル ト の メ モ リ タ イ プ と し て 選 択 する こ と がで き ます。<br />
ヒント : FIFO ア ク セス を 実 行 する には、 set_directive_stream コ マン ド を 使 用 し て 配 列 を ス ト リ ー ミ ン グに 設 定 する 必<br />
要 があ り ます。<br />
-fifo_depth <br />
デフォル ト の FIFO の 深 さ を 指 定 し ます。<br />
このオプションは、 pingpong 形 式 の メ モ リ が 使 用 さ れてい る 場 合 は 効 果 があ り ません。 チャ ネルで 使 用 する FIFO が<br />
指 定 さ れていない 場 合 は、 最 大 出 力 ま たは 入 力 (いずれかの 大 きいほ う ) のサ イ ズに 設 定 さ れます。 場 合 に よ っては、<br />
こ の 設 定 が 控 えめすぎて 必 要 以 上 に 大 き な FIFO が 作 成 さ れる 可 能 性 があ り ます。 こ のオプシ ョ ンは FIFO のサイズ<br />
が 必 要 以 上 に 大 き い と わかってい る 場 合 に 使 用 し て く だ さ い。<br />
注 意 : こ のオプシ ョ ン を 使 用 する には、 注 意 が 必 要 です。 間 違 って 使 用 する と 、 デザ イ ンが 正 し く 動 作 し な く な る 可<br />
能 性 があ り ます。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
デフォル ト チャネルを pingpong 形 式 の メ モ リ か ら FIFO に 変 更 し ます。<br />
config_dataflow -default_channel<br />
デフォル ト チャネルを pingpong 形 式 の メ モ リ か ら 幅 が 6 の FIFO に 変 更 し ます。<br />
config_dataflow -default_channel fifo -fifo_depth 6<br />
注 意 : エレ メン ト 数 が 6 よ り 多 い FIFO がデザイ ン イ ンプ リ メ ンテーシ ョ ンで 必 要 な 場 合 、 こ の 設 定 では RTL 検 証 エ<br />
ラーが 発 生 し ます。 ユーザーは こ のオプシ ョ ン を 上 書 きする こ と がで き ますが、 使 用 にあたっては 注 意 が 必 要 です。<br />
config_interface<br />
説 明<br />
イ ン ターフ ェ イ ス 合 成 中 に 各 関 数 の RTL ポー ト のイ ンプ リ メ ンテーシ ョ ンに 使 用 されるデフ ォル ト インターフェイ<br />
ス オプシ ョ ン を 指 定 し ます。<br />
構 文<br />
config_interface [OPTIONS]<br />
高 位 合 成 japan.xilinx.com 346<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
オプシ ョ ン<br />
-clock_enable<br />
クロック イネーブル ポー ト (ap_ce) をデザ イ ンに 追 加 し ます。<br />
クロック イネーブルがアクティブ Low の と きは、 すべての ク ロ ッ ク 操 作 が 停 止 にな り 、 その 後 に 続 く すべての 操 作<br />
が 無 効 にな り ます。<br />
-expose_global<br />
グローバル 変 数 が I/O ポー ト と し て 使 用 で き る よ う にな り ます。<br />
変 数 がグ ローバル と し て 作 成 さ れていて も、 すべての 読 み 込 みおよび 書 き 出 し ア ク セスが ローカルになっている 場<br />
合 、 リ ソースはデザ イ ン 内 に 作 成 さ れ、 RTL で I/O ポートが 必 要 なくなります。<br />
推 奨 : グ ローバル 変 数 が 外 部 ソ ースにな る よ う にする 場 合 、ま たは RTL ブロック 外 のデスティネーショ ンになるよ う<br />
にする 場 合 は、 このオプシ ョ ンを 使 用 してポート を 作 成 する 必 要 があ り ます。<br />
-trim_dangling_port<br />
構 造 体 に 基 づいたインターフェ イスのデフォル ト ビヘイビアーを 上 書 き します。<br />
デフォル ト では、 ブロ ッ ク インターフェ イ スでパッ ク されていない 構 造 体 のすべてのメ ンバーが、 デザイン ブロッ<br />
ク で 使 用 さ れるかど う かに 関 係 な く 、 RTL ポー ト にな り ます。 こ のオプシ ョ ン をオンにする と 、 生 成 さ れるブロ ッ ク<br />
で 使 用 されないイ ン ターフ ェ イ ス ポー ト すべてが 削 除 されます。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
• グローバル 変 数 が I/O ポー ト と し て 使 用 で き る よ う にな り ます。<br />
• クロック イネーブル ポー ト を 追 加 し ます。<br />
config_interface -expose_global -clock_enable<br />
config_rtl<br />
説 明<br />
使 用 さ れる リ セ ッ ト の タ イ プ、ス テー ト マシンのエンコーディ ングなど、 出 力 RTL の さ ま ざ ま な 属 性 を コ ン フ ィ ギ ュ<br />
レーシ ョ ンします。 RTL でユーザー ID 情 報 を 使 用 で き る よ う に も し ます。<br />
デフ ォル ト では、 オプシ ョ ンは 最 上 位 デザ イ ン、 およびそのデザ イ ン 内 のすべての RTL ブ ロ ッ ク に 適 用 さ れます。 特<br />
定 の RTL モデルをオプシ ョ ンで 指 定 で き ます。<br />
構 文<br />
config_rtl [OPTIONS] <br />
オプシ ョ ン<br />
-header <br />
ファイルの 内 容 をコメント としてすべての 出 力 RTL およびシ ミ ュレーシ ョ ン フ ァ イルの 冒 頭 に 挿 入 し ます。<br />
高 位 合 成 japan.xilinx.com 347<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ヒント : こ のオプシ ョ ン を 使 用 する と 、 出 力 RTL フ ァ イルにユーザー 指 定 の ID 情 報 が 含 まれる よ う にな り ます。<br />
-prefix <br />
すべての RTL エンティティ /モジ ュール 名 に 追 加 する 接 頭 辞 を 指 定 し ます。<br />
-reset (none|control|state|all)<br />
C コードで 初 期 化 される 変 数 は 常 に RTL でも (つま り ビッ ト ス ト リームでも) 同 じ 値 に 初 期 化 さ れます。 こ の 初 期 化<br />
はパワーオン 時 にのみ 実 行 され、 デザインにリセッ トが 適 用 されたときには 繰 り 返 されません。<br />
-reset オプシ ョ ン を 使 用 し て 適 用 さ れた 設 定 に よ り 、 レ ジ ス タおよび メ モ リ の リ セ ッ ト 方 法 が 決 ま り ます。<br />
• none<br />
デザイ ンに リ セ ッ ト は 追 加 されません。<br />
• control (デフォル ト )<br />
ステート マシンに 使 用 されるレジスタや I/Oプ ロ ト コル 信 号 を 生 成 する ために 使 用 さ れる よ う な 制 御 レ ジ ス タ を<br />
リセットします。<br />
• state<br />
C コー ド のス タ テ ィ ッ ク 変 数 ま たはグ ローバル 変 数 か ら 生 成 さ れた レ ジ ス タおよびレ ジ ス タ/ メモリをリセッ ト<br />
によ り 制 御 します。 C コー ド で 初 期 化 さ れる ス タ テ ィ ッ ク 変 数 ま たはグ ローバル 変 数 は、 初 期 値 に リ セ ッ ト し ま<br />
す。<br />
• all<br />
デザイ ン 内 のレジス タおよび メ モ リ をすべて リ セ ッ ト し ます。 C コー ド で 初 期 化 さ れる ス タ テ ィ ッ ク 変 数 ま たは<br />
グ ローバル 変 数 は、 初 期 値 に リ セ ッ ト し ます。<br />
-reset_async<br />
すべてのレ ジ ス タ で 非 同 期 リ セ ッ ト が 使 用 さ れる よ う にな り ます。<br />
こ のオプシ ョ ンが 指 定 さ れていない 場 合 は、 同 期 リ セ ッ ト が 使 用 さ れます。<br />
-reset_level (low|high)<br />
リ セ ッ ト 信 号 の 極 性 をア ク テ ィ ブ Low またはアクティブ High にでき ます。<br />
デフォル ト は high です。<br />
-encoding (auto|bin|onehot|gray)<br />
デザイ ンのステー ト マシンで 使 用 さ れる エン コーデ ィ ン グ 形 式 を 指 定 し ます。<br />
デフォル ト は auto です。<br />
auto エン コーデ ィ ング を 使 用 する と 、Vivado HLS で コーデ ィ ング スタイルが 決 定 されますが、ザイリンクスのロジッ<br />
ク 合 成 ツール (Vivado および ISE) でロジッ ク 合 成 中 に FSM スタイルを 抽 出 して 再 インプリ メントすることができま<br />
す。 それ 以 外 のエン コーデ ィ ン グ スタイル (bin または onehot) を 選 択 し た 場 合 は、 エン コーデ ィ ング スタイルはザイ<br />
リンクス ロ ジ ッ ク 合 成 ツールでは 最 適 化 し 直 すこ と がで き ません。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
高 位 合 成 japan.xilinx.com 348<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
例<br />
非 同 期 のア ク テ ィ ブ Low リセット 信 号 を 使 用 してすべてのレジスタがリセットされるように 出 力 RTL をコンフィ<br />
ギュレーションします。<br />
config_rtl -reset all -reset_async -reset_level low<br />
my_message.txt ファイルの 内 容 をコメント としてすべての RTL 出 力 フ ァ イルに 追 加 し ます。<br />
config_rtl -header my_mesage.txt<br />
config_schedule<br />
説 明<br />
Vivado HLS で 実 行 される スケジ ュー リ ングのデフ ォル ト タイプをコンフィギュレーションします。<br />
構 文<br />
config_schedule [OPTIONS]<br />
オプシ ョ ン<br />
-effort (high|medium|low)<br />
ス ケジ ュー リ ング 中 に 使 用 する エフ ォー ト を 指 定 し ます。<br />
• デフォル ト は medium です。<br />
• low は、 ラ ン タ イ ム を 改 善 し ます。 デザ イ ン イ ンプ リ メ ンテーシ ョ ンに 改 善 の 余 地 があ ま り ないケースで 指 定<br />
する と メ リ ッ トがあるこ とがあ り ます。<br />
• high は、 ラ ン タ イ ムが 長 く な り ますが、 通 常 結 果 を 向 上 させる こ と がで き ます。<br />
-verbose<br />
ス ケジ ュー リ ングで 指 示 子 や 制 約 を 満 たす こ と がで き ない と き の ク リ テ ィ カル パスを 出 力 します。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
ラ ン タ イ ム を 短 縮 させる ためデフ ォル ト のス ケジ ュール エフォート を low に 変 更 し ます。<br />
config_schedule -effort low<br />
cosim_design<br />
説 明<br />
元 の C ベースのテ ス ト ベンチを 使 用 し て、 合 成 さ れた RTL の 合 成 後 協 調 シ ミ ュ レーシ ョ ン を 実 行 する コ マン ド です。<br />
テス ト ベンチ 用 のフ ァ イルを 指 定 するには、 次 のコマン ド を 実 行 し ます。<br />
add_files -tb<br />
シミュレーションはアクティブ ソ リ ューシ ョ ンの 下 位 デ ィ レ ク ト リ の sim/ で 実 行 されます。<br />
高 位 合 成 japan.xilinx.com 349<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
説 明 :<br />
• は -rtl オプシ ョ ンで 指 定 さ れます。<br />
cosim_design でデザ イ ン を 検 証 する には、 次 を 使 用 する 必 要 があ り ます。<br />
• ap_ctrl_hs という インターフェイス モー ド を 使 用 する 必 要 があ り ます。<br />
• 次 のいずれかのイ ン ターフ ェ イ ス モー ド を 各 出 力 ポー ト で 使 用 する 必 要 があ り ます。<br />
° ap_vld<br />
° ap_ovld<br />
° ap_hs<br />
° ap_memory<br />
° ap_fifo<br />
° ap_bus<br />
インターフェイス モード は、 書 き 出 し Valid 信 号 を 使 用 し ていつ 出 力 が 書 き 出 さ れるか 指 定 し ます。<br />
構 文<br />
cosim_design [OPTIONS]<br />
オプシ ョ ン<br />
-reduce_diskspace<br />
こ のオプシ ョ ンでは、 デ ィ ス ク 容 量 節 約 フ ローが 実 行 さ れ、 シ ミ ュ レーシ ョ ン 中 に 使 用 さ れるデ ィ ス ク 容 量 が 削 減 さ<br />
れますが、 ラ ン タ イ ム と メ モ リ 容 量 が 増 加 し て し ま う 可 能 性 があ り ます。<br />
-rtl (systemc|vhdl|verilog)<br />
C テ ス ト ベンチでの 検 証 にどの RTL を 使 用 する かを 選 択 し ます。<br />
Verilog および VHDL の 場 合 は、 -tool オプシ ョ ン を 使 用 し てシ ミ ュ レーターを 指 定 する 必 要 があ り ます。 デフ ォル<br />
トは systemc です。<br />
-setup<br />
アクティブ ソリューションの sim/ ディレク ト リにシミ ュレーション フ ァ イルがすべて 作 成 さ れますが、 シ<br />
ミュレーションは 実 行 されません。<br />
-tool (*auto* | vcs | modelsim | riviera | isim | xsim | ncsim)<br />
C テス トベンチを 使 用 して RTL を 協 調 シミュレーションするのに 使 用 するシミュレーターを 指 定 します。<br />
SystemC の 協 調 シ ミ ュ レーシ ョ ンにはツールを 指 定 する 必 要 はあ り ません。Vivado HLS に 含 まれている SystemC カー<br />
ネルが 使 用 されます。<br />
-trace_level ( *none* | all | port | port_hier)<br />
実 行 さ れる ト レース ファイルの 出 力 レベルを 指 定 します。<br />
C/RTL 協 調 シ ミ ュ レーシ ョ ン 中 の 波 形 ト レースのレベルを 指 定 し ます。all オプシ ョ ン を 使 用 する と 、すべてのポー ト<br />
および 信 号 波 形 が ト レース ファイルに 保 存 され、port オプシ ョ ン を 使 用 する と 、 最 上 位 ポー ト の 波 形 ト レースのみが<br />
保 存 さ れ、 port_hier オプシ ョ ン を 使 用 する と 、 そのデザ イ ン 階 層 のポー ト すべての 波 形 ト レースが 保 存 さ れます。 ト<br />
レース フ ァ イルは、 シ ミ ュ レーシ ョ ンが 実 行 さ れる と 、 現 在 の ソ リ ューシ ョ ンの sim/ ディレク ト リに 保 存 さ<br />
れます。 ディレク ト リは、 -rtl オプシ ョ ンでの 選 択 (verilog、 vhdl または systemc) によって 異 なり ます。<br />
デフォル ト は none です。<br />
高 位 合 成 japan.xilinx.com 350<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
-O<br />
C テス トベンチおよび RTL ラ ッ パーの 最 適 化 コ ンパイルを 実 行 し ます。<br />
最 適 化 を 実 行 し ない 場 合 は、 cosim_design に よ り で き る かぎ り 短 時 間 でテ ス ト ベンチがコ ンパイル さ れます。<br />
可 能 であれば、 コ ンパイルに 時 間 がかかって も、 ラ ン タ イ ム パフ ォーマン ス を 改 善 する ために 最 適 化 を 実 行 し て く だ<br />
さ い。 実 行 フ ァ イルの ラ ン タ イ ム 速 度 が 向 上 する 可 能 性 はあ り ますが、 ラ ン タ イ ムが 改 善 する かど う かはデザ イ ンに<br />
よ って 異 な り ます。 ラ ン タ イ ム 目 的 で 最 適 化 を 行 う と 、 大 型 関 数 のために メ モ リ 使 用 量 が 多 く 必 要 と な る 可 能 性 があ<br />
ります。<br />
-argv <br />
ビヘイビアー テス トベンチの 引 数 リ ス ト を 指 定 します。<br />
はメイン C 関 数 に 渡 さ れます。<br />
-coverage<br />
VCS シ ミ ュ レーターを 使 用 し たシ ミ ュ レーシ ョ ンでの 範 囲 を 指 定 し ます。<br />
-ignore_init <br />
で 指 定 さ れる 最 初 の ク ロ ッ ク サ イ ク ル 数 に 対 し、 比 較 チェ ッ ク を 無 効 に し ます。<br />
これは、 未 知 の 値 ('hX) で RTL が 開 始 する タ イ ミ ン グ を 確 認 する のに 便 利 です。<br />
-ldflags <br />
協 調 シ ミ ュ レーシ ョ ンのために リ ンカーに 渡 すオプシ ョ ン を 指 定 し ます。<br />
通 常 は、 イ ン ク ルー ド パス 情 報 および C テ ス ト ベンチの ラ イ ブ ラ リ 情 報 を 渡 すのに 使 用 さ れます。<br />
-mflags <br />
SystemC シ ミ ュ レーシ ョ ンのためにコ ンパイ ラ に 渡 すオプシ ョ ン を 指 定 し ます。<br />
通 常 、 コ ンパイルの 速 度 を 上 げる ために 使 用 さ れます。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
SystemC RTL を 使 用 し た 検 証 が 実 行 さ れます。<br />
cosim_design<br />
Verilog RTL を 検 証 する ため VCS シミュレーターを 使 用 し、 波 形 トレース ファイルの 保 存 をイネーブルにします。<br />
cosim_design -tool VCS -rtl verilog -coverage -trace_level all<br />
ModelSim を 使 用 して VHDL RTL を 検 証 します。 値 5 および 1 がテス ト ベンチ 関 数 に 渡 され RTL 検 証 で 使 用 さ れます。<br />
cosim_design -tool modelsim -rtl vhdl -argv "5 1"<br />
SystemC RTL 用 に 最 適 化 さ れたシ ミ ュ レーシ ョ ン モデルを 作 成 し ますが、 シ ミ ュ レーシ ョ ンは 実 行 さ れません。 シ<br />
ミ ュ レーシ ョ ン を 実 行 する には、 ア ク テ ィ ブ ソ リューションの sim/systemc ディレク ト リで run.sh を 実 行 しま<br />
す。<br />
cosim_design -O -setup<br />
高 位 合 成 japan.xilinx.com 351<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
create_clock<br />
説 明<br />
現 在 の ソ リ ューシ ョ ンの 仮 想 ク ロ ッ ク を 作 成 し ます。<br />
このコマンドはアクティブ ソ リ ューシ ョ ンのコ ンテン ツでのみ 実 行 さ れます。 その ク ロ ッ ク 周 期 は 自 動 最 適 化 ( 指 定<br />
ク ロ ッ ク 周 期 で 可 能 な 限 り の 数 の 演 算 をチェーン 接 続 ) を 駆 動 する 制 約 です。<br />
C および C++ デザイ ンでは、 ク ロ ッ ク 1 つのみがサポー ト されます。 SystemC デザイ ンの 場 合 は、 複 数 の 指 定 ク ロ ッ<br />
クを 作 成 し、 set_directive_clock コマンドを 使 用 して 異 なる SC_MODULE に 適 用 でき ます。<br />
構 文<br />
create_clock -period [OPTIONS]<br />
オプシ ョ ン<br />
-name <br />
ク ロ ッ ク 名 を 指 定 し ます。<br />
名 前 が 指 定 さ れていない 場 合 は、 デフ ォル ト 名 が 使 用 さ れます。<br />
-period <br />
ナノ 秒 (ns) または MHz で ク ロ ッ ク 周 期 を 指 定 し ます。<br />
• 単 位 が 指 定 さ れていない 場 合 は、 デフ ォル ト で ns が 使 用 されます。<br />
• 周 期 が 指 定 さ れていない 場 合 は、 デフ ォル ト で 10ns の 周 期 が 使 用 さ れます。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
50ns の ク ロ ッ ク 周 期 を 指 定 し ます。<br />
create_clock -period 50<br />
デフォル ト 周 期 10ns を 使 用 し て ク ロ ッ ク を 指 定 し ます。<br />
create_clock<br />
SystemC デザ イ ンの 場 合 は、 複 数 の 指 定 ク ロ ッ ク を 作 成 する こ と がで き ます (set_directive_clock コマンドを 使 用 )。<br />
create_clock -period 15 fast_clk<br />
create_clock -period 60 slow_clk<br />
ク ロ ッ ク 周 波 数 を MHz で 指 定 し ます。<br />
create_clock -period 100MHz<br />
高 位 合 成 japan.xilinx.com 352<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
csim_design<br />
説 明<br />
指 定 し た C テ ス ト ベンチを 使 用 し て 合 成 前 の C シ ミ ュ レーシ ョ ン を コ ンパイルし て 実 行 し ます。<br />
テ ス ト ベンチ 用 のフ ァ イルを 指 定 する には、 add_file -tb を 使 用 します。 シ ミ ュレーシ ョ ンの 作 業 ディ レ ク ト リ<br />
は、 ア ク テ ィ ブ ソ リューション 内 の csim です。<br />
構 文<br />
csim_design [OPTIONS]<br />
オプシ ョ ン<br />
-O<br />
コ ンパイルの 最 適 化 を イ ネーブルに し ます。<br />
デフ ォル ト では、 デバ ッ グを イ ネーブルにする ためにコ ンパイルがデバ ッ グ モー ド で 実 行 さ れます。<br />
-argv <br />
C テス トベンチの 引 数 リ ス ト を 指 定 します。<br />
は C テス トベンチの 関 数 に 渡 さ れます。<br />
-clean<br />
クリーン ビルド をイネーブルにします。<br />
このオプショ ンがないと、 csim_design はインク リ メンタルにコンパイルします。<br />
-ldflags <br />
C シミュレーションのためにリンカーに 渡 すオプションを 指 定 します。<br />
通 常 は、 C テ ス ト ベンチおよびデザ イ ンの ラ イ ブ ラ リ 情 報 を 渡 すのに 使 用 さ れます。<br />
-mflags <br />
C シ ミ ュ レーシ ョ ンのためにコ ンパイ ラ に 渡 すオプシ ョ ン を 指 定 し ます。<br />
通 常 、 コ ンパイルの 速 度 を 上 げる ために 使 用 さ れます。<br />
-setup<br />
アクティブ ソ リューションの csim ディレク ト リに C シミュレーション バイナリが 作 成 されますが、シミ ュレーショ<br />
ンは 実 行 されません。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
C シ ミ ュ レーシ ョ ン を コ ンパイルし て 実 行 し ます。<br />
csim_design<br />
高 位 合 成 japan.xilinx.com 353<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ソース デザイ ン と テス ト ベンチを コ ンパイルし、 シ ミ ュ レーシ ョ ン バイナリ を 生 成 しますが、 バイナリは 実 行 しま<br />
せん。 シ ミ ュ レーシ ョ ンを 実 行 するには、 ア ク テ ィ ブ ソリューションの csim/build ディレク ト リで run.sh を<br />
実 行 し ます。<br />
csim_design -O -setup<br />
csynth_design<br />
説 明<br />
アクティブ ソ リューション 用 に Vivado HLS データベース を 合 成 し ます。<br />
このコマンドはアクティブ ソ リ ューシ ョ ンのコ ンテン ツでのみ 実 行 で き ます。データベースにあ る エ ラ ボレー ト さ れ<br />
たデザ イ ンは、 設 定 さ れてい る 制 約 に 基 づいて ス ケジ ュール さ れ RTL にマップされます。<br />
構 文<br />
csynth_design<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
最 上 位 デザ イ ンでVivado HLS の 合 成 を 実 行 し ます。<br />
csynth_design<br />
delete_project<br />
構 文<br />
説 明 :<br />
delete_project <br />
• はプロジェ ク ト 名 です。<br />
説 明<br />
プ ロ ジ ェ ク ト に 関 連 付 け ら れてい るデ ィ レ ク ト リ を 削 除 し ます。<br />
delete_project コ マン ド では、 削 除 前 に、 該 当 する プ ロ ジ ェ ク ト ディレク ト リ が 有 効 なVivado HLS プ<br />
ロ ジ ェ ク ト であ る かど う かチェ ッ ク さ れます。 現 在 の 作 業 デ ィ レ ク ト リ にデ ィ レ ク ト リ が 存 在 し ない 場 合<br />
は、 こ のコ マン ド は 効 果 があ り ません。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
Project_1 を 削 除 します。 ./Project_1 デ ィ レ ク ト リ およびそれに 含 まれる も のをすべて 削 除 し ます。<br />
delete_project Project_1<br />
高 位 合 成 japan.xilinx.com 354<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
delete_solution<br />
構 文<br />
説 明 :<br />
delete_solution <br />
• は 削 除 する ソ リ ューシ ョ ンです。<br />
説 明<br />
アクティブ プロジェクトからソリューションを 削 除 し、プロジェクト ディレク ト リから 下 位 デ ィ レ ク ト<br />
リ を 削 除 し ます。<br />
プロジェク ト デ ィ レ ク ト リ に ソ リ ューシ ョ ンが 存 在 し ない 場 合 は、 こ のコマン ド は 効 果 があ り ません。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
アクティブ プロジェク トからSolution_1 という ソ リ ューションを 削 除 し、アクティブ プ ロ ジ ェ ク ト か ら 下 位 デ ィ<br />
レク ト リの Solution_1 を 削 除 します。<br />
delete_solution Solution_1<br />
export_design<br />
説 明<br />
ダウンス ト リーム ツール 用 に RTL の 合 成 済 みデザ イ ン をエ ク ス ポー ト し て IP としてパッケージにします。<br />
サポー ト される IP フォーマッ トは 次 のとおりです。<br />
• IP カタログ<br />
• Pcore<br />
• System Generator<br />
パ ッ ケージ さ れたデザ イ ンは、 次 の 下 位 デ ィ レ ク ト リ のいずれかのア ク テ ィ ブ ソ リューションの impl ディレク ト リ<br />
に 保 存 されます。<br />
• pcore<br />
• ip<br />
• sysgen<br />
構 文<br />
export_design [OPTIONS]<br />
オプシ ョ ン<br />
-description <br />
生 成 し た IP カタログ IP の 詳 細 が 提 供 さ れます。<br />
高 位 合 成 japan.xilinx.com 355<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
-evaluate (verilog|vhdl)<br />
フォーマッ トによって、 ISE または Vivado を 使 用 し、 指 定 した HDL の さ ら に 正 確 な タ イ ミ ン グ と 使 用 量 データ を 取<br />
得 します。<br />
• エクスポート フォーマッ トが pcore の 場 合 は ISE が 使 用 されます。<br />
• エクスポート フォーマッ トが pcore 以 外 の 場 合 は Vivado が 使 用 されます。<br />
-format (pcore|sysgen|sysgen_ise|ip_catalog|syn_dcp)<br />
IP をパッケージするフォーマッ ト を 指 定 します。<br />
サポー ト されるフォーマッ ト は、 次 のとおり です。<br />
• pcore<br />
EDK pcore (6 シリーズおよびそれ 以 前 のデバイスのデフォルト)<br />
• sysgen<br />
Vivado Design Suit の System Generator for DSP で 使 用 でき る フ ォーマ ッ ト (7 シリーズ FPGA デバイ スのみ)<br />
• sysgen_ise<br />
ISE の System Generator for DSP で 使 用 でき る フ ォーマ ッ ト (すべてのデバイ ス)<br />
• ip_catalog<br />
Vivado IP カ タ ロ グに 追 加 する のに 適 し た フ ォーマ ッ ト (ザイ リ ンクス 7 シリーズ FPGA デバイ スのデフ ォル ト )<br />
• syn_dcp<br />
Vivado の 合 成 済 みチェ ッ ク ポ イ ン ト ファイル (ザイ リ ンクス 7 シ リーズ FPGA デバイ スのみ)。 このオプション<br />
を 使 用 する と 、 RTL 合 成 が 自 動 的 に 実 行 さ れます。<br />
ヒント : フ ォーマ ッ ト が 指 定 されければ、ターゲ ッ ト デバイ スが 7 シリーズ FPGA デバイ スおよびそれ 以 降 の 場 合 は<br />
ip_catalog が、 それ 以 外 の 場 合 は pcore が 使 用 されます。<br />
-library <br />
生 成 する IP カタログ IP のライブラ リ 名 を 指 定 します。<br />
-use_netlist ( none | ip | top )<br />
RTL の 代 わ り に 生 成 されるネ ッ ト リ ス ト (.ngc ファイル) を 指 定 し ます。 pcore に 対 し てのみ 使 用 で き ます。<br />
• none<br />
デザイ ンのネ ッ ト リ ス ト は 生 成 されません。<br />
• ip<br />
ザイ リ ンクス IP がある 場 合 はそのネッ ト リ ス ト を 生 成 します。<br />
• top<br />
最 上 位 デザ イ ンのネ ッ ト リ ス ト を 生 成 し ます。<br />
-vendor <br />
生 成 する IP カタログ IP のベンダー 文 字 列 を 指 定 し ます。<br />
高 位 合 成 japan.xilinx.com 356<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
-version <br />
生 成 する IP カタログまたは pcore IP のバージ ョ ン 文 字 列 を 指 定 し ます。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
System Generator 用 に RTL をエクスポート します。<br />
export_design -format sysgen<br />
EDK の pcore 用 に RTL をエクスポート します。<br />
export_design -format pcore<br />
IP カタログ 用 に RTL をエクスポート します。 VHDL を 評 価 して、 Vivado を 使 用 し て よ り 良 い タ イ ミ ングおよび 使 用<br />
量 データ を 取 得 し ます。<br />
export_design -evaluate vhdl -format ip_catalog<br />
help<br />
説 明<br />
• に 何 も 指 定 し ない 場 合 、 Vivado HLS Tcl コマンドをすべてリ ス ト します。<br />
• Vivado HLS Tcl コ マン ド を 引 数 と し て 指 定 する と 、 その 特 定 コ マン ド の 情 報 が 表 示 さ れます。<br />
コ マン ド 引 数 を 入 力 する と き タ ブ キーを 押 す と 、 自 動 的 に 有 効 なVivado HLS コマンドが 入 力 されます。<br />
構 文<br />
help [OPTIONS] <br />
説 明 :<br />
• はヘルプを 表 示 する コ マン ド です。<br />
オプシ ョ ン<br />
このコマンドにはオプシ ョ ンはありません。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
すべての コ マン ド および 指 示 子 に 対 するヘルプを 表 示 し ます。<br />
help<br />
add_files コマンドのヘルプを 表 示 します。<br />
help add_files<br />
高 位 合 成 japan.xilinx.com 357<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
list_core<br />
説 明<br />
現 在 イ ン ス ト ール さ れてい る ラ イ ブ ラ リ にあ る コ アをすべて リ ス ト し ます。<br />
コアは、 出 力 RTL に 加 算 、 乗 算 、 メ モ リ などの 演 算 を イ ンプ リ メ ン ト する ために 使 用 する コ ンポーネン ト です。<br />
エラボレーショ ンの 後 、RTL の 演 算 は 内 部 データベースに 演 算 子 と し て 表 示 さ れます。 ス ケジ ュー リ ング 中 、 RTL デ<br />
ザ イ ン を イ ンプ リ メ ン ト する ため、 演 算 子 は ラ イ ブ ラ リ のコ アにマ ッ プ さ れます。 複 数 の 演 算 子 を 1 つのコ アの 同 じ<br />
インスタンスにマップし、 同 じ RTL リ ソース を 共 有 する こ と も 可 能 です。<br />
次 の 関 連 オプシ ョ ン を 使 用 し て、 list_core コ マン ド では 使 用 可 能 な 演 算 子 およびコ ア を」 リ ス ト する こ と がで き ます。<br />
• operation<br />
• type<br />
各 演 算 を イ ンプ リ メ ン ト する ために、 ラ イ ブ ラ リ で 使 用 可 能 な コ アを 表 示 し ます。<br />
使 用 可 能 な コ ア を タ イ プ 別 に 表 示 し ます。 た と えば、 論 理 演 算 を イ ンプ リ メ ン ト する タ イ プ、 メ モ リ ま たはス ト<br />
レージをインプ リ メ ン トする タ イプなどです。<br />
オプシ ョ ンが 指 定 さ れていない 場 合 は、 ラ イ ブ ラ リ の コ アがすべて 表 示 さ れます。<br />
ヒント : list_core コマンド と set_directive_resource を 使 用 し て 表 示 さ れる 情 報 は、 特 定 の 演 算 を 特 定 の コ アに イ ンプ リ<br />
メ ン ト する ために 使 用 し ます。<br />
構 文<br />
list_core [OPTIONS]<br />
オプシ ョ ン<br />
-operation (opers)<br />
ライブラリにある、 指 定 されている 演 算 をインプリメントすることができるコアをリストします。 演 算 は、 次 のとお<br />
りです。<br />
• add - 加 算<br />
• sub - 減 算<br />
• mul - 乗 算<br />
• udiv - 符 号 な し 除 算<br />
• urem - 符 号 な し 剰 余<br />
• srem - 符 号 付 き 剰 余<br />
• icmp - 整 数 比 較<br />
• shl - 左 シフ ト<br />
• lshr - 論 理 右 シフ ト<br />
• ashr - 四 則 演 算 右 シフ ト<br />
• mux - マルチプレ クサー<br />
• load - メ モ リ 読 み 込 み<br />
• store - メモリ 格 納<br />
• fiforead - FIFO 読 み 込 み<br />
高 位 合 成 japan.xilinx.com 358<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• fifowrite - FIFO 書 き 出 し<br />
• fifonbread - 非 ブロ ッ キング FIFO 読 み 込 み<br />
• fifonbwrite - 非 ブロ ッ キング FIFO 書 き 出 し<br />
-type (functional_unit|storage|connector|adapter|ip_block)<br />
指 定 し た タ イ プの コ アのみを リ ス ト し ます。<br />
• functional_unit<br />
標 準 RTL 演 算 ( 加 算 、 乗 算 、 比 較 など) をインプリ メントするコア<br />
• storage<br />
レジスタやメモリなどのス ト レージ エレメントをインプリ メントするコア<br />
• connector<br />
直 接 接 続 やス ト リ ー ミ ング ス トレージ エレメントを 含 む、デザイン 内 のコネクティビティをインプリ メントす<br />
るコア<br />
• adapter<br />
IP 生 成 時 に 最 上 位 デザ イ ン を 接 続 する ために 使 用 する イ ン ターフ ェ イ ス を イ ンプ リ メ ン ト する コ ア。こ れ ら の イ<br />
ンターフェイスは IP 生 成 フ ロー (ザイ リ ンクス EDK) で 使 用 される RTL ラッパーにインプリメントされます。<br />
• ip_block<br />
ユーザーが 追 加 し た IP コア<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
現 在 イ ン ス ト ール さ れてい る ラ イ ブ ラ リ にあ る コ アの 中 で、add 演 算 を イ ンプ リ メ ン ト する こ と がで き る コ ア をすべ<br />
てリストします。<br />
list_core -operation add<br />
ラ イ ブ ラ リ にあ る 使 用 可 能 な メ モ リ (ス トレージ) コアをすべてリ ス ト します。<br />
list_core -type storage<br />
ヒント : 使 用 可 能 な メ モ リ の 1 つを 使 用 し て 配 列 を イ ンプ リ メ ン ト する には、set_directive_resource コマンドを 使 用 し<br />
ます。<br />
list_part<br />
説 明<br />
• ファミ リが 指 定 される 場 合 は、 そのサポート デバイ ス ファミ リ、 またはそのファミ リでサポート されるパーツ<br />
を 表 示 します。<br />
• ファミ リが 指 定 されていない 場 合 は、 すべてのサポート されるファミ リをリストします。<br />
高 位 合 成 japan.xilinx.com 359<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ヒント : コマンドにオプショ ンを 指 定 しないときに 表 示 されるサポート ファミ リの 中 から 1 つ 選 択 し、 それをオプ<br />
シ ョ ンに 指 定 する と 、 そのフ ァ ミ リ のサポー ト パーツが リ ス ト されます。<br />
構 文<br />
list_part [OPTIONS]<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
すべてのサポー ト さ れる フ ァ ミ リ を リ ス ト し ます。<br />
list_part<br />
サポー ト される Virtex-6 パーツ をすべて リ ス ト し ます。<br />
list_part virtex6<br />
open_project<br />
説 明<br />
既 存 プ ロ ジ ェ ク ト を 開 く か、 ま たは 新 規 プ ロ ジ ェ ク ト を 作 成 し ます。<br />
Vivado HLS の 1 セッションでアクティブになるプロジェク トは 1 つだけです。 1 プロジェク トには 複 数 のソ リ ュー<br />
ションを 含 めることができます。<br />
プ ロ ジ ェ ク ト を 閉 じ る には、 次 のいずれかの 手 順 に 従 います。<br />
• close_project コマンドを 使 用 します。<br />
• open_project コ マン ド で 別 のプ ロ ジ ェ ク ト を 開 始 し ます。<br />
delete_project コマンドを 使 用 して、プロジェク ト デ ィ レ ク ト リ およびそれに 関 連 付 け られてい る ソ リ ューシ ョ ン をす<br />
べて 完 全 にデ ィ ス ク か ら 削 除 し ます。<br />
構 文<br />
説 明 :<br />
open_project [OPTIONS] <br />
• はプロジェ ク ト 名 です。<br />
オプシ ョ ン<br />
-reset<br />
• 既 存 のプ ロ ジ ェ ク ト データ を 削 除 し てプ ロ ジ ェ ク ト を リ セ ッ ト し ます。<br />
• デザイ ン ソース ファイル、ヘッダー フ ァ イルの 検 索 パス、 最 上 位 関 数 に 関 する プ ロ ジ ェ ク ト 情 報 を 削 除 し ます。<br />
関 連 ソ リ ューシ ョ ン デ ィ レ ク ト リ およびフ ァ イルは 保 持 さ れますが、 結 果 は 無 効 になって し ま ってい る 可 能 性 が<br />
あります。<br />
注 記 : delete_project コマンドでも -reset オプシ ョ ン と 同 じ 効 果 があ り 、すべての ソ リ ューシ ョ ン データ を 削 除 で き<br />
ます。<br />
高 位 合 成 japan.xilinx.com 360<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
推 奨 : このオプションは、 Tcl スクリプトを 使 用 してVivado HLS を 実 行 している と きに 使 用 して く ださい。 それ 以 外<br />
の 場 合 は、 add_files コ マン ド が 新 し く 実 行 さ れる たびに 追 加 フ ァ イルが 既 存 データ に 追 加 さ れます。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
Project_1 と い う 名 前 の 新 規 ま たは 既 存 プ ロ ジ ェ ク ト を 開 き ます。<br />
open_project Project_1<br />
プ ロ ジ ェ ク ト を 開 いて、 既 存 データ をすべて 削 除 し ます。<br />
open_project -reset Project_2<br />
推 奨 : Tcl ス ク リ プ ト で こ の 方 法 を 使 用 する と 、 既 存 プ ロ ジ ェ ク ト データ に ソ ース ま たは ラ イ ブ ラ リ ファイルが 追 加<br />
されないよ うになり ます。<br />
open_solution<br />
説 明<br />
アクティブ プロジェク トで 既 存 のソ リ ューショ ンを 開 いたり、 新 規 ソ リ ューショ ンを 作 成 します。<br />
注 意 : アクティブ プロジェ ク ト がない と きにソ リ ューシ ョ ンを 開 いた り 作 成 し よ う とする と、 エラーが 発 生 し ます。<br />
Vivado HLS の 1 セッションでアクティブなソリューションは 1 つだけです。<br />
現 在 のプ ロ ジ ェ ク ト デ ィ レ ク ト リ の 下 に 各 ソ リ ューシ ョ ンの 下 位 デ ィ レ ク ト リ で 管 理 さ れています。ソ リ ューシ ョ ン<br />
が 現 在 の 作 業 デ ィ レ ク ト リ に 存 在 し ない 場 合 は、 新 し い ソ リ ューシ ョ ンが 作 成 さ れます。<br />
ソ リ ューシ ョ ンを 閉 じ るには、 次 のいずれかの 手 順 に 従 います。<br />
• close_solution コマンドを 実 行 します。<br />
• open_solution コマンドで 別 のソ リ ューショ ンを 開 きます。<br />
delete_solution コ マン ド を 使 用 する と 、 プ ロ ジ ェ ク ト か ら ソ リ ューシ ョ ンが 削 除 さ れ、 該 当 する 下 位 デ ィ レ ク ト リ も<br />
削 除 さ れます。<br />
構 文<br />
説 明 :<br />
open_solution [OPTIONS] <br />
• はソ リ ューショ ン 名 です。<br />
オプシ ョ ン<br />
-reset<br />
• ソ リ ューシ ョ ンが 既 に 存 在 する 場 合 は、 ソ リ ューシ ョ ン データ が リ セ ッ ト さ れます。 ラ イ ブ ラ リ 、 制 約 、 および<br />
指 示 子 に 関 する 前 の ソ リ ューシ ョ ン 情 報 は 削 除 さ れます。<br />
高 位 合 成 japan.xilinx.com 361<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• 合 成 、 検 証 、 イ ンプ リ メ ンテーシ ョ ンの 結 果 も 削 除 さ れます。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
アクティブ プロジェク トに、 Solution_1 と い う 名 前 の 新 規 ソ リ ューシ ョ ン ま たは 既 存 の ソ リ ューシ ョ ン を 開 き ま<br />
す。<br />
open_solution Solution_1<br />
アクティブ プ ロ ジ ェ ク ト で ソ リ ューシ ョ ン を 開 き ます。 既 存 データ を 削 除 し ます。<br />
open_solution -reset Solution_2<br />
推 奨 : Tcl ス ク リ プ ト で こ の 方 法 を 使 用 する と 、 既 存 ソ リ ューシ ョ ン データ に 追 加 が さ れない よ う にな り ます。<br />
set_clock_uncertainty<br />
説 明<br />
create_clock で 定 義 さ れてい る ク ロ ッ ク 周 期 のマージン を 設 定 し ます。<br />
マージンは、 実 質 のクロック 周 期 を 作 成 するためクロック 周 期 から 差 し 引 かれます。クロックのばらつきが 定 義 され<br />
ていない 場 合 は、 デフ ォル ト で ク ロ ッ ク 周 期 の 12.5% となります。<br />
Vivado HLS では、 有 効 な ク ロ ッ ク 周 期 に 基 づいてデザ イ ンが 最 適 化 さ れ、 ダ ウ ン ス ト リ ーム ツールにマージンが 提<br />
供 さ れ、 ロ ジ ッ ク 合 成 および 配 線 で 考 慮 さ れます。 こ の コ マン ド はア ク テ ィ ブ ソ リューションのコンテンツでのみ 実<br />
行 されます。Vivado HLS ではすべての 出 力 フ ァ イルで 指 定 さ れた ク ロ ッ ク 周 期 が 使 用 さ れ、 検 証 およびイ ンプ リ メ ン<br />
テーシ ョ ンで 使 用 さ れます。<br />
create_clock コマンドで 複 数 のクロックが 指 定 されている SystemC デザ イ ンの 場 合 、 各 ク ロ ッ ク を 指 定 する こ と で、 ク<br />
ロックごとに 異 なるばらつきを 指 定 することができます。<br />
構 文<br />
説 明 :<br />
set_clock_uncertainty <br />
• は、 ク ロ ッ ク のばらつき ま たはマージン と し て 使 用 さ れる ク ロ ッ ク 周 期 を 表 す 値 で、 単 位 はナ ノ 秒<br />
(ns) です。<br />
• は、 ばらつき を 適 用 する ク ロ ッ ク の リ ス ト です。 何 も 指 定 し なければ、 すべての ク ロ ッ ク に 適 用 さ れ<br />
ます。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
クロックのばらつきまたはマージンを 0.5ns に 指 定 し ます。 これによ り 、 Vivado HLS で 使 用 可 能 な ク ロ ッ ク 周 期 が<br />
0.5ns 削 減 さ れます。<br />
set_clock_uncertainty 0.5<br />
高 位 合 成 japan.xilinx.com 362<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
この SystemC の 例 では、 ク ロ ッ ク ドメインを 2 つ 作 成 し、 ド メ イ ン ご と に 異 な る ク ロ ッ ク のばらつき を 指 定 し てい<br />
ます。<br />
create_clock -period 15 fast_clk<br />
create_clock -period 60 slow_clk<br />
set_clock_uncertainty 0.5 fast_clock<br />
set_clock_uncertainty 1.5 slow_clock<br />
ヒント : SystemC デザイ ンではマルチ クロックがサポートされています。 クロックを 該 当 関 数 に 適 用 するには<br />
set_directive_clock コマンドを 使 用 します。<br />
set_directive_allocation<br />
説 明<br />
リ ソース 割 り 当 てのための イ ン ス タ ン ス 制 限 を 指 定 し ます。<br />
特 定 の 関 数 ま たは 演 算 を イ ンプ リ メ ン ト するのに 使 用 さ れる RTL インスタンスの 数 を 定 義 または 制 限 します。 たと<br />
えば、 foo_sub という 関 数 のインスタンスが 4 つ C ソース コー ド にあ る 場 合 、 set_directive_allocation コマンドを 使<br />
用 する と 、 最 終 RTL では foo_sub のインスタンスを 1 つだけにする こ と ができ ます。 同 じ RTL ブロックを 使 用 し<br />
て、 4 つすべての イ ン ス タ ン スが イ ンプ リ メ ン ト さ れます。<br />
構 文<br />
説 明 :<br />
set_directive_allocation [OPTIONS] <br />
• は function[/label] のフ ォーマ ッ ト の ロ ケーシ ョ ン 文 字 列 です。<br />
• は 関 数 ま たは 演 算 子 です。<br />
関 数 には、 次 が 実 行 さ れていない 元 の C コー ド のいずれかの 関 数 を 指 定 で き ます。<br />
• set_directive_inline コマンドによるインライン 化<br />
• Vivado HLS に よ る 自 動 的 な イ ン ラ イ ン 化<br />
演 算 子 の リ ス ト は 次 の と お り です (C ソース コー ド に 演 算 の イ ン ス タ ン スがあ る 場 合 )。<br />
• add - 加 算<br />
• sub - 減 算<br />
• mul - 乗 算<br />
• icmp - 整 数 比 較<br />
• sdiv - 符 号 付 き 除 算<br />
• udiv - 符 号 な し 除 算<br />
• srem - 符 号 付 き 剰 余<br />
• urem - 符 号 な し 剰 余<br />
• lshr - 論 理 右 シフ ト<br />
• ashr - 四 則 演 算 右 シフ ト<br />
• shl - 左 シフ ト<br />
高 位 合 成 japan.xilinx.com 363<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
オプシ ョ ン<br />
-limit <br />
RTL デザ イ ンで 使 用 する イ ン ス タ ン ス (-type オプシ ョ ンで 指 定 されている タ イプのインス タンス) の 最 大 数 を 設 定<br />
します。<br />
-type (function|operation)<br />
インスタンス タイプには、function (デフォル ト ) または operation を 指 定 できます。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS allocation \<br />
instances= \<br />
limit= \<br />
<br />
デザイ ン foo_top には、 関 数 foo の イ ン ス タ ン ス をが 複 数 含 まれ、 RTL での foo のインスタンス 数 を 2 に 制 限 し<br />
ています。<br />
set_directive_allocation -limit 2 -type function foo_top foo<br />
#pragma HLS allocation instances=foo limit=2 function<br />
My_func のインプリ メンテーショ ンで 使 用 される 乗 算 器 の 数 を 1 に 制 限 し ます。 この 制 限 は My_func の 下 位 関 数<br />
に 含 まれる 乗 算 器 には 適 用 さ れません。 下 位 関 数 に イ ンプ リ メ ンテーシ ョ ンで 使 用 さ れる 乗 算 器 の 数 を 制 限 する に<br />
は、 その 下 位 関 数 に 割 り 当 て 指 示 子 を 指 定 する か、 下 位 関 数 を My_func に 埋 め 込 みます。<br />
set_directive_allocation -limit 1 -type operation My_func mul<br />
#pragma HLS allocation instances=mul limit=1 operation<br />
set_directive_array_map<br />
説 明<br />
小 型 配 列 を 大 型 配 列 にマ ッ プ し ます。<br />
通 常 は、 set_directive_array_map コ マン ド を 使 用 し て、 複 数 の 小 型 配 列 を 1 つの 大 型 配 列 にマ ッ プ し ます。 こ の 大 型 配<br />
列 は、 こ の 後 単 一 の メ モ リ (RAM または FIFO) リソースに 使 用 できます。<br />
-mode オプシ ョ ンは、 新 し い ターゲ ッ ト が 次 のど ち ら の 連 結 なのかを 決 定 する ために 使 用 し ます。<br />
• エレ メン ト ( 水 平 マ ッ ピ ング)<br />
• ビッ ト 幅 ( 垂 直 マ ッ ピ ング)<br />
配 列 は set_directive_array_map コマンドが 出 力 された 順 番 で 連 結 され、 次 から 開 始 されます。<br />
• 水 平 マ ッ ピ ングの 場 合 はターゲ ッ ト エレ メン ト 0<br />
• 垂 直 マ ッ ピ ングの 場 合 はビ ッ ト 0<br />
高 位 合 成 japan.xilinx.com 364<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
構 文<br />
説 明 :<br />
set_directive_array_map [OPTIONS] <br />
• は 配 列 変 数 を 含 むロ ケーシ ョ ン (function[/label] のフォーマッ ト) です。<br />
• は 新 し い ターゲ ッ ト 配 列 イ ン ス タ ン スにマ ッ プする 配 列 変 数 名 です。<br />
オプシ ョ ン<br />
-instance <br />
現 在 の 配 列 変 数 がマ ッ プ さ れる 新 し い 配 列 イ ン ス タ ン ス 名 を 指 定 し ます。<br />
-mode (horizontal|vertical)<br />
• 水 平 マ ッ ピ ング (holizontal) (デフォル ト) ではターゲットにさらに 多 くのエレメントが 含 まれるように 配 列 が 連<br />
結 されます。<br />
• 垂 直 マ ッ ピ ング (vertical) ではターゲ ッ ト のワード 数 が 大 き く な る よ う に 配 列 が 連 結 されます。<br />
-offset <br />
重 要 : 水 平 マ ッ ピ ング (horizontal) 専 用 のオプシ ョ ンです。<br />
現 在 のマ ッ プ 操 作 用 に、ターゲ ッ ト イ ン ス タ ン スでの 絶 対 オフセ ッ ト を 示 す 整 数 値 を 指 定 し ます。 次 に 例 を 示 し ます。<br />
• 配 列 変 数 のエレ メ ン ト 0 は、 新 しいターゲ ッ ト のエレ メ ン ト にマップされます。<br />
• ほかのエレ メ ン ト は 新 しいターゲッ ト の 、 にマップされます<br />
値 が 指 定 さ れていない 場 合 は、 重 複 を 避 け る ため、 Vivado HLS で 必 要 なオフセ ッ ト が 自 動 的 に 計 算 さ れます。 た と え<br />
ば、 ターゲ ッ ト の 次 の 未 使 用 エレ メ ン ト か ら 配 列 の 連 結 が 開 始 さ れます。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS array_map \<br />
variable= \<br />
instance= \<br />
\<br />
offset=<br />
これらのコマンドは、 関 数 foo の 配 列 A[10] および B[15] を、 新 しい 1 つの 配 列 AB[25] にマップしています。<br />
• エレ メン ト AB[0] は A[0] と 同 じになります。<br />
• エレ メン ト AB[10] は B[0] と 同 じになり ます (-offset オプシ ョ ンが 使 用 されていないため)。<br />
• 配 列 AB[25] のビッ ト 幅 は A[10] または B[15] の 最 大 ビ ッ ト 幅 にな り ます。<br />
set_directive_array_map -instance AB -mode horizontal foo A<br />
set_directive_array_map -instance AB -mode horizontal foo B<br />
#pragma HLS array_map variable=A instance=AB horizontal<br />
#pragma HLS array_map variable=B instance=AB horizontal<br />
高 位 合 成 japan.xilinx.com 365<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
配 列 C および D が 新 しい 配 列 CD に 連 結 され、 ビ ッ ト 数 は C および D のビッ ト 数 を 足 したものにな り ます。 CD の<br />
エレ メン ト 数 は C または D の 最 大 数 にな り ます。<br />
set_directive_array_map -instance CD -mode vertical foo C<br />
set_directive_array_map -instance CD -mode vertical foo D<br />
#pragma HLS array_map variable=C instance=CD vertical<br />
#pragma HLS array_map variable=D instance=CD vertical<br />
set_directive_array_partition<br />
説 明<br />
配 列 を よ り 小 さ な 配 列 ま たは 個 々のエレ メ ン ト に 分 割 し ます。<br />
こ の 分 割 に よ り 、 次 の 結 果 にな り ます。<br />
• RTL には、 1 つの 大 き な メ モ リ ではな く 、 複 数 の 小 型 メ モ リ ま たは 複 数 のレ ジ ス タ が イ ンプ リ メ ン ト さ れます。<br />
• ス ト レージの 読 み 込 みおよび 書 き 出 し ポー ト の 数 が 効 率 的 に 増 加 し ます。<br />
• デザ イ ンのスループ ッ ト が 改 善 さ れる 可 能 性 があ り ます。<br />
• より 多 くのメモリ イ ン ス タ ン スやレ ジ ス タ が 必 要 と な り ます。<br />
構 文<br />
説 明 :<br />
set_directive_array_partition [OPTIONS] <br />
• は 配 列 変 数 を 含 むロ ケーシ ョ ン (function[/label] のフォーマッ ト) です。<br />
• は 分 割 さ れる 配 列 変 数 です。<br />
オプシ ョ ン<br />
-dim <br />
注 記 : 複 数 次 元 の 配 列 にのみ 使 用 する オプシ ョ ンです。<br />
配 列 のどの 次 元 が 分 割 さ れる かを 指 定 し ます。<br />
• 値 が 0 の 場 合 は、 指 定 し たオプシ ョ ンですべての 次 元 が 分 割 されます。<br />
• その 他 の 値 が 指 定 されている 場 合 は、 その 次 元 のみが 分 割 されます。 た と えば、 値 が 1 の 場 合 は、 最 初 の 次 元 の<br />
みが 分 割 さ れます。<br />
-factor <br />
注 記 : このオプションは、 block または cyclic タ イ プの 分 割 にのみ 使 用 し ます。<br />
作 成 する 小 型 配 列 の 数 を 指 定 し ます。<br />
-type (block|cyclic|complete)<br />
• block タ イ プの 分 割 では、 元 の 配 列 の 連 続 し たブ ロ ッ ク か ら 小 型 配 列 を 作 成 し ます。 こ れは 1 つの 配 列 を N 個 の<br />
ブ ロ ッ ク に 分 割 する オプシ ョ ンで、 N は -factor で 定 義 されている 整 数 です。<br />
• cyclic タ イ プの 分 割 では、 元 の 配 列 のエレ メ ン ト を イ ン ター リ ーブ し て 小 型 配 列 を 作 成 し ます。 た と えば、<br />
-factor が 3 の 場 合 、 エレ メ ン ト はそれぞれ 次 に 割 り 当 て ら れます。<br />
° エレ メン ト 0 は 1 番 目 の 新 し い 配 列<br />
高 位 合 成 japan.xilinx.com 366<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
° エレ メン ト 1 は 2 番 目 の 新 し い 配 列<br />
° エレ メン ト 3 は 3 番 目 の 新 し い 配 列<br />
° エレ メン ト 4 は 再 び 1 番 目 の 新 し い 配 列<br />
• complete タ イ プの 分 割 では、 配 列 を 個 々のエレ メ ン ト に 分 割 し ます。 1 次 元 配 列 の 場 合 は、 配 列 が 個 々のエレ メ<br />
ン ト に 分 割 さ れます。 複 数 次 元 の 配 列 の 場 合 は、 各 次 元 の 分 割 を 指 定 する か、 ま たは -dim 0 を 使 用 してすべて<br />
の 次 元 を 分 割 し ます。<br />
デフォル ト は complete です。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS array_partition \<br />
variable= \<br />
\<br />
factor= \<br />
dim=<br />
関 数 foo の 配 列 AB[13] を 4 つの 配 列 に 分 割 し ます。 4 は 13 の 倍 数 ではないので、 次 のよ う に 分 割 されます。<br />
• 3 つの 配 列 に 13 個 のエレ メ ン ト<br />
• 1 つの 配 列 に 4 つのエレ メ ン ト (AB[9:12])<br />
set_directive_array_partition -type block -factor 4 foo AB<br />
#pragma HLS array_partition variable=AB block factor=4<br />
関 数 foo の 配 列 AB[6][4] を 各 次 元 が [6][2] の 2 つの 配 列 に 分 割 し ます。<br />
set_directive_array_partition -type block -factor 2 -dim 2 foo AB<br />
#pragma HLS array_partition variable=AB block factor=2 dim=2<br />
関 数 foo の AB[4][10][6] のすべての 次 元 を 個 々のエレ メ ン ト に 分 割 し ます。<br />
set_directive_array_partition -type complete -dim 0 foo AB<br />
#pragma HLS array_partition variable=AB complete dim=0<br />
set_directive_array_reshape<br />
説 明<br />
垂 直 配 列 マ ッ ピ ングを 使 用 し て 配 列 の 分 割 を ま と め、 エレ メ ン ト 数 は 少 な く ワー ド 数 は 大 き い 新 し い 配 列 を 1 つ 作 成<br />
します。<br />
set_directive_array_reshape コマンドでは、 次 が 実 行 されます。<br />
1. 配 列 を 複 数 の 配 列 に 分 割 (set_directive_array_partition と 同 じ)<br />
2. 分 割 さ れた 配 列 が 垂 直 方 向 を 自 動 的 にま と めて (set_directive_array_map -type vertical と 同 じ)、 ワード 数 の 大 き<br />
い 1 つの 配 列 を 新 し く 作 成<br />
高 位 合 成 japan.xilinx.com 367<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
構 文<br />
set_directive_array_reshape [OPTIONS] <br />
説 明 :<br />
• は 配 列 変 数 を 含 むロ ケーシ ョ ン (function[/label] のフォーマッ ト) です。<br />
• は 再 形 成 さ れる 配 列 変 数 です。<br />
オプシ ョ ン<br />
-dim <br />
注 記 : 複 数 次 元 の 配 列 にのみ 使 用 する オプシ ョ ンです。<br />
配 列 のどの 次 元 が 再 形 成 さ れる かを 指 定 し ます。<br />
• 値 が 0 の 場 合 は、 指 定 し たオプシ ョ ンですべての 次 元 が 分 割 されます。<br />
• その 他 の 値 が 指 定 されている 場 合 は、 その 次 元 のみが 分 割 されます。 た と えば、 値 が 1 の 場 合 は、 最 初 の 次 元 の<br />
みが 分 割 さ れます。<br />
-factor <br />
注 記 : このオプションは、 block または cyclic タ イ プの 再 形 成 にのみ 使 用 し ます。<br />
作 成 する 一 時 的 な 小 型 配 列 の 数 を 指 定 し ます。<br />
-type (block|cyclic|complete)<br />
• block タ イ プの 再 形 成 では、 元 の 配 列 の 連 続 し たブ ロ ッ ク か ら 小 型 配 列 を 作 成 し ます。 N 個 (N は-factor オプシ ョ<br />
ンで 定 義 されている 数 ) のブ ロ ッ ク に 配 列 を 分 割 し た 後 、 その N 個 のブロ ッ ク を word-width*N で 1 つの 配 列<br />
にま とめます。 デフォルトは complete です。<br />
• cyclic タ イ プは、 元 の 配 列 のエレ メ ン ト を イ ン ター リ ーブ し て 小 型 配 列 を 作 成 し ます。 た と えば、 -factor が 3<br />
の 場 合 、 エレ メ ン ト 0 は 新 し く 作 成 さ れる 1 番 目 の 配 列 に 割 り 当 て ら れ、 エレ メ ン ト 1 は 2 番 目 、 エレ メ ン ト 3<br />
は 3 番 目 、 そ し てエレ メ ン ト 4 はまた 1 番 目 の 配 列 に 割 り 当 て られます。 最 終 的 な 配 列 は、 新 し い 配 列 を 1 つの<br />
配 列 に 連 結 し た 垂 直 連 結 にな り ます (ワー ド 数 が 大 き い も のを 作 成 する にはワー ド 連 結 )。<br />
• complete タ イ プは、 配 列 を 一 時 的 に 個 々のエレ メ ン ト に 分 割 し てか ら、 ワー ド 数 の 大 き な 1 つの 配 列 にま と めま<br />
す。1 次 元 配 列 の 場 合 、こ れはワー ド 数 が 非 常 に 大 き いレ ジ ス タ を 1 つ 作 成 する の と 同 じ です ( 元 の 配 列 が M ビッ<br />
トの N 個 のエレ メ ン ト であ った 場 合 、 N*M ビッ トのレジスタになります)。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS array_reshape \<br />
variable= \<br />
\<br />
factor= \<br />
dim=<br />
関 数 foo の 8 ビット 配 列 AB[17] を、 エレ メ ン ト を 5 つ 含 む 新 し い 32 ビッ ト 配 列 1 つに 再 形 成 し ます。<br />
4 は 13 の 倍 数 整 数 ではないので、 次 の よ う に 変 更 さ れます。<br />
• AB[17] は 5 番 目 のエレ メ ン ト の 下 位 8 ビッ ト<br />
高 位 合 成 japan.xilinx.com 368<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• 5 番 目 のエレ メ ン ト の 余 り は 未 使 用<br />
set_directive_array_reshape -type block -factor 4 foo AB<br />
#pragma HLS array_reshape variable=AB block factor=4<br />
関 数 foo の 配 列 AB[6][4] を、 次 元 [6][2] の 新 しい 配 列 1 つに 分 割 し ます ( 次 元 2 の 幅 は 2 倍 )。<br />
set_directive_array_reshape -type block -factor 2 -dim 2 foo AB<br />
#pragma HLS array_reshape variable=AB block factor=2 dim=2<br />
関 数 foo の 8 ビット 配 列 AB[4][2][2] をシングル エレ メン トの 配 列 (1 つのレジス タ) にします。 ビッ ト 幅 は<br />
4*2*2*8(=128) にな り ます。<br />
set_directive_array_reshape -type complete -dim 0 foo AB<br />
#pragma HLS array_reshape variable=AB complete dim=0<br />
set_directive_clock<br />
説 明<br />
指 定 ク ロ ッ ク を 指 定 関 数 に 適 用 し ます。<br />
C および C++ デザイ ンでは、 ク ロ ッ ク 1 つのみがサポー ト されます。 create_clock で 指 定 し た ク ロ ッ ク 周 期 が、 デザ<br />
イ ン 内 のすべての 関 数 に 適 用 さ れます。<br />
SystemC デザイ ンではマルチ クロックがサポートされています。create_clock コマンドを 使 用 して 複 数 のクロックを<br />
指 定 し、 set_directive_clock コマンドを 使 用 して 個 々の SC_MODULE に 適 用 する こ と がで き ます。 各 SC_MODULE は<br />
シングル クロックで 合 成 されます。<br />
構 文<br />
set_directive_clock <br />
説 明 :<br />
• は ク ロ ッ ク が 適 用 さ れる 関 数 です。<br />
• は create_clock コマンドの -name オプシ ョ ンで 指 定 さ れてい る ク ロ ッ ク 名 です。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS clock domain=<br />
次 のよ う な SystemC デザイ ンがあ る と し ます。<br />
• 最 上 位 の foo_top には fast_clock およびslow_clock という クロック ポー ト があ り ます。<br />
• 最 上 位 ではその 関 数 内 で fast_clock のみが 使 用 されます。<br />
• 下 位 ブ ロ ッ ク の foo では slow_clock のみが 使 用 されます。<br />
高 位 合 成 japan.xilinx.com 369<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
こ の 場 合 、 コ マン ド は 次 の よ う にな り ます。<br />
• 両 方 の ク ロ ッ ク を 作 成<br />
• fast_clock を foo_top に 適 用<br />
• slow_clock を 下 位 ブロ ッ ク foo に 適 用<br />
create_clock -period 15 fast_clk<br />
create_clock -period 60 slow_clk<br />
set_directive_clock foo_top fast_clock<br />
set_directive_clock foo slow_clock<br />
#pragma HLS clock domain=fast_clock<br />
#pragma HLS clock domain=slow_clock<br />
注 記 : create_clock と 同 等 のプラ グマはあ り ません。<br />
set_directive_dataflow<br />
説 明<br />
関 数 ま たはループでデータ フ ロー 最 適 化 が 実 行 さ れる よ う に 指 定 する コ マン ド で、RTL インプリ メンテーションの 同<br />
時 実 行 を 改 善 し ます。<br />
C 記 述 では、 すべての 演 算 が 順 次 に 実 行 さ れます。 Vivado HLS は、 set_directive_allocation な ど リ ソース を 制 限 する 指<br />
示 子 がない 場 合 は、 自 動 的 にレ イ テンシを 最 小 限 に 押 さ え、 同 時 処 理 を 改 善 し よ う と し ます。<br />
ただ し、 データ 依 存 性 のために こ れが 制 限 さ れる こ と があ り ます。 た と えば、 配 列 にア ク セ スする 関 数 ま たはループ<br />
は、 完 了 する 前 に 配 列 への 読 み 込 み/ 書 き 出 しアクセスをすべて 終 了 する 必 要 があ り ます。 これによ り、そのデータを<br />
消 費 する 次 の 関 数 /ループの 演 算 が 開 始 さ れな く な り ます。<br />
ただし、 前 の 関 数 /ループがすべての 演 算 を 完 了 する 前 に、 次 の 関 数 /ループの 演 算 を 開 始 する こ と が 可 能 な こ と はあ<br />
ります。<br />
データ フ ロー 最 適 化 が 指 定 さ れてい る 場 合 、 Vivado HLS では 次 が 実 行 さ れます。<br />
• 順 次 関 数 /ループ 間 のデータ フ ローを 解 析 し ます。<br />
• 前 の 関 数 ま たはループが 完 了 する 前 に 次 の 関 数 ま たはループを 開 始 可 能 にするチャ ネルを (pingpong 形 式 の<br />
RAM または FIFO に 基 づいて) 作 成 し よ う と し ます。<br />
こ れで 関 数 ま たはループが 並 列 で 実 行 さ れ、 次 が 達 成 で き ます。<br />
• レ イ テンシが 低 減 し ます。<br />
• RTL デザ イ ンのスループ ッ ト が 改 善 さ れます。<br />
開 始 間 隔 ( 関 数 またはループの 開 始 から 次 のものの 開 始 までの 間 のサイ クル 数 ) が 指 定 されていない 場 合 は、 Vivado<br />
HLS は 開 始 間 隔 を 最 小 限 に 抑 えて、 データ が 使 用 可 能 になった らすぐ に 演 算 を 開 始 で き る よ う に し ます。<br />
構 文<br />
説 明 :<br />
set_directive_dataflow <br />
• はデータ フ ロー 最 適 化 が 実 行 さ れる ロ ケーシ ョ ン (function[/label] フォーマッ ト) です。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 370<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
#pragma HLS dataflow<br />
例<br />
関 数 foo 内 のデータ フ ロー 最 適 化 を 指 定 し ます。<br />
set_directive_dataflow foo<br />
#pragma HLS dataflow<br />
set_directive_data_pack<br />
説 明<br />
構 造 体 (struct) のデータ フィールドを 1 つのスカ ラー (ワード 数 がよ り 大 きい) にパッ ク し ます。<br />
構 造 体 内 で 宣 言 さ れてい る 配 列 はすべて 完 全 に 分 割 さ れ、 幅 の 広 いス カ ラーにま と め られ、 ほかのス カ ラー フィール<br />
ド を 使 用 し てパ ッ ク さ れます。<br />
ワード 数 のビッ ト ア ラ イ メ ン ト は、 構 造 体 フ ィ ール ド の 宣 言 か ら 自 動 推 論 さ れます。すべてのフ ィ ール ド がマ ッ プ さ<br />
れる まで、 最 初 のフ ィ ール ド にはワー ド の 最 下 位 部 が 入 り ます。<br />
構 文<br />
説 明 :<br />
set_directive_data_pack [OPTIONS] <br />
• はパ ッ ク される 変 数 を 含 むロ ケーシ ョ ン (function[/label] フォーマッ ト) です。<br />
• はパッ ク される 変 数 です。<br />
オプシ ョ ン<br />
-instance <br />
パ ッ キ ング 後 の 変 数 の 名 前 を 指 定 し ます。 何 も 指 定 さ れていない 場 合 は、 variable に 入 力 されている 名 前 が 使 用 さ<br />
れます。<br />
-byte_pad ( struct_level | field_level )<br />
8 ビ ッ ト 境 界 でデータ をパ ッ ク する かど う かを 指 定 し ます。<br />
• struct_level : 構 造 体 (struct) を 最 初 にパッ ク してから、 それを 8 ビッ ト 境 界 でパックします。<br />
• field_level : 各 フ ィールド をそれぞれ 8 ビ ッ ト 境 界 でパ ッ ク し てか ら、 構 造 体 (struct) をパッ ク します。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
#pragma HLS data_pack variable= instance=<br />
高 位 合 成 japan.xilinx.com 371<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
例<br />
関 数 foo の 8 ビット フィールド 3 つを 持 つ 構 造 体 (typedef struct {unsigned char R, G, B;} pixel) の 配 列 AB[17] を 24 ビッ<br />
トの 17 エレメン トの 配 列 1 つにパッ ク し ます。 set_directive_data_pack foo AB<br />
#pragma HLS data_pack variable=AB<br />
関 数 foo にある 8 ビッ トのフィールドが 3 つあ る 構 造 体 (typedef struct {unsigned char R, G, B;} pixel) のポインター AB<br />
を 1 つの 新 しい 24 ビッ ト ポインターにパックします。<br />
set_directive_data_pack foo AB<br />
#pragma HLS data_pack variable=AB<br />
set_directive_dependence<br />
説 明<br />
Vivado HLS では 次 の 依 存 が 検 出 さ れます。<br />
• ループ 内 (ループ 独 立 型 の 依 存 )<br />
• 同 じループの 反 復 間 (ループ 運 搬 型 の 依 存 )<br />
こ う し た 依 存 は、 演 算 がス ケジ ュールで き る タ イ ミ ング、 特 に 関 数 およびループのパイ プ ラ イ ン 化 処 理 に 影 響 し ます。<br />
• ループ 独 立 型 の 依 存<br />
同 じループの 反 復 で 同 じ エレ メ ン ト がア ク セス さ れます。<br />
for (i=0;i
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
-dependent (true|false)<br />
依 存 を 使 用 する 必 要 があ る (true) か、 削 除 する (false) かを 指 定 し ます。 デフ ォル ト は false です。<br />
-direction (RAW|WAR|WAW)<br />
注 記 : ループ キ ャ リ ー 依 存 にのみ 使 用 し ます。<br />
依 存 の タ イ プは 次 の よ う に 指 定 し ます。<br />
• RAW (Read-After-Write - 真 の 依 存 )<br />
読 み 込 み 命 令 で 使 用 さ れた 値 が 書 き 出 し 命 令 で 使 用 さ れます。<br />
• WAR (Write-After-Read - アンチ 依 存 )<br />
読 み 込 み 命 令 の 値 は、 書 き 出 し 命 令 で 上 書 き さ れます。<br />
• WAW (Write-After-Write - 出 力 依 存 )<br />
2 つの 書 き 出 し 命 令 に よ り 、 特 定 の 順 序 で 同 じ ロ ケーシ ョ ンに 書 き 出 し が 実 行 さ れます。<br />
-distance <br />
注 記 : これは、 -dependent が true に 設 定 されているループ キ ャ リ ー 依 存 でのみ 使 用 し ます。<br />
配 列 ア ク セスの 反 復 間 隔 を 指 定 し ます。<br />
-type (intra|inter)<br />
次 のいずれかに 依 存 を 指 定 し ます。<br />
• 同 じループ 内 の 反 復 (intra)<br />
• 異 なるループ 間 の 反 復 (inter)<br />
-variable <br />
依 存 指 示 子 を 考 慮 する ための 具 体 的 な 変 数 を 指 定 し ます。 こ れは、 -class オプシ ョ ンが 使 用 さ れてい る と きは 使 用<br />
できません。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS dependence \<br />
variable= \<br />
\<br />
\<br />
\<br />
distance= \<br />
<br />
関 数 foo の loop_1 の 同 じ 反 復 での Var1 の 依 存 を 削 除 し ます。<br />
set_directive_dependence -variable Var1 -type intra \<br />
-dependent false foo/loop_1<br />
#pragma HLS dependence variable=Var1 intra false<br />
高 位 合 成 japan.xilinx.com 373<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
関 数 foo の loop_2 にあ るすべての 配 列 の 依 存 に よ り 、 同 じループ 反 復 ではすべての 読 み 込 みが 書 き 出 し の 後 に 実<br />
行 されるよ うに 設 定 します。<br />
set_directive_dependence -class array -type inter \<br />
-dependent true -direction RAW foo/loop_2<br />
#pragma HLS dependence array inter RAW true<br />
set_directive_expression_balance<br />
説 明<br />
C ベースの 仕 様 は 演 算 シーケ ン スで 書 かれてい る こ と があ り ます。 その 場 合 、 RTL での 演 算 チェーンが 長 く な り 、 僅<br />
かな ク ロ ッ ク 周 期 でデザ イ ン レ イ テンシが 増 加 する 可 能 性 が 出 て き ます。<br />
デフォル ト では、 Vivado HLS では 演 算 の 関 連 性 や 接 続 性 を 考 慮 し て、 演 算 が 並 び 替 え ら れます。 こ れに よ り 、 ハー ド<br />
ウ ェ ア 上 でのレ イ テンシを 低 減 しつつ、 演 算 チェーン を 短 く する こ と がで き るバ ラ ン スの と れた ツ リ ーが 作 成 で き ま<br />
す。<br />
set_directive_expression_balance コ マン ド を 使 用 する と、 こ の 演 算 調 整 を 指 定 範 囲 内 でオン/オフにするこ とができま<br />
す。<br />
構 文<br />
set_directive_expression_balance [OPTIONS] <br />
説 明 :<br />
• は、 演 算 調 整 をオン/オフにするロケーシ ョ ン (function[/label] フォーマッ ト) を 指 定 します。<br />
オプシ ョ ン<br />
-off<br />
演 算 調 整 を 指 定 ロ ケーシ ョ ンでオフに し ます。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS expression_balance <br />
関 数 My_Func 内 で 演 算 調 整 をオフに し ます。<br />
set_directive_expression_balance -off My_Func<br />
#pragma HLS expression_balance off<br />
関 数 My_Func2 で 演 算 調 整 をオンに し ます。<br />
set_directive_expression_balance My_Func2<br />
#pragma HLS expression_balance<br />
高 位 合 成 japan.xilinx.com 374<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
set_directive_function_instantiate<br />
説 明<br />
デフォル ト で 次 のよ う にな り ます。<br />
• 関 数 は RTL で 個 別 の 階 層 ブ ロ ッ ク のま ま 残 り ます。<br />
• 同 じ 階 層 レベルにあ る 関 数 のすべての イ ン ス タ ン スは、 同 じ RTL インプリ メンテーション (ブロック) を 使 用 し<br />
ます。<br />
set_directive_function_instantiate コマンドは、 関 数 のインスタンスごとに 1 つの RTL インプリ メンテー<br />
シ ョ ン を 作 成 する のに 使 用 し ます。 こ れで 各 イ ン ス タ ン ス を 最 適 化 で き る よ う にな り ます。<br />
デフォル ト では、 次 のコードで、 3 つの イ ン ス タ ン スすべてに 対 し、 関 数 foo_sub の RTL インプリ メンテーション<br />
が 1 つ 作 成 さ れます。<br />
char foo_sub(char inval, char incr)<br />
{<br />
return inval + incr;<br />
}<br />
void foo(char inval1, char inval2, char inval3,<br />
char *outval1, char *outval2, char * outval3)<br />
{<br />
*outval1 = foo_sub(inval1, 1);<br />
*outval2 = foo_sub(inval2, 2);<br />
*outval3 = foo_sub(inval3, 3);<br />
}<br />
以 下 の 例 に 示 す 方 法 で こ の 指 示 子 を 使 用 する と 、 3 つのバージ ョ ンの 関 数 foo_sub が 作 成 され、 変 数 incr に 対 し<br />
てそれぞれが 個 別 に 最 適 化 さ れます。<br />
構 文<br />
set_directive_function_instantiate <br />
説 明 :<br />
• は 関 数 のイ ン ス タ ン ス を 個 別 に 作 成 する ロ ケーシ ョ ン (function[/label] フォーマッ ト) を 指 定 します。<br />
• variable は 定 数 と し て 指 定 する 引 数 を 指 定 し ます。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS function_instantiate variable=<br />
この 例 では、 次 の Tcl ( または 関 数 foo_sub に 配 置 されたプラ グマ) によ り、foo_sub の 入 力 されている incr に 従 っ<br />
て 各 イ ン ス タ ン スが 個 別 に 最 適 化 さ れます。<br />
set_directive_function_instantiate incr foo_sub<br />
#pragma HLS function_instantiate variable=incr<br />
高 位 合 成 japan.xilinx.com 375<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
set_directive_inline<br />
説 明<br />
階 層 の 別 エンテ ィ テ ィ と し て 関 数 を 削 除 し ます。 関 数 を イ ン ラ イ ン 化 する と 、 別 の 階 層 と し ては 表 示 さ れな く な り ま<br />
す。<br />
場 合 に よ っては、 関 数 を イ ン ラ イ ン 化 する と 、 関 数 内 の 演 算 が 共 有 さ れ、 周 辺 の 演 算 と 共 に 効 率 よ く 最 適 化 さ れる こ<br />
と があ り ます。 ただ し、 イ ン ラ イ ン 化 さ れた 関 数 は 共 有 で き ないので、 エ リ アが 増 加 し て し ま う 可 能 性 があ り ます。<br />
デフ ォル ト では、 関 数 階 層 のすぐ 下 の 階 層 でのみイ ン ラ イ ン 化 が 実 行 さ れます。<br />
構 文<br />
set_directive_inline [OPTIONS] <br />
説 明 :<br />
• はイ ン ラ イ ン 化 が 実 行 さ れる ロ ケーシ ョ ン (function[/label] フォーマッ ト) です。<br />
オプシ ョ ン<br />
-off<br />
関 数 の イ ン ラ イ ン 化 をオフに し、 特 定 関 数 が イ ン ラ イ ン さ れない よ う に 使 用 し ます。 た と えば、 -recursive オプ<br />
シ ョ ンが 呼 び 出 し 関 数 に 使 用 さ れてい る 場 合 、 ほかの 関 数 はイ ン ラ イ ン 化 さ れて も、 特 定 の 呼 び 出 さ れた 関 数 が イ ン<br />
ライン 化 されないようにすることができます。<br />
-recursive<br />
デフ ォル ト では、 関 数 階 層 のすぐ 下 の 階 層 でのみイ ン ラ イ ン 化 が 実 行 さ れます。 特 定 の 関 数 内 に 含 まれる 関 数 はイ ン<br />
ライン 化 されません。-recursive オプシ ョ ンは 階 層 全 体 の 関 数 をすべて 再 帰 的 に イ ン ラ イ ン 化 し ます。<br />
-region<br />
指 定 範 囲 の 関 数 をすべて イ ン ラ イ ン 化 し ます。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS inline <br />
foo_top に 含 まれるすべての 関 数 を イ ン ラ イ ン 化 し ます (しかし 下 位 にある 関 数 はインライン 化 されません)。<br />
set_directive_inline -region foo_top<br />
#pragma HLS inline region<br />
foo_sub1 関 数 のみを イ ン ラ イ ン 化 し ます。<br />
set_directive_inline foo_sub1<br />
#pragma HLS inline<br />
foo_sub2 を 除 く、foo_top にあ るすべての 関 数 が 階 層 全 体 を 通 し て 繰 り 返 し イ ン ラ イ ン 化 さ れます。1 つ 目 のプ ラ<br />
グマは foo_top に 配 置 され、 2 つ 目 のプ ラ グマは foo_sub2 に 配 置 されます。<br />
set_directive_inline -region -recursive foo_top<br />
set_directive_inline -off foo_sub2<br />
高 位 合 成 japan.xilinx.com 376<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
#pragma HLS inline region recursive<br />
#pragma HLS inline off<br />
set_directive_interface<br />
説 明<br />
イ ン ターフ ェ イ ス 合 成 で 関 数 記 述 か ら どの よ う に RTL ポー ト が 作 成 さ れる かを 指 定 し ます。<br />
RTL イ ンプ リ メ ンテーシ ョ ンのポー ト は 次 の も のか ら 派 生 し ます。<br />
• 指 定 さ れてい る、 任 意 の 関 数 レベルのプ ロ ト コル<br />
• 関 数 の 引 数<br />
• グローバル 変 数 ( 最 上 位 関 数 に よ り ア ク セス さ れ、 ス コープ 外 部 で 定 義 さ れる)<br />
関 数 レベルのハン ド シ ェ イ ク では、 次 が 実 行 さ れます。<br />
• 関 数 がいつ 演 算 を 開 始 する かを 制 御 し ます。<br />
• 関 数 レベルのハン ド シ ェ イ ク は、 次 の タ イ ミ ングを 示 し ます。<br />
° 演 算 の 終 了<br />
° アイドル 状 態<br />
° 新 し い 入 力 を 受 信 する 準 備 完 了<br />
関 数 レベルのプロ ト コルのイ ンプ リ メ ンテーシ ョ ンは、 次 のよ う にな り ます。<br />
• ap_ctrl_none、 ap_ctrl_hs または ap_ctrl_chain モード で 制 御<br />
• 最 上 位 関 数 の 名 前 のみが 必 要<br />
注 記 : プラグマに 関 数 return を 指 定<br />
各 関 数 引 数 は、 独 自 の I/O プ ロ ト コルを 持 つよ う に 指 定 する こ と がで き ます ( 有 効 ハン ド シ ェ イ ク や 承 認 ハン ド シ ェ<br />
イクなど)。<br />
変 数 がグ ローバル と し て 作 成 さ れていて も、 すべての 読 み 込 みおよび 書 き 出 し ア ク セスが ローカルになっている 場<br />
合 、 リ ソースはデザ イ ン 内 に 作 成 さ れ、 RTL で I/O ポー ト が 必 要 な く な り ます。 し か し、 グ ローバル 変 数 が 外 部 ソー<br />
ス ま たはデス テ ィ ネーシ ョ ンにな るはずであれば、 イ ン ターフ ェ イ スは 標 準 関 数 引 数 と 同 じ よ う な 方 法 で 指 定 する 必<br />
要 があ り ます。 例 を 参 照 し て く ださい。<br />
set_directive_interface が 下 位 関 数 に 使 用 さ れてい る 場 合 は、-register オプシ ョ ン を 使 用 で き ます。-mode オプシ ョ<br />
ンは、 下 位 関 数 ではサポー ト さ れません。<br />
構 文<br />
説 明 :<br />
set_directive_interface [OPTIONS] <br />
• は 指 定 する 関 数 イ ン ターフ ェ イ ス ま たはレ ジ ス タ を 介 し た 出 力 の ロ ケーシ ョ ン (function[/label] フォー<br />
マッ ト) です。<br />
• - インターフェイスを 合 成 するのに 必 要 なパラ メーター ( 関 数 引 数 ま たはグ ローバル 変 数 ) です。<br />
ap_ctrl_none または ap_ctrl_hs モー ド が 使 用 さ れてい る 場 合 は、 こ れは 不 要 です。<br />
オプシ ョ ン<br />
-mode (ap_ctrl_none|ap_ctrl_hs|ap_none|ap_stable|ap_vld|ap_ovld|<br />
ap_ack|ap_hs|ap_fifo|ap_memory|ap_bus)<br />
高 位 合 成 japan.xilinx.com 377<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
適 切 なプ ロ ト コルを 選 択 し ます。<br />
モードの 値<br />
-mode 値 で イ ンプ リ メ ン ト さ れる 関 数 プ ロ ト コルは 次 の と お り です。<br />
• ap_ctrl_none<br />
関 数 レベルのハン ド シ ェ イ ク プロ ト コルはあり ません。<br />
• ap_ctrl_hs<br />
デフ ォル ト 動 作 。 関 数 レベルのハン ド シ ェ イ ク プロ ト コルをインプリ メン ト します。<br />
関 数 が 演 算 を 開 始 する には、 入 力 ポー ト ap_start が High になる 必 要 があ り ます( 関 数 レベル 信 号 はすべてア ク<br />
ティブ High)。<br />
出 力 ポー ト ap_done は、 関 数 が 終 了 したこ とを 示 し (また 関 数 の 戻 り 値 がある 場 合 は、 戻 り 値 が 有 効 であること<br />
を 示 す) 、 出 力 ポート ap_idle は、 関 数 がア イ ド ル 状 態 であ る こ と を 示 し ます。<br />
パイ プ ラ イ ン 化 さ れた 関 数 では、 追 加 出 力 ポー ト ap_ready が イ ンプ リ メ ン ト さ れ、その 関 数 が 新 し い 入 力 デー<br />
タ を 受 信 する 準 備 完 了 状 態 にあ る こ と を 示 し ます。<br />
• ap_ctrl_chain<br />
この 関 数 レベルのプロ ト コルは、データ ス ト リ ーム を 処 理 する ために 複 数 のブ ロ ッ ク がチェーン 接 続 さ れる よ う<br />
なデザイ ン 用 で、 ap_ctrl_hs モー ド のすべての 機 能 が 含 まれる ほか、 新 し い 入 力 信 号 ap_continue を 関 数<br />
レベルのプロ ト コルに 追 加 し ます。<br />
ap_continue 信 号 が Low になる と、 ダウンス ト リーム ブ ロ ッ ク が 新 し いデータ を 受 信 で き る 状 態 ではない こ<br />
と を 意 味 し ます。 こ の 場 合 、 出 力 が 準 備 で き る まで、 ブ ロ ッ ク は 継 続 し てデータ を 処 理 し 続 け ます。 準 備 がで き<br />
たら DONE 信 号 がアサー ト さ れ、 ap_continue 信 号 が High にアサー ト さ れる まで 処 理 が 停 止 さ れます。<br />
関 数 引 数 およびグ ローバル 変 数 の 場 合 は、 各 引 数 タ イ プに 対 し、 次 のデフ ォル ト プ ロ ト コルが 使 用 さ れます。<br />
• 読 み 込 み 専 用 ( 入 力 ) - ap_none<br />
• 書 き 出 し 専 用 ( 出 力 ) - ap_vld<br />
• 読 み 込 み- 書 き 出 し ( 入 出 力 ) - ap_ovld<br />
• 配 列 - ap_memory<br />
関 数 引 数 およびグ ローバル 変 数 を イ ンプ リ メ ン ト する RTL ポー ト は、 次 の -mode 値 で 指 定 さ れます。<br />
• ap_none<br />
プ ロ ト コルな し。 単 純 な ワ イ ヤに 対 応 し ます。<br />
• ap_stable<br />
入 力 ポー ト にのみ 使 用 可 能 。 こ のポー ト の 値 が リ セ ッ ト 後 安 定 し ていて、 次 の リ セ ッ ト まで 変 化 し ない こ と が<br />
Vivado HLS に 伝 え られます。 このプロ ト コルは ap_none モード のよ う にイ ンプ リ メ ン ト されますが、 信 号 フ ァ<br />
ンア ウ ト で 内 部 最 適 化 が 実 行 さ れます。<br />
注 記 : 定 数 値 ではな く 、 変 動 し ない 値 のみが 考 慮 さ れます。<br />
• ap_vld<br />
こ のデータ ポー ト と 共 に 動 作 する 別 の 有 効 (valid) ポー ト (_vld) が 作 成 されます。<br />
° 入 力 ポー ト 場 合 、 関 連 の 入 力 有 効 ポー ト がアサー ト さ れる まで、 読 み 込 みに よ り 関 数 が 停 止 さ れます。<br />
高 位 合 成 japan.xilinx.com 378<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
° 出 力 ポー ト の 場 合 は、 データ を 書 き 出 す と き、 出 力 有 効 信 号 がアサー ト さ れます。<br />
• ap_ack<br />
こ のデータ ポー ト と 共 に 動 作 する 別 の 承 認 (acknowledge) ポー ト (_vld) が 作 成 されます。<br />
° 入 力 ポー ト の 場 合 、 値 を 読 み 込 む と き、 読 み 込 みに よ り 出 力 承 認 がアサー ト さ れます。<br />
° 関 連 の 入 力 承 認 ポー ト がアサー ト さ れる まで、 出 力 書 き 出 し に よ り 関 数 が 停 止 さ れます。<br />
• ap_hs<br />
このデータ ポー ト と 共 に 動 作 する 別 の 有 効 (valid) ポー ト (_vld) および 承 認 (acknowledge) ポー ト<br />
(_ack) が 作 成 されます。<br />
° 入 力 ポー ト の 場 合 、 読 み 込 みに よ り 、 入 力 有 効 がアサー ト さ れる まで 関 数 が 停 止 さ れ、 データ が 読 み 込 まれ<br />
た と き に 出 力 承 認 信 号 がアサー ト さ れます。<br />
° 出 力 書 き 出 し に よ り 、 データ が 書 き 出 さ れる と 出 力 有 効 がアサー ト さ れ、 関 連 入 力 承 認 ポー ト がアサー ト さ<br />
れる まで 関 数 が 停 止 さ れます。<br />
• ap_ovld<br />
° 入 力 信 号 の 場 合 は、 ap_none モード のよ う に 動 作 し ます。 プロ ト コルは 追 加 されません。<br />
° 出 力 信 号 の 場 合 は、 ap_vld モード のよ う に 動 作 し ます。<br />
° 入 力 出 力 信 号 の 場 合 は、 次 の よ う にな り ます。<br />
- 入 力 が ap_none モード のよ う に 動 作 し ます。<br />
- 出 力 が ap_vld モード のよ う に 動 作 し ます。<br />
• ap_memory<br />
外 部 RAM へのア ク セス と し て 配 列 引 数 が イ ンプ リ メ ン ト さ れます。<br />
外 部 RAM か ら の 読 み 出 しおよびその RAM への 書 き 込 みを 行 う ため、 データ、 ア ド レ ス、 および RAM 制 御 ポー<br />
ト (CE や WE など) が 作 成 さ れます。 特 定 の 信 号 およびデータ ポー ト 数 はア クセス している RAM によって 決 ま<br />
ります。<br />
推 奨 : 配 列 引 数 は、set_directive_resource コマンドを 使 用 してテク ノロジ ライブラリにある 特 定 RAM に 指 定 する 必 要<br />
があ り ます。 指 定 し ない 場 合 は、 Vivado HLS で 自 動 的 に 使 用 する RAM が 選 択 されます。<br />
• ap_fifo<br />
FIFO ア ク セス と し て、 配 列 、 ポ イ ン ター、 参 照 渡 し 変 数 のポー ト を イ ンプ リ メ ン ト し ます。<br />
° データ 入 力 ポー ト :<br />
- 外 部 FIFO か ら 値 を 読 み 出 す 準 備 が 整 う と 、 関 連 する 出 力 読 み 出 し ポー ト (_read) をアサー<br />
トします。<br />
- 値 読 み 出 し 可 能 であ る こ と を 示 すため 入 力 可 能 なポー ト (_empty_n) がアサー ト されるま<br />
で、 関 数 を 停 止 し ます。<br />
° データ 出 力 ポー ト :<br />
- ポー ト に 値 を 書 き 出 し た こ と を 示 すため、 出 力 書 き 出 し ポー ト (_write) をアサート しま<br />
す。<br />
- 新 し い 出 力 用 に 外 部 FIFO に 空 き スペースがあ る こ と を 示 すため、 関 連 する 入 力 可 能 ポー ト<br />
(_full_n) がアサー ト さ れる まで、 関 数 を 停 止 し ます。 こ の イ ン ターフ ェ イ ス モード には<br />
–depth オプシ ョ ン を 使 用 する 必 要 があ り ます。<br />
• ap_bus<br />
バス イ ン ターフ ェ イ ス と し て、 ポ イ ン ター、 参 照 渡 し 変 数 のポー ト を イ ンプ リ メ ン ト し ます。<br />
高 位 合 成 japan.xilinx.com 379<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
標 準 FIFO バス インターフェイスとのバースト ア ク セス をサポー ト する ため、 複 数 の 制 御 信 号 を 使 用 し て、 入 力<br />
および 出 力 両 方 のポー ト が 合 成 さ れます。<br />
このインターフェイスの 詳 細 は、 第 1 章 「 高 位 合 成 」 を 参 照 して く ださい。<br />
推 奨 : このインターフェイス モード には、 -depth オプシ ョ ン を 使 用 する 必 要 があ り ます。<br />
• -depth<br />
ap_fifo または ap_bus モー ド を 使 用 する ポ イ ン ター インターフェイスに 必 要 です。<br />
こ のオプシ ョ ン を 使 用 する と 、 テ ス ト ベンチで 処 理 さ れる サンプルの 最 大 数 を 指 定 で き ます。 こ れは、 RTL 協 調<br />
シ ミ ュ レーシ ョ ン 用 に 作 成 された 検 証 アダプターに 必 要 な FIFO の 最 大 サイ ズを Vivado HLS に 渡 すために 必 要<br />
です。<br />
• -register<br />
最 上 位 関 数 では、 こ のオプシ ョ ン を 次 の よ う に 使 用 し ます。<br />
° 次 のスカ ラー インターフェイスに 使 用 します。<br />
- ap_none<br />
- ap_ack<br />
- ap_vld<br />
- ap_ovld<br />
- ap_hs<br />
° 信 号 (および 任 意 の 関 連 プ ロ ト コル 信 号 ) がレ ジ ス タ を 介 し、 少 な く と も 関 数 実 行 の 最 終 サ イ ク ルまで 保 持 さ<br />
れるよ うになり ます。<br />
° ap_ctrl_hs 関 数 プロ ト コルがイネーブルになっている 必 要 があ り ます。 ap_ctrl_hs と 共 に 使 用 される<br />
と 、 関 数 の 戻 り 値 がレ ジ ス タ を 介 すよ う にな り ます。<br />
° 下 位 関 数 に 使 用 する と 、 関 数 が 最 後 まで 実 行 さ れる まで 出 力 および 制 御 信 号 を レ ジ ス タ に 保 存 で き ます。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS interface register port=<br />
関 数 foo の 関 数 レベルのハン ド シェ イ ク をオフにし ます。<br />
set_directive_interface -mode ap_ctrl_none foo<br />
#pragma HLS interface ap_ctrl_none port=return<br />
関 数 foo の 引 数 InData に ap_vld イ ン ターフ ェ イ ス を 含 め る よ う に 指 定 さ れ、 入 力 がレ ジ ス タ を 介 すよ う に 設 定 さ<br />
れます。<br />
set_directive_interface -mode ap_vld -register foo InData<br />
#pragma HLS interface ap_vld register port=InData<br />
関 数 foo で 使 用 される グ ローバル 変 数 lookup_table が RTL デザインでポート として 処 理 され、 インターフェイスに<br />
は ap_memory が 指 定 されます。<br />
set_directive_interface -mode ap_memory foo look_table<br />
高 位 合 成 japan.xilinx.com 380<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
set_directive_latency<br />
説 明<br />
関 数 、 ループ、 ま たは リ ージ ョ ンにレ イ テンシの 最 大 値 と 最 小 値 のいずれか、 ま たは 両 方 を 設 定 し ます。<br />
Vivado HLS は 常 に 最 小 レ イ テンシを 目 標 に し ます。 レ イ テンシの 最 大 値 および 最 小 値 が 指 定 さ れる と き の Vivado<br />
HLS の 動 作 は 次 のよ う にな り ます。<br />
• レ イ テンシが 最 小 値 未 満<br />
レ イ テンシが 最 小 値 に 満 たない 場 合 、 レ イ テンシが 指 定 値 まで 拡 張 さ れ、 リ ソースが さ ら に 共 有 さ れる 可 能 性 が<br />
あります。<br />
• レ イ テンシが 最 小 値 よ り 大 き い<br />
制 約 は 満 た さ れ、 こ れ 以 上 の 最 適 化 は 行 われません。<br />
• レ イ テンシが 最 大 値 未 満<br />
制 約 は 満 た さ れ、 こ れ 以 上 の 最 適 化 は 行 われません。<br />
• レ イ テンシが 最 大 値 よ り 大 き い<br />
構 文<br />
説 明 :<br />
最 大 値 以 下 でス ケジ ュールで き ない 場 合 、 指 定 し た 制 約 を 満 たすこ と がで き る よ う エフ ォー ト レベルが 上 げられ<br />
ます。 こ れで も 最 大 レ イ テンシを 満 たす こ と がで き ない 場 合 は、 警 告 が 表 示 さ れ、 達 成 可 能 な 最 小 値 のレ イ テン<br />
シでデザインが 作 成 されます。<br />
set_directive_latency [OPTIONS] <br />
• は 制 約 を 設 定 する ロ ケーシ ョ ン ( 関 数 ループ、 または リ ージ ョ ン) (function[/label] フォーマッ ト) を 指<br />
定 します。<br />
オプシ ョ ン<br />
-max
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
#pragma HLS latency min=4 max=4<br />
関 数 foo で、 ループ loop_row の 最 大 レ イ テンシを 12 に 指 定 し ます。 プ ラ グマはループ 本 体 に 記 述 し ます。<br />
set_directive_latency -max=12 foo/loop_row<br />
#pragma HLS latency max=12<br />
set_directive_loop_flatten<br />
説 明<br />
入 れ 子 になっているループを 1 つのループ 階 層 にフ ラ ッ ト にし ます。<br />
RTL イ ンプ リ メ ンテーシ ョ ンでは、 ループ 階 層 にあ るループ 間 の 移 動 に 1 クロック サイクルかかり ます。 入 れ 子 に<br />
なったループをフラ ッ トにするこ とで、それらを 1 つのループ と し て 最 適 化 する こ と がで き る ので、 ク ロ ッ ク サイク<br />
ルを 少 な く で き、 ループ 本 文 の ロ ジ ッ ク を さ ら に 最 適 化 する こ と が 可 能 です。<br />
推 奨 : こ の 指 示 子 は、 ループ 階 層 の 一 番 内 側 にあ るループに 適 用 する 必 要 があ り ます。 完 全 ま たは 半 完 全 ループのみ<br />
を この 方 法 でフ ラ ッ ト にする こ と ができ ます。<br />
• 完 全 ループの 入 れ 子<br />
° 一 番 内 側 のループのみにループ 本 体 の 内 容 が 含 まれます。<br />
° ループ 文 間 に 指 定 さ れる ロ ジ ッ ク はあ り ません。<br />
° すべてのループの 範 囲 は 定 数 です。<br />
• 半 完 全 ループの 入 れ 子<br />
° 一 番 内 側 のループのみにループ 本 体 の 内 容 が 含 まれます。<br />
° ループ 文 間 に 指 定 さ れる ロ ジ ッ ク はあ り ません。<br />
° 一 番 外 側 のループの 範 囲 は 変 数 にで き ます。<br />
• 不 完 全 ループの 入 れ 子<br />
構 文<br />
説 明 :<br />
内 側 のループの 範 囲 が 変 数 であ った り 、 ループ 本 体 が 内 側 のループにのみ 含 まれてい る と は 限 ら ない 場 合 、 コー<br />
ド の 構 造 を 変 更 する か、 ループ 本 体 の 中 のループを 展 開 し て、 完 全 ループの 入 れ 子 を 作 成 し てみて く だ さ い。<br />
set_directive_loop_flatten [OPTIONS] <br />
• はロケーシ ョ ン ( 一 番 内 側 のループ) (function[/label] のフォーマッ ト) です。<br />
オプシ ョ ン<br />
-off<br />
フラッ トにならないようにします。<br />
一 部 のループのみを フ ラ ッ ト に し、 指 定 ロ ケーシ ョ ンの こ れ 以 外 のループはフ ラ ッ ト にで き ます。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
#pragma HLS loop_flatten off<br />
高 位 合 成 japan.xilinx.com 382<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
例<br />
関 数 foo の loop_1、ループ 階 層 上 でこれよ り 上 にあ るすべてのループ ( 完 全 ま たは 半 完 全 ) を 1 つのループにフ ラ ッ<br />
トにします。 プラグマ を loop_1 の 本 体 に 記 述 し ます。<br />
set_directive_loop_flatten foo/loop_1<br />
#pragma HLS loop_flatten<br />
関 数 foo の loop_2 でループがフ ラ ッ ト さ れない よ う に し ます。 プ ラ グマを loop_2 の 本 体 に 記 述 し ます。<br />
set_directive_loop_flatten -off foo/loop_2<br />
#pragma HLS loop_flatten off<br />
set_directive_loop_merge<br />
説 明<br />
すべてのループを 1 つのループに 結 合 し ます。<br />
ループを 結 合 する と 、 次 が 可 能 にな り ます。<br />
• ループ 本 文 のイ ンプ リ メ ンテーシ ョ ン 間 の 移 行 に RTL で 必 要 な ク ロ ッ ク サ イ ク ル 数 を 低 減 する こ と がで き ま<br />
す。<br />
• 可 能 であればループをパ ラ レルに イ ンプ リ メ ン ト で き ます。<br />
ループをマージする 場 合 のルールは 次 のよ う になっています。<br />
• ループの 境 界 が 変 数 の 場 合 、 同 じ 値 を 設 定 し てお く 必 要 があ り ます ( 同 じ 数 の 反 復 )。<br />
• ループの 境 界 が 定 数 の 場 合 、 最 大 定 数 値 がマージ さ れたループの 境 界 と し て 使 用 さ れます。<br />
• 境 界 が 変 数 のループ と、 定 数 のものを 一 緒 にマージ させる こ と はでき ません。<br />
• 結 合 するループ 間 の コー ド は、 結 合 する こ と に よ る 悪 影 響 が 出 ない よ う に し ます。 こ の コー ド は 複 数 回 実 行 し て<br />
も 常 に 同 じ 結 果 にな る よ う にする 必 要 があ り ます<br />
- a=b は 有 効<br />
- a=a+1 は 無 効<br />
• ループに FIFO 読 み 出 し が 含 まれる 場 合 は、 ループ 同 士 を 結 合 する こ と はで き ません。 結 合 に よ り 読 み 出 し の 順<br />
番 が 変 更 さ れて し ま う ためです。 FIFO か ら の 読 み 出 し、 ま たは FIFO インターフェイスは、 常 にシーケンスどお<br />
り に 実 行 さ れる 必 要 があ り ます。<br />
構 文<br />
説 明 :<br />
set_directive_loop_merge <br />
• はループがあ る ロ ケーシ ョ ン (function[/label] フォーマッ ト) です。<br />
オプシ ョ ン<br />
-force<br />
Vivado HLS で 警 告 が 出 力 さ れて も、 ループが 結 合 さ れます。 結 合 し たループが 問 題 な く 動 作 する かど う かは、 ユー<br />
ザーが 確 認 する 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 383<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS loop_merge force<br />
関 数 foo の 連 続 するすべてのループを 1 つのループに 結 合 し ます。<br />
set_directive_loop_merge foo<br />
#pragma HLS loop_merge<br />
関 数 foo のloop_2 の 内 側 にあ るすべてのループ (loop_2 を 除 くすべて) を -force オプシ ョ ンを 使 用 して 結 合 し<br />
ます。 プラグマ は loop_2 の 本 体 に 記 述 し ます。<br />
set_directive_loop_merge -force foo/loop_2<br />
#pragma HLS loop_merge force<br />
set_directive_loop_tripcount<br />
説 明<br />
ループで 実 行 さ れる 反 復 回 数 の 合 計 を 指 定 し ます。 Vivado HLS は、 各 ループの 合 計 レ イ テンシ、 つま り ループのすべ<br />
ての 反 復 を 実 行 する ためのサ イ ク ル 数 を レポー ト し ます。 こ のループ レイテンシはト リ ップカウント (ループ 反 復 の<br />
数 ) というわけです。<br />
ト リ ッ プカ ウ ン ト は、 定 数 値 にな る こ と も あ り ますが、 ループ 式 (x
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
-min <br />
最 小 レ イ テンシを 指 定 し ます。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS loop_tripcount \<br />
min= \<br />
max= \<br />
avg=<br />
関 数 foo の loop_1 は、 次 のよ う に 指 定 されています。<br />
• 最 小 ト リ ッ プカ ウ ン ト 12<br />
• 平 均 ト リ ッ プカ ウ ン ト 14<br />
• 最 大 ト リ ッ プカ ウ ン ト 16<br />
set_directive_loop_tripcount -min 12 -max 14 -avg 16 foo/loop_1<br />
#pragma HLS loop_tripcount min=12 max=14 avg=16<br />
set_directive_occurrence<br />
説 明<br />
関 数 ま たはループをパイ プ ラ イ 処 理 する と き、 ロ ケーシ ョ ン のコードがそれを 囲 んでいる ( 外 側 にあ る) 関 数 /ループ<br />
の コー ド よ り も 速 度 が 遅 いレー ト で 実 行 さ れる よ う に 指 定 し ます。<br />
こ れで、 実 行 速 度 が 遅 い コー ド 部 分 が 低 速 でパイ プ ラ イ ン 処 理 さ れる よ う にで き る ほか、 最 上 位 パイ プ ラ イ ン 内 で 共<br />
有 で き る 可 能 性 があ り ます。 次 に 例 を 示 し ます。<br />
• ループは N 回 反 復 する と し ます。<br />
• ループの 一 部 が 条 件 文 で 保 護 さ れていて、 M 回 しか 実 行 されないと します ( この 場 合 N は M の 整 数 倍 数 )。<br />
• 条 件 文 で 保 護 さ れてい る コー ド には、 N/M の 実 行 が 含 まれる と し ます。<br />
N が 開 始 間 隔 II でパイ プ ラ イ ン 処 理 さ れる 場 合 、 条 件 文 で 保 護 さ れてい る 関 数 /ループは、 次 の よ う にな り ます。<br />
• これよ り も 高 い II の 値 でパイプラ イ ン 化 する こ と ができ ます。<br />
注 記 : 低 速 です。 こ の コー ド の 実 行 頻 度 は 高 く あ り ません。<br />
• 外 側 の 速 いレー ト の 方 のパイ プ ラ イ ン 内 で よ り よ い 共 有 が 行 われる 可 能 性 があ り ます。<br />
こ う し た 領 域 を 識 別 する と 、こ の 領 域 の 関 数 およびループが 外 側 にあ る 関 数 /ループ よ り も 遅 い 初 期 間 隔 でパイ プ ラ イ<br />
ン 処 理 される よ う にな り ます。<br />
構 文<br />
説 明 :<br />
set_directive_occurrence [OPTIONS] <br />
• は 実 行 速 度 の 遅 い ロ ケーシ ョ ン を 指 定 し ます。<br />
高 位 合 成 japan.xilinx.com 385<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
オプシ ョ ン<br />
-cycle <br />
N/M の 実 行 頻 度 を 指 定 し ます。<br />
• N は 囲 んでいる 関 数 /ループの 実 行 回 数 です。<br />
• M は 条 件 文 領 域 の 実 行 回 数 です。<br />
N は M の 整 数 倍 数 であ る 必 要 があ り ます。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS occurrence cycle=<br />
関 数 foo の 領 域 Cond_Region の 実 行 頻 度 を 4 に 指 定 し ます。 囲 んでいる コード よ り も 4 倍 低 速 で こ の 箇 所 が 実 行<br />
されます。<br />
set_directive_occurrence -cycle 4 foo/Cond_Region<br />
#pragma HLS occurrence cycle=4<br />
set_directive_pipeline<br />
説 明<br />
次 の 詳 細 を 指 定 し ます。<br />
• 関 数 のパイ プ ラ イ ン 処 理<br />
• ループのパイ プ ラ イ ン 処 理<br />
パイ プ ラ イ ン 処 理 さ れた 関 数 ま たはループは、N サイクル (N は 開 始 間 隔 (II)) ご と に 新 し い 入 力 を 処 理 で き ます。デ<br />
フ ォル ト の 開 始 間 隔 は 1 で、 ク ロ ッ ク サイ クルご と に 新 しい 入 力 が 処 理 されます。 –II オプシ ョ ンで 開 始 間 隔 を 指 定<br />
するこ と もできます。<br />
指 定 し た 開 始 間 隔 でデザ イ ン を 作 成 で き ない 場 合 は、 次 が 実 行 さ れます。<br />
• 警 告 メ ッ セージが 表 示 さ れます。<br />
• 最 低 限 可 能 な 開 始 間 隔 でデザ イ ンが 作 成 さ れます。<br />
こ の 後 、 警 告 メ ッ セージを 使 用 し てデザ イ ン を 解 析 し、 必 要 な 開 始 間 隔 を 満 た し てデザ イ ン を 作 成 する ためにどの 手<br />
順 が 必 要 なのかを 分 析 し ます。<br />
構 文<br />
説 明 :<br />
set_directive_pipeline [OPTIONS] <br />
• はパイ プ ラ イ ン 処 理 が 実 行 さ れる ロ ケーシ ョ ン (function[/label] フォーマッ ト) です。<br />
オプシ ョ ン<br />
-II <br />
高 位 合 成 japan.xilinx.com 386<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
パイ プ ラ イ ンの 開 始 間 隔 を 指 定 し ます。<br />
Vivado HLS では、 データの 依 存 性 に 基 づいて こ の 要 求 を 満 たそ う と し ます。 実 際 の 結 果 は、 この II よ り 大 きい 間 隔<br />
にな り ます。<br />
-enable_flush<br />
パイプラインの 入 力 が 停 止 したときに、 パイプライン 段 を 一 掃 できるパイプラインがインプリ メント されます。<br />
こ の 機 能 を 使 用 する と 、 次 が 実 行 さ れます。<br />
• 追 加 で 制 御 ロ ジ ッ ク が イ ンプ リ メ ン ト さ れます。<br />
• エリアは 大 きくなります<br />
• こ の 機 能 はオプシ ョ ンです。<br />
-rewind<br />
注 記 : ループにのみ 適 用 で き る オプシ ョ ンです。<br />
巻 き 戻 し を イ ネーブルに し ます。 連 続 するループのパイ プ ラ イ ン (1 つのループの 繰 り 返 しの 終 わ り と 次 の 開 始 の 間<br />
に 一 時 停 止 な し) がイネーブルになり ます。<br />
巻 き 戻 し は、 最 上 位 関 数 内 に 1 つのループしかない (または 完 全 なループ ネス トがある) 場 合 にのみ 効 果 的 です。ルー<br />
プ 前 の コー ド 部 分 は、 次 の よ う にな り ます。<br />
• 初 期 化 と し て 認 識 さ れます。<br />
• パイプラインで 1 度 だけ 実 行 されます。<br />
• 条 件 文 (if-else) は 含 むこ と ができ ません。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS pipeline \<br />
II= \<br />
enable_flush \<br />
rewind<br />
関 数 foo が 開 始 間 隔 1 でパイプラ イ ン 処 理 されます。<br />
set_directive_pipeline foo<br />
#pragma HLS pipeline<br />
関 数 foo のループ loop_1 が 開 始 間 隔 4 でパイプライン 処 理 されます。 パイプラインが 一 掃 されます。<br />
set_directive_pipeline -II 4 -enable_flush foo/loop_1<br />
#pragma HLS pipeline II=4 enable_flush<br />
set_directive_protocol<br />
説 明<br />
コードの 領 域 (プロ ト コル 領 域 ) を 指 定 する も ので、 コー ド で 明 確 に 指 定 し ていない 限 り 、 Vivado HLS でクロック 動<br />
作 が 挿 入 さ れます。<br />
高 位 合 成 japan.xilinx.com 387<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
プロ ト コル 領 域 は、 手 動 でインターフェイス プ ロ ト コルを 指 定 する ために 使 用 し ます。 Vivado HLS では、 関 数 引 数<br />
か ら の 読 み 出 しおよび 関 数 引 数 への 書 き 出 し も 含 め、 動 作 間 に ク ロ ッ ク は 挿 入 さ れません。 こ のため、 読 み 込 みおよ<br />
び 書 き 出 し は RTL に 従 います。<br />
ク ロ ッ ク 動 作 は、 次 の よ う に 指 定 で き ます。<br />
• ap_wait() 文 (ap_utils.h を 含 む) を 使 用 する と C で 指 定 でき ます。<br />
• wait() 文 (systemc.h を 含 む) を 使 用 する と C++ および SystemC で も 指 定 で き ます。<br />
ap_wait および wait 文 は、 それぞれ C および C++ デザ イ ンのシ ミ ュ レーシ ョ ンには 影 響 せず、 Vivado HLS でのみ<br />
認 識 さ れます。<br />
C コー ド の 領 域 は、 次 の 手 順 で 作 成 で き ます。<br />
1. 領 域 を 波 括 弧 { } で 囲 む<br />
2. 名 前 を 付 け る<br />
次 の 例 では、 io_section と い う 領 域 を 定 義 し ています。<br />
構 文<br />
説 明 :<br />
io_section:{..lines of C code...}<br />
set_directive_protocol [OPTIONS] <br />
• - 外 部 のプ ロ ト コル 要 件 に 対 応 し て、 サ イ ク ルの 正 確 な 方 法 で イ ンプ リ メ ン ト さ れる よ う に、 ロ ケー<br />
ション (function[/label] フォーマッ ト) を 指 定 し ます。<br />
オプシ ョ ン<br />
-mode (floating|fixed)<br />
floating モード (デフォル ト) では、 プロ ト コル 領 域 外 の 文 に 対 応 する コード が 最 終 的 な RTL のプロ ト コル 文 内 で<br />
重 複 で き る よ う にな り ます。 プ ロ ト コル 領 域 のサ イ ク ルは 正 確 な ま まですが、 その 他 の 動 作 は 同 時 に 発 生 で き ます。<br />
fixed モー ド の 場 合 は、 重 複 がない よ う にな り ます。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS protocol \<br />
<br />
関 数 foo の 領 域 io_section を fixed プ ロ ト コル 領 域 と し て 定 義 し ます。 プ ラ グマは 領 域 io_section の 中 に 記 述<br />
します。<br />
set_directive_protocol -mode fixed foo/io_section<br />
#pragma HLS protocol fixed<br />
高 位 合 成 japan.xilinx.com 388<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
set_directive_reset<br />
説 明<br />
特 定 のス テー ト 変 数 (グローバルまたはスタティ ック) の リ セ ッ ト を 追 加 ま たは 削 除 し ます。<br />
構 文<br />
set_directive_reset [OPTIONS] <br />
オプシ ョ ン<br />
<br />
は 変 数 が 定 義 さ れる 箇 所 (function[/label] フォーマッ ト) です。<br />
<br />
は 指 示 子 が 適 用 さ れる 変 数 です。<br />
-off<br />
• -off を 指 定 する と 、 指 定 し た 変 数 に 対 し て リ セ ッ ト が 生 成 さ れません。<br />
• -off を 指 定 し ない 場 合 、 指 定 し た 変 数 に 対 し て リ セ ッ ト が 生 成 さ れます。<br />
プラグマ<br />
C ソース コードの 変 数 のラ イフ サ イ ク ルの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS reset variable=a off<br />
グローバル リ セ ッ ト 設 定 が none または control の 場 合 でも、 関 数 foo の 変 数 static int a にリセットを 追 加<br />
します。<br />
set_directive_reset foo a<br />
#pragma HLS reset variable=a<br />
グローバル リ セ ッ ト 設 定 が state または all の 場 合 でも、 関 数 foo の 変 数 static int a から リセッ ト を 削 除 します。<br />
set_directive_reset -off foo a<br />
#pragma HLS reset variable=a off<br />
set_directive_resource<br />
説 明<br />
特 定 の ラ イ ブ ラ リ リソース (コア) が RTL で 変 数 を イ ンプ リ メ ン ト する ために 使 用 さ れる よ う に し ます。 変 数 は、 次<br />
のいずれかにな り ます。<br />
• 配 列<br />
• 演 算 式<br />
• 関 数 の 引 数<br />
Vivado HLS では、 現 在 読 み 込 まれてい る ラ イ ブ ラ リ で 使 用 可 能 な コ ア を 使 用 し て、 コー ド に 動 作 が イ ンプ リ メ ン ト さ<br />
れます。 変 数 の イ ンプ リ メ ン ト に ラ イ ブ ラ リ の 複 数 の コ ア を 使 用 で き る 場 合 、set_directive_resource コマンドでどのコ<br />
高 位 合 成 japan.xilinx.com 389<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ア を 使 用 する か 指 定 し ます。 list_core コ マン ド を 使 用 する と 使 用 可 能 な コ アがすべて リ ス ト さ れます。 リ ソ ース を 指<br />
定 しない 場 合 は、 Vivado HLS でどの リ ソース を 使 用 する かが 指 定 さ れます。<br />
set_directive_resource は、 ラ イブ ラ リ のどの メ モ リ エレ メ ン ト を 使 用 し て 配 列 を イ ンプ リ メ ン ト する か 指 定 する ため<br />
に 最 も よ く 使 用 されます。 これによ り 、 た と えば、 配 列 をシングル ポー ト RAM とデュアル ポー ト RAM のどちら と<br />
してインプリ メントするかを 指 定 できます。RTL のポー ト は 配 列 に 関 連 付 け ら れた メ モ リ に よ って 決 ま る ので、 こ れ<br />
は 最 上 位 関 数 イ ン ターフ ェ イ スの 配 列 には 特 に 重 要 な 方 法 です。<br />
C の 場 合 は -std=c99 を、 C および C++ の 場 合 は -fno-builtin を 使 用 する こ と をお 勧 め し ます。<br />
構 文<br />
説 明 :<br />
set_directive_resource -core <br />
• は 変 数 のあ る ロ ケーシ ョ ン (function[/label] フォーマッ ト) です。<br />
• は 変 数 です。<br />
オプシ ョ ン<br />
-core <br />
テクノロジ ラ イ ブ ラ リ で 定 義 さ れてい る の と 同 じ よ う に、 コ アの 名 前 を 指 定 し ます。<br />
-port_map <br />
IP 生 成 フ ローを 使 用 し てポー ト マ ッ プを 指 定 する ために 使 用 する オプシ ョ ンで、 アダプ ターのポー ト を 使 用 し てデ<br />
ザインにポートがマップされます。<br />
は、 デザイ ン ポー ト およびアダプター ポー ト の Tcl リストです。<br />
-metadata <br />
IP 生 成 フ ローを 使 用 する 際 にバス オプシ ョ ン を 指 定 する オプシ ョ ンです。<br />
バス 操 作 指 示 子 が ク ォーテーシ ョ ンで 囲 まれた リ ス ト です。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS resource \<br />
variable= \<br />
core=<br />
変 数 coeffs[128] は 最 上 位 関 数 の foo_top に 対 する 引 数 です。 こ の 指 示 子 によ り 、 coeffs がライブラ リからの<br />
RAM_1P コアを 使 用 してインプリ メン ト されるよ うに 指 定 されます。coeffs の 値 にア ク セスするために RTL で 作 成<br />
されるポートが、 RAM_1P コアで 定 義 されるものになります。<br />
set_directive_resource -core RAM_1P foo_top coeffs<br />
#pragma HLS resource variable=coeffs core=RAM_1P<br />
関 数 foo に Result=A*B という コードがあるとします。 ここでは、Mul2S という 2 段 のパイ プ ラ イ ン 乗 算 器 コ ア を<br />
使 用 し て 乗 算 が イ ンプ リ メ ン ト さ れる よ う に 指 定 し ます。<br />
set_directive_resource -core Mul2S foo Result<br />
高 位 合 成 japan.xilinx.com 390<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
#pragma HLS resource variable=Result core=Mul2S<br />
set_directive_stream<br />
説 明<br />
デフ ォル ト では、 配 列 変 数 は RAM メモリ としてインプリ メント されます。<br />
• 最 上 位 関 数 の 配 列 パ ラ メ ーターは RAM インターフェイス ポー ト と して イ ンプ リ メ ン ト されます。<br />
• 一 般 配 列 は、 読 み 込 み/ 書 き 出 しアクセス 用 に RAM としてインプリメントされます。<br />
• データ フ ロー 最 適 化 に 関 連 し た 下 位 関 数 では、 配 列 引 数 は RAM の pingpong バッファー チャネルを 使 用 してイ<br />
ンプ リ メ ン ト されます。<br />
• ループ ベースのデータ フ ロー 最 適 化 に 関 連 し た 配 列 は RAM の pingpong バッファー チャネルを 使 用 してインプ<br />
リメントされます。<br />
配 列 に 保 存 さ れてい るデータ が 順 次 に 入 力 ま たは 出 力 さ れる 場 合 は、RAM ではな く FIFO が 使 用 される ス ト リ ー ミ ン<br />
グ データ を 使 用 する ほ う が 効 率 的 です。<br />
最 上 位 関 数 の 引 数 の イ ン ターフ ェ イ ス タイプが ap_fifo に 指 定 されている と きは、 配 列 はス ト リ ー ミ ングであ る と<br />
判 別 さ れます。<br />
構 文<br />
説 明 :<br />
set_directive_stream [OPTIONS] <br />
• は 配 列 変 数 を 含 むロ ケーシ ョ ン (function[/label] のフォーマッ ト) です。<br />
• は FIFO と し て イ ンプ リ メ ン ト さ れる 配 列 変 数 です。<br />
オプシ ョ ン<br />
-depth <br />
注 記 : データ フ ロー チャ ネルの 配 列 ス ト リ ー ミ ングにのみ 関 連 し ています。<br />
config_dataflow コマンドで (グローバルに) 指 定 さ れたデフ ォル ト の FIFO の 深 さ を 上 書 き し ます。<br />
-off<br />
注 記 : データ フ ロー チャ ネルの 配 列 ス ト リ ー ミ ングにのみ 関 連 し ています。<br />
config_dataflow -default_channel fifo コ マン ド を 使 用 する と 、デザ イ ン 全 体 の 配 列 に set_directive_stream がグローバルに<br />
適 用 さ れます。 こ のオプシ ョ ン を 使 用 する と 、 特 定 配 列 でス ト リ ー ミ ン グ をオフにで き ます (RAM の pingpong バッ<br />
ファー ベース チャネルがまたデフォルトで 使 用 されるよ うになり ます)。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
#pragma HLS stream<br />
variable= \<br />
off \<br />
depth=<br />
高 位 合 成 japan.xilinx.com 391<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
例<br />
関 数 foo の 配 列 A[10] をス ト リーミングにし、 FIFO としてインプリメントします。<br />
set_directive_stream foo A<br />
#pragma HLS STREAM variable=A<br />
関 数 foo の loop_1 というループにある 配 列 B が 深 さ 12 の FIFO でス ト リ ー ミ ン グ さ れる よ う に 設 定 し ます。 こ の<br />
場 合 、 プ ラ グマ は loop_1 内 に 挿 入 する 必 要 があ り ます。 .<br />
set_directive_stream -depth 12 foo/loop_1 B<br />
#pragma HLS STREAM variable=B depth=12<br />
配 列 C のス ト リ ー ミ ン グがデ ィ スエーブルにな り ます。こ の 例 では config_dataflow で イ ネーブルにな る と 想 定 し てい<br />
ます。<br />
set_directive_stream -off foo C<br />
#pragma HLS STREAM variable=C off<br />
set_directive_top<br />
説 明<br />
関 数 に 名 前 を 付 け ます。 これで、 こ の 名 前 が set_top コマンドに 使 用 できます。<br />
これは 通 常 C++ の ク ラ スの メ ンバー 関 数 を 合 成 する ために 使 用 さ れます。<br />
推 奨 : 指 示 子 は、ア ク テ ィ ブ ソ リ ューシ ョ ンで 指 定 し ます。こ の 後 、その 新 し い 名 前 を set_top コマンドで 使 用 します。<br />
構 文<br />
説 明 :<br />
set_directive_top [OPTIONS] <br />
• は 名 前 が 変 更 される 関 数 です。<br />
オプシ ョ ン<br />
-name <br />
set_top コ マン ド で 使 用 さ れる 名 前 を 指 定 し ます。<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS top \<br />
name=<br />
関 数 foo_long_name の 名 前 を DESIGN_TOP に 変 更 し、 最 上 位 と して 指 定 します。 コード 内 にプラグマが 含 まれる<br />
場 合 で も、 GUI プ ロ ジ ェ ク ト 設 定 で 指 定 し た 最 上 位 で set_top コ マン ド を 実 行 する 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 392<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
set_directive_top -name DESIGN_TOP foo_long_name<br />
#pragma HLS top name=DESIGN_TOP<br />
set_top DESIGN_TOP<br />
set_directive_unroll<br />
説 明<br />
ループ 本 文 の コ ピーを 複 数 作 成 する こ と でループを 変 換 し ます。<br />
ループは、 ループ 変 換 で 指 定 さ れてい る 反 復 回 数 分 実 行 さ れます。 反 復 の 回 数 は、 ループ 本 文 内 の ロ ジ ッ ク に よ って<br />
も 変 わり ます (ループ 終 了 変 数 へのブレー ク や 変 更 など)。ループは RTL にロジッ クのブロッ クによ り インプリ メン ト<br />
さ れます。 こ のブ ロ ッ ク はループ 本 文 を 表 し、 同 じ 反 復 回 数 分 実 行 さ れます。<br />
set_directive_unroll コマン ド を 使 用 する と、 ループを 完 全 に 展 開 する こ とができ、 RTL にループ 反 復 回 数 と 同 じ 数 の<br />
ループ 本 文 のコ ピーを 作 成 でき ます。 または、 ループを 係 数 N で 部 分 的 に 展 開 し、 N 数 のループ 本 文 のコ ピーを 作 成<br />
し、 それに 応 じ てループ 反 復 数 を 調 整 する こ と がで き ます。<br />
部 分 展 開 に 使 用 さ れる 係 数 N が 元 のループ 反 復 数 の 整 数 倍 数 でない 場 合 は、ループ 本 文 の 展 開 さ れた 箇 所 の 終 わ り ご<br />
と に 元 の 終 了 条 件 をチェ ッ ク する 必 要 があ り ます。<br />
ループを 完 全 に 展 開 する には、 ループの 境 界 がコ ンパイル 時 に 認 識 さ れる 必 要 があ り ます。 こ れは 部 分 展 開 には 必 要<br />
ありません。<br />
構 文<br />
説 明 :<br />
set_directive_unroll [OPTIONS] <br />
• は 展 開 するループの ロ ケーシ ョ ン (function[/label] フォーマッ ト) を 指 定 します。<br />
オプシ ョ ン<br />
-factor <br />
部 分 展 開 が リ ク エス ト さ れた こ と を 示 すゼ ロ 以 外 の 整 数 値 を 指 定 し ます。<br />
ループ 本 文 は、 こ の 数 値 で 指 定 さ れた 回 数 分 繰 り 返 さ れ、 反 復 も それに 応 じ て 調 整 さ れます。<br />
-region<br />
ループ 内 にあ るすべてのループを 展 開 し ますが、 それを 含 む 外 側 のループそ う の も のは 展 開 さ れません。<br />
次 は、 その 具 体 例 です。<br />
• ループ loop_1 内 には loop_2 および loop_3 というループが 同 じレベルにあります。<br />
• 指 定 するループ (loop_1など) はコード 内 の 領 域 またはロケーシ ョ ンでもあり ます。<br />
• コードのセクシ ョ ンは、 { }.かっこで 囲 まれます。<br />
• UNROLL 指 示 子 が /loop_1 ロ ケーシ ョ ンに 指 定 さ れてい る 場 合 、 loop_1 が 展 開 されます。<br />
-region オプシ ョ ン を 使 用 する と 、 指 定 し た 領 域 を 含 むループにのみ 適 用 さ れます。 こ れは、 次 の よ う な 結 果 にな<br />
ります。<br />
• loop_1 は 展 開 されません。<br />
• loop_1 の 内 側 にあ るすべてのループ (loop_2 および loop_3) が 展 開 されます。<br />
高 位 合 成 japan.xilinx.com 393<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
-skip_exit_check<br />
係 数 が 指 定 さ れてい る 場 合 ( 部 分 展 開 ) にのみ、 こ のオプシ ョ ンは 有 効 です。<br />
• 固 定 境 界<br />
反 復 回 数 が 係 数 の 倍 数 であ る 場 合 は、 終 了 条 件 がチェ ッ ク さ れません。<br />
反 復 カ ウ ン ト が 係 数 の 整 数 倍 数 でない 場 合 は、 次 の よ う にな り ます。<br />
° 展 開 は さ れません。<br />
° 処 理 を 続 行 する には 終 了 チェ ッ ク を 実 行 する 必 要 があ る こ と を 示 す 警 告 メ ッ セージが 表 示 さ れます。<br />
• 可 変 境 界<br />
終 了 条 件 チェ ッ ク が 削 除 さ れます。 次 を 確 認 し て く だ さ い。<br />
° 可 変 境 界 が 係 数 の 整 数 倍 数 であ る<br />
° 終 了 チェ ッ ク が 不 要 であ る<br />
プラグマ<br />
C ソース コー ド の 必 要 な ロ ケーシ ョ ンの 境 界 内 にプ ラ グマを 挿 入 する 必 要 があ り ます。<br />
例<br />
#pragma HLS unroll \<br />
skip_exit_check \<br />
factor= \<br />
region<br />
関 数 foo のループ L1 を 展 開 し ます。 プラグマ は L1 の 本 体 に 記 述 し ます。<br />
set_directive_unroll foo/L1<br />
#pragma HLS unroll<br />
関 数 foo のループ L2 の 展 開 係 数 を 4 に 指 定 し ます。 最 終 チェ ッ ク を 削 除 し ます。プ ラ グマ は L2 本 体 に 記 述 し ます。<br />
set_directive_unroll -skip_exit_check -factor 4 foo/L2<br />
#pragma HLS unroll skip_exit_check factor=4<br />
関 数 foo のループ L3 内 のループがすべて 展 開 されますが、 ループ L3 自 体 は 展 開 さ れません。 -region オプシ ョ ン<br />
では、 ループ ラベルではな く 、 ループを 囲 む 領 域 と し て 考 慮 さ れる ロ ケーシ ョ ン を 指 定 し ます。<br />
set_directive_unroll -region foo/L3<br />
#pragma HLS unroll region<br />
set_part<br />
説 明<br />
現 在 の ソ リ ューシ ョ ンの ターゲ ッ ト デバイ ス を 設 定 し ます。<br />
このコマンドはアクティブ ソ リ ューシ ョ ンのコ ンテン ツでのみ 実 行 さ れます。<br />
高 位 合 成 japan.xilinx.com 394<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
構 文<br />
説 明 :<br />
set_part <br />
• < device_specification> は Vivado HLS での 合 成 およびインプリ メンテーシ ョ ンのターゲッ ト デバイ ス を 設 定 する<br />
デバイ ス 仕 様 です。<br />
• はファ ミ リ 内 のデフォルト デバイ ス を 使 用 するデバイ ス ファミ リ 名 です。<br />
• デバイ ス、 パ ッ ケージ、 ス ピー ド グレード 情 報 を 含 むターゲッ ト デバイ ス 名 で<br />
す。<br />
オプシ ョ ン<br />
-tool (auto|ise|vivado)<br />
ザ イ リ ン ク ス 浮 動 小 数 点 LogiCORE などのザイ リ ンクス IP の 正 しいバージ ョ ンが RTL を 作 成 する ために 使 用 さ れる<br />
ようになります。Vivado HLS で 使 用 される IP のバージ ョ ンは RTL 合 成 ツールでサポー ト さ れるバージ ョ ン と 同 じ で<br />
あ る 必 要 があ り ます。<br />
このオプショ ンは、 export_design コマンドに 影 響 します。 たとえば、 合 成 に ISE を 使 用 したデザインは<br />
Vivado IP カタログにはエクスポートできません。<br />
• vivado を 選 択 する と 、 Vivadl HLS では 次 が 実 行 さ れます。<br />
° 最 新 の Vivado Design Suite リリースでサポートされる IP コ アすべてが 使 用 さ れます。<br />
° RTL 合 成 は Vivado ツールを 使 用 し て 実 行 さ れます。<br />
• ise を 選 択 する と 、 Vivadl HLS では 次 が 実 行 さ れます。<br />
° 最 新 の ISE リリースでサポートされる IP コ アすべてが 使 用 さ れます。<br />
° RTL 合 成 に ISE を 使 用 できます。<br />
• auto (デフォル ト) を 選 択 する と 、 次 が 実 行 さ れます。<br />
° Zynq および 7 シリーズ FPGA デバイ ス (およびこれ 以 降 ) には Vivado ツールが 使 用 さ れます。<br />
° その 他 すべてのデ (Virtex-6 シリーズおよびそれ 以 前 のデバイス) には ISE が 使 用 されます。<br />
重 要 : このオプションは、IP パッケージに 影 響 します。Vivado をターゲッ トにしたデザインは、Pcore または<br />
Sysgen-ISE の IP としてはエクスポートできません。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
Vivado HLS に 含 まれる FPGA ラ イブラ リ は、 次 の 例 に 示 すよ う に、デバイ ス フ ァ ミ リ 名 を 指 定 する と 現 在 の ソ リ ュー<br />
ションに 追 加 できます。 この 場 合 、 このデバイス ファミ リに 対 して Vivado HLS の FPGA ラ イ ブ ラ リ で 指 定 さ れた<br />
デフォル ト のデバイス、 パッケージおよびスピード グレードが 使 用 されます。<br />
set_part virtex6<br />
Vivado HLS に 含 まれる FPGA ライブラリは、 特 定 のデバイスをパッケージおよびスピード グレード 情 報 を 使 用 して<br />
指 定 する こ と も で き ます。<br />
set_part xc6vlx240tff1156-1<br />
高 位 合 成 japan.xilinx.com 395<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
set_top<br />
説 明<br />
合 成 さ れる 最 上 位 関 数 を 定 義 し ます。<br />
こ の 関 数 で 呼 び 出 さ れる 関 数 もすべてデザ イ ンの 一 部 にな り ます。<br />
構 文<br />
set_top <br />
説 明 :<br />
• は 合 成 さ れる 関 数 です。<br />
プラグマ<br />
同 等 のプ ラ グマはあ り ません。<br />
例<br />
最 上 位 関 数 を foo_top として 設 定 します。<br />
set_top foo_top<br />
グラフ ィ カル ユーザー インターフェイス (GUI) リ<br />
ファレンス<br />
このリファレンス セクションでは、 Vivado HLS の GUI の 使 用 、 制 御 、 カ ス タ マ イ ズ 方 法 について 説 明 し ます。<br />
高 位 合 成 japan.xilinx.com 396<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
変 数 の 確 認<br />
変 数 および 演 算 式 の 値 は、 [Debug] 表 示 モー ド にする と 直 接 確 認 で き ます。 次 の 図 は、 個 別 の 変 数 値 の 確 認 箇 所 を 示<br />
しています。<br />
X-Ref Target - Figure 4-1<br />
図 4‐1: 変 数 の 確 認<br />
高 位 合 成 japan.xilinx.com 397<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
演 算 式 の 値 は、 [Expressions] タ ブか ら 確 認 で き ます。<br />
X-Ref Target - Figure 4-2<br />
ヘッダー フ ァ イル 情 報 の 解 決<br />
図 4‐2: 演 算 式 の 確 認<br />
デフォル ト の Vivado HLS の GUI では、 すべての コーデ ィ ン グ コ ン ス ト ラ ク ト を 解 決 する ために、 ヘ ッ ダー ファ<br />
イルが 解 析 され 続 けるわけではあ り ません。 これは、 プロ ジェ ク ト が 開 いた と きにのみ 実 行 されます。 このため、 次<br />
の よ う な 状 況 が 発 生 する こ と があ り ます。<br />
• コード ビ ューアーに 変 数 ま たは 値 が 不 明 ま たは 定 義 で き ない と 表 示 さ れる。<br />
• コー ド の 変 数 が 指 示 子 ウ ィ ン ド ウ に 表 示 さ れない。<br />
ど ち ら の 場 合 も、 不 明 の 値 および 表 示 さ れていない 変 数 はヘ ッ ダー ファイル ( 拡 張 子 が .h または .hpp) で 定 義 されま<br />
す。 こ の 例 は、 図 4-3 の 左 側 を 参 照 し て く だ さ い。 サ イ ド バーに 未 定 義 の リ フ ァ レ ン スが 表 示 さ れています。<br />
高 位 合 成 japan.xilinx.com 398<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
[Index C] ツールバー ボタンをク リ ックすると、 すべての C ファイルにインデックスを 付 けて、 すべてのオブジェク<br />
ト 定 義 を 解 決 で き ます。 こ の 操 作 の 結 果 は、 図 4-3 の 右 側 に 表 示 さ れています。<br />
X-Ref Target - Figure 4-3<br />
図 4‐3:C ファイルのインデックス<br />
[Project] → [Project Settings] → [General] をクリ ックして [Parse All Header Files] をオンに し てプ ロ ジ ェ ク ト 設 定 を 変 更<br />
する と ( 図 4-4)、 別 のソリューションでインデックスをずっとイネーブルにできます (CPU サ イ ク ルを 使 用 する ので、<br />
GUI のリフレッシュ レー ト に 影 響 する こ と があ り ます)。<br />
高 位 合 成 japan.xilinx.com 399<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
チュート リアル<br />
X-Ref Target - Figure 4-4<br />
図 4‐4:ヘッダー フ ァ イルの 解 析 を イネーブル<br />
注 記 : [Parse all header files] をオンにする と、すべてのヘッダー フ ァ イルが 継 続 的 にポー リ ン グ さ れ、 変 更 がないかど<br />
うかがチェックされます。CPU サイクルではヘッダー ファイルのチェックは 通 常 の 動 作 なので、 これにより GUI の<br />
応 答 時 間 が 削 減 さ れる 場 合 があ り ます。<br />
ソース コードのコメン トの 解 決<br />
言 語 環 境 に よ っては、 英 語 以 外 の 言 語 の コ メ ン ト が 文 字 化 けする こ と があ り ます。 こ れを 修 正 する には、 次 の 手 順 に<br />
従 います。<br />
1. [Explorer] タ ブでプ ロ ジ ェ ク ト を 選 択 し ます。<br />
2. 右 ク リ ッ クして [Properties] をクリ ックし、 [Resource] ページで 適 切 な 言 語 エン コー ド を 選 択 し ます。 [Text file<br />
encoding] で [Other] をオンにし、 ド ロ ップダウン リストから 適 切 なエンコーディングを 選 択 します。<br />
高 位 合 成 japan.xilinx.com 400<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
GUI のカスタマイズ<br />
Vivado HLS の GUI のデフ ォル ト 設 定 では、 一 部 の 情 報 が 表 示 さ れない こ と があ り ます。 こ のセ ク シ ョ ンでは、 次<br />
のカ ス タマイ ズ 方 法 について 説 明 し ます。<br />
• [Console] ビューのバッファー サイズ<br />
• デフォル ト のビヘイビア<br />
[Cosole] ビューのカスタマイズ<br />
[Console] ビ ューには、 合 成 および 検 証 などの 操 作 中 の メ ッ セージがすべて 表 示 さ れます。<br />
このビューのデフォルトのバッファー サイズは 80,000 語 ですが、 これは 変 更 でき ます。 ま たは、すべての メ ッ セージ<br />
が 表 示 される よ う に 制 限 をはずすこ と も でき ます。 これは、 [Window] → [Preferences] → [Run/Debug] → [Console] か<br />
ら 設 定 できます。<br />
主 な 動 作 のカ ス タ マ イズ<br />
Vivado HLS の GUI の 動 作 をカス タマ イ ズするには、 [Windows] → [Preferences] をクリ ックしてオプションを 設 定 し<br />
ます。<br />
た と えば、 キーの 組 み 合 わせ Ctrl + Tab は、 デフ ォル ト では 情 報 エ リ アのア ク テ ィ ブ タブをソース コード とヘッダー<br />
フ ァ イルで 切 り 替 え ますが、 各 タ ブが 順 にア ク テ ィ ブにな る よ う に 変 更 で き ます。<br />
• [Preferences] ダイアログ ボックスの 左 側 のボックスで [General] → [Keys] をク リ ックし、 表 の [Command] 列 で<br />
[Toggle Source/Header] を 選 択 して、 [Unbind Command] をクリ ックして Ctrl + Tab の 組 み 合 わせを 削 除 し ます。<br />
• [Command] 列 で [Next Tab] を 選 択 し、 下 の [Binding] ボックスをク リ ックして Ctrl キーを 押 してから Tab キーを<br />
押 す と 、 Ctrl + Tab キーを 押 した と きに 次 のタブがア クテ ィ ブになる よ う 設 定 でき ます。<br />
次 の 検 索 結 果 を 示 すホ ッ ト キーは、 Microsoft Visual Studio スキームを 使 用 してインプリ メン トできます。[Window] →<br />
[Preference] → [General] → [Key] で [Default] スキームを [Microsoft Visual Studio] スキームに 変 更 します。<br />
[Preferences] ダイアログ ボ ッ ク スの 左 側 のボ ッ ク スで さ ま ざ ま な 項 目 を 選 択 する こ と に よ り 、 GUI 環 境 を 詳 細 にカ ス<br />
タ マ イ ズで き、 生 産 性 を 向 上 する こ と がで き ます。<br />
インターフェイス 合 成 リファレンス<br />
このセクショ ンでは、 Vivado HLS インターフェイス プロ ト コル モード についてそれぞれ 説 明 し ます。<br />
ブロッ ク レベルの I/O プロ ト コル<br />
インターフェイス タイプ ap_ctrl_none、 ap_ctrl_hs および ap_ctrl_chain では、 RTL をブロ ッ ク レベル ハ<br />
ン ド シ ェ イ ク 信 号 と 共 に イ ンプ リ メ ン ト する かど う かを 指 定 し ます。 ブ ロ ッ ク レベルのハン ドシェイ ク 信 号 は、デザ<br />
イ ンで 標 準 の 操 作 を 開 始 で き る 状 態 になった こ と と 、 操 作 が 終 了 し た こ と を 示 し ます。 こ れら の イ ン ターフ ェ イ ス タ<br />
イ プは、 関 数 ま たは 関 数 リ ターンに 指 定 し ます。<br />
図 4-5 に、 ap_ctrl_hs を 関 数 に 指 定 し た 場 合 に 生 成 さ れる RTL ポー ト と 動 作 を 示 し ます。 こ れがデフ ォル ト です。<br />
こ の 例 では、 関 数 で return 文 を 使 用 し て 値 が 返 さ れる ので、 RTL デザイ ンに 出 力 ポー ト ap_return が 作 成 さ れます。 関<br />
数 に return 文 がなければ、 こ のポー ト は 作 成 されません。<br />
高 位 合 成 japan.xilinx.com 401<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
X-Ref Target - Figure 4-5<br />
ap_ctrl_chain インターフェイス モード は、 ap_ctrl_hs と 類 似 し ていますが、 補 足 のために 入 力 信 号<br />
ap_continue が 追 加 されている 点 が 異 な り ます。 Vivado HLS ブ ロ ッ ク 同 士 を 接 続 する 際 は、 こ の イ ン ターフ ェ イ ス<br />
モー ド の 使 用 をお 勧 め し ます。 ap_ctrl_hs および ap_ctrl_chain のプ ロ ト コルについては、 次 に 説 明 し ます。<br />
ap_none<br />
ap_ctrl_none を 指 定 する と 、 図 4-5 に 示 すハン ド シェ イ ク 信 号 ポー ト (ap_start、 ap_idle、 および ap_done) は 作 成 され<br />
ず、 ブ ロ ッ ク を C/RTL 協 調 シ ミ ュ レーシ ョ ンで 検 証 する こ と はで き ません。<br />
ap_ctrl_hs<br />
図 4‐5:ap_ctrl_hs インターフェイスの 例<br />
図 4-6 に、 イ ン ターフ ェ イ ス タイプ ap_ctrl_hs で 作 成 されたブロ ッ ク レベルのハン ド シ ェ イ ク 信 号 の 動 作 を 示 し、 そ<br />
の 後 にそれらの 動 作 を 解 説 し ます。<br />
X-Ref Target - Figure 4-6<br />
図 4‐6:ap_ctrl_hs イ ン タ ーフ ェ イ スの 動 作<br />
高 位 合 成 japan.xilinx.com 402<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
リ セ ッ ト 後 、 動 作 は 次 の よ う にな り ます。<br />
• ap_start が High になる とブロ ッ クが 操 作 を 開 始 し ます。<br />
• ap_start 信 号 は、 ap_ready 信 号 に よ り デザ イ ンが 新 し い 入 力 ap_start を 受 信 可 能 な 状 態 になった こ と が 示 さ れる ま<br />
で High のままである 必 要 があり ます。 Low になるか、 High のままである と、 別 のト ランザクシ ョ ンが 開 始 され<br />
ます。<br />
• ap_start 出 力 が High になる と、 ap_idle が Low にな り ます。<br />
• こ れで、 入 力 ポー ト か らデータ を 読 み 出 せる よ う にな り ます。<br />
° 最 初 の 入 力 データ は、 ap_idle が Low になった 後 の 最 初 の ク ロ ッ ク エッジでサンプリングされます。<br />
• ブ ロ ッ ク ですべての 操 作 が 完 了 する と 、 戻 り 値 が ap_return ポー ト に 書 き 出 されます。<br />
° 関 数 リ ターンがない 場 合 は、 RTL ブロックに no ap_return ポー ト はあ り ません。<br />
° その 他 の 出 力 は、 ブ ロ ッ ク が 完 了 する まで 任 意 に 書 き 出 さ れ、 こ の I/O プ ロ ト コルか ら は 独 立 し ています。<br />
• ブ ロ ッ ク の 操 作 が 完 了 する と 、 ap_done 出 力 が High にな り ます。<br />
° デザ イ ンが 新 し い 入 力 を 受 信 可 能 な 状 態 にな る と 、 ap_ready 信 号 が High にな り ます。 パイ プ ラ イ ン 処 理 の<br />
ないデザ イ ンの 場 合 、 こ の 信 号 は ap_done と 同 時 にアサート されます。 この 段 階 で、 ap_start が Low になる<br />
か、 High のま まであ る と 、 新 し い ト ラ ンザ ク シ ョ ンが 開 始 さ れます。<br />
° ap_return ポー ト がある 場 合 、 このポー ト の 値 は ap_done が High なった と き に 有 効 にな り ます。<br />
° ap_done 信 号 は、 関 数 の 戻 り 値 (ap_return ポー ト の 出 力 ) が 有 効 であ る こ と を 示 すために 使 用 で き ます。<br />
• ap_idle 信 号 は、 ap_done が High になった 1 サイクル 後 に High にな り、 次 に ap_start が High にな り、 ブロ ッ クが<br />
操 作 を 開 始 する こ と が 示 さ れる まで、 High のままになり ます。<br />
ap_done が High になったと きに ap_start 信 号 が High の 場 合 は、 次 のよ う にな り ます。<br />
• ap_idle 信 号 は Low のままになり ます。<br />
• ブロックは 次 の 実 行 ( 次 の ト ラ ンザ ク シ ョ ン) を 即 座 に 開 始 し ます。<br />
• 次 の 入 力 は、 次 のク ロ ッ ク エ ッ ジで 読 み 込 まれます。<br />
Vivado HLS ではパ イ プ ラ イ ン 処 理 がサポー ト さ れてお り 、 現 在 の ト ラ ンザ ク シ ョ ンが 終 了 する 前 に 次 の ト ラ ンザ ク<br />
シ ョ ンを 開 始 でき ます。 この 場 合 、 ブロ ッ ク で 最 初 の ト ラ ンザク シ ョ ンが 完 了 する 前 に 新 しい 入 力 を 受 信 でき、<br />
ap_done は High にな り ます。<br />
関 数 がパ イ プ ラ イ ン 処 理 さ れてい る 場 合 、 ま たは 最 上 位 ループが -rewind オプシ ョ ンでパイ プ ラ イ ン 処 理 さ れてい る<br />
場 合 、 ap_ready 信 号 は ap_done よ りも 前 に High にな り 、 次 の ト ラ ンザ ク シ ョ ン を 開 始 する かど う かは、 現 在 の ト ラ<br />
ンザ ク シ ョ ンが 完 了 する 前 に 決 定 で き ます。 こ の 段 階 で、 パイ プ ラ イ ンに 既 に 存 在 するデータ を 取 得 する には、<br />
-enable_flush オプシ ョ ンにパイ プ ラ イ ン 指 示 子 を 付 けて 実 行 し ます。<br />
ap_ctrl_chain<br />
ap_ctrl_chain インターフェイス プロ ト コルは ap_ctrl_hs と 類 似 していますが、 ap_continue ポー ト が 追 加 されている 点<br />
が 異 な り ます。 ap_continue 信 号 が Low にな る と 、 データ を 消 費 する ダ ウ ン ス ト リ ーム ブ ロ ッ ク が 新 し いデータ を 受<br />
信 で き る 状 態 ではない こ と を 意 味 し ます。<br />
ap_continue が Low にな る と 、 現 在 の ト ラ ンザ ク シ ョ ンの 最 終 ス テー ト に 到 達 し た と き にデザ イ ンは 停 止 し ます。 出 力<br />
データ はイ ン ターフ ェ イ スに 出 力 さ れ、 ap_done 信 号 が High にな り、 デザインは ap_continue が High になるまでこの<br />
ステートのままになり ます。 これは、 図 4-7 に 示 し ます。<br />
注 記 : パイ プ ラ イ ン 処 理 さ れたデザ イ ンの 場 合 は、 現 在 の ト ラ ンザ ク シ ョ ンの 終 わ り が ap_continue が Low になった<br />
すぐ 後 の 次 のク ロ ッ ク サ イ ク ルで 発 生 する こ と に 注 意 し て く だ さ い (デザイ ンがスループ ッ ト 1 でパイプラ イ ン され<br />
る 場 合 )。<br />
この 信 号 によ り、 ダウンス ト リーム ブ ロ ッ ク でデータ が こ れ 以 上 生 成 さ れない よ う にで き ます。<br />
高 位 合 成 japan.xilinx.com 403<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
X-Ref Target - Figure 4-7<br />
注 記 : ap_done が High になったと きに 確 実 に 有 効 なデータは、ap_return ポー ト の 値 です。 このポー ト は、 関 数 で return<br />
文 を 使 用 し て 値 を 戻 す 場 合 にのみ 存 在 し ます。<br />
トランザクションが 終 了 して ap_done が High になった と きに、 デザイ ンのその 他 の 出 力 も 有 効 であ る 可 能 性 があ り<br />
ますが、 必 ずし も 有 効 であ る と は 限 り ません。 出 力 ポー ト に 対 応 する Valid 信 号 が 必 要 な 場 合 は、 こ の 後 説 明 する ポー<br />
ト レベルの I/O プ ロ ト コルで 指 定 する 必 要 があ り ます。<br />
ap_none<br />
図 4‐7 : ap_ctrl_chain インターフェイスのビヘイビア<br />
ap_none インターフェイス タ イ プは 最 も 単 純 な イ ン ターフ ェ イ スで、 ほかの 信 号 はあ り ません。 入 力 信 号 に も 出 力 信<br />
号 に も、 データ の 読 み 込 みま たは 書 き 出 し がいつ 実 行 さ れてい る かを 示 す 制 御 ポー ト はあ り ません。 RTL デザイ ンに<br />
含 まれるポート は、 ソース コー ド で 指 定 さ れてい る も のだけです。<br />
ap_none イ ン ターフ ェ イ スでは 追 加 のハー ド ウ ェ ア オーバーヘッ ド はあ り ませんが、 送 信 ブロ ッ ク で 適 切 な 時 間 に 入<br />
力 ポー ト にデータ を 供 給 し、 ト ラ ンザク シ ョ ン 中 (デザ イ ンが 完 了 する まで) 保 持 する 必 要 があ り 、 受 信 ブロ ッ ク で 適<br />
切 な 時 間 に 出 力 ポー ト を 読 み 込 む 必 要 があ り ます。 そのため、 イ ン ターフ ェ イ ス タイプ ap_none が 出 力 に 指 定 さ れた<br />
デザイ ンは、 cosim_design 機 能 を 使 用 し て 自 動 的 に 検 証 する こ と はで き ません。<br />
ap_none インターフェイスは、 図 1-36 に 示 すよ う に、 配 列 引 数 では 使 用 で き ません。<br />
高 位 合 成 japan.xilinx.com 404<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ap_stable<br />
ap_stable インターフェイス タイプは、ap_none と 同 様 に、デザ イ ンに イ ン ターフ ェ イ ス 制 御 ポー ト は 追 加 さ れません。<br />
ap_stable タ イ プは、 ポー ト が 通 常 の 操 作 中 は 安 定 し てい る が、 最 適 化 さ れる 可 能 性 のあ る 低 数 値 ではな く 、 ポー ト に<br />
レ ジ ス タ を 付 け る 必 要 がない こ と を 指 定 し ます。<br />
ap_stable タイプは、 通 常 コンフィギュレーション データ を 供 給 する ポー ト に 使 用 さ れます。 コ ン フ ィ ギ ュ レーシ ョ ン<br />
データ は 変 化 する 必 要 があ り ますが、 通 常 の 操 作 では 変 化 し ません。 コ ン フ ィ ギ ュ レーシ ョ ン データは、 通 常 リ セ ッ<br />
ト 中 ま たは リ セ ッ ト 前 にのみ 変 化 し ます。<br />
ap_stable タ イ プは、 入 力 ポー ト のみに 適 用 で き ます。 入 出 力 ポー ト に 適 用 する と 、 ポー ト の 入 力 部 分 のみが 安 定 し て<br />
いる と 想 定 されます。<br />
ap_hs (ap_ack、 ap_vld、 および ap_ovld)<br />
ap_hs インターフェイスでは、 データが 使 用 されたことを 示 す ACK 信 号 と データ が 読 み 込 み 可 能 な こ と を 示 す Valid<br />
信 号 が 使 用 さ れます。 こ の イ ン ターフ ェ イ スは、 ap_ack、 ap_vld、 および ap_ovld の 上 位 集 合 です。<br />
• インターフェイス タイプ ap_ack では、 ACK 信 号 のみが 提 供 されます。<br />
• インターフェイス タイプ ap_vld では、 Valid 信 号 のみが 提 供 されます。<br />
• インターフェイス タイプ ap_ovld では Valid 信 号 のみが 提 供 さ れ、 出 力 ポー ト ま たは 入 出 力 ポー ト の 出 力 部 分 の<br />
みに 適 用 さ れます。<br />
図 4-8 に、 入 力 ポー ト と 出 力 ポー ト で ap_hs イ ン ターフ ェ イ スがどの よ う に 動 作 する かを 示 し ます。 こ の 例 では、 入<br />
力 ポー ト 名 は in、 出 力 ポート 名 は out です。<br />
注 記 : 制 御 信 号 には、 元 のポー ト 名 に 基 づいて 自 動 的 に 名 前 が 付 け られます。 た と えば、 入 力 ポー ト in の Valid ポー<br />
トは in_vld です。<br />
X-Ref Target - Figure 4-8<br />
入 力 は、 次 の よ う にな り ます。<br />
図 4‐8:ap_hs イ ン タ ーフ ェ イ スの 動 作<br />
高 位 合 成 japan.xilinx.com 405<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• リセット 後 ap_start が High にな る と 、 ブ ロ ッ ク が 通 常 の 操 作 を 開 始 し ます。<br />
• 入 力 ポー ト が 読 み 込 まれる と き に in_vld 入 力 が Low の 場 合 、 デザ イ ンは 停 止 し、 in_vld 入 力 が High になって 新<br />
しい 入 力 値 が 有 効 であ る こ と が 示 される まで 待 機 し ます。<br />
• in_vld 入 力 が High になる とすぐに、 in_ack 出 力 が High にな り 、 データ が 読 み 込 まれた こ と が 示 さ れます。<br />
出 力 は、 次 の よ う にな り ます。<br />
• リセット 後 ap_start が High にな る と 、 ブ ロ ッ ク が 通 常 の 操 作 を 開 始 し ます。<br />
• 出 力 ポー ト への 書 き 出 し が 実 行 さ れる と 、 同 時 に out_vld 出 力 信 号 が High にな り 、 ポー ト に 有 効 なデータ が 存 在<br />
するこ とが 示 されます。<br />
• out_ack 入 力 が Low の 場 合 、 デザ イ ンが 停 止 し、 out_ack 入 力 が High になるまで 待 機 し ます。<br />
• out_ack 入 力 が High になる と、 次 のク ロ ッ ク エッジで out_vld 出 力 が Low にな り ます。<br />
ap_hs イ ン ターフ ェ イ ス を 使 用 するデザ イ ンは cosim_design で 検 証 でき るので、 柔 軟 な 開 発 プロセスが 可 能 と な り 、<br />
ボ ト ムア ッ プおよび ト ッ プダ ウ ンの 設 計 フ ローの 両 方 が 使 用 で き ます。 ブ ロ ッ ク 間 の 通 信 は 双 方 向 のハン ド シ ェ イ ク<br />
に よ り 安 全 に 実 行 で き、 正 し い 操 作 のために 手 動 の 操 作 や 前 提 は 必 要 あ り ません。<br />
ap_hs インターフェイスは 安 全 なインターフェイス プロ ト コルですが、 2 つのポー ト と 関 連 の 制 御 ロ ジ ッ ク が 必 要 と<br />
なります。<br />
ap_ack インターフェイスでは、 ACK ポー ト のみが 合 成 さ れます。<br />
• 入 力 引 数 に 指 定 する と 、 出 力 ACK ポー ト が 生 成 さ れ、 入 力 が 読 み 込 まれる サ イ ク ルで High にな り ます。<br />
• 出 力 引 数 に 指 定 する と 、 入 力 ACK ポー ト と な り ます。<br />
° 書 き 出 し 操 作 後 、 デザ イ ンは 停 止 し、 ACK 入 力 が High になって 出 力 が 受 信 ブ ロ ッ ク に よ り 読 み 込 まれた こ<br />
と が 示 さ れる まで 待 機 し ます。<br />
° ただ し、 データ が 使 用 可 能 であ る こ と を 示 す 出 力 ポー ト はあ り ません。<br />
出 力 ポー ト で ap_ack インターフェイス タ イ プを 指 定 する 場 合 は、 注 意 が 必 要 です。 出 力 ポー ト に ap_ack を 使 用 する<br />
デザイ ンは、 cosim_design で 検 証 でき ません。<br />
インターフェイス タイプ ap_vld を 指 定 する と 、 RTL デザイ ンに 関 連 の Valid ポー ト が 追 加 さ れます。<br />
• 出 力 引 数 に 指 定 する と 、 出 力 ポー ト のデータ が 有 効 になった こ と を 示 す 出 力 Valid ポー ト が 生 成 さ れます。<br />
注 記 : 入 力 引 数 に 指 定 し た 場 合 、 こ の Valid ポー ト は ap_hs でインプリ メン ト される Valid ポー ト と は 動 作 が 異 な<br />
ります。<br />
• ap_vld を 入 力 ポー ト に 使 用 する と ( 出 力 ACK 信 号 はな し)、 Valid がア ク テ ィ ブにな る と 同 時 に 入 力 ポー ト が 読 み<br />
込 まれます。 こ れはデザ イ ンでポー ト を 読 み 込 む 準 備 がで き ていない 場 合 も 同 様 で、 その 場 合 はデータ ポー ト が<br />
サンプ リ ング さ れ、 必 要 にな る まで 内 部 で 保 持 さ れます。<br />
• Valid 入 力 がア ク テ ィ ブな 各 サ イ ク ルで、 入 力 データ が 読 み 込 まれます。<br />
ap_ovld インターフェイス タイプは ap_vld と 同 じ ですが、 出 力 ポー ト のみに 指 定 で き ます。 こ れは、 読 み 込 み と 書 き<br />
出 しの 両 方 が 実 行 されるポインターを、 Valid 出 力 ポー ト のみを 付 けて イ ンプ リ メ ン ト し、 入 力 側 はデフ ォル ト の<br />
ap_none で イ ンプ リ メ ン ト する 場 合 に 有 益 です。<br />
ap_memory、 bram<br />
配 列 引 数 は、 通 常 ap_memory インターフェイスを 使 用 してインプリ メント されます。 このポート インターフェイス<br />
は、 イ ンプ リ メ ンテーシ ョ ンで メ モ リ のア ド レ ス ロケーションにランダム ア ク セスが 必 要 な 場 合 に、 メ モ リ エレ メ<br />
ント (RAM、 ROM) と 通 信 する ために 使 用 さ れます。 配 列 引 数 は、 ラ ンダム アクセス メモリ インターフェイスをサ<br />
ポー ト する 唯 一 の 引 数 です。<br />
高 位 合 成 japan.xilinx.com 406<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
メモリ エレ メン トへのシーケンシャル ア ク セスのみが 必 要 な 場 合 は、 次 に 説 明 する ap_fifo インターフェイスを 使 用<br />
し て、 ハー ド ウ ェ アのオーバーヘ ッ ド を 削 減 で き ます。 ap_fifo インターフェイスでは、アドレス 生 成 は 実 行 されませ<br />
ん。<br />
ap_memory と bram インターフェイスは 同 じですが、ブロックが IP インテグレーター 内 で 使 用 される 場 合 にのみ 異 な<br />
ります。<br />
• ap_memory インターフェイスは 別 々のポート として 表 示 される。<br />
• bram インターフェイスは 1 つのポー ト と し て 表 示 さ れる。 すべてのポー ト への 接 続 は IP インテグレーター 内 で<br />
1 つの 接 続 を 使 用 し て 実 行 可 能 。<br />
ap_memory イ ン ターフ ェ イ ス を 使 用 する 場 合 、 配 列 ターゲ ッ ト を set_directive_resource コマンドを 使 用 して 指 定 する<br />
必 要 があ り ます。 配 列 に ターゲ ッ ト が 指 定 さ れていない 場 合 、Vivado HLS に よ り 自 動 的 にシングル ポー ト またはデュ<br />
アル ポー ト RAM イ ン ターフ ェ イ ス を 使 用 する かが 判 断 さ れます。<br />
ヒント : 合 成 の 前 に、 RESOURCE 指 示 子 を 使 用 し て、 配 列 引 数 の ターゲ ッ ト と し て 正 し い メ モ リ タイプを 指 定 して<br />
ください。 新 し い 正 し い メ モ リ で 再 合 成 する と 、 ス ケジ ュー リ ン グおよび RTL が 異 な る も のにな る 可 能 性 があ り ま<br />
す。<br />
図 4-9 に、d という 配 列 ターゲッ トがシングル ポー ト ブロック RAM として 指 定 されたリソースである 例 を 示 します。<br />
X-Ref Target - Figure 4-9<br />
リ セ ッ ト 後 、 動 作 は 次 の よ う にな り ます。<br />
図 4‐9:ap_memory イ ン タ ーフ ェ イ スの 動 作<br />
• リセット 後 ap_start が High にな る と 、 ブ ロ ッ ク が 通 常 の 操 作 を 開 始 し ます。<br />
• 読 み 込 みは、 出 力 ア ド レ ス ポー ト にア ド レ ス を 供 給 し、 出 力 信 号 d_ce を アサー ト する と 実 行 さ れます。<br />
° このブロック RAM ターゲ ッ ト の 場 合 、 入 力 データ が 次 の ク ロ ッ ク サイクルで 有 効 になるとデザインで 判 断<br />
されます。<br />
• 書 き 出 し は、 出 力 ポー ト d_ce と d_we を アサー ト し、 同 時 にア ド レ ス と データ を 供 給 する と 実 行 さ れます。<br />
高 位 合 成 japan.xilinx.com 407<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
メモリ イ ン ターフ ェ イ スは 外 部 信 号 に よ って 停 止 で きず、 出 力 データ が 有 効 であ る かど う かが 示 さ れる ので、 C/RTL<br />
協 調 シ ミ ュ レーシ ョ ン を 使 用 し て 検 証 で き ます。<br />
ap_fifo<br />
メモリ エレメン トにアクセスする 必 要 があり、 アクセスがシーケンシャルでランダム アクセスが 不 要 な 場 合 は、<br />
ap_fifo イ ン ターフ ェ イ ス を 使 用 する のがハー ド ウ ェ アの 点 では 最 も 効 率 的 です。ap_fifo インターフェイスでは、ポー<br />
トを FIFO に 接 続 で き、 完 全 な 双 方 向 の Empty/Full の 通 信 がサポー ト さ れ、 配 列 、 ポ イ ン ター、 および 参 照 渡 し 引 数<br />
で 指 定 でき ます。<br />
ap_fifo イ ン ターフ ェ イ ス を 使 用 可 能 な 関 数 では、 ポ イ ン ターが よ く 使 用 さ れ、 同 じ 変 数 に 複 数 回 ア ク セ スする 可 能 性<br />
があ り ます。 こ の 場 合 、 「マルチア ク セ ス ポインター インターフェイス」 を 参 照 して volatile 修 飾 子 の 重 要 性 を 理 解<br />
してください。<br />
注 記 : ap_fifo イ ン ターフ ェ イ スでは、 すべての 読 み 込 みおよび 書 き 出 し がシーケンシ ャルであ る と 想 定 さ れます。<br />
Vivado HLS でそ う ではない と 判 断 さ れた 場 合 、 エ ラー メ ッ セージが 表 示 さ れて 処 理 が 停 止 し ます。<br />
Vivado HLS でア ク セ スが 常 にシーケンシ ャルかど う かを 判 断 で き ない 場 合 は、 警 告 メ ッ セージが 表 示 さ れ、 処 理 が 継<br />
続 されます。<br />
次 の 例 では、 in1 は 現 在 のアド レスにアクセスし、 その 後 現 在 のア ド レスの 上 2 つのア ド レ スにア ク セス し て、 最 後<br />
に 1 つ 下 のア ド レ スにア ク セ スする ポ イ ン ターです。<br />
void foo(int* in1, ...){<br />
int data1, data2, data3;<br />
...<br />
data1= *in1;<br />
data2= *(in1+2);<br />
data3= *(in1-1);<br />
...<br />
}<br />
in1 を ap_fifo イ ン ターフ ェ イ ス と し て 指 定 する と 、 Vivado HLS でアクセスがチェックされ、アクセスがシーケンシャ<br />
ルでない 場 合 はエラー メッセージが 表 示 され、 停 止 されます。シーケンシャルでないアドレス ロケーションから 読<br />
み 込 むには、 ap_memory インターフェイスをランダム ア ク セ ス と し て 使 用 する か、 ap_bus インターフェイスを 使 用<br />
します。<br />
ap_fifo イ ン ターフ ェ イ スは、 読 み 込 みおよび 書 き 出 し の 両 方 に 使 用 さ れる 引 数 ( 入 出 力 ポー ト ) には 指 定 でき ません。<br />
入 力 引 数 ま たは 出 力 引 数 のみで 指 定 で き ます。 入 力 引 数 in、 出 力 引 数 out を ap_fifo インターフェイスとして 指 定 した<br />
インターフェイスは、 次 のように 動 作 します。<br />
高 位 合 成 japan.xilinx.com 408<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
X-Ref Target - Figure 4-10<br />
リセット 後 ap_start が High にな る と 、 ブ ロ ッ ク が 通 常 の 操 作 を 開 始 し ます。<br />
読 み 込 みでは、 次 の よ う にな り ます。<br />
• 入 力 ポー ト で 読 み 込 みが 実 行 さ れる と き に FIFO が 空 の 場 合 (in_empty_n 入 力 ポー ト が Low)、デザ イ ンは 停 止 し 、<br />
データ を 読 み 込 め る よ う にな る まで 待 機 し ます。<br />
• in_empty_n 入 力 が High になって FIFO にデータがあ る こ と が 示 される と すぐに、ACK 信 号 であ る in_read 出 力 が<br />
High にな り 、 こ のサ イ ク ルでデータ が 読 み 込 まれた こ と が 示 さ れます。<br />
• ポー ト で 読 み 込 みが 必 要 な と き に FIFO にデータがあ る と、 出 力 ACK 信 号 が High にな り、 このサイ クルでデー<br />
タ が 読 み 込 まれた こ と が 示 さ れます。<br />
出 力 は、 次 の よ う にな り ます。<br />
図 4‐10 : ap_fifo イ ン タ ーフ ェ イ スの 動 作<br />
• 出 力 ポー ト で 書 き 込 みが 実 行 さ れる と き に FIFO がフルの 場 合 (out_full_n が Low)、データは 出 力 ポー ト に 配 置 さ<br />
れますが、 デザインは 停 止 し、 FIFO に 書 き 込 むスペースがで き る まで 待 機 し ます。<br />
• FIFO に 書 き 込 むスペースができ る と (out_full_n 入 力 が High)、 out_write 出 力 が High にな り 、 出 力 データ が 有 効<br />
である こ とが 示 されます。<br />
• 出 力 を 書 き 込 む 必 要 があ る と き に FIFO にスペースがあ る と 、 出 力 Valid 信 号 が High にな り、このサイ クルでデー<br />
タ が 有 効 であ る こ と が 示 さ れます。<br />
ap_fifo イ ン ターフ ェ イ スでは、 出 力 データ ポー ト に 関 連 の 書 き 込 み 信 号 ポー ト があ る ので、 cosim_design を 使 用 して<br />
検 証 で き ます。<br />
最 上 位 関 数 がパ イ プ ラ イ ン 処 理 さ れる 場 合 、 ま たは 最 上 位 ループが -rewind オプシ ョ ンでパイプラ イン 処 理 される 場<br />
合 、 _lwr が 接 尾 語 に 付 いた 追 加 の 出 力 ポー ト が 作 成 されます。 このポー ト は、 FIFO イ ン ターフ ェ イ スへ 最 後 の 書 き<br />
込 みが 実 行 さ れる と ア ク テ ィ ブ High にな り ます。<br />
高 位 合 成 japan.xilinx.com 409<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ap_bus<br />
ap_bus インターフェイスを 使 用 すると、 バス ブリッジと 通 信 できます。 このインターフェイスは 特 定 のバス 規 格 に<br />
は 従 っていませんが、 汎 用 であ る ためバス ブリッジと 共 に 使 用 でき、バス ブリッジでシステム バスをアービ ト レー<br />
ションできます。バス ブリ ッジでは、 バースト 書 き 出 しをキャッシュできるようになっている 必 要 があります。<br />
ap_bus イ ン ターフ ェ イ ス を 使 用 可 能 な 関 数 ではポ イ ン ターが 使 用 さ れ、 同 じ 変 数 に 複 数 回 ア ク セ スする こ と があ り ま<br />
す。 こ の 場 合 、 「マルチア ク セ ス ポインター インターフェイス」 を 参 照 して volatile 修 飾 子 の 重 要 性 を 理 解 し て く だ<br />
さい。<br />
ap_bus インターフェイスは、 次 の 2 つの 方 法 で 使 用 でき ます。<br />
• 標 準 モー ド : 読 み 込 みおよび 書 き 出 し を、 それぞれにア ド レ ス を 指 定 し て 個 別 に 実 行 し ます。<br />
• バース ト モード : C ソース コードで C 関 数 memcpy を 使 用 する と 、 データ 転 送 にバース ト モー ド が 使 用 さ れま<br />
す。 バース ト モー ド では、 イ ン ターフ ェ イ スに よ り 転 送 のベース アドレスとサイズが 示 され、 データ サンプル<br />
が 連 続 する サ イ ク ルで 高 速 に 転 送 さ れます。<br />
• memcpy 関 数 でア ク セス さ れる 配 列 は、 レ ジ ス タ には 分 割 で き ません。<br />
図 4-11 および 図 4-12 に、 標 準 モー ド での 読 み 込 み と 書 き 出 し の 動 作 の 例 を 示 し ます。 こ の 例 では、 ap_bus インター<br />
フェイスが 引 数 d に 適 用 されています。<br />
void foo (int *d) {<br />
static int acc = 0;<br />
int i;<br />
}<br />
for (i=0;i
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
X-Ref Target - Figure 4-11<br />
リ セ ッ ト 後 、 動 作 は 次 の よ う にな り ます。<br />
• リセット 後 ap_start が High にな る と 、 ブ ロ ッ ク が 通 常 の 操 作 を 開 始 し ます。<br />
• 読 み 込 みを 実 行 する と き にバス ブリッジ FIFO にデータがない 場 合 は (d_rsp_empty_n が Low)、 次 のようになり<br />
ます。<br />
° 出 力 ポー ト d_req_write がアサート され、 d_req_din ポー ト がデ ィ アサー ト さ れて、 読 み 込 み 操 作 が 示 さ れま<br />
す。<br />
° アドレスが 出 力 です。<br />
° デザインが 停 止 し、 データが 読 み 込 めるよ うになるまで 待 機 します。<br />
• データ が 読 み 込 め る よ う にな る と 、 出 力 信 号 d_rsp_read がアサー ト され、 次 のク ロ ッ ク エ ッ ジでデータ が 読 み 込<br />
まれます。<br />
• 読 み 込 みを 実 行 する と き にバス ブリッジ FIFO にデータがあ る 場 合 は (d_rsp_empty_n が High)、 次 のようになり<br />
ます。<br />
° 出 力 ポー ト d_req_write がアサート され、 d_req_din ポー ト がデ ィ アサー ト さ れて、 読 み 込 み 操 作 が 示 さ れま<br />
す。<br />
° アドレスが 出 力 です。<br />
図 4‐11 : ap_bus イ ン タ ーフ ェ イ スの 動 作 標 準 読 み 込 み<br />
° 次 のク ロ ッ ク サイクルで d_rsp_read がアサー ト され、 次 のク ロ ッ ク エ ッ ジでデータ が 読 み 込 まれます。<br />
高 位 合 成 japan.xilinx.com 411<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
X-Ref Target - Figure 4-12<br />
リ セ ッ ト 後 、 動 作 は 次 の よ う にな り ます。<br />
• リセット 後 ap_start が High にな る と 、 ブ ロ ッ ク が 通 常 の 操 作 を 開 始 し ます。<br />
• 書 き 出 し を 実 行 する と き にバス ブリッジ FIFO にスペースがない 場 合 は (d_req_full_n が Low)、 次 のようになり<br />
ます。<br />
° ア ド レ スおよびデータ が 出 力 です。<br />
° デザイ ンが 停 止 し、 スペースが 使 用 可 能 にな る まで 待 機 し ます。<br />
• 書 き 出 すスペースがで き る と 、 次 の よ う にな り ます。<br />
° 出 力 ポー ト d_req_write と d_req_din がアサート されて、 書 き 出 し 操 作 が 示 されます。<br />
° 出 力 信 号 d_req_din がアサート され、 次 のク ロ ッ ク エ ッ ジでデータ が 有 効 であ る こ と が 示 さ れます。<br />
• 書 き 出 し を 実 行 する と き にバス ブリッジ FIFO にスペースがあ る 場 合 は (d_req_full_n が High)、 次 のようになり<br />
ます。<br />
° 出 力 ポー ト d_req_write と d_req_din がアサート されて、 書 き 出 し 操 作 が 示 されます。<br />
° ア ド レ スおよびデータ が 出 力 です。<br />
図 4‐12 : ap_bus イ ン タ ーフ ェ イ スの 動 作 標 準 書 き 出 し<br />
° d_req_din がアサー ト され、 次 のク ロ ッ ク エ ッ ジでデータ が 有 効 であ る こ と が 示 さ れます。<br />
高 位 合 成 japan.xilinx.com 412<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
X-Ref Target - Figure 4-13<br />
リ セ ッ ト 後 、 動 作 は 次 の よ う にな り ます。<br />
図 4‐13 : ap_bus イ ン タ ーフ ェ イ スの 動 作 バース ト 読 み 込 み<br />
• リセット 後 ap_start が High にな る と 、 ブ ロ ッ ク が 通 常 の 操 作 を 開 始 し ます。<br />
• 読 み 込 みを 実 行 する と き にバス ブリッジ FIFO にデータがない 場 合 は (d_rsp_empty_n が Low)、 次 のようになり<br />
ます。<br />
° 出 力 ポー ト d_req_write がアサー ト され、 d_req_din ポー ト がデ ィ アサー ト さ れて、 読 み 込 みが 示 さ れます。<br />
° 転 送 のベース アドレスとサイズが 出 力 されます。<br />
° デザインが 停 止 し、 データが 読 み 込 めるよ うになるまで 待 機 します。<br />
• データ が 読 み 込 まれる よ う にな る と 、 出 力 信 号 d_rsp_read がアサート され、 次 の N クロック エッジ (N は d_size<br />
出 力 ポー ト の 値 ) でデータ が 読 み 込 まれます。<br />
• バス ブリッジ FIFO が 途 中 で 空 にな る と 、 データ 転 送 は 即 座 に 停 止 し、 データ が 読 み 込 まれる よ う にな る まで 待<br />
機 し て、 停 止 し た 地 点 か ら 再 開 し ます。<br />
• 読 み 込 みを 実 行 する と き にバス ブリッジ FIFO にデータがあ る 場 合 は、 次 のよ う にな り ます。<br />
° 転 送 は 上 記 の よ う に 開 始 し、 FIFO が 途 中 で 空 にな る と 、 デザ イ ンが 停 止 し てデータ が 再 び 読 み 込 め る よ う<br />
になるまで 待 機 します。<br />
高 位 合 成 japan.xilinx.com 413<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
X-Ref Target - Figure 4-14<br />
リ セ ッ ト 後 、 動 作 は 次 の よ う にな り ます。<br />
• リセット 後 ap_start が High にな る と 、 ブ ロ ッ ク が 通 常 の 操 作 を 開 始 し ます。<br />
• 書 き 出 し を 実 行 する と き にバス ブリッジ FIFO にスペースがない 場 合 は (d_req_full_n が Low)、 次 のようになり<br />
ます。<br />
° ベース ア ド レ ス、 転 送 サ イ ズ、 およびデータ が 出 力 です。<br />
° デザイ ンが 停 止 し、 スペースが 使 用 可 能 にな る まで 待 機 し ます。<br />
• 書 き 込 むスペースがで き る と 、 次 の よ う にな り ます。<br />
° 出 力 ポー ト d_req_write と d_req_din がアサー ト さ れて、 書 き 込 み 操 作 が 示 さ れます。<br />
° 出 力 信 号 d_req_din がアサート され、 次 のク ロ ッ ク エ ッ ジでデータ が 有 効 であ る こ と が 示 さ れます。<br />
° FIFO がフルになる と 即 座 に d_req_din 出 力 信 号 がデ ィ アサー ト さ れ、 スペースがで き る と 再 びアサー ト さ れ<br />
ます。<br />
° N 個 のデータ 値 が 転 送 さ れる と 転 送 が 停 止 し ます (N は d_size の 値 )。<br />
• 書 き 込 みを 実 行 する と き にバス ブリッジ FIFO にスペースがあ る 場 合 は (d_req_full_n が High)、 次 のようになり<br />
ます。<br />
° 転 送 は 上 記 の よ う に 開 始 し、 FIFO が 途 中 で 空 にな る と 、 デザ イ ンが 停 止 し てデータ が 再 び 読 み 込 め る よ う<br />
になるまで 待 機 します。<br />
cosim_design インターフェイスは、 autosim 機 能 で 検 証 で き ます。<br />
axis<br />
図 4‐14 : ap_bus イ ン タ ーフ ェ イ スの 動 作 バース ト 書 き 出 し<br />
AXI Stream I/O プロ ト コルは、axis モード を 使 用 して I/O プロ ト コルとして 指 定 できます。 タイ ミ ングおよびポート<br />
などを 含 む AXI Stream インターフェイスの 説 明 については、『Vivado Design Suite AXI リファレンス ガイド』 (UG1037)<br />
を 参 照 して く ださい。<br />
この I/O プ ロ ト コルのすべての 機 能 については、 「AXI4 インターフェイスの 使 用 」 を 参 照 して ください。<br />
高 位 合 成 japan.xilinx.com 414<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
s_axilite<br />
AXI Slave Lite I/O プロ ト コルは s_axilite モード を 使 用 した I/O プロ ト コルの 1 つ として 指 定 できます。タイミン<br />
グおよびポー ト などを 含 む AXI Slave Lite イ ン ターフ ェ イ スの 説 明 については、 『Vivado Design Suite AXI リファレン<br />
ス ガイド』 (UG1037) を 参 照 して く ださい。<br />
この I/O プ ロ ト コルのすべての 機 能 については、 「AXI4 インターフェイスの 使 用 」 を 参 照 して ください。<br />
m_axi<br />
AXI Master I/O プロ ト コルは m_axi モード を 使 用 した I/O プロ ト コルの 1 つ として 指 定 できます。タイミングおよび<br />
ポー ト などを 含 む AXI Master インターフェイスの 説 明 については、 『Vivado Design Suite AXI リファレンス ガイド』<br />
(UG1037) を 参 照 して く ださい。<br />
この I/O プ ロ ト コルのすべての 機 能 については、 「AXI4 インターフェイスの 使 用 」 を 参 照 して ください。<br />
AXI4 Slave Lite の C ド ラ イバーのリ フ ァ レンス<br />
AXI4 Slave Lite イ ン ターフ ェ イ スがデザ イ ンに 追 加 さ れる と 、C ドライバー フ ァ イルのセ ッ ト が 自 動 的 に 作 成 さ れま<br />
す。 こ れら の C ドライバー ファイルには、CPU で 実 行 さ れる どの ソ フ ト ウ ェ アに も 統 合 で き る API が 含 まれ、 AXI4<br />
Slave Lite インターフェイスを 介 してデバイスとの 通 信 に 使 用 されます。<br />
API 関 数 には、 最 上 位 関 数 か ら の 名 前 が 一 部 使 用 さ れます。 こ のセ ク シ ョ ンでは、 最 上 位 関 数 は DUT と 仮 定 します。<br />
次 の 表 は、 C ドライバー ファイルで 提 供 される API 関 数 をそれぞれ リ ス ト し ています。<br />
表 4‐1:C ドライバーの API 関 数<br />
API 関 数<br />
XDut_Initialize<br />
XDut_CfgInitialize<br />
XDut_LookupConfig<br />
XDut_Release<br />
XDut_Start<br />
XDut_IsDone<br />
XDut_IsIdle<br />
説 明<br />
この API は InstancePtr に 値 を 書 き 込 みんだら、ほかの API で 使 用 で<br />
きます。 MMU がシ ス テムで 使 用 さ れる 場 合 を 除 き、 こ の API を 呼<br />
び 出 し てデバイ ス を 初 期 化 する こ と をお 勧 め し ます。<br />
デバイ ス コ ン フ ィ ギ ュ レーシ ョ ン を 初 期 化 し ます。 シ ス テムで<br />
MMU が 使 用 さ れる 場 合 は、 こ の 関 数 を 呼 び 出 す 前 に XDut_Config<br />
変 数 のベース ア ド レ ス を 仮 想 ベース アドレスに 置 換 します。 Linux<br />
システムでは 使 用 できません。<br />
ID を 指 定 してデバイ スのコンフ ィ ギュレーシ ョ ン 情 報 を 取 得 し ま<br />
す。 コ ン フ ィ ギ ュ レーシ ョ ン 情 報 には、 物 理 ベース アドレスが 含 ま<br />
れます。 Linux システムでは 使 用 できません。<br />
Linux で UIO デバイ ス を リ リ ース し ます。 munmap でマッ ピングを<br />
削 除 し ます。 プ ロ セスが 終 了 する と 、 マ ッ ピ ン グは 自 動 的 に 削 除 さ<br />
れます。 Linux シ ス テムでのみ 使 用 で き ます。<br />
デバイ ス を 起 動 し ます。 こ の 関 数 は、 デバイ スの ap_start ポー ト<br />
をアサート します。デバイスに ap_start ポー ト があ る 場 合 にのみ<br />
使 用 で き ます。<br />
デバイ スが 前 の 実 行 を 終 了 し たかど う かをチェ ッ ク し ます。 この 関<br />
数 では、 デバイ スの ap_done ポー ト の 値 が 戻 さ れます。 デバイ スに<br />
ap_done ポー ト があ る 場 合 にのみ 使 用 で き ます。<br />
デバイ スがア イ ド ル ステートかど うかをチェックします。 この 関 数<br />
では、 デバイ スの ap_idle ポー ト の 値 が 戻 さ れ ま す。 デバ イ ス に<br />
ap_idle ポー ト があ る 場 合 にのみ 使 用 で き ます。<br />
高 位 合 成 japan.xilinx.com 415<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
表 4‐1:C ドライバーの API 関 数<br />
XDut_IsReady<br />
デバイ スが 次 の 入 力 を 受 信 する 準 備 ができ ているかど う かを<br />
チェッ ク します。 この 関 数 では、 デバイスの ap_ready ポー ト の 値 が<br />
戻 さ れます。 デバイ スに ap_ready ポー ト があ る 場 合 にのみ 使 用 で き<br />
ます。<br />
XDut_Continue ap_continue ポートをアサートします。デバイスに ap_continue ポー<br />
ト があ る 場 合 にのみ 使 用 で き ます。<br />
XDut_EnableAutoRestart<br />
XDut_DisableAutoRestart<br />
XDut_Set_ARG<br />
XDut_Set_ARG_vld<br />
XDut_Set_ARG_ack<br />
API 関 数 の 詳 細 については、 次 に 示 し ます。<br />
XDut_Initialize<br />
コード 例<br />
int XDut_Initialize(XDut *InstancePtr, u16 DeviceId);<br />
int XDut_Initialize(XDut *InstancePtr, const char* InstanceName);<br />
デバイ スでの 自 動 再 開 を イ ネーブルに し ます。 こ れが 設 定 さ れる<br />
と、 デバイスは 現 在 のト ランザクショ ンが 終 了 したら、 次 のト ラン<br />
ザ ク シ ョ ン を 自 動 的 に 開 始 し ます。<br />
自 動 再 開 をデ ィ スエーブルに し ます。<br />
ARG ポー ト に 値 (top 関 数 のス カ ラー 引 数 ) を 書 き 出 し ます。ARG が<br />
入 力 ポー ト の 場 合 にのみ 使 用 で き ます。<br />
ARG_vld ポー ト をアサー ト し ます。 ARG が 入 力 ポー ト で、 ap_hs ま<br />
たは ap_vld インターフェイス プロ ト コルを 使 用 してインプリ メン<br />
ト さ れる 場 合 にのみ 使 用 で き ます。<br />
ARG_ack ポー ト をアサー ト し ます。 ARG が 出 力 ポー ト で、 ap_hs ま<br />
たは ap_ack インターフェイス プロ ト コルを 使 用 してインプリ メン<br />
ト さ れる 場 合 にのみ 使 用 で き ます。<br />
XDut_Get_ARG<br />
ARG か ら 値 を 読 み 込 みます。 ARG ポー ト がデバイ スの 出 力 ポー ト<br />
の 場 合 にのみ 使 用 で き ます。<br />
XDut_Get_ARg_vld ARG_vld か ら 値 を 読 み 込 みます。 ARG がデバイ スの 出 力 ポー ト で、<br />
ap_hs または ap_vld インターフェイス プ ロ ト コルを 使 用 し て イ ンプ<br />
リ メ ン ト さ れる 場 合 にのみ 使 用 で き ます。<br />
XDut_Get_ARg_ack ARG_ack か ら 値 を 読 み 込 みます。 ARG がデバイ スの 入 力 ポー ト で、<br />
ap_hs または ap_vld インターフェイス プ ロ ト コルを 使 用 し て イ ンプ<br />
リ メ ン ト さ れる 場 合 にのみ 使 用 で き ます。<br />
XDut_InterruptGlobalEnable<br />
XDut_InterruptGlobalDisable<br />
XDut_InterruptEnable<br />
XDut_InterruptDisable<br />
XDut_InterruptClear<br />
API 関 数<br />
XDut_InterruptGetEnabled<br />
XDut_InterruptGetStatus<br />
説 明<br />
割 り 込 み 出 力 を イ ネーブルに し ます。 割 り 込 み 関 数 は、ap_start があ<br />
る 場 合 にのみ 使 用 で き ます。<br />
割 り 込 み 出 力 をデ ィ スエーブルに し ます。<br />
割 り 込 みソース を イ ネーブルに し ます。 最 大 で 2 つの 割 り 込 みソー<br />
ス (ap_done には source 0、 ap_ready には source 1) がある 可 能 性 があ<br />
ります。<br />
割 り 込 みソース をデ ィ スエーブルに し ます。<br />
割 り 込 みス テータ ス を ク リ アに し ます。<br />
割 り 込 みソースが イ ネーブルかど う かをチェ ッ ク し ます。<br />
割 り 込 みソースがト リガーされたかど うかをチェッ クします。<br />
高 位 合 成 japan.xilinx.com 416<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
説 明<br />
int XDut_Initialize(XDut *InstancePtr, u16 DeviceId) :スタンドアロン シ ス テムで 使 用 する 場 合 、 デバイ ス を 初 期 化 し ま<br />
す。 こ の API は InstancePtr に 適 切 な 値 を 書 き 出 し ます。 この 後 、 ほかの API で 使 用 でき ます。 こ の API を 呼 び 出 し て<br />
デバイ ス を 初 期 化 する こ と をお 勧 め し ます。 ただし、 MMU がシステムで 使 用 されている と きは、 XDut_CfgInitialize<br />
を 使 用 して く ださい。<br />
int XDut_Initialize(XDut *InstancePtr, const char* InstanceName) :Linux シ ス テムで 使 用 する 場 合 は、 特 別 に 命 名 さ れた uio<br />
デバイ ス を 初 期 化 し ます。 最 大 で 5 メモリ マ ッ プを 作 成 し て、sysfs で uio デバイ ス 情 報 を 使 用 し て mmap でスレーブ<br />
ベース アドレスを 割 り 当 てます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
• DeviceId : xparameters.h で 定 義 されたデバイ ス ID<br />
• InstanceName : uio デバイ スの 名 前<br />
• Return : XST_SUCCESS は 問 題 がなかった こ と を 示 し ます。 それ 以 外 の 場 合 は、 問 題 があ った こ と を 示 し ます。<br />
XDut_CfgInitialize<br />
コード 例<br />
XDut_CfgInitializeint XDut_CfgInitialize(XDut *InstancePtr, XDut_Config *ConfigPtr);<br />
説 明<br />
システムに MMU が 使 用 さ れる と デバイ ス を 初 期 化 し ます。 こ の 場 合 、 AXI4 Lite Slave の 有 効 なア ド レ スが<br />
xparameters.h で 定 義 さ れた も の と 異 な り 、 デバイ ス を 初 期 化 する のに API が 必 要 にな り ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
• DeviceId : XDut_Config へのポイ ン ター<br />
• Return : XST_SUCCESS は 問 題 がなかった こ と を 示 し ます。 それ 以 外 の 場 合 は、 問 題 があ った こ と を 示 し ます。<br />
XDut_LookupConfig<br />
コード 例<br />
XDut_Config* XDut_LookupConfig(u16 DeviceId);<br />
説 明<br />
この 関 数 は、 ID を 指 定 し てデバイ スのコ ン フ ィ ギ ュ レーシ ョ ン 情 報 を 取 得 し ます。<br />
• DeviceId: xparameters.h で 定 義 されたデバイ ス ID<br />
• Return : デバイ ス ID が DeviceId のデバイ スの コ ン フ ィ ギ ュ レーシ ョ ン 情 報 を 保 持 する XDut_LookupConfig 変 数<br />
へのポ イ ン ターです。 一 致 する Deviceid が 見 つから なかった 場 合 は NULL にな り ます。<br />
XDut_Release<br />
コード 例<br />
int XDut_Release(XDut *InstancePtr);<br />
高 位 合 成 japan.xilinx.com 417<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
説 明<br />
uio デバイ ス を リ リ ース し ます。 munmap でマ ッ ピ ングを 削 除 し ます。 プ ロ セスが 終 了 する と 、 マ ッ ピ ン グは 自 動 的 に<br />
削 除 さ れます。<br />
• InstanceName :uio デバイ スの 名 前<br />
• Return :XST_SUCCESS は 問 題 がなかった こ と を 示 し ます。 それ 以 外 の 場 合 は、 問 題 があ った こ と を 示 し ます。<br />
XDut_Start<br />
コード 例<br />
void XDut_Start(XDut *InstancePtr);<br />
説 明<br />
デバイ ス を 起 動 し ます。 こ の 関 数 は、 デバイ スの ap_start ポートをアサートします。 デバイスに ap_start ポー<br />
ト があ る 場 合 にのみ 使 用 で き ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
XDut_IsDone<br />
コード 例<br />
void XDut_IsDone(XDut *InstancePtr);<br />
説 明<br />
デバイ スが 前 の 実 行 を 終 了 し たかど う かをチェ ッ ク し ます。 この 関 数 では、 デバイスの ap_done ポー ト の 値 が 戻 され<br />
ます。 デバイスに ap_done ポー ト があ る 場 合 にのみ 使 用 で き ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
XDut_IsIdle<br />
コード 例<br />
void XDut_IsIdle(XDut *InstancePtr);<br />
説 明<br />
デバイ スがア イ ド ル ステートかどうかをチェックします。 この 関 数 では、 デバイスの ap_idle ポー ト の 値 が 戻 されま<br />
す。 デバイ スに ap_idle ポー ト があ る 場 合 にのみ 使 用 で き ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
XDut_IsReady<br />
コード 例<br />
void XDut_IsReady(XDut *InstancePtr);<br />
説 明<br />
高 位 合 成 japan.xilinx.com 418<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
デバイ スが 次 の 入 力 を 受 信 する 準 備 ができ ているかど う かをチェ ッ ク し ます。 この 関 数 では、 デバイスの ap_ready<br />
ポー ト の 値 が 戻 さ れます。 デバイ スに ap_ready ポー ト があ る 場 合 にのみ 使 用 で き ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
XDut_Continue<br />
コード 例<br />
void XExample_Continue(XExample *InstancePtr);<br />
説 明<br />
ap_continue ポートをアサートします。 デバイスに ap_continue ポー ト があ る 場 合 にのみ 使 用 で き ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
XDut_EnableAutoRestart<br />
コード 例<br />
void XDut_EnableAutoRestart(XDut *InstancePtr);<br />
説 明<br />
デバイ スでの 自 動 再 開 を イ ネーブルに し ます。 イ ネーブルの 場 合 は、 次 が 実 行 さ れます。<br />
• ap_done がデバイ スによ り アサー ト される と、 すぐに ap_start ポー ト をアサー ト し ます。 デバイ スは、 次 の ト ラ ン<br />
ザ ク シ ョ ン を 自 動 的 に 開 始 し ます。<br />
• または、 ブロック レベルの I/O プロ ト コル ap_ctrl_chain がデバイ スにイ ンプ リ メ ン ト される と、 ap_ready がデバ<br />
イ スに よ り アサー ト さ れる 場 合 、および ap_done がデバイ スによ り アサー ト されて ap_continue がアサー ト された<br />
場 合 に、 その 次 の ト ラ ンザ ク シ ョ ンが 自 動 的 に 再 開 さ れ (ap_start がアサート され) ます。<br />
デバイ スに ap_start ポー ト があ る 場 合 にのみ 使 用 でき ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
XDut_DisableAutoRestart<br />
コード 例<br />
void XDut_DisableAutoRestart(XDut *InstancePtr);<br />
説 明<br />
自 動 再 開 をデ ィ スエーブルに し ます。 デバイ スに ap_start ポー ト があ る 場 合 にのみ 使 用 で き ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
XDut_Set_ARG<br />
コード 例<br />
void XDut_Set_ARG(XDut *InstancePtr, u32 Data);<br />
説 明<br />
高 位 合 成 japan.xilinx.com 419<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ARG ポー ト に 値 ( 最 上 位 関 数 のス カ ラー 引 数 ) を 書 き 出 し ます。 ARG が 入 力 ポー ト の 場 合 にのみ 使 用 でき ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
• Data : 書 き 出 される 値<br />
XDut_Set_ARG_vld<br />
コード 例<br />
void XDut_Set_ARG_vld(XDut *InstancePtr);<br />
説 明<br />
ARG_vld ポー ト をアサー ト し ます。 ARG が 入 力 ポー ト で、 ap_hs または ap_vld インターフェイス プロ ト コルを 使 用<br />
し て イ ンプ リ メ ン ト さ れる 場 合 にのみ 使 用 で き ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
XDut_Set_ARG_ack<br />
コード 例<br />
void XDut_Set_ARG_ack(XDut *InstancePtr);<br />
説 明<br />
ARG_ack ポー ト をアサー ト し ます。 ARG が 出 力 ポー ト で、 ap_hs または ap_ackインターフェイス プロ ト コルを 使 用<br />
し て イ ンプ リ メ ン ト さ れる 場 合 にのみ 使 用 で き ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
XDut_Get_ARG<br />
コード 例<br />
u32 XDut_Get_ARG(XDut *InstancePtr);<br />
説 明<br />
ARG か ら 値 を 読 み 込 みます。 ARG ポー ト がデバイ スの 出 力 ポー ト の 場 合 にのみ 使 用 でき ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
戻 り 値 : ARG の 値<br />
XDut_Get_ARG_vld<br />
コード 例<br />
u32 XDut_Get_ARG_vld(XDut *InstancePtr);<br />
説 明<br />
ARG_vld か ら 値 を 読 み 込 みます。 ARG がデバイ スの 出 力 ポー ト で、 ap_hs または ap_vld インターフェイス プロ ト コ<br />
ルを 使 用 し て イ ンプ リ メ ン ト さ れる 場 合 にのみ 使 用 で き ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
高 位 合 成 japan.xilinx.com 420<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
戻 り 値 :ARG_vld の 値<br />
XDut_Get_ARG_ack<br />
コード 例<br />
u32 XDut_Get_ARG_ack(XDut *InstancePtr);<br />
説 明<br />
ARG_ack か ら 値 を 読 み 込 みます。 ARG ポー ト がデバイ スの 入 力 ポー ト で、 ap_hs または ap_vld インターフェイス プ<br />
ロ ト コルを 使 用 し て イ ンプ リ メ ン ト さ れる 場 合 にのみ 使 用 で き ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
戻 り 値 : ARG_ack の 値<br />
XDut_InterruptGlobalEnable<br />
コード 例<br />
void XDut_InterruptGlobalEnable(XDut *InstancePtr);<br />
説 明<br />
割 り 込 み 出 力 を イ ネーブルに し ます。 割 り 込 み 関 数 は、 ap_start があ る 場 合 にのみ 使 用 で き ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
XDut_InterruptGlobalDisable<br />
コード 例<br />
void XDut_InterruptGlobalDisable(XDut *InstancePtr);<br />
説 明<br />
割 り 込 み 出 力 をデ ィ スエーブルに し ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
XDut_InterruptEnable<br />
コード 例<br />
void XDut_InterruptEnable(XDut *InstancePtr, u32 Mask);<br />
説 明<br />
割 り 込 み ソース を イ ネーブルに し ます。 最 大 で 2 つの 割 り 込 みソース (ap_done には source 0、 ap_ready には source 1)<br />
があ る 可 能 性 があ り ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
• マスク : ビッ ト マスク<br />
° ビッ ト n = 1 : 割 り 込 み ソース n をイネーブル<br />
高 位 合 成 japan.xilinx.com 421<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
° ビッ ト n = 0 : 変 更 な し<br />
XDut_InterruptDisable<br />
コード 例<br />
void XDut_InterruptDisable(XDut *InstancePtr, u32 Mask);<br />
説 明<br />
割 り 込 み ソース をデ ィ スエーブルに し ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
• マスク : ビッ ト マスク<br />
° ビッ ト n = 1 : 割 り 込 み ソース n をディ スエーブル<br />
° ビッ ト n = 0 : 変 更 な し<br />
XDut_InterruptClear<br />
コード 例<br />
void XDut_InterruptClear(XDut *InstancePtr, u32 Mask);<br />
説 明<br />
割 り 込 みス テータ ス を ク リ アに し ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
• マスク : ビッ ト マスク<br />
° ビッ ト n = 1 : 割 り 込 みス テータ ス n をトグル<br />
° ビッ ト n = 0 : 変 更 な し<br />
XDut_InterruptGetEnabled<br />
コード 例<br />
u32 XDut_InterruptGetEnabled(XDut *InstancePtr);<br />
説 明<br />
割 り 込 み ソースが イ ネーブルかど う かをチェ ッ ク し ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
• 戻 り 値 : ビッ ト マスク<br />
° ビッ ト n = 1 : イネーブル<br />
° ビッ ト n = 0 : ディスエーブル<br />
高 位 合 成 japan.xilinx.com 422<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
XDut_InterruptGetStatus<br />
コード 例<br />
u32 XDut_InterruptGetStatus(XDut *InstancePtr);<br />
説 明<br />
割 り 込 み ソースが ト リ ガー さ れたかど う かをチェ ッ ク し ます。<br />
• InstancePtr : デバイ ス インスタンスへのポインター<br />
• 戻 り 値 : ビッ ト マスク<br />
° ビッ ト n = 1 : トリガーあり<br />
° ビッ ト n = 0 : トリガーなし<br />
ビデオ 関 数 のリ フ ァレンス<br />
このセクショ ンでは、 Vivado HLS の video 関 数 について 説 明 し ます。<br />
• OpenCV インターフェイス 関 数<br />
標 準 OpenCV データ 型 にデータを 変 換 したり、 標 準 OpenCV データ 型 か ら AXI4 ス トリーミング プロ ト コルに 変<br />
換 したり します。<br />
• AXI4-Stream I/O 関 数<br />
AXI4 ス トリーミング プロ ト コルをビデオ プ ロ セ ッ シン グ 関 数 で 使 用 さ れる hsl::Mat データ 型 に 変 換 で き ます。<br />
• ビデオ プロセッシング 関 数<br />
ビデオ 画 像 を 操 作 する ための 標 準 OpenCV 関 数 と 互 換 性 があ り ます。<br />
既 存 OpenCV の コ ンテキ ス ト でビデオ 関 数 の 詳 細 および 手 法 については、 アプ リ ケーシ ョ ン ノート 『Accelerating<br />
OpenCV Applications with Zynq using Vivado HLS Video Libraries』 (XAPP1167) を 参 照 して ください。<br />
OpenCV インターフェイス 関 数<br />
高 位 合 成 japan.xilinx.com 423<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
IplImage2AXIvideo<br />
コード 例<br />
template void IplImage2AXIvideo (<br />
IplImage* img,<br />
hls::stream& AXI_video_strm);<br />
パラ メーター<br />
表 4‐2:パラ メーター<br />
パラ メーター<br />
説 明<br />
img OpenCV IplImage 形 式 の 入 力 画 像 ヘ ッ ダー<br />
AXI_video_strm<br />
説 明<br />
hls::stream 形 式 (AXI4-Stream プロ ト コルと 互 換 性 あり)<br />
の 出 力 AXI ビデオ ス トリーム<br />
• OpenCV の IplImage 形 式 か ら のデータ を AXI ビデオ ストリーム (hls::stream) 形 式 に 変 換 し ます。<br />
• 画 像 データ は img に 格 納 する 必 要 があ り ます。<br />
• AXI_video_strm は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• img のピクセルのデータ 幅 (ビッ ト) は W (AXI4-Stream プロ ト コルの TDATA のデータ 幅 ) 未 満 にする 必 要 があ り<br />
ます。<br />
高 位 合 成 japan.xilinx.com 424<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
AXIvideo2IplImage<br />
コード 例<br />
template void AXIvideo2IplImage (<br />
hls::stream& AXI_video_strm,<br />
IplImage* img);<br />
パラ メーター<br />
表 4‐3:パラ メーター<br />
パラ メーター<br />
AXI_video_strm<br />
hls::stream 形 式 (AXI4-Stream プロ ト コルと 互 換 性 あり)<br />
の 入 力 AXI ビデオ ストリーム<br />
img OpenCV IplImage 形 式 の 出 力 画 像 ヘ ッ ダー<br />
説 明<br />
説 明<br />
• AXI ビデオ ストリーム (hls::stream) 形 式 か らデータ を OpenCV の IplImage 形 式 に 変 換 し ます。<br />
• 画 像 データ は AXI_video_strm に 格 納 する 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 AXI_video_strm のデータが 消 費 されます。<br />
• img のピ ク セルのデータ 幅 は W (AXI4-Stream プロ ト コルの TDATA のデータ 幅 ) 未 満 にする 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 425<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
cvMat2AXIvideo<br />
コード 例<br />
template void cvMat2AXIvideo (<br />
cv::Mat& cv_mat,<br />
hls::stream& AXI_video_strm);<br />
パラ メーター<br />
表 4‐4:パラ メーター<br />
cv_mat<br />
AXI_video_strm<br />
パラ メーター<br />
説 明<br />
OpenCV cv::Mat 形 式 の 入 力 画 像<br />
hls::stream 形 式 (AXI4-Stream プロ ト コルと 互 換 性 あり)<br />
の 出 力 AXI ビデオ ス トリーム<br />
説 明<br />
• OpenCV の cv::Mat 形 式 か ら のデータ を AXI ビデオ ストリーム (hls::stream) 形 式 に 変 換 し ます。<br />
• 画 像 データ は cv_mat に 格 納 する 必 要 があ り ます。<br />
• AXI_video_strm は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• cv_mat のピクセルのデータ 幅 (ビット) は W (AXI4-Stream プロ ト コルの TDATA のデータ 幅 ) 未 満 にする 必 要 が<br />
あります。<br />
高 位 合 成 japan.xilinx.com 426<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
AXIvideo2cvMat<br />
コード 例<br />
template void AXIvideo2cvMat (<br />
hls::stream& AXI_video_strm,<br />
cv::Mat& cv_mat);<br />
パラ メーター<br />
• AXI ビデオ ストリーム (hls::stream) 形 式 か らデータ を OpenCV の cv::Mat 形 式 に 変 換 し ます。<br />
• 画 像 データ は AXI_video_strm に 格 納 する 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 AXI_video_strm のデータが 消 費 されます。<br />
• cv_mat のピ ク セルのデータ 幅 は W (AXI4-Stream プロ ト コルの TDATA のデータ 幅 ) 未 満 にする 必 要 があ り ます。<br />
説 明<br />
• OpenCV の cv::Mat 形 式 か ら のデータ を AXI ビデオ ストリーム (hls::stream) 形 式 に 変 換 し ます。<br />
• 画 像 データ は cv_mat に 格 納 する 必 要 があ り ます。<br />
• AXI_video_strm は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• cv_mat のピクセルのデータ 幅 (ビット) は W (AXI4-Stream プロ ト コルの TDATA のデータ 幅 ) 未 満 にする 必 要 が<br />
あります。<br />
高 位 合 成 japan.xilinx.com 427<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
CvMat2AXIvideo<br />
コード 例<br />
template void CvMat2AXIvideo (<br />
CvMat* cvmat,<br />
hls::stream& AXI_video_strm);<br />
パラ メーター<br />
表 4‐5:パラ メーター<br />
パラ メーター<br />
説 明<br />
cvmat OpenCV の CvMat 形 式 への 入 力 画 像 ポ イ ン ター<br />
AXI_video_strm<br />
説 明<br />
hls::stream 形 式 (AXI4-Stream プロ ト コルと 互 換 性 あり)<br />
の 出 力 AXI ビデオ ス トリーム<br />
• OpenCV の CvMat 形 式 か ら のデータ を AXI ビデオ ストリーム (hls::stream) 形 式 に 変 換 し ます。<br />
• 画 像 データ は cvmat に 格 納 する 必 要 があ り ます。<br />
• AXI_video_strm は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• cvmat のピクセルのデータ 幅 (ビッ ト) は W (AXI4-Stream プロ ト コルの TDATA のデータ 幅 ) 未 満 にする 必 要 があ<br />
ります。<br />
高 位 合 成 japan.xilinx.com 428<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
AXIvideo2CvMat<br />
コード 例<br />
template void AXIvideo2CvMat (<br />
hls::stream& AXI_video_strm,<br />
CvMat* cvmat);<br />
パラ メーター<br />
表 4‐6:パラ メーター<br />
パラ メーター<br />
AXI_video_strm<br />
hls::stream 形 式 (AXI4-Stream プロ ト コルと 互 換 性 あり)<br />
の 入 力 AXI ビデオ ストリーム<br />
cvmat OpenCV の CvMat 形 式 への 出 力 画 像 ポ イ ン ター<br />
説 明<br />
説 明<br />
• AXI ビデオ ストリーム (hls::stream) 形 式 か らデータ を OpenCV の CvMat 形 式 に 変 換 し ます。<br />
• 画 像 データ は AXI_video_strm に 格 納 する 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 AXI_video_strm のデータが 消 費 されます。<br />
• cvmat のピ ク セルのデータ 幅 は W (AXI4-Stream プロ ト コルの TDATA のデータ 幅 ) 未 満 にする 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 429<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
IplImage2hlsMat<br />
コード 例<br />
template void IplImage2hlsMat (<br />
IplImage* img,<br />
hls::Mat& mat);<br />
パラ メーター<br />
表 4‐7:パラ メーター<br />
パラ メーター<br />
説 明<br />
img OpenCV の IplImage 形 式 の 入 力 画 像 ヘ ッ ダー<br />
mat<br />
説 明<br />
hls::Mat 形 式 の 出 力 画 像<br />
• OpenCV の IplImage 形 式 か ら のデータ を hls::Mat 形 式 に 変 換 し ます。<br />
• 画 像 データ は img に 格 納 する 必 要 があ り ます。<br />
• mat は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• 引 数 img および mat は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 430<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hlsMat2IplImage<br />
コード 例<br />
template void hlsMat2IplImage (<br />
hls::Mat& mat,<br />
IplImage* img);<br />
パラ メーター<br />
表 4‐8:パラ メーター<br />
パラ メーター<br />
mat<br />
hls::Mat 形 式 の 入 力 画 像<br />
img OpenCV の IplImage 形 式 の 出 力 画 像 ヘ ッ ダー<br />
説 明<br />
説 明<br />
• hls::Mat 形 式 か ら のデータ を OpenCV の IplImage 形 式 に 変 換 し ます。<br />
• 画 像 データ は mat に 格 納 する 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 mat のデータが 消 費 されます。<br />
• 引 数 mat および img は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 431<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
cvMat2hlsMat<br />
コード 例<br />
template void cvMat2hlsMat (<br />
cv::Mat* cv_mat,<br />
hls::Mat& mat);<br />
パラ メーター<br />
表 4‐9:パラ メーター<br />
cv_mat<br />
mat<br />
パラ メーター<br />
説 明<br />
OpenCV cv::Mat 形 式 の 入 力 画 像<br />
hls::Mat 形 式 の 出 力 画 像<br />
説 明<br />
• OpenCV の cv::Mat 形 式 か ら のデータ を hls::Mat 形 式 に 変 換 し ます。<br />
• 画 像 データ は cv_mat に 格 納 する 必 要 があ り ます。<br />
• mat は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• 引 数 cv_mat および mat は、 同 じ サ イ ズおよびチ ャ ネル 数 であ る 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 432<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hlsMat2cvMat<br />
コード 例<br />
template void hlsMat2cvMat (<br />
hls::Mat& mat,<br />
cv::Mat& cv_mat);<br />
パラ メーター<br />
表 4‐10 : パラ メーター<br />
mat<br />
cv_mat<br />
パラ メーター<br />
hls::Mat 形 式 の 入 力 画 像<br />
説 明<br />
OpenCV cv::Mat 形 式 の 出 力 画 像<br />
説 明<br />
• hls::Mat 形 式 か ら のデータ を OpenCV の cv::Mat 形 式 に 変 換 し ます。<br />
• 画 像 データ は mat に 格 納 する 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 mat のデータが 消 費 されます。<br />
• 引 数 mat および cv_mat は、 同 じ サ イ ズおよびチ ャ ネル 数 であ る 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 433<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
CvMat2hlsMat<br />
コード 例<br />
template void CvMat2hlsMat (<br />
CvMat* cvmat,<br />
hls::Mat& mat);<br />
パラ メーター<br />
表 4‐11 : パラ メーター<br />
パラ メーター<br />
説 明<br />
cvmat OpenCV の CvMat 形 式 への 入 力 画 像 ポ イ ン ター<br />
mat<br />
説 明<br />
hls::Mat 形 式 の 出 力 画 像<br />
• OpenCV の CvMat 形 式 か ら のデータ を hls::Mat 形 式 に 変 換 し ます。<br />
• 画 像 データ は cvmat に 格 納 する 必 要 があ り ます。<br />
• mat は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• 引 数 cvmat および mat は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 434<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hlsMat2CvMat<br />
コード 例<br />
template void hlsMat2CvMat (<br />
hls::Mat& mat,<br />
CvMat* cvmat);<br />
パラ メーター<br />
表 4‐12 : パラ メーター<br />
パラ メーター<br />
mat<br />
hls::Mat 形 式 の 入 力 画 像<br />
cvmat OpenCV cv::Mat 形 式 の 出 力 画 像 ポ イ ン ター<br />
説 明<br />
説 明<br />
• hls::Mat 形 式 か ら のデータ を OpenCV の CvMat 形 式 に 変 換 し ます。<br />
• 画 像 データ は mat に 格 納 する 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 mat のデータが 消 費 されます。<br />
• 引 数 mat および cvmat は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 435<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
CvMat2hlsWindow<br />
コード 例<br />
template void CvMat2hlsWindow (<br />
CvMat* cvmat,<br />
hls::Window& window);<br />
パラ メーター<br />
表 4‐13 : パラ メーター<br />
cvmat<br />
window<br />
パラ メーター<br />
説 明<br />
OpenCV の CvMat 形 式 への 入 力 2D ウ ィンドウ<br />
hls::Window 形 式 の 出 力 2D ウ ィンドウ<br />
説 明<br />
• OpenCV の CvMat 形 式 か ら のデータ を hls::Window 形 式 に 変 換 し ます。<br />
• 画 像 データ は cvmat に 格 納 する 必 要 があ り ます。<br />
• window は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• 引 数 cvmat および window はシングルチャネルで、 同 じサイズである 必 要 があります。 この 関 数 は、 主 に 画 像 プ<br />
ロセッシング カーネルを 変 換 する ために 使 用 し ます。<br />
高 位 合 成 japan.xilinx.com 436<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hlsWindow2CvMat<br />
コード 例<br />
template void hlsWindow2hlsCvMat (<br />
hls::Window& window,<br />
CvMat* cvmat);<br />
パラ メーター<br />
表 4‐14 : パラ メーター<br />
window<br />
cvmat<br />
パラ メーター<br />
説 明<br />
hls::Window 形 式 の 入 力 2D ウ ィンドウ<br />
OpenCV の CvMat 形 式 への 出 力 2D ウィンドウ ポイン<br />
ター<br />
説 明<br />
• hls::Window 形 式 か ら のデータ を OpenCV の CvMat 形 式 に 変 換 し ます。<br />
• 画 像 データ は window に 格 納 する 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 window のデータが 消 費 されます。<br />
• 引 数 mat および window はシングルチャネルで、 同 じサイズである 必 要 があります。 この 関 数 は、 主 に 画 像 プロ<br />
セッシング カーネルを 変 換 する ために 使 用 し ます。<br />
高 位 合 成 japan.xilinx.com 437<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
AXI4‐Stream I/O 関 数<br />
hls::AXIvideo2Mat<br />
コード 例<br />
template int hls::AXIvideo2Mat (<br />
hls::stream& AXI_video_strm,<br />
hls::Mat& mat);<br />
パラ メーター<br />
表 4‐15 : パラ メーター<br />
AXI_video_strm<br />
mat<br />
パラ メーター<br />
説 明<br />
hls::stream 形 式 (AXI4-Stream プロ ト コルと 互 換 性 あり)<br />
の 入 力 AXI ビデオ ス トリーム<br />
hls::Mat 形 式 の 出 力 画 像<br />
説 明<br />
• hls::Mat 形 式 と し て 格 納 さ れた 画 像 データ を AXI4 ビデオ ストリーム 形 式 (hls::stream) に 変 換 し ます。<br />
• 画 像 データ は AXI_video_strm に 格 納 する 必 要 があ り ます。<br />
• mat のデータ フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 AXI_video_strm のデータが 消 費 され、 mat の 画 像 データ が 満 た さ れます。<br />
• mat のピ ク セルのデータ 幅 は W (AXI4-Stream プロ ト コルの TDATA のデータ 幅 ) 未 満 にする 必 要 があ り ます。<br />
• こ の 関 数 を 使 用 する と 、 TUSER ビ ッ ト が 検 出 さ れて 入 力 フ レームの 左 上 のピ ク セルがマー ク さ れ、 入 力 ビデオ<br />
スト リームのフレーム 同 期 が 実 行 できるようになります。TLAST 入 力 を 検 出 する こ と で、 予 測 さ れない ラ イ ン<br />
長 を 示 す ERROR_IO_EOL_EARLY または ERROR_IO_EOL_LATE といったビッ ト エラーが 戻 されます。<br />
高 位 合 成 japan.xilinx.com 438<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Mat2AXIvideo<br />
コード 例<br />
template int hls::AXIvideo2Mat (<br />
hls::Mat& mat,<br />
hls::stream& AXI_video_strm);<br />
パラ メーター<br />
表 4‐16 : パラ メーター<br />
mat<br />
AXI_video_strm<br />
パラ メーター<br />
hls::Mat 形 式 の 入 力 画 像<br />
説 明<br />
hls::stream 形 式 (AXI4-Stream プロ ト コルと 互 換 性 あり)<br />
の 出 力 AXI ビデオ ス トリーム<br />
説 明<br />
• AXI4 ビデオ ストリーム (hls::stream) 形 式 で 格 納 さ れた 画 像 データ を hls::Mat 形 式 の 画 像 に 変 換 し ます。<br />
• 画 像 データ は mat に 格 納 する 必 要 があ り ます。<br />
• AXI_video_strm のデータ フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 mat のデータが 消 費 され、 AXI_video_strm の 画 像 データ が 満 た さ れます。<br />
• mat のピ ク セルのデータ 幅 は W (AXI4-Stream プロ ト コルの TDATA のデータ 幅 ) 未 満 にする 必 要 があ り ます。<br />
• こ の 関 数 では、 AXI ビデオ ス ト リ ームに 画 像 データ を 満 たすために、 左 上 のピ ク セルを 示 すス ト リ ーム エレ メ<br />
ントの TUSER ビ ッ ト を 設 定 し た り 、 行 末 を 示 す 各 行 の 最 後 のピ ク セルに TLAST ビットを 設 定 したりもされま<br />
す。<br />
高 位 合 成 japan.xilinx.com 439<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ビデオ プロセッシング 関 数<br />
hls::AbsDiff<br />
コード 例<br />
template<br />
void hls::AbsDiff (<br />
hls::Mat& src1,<br />
hls::Mat& src2,<br />
hls::Mat& dst);<br />
パラ メーター<br />
表 4‐17 : パラ メーター<br />
src1<br />
src2<br />
dst<br />
パラ メーター<br />
1 つ 目 の 入 力 画 像<br />
2 つ 目 の 入 力 画 像<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 2 つの 入 力 画 像 、 src1 および src2 間 の 絶 対 的 な 違 いを 計 算 し て、 結 果 を dst に 保 存 し ます。<br />
• 画 像 データ は src1 および src2 に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src1 および src2 のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src1 および src2 は、 同 じ サ イ ズおよびチ ャ ネル 数 であ る 必 要 があ り ます。<br />
• dst は、 入 力 と 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvAbsDiff<br />
• cv::absdiff<br />
高 位 合 成 japan.xilinx.com 440<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::AddS<br />
コード 例<br />
mask なし<br />
template<br />
void hls::AddS (<br />
hls::Mat& src,<br />
hls::Scalar& scl,<br />
hls::Mat& dst);<br />
mask あり<br />
template<br />
void hls::AddS (<br />
hls::Mat& src,<br />
hls::Scalar& scl,<br />
hls::Mat& dst,<br />
hls::Mat& mask,<br />
hls::Mat& dst_ref);<br />
パラ メーター<br />
表 4‐18 : パラ メーター<br />
src<br />
説 明<br />
• エレ メン ト ごとの 画 像 src およびスカラー scl の 合 計 を 計 算 し ます。<br />
• その 結 果 を dst に 保 存 し ます。<br />
• mask ありで 計 算 した 場 合 :<br />
• 画 像 データ は src に 格 納 し (mask を 使 用 して 計 算 した 場 合 、 mask と dst_ref にはデータ が 格 納 さ れてい る 必 要 あ<br />
り )、 dst の 画 像 データは 起 動 前 に 空 にする 必 要 があ り ます。<br />
• こ の 関 数 を 開 始 する と 、 src のデータが 消 費 され (mask を 使 用 して 計 算 した 場 合 、mask と dst_ref のデータ も 消 費<br />
される)、 dst の 画 像 データ が 満 た さ れます。<br />
• src および s c l のチャ ネル 数 は 同 じ であ る 必 要 があ り ます。 dst_ref のサイズおよびチャネル 数 は src と 同 じであ<br />
る 必 要 があ り ます。 mask は src と 同 じサイズである 必 要 があります。<br />
OpenCV リファレンス<br />
• cvAddS<br />
• cv::add<br />
パラ メーター<br />
入 力 画 像<br />
scl 入 力 ス カ ラー<br />
dst<br />
mask<br />
dst_ref<br />
出 力 画 像<br />
説 明<br />
演 算 mask は 計 測 される dst 画 像 のエレ メ ン ト を 指 定 す<br />
る 8 ビッ ト チャネルの 画 像<br />
mask(I) = 0 の 場 合 の 出 力 画 像 のエレ メ ン ト を 格 納 する リ<br />
ファレンス 画 像<br />
高 位 合 成 japan.xilinx.com 441<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::AddWeighted<br />
コード 例<br />
template<br />
void hls::AddWeighted (<br />
hls::Mat& src1,<br />
P_T alpha,<br />
hls::Mat& src2,<br />
P_T beta,<br />
P_T gamma,<br />
hls::Mat& dst);<br />
パラ メーター<br />
表 4‐19 : パラ メーター<br />
src1<br />
alpha<br />
src2<br />
説 明<br />
パラ メーター<br />
1 つ 目 の 入 力 画 像<br />
1 つ 目 の 画 像 エレ メ ン ト の 重 み<br />
2 つ 目 の 入 力 画 像<br />
beta<br />
2 つ 目 の 画 像 エレ メ ン ト の 重 み<br />
gamma 各 合 計 に 追 加 さ れる ス カ ラー<br />
dst<br />
出 力 画 像<br />
• 2 つの 画 像 src1 と src2 の 重 み 付 き のエレ メ ン ト ご と に 合 計 を 計 算 し ます。<br />
• その 結 果 を dst に 保 存 し ます。<br />
• 重 み 付 き の 合 計 は、 次 の よ う に 計 算 さ れます。<br />
説 明<br />
• 画 像 データ は src1 および src2 に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src1 および src2 のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• 3 つのパラ メ ーター、 alpha、 beta、 gamma のデータ 型 は 同 じであ る 必 要 があ り ます。<br />
• src1 および src2 は、 同 じ サ イ ズおよびチ ャ ネル 数 であ る 必 要 があ り ます。<br />
• dst は、 入 力 と 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvAddWeighted<br />
• cv::addWeighted<br />
高 位 合 成 japan.xilinx.com 442<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::And<br />
コード 例<br />
mask なし<br />
template<br />
void hls::And (<br />
hls::Mat& src1,<br />
hls::Mat& src2,<br />
hls::Mat& dst);<br />
mask あり<br />
template<br />
void hls::And (<br />
hls::Mat& src1,<br />
hls::Mat& src2,<br />
hls::Mat& dst,<br />
hls::Mat& mask,<br />
hls::Mat& dst_ref);<br />
パラ メーター<br />
表 4‐20 : パラ メーター<br />
src1<br />
説 明<br />
パラ メーター<br />
1 つ 目 の 入 力 画 像<br />
src2 2 つ 目 の 入 力 ス カ ラー<br />
dst<br />
mask<br />
dst_ref<br />
出 力 画 像<br />
• 2 つの 画 像 、 src1 および src2 のビ ッ ト の 論 理 積 をエレ メ ン ト ご と に 計 算 し ます。<br />
• 結 果 を 画 像 dst として 戻 します。<br />
• mask ありで 計 算 した 場 合 :<br />
説 明<br />
演 算 mask は 計 測 される dst 画 像 のエレ メ ン ト を 指 定 する 8 ビッ<br />
ト チャネルの 画 像<br />
mask(I) = 0 の 場 合 の 出 力 画 像 のエレ メ ン ト を 格 納 する リ フ ァ レ<br />
ンス 画 像<br />
• 画 像 データ は src1 および src2 に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• mask を 使 用 して 計 算 した 場 合 、 mask と dst_ref にはデータ が 格 納 さ れてい る 必 要 あ り ます。<br />
• こ の 関 数 を 開 始 する と 、 次 の よ う にな り ます。<br />
° src1 および src2 のデータが 消 費 されます。<br />
注 記 : mask を 使 用 して 計 算 された 場 合 は、 mask および dst_ref のデータ も 消 費 されます。<br />
° dst の 画 像 データ が 満 た さ れます。<br />
• src1 および src2 は、 同 じ サ イ ズおよびチ ャ ネル 数 であ る 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 443<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• dst および dst_ref は、 入 力 と 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
• mask は 入 力 と 同 じ サ イ ズであ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvAnd,<br />
• cv::bitwise_and<br />
高 位 合 成 japan.xilinx.com 444<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Avg<br />
コード 例<br />
mask なし<br />
template<br />
hls::Scalar hls::Avg(<br />
hls::Mat& src);<br />
mask あり<br />
template<br />
hls::Scalar hls::Avg(<br />
hls::Mat& src,<br />
hls::Mat& mask);<br />
パラ メーター<br />
表 4‐21 : パラ メーター<br />
src<br />
mask<br />
パラ メーター<br />
入 力 画 像<br />
説 明<br />
演 算 mask は 計 測 される src 画 像 のエレ メ ン ト を 指 定 する 8 ビッ<br />
ト チャネルの 画 像<br />
説 明<br />
• 画 像 src のエレ メ ン ト の 平 均 を 計 算 し ます。<br />
• 結 果 を hls::Scalar 形 式 で 戻 し ます。<br />
• mask ありで 計 算 した 場 合 :<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• mask を 使 用 し て 計 算 する 場 合 、 mask にデータ が 格 納 さ れてい る 必 要 あ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 されます。<br />
• mask を 使 用 し て 計 算 する 場 合 、 mask のデータ も 消 費 されます。<br />
• src および mask は 同 じサイ ズであ る 必 要 があ り ます。<br />
• mask には 0 以 外 のエレ メ ン ト が 含 まれる 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvAvg<br />
• cv::mean<br />
高 位 合 成 japan.xilinx.com 445<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::AvgSdv<br />
コード 例<br />
mask なし<br />
template<br />
void hls::AvgSdv(<br />
hls::Mat& src,<br />
hls::Scalar& avg,<br />
hls::Scalar& sdv);<br />
mask あり<br />
template<br />
void hls::AvgSdv(<br />
hls::Mat& src,<br />
hls::Scalar& avg,<br />
hls::Scalar& sdv,<br />
hls::Mat& mask);<br />
パラ メーター<br />
表 4‐22 : パラ メーター<br />
パラ メーター<br />
src<br />
入 力 画 像<br />
avg 計 算 し た 中 間 値 の 出 力 ス カ ラー<br />
sdv 計 算 し た 標 準 的 な 偏 差 値 の 出 力 ス カ ラー<br />
説 明<br />
mask<br />
演 算 mask は 計 測 される src 画 像 のエレ メ ン ト を 指 定 する 8 ビッ<br />
ト チャネルの 画 像<br />
説 明<br />
• 画 像 src のエレ メ ン ト の 平 均 を 計 算 し ます。<br />
• 結 果 を hls::Scalar 形 式 で 戻 し ます。<br />
• mask ありで 計 算 した 場 合 :<br />
X-Ref Target - Figure 4-15<br />
図 4‐15 : Ehls::AvgSdv 演 算<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• mask を 使 用 し て 計 算 する 場 合 、 mask にデータ が 格 納 さ れてい る 必 要 あ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 されます。<br />
• mask を 使 用 し て 計 算 する 場 合 、 mask のデータ も 消 費 されます。<br />
• 引 数 src および mask は 同 じサイ ズであ る 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 446<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• mask には 0 以 外 のエレ メ ン ト が 含 まれる 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvAvgSdv<br />
• cv::meanStdDev<br />
高 位 合 成 japan.xilinx.com 447<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Cmp<br />
コード 例<br />
template<br />
void hls::Cmp (<br />
hls::Mat& src1,<br />
hls::Mat& src2,<br />
hls::Mat& dst,<br />
int cmp_op);<br />
パラ メーター<br />
表 4‐23 : パラ メーター<br />
src1<br />
src2<br />
dst<br />
cmp_op<br />
説 明<br />
パラ メーター<br />
HLS_CMP_EQ 等 号 (=)<br />
1 つ 目 の 入 力 画 像<br />
2 つ 目 の 入 力 画 像<br />
HLS_CMP_GT 大 な り (>)<br />
HLS_CMP_GE<br />
• 2 つの 入 力 画 像 、 src1 と src2 のエレ メ ン ト ご と の 比 較 を 実 行 し ます。<br />
• その 結 果 を dst に 保 存 し ます。<br />
説 明<br />
8 ビッ ト 出 力 のシングルチャネル 画 像<br />
チェ ッ ク さ れる エレ メ ン ト 間 の 関 係 を 指 定 する フ ラ グ<br />
大 な り イ コール (≧)<br />
HLS_CMP_LT 小 な り (
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::CmpS<br />
コード 例<br />
template<br />
void hls::CmpS (<br />
hls::Mat& src,<br />
P_T 値<br />
hls::Mat& dst,<br />
int cmp_op);<br />
パラ メーター<br />
表 4‐24 : パラ メーター<br />
src<br />
value<br />
dst<br />
cmp_op<br />
HLS_CMP_EQ<br />
HLS_CMP_GT<br />
HLS_CMP_GE<br />
HLS_CMP_LT<br />
HLS_CMP_LE<br />
HLS_CMP_NE<br />
パラ メーター<br />
説 明<br />
入 力 画 像<br />
入 力 ス カ ラー 値<br />
出 力 8 ビッ トのシングルチャネル 画 像<br />
チェ ッ ク さ れる エレ メ ン ト 間 の 関 係 を 指 定 する フ ラ グ<br />
等 号<br />
大 な り<br />
大 な り イ コール<br />
小 な り<br />
小 な り イ コール (≦)<br />
不 等 号<br />
説 明<br />
• 入 力 画 像 src のエレ メ ン ト と 入 力 値 の 比 較 を 実 行 し、 結 果 を dst に 保 存 し ます。<br />
• 比 較 結 果 が true であれば、 dst の 該 当 エレ メ ン ト が 255 に、 それ 以 外 の 場 合 は 0 に 設 定 されます。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および dst は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvCmpS<br />
• cv::compare<br />
高 位 合 成 japan.xilinx.com 449<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::CornerHarris<br />
コード 例<br />
template<br />
void CornerHarris(<br />
hls::Mat &_src,<br />
hls::Mat &_dst,<br />
KT k);<br />
パラ メーター<br />
表 4‐25 : パラ メーター<br />
src<br />
dst<br />
k<br />
borderType<br />
パラ メーター<br />
説 明<br />
入 力 画 像<br />
検 出 さ れた コーナーの 出 力 マス ク<br />
Harris 検 出 器 パ ラ メ ーター<br />
ボーダーの 処 理 方 法<br />
説 明<br />
• この 関 数 は、 Harris エッジ/コーナー 検 出 器 を イ ンプ リ メ ン ト し ます。 水 平 方 向 および 垂 直 方 向 の 導 関 数 が<br />
Ksize*Ksize Sobel フ ィ ルターを 使 用 し て 概 算 さ れます。 導 関 数 の ローカルの 共 分 散 行 列 M は、 各 ピ ク セル (x,y)<br />
の blockSize*blockSize 近 傍 に 収 め ら れます。 こ の 関 数 は、 関 数 を 出 力 し ます。<br />
• Ksize=3 のみがサポー ト されます。<br />
OpenCV リファレンス<br />
• cvCornerHarris<br />
• cv::cornerHarris<br />
高 位 合 成 japan.xilinx.com 450<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::CvtColor<br />
コード 例<br />
template<br />
void hls::CvtColor (<br />
hls::Mat& src,<br />
hls::Mat& dst);<br />
パラ メーター<br />
表 4‐26 : パラ メーター<br />
src<br />
dst<br />
code<br />
パラ メーター<br />
説 明<br />
入 力 画 像<br />
出 力 画 像<br />
色 変 換 の タ イ プのテンプレー ト パラ メーター<br />
説 明<br />
• カ ラー 画 像 と グ レース ケール 画 像 を 変 換 し ます。 変 換 の タ イ プは、 コー ド の 次 の 値 で 定 義 さ れます。<br />
° HLS_RGB2GRAY : RGB カ ラー 画 像 を グ レース ケール 画 像 に 変 換<br />
° HLS_BGR2GRAY : BGR カ ラー 画 像 を グ レース ケール 画 像 に 変 換<br />
° HLS_GRAY2RGB : グレースケール 画 像 を RGB 画 像 に 変 換<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および dst は、 同 じサイ ズで、 必 要 なチャネル 数 を 含 んでいる 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvCvtColor<br />
• cv::cvtColor<br />
高 位 合 成 japan.xilinx.com 451<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Dilate<br />
コード 例<br />
デフォルト<br />
template<br />
void hls::Dilate (<br />
hls::Mat& src,<br />
hls::Mat& dst);<br />
カスタム<br />
template<br />
void hls::Dilate (<br />
hls::Mat& src,<br />
hls::Mat& dst,<br />
hls::Window & kernel);<br />
パラ メーター<br />
表 4‐27 : パラ メーター<br />
パラ メーター<br />
src<br />
dst<br />
kernel<br />
Shape_type<br />
HLS_SHAPE_RECT<br />
HLS_SHAPE_CROSS<br />
HLS_SHAPE_ELLIPSE<br />
ITERATIONS<br />
入 力 画 像<br />
出 力 画 像<br />
説 明<br />
hls::Window ク ラ スで 定 義 さ れた 拡 張 に 使 用 さ れる 構 造<br />
エレ メン トの 長 方 形 。 エレ メン ト 内 のアンカー 位 置 は<br />
(K_ROWS/2, K_COLS/2) で、 3x3 長 方 形 の 構 造 エレ メ ン<br />
トがデフォルトで 使 用 されます。<br />
構 造 エレ メ ン ト の 形<br />
長 方 形 の 構 造 エレ メ ン ト<br />
十 字 架 型 の 構 造 エレ メ ン ト 。 アンカーで 交 差<br />
楕 円 形 の 構 造 エレ メ ン ト 。 塗 り つぶ さ れた 楕 円 は 長 方 形<br />
エレ メン ト に 含 まれる。<br />
拡 張 が 適 用 さ れる 回 数<br />
説 明<br />
• カーネル 内 で 構 築 さ れた 指 定 さ れた 構 造 エレ メ ン ト を 使 用 し て 画 像 src を 拡 張 します。<br />
• その 結 果 を dst に 保 存 し ます。<br />
• 拡 張 に よ り 、 その 最 大 値 に 基 づいてピ ク セル 近 傍 の 形 が 決 定 さ れます。<br />
• 画 像 src の 各 チャネルが 個 別 に 処 理 されます。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および dst は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 452<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
OpenCV リファレンス<br />
• cvDilate<br />
• cv::dilate<br />
高 位 合 成 japan.xilinx.com 453<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Duplicate<br />
コード 例<br />
template<br />
void hls::Duplicate (<br />
hls::Mat& src,<br />
hls::Mat& dst1,<br />
hls::Mat& dst2);<br />
パラ メーター<br />
表 4‐28 : パラ メーター<br />
src<br />
dst1<br />
dst2<br />
パラ メーター<br />
入 力 画 像<br />
1 つ 目 の 出 力 画 像<br />
2 つ 目 の 出 力 画 像<br />
説 明<br />
説 明<br />
• 入 力 画 像 src を 2 つの 出 力 画 像 dst1 と dst2 にコピーし、 2 つのデータ パスの 分 岐 点 と し ます。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst1 および dst2 の 画 像 データは 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst1 と dst2 の 画 像 データ が 満 た さ れます。<br />
• src、 dst1 および dst2 は、 同 じ サ イ ズおよびチ ャ ネル 数 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
該 当 な し<br />
高 位 合 成 japan.xilinx.com 454<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::EqualizeHist<br />
コード 例<br />
template<br />
void EqualizeHist(<br />
Mat&_src,<br />
Mat&_dst);<br />
パラ メーター<br />
表 4‐29 : パラ メーター<br />
src<br />
dst<br />
パラ メーター<br />
入 力 画 像<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 各 フ レームの ヒ ス ト グ ラ ム を 計 算 し、 次 のフ レームの 範 囲 を 正 規 化 する ために 使 用 し ます。<br />
• 遅 延 があ る と 、 イ ンプ リ メ ンテーシ ョ ンのフ レーム バッファーは 使 用 されなくなります。<br />
• ヒ ス ト グ ラ ムは こ の 関 数 内 部 のス タ テ ィ ッ ク データ と し て 格 納 さ れる ので、 EqualizeHist への 呼 び 出 し は 1 回 し<br />
かでき ません。<br />
• 入 力 は、 HLS_8UC1 型 になるはずです。<br />
OpenCV リファレンス<br />
• cvEqualizeHist<br />
• cv::EqualizeHist<br />
高 位 合 成 japan.xilinx.com 455<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Erode<br />
コード 例<br />
デフォル ト :<br />
template<br />
void hls::Erode (<br />
hls::Mat& src,<br />
hls::Mat& dst);<br />
カスタム :<br />
template<br />
void Erode(<br />
hls::Mat&_src,<br />
hls::Mat&_dst,<br />
hls::Window&_kernel)<br />
{<br />
パラ メーター<br />
表 4‐30 : パラ メーター<br />
パラ メーター<br />
src<br />
dst<br />
kernel<br />
Shape_type<br />
HLS_SHAPE_RECT<br />
HLS_SHAPE_CROSS<br />
HLS_SHAPE_ELLIPSE<br />
ITERATIONS<br />
入 力 画 像<br />
出 力 画 像<br />
説 明<br />
hls::Window ク ラ スで 定 義 さ れた 拡 張 に 使 用 さ れる 構 造<br />
エレ メン トの 長 方 形 。 エレ メン ト 内 のアンカー 位 置 は<br />
(K_ROWS/2, K_COLS/2) で、 3x3 長 方 形 の 構 造 エレ メ ン<br />
トがデフォルトで 使 用 されます。<br />
構 造 エレ メ ン ト の 形<br />
長 方 形 の 構 造 エレ メ ン ト<br />
十 字 架 型 の 構 造 エレ メ ン ト 。 交 差 し てい る と こ ろがアン<br />
カー。<br />
楕 円 形 の 構 造 エレ メ ン ト 。 塗 り つぶ さ れた 楕 円 は 長 方 形<br />
エレ メン ト に 含 まれる。<br />
削 減 が 適 用 さ れる 回 数<br />
説 明<br />
• カーネル 内 で 構 築 さ れた 指 定 さ れた 構 造 エレ メ ン ト を 使 用 し て 画 像 src を 削 減 します。<br />
• その 結 果 を dst に 保 存 し ます。<br />
• 削 減 に よ り 、 その 最 大 値 に 基 づいてピ ク セル 近 傍 の 形 が 決 定 さ れ、 画 像 src の 各 チャネルが 個 別 に 処 理 されます。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および dst は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 456<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
OpenCV リファレンス<br />
• cvErode<br />
• cv::erode<br />
高 位 合 成 japan.xilinx.com 457<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::FASTX<br />
コード 例<br />
template<br />
void FASTX(<br />
hls::Mat &_src,<br />
hls::Mat &_mask,<br />
int _threshold,<br />
bool _nomax_supression);<br />
template<br />
void FASTX(<br />
hls::Mat &_src,<br />
Point_ (&_keypoints)[N],<br />
int _threshold,<br />
bool _nomax_supression);<br />
パラ メーター<br />
表 4‐31 : パラ メーター<br />
src<br />
mask<br />
keypoints<br />
threshold<br />
nomax_supression<br />
パラ メーター<br />
入 力 画 像<br />
説 明<br />
コーナーが 検 出 された 値 255 の 出 力 画 像<br />
検 出 さ れた コーナーの 座 標 の 配 列<br />
FAST 検 出 器 の し き い 値 。ピ ク セルが window の 真 ん 中 の<br />
ピ ク セル と こ の し き い 値 以 上 異 な る 場 合 、 light または<br />
dark ピクセルのいずれかになります。<br />
true の 場 合 、 最 大 エ ッ ジ 以 外 のエ ッ ジ 抑 制 を イ ネーブル<br />
にします。<br />
説 明<br />
• FAST コーナー 検 出 器 を イ ンプ リ メ ン ト し、 コーナーの mask ま たは 座 標 の 配 列 を 生 成 し ます。<br />
OpenCV リファレンス<br />
• cvFAST<br />
• cv::FASTX<br />
高 位 合 成 japan.xilinx.com 458<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Filter2D<br />
コード 例<br />
template<br />
void Filter2D(<br />
Mat&_src,<br />
Mat &_dst,<br />
Window&_kernel,<br />
Point_anchor)<br />
template<br />
void Filter2D(<br />
Mat&_src,<br />
Mat &_dst,<br />
Window&_kernel,<br />
Point_anchor);<br />
パラ メーター<br />
表 4‐32 : パラ メーター<br />
src<br />
dst<br />
kernel<br />
anchor<br />
パラ メーター<br />
入 力 画 像<br />
出 力 画 像<br />
説 明<br />
hls::Window クラスで 定 義 された 2D フ ィルターのカー<br />
ネル<br />
カーネル 内 でフ ィ ルターさ れた 地 点 の 相 対 的 な 位 置 を<br />
示 すカーネルのアンカー<br />
説 明<br />
• 指 定 し たカーネルを 使 用 し て 任 意 線 形 フ ィ ルターを 画 像 src に 適 用 し ます。<br />
• 結 果 を 画 像 dst に 保 存 し ます。<br />
• こ の 関 数 では、 カーネルを 使 用 し て 相 互 関 係 が 計 算 さ れ、 画 像 がフ ィ ルター さ れます。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および dst は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
こ の 関 数 はボーダー モー ド の 有 無 に 関 係 な く 使 用 で き ます。<br />
使 用 方 法 :<br />
hls::Filter2D(src,dst)<br />
hls::Filter2D(src,dst)<br />
高 位 合 成 japan.xilinx.com 459<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• cv::filter2D<br />
• cvFilter2D (ボーダー モード については、 注 記 を 参 照 )<br />
ボーダー モードが 選 択 されていない 場 合 は、 デフォル ト の BORDER_DEFAULT モー ド が 使 用 さ れます。<br />
ボーダー モー ド の 選 択 肢 は、 次 の と お り です。<br />
• BORDER_CONSTANT : 入 力 が 0 で 拡 張 されます。<br />
• BORDER_REPLICATE : 入 力 は 境 界 値 を 使 用 し て 境 界 で 拡 張 さ れます。 ピ ク セルが abcde の 連 続 であれば、 境 界<br />
は abcdeeee で 終 了 されます。<br />
• BORDER_REFLECT : 入 力 はエ ッ ジ ピ ク セルを 複 製 し て、 境 界 で 拡 張 さ れます。 ピ ク セルが abcde と 連 続 してい<br />
る 場 合 であれば、 境 界 は abcdeedc で 終 了 されます。<br />
• BORDER_REFLECT_101 : 入 力 は 複 製 さ れてないエ ッ ジ ピクセルを 使 用 して 境 界 で 拡 張 されます。 ピクセルが<br />
abcde と 連 続 し てい る 場 合 であれば、 境 界 は abcdedcb で 終 了 されます。<br />
• BORDER_DEFAULT : BORDER_REFLECT_101 と 同 じです。<br />
OpenCV 関 数 と 互 換 性 があ る よ う にする ため、 cvFilter2D では BORDER_REPLICATE モー ド が 使 用 さ れます。<br />
高 位 合 成 japan.xilinx.com 460<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::GaussianBlur<br />
コード 例<br />
template<br />
void GaussianBlur(<br />
Mat &_src,<br />
Mat &_dst,<br />
double sigmaX=0,<br />
double sigmaY=0);<br />
template<br />
void GaussianBlur(<br />
hls::Mat &_src,<br />
hls::Mat &_dst);<br />
パラ メーター<br />
表 4‐33 : パラ メーター<br />
src<br />
dst<br />
パラ メーター<br />
入 力 画 像<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 正 規 化 さ れた 2D Gaussian Blur フ ィ ルターを 入 力 に 適 用 し ます。<br />
• フ ィ ルター 係 数 は、 KH および KW パラ メーター (3 または 5 のいずれか) で 決 定 されます。<br />
• 3x3 フィルター タップ :<br />
[1,2,1<br />
2,4,2<br />
1,2,1] * 1/16<br />
• 5x5 フィルター タップ :<br />
[1, 2, 3, 2, 1,<br />
2, 5, 6, 5, 2,<br />
3, 6, 8, 6, 3,<br />
2, 5, 6, 5, 2,<br />
1, 2, 3, 2, 1]* 1/84<br />
OpenCV リファレンス<br />
使 用 方 法 :<br />
hls::GaussianBlur(src,dst)<br />
hls::GaussianBlur(src,dst)<br />
• cv::GaussianBlur<br />
ボーダー モードが 選 択 されていない 場 合 は、 デフォル ト の BORDER_DEFAULT モー ド が 使 用 さ れます。<br />
高 位 合 成 japan.xilinx.com 461<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ボーダー モー ド の 選 択 肢 は、 次 の と お り です。<br />
• BORDER_CONSTANT : 入 力 が 0 で 拡 張 されます。<br />
• BORDER_REPLICATE : 入 力 は 境 界 値 を 使 用 し て 境 界 で 拡 張 さ れます。 ピ ク セルが abcde の 連 続 であれば、 境 界 は<br />
abcdeeee で 終 了 されます。<br />
• BORDER_REFLECT : 入 力 はエ ッ ジ ピ ク セルを 複 製 し て、 境 界 で 拡 張 さ れます。 ピ ク セルが abcde と 連 続 してい<br />
る 場 合 であれば、 境 界 は abcdeedc で 終 了 されます。<br />
• BORDER_REFLECT_101 : 入 力 は 複 製 さ れてないエ ッ ジ ピクセルを 使 用 して 境 界 で 拡 張 されます。 ピクセルが<br />
abcde と 連 続 し てい る 場 合 であれば、 境 界 は abcdedcb で 終 了 されます。<br />
• BORDER_DEFAULT :BORDER_REFLECT_101 と 同 じです。<br />
高 位 合 成 japan.xilinx.com 462<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Harris<br />
コード 例<br />
template<br />
void Harris(<br />
hls::Mat &_src,<br />
hls::Mat &_dst,<br />
KT k,<br />
int threshold);<br />
パラ メーター<br />
表 4‐34 : パラ メーター<br />
src<br />
dst<br />
k<br />
threshold<br />
パラ メーター<br />
説 明<br />
入 力 画 像<br />
検 出 さ れた コーナーの 出 力 mask<br />
Harris 検 出 器 パ ラ メ ーター<br />
最 大 検 出 結 果 の し き い 値<br />
説 明<br />
• この 関 数 は、 Harris エ ッ ジ ま たはコーナー 検 出 器 を イ ンプ リ メ ン ト し ます。<br />
• 水 平 方 向 および 垂 直 方 向 の 導 関 数 が Ksize*Ksize Sobel フ ィ ルターを 使 用 し て 概 算 さ れます。<br />
• 導 関 数 の ローカルの 共 分 散 行 列 M は、 各 ピ ク セル (x,y) の blockSize*blockSize 近 傍 に 収 め ら れます。<br />
• 関 数 が 最 大 にな る 箇 所 および<br />
し き い 値 を 超 え る 箇 所 を 示 し、 出 力 画 像 に コーナー /エッジとしてマークします。<br />
• Ksize=3 のみがサポー ト されます。<br />
OpenCV リファレンス<br />
• cvCornerHarris<br />
• cv::cornerHarris<br />
高 位 合 成 japan.xilinx.com 463<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::HoughLines2<br />
コード 例<br />
template<br />
struct Polar_<br />
AT angle;<br />
RT rho;<br />
};<br />
template<br />
void HoughLines2(<br />
hls::Mat &_src,<br />
Polar_ (&_lines)[linesMax],<br />
unsigned int threshold<br />
);<br />
パラ メーター<br />
表 4‐35 : パラ メーター<br />
src<br />
lines<br />
threshold<br />
パラ メーター<br />
説 明<br />
入 力 画 像<br />
パ ラ メ ーター 化 さ れた ラ イ ンの 配 列 で、 極 座 標 で 表 示<br />
戻 される 前 にラ イ ン 上 にのる 必 要 のあ る ピ ク セル 数<br />
説 明<br />
• ハフ ラ インの 変 換 をインプリ メ ン ト します。<br />
OpenCV リファレンス<br />
• cvHoughLines2<br />
• cv::HoughLines<br />
高 位 合 成 japan.xilinx.com 464<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Integral<br />
コード 例<br />
template<br />
void Integral(<br />
Mat&_src,<br />
Mat&_sum);<br />
template<br />
void Integral(<br />
Mat&_src,<br />
Mat&_sum,<br />
Mat&_sqsum);<br />
パラ メーター<br />
表 4‐36 : パラ メーター<br />
src<br />
sum<br />
sqsum<br />
パラ メーター<br />
入 力 画 像<br />
説 明<br />
ピ ク セルの 上 および 左 の 入 力 画 像 のピ ク セル 合 計<br />
ピ ク セルの 上 および 左 の 入 力 画 像 のピ ク セルの 二 乗 の<br />
合 計<br />
説 明<br />
• 積 分 画 像 の 計 算 を イ ンプ リ メ ン ト し ます。<br />
OpenCV リファレンス<br />
• cvIntegral<br />
• cv::integral<br />
高 位 合 成 japan.xilinx.com 465<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::InitUndistortRectifyMap<br />
コード 例<br />
template< typename CMT, typename RT, typename DT, int ROW, int COL, int MAP1_T, int MAP2_T,<br />
int N><br />
void InitUndistortRectifyMap(<br />
Window cameraMatrix,<br />
DT (&distCoeffs)[N],<br />
Window R,<br />
Window newcameraMatrix,<br />
Mat &map1,<br />
Mat &map2);<br />
template< typename CMT, typename RT, typename DT, int ROW, int COL, int MAP1_T, int MAP2_T,<br />
int N><br />
void InitUndistortRectifyMapInverse(<br />
Window cameraMatrix,<br />
DT (&distCoeffs)[N],<br />
Window ir<br />
Mat &map1,<br />
Mat &map2);<br />
パラ メーター<br />
表 4‐37 : パラ メーター<br />
cameraMatrix<br />
DT<br />
R<br />
newCameraMatrix<br />
ir<br />
map1、 map2<br />
パラ メーター<br />
説 明<br />
古 い 座 標 シ ス テムでカ メ ラ を 表 す 入 力 行 列<br />
入 力 変 形 係 数 ( 通 常 、 4、 5、 または 8 の 変 形 係 数 が 提 供<br />
されます)<br />
入 力 回 転 行 列<br />
新 し い 座 標 シ ス テムでカ メ ラ を 表 す 入 力 行 列<br />
Invert(newcameraMatrix*R) と 同 じ 入 力 変 換 行 列<br />
リ マ ッ プを 表 す 画 像<br />
説 明<br />
• こ れ ら の 関 数 は、 パ ラ メ ーターのセ ッ ト に 基 づいて map1 および map2 を 生 成 し ます。 map1 および map2 は<br />
hls::Remap() に 最 適 な 入 力 です。<br />
• 通 常 は、 ir を 計 算 する ためのフ レーム ご と のプ ロ セスが 合 成 ロ ジ ッ ク の 外 部 で 実 行 さ れる ので、 合 成 には<br />
InitUndistortRectifyMapInverse() の 方 が 推 奨 さ れます。 さ ま ざ ま なパ ラ メ ーターが 浮 動 小 数 点 ま たは 固 定 小 数 点 で<br />
あ る 可 能 性 があ り ます。 固 定 小 数 点 の 入 力 が 使 用 さ れる と 、 少 な く と も ICMT で 提 供 される 精 度 が 使 用 されて<br />
内 部 座 標 変 換 が 実 行 さ れます。<br />
• こ の 関 数 に イ ンプ リ メ ン ト さ れる 座 標 変 換 はハー ド ウ ェ ア リ ソ ース 集 中 型 なので、 入 力 パ ラ メ ーターが 固 定 小 数<br />
点 で、 使 用 可 能 な 外 部 メ モ リ のバン ド 幅 が 十 分 あ る 場 合 は、 こ の 関 数 の 結 果 をオフ ラ イ ンで 計 算 し て、 外 部 メ モ<br />
リの map1 および map2 に 保 存 する 方 が 推 奨 さ れる こ と も あ り ます。<br />
制 限<br />
map1 および map2 は、 HLS_16SC2 としてのみサポートされます。 cameraMatrix および newCameraMatrix は、 次 の 形 式<br />
を 使 用 し て 正 規 化 さ れます。<br />
[f_x,0,c_x,<br />
高 位 合 成 japan.xilinx.com 466<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
0,f_y,c_y,<br />
0,0,1]<br />
R および ir も 次 の 形 式 を 使 用 し て 正 規 化 さ れます。<br />
[a,b,c,<br />
d,e,f,<br />
0,0,1]<br />
OpenCV リファレンス<br />
• cv::initUndistortRectifyMap<br />
高 位 合 成 japan.xilinx.com 467<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Max<br />
コード 例<br />
template<br />
void hls::Max (<br />
hls::Mat& src1,<br />
hls::Mat& src2,<br />
hls::Mat& dst);<br />
パラ メーター<br />
表 4‐38 : パラ メーター<br />
src1<br />
src2<br />
dst<br />
パラ メーター<br />
1 つ 目 の 入 力 画 像<br />
2 つ 目 の 入 力 画 像<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 2 つの 入 力 画 像 、 src1 および src2 のエレ メ ン ト ご との 最 大 を 計 算 して、 結 果 を dst に 保 存 し ます。<br />
• 画 像 データ は src1 および src2 に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src1 および src2 のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src1 および src2 は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。 dst は、 入 力 と 同 じ サ イ ズおよびチャ<br />
ネル 数 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvMax<br />
• cv::max<br />
高 位 合 成 japan.xilinx.com 468<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::MaxS<br />
コード 例<br />
template<br />
void hls::MaxS (<br />
hls::Mat& src,<br />
P_T 値<br />
hls::Mat& dst);<br />
パラ メーター<br />
表 4‐39 : パラ メーター<br />
src<br />
value<br />
dst<br />
パラ メーター<br />
入 力 画 像<br />
入 力 ス カ ラー 値<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 入 力 画 像 src のエレ メ ン ト と 入 力 値 の 最 大 を 計 算 し、 結 果 を dst に 保 存 し ます。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および dst は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvMaxS<br />
• cv::max<br />
高 位 合 成 japan.xilinx.com 469<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Mean<br />
コード 例<br />
mask なし<br />
template<br />
DST_T hls::Mean(<br />
hls::Mat& src);<br />
mask あり<br />
template<br />
DST_T hls::Mean(<br />
hls::Mat& src,<br />
hls::Mat& mask);<br />
パラ メーター<br />
表 4‐40 : パラ メーター<br />
src<br />
mask<br />
パラ メーター<br />
入 力 画 像<br />
説 明<br />
演 算 mask は 計 測 される src 画 像 のエレ メ ン ト を 指 定 す<br />
る 8 ビッ ト チャネルの 画 像<br />
説 明<br />
• 画 像 src のエレ メ ン ト の 平 均 を 計 算 し、 結 果 のス カ ラーの 最 初 のチャ ネル 値 を 返 し ます。<br />
• mask ありで 計 算 した 場 合 :<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます (mask を 使 用 し て 計 算 さ れる 場 合 、 mask にはデータ が 格 納 さ れてい<br />
る 必 要 あ り)。<br />
• こ の 関 数 を 開 始 する と 、src のデータが 消 費 され (mask を 使 用 して 計 算 した 場 合 、mask のデータ も 消 費 されます)。<br />
• src および mask は 同 じサイ ズであ る 必 要 があ り ます。 mask には 0 以 外 のエレ メ ン ト が 含 まれる 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvMean<br />
• cv::mean<br />
高 位 合 成 japan.xilinx.com 470<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Merge<br />
コード 例<br />
2 つのシングルチャ ネル 画 像 の 入 力 :<br />
template<br />
void hls::Merge (<br />
hls::Mat& src0,<br />
hls::Mat& src1,<br />
hls::Mat& dst);<br />
3 つのシングルチャ ネル 画 像 の 入 力 :<br />
template<br />
void hls::Merge (<br />
hls::Mat& src0,<br />
hls::Mat& src1,<br />
hls::Mat& src2,<br />
hls::Mat& dst);<br />
4 つのシングルチャ ネル 画 像 の 入 力 :<br />
template<br />
void hls::Merge (<br />
hls::Mat& src0,<br />
hls::Mat& src1,<br />
hls::Mat& src2,<br />
hls::Mat& src3,<br />
hls::Mat& dst);<br />
パラ メーター<br />
表 4‐41 : パラ メーター<br />
src0<br />
src1<br />
src2<br />
src3<br />
dst<br />
パラ メーター<br />
説 明<br />
1 つ 目 のシン グルチ ャ ネル 入 力 画 像<br />
2 つ 目 のシン グルチャ ネル 入 力 画 像<br />
3 つ 目 のシン グルチャ ネル 入 力 画 像<br />
4 つ 目 のシン グルチャ ネル 入 力 画 像<br />
出 力 マルチチ ャ ネル 画 像<br />
説 明<br />
• 複 数 のシングルチャネル 画 像 から マルチチャネル 画 像 dst を 作 成 します。<br />
• 画 像 データ は 入 力 画 像 に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 入 力 のデータ が 消 費 さ れ、 dst の 画 像 データ が 満 た さ れます。<br />
• 入 力 画 像 は、 同 じ サ イ ズで、 シングルチャ ネルであ る 必 要 があ り ます。 dst は 入 力 と 同 じサイ ズで、 dst のチャネ<br />
ル 数 は 入 力 画 像 の 数 と 同 じ であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvMerge<br />
• cv::merge<br />
高 位 合 成 japan.xilinx.com 471<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Min<br />
コード 例<br />
template<br />
void hls::Min (<br />
hls::Mat& src1,<br />
hls::Mat& src2,<br />
hls::Mat& dst);<br />
パラ メーター<br />
表 4‐42 : パラ メーター<br />
src1<br />
src2<br />
dst<br />
パラ メーター<br />
1 つ 目 の 入 力 画 像<br />
2 つ 目 の 入 力 画 像<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 2 つの 入 力 画 像 、 src1 および src2 のエレ メ ン ト ご との 最 小 を 計 算 して、 結 果 を dst に 保 存 し ます。<br />
• 画 像 データ は src1 および src2 に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src1 および src2 のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src1 および src2 は、 同 じ サ イ ズおよびチ ャ ネル 数 であ る 必 要 があ り ます。<br />
• dst は、 入 力 と 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvMin<br />
• cv::min<br />
高 位 合 成 japan.xilinx.com 472<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::MinMaxLoc<br />
コード 例<br />
mask なし<br />
template<br />
void hls::MinMaxLoc (<br />
hls::Mat& src,<br />
P_T* min_val,<br />
P_T* max_val,<br />
hls::Point& min_loc,<br />
hls::Point& max_loc);<br />
mask あり<br />
template<br />
void hls::MinMaxLoc (<br />
hls::Mat& src,<br />
P_T* min_val,<br />
P_T* max_val,<br />
hls::Point& min_loc,<br />
hls::Point& max_loc,<br />
hls::Mat& mask);<br />
パラ メーター<br />
表 4‐43 : パラ メーター<br />
src<br />
パラ メーター<br />
入 力 画 像<br />
min_val 出 力 最 小 値 へのポ イ ン ター<br />
max_val 出 力 最 大 値 へのポ イ ン ター<br />
説 明<br />
min_loc<br />
max_loc<br />
mask<br />
入 力 画 像 の 最 小 位 置 の 出 力 ポ イ ン ト<br />
入 力 画 像 の 最 大 位 置 の 出 力 ポ イ ン ト<br />
演 算 mask は 検 出 される src 画 像 のエレ メ ン ト を 指 定 す<br />
る 8 ビッ ト チャネルの 画 像<br />
説 明<br />
• グ ローバル 最 小 値 および 最 大 値 と 、 入 力 画 像 src でのそれら の 位 置 を 検 出 し ます。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます (mask を 使 用 し て 計 算 さ れる 場 合 、 mask にはデータ が 格 納 さ れてい<br />
る 必 要 あ り)。<br />
• こ の 関 数 を 開 始 する と 、 src のデータが 消 費 されます (mask を 使 用 して 計 算 した 場 合 )。 mask のデータ も 消 費 され<br />
ます)。<br />
• min_val および max_val には、 同 じデータ 型 が 必 要 で、 src および mask は 同 じサイ ズであ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvMinMaxLoc<br />
• cv::minMaxLoc<br />
高 位 合 成 japan.xilinx.com 473<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::MinS<br />
コード 例<br />
template<br />
void hls::MinS (<br />
hls::Mat& src,<br />
P_T 値<br />
hls::Mat& dst);<br />
パラ メーター<br />
表 4‐44 : パラ メーター<br />
src<br />
value<br />
dst<br />
パラ メーター<br />
入 力 画 像<br />
入 力 ス カ ラー 値<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 入 力 画 像 src のエレ メ ン ト と 入 力 値 の 最 小 を 計 算 し、 結 果 を dst に 保 存 し ます。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および dst は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvMinS<br />
• cv::min<br />
高 位 合 成 japan.xilinx.com 474<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Mul<br />
コード 例<br />
template<br />
void hls::Mul (<br />
hls::Mat& src1,<br />
hls::Mat& src2,<br />
hls::Mat& dst,<br />
P_T scale=1);<br />
パラ メーター<br />
表 4‐45 : パラ メーター<br />
src1<br />
src2<br />
dst<br />
scale<br />
パラ メーター<br />
説 明<br />
1 つ 目 の 入 力 画 像<br />
2 つ 目 の 入 力 画 像<br />
出 力 画 像<br />
オプシ ョ ンのスケール 係 数<br />
説 明<br />
• 2 つの 入 力 画 像 、 src1 と src2 のエレ メ ン ト ご との 積 を 計 算 し ます。<br />
• 結 果 を 画 像 dst に 保 存 し ます。 オプシ ョ ンの 倍 率 scale を 使 用 できます。<br />
• 画 像 データ は src1 および src2 に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src1 および src2 のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src1 および src2 は、 同 じ サ イ ズおよびチ ャ ネル 数 であ る 必 要 があ り ます。<br />
• dst は、 入 力 と 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvMul<br />
• cv::multiply<br />
高 位 合 成 japan.xilinx.com 475<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Not<br />
コード 例<br />
template<br />
void hls::Not (<br />
hls::Mat& src,<br />
hls::Mat& dst);<br />
パラ メーター<br />
表 4‐46 : パラ メーター<br />
src<br />
dst<br />
パラ メーター<br />
入 力 画 像<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 画 像 src のエレ メ ン ト ご と のビ ッ ト 反 転 を 実 行 し ます。<br />
• 結 果 を 画 像 dst として 出 力 します。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および dst は、 同 じ サ イ ズおよびチャ ネル 数 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvNot<br />
• cv::bitwise_not<br />
高 位 合 成 japan.xilinx.com 476<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::PaintMask<br />
コード 例<br />
template<br />
void PaintMask(<br />
hls::Mat &_src,<br />
hls::Mat &_mask,<br />
hls::Mat &_dst,<br />
hls::Scalar _color);<br />
パラ メーター<br />
表 4‐47 : パラ メーター<br />
src<br />
mask<br />
dst<br />
color<br />
パラ メーター<br />
入 力 画 像<br />
入 力 マス ク<br />
出 力 画 像<br />
マー ク に 使 用 する 色<br />
説 明<br />
説 明<br />
• デスティネーシ ョ ン 画 像 の 各 ピクセルが color (mask が 0 でない 場 合 ) ま たは 入 力 画 像 か ら の 該 当 ピ ク セルのいず<br />
れかに 設 定 されます。<br />
• src、 mask、 および dst はすべて 同 じ サ イ ズにする 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 477<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Range<br />
コード 例<br />
template<br />
void hls::Range (<br />
hls::Mat& src,<br />
hls::Mat& dst,<br />
P_T start,<br />
P_T end);<br />
パラ メーター<br />
表 4‐48 : パラ メーター<br />
src<br />
dst<br />
start<br />
end<br />
パラ メーター<br />
説 明<br />
入 力 シン グルチ ャ ネル 画 像<br />
出 力 シン グルチ ャ ネル 画 像<br />
範 囲 の 左 側 のバウ ンダ リ 値<br />
範 囲 の 右 側 のバウ ンダ リ 値<br />
説 明<br />
• 次 の 規 則 を 使 用 し て 画 像 src のすべての 値 を 設 定 し て、 結 果 を 画 像 dst として 戻 します。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および dst は、 同 じ サ イ ズで、 シン グルチャ ネル 画 像 であ る 必 要 があ り ます。<br />
OpenCV リファレンス<br />
• cvRange<br />
高 位 合 成 japan.xilinx.com 478<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Remap<br />
コード 例<br />
template <br />
void Remap(<br />
hls::Mat &src,<br />
hls::Mat &dst,<br />
hls::Mat &map1,<br />
hls::Mat &map2);<br />
パラ メーター<br />
表 4‐49 : パラ メーター<br />
src<br />
dst<br />
• map1<br />
• map2<br />
パラ メーター<br />
入 力 画 像<br />
出 力 画 像<br />
リマップ<br />
説 明<br />
説 明<br />
• 指 定 し た リ マ ッ プに 従 って ソース 画 像 src をデステ ィ ネーシ ョ ン 画 像 dst に リ マ ッ プ し ます。 出 力 画 像 の 各 ピ ク<br />
セルには、 入 力 ピ ク セルの 座 標 が map1 および map2 で 指 定 されます。<br />
• こ の 関 数 は、 垂 直 視 差 の 小 さ いカ メ ラ のス ト リ ー ミ ング 処 理 のために 作 成 さ れてお り 、 入 力 画 像 の WIN_ROW 行<br />
を 含 む リ マップをイネーブルにするための 内 部 ラ イン バ ッ フ ァーが 含 まれます。 行 r_o の 出 力 ピ ク セルに 該 当 す<br />
る 入 力 ピクセルの row r_i が [r_o-(WIN_ROW/2-1], r_o+(WIN_ROW/2-1) の 範 囲 にない 場 合 は、 出 力 が 黒 にな り ま<br />
す。<br />
• また、 ライン バッファーのアーキテクチャのため、 WIN_ROW および COL が 2 のべき 乗 である 場 合 は、 関 数 で<br />
使 用 さ れる リ ソースが 少 な く な り ます。<br />
OpenCV リファレンス<br />
• cvRemap<br />
高 位 合 成 japan.xilinx.com 479<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Reduce<br />
コード 例<br />
template<br />
void hls::Reduce (<br />
hls::Mat& src,<br />
hls::Mat& dst,<br />
int dim,<br />
int reduce_op=HLS_REDUCE_SUM);<br />
パラ メーター<br />
表 4‐50 : パラ メーター<br />
パラ メーター<br />
src<br />
入 力 行 列<br />
dst 出 力 ベ ク ター<br />
説 明<br />
dim 行 列 が 削 減 さ れる と き の 次 元 指 数 。0<br />
は 行 列 が 1 行 に 削 減 さ れた こ と を、1<br />
は 行 列 が 1 列 に 削 減 された こ と を 意<br />
味 します。<br />
reduce_op<br />
削 減 演 算<br />
HLS_REDUCE_SUM<br />
HLS_REDUCE_AVG<br />
HLS_REDUCE_MAX<br />
HLS_REDUCE_MIN<br />
出 力 は、 行 列 の 行 と 列 すべての 合 計<br />
にな り ます。<br />
行 列 の 行 と 列 すべての 平 均 にな り ま<br />
す。<br />
出 力 は 行 列 の 行 と 列 の 最 大 値 にな り<br />
ます。<br />
出 力 は、 行 列 の 行 と 列 の 最 小 値 にな<br />
ります。<br />
説 明<br />
• 2D 画 像 src を dim ( 次 元 ) と 共 にベクター dst まで 削 減 し ます。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst のデータは 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
OpenCV リファレンス<br />
• cvReduce,<br />
• cv::reduce<br />
高 位 合 成 japan.xilinx.com 480<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Resize<br />
コード 例<br />
template<br />
void Resize (<br />
Mat &_src,<br />
Mat &_dst);<br />
パラ メーター<br />
表 4‐51 : パラ メーター<br />
src<br />
dst<br />
パラ メーター<br />
入 力 画 像<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 入 力 画 像 を 双 線 補 間 を 使 用 し て 出 力 画 像 のサ イ ズに 変 更 し ます。<br />
• こ の 関 数 は、 画 像 容 量 の 削 減 のみをサポー ト し ます。<br />
OpenCV リファレンス<br />
• cvResize<br />
• cv::resize<br />
高 位 合 成 japan.xilinx.com 481<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Set<br />
コード 例<br />
src 画 像 の 設 定 :<br />
template<br />
void hls::Set (<br />
hls::Mat& src,<br />
hls::Scalar scl,<br />
hls::Mat& dst);<br />
dst 画 像 の 生 成 :<br />
template<br />
void hls::Set (<br />
hls::Scalar scl,<br />
hls::Mat& dst);<br />
パラ メーター<br />
表 4‐52 : パラ メーター<br />
src<br />
scl<br />
dst<br />
パラ メーター<br />
入 力 画 像<br />
設 定 する ス カ ラー 値<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 画 像 src のエレ メ ン ト を 任 意 のスカラー 値 scl に 設 定 し ます。<br />
• 結 果 を 画 像 dst として 保 存 します。<br />
• 入 力 画 像 がない 場 合 は、 ス カ ラー 値 scl を 含 むすべてのエレ メ ン ト と 一 緒 に dst 画 像 を 生 成 し ます。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および scl は、 同 じ サ イ ズおよびチ ャ ネル 数 であ る 必 要 があ り ます。<br />
• dst は、 src と 同 じサイズおよびチャネル 数 である 必 要 があります。<br />
OpenCV リファレンス<br />
• cvSet<br />
高 位 合 成 japan.xilinx.com 482<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Scale<br />
コード 例<br />
template<br />
void hls::Scale (<br />
hls::Mat& src,<br />
hls::Mat& dst,<br />
P_T scale=1.0,<br />
P_T shift=0.0);<br />
パラ メーター<br />
表 4‐53 : パラ メーター<br />
src<br />
dst<br />
scale<br />
shift<br />
パラ メーター<br />
説 明<br />
入 力 画 像<br />
出 力 画 像<br />
スケール 係 数 の 値<br />
スケールされたエレメン トへ 追 加 された 値<br />
説 明<br />
• 入 力 画 像 src をオプシ ョ ンの 線 形 変 換 を 使 用 し て 変 換 し ます。<br />
• 結 果 を 画 像 dst として 保 存 します。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および dst のサイズおよびチャネル 数 は 同 じである 必 要 があ り 、 scale および shift のデータ 型 は 同 じであ る 必<br />
要 があ り ます。<br />
OpenCV リファレンス<br />
• cvScale<br />
• cvConvertScale<br />
高 位 合 成 japan.xilinx.com 483<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Sobel<br />
コード 例<br />
template<br />
void Sobel (<br />
Mat&_src,<br />
Mat&_dst)<br />
template<br />
void Sobel (<br />
Mat&_src,<br />
Mat&_dst)<br />
パラ メーター<br />
表 4‐54 : パラ メーター<br />
src<br />
dst<br />
パラ メーター<br />
入 力 画 像<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 水 平 ま たは 垂 直 方 向 の Sobel フ ィ ルターを 計 測 し、 水 平 ま たは 垂 直 方 向 の 導 関 数 を 返 し ます。 次 のよ う なフ ィ ル<br />
ターを 使 用 します。<br />
[-1,0,1<br />
-2,0,2,<br />
-1,0,1]<br />
• サポー ト されるのは SIZE=3 のみで、<br />
• XORDER=1 および YORDER=0 ( 水 平 方 向 の 導 関 数 の 場 合 ) または XORDER=0 および YORDER=1 ( 垂 直 方 向 の 導<br />
関 数 の 場 合 ) のみがサポー ト されます。<br />
OpenCV リファレンス<br />
こ の 関 数 は border モー ド の 有 無 に 関 係 な く 使 用 で き ます。<br />
使 用 方 法 :<br />
hls::Sobel(src,dst)<br />
hls::Sobel(src,dst)<br />
• cv::Sobel<br />
• cvSobel (ボーダー モード については、 注 記 を 参 照 )<br />
•<br />
ボーダー モードが 選 択 されていない 場 合 は、 デフォル ト の BORDER_DEFAULT モー ド が 使 用 さ れます。<br />
ボーダー モー ド の 選 択 肢 は、 次 の と お り です。<br />
高 位 合 成 japan.xilinx.com 484<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• BORDER_CONSTANT : 入 力 が 0 で 拡 張 されます。<br />
• BORDER_REPLICATE : 入 力 は 境 界 値 を 使 用 し て 境 界 で 拡 張 さ れます。 ピ ク セルが abcde の 連 続 であれば、 境 界 は<br />
abcdeeee で 終 了 されます。<br />
• BORDER_REFLECT : 入 力 はエ ッ ジ ピ ク セルを 複 製 し て、 境 界 で 拡 張 さ れます。 ピ ク セルが abcde と 連 続 してい<br />
る 場 合 であれば、 境 界 は abcdeedc で 終 了 されます。<br />
• BORDER_REFLECT_101 : 入 力 は 複 製 さ れてないエ ッ ジ ピクセルを 使 用 して 境 界 で 拡 張 されます。 ピクセルが<br />
abcde と 連 続 し てい る 場 合 であれば、 境 界 は abcdedcb で 終 了 されます。<br />
• BORDER_DEFAULT :BORDER_REFLECT_101 と 同 じです。<br />
OpenCV 関 数 と 互 換 性 があ る よ う にする ため、 cvSoble では BORDER_REPLICATE モー ド が 使 用 さ れます。<br />
高 位 合 成 japan.xilinx.com 485<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Split<br />
コード 例<br />
入 力 画 像 が 2 チャネルの 場 合 :<br />
template<br />
void hls::Split (<br />
hls::Mat& src,<br />
hls::Mat& dst0,<br />
hls::Mat& dst1);<br />
入 力 画 像 が 3 チャネルの 場 合 :<br />
template<br />
void hls::Split (<br />
hls::Mat& src,<br />
hls::Mat& dst0,<br />
hls::Mat& dst1,<br />
hls::Mat& dst2);<br />
入 力 画 像 が 4 チャネルの 場 合 :<br />
template<br />
void hls::Split (<br />
hls::Mat& src,<br />
hls::Mat& dst0,<br />
hls::Mat& dst1,<br />
hls::Mat& dst2,<br />
hls::Mat& dst3);<br />
パラ メーター<br />
表 4‐55 : パラ メーター<br />
src<br />
dst0<br />
dst1<br />
dst2<br />
dst3<br />
パラ メーター<br />
説 明<br />
入 力 マルチチ ャ ネル 画 像<br />
1 つ 目 のシン グルチャ ネル 出 力 画 像<br />
2 つ 目 のシン グルチャ ネル 出 力 画 像<br />
3 つ 目 のシン グルチャ ネル 出 力 画 像<br />
4 つ 目 のシン グルチャ ネル 出 力 画 像<br />
説 明<br />
• 複 数 のシングルチャネル 画 像 からのマルチチャネル 画 像 src を 分 割 します。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• 出 力 の 画 像 データ は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータ が 消 費 さ れ、 出 力 の 画 像 データ が 満 た さ れます。<br />
• 出 力 画 像 は、 同 じ サ イ ズで、 シングルチャ ネルであ る 必 要 があ り ます。<br />
• src は 出 力 と 同 じ サ イ ズであ る 必 要 があ り ます。<br />
• src のチャ ネル 数 は 出 力 画 像 の 数 と 同 じ であ る 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 486<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
OpenCV リファレンス<br />
• cvSplit<br />
• cv::split<br />
高 位 合 成 japan.xilinx.com 487<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::SubRS<br />
コード 例<br />
mask なし<br />
template<br />
void hls::SubRS (<br />
hls::Mat& src,<br />
hls::Scalar& scl,<br />
hls::Mat& dst);<br />
mask あり<br />
template<br />
void hls::SubRS (<br />
hls::Mat& src,<br />
hls::Scalar& scl,<br />
hls::Mat& dst,<br />
hls::Mat& mask,<br />
hls::Mat& dst_ref);<br />
パラ メーター<br />
表 4‐56 : パラ メーター<br />
src<br />
説 明<br />
パラ メーター<br />
• スカラー 値 scl と 画 像 src 間 の 違 いを 計 算 し ます。<br />
• その 結 果 を dst に 保 存 し ます。<br />
• mask ありで 計 算 した 場 合 :<br />
入 力 画 像<br />
scl 入 力 ス カ ラー<br />
dst<br />
mask<br />
dst_ref<br />
出 力 画 像<br />
説 明<br />
演 算 mask は 計 測 される dst 画 像 のエレ メ ン ト を 指 定 す<br />
る 8 ビッ ト チャネルの 画 像<br />
mask(I) = 0 の 場 合 の 出 力 画 像 のエレ メ ン ト を 格 納 する リ<br />
ファレンス 画 像<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• mask を 使 用 して 計 算 した 場 合 、 mask と dst_ref にはデータ が 格 納 さ れてい る 必 要 あ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 されます。<br />
• mask を 使 用 して 計 算 した 場 合 、 mask と dst_ref のデータ も 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および scl は、 同 じサイ ズおよびチャ ネル 数 であ る 必 要 があ り ます。 dst および dst_ref は、 src と 同 じサイズお<br />
よびチャ ネル 数 であ る 必 要 があ り ます。 mask は src と 同 じサイズである 必 要 があります。<br />
高 位 合 成 japan.xilinx.com 488<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
OpenCV リファレンス<br />
• cvSubRS<br />
• cv::subtract<br />
高 位 合 成 japan.xilinx.com 489<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::SubS<br />
コード 例<br />
mask なし<br />
template<br />
void hls::SubRS (<br />
hls::Mat& src,<br />
hls::Scalar& scl,<br />
hls::Mat& dst);<br />
mask あり<br />
template<br />
void hls::SubRS (<br />
hls::Mat& src,<br />
hls::Scalar& scl,<br />
hls::Mat& dst,<br />
hls::Mat& mask,<br />
hls::Mat& dst_ref);<br />
パラ メーター<br />
表 4‐57 : パラ メーター<br />
src<br />
説 明<br />
• 画 像 src とスカラー 値 scl のエレ メ ン ト 間 の 違 いを 計 算 し ます。<br />
• その 結 果 を dst に 保 存 し ます。<br />
mask ありで 計 算 した 場 合 :<br />
パラ メーター<br />
入 力 画 像<br />
scl 入 力 ス カ ラー<br />
dst<br />
mask<br />
dst_ref<br />
出 力 画 像<br />
説 明<br />
演 算 mask は 計 測 される dst 画 像 のエレ メ ン ト を 指 定 す<br />
る 8 ビッ ト チャネルの 画 像<br />
mask(I) = 0 の 場 合 の 出 力 画 像 のエレ メ ン ト を 格 納 する 参<br />
照 画 像<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• mask を 使 用 して 計 算 した 場 合 、 mask と dst_ref にはデータ が 格 納 さ れてい る 必 要 あ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• mask を 使 用 して 計 算 された 場 合 は、 mask および dst_ref のデータ も 消 費 されます。<br />
• src および scl は、 同 じ サ イ ズおよびチ ャ ネル 数 であ る 必 要 があ り ます。<br />
• dst および dst_ref は、 src と 同 じサイズおよびチャネル 数 である 必 要 があります。<br />
高 位 合 成 japan.xilinx.com 490<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
OpenCV リファレンス<br />
• cvSub<br />
• cv::subtract<br />
高 位 合 成 japan.xilinx.com 491<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Sum<br />
コード 例<br />
template<br />
hls::Scalar hls::Sum(<br />
hls::Mat& src);<br />
パラ メーター<br />
表 4‐58 : パラ メーター<br />
src<br />
パラ メーター<br />
入 力 画 像<br />
説 明<br />
説 明<br />
• 画 像 src のエレ メ ン ト を 合 計 を 計 算<br />
• 結 果 はス カ ラー 値 と し て 戻 さ れます。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 されます。<br />
OpenCV リファレンス<br />
• cvSum<br />
• cv::sum<br />
高 位 合 成 japan.xilinx.com 492<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Threshold<br />
コード 例<br />
template<br />
void hls::Threshold (<br />
hls::Mat& src,<br />
hls::Mat& dst,<br />
P_T thresh,<br />
P_T maxval,<br />
int thresh_type);<br />
パラ メーター<br />
表 4‐59 : パラ メーター<br />
src<br />
dst<br />
thresh<br />
maxval<br />
thresh_type<br />
パラ メーター<br />
説 明<br />
入 力 シン グルチ ャ ネル 画 像<br />
出 力 シン グルチ ャ ネル 画 像<br />
しきい 値<br />
一 部 の し き い 値 型 と 一 緒 に 使 用 する ための 最 大 値<br />
し き い 値 型 詳 細 は 説 明 を 参 照<br />
説 明<br />
シングルチャネル 画 像 src の 各 エレ メ ン ト に 固 定 レベルの し き い 値 を 実 行 し て、 シングルチャ ネル 画 像 dst として 結<br />
果 を 返 します。 この 関 数 でサポー ト される し きい 値 タ イプは、 次 の thresh_type で 決 ま り ます。<br />
HLS_THRESH_BINARY<br />
HLS_THRESH_BINARY_INV<br />
HLS_THRESH_TRUNC<br />
HLS_THRESH_TOZERO<br />
HLS_THRESH_TOZERO_INV<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• src および dst は 同 じ サ イ ズで、 シン グルチャ ネル 画 像 であ る 必 要 があ り 、thresh および maxval のデータ 型 は 同 じ<br />
である 必 要 があ り ます。<br />
高 位 合 成 japan.xilinx.com 493<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
OpenCV リファレンス<br />
• cvThreshold<br />
• cv::threshold<br />
高 位 合 成 japan.xilinx.com 494<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls::Zero<br />
コード 例<br />
画 像 を 使 用 し て 計 算 する 場 合 は、 次 を 設 定 し ます。<br />
template<br />
void hls::Zero (<br />
hls::Mat& src,<br />
hls::Mat& dst);<br />
dst 画 像 を 生 成 し ます。<br />
template<br />
void hls::Zero (<br />
hls::Mat& dst);<br />
パラ メーター<br />
表 4‐60 : パラ メーター<br />
src<br />
dst<br />
パラ メーター<br />
入 力 画 像<br />
出 力 画 像<br />
説 明<br />
説 明<br />
• 画 像 src のエレ メ ン ト を 0 に 設 定 し ます。<br />
• 結 果 を 画 像 dst として 保 存 します。<br />
• 入 力 画 像 がない 場 合 は、 すべてのエレ メ ン ト を 0 で 画 像 dst を 生 成 します。<br />
• 画 像 データ は src に 格 納 する 必 要 があ り ます。<br />
• dst の 画 像 フ ィ ール ド は 起 動 前 に 空 になってい る 必 要 があ り ます。<br />
• こ の 関 数 を 起 動 する と 、 src のデータが 消 費 され、 dst の 画 像 データ が 満 た さ れます。<br />
• dst は、 src と 同 じサイズおよびチャネル 数 である 必 要 があります。<br />
OpenCV リファレンス<br />
• cvSetZero<br />
• cvZero<br />
HLS 線 形 代 数 ラ イ ブ ラ リ<br />
HLS 線 形 代 数 関 数<br />
このセクショ ンでは、 Vivado HLS の 線 形 代 数 を 処 理 する 関 数 について 説 明 し ます。<br />
高 位 合 成 japan.xilinx.com 495<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls_matrix_multiply<br />
コード 例<br />
説 明<br />
C=AB<br />
template<<br />
class TransposeFormA,<br />
class TransposeFormB,<br />
int RowsA,<br />
int ColsA,<br />
int RowsB,<br />
int ColsB,<br />
int RowsC,<br />
int ColsC,<br />
typename InputType,<br />
typename OutputType><br />
void matrix_multiply(<br />
const InputType A[RowsA][ColsA],<br />
const InputType B[RowsB][ColsB],<br />
OutputType C[RowsC][ColsC]);<br />
• 2 つの 行 列 の 積 を 計 算 し て、 3 つ 目 の 行 列 を 戻 す<br />
• 入 力 行 列 のオプシ ョ ンの 転 置 ( 複 素 数 データ 型 の 場 合 は 共 役 転 置 行 列 )<br />
• 展 開 さ れた 浮 動 小 数 点 の イ ンプ リ メ ンテーシ ョ ン 用 に 提 供 さ れる 代 替 アーキテ ク チャ<br />
パラ メーター<br />
表 4‐61 : パラ メーター<br />
TransposeFormA<br />
TransposeFormB<br />
RowsA<br />
ColsA<br />
RowsB<br />
ColsB<br />
RowsC<br />
ColsC<br />
InputType<br />
OutputType<br />
パラ メーター<br />
説 明<br />
行 列 A の 転 置 要 件 (NoTranspose、 Transpose、<br />
ConjugateTranspose)<br />
行 列 B の 転 置 要 件 (NoTranspose、 Transpose、<br />
ConjugateTranspose)<br />
行 列 A の 行 数<br />
行 列 A の 列 数<br />
行 列 B の 行 数<br />
行 列 B の 列 数<br />
行 列 C の 行 数<br />
行 列 C の 列 数<br />
入 力 データ 型<br />
出 力 データ 型<br />
ColsA != RowsB の 場 合 、 関 数 はアサー ト を 実 行 し、 コ ンパイル エラーまたは 合 成 エラーになり ます。 A と B の 転 置<br />
要 件 は、 チェ ッ ク が 作 成 さ れる 前 に 満 た さ れます。<br />
高 位 合 成 japan.xilinx.com 496<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
引 数<br />
表 4‐62 : 引 数<br />
引 数<br />
A<br />
1 つ 目 の 入 力 行 列<br />
B<br />
2 つ 目 の 入 力 行 列<br />
C AB ( 出 力 行 列 の 積 )<br />
説 明<br />
戻 り 値<br />
• 該 当 な し (void 関 数 )<br />
サポー ト されるデータ 型<br />
• ap_fixed<br />
• float<br />
• x_complex<br />
• x_complex<br />
入 力 デー タの 仮 定<br />
• 浮 動 小 数 点 型 の 場 合 、 非 正 規 の 入 力 値 はサポー ト さ れません。 使 用 さ れる と 、 合 成 さ れたハー ド ウ ェ アで こ れ ら<br />
が 0 にフラ ッシュされ、 ソフ ト ウェア シミュレーションと 異 なるビヘイビアーになります。<br />
高 位 合 成 japan.xilinx.com 497<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls_cholesky<br />
コード 例<br />
説 明<br />
A=LL*<br />
template<<br />
bool LowerTriangularL,<br />
int RowsColsA,<br />
typename InputType,<br />
typename OutputType><br />
int cholesky(<br />
const InputType A[RowsColsA][RowsColsA],<br />
OutputType L[RowsColsA][RowsColsA])<br />
• 入 力 行 列 A の コ レ ス キー 分 解 を 計 算 し、 行 列 L を 戻 します。<br />
• 出 力 行 列 L は LowerTriangularL パ ラ メ ーターに 基 づいて 上 三 角 行 列 ま たは 下 三 角 行 列 にな り ます。<br />
• 行 列 L の 未 使 用 部 分 のエレ メ ン ト は 0 に 設 定 されます。<br />
パラ メーター<br />
表 4‐63 : パラ メーター<br />
RowsColsA<br />
LowerTriangularL<br />
InputType<br />
OutputType<br />
パラ メーター<br />
説 明<br />
入 力 行 列 および 出 力 行 列 の 行 と 列 の 次 元<br />
下 三 角 出 力 ま たは 上 三 角 出 力 のどち ら が 必 要 かを 選 択<br />
します。<br />
入 力 データ 型<br />
出 力 データ 型<br />
引 数<br />
表 4‐64 : 引 数<br />
A<br />
L<br />
引 数<br />
説 明<br />
エル ミ ー ト / 対 称 正 定 値 入 力 行 列<br />
下 三 角 ま たは 上 三 角 出 力 行 列<br />
戻 り 値<br />
• 正 し く 処 理 さ れた 場 合 は 0<br />
• エラーになった 場 合 は 1。 関 数 では 負 の 数 の 平 方 根 を 見 つけ よ う と し ます。 た と えば、 入 力 行 列 A がエル ミ ー ト<br />
/ 対 称 正 定 値 行 列 ではない 場 合 な どにエ ラーにな り ます。<br />
サポー ト されるデータ 型<br />
• ap_fixed<br />
• float<br />
• x_complex<br />
• x_complex<br />
高 位 合 成 japan.xilinx.com 498<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
入 力 デー タの 仮 定<br />
• 関 数 では 入 力 行 列 が 対 称 正 定 値 行 列 ( 複 素 数 入 力 の 場 合 はエル ミ ー ト 正 定 値 行 列 ) であ る と 仮 定 さ れます。<br />
• 浮 動 小 数 点 型 の 場 合 、 非 正 規 の 入 力 値 はサポー ト さ れません。 使 用 さ れる と 、 合 成 さ れたハー ド ウ ェ アで こ れ ら<br />
が 0 にフラ ッシュされ、 ソフ ト ウェア シミュレーションと 異 なるビヘイビアーになります。<br />
高 位 合 成 japan.xilinx.com 499<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls_qrf<br />
コード 例<br />
説 明<br />
A=QR<br />
template<<br />
bool TransposeQ,<br />
int RowsA,<br />
int ColsA,<br />
typename InputType,<br />
typename OutputType><br />
void qrf(<br />
const InputType A[RowsA][ColsA],<br />
OutputType Q[RowsA][RowsA],<br />
OutputType R[RowsA][ColsA])<br />
• 入 力 行 列 A の 完 全 な QR 因 数 分 解 (QR 分 解 ) が 計 算 さ れ、 直 行 出 力 行 列 Q と 上 三 角 行 列 R が 出 力 されます。<br />
• 出 力 行 列 Q は TransposeQ パラ メーターに 基 づいてオプシ ョ ンで 転 置 されるこ とがあり ます。<br />
• 出 力 行 列 R の 下 三 角 エレ メ ン ト は 0 にはな り ません。<br />
• 薄 い (エコノ ミーな) QR 分 解 はイ ンプ リ メ ン ト さ れません。<br />
パラ メーター<br />
表 4‐65 : パラ メーター<br />
TransposeQ<br />
RowsA<br />
ColsA<br />
InputType<br />
OutputType<br />
パラ メーター<br />
説 明<br />
Q 行 列 を 転 置 するべき かど う かを 選 択 し ます。<br />
入 力 行 列 A の 行 数<br />
入 力 行 列 A の 列 数<br />
入 力 データ 型<br />
出 力 データ 型<br />
• 関 数 は RowsA < ColsA の 場 合 、 コ ンパイル エラーになるか 合 成 エラーになり ます。<br />
引 数<br />
表 4‐66 : 引 数<br />
A<br />
Q<br />
R<br />
引 数<br />
入 力 行 列<br />
直 行 出 力 行 列<br />
上 三 角 出 力 行 列<br />
説 明<br />
戻 り 値<br />
• 該 当 な し (void 関 数 )<br />
サポー ト されるデータ 型<br />
• float<br />
高 位 合 成 japan.xilinx.com 500<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• x_complex<br />
入 力 デー タの 仮 定<br />
• 浮 動 小 数 点 型 の 場 合 、 非 正 規 の 入 力 値 はサポー ト さ れません。 使 用 さ れる と 、 合 成 さ れたハー ド ウ ェ アで こ れ ら<br />
が 0 にフラ ッシュされ、 ソフ ト ウェア シミュレーションと 異 なるビヘイビアーになります。<br />
高 位 合 成 japan.xilinx.com 501<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls_cholesky_inverse<br />
コード 例<br />
説 明<br />
AA -1 = I<br />
template<<br />
int RowsColsA,<br />
typename InputType,<br />
typename OutputType><br />
int cholesky_inverse(<br />
const InputType A[RowsColsA][RowsColsA],<br />
OutputType InverseA[RowsColsA][RowsColsA])<br />
• 正 定 値 対 称 入 力 行 列 の 逆 数 を コ レ ス キー 分 解 方 法 で 計 算 し、 InverseA 行 列 を 出 力 し ます。<br />
パラ メーター<br />
表 4‐67 : パラ メーター<br />
RowsColsA<br />
InputType<br />
OutputType<br />
パラ メーター<br />
説 明<br />
入 力 行 列 および 出 力 行 列 の 行 と 列 の 次 元<br />
入 力 データ 型<br />
出 力 データ 型<br />
引 数<br />
表 4‐68 : 引 数<br />
A<br />
InverseA<br />
引 数<br />
説 明<br />
平 方 根 エル ミ ー ト / 対 称 正 定 値 入 力 行 列<br />
入 力 行 列 の 逆 数<br />
戻 り 値<br />
• 正 し く 処 理 さ れた 場 合 は 0<br />
• エラーになった 場 合 は 1。 コ レ ス キー 関 数 は、 負 の 数 の 平 方 根 を 見 つけ よ う と し ます。 入 力 行 列 A は 対 称 正 定 値<br />
行 列 ではあ り ません。<br />
サポー ト されるデータ 型<br />
• ap_fixed<br />
• float<br />
• x_complex<br />
• x_complex<br />
入 力 デー タの 仮 定<br />
• 関 数 では 入 力 行 列 が 対 称 正 定 値 行 列 ( 複 素 数 入 力 の 場 合 はエル ミ ー ト 正 定 値 行 列 ) であ る と 仮 定 さ れます。<br />
• 浮 動 小 数 点 型 の 場 合 、 非 正 規 の 入 力 値 はサポー ト さ れません。 使 用 さ れる と 、 合 成 さ れたハー ド ウ ェ アで こ れ ら<br />
が 0 にフラ ッシュされ、 ソフ ト ウェア シミュレーションと 異 なるビヘイビアーになります。<br />
高 位 合 成 japan.xilinx.com 502<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls_qr_inverse<br />
コード 例<br />
説 明<br />
AA -1 =I<br />
template<<br />
int RowsColsA,<br />
typename InputType,<br />
typename OutputType><br />
int qr_inverse(<br />
const InputType A[RowsColsA][RowsColsA],<br />
OutputType InverseA[RowsColsA][RowsColsA])<br />
• 入 力 行 列 A の 逆 数 を QR 因 数 分 解 方 法 で 計 算 し、 InverseA 行 列 を 出 力 し ます。<br />
パラ メーター<br />
表 4‐69 : パラ メーター<br />
RowsColsA<br />
InputType<br />
OutputType<br />
パラ メーター<br />
説 明<br />
入 力 行 列 および 出 力 行 列 の 行 と 列 の 次 元<br />
入 力 データ 型<br />
出 力 データ 型<br />
引 数<br />
表 4‐70 : 引 数<br />
A<br />
InverseA<br />
引 数<br />
入 力 行 列 A<br />
入 力 行 列 の 逆 数<br />
説 明<br />
戻 り 値<br />
• 正 し く 処 理 さ れた 場 合 は 0<br />
• 行 列 A が 特 異 行 列 の 場 合 は 1<br />
サポー ト されるデータ 型<br />
• float<br />
• x_complex<br />
入 力 デー タの 仮 定<br />
• 浮 動 小 数 点 型 の 場 合 、 非 正 規 の 入 力 値 はサポー ト さ れません。 使 用 さ れる と 、 合 成 さ れたハー ド ウ ェ アで こ れ ら<br />
が 0 にフラ ッシュされ、 ソフ ト ウェア シミュレーションと 異 なるビヘイビアーになります。<br />
高 位 合 成 japan.xilinx.com 503<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
hls_svd<br />
コード 例<br />
説 明<br />
template<<br />
int RowsA,<br />
int ColsA,<br />
typename InputType,<br />
typename OutputType><br />
void svd(<br />
const InputType A[RowsA][ColsA],<br />
OutputType S[RowsA][ColsA],<br />
OutputType U[RowsA][RowsA],<br />
OutputType V[ColsA][ColsA])<br />
A=USV*<br />
• 入 力 行 列 A の 特 異 値 分 解 を 計 算 し て、 行 列 U、 S、 および V を 出 力 し ます。<br />
• 平 方 根 行 列 のみがサポー ト さ れます。<br />
• 反 復 両 面 ヤ コ ビ 方 法 を 使 用 し て イ ンプ リ メ ン ト さ れます。<br />
パラ メーター<br />
表 4‐71 : パラ メーター<br />
RowsA<br />
ColsA<br />
InputType<br />
OutputType<br />
パラ メーター<br />
行 の 次 元<br />
列 の 次 元<br />
入 力 データ 型<br />
出 力 データ 型<br />
説 明<br />
• RowsA != ColsA の 場 合 、 関 数 はアサー ト を 実 行 し、 コ ンパイル エラーまたは 合 成 エラーになります。<br />
引 数<br />
表 4‐72 : 引 数<br />
引 数<br />
説 明<br />
A<br />
入 力 行 列<br />
S<br />
入 力 行 列 の 特 異 値<br />
U 入 力 行 列 の 左 特 異 ベ ク ター<br />
V 入 力 行 列 の 右 特 異 ベ ク ター<br />
戻 り 値<br />
• 該 当 な し (void 関 数 )<br />
サポー ト されるデータ 型<br />
• float<br />
• x_complex<br />
高 位 合 成 japan.xilinx.com 504<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
入 力 デー タの 仮 定<br />
• 浮 動 小 数 点 型 の 場 合 、 非 正 規 の 入 力 値 はサポー ト さ れません。 使 用 さ れる と 、 合 成 さ れたハー ド ウ ェ アで こ れ ら<br />
が 0 にフラ ッシュされ、 ソフ ト ウェア シミュレーションと 異 なるビヘイビアーになります。<br />
例<br />
例 では、 基 本 的 なテ ス ト ベンチを 提 供 し て、 各 線 形 代 数 関 数 のパ ラ メ ーター 指 定 方 法 と イ ン ス タ ンシエーシ ョ ン 方 法<br />
を 示 し ます。 各 関 数 の 例 ( 複 数 の 例 があ る こ と も あ り ) は、 Vivado HLS の examples デ ィ レ ク ト リ か ら 入 手 で き ます。<br />
/examples/design/linear_algebra<br />
各 例 には、 次 のフ ァ イルが 含 まれます。<br />
• .cpp : ラ イ ブ ラ リ 関 数 を イ ン ス タ ンシエー ト する 最 上 位 合 成 ラ ッ パー<br />
• .h : 行 列 サ イ ズ、 データ 型 、 可 能 な 場 合 はアーキテ ク チャ 選 択 など を 定 義 するヘ ッ ダー ファイル<br />
• _tb.cpp : 最 上 位 合 成 ラ ッ パーを イ ン ス タ ンシエー ト する 基 本 的 なテ ス ト ベンチ<br />
• run_hls.tcl : Vivado HLS のサンプル プ ロ ジ ェ ク ト を 設 定 する Tcl コマンド<br />
vivado_hls -f run_hls.tcl<br />
• directives.tcl : (オプシ ョ ン) 最 適 化 /イ ンプ リ メ ンテーシ ョ ン 指 示 子 を 適 用 する 追 加 の Tcl コマンド<br />
高 位 合 成 japan.xilinx.com 505<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
C の 任 意 精 度 型<br />
このセ ク シ ョ ンでは、 次 について 説 明 し ます。<br />
• C 言 語 デザ イ ン 用 に Vivado HLS で 提 供 さ れる 任 意 精 度 (AP) 型<br />
• C の int#w 型 用 の 関 連 関 数<br />
[u]int#W 型 のコ ンパイル<br />
[u]int#W 型 を 使 用 する には、[u]int#W 変 数 を 参 照 する ソース ファイルすべてに ap_cint.h ヘッダー ファイルを 含 め<br />
る 必 要 があ り ます。<br />
こ の 型 を 使 用 する ソ フ ト ウ ェ ア モデルを コ ンパイルする と き、 Vivado HLS のヘッ ダー フ ァ イルの 場 所 を 指 定 する 必<br />
要 があ る 場 合 があ り ます。 た と えば、gcc コンパイルには -I//include オプシ ョ ン を 追 加 する など し ます。<br />
ヒント : gcc -O3 オプシ ョ ンを 使 用 してコンパイルする 場 合 には、 ソ フ ト ウエア モデルで 最 高 のパフ ォーマンスにな<br />
ります。<br />
[u]int#W 変 数 の 宣 言 / 定 義<br />
C 型 には 次 の よ う にそれぞれ 符 号 付 きおよび 符 号 な し があ り ます。<br />
• int#W<br />
• uint#W<br />
説 明 :<br />
° #W は 数 値 で、 宣 言 さ れてい る 変 数 の 合 計 幅 を 指 定 し ます。<br />
次 の 例 にあ る よ う に、 C/C++ の typedef 文 を 使 用 し てユーザー 定 義 型 を 作 成 する こ と がで き ます。<br />
include “ap_cint.h”<br />
typedef uint128 uint128_t;<br />
int96 my_wide_var;<br />
// use [u]int#W types<br />
// 128-bit user defined type<br />
// a global variable declaration<br />
幅 の 最 大 値 は 1024 ビッ トです。<br />
定 数 ( リテラル) からの 初 期 化 および 代 入<br />
[u]int#W 変 数 は、 ネ イ テ ィ ブ 整 数 データ 型 でサポー ト さ れてい る の と 同 じ 整 数 定 数 で 初 期 化 する こ と がで き ます。 定<br />
数 は [u]int#W 変 数 の 最 大 幅 までゼ ロ ま たは 符 号 拡 張 さ れます。<br />
#include “ap_cint.h”<br />
uint15 a = 0;<br />
uint52 b = 1234567890U;<br />
uint52 c = 0o12345670UL;<br />
uint96 d = 0x123456789ABCDEFULL;<br />
64 ビ ッ ト よ り も 大 き なビ ッ ト 幅 には、 次 のフ ァ ン ク シ ョ ンを 使 用 する こ と ができ ます。<br />
高 位 合 成 japan.xilinx.com 506<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
apint_string2bits()<br />
こ のセ ク シ ョ ンで も、 関 連 する 関 数 の 使 用 について 説 明 し ます。<br />
• apint_string2bits_bin()<br />
• apint_string2bits_oct()<br />
• apint_string2bits_hex()<br />
こ れ ら の 関 数 は 基 数 (10 進 数 、 2 進 数 、 8 進 数 、 16 進 数 ) の 制 約 内 で 指 定 さ れた 桁 の 定 数 文 字 列 を 指 定 し たビ ッ ト 幅 N<br />
の 付 いた 値 に 変 換 し ます。 どの 基 数 の 場 合 も、 数 値 には 負 の 値 を 示 すためにマ イナス 記 号 (-) を 付 ける こ とができま<br />
す。<br />
int#W apint_string2bits[_radix](const char*, int N)<br />
これは、 C 言 語 で 許 容 さ れる 値 よ り も 大 き な 値 で 整 数 定 数 を コ ン ス ト ラ ク ト する のに 使 用 さ れます。 小 さ な 値 で も 問<br />
題 はあ り ませんが、 既 存 の C 言 語 の 定 数 値 で 指 定 する 方 が 簡 単 です。<br />
#include <br />
#include “ap_cint.h”<br />
int128 a;<br />
// Set a to the value hex 00000000000000000123456789ABCDF0<br />
a = apint_string2bits_hex(-123456789ABCDEF,128);<br />
ま た、 値 は 文 字 列 か ら 直 接 代 入 する こ と がで き ます。<br />
apint_vstring2bits()<br />
この 関 数 は 16 進 数 の 制 約 内 で 指 定 さ れた 桁 の 文 字 列 を 指 定 し た ビ ッ ト 幅 N の 付 いた 値 に 変 換 し ます。 数 値 には 負 の<br />
値 を 示 すためにマ イナス 記 号 (-) を 付 ける こ とができます。<br />
これは、C 言 語 で 許 容 さ れる 値 よ り も 大 き な 値 で 整 数 定 数 を コ ン ス ト ラ ク ト する のに 使 用 さ れます。 こ の 関 数 は 通 常 、<br />
フ ァ イルか ら 情 報 を 読 み 込 むためにテ ス ト ベンチで 使 用 さ れます。<br />
ファイル test.dat には 次 のデータ が 含 まれてい る と し ます。<br />
123456789ABCDEF<br />
-123456789ABCDEF<br />
-5<br />
テ ス ト ベンチで 使 用 さ れてい る 場 合 、 こ の 関 数 で 次 の 値 が 出 力 さ れます。<br />
#include <br />
#include “ap_cint.h”<br />
typedef data_t;<br />
int128 test (<br />
int128 t a<br />
) {<br />
return a+1;<br />
}<br />
int main () {<br />
FILE *fp;<br />
char vstring[33];<br />
fp<br />
= fopen(test.dat,r);<br />
高 位 合 成 japan.xilinx.com 507<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
while (fscanf(fp,%s,vstring)==1) {<br />
// Supply function “test” with the following values<br />
// 00000000000000000123456789ABCDF0<br />
// FFFFFFFFFFFFFFFFFEDCBA9876543212<br />
// FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC<br />
}<br />
test(apint_vstring2bits_hex(vstring,128));<br />
printf(\n);<br />
}<br />
fclose(fp);<br />
return 0;<br />
コンソール I/O ( 出 力 ) のサポー ト<br />
[u]int#W 変 数 は、 ネ イ テ ィ ブ 整 数 データ 型 でサポー ト さ れてい る の と 同 じ 変 換 指 定 子 で 出 力 する こ と がで き ます。 変<br />
換 指 定 子 に 基 づいてフ ィ ッ ト する ビ ッ ト のみが 出 力 さ れます。<br />
#include “ap_cint.h”<br />
uint164<br />
c = 0x123456789ABCDEFULL;<br />
printf( d%40d\n,c);<br />
// Signed integer in decimal format<br />
// d -1985229329<br />
printf( hd%40hd\n,c); // Short integer<br />
// hd -12817<br />
printf( ld%40ld\n,c); // Long integer<br />
// ld 81985529216486895<br />
printf(lld%40lld\n,c); // Long long integer<br />
// lld 81985529216486895<br />
printf( u%40u\n,c);<br />
// Unsigned integer in decimal format<br />
// u 2309737967<br />
printf( hu%40hu\n,c);<br />
// hu 52719<br />
printf( lu%40lu\n,c);<br />
// lu 81985529216486895<br />
printf(llu%40llu\n,c);<br />
// llu 81985529216486895<br />
printf( o%40o\n,c);<br />
// Unsigned integer in octal format<br />
// o 21152746757<br />
printf( ho%40ho\n,c);<br />
// ho 146757<br />
printf( lo%40lo\n,c);<br />
// lo 4432126361152746757<br />
printf(llo%40llo\n,c);<br />
// llo 4432126361152746757<br />
printf( x%40x\n,c);<br />
// Unsigned integer in hexadecimal format [0-9a-f]<br />
// x 89abcdef<br />
printf( hx%40hx\n,c);<br />
// hx cdef<br />
printf( lx%40lx\n,c);<br />
// lx 123456789abcdef<br />
高 位 合 成 japan.xilinx.com 508<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
printf(llx%40llx\n,c);<br />
// llx 123456789abcdef<br />
printf( X%40X\n,c);<br />
// Unsigned integer in hexadecimal format [0-9A-F]<br />
// X 89ABCDEF<br />
}<br />
[u]int#W 変 数 の 初 期 化 および 代 入 の 場 合 と 同 様 に、64 ビッ ト よ り も 大 きな 値 の 出 力 をサポートするための 機 能 が 提 供<br />
されています。<br />
apint_print()<br />
これは、 C 言 語 で 許 容 さ れる 値 よ り も 大 き な 値 の 整 数 を 表 示 する のに 使 用 さ れます。 こ の 関 数 は、 基 数 (2、 8、 10、<br />
16) に 基 づいて 処 理 された 値 を stdout に 出 力 し ます。<br />
void<br />
apint_print(int#N value, int radix)<br />
apint_printf() が 使 用 されている と きの 結 果 値 の 例 は 次 のよ う にな り ます。<br />
#include <br />
#include “ap_cint.h”<br />
int65 Var1 = 44;<br />
apint_print(tmp,2);<br />
//00000000000000000000000000000000000000000000000000000000000101100<br />
apint_print(tmp,8); // 0000000000000000000054<br />
apint_print(tmp,10); // 44<br />
apint_print(tmp,16);<br />
// 0000000000000002C<br />
apint_fprint()<br />
これは、C 言 語 で 許 容 さ れる 値 よ り も 大 き な 値 の 整 数 を 表 示 する のに 使 用 さ れます。 こ のフ ァ ン ク シ ョ ンは、 基 数 (2、<br />
8、 10、 16) に 基 づいて 処 理 された 値 を フ ァ イルに 出 力 し ます。<br />
void<br />
apint_fprint(FILE* file, int#N value, int radix)<br />
[u]int#W 型 を 使 用 した 式<br />
[u]int#W 型 の 変 数 は、 通 常 C 演 算 子 を 使 用 し た 式 では 自 由 に 使 用 する こ と がで き ます。 し か し、 一 部 には 予 期 し ない<br />
動 作 が 見 られ、 説 明 が 必 要 な こ と があ り ます。<br />
ビ ッ ト 幅 が 小 さ い 値 を 幅 が 大 きい ものへ 代 入 する 場 合 のゼロまたは 符 号 拡 張<br />
ビ ッ ト 幅 が 小 さ い 符 号 付 き 変 数 の 値 を 幅 の 大 き な も のへ 代 入 する と 、 符 号 に 関 わ らず、 値 はデス テ ィ ネーシ ョ ン 変 数<br />
の 幅 ( 大 きいほうの 幅 ) に 符 号 拡 張 さ れます。<br />
同 様 に、 符 号 な し のビ ッ ト 幅 の 小 さ い 変 数 は 代 入 前 にゼ ロ 拡 張 さ れます。<br />
代 入 で 予 期 動 作 を 得 る には、 ソース 変 数 の 明 示 的 な 型 変 換 が 必 要 にな る こ と があ り ます。<br />
ビ ッ ト 幅 が 大 きい 値 を 幅 が 小 さ い ものへ 代 入 する 場 合 の 切 り 捨 て<br />
ビ ッ ト 幅 が 大 きいソース 変 数 値 を 幅 の 小 さ な ものへ 代 入 する と、 値 が 切 り 捨 て られ、 デステ ィ ネーシ ョ ン 値 ( 幅 の 小<br />
さいほうの 値 ) の 最 上 位 ビ ッ ト (MSB) を 超 えたビ ッ ト はすべて 失 われます。<br />
高 位 合 成 japan.xilinx.com 509<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
こ の 切 り 捨 てが 行 われる と き、 符 号 情 報 が 特 別 に 処 理 さ れる わけではないので、 予 期 し ない 動 作 が 見 られる 可 能 性 が<br />
あ り ます。 予 期 し ない 動 作 を 防 ぐには、 明 示 的 な 型 変 換 を 利 用 し ます。<br />
2 進 数 の 演 算 子<br />
通 常 、 ネ イ テ ィ ブの C 整 数 データ 型 で 実 行 可 能 な 有 効 な 演 算 は [u]int#w 型 でサポー ト されています。<br />
任 意 精 度 演 算 を 行 う ため、 標 準 2 進 数 整 数 演 算 子 がオーバーロー ド さ れます。 次 の 演 算 子 ではすべて、 [u]int#W の 2<br />
つのオペラ ン ド が 使 用 されるか、 または [u]int#W 型 を 1 つと C/C++ 整 数 データ 型 1 つ (char、 short、 int など) が 使 用<br />
されます。<br />
結 果 値 の 幅 および 符 号 は、 デス テ ィ ネーシ ョ ン 変 数 (または 式 ) の 幅 に 基 づいて 符 号 拡 張 、 ゼ ロ の 追 加 、 ま たは 切 り 捨<br />
てが 実 行 さ れる 前 に、 オペラ ン ド の 幅 および 符 号 で 決 ま り ます。 返 さ れる 値 の 詳 細 は 各 演 算 子 で 説 明 さ れています。<br />
式 に ap_[u]int 型 および C/C++ 整 数 型 の 両 方 が 含 まれてい る 場 合 、 C++ 型 では 次 の 幅 が 使 用 されます。<br />
• char :8 ビッ ト<br />
• short :16 ビッ ト<br />
• int :32 ビッ ト<br />
• long :32 ビッ ト<br />
• long long :64 ビット<br />
加 算<br />
[u]int#W::RType [u]int#W::operator + ([u]int#W op)<br />
この 式 は、 2 つの ap_[u]int (または ap_[u]int 1 つと C/C++ 整 数 型 を 1つ) の 和 を 計 算 し ます。<br />
和 の 幅 は、 次 のよ う にな り ます。<br />
• 2 つのオペラ ン ド の 幅 の 大 きいほ う よ り も 1 ビッ ト 大 きくなる<br />
• 幅 の 広 いほ う が 符 号 な しで 幅 の 小 さいほ う が 符 号 付 きの 場 合 のみ 2 ビッ ト 大 きくなる<br />
オペラ ン ド のいずれか (または 両 方 ) が 符 号 付 き であれば、 和 は 符 号 付 き と し て 処 理 さ れる<br />
減 算<br />
[u]int#W::RType [u]int#W::operator - ([u]int#W op)<br />
• 2 つの 整 数 の 差 を 計 算 する 式 です。<br />
• 相 違 値 の 幅 は、 次 の よ う にな り ます。<br />
° 2 つのオペラ ン ド の 幅 の 大 きいほ う よ り も 1 ビッ ト 大 きくなる<br />
° 幅 の 広 いほ う が 符 号 な しで 幅 の 小 さいほ う が 符 号 付 きの 場 合 のみ 2 ビッ ト 大 きくなる<br />
• 代 入 前 に、 デス テ ィ ネーシ ョ ン 変 数 の 幅 に 基 づいて、 符 号 拡 張 、 ゼ ロ の 追 加 、 ま たは 切 り 捨 てが 実 行 さ れます。<br />
• オペラ ン ド の 符 号 に 関 わ らず、 差 は 符 号 付 き と し て 処 理 さ れます。<br />
乗 算<br />
[u]int#W::RType [u]int#W::operator * ([u]int#W op)<br />
• 2 つの 整 数 値 の 積 を 戻 し ます。<br />
• 積 の 幅 はオペラ ン ド の 幅 の 合 計 です。<br />
• オペラ ン ド のいずれかが 符 号 付 き であれば、 積 は 符 号 付 き と し て 処 理 さ れます。<br />
高 位 合 成 japan.xilinx.com 510<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
除 算<br />
[u]int#W::RType [u]int#W::operator / ([u]int#W op)<br />
• 2 つの 整 数 値 の 商 を 計 算 し ます。<br />
• 除 数 が 符 号 な し であ る 場 合 、 商 の 幅 は 被 除 数 の 幅 と な り 、 そ う でない 場 合 は、 商 の 幅 は 被 除 数 の 幅 に 1 を 足 した<br />
ものの 幅 となります。<br />
• オペラ ン ド のいずれかが 符 号 付 き であれば、 商 は 符 号 付 き と し て 処 理 さ れます。<br />
注 記 : 除 算 演 算 子 を Vivado HLS で 合 成 する と、 生 成 さ れた RTL に 適 切 にパラ メ ーター 設 定 されたザイ リ ン ク ス<br />
LogiCORE IP の 除 算 コ アがイ ン ス タ ンシエー ト されます。<br />
剰 余<br />
[u]int#W::RType [u]int#W::operator % ([u]int#W op)<br />
• 2 つの 整 数 値 の 整 数 除 算 の 余 り を 戻 し ます。<br />
• オペラ ン ド がど ち ら も 同 じ 符 号 であ る 場 合 は、 剰 余 の 幅 はオペラ ン ド の 幅 の 最 小 値 と な り ます。 除 数 が 符 号 な し、<br />
被 除 数 が 符 号 付 き の 場 合 は、 剰 余 の 幅 は 除 数 の 幅 に 1 を 足 したものと な り ます。<br />
• 除 数 が 符 号 な し、 被 除 数 が 符 号 付 き の 場 合 は、 剰 余 の 幅 は 除 数 の 幅 に 1 を 足 したものと な り ます。<br />
注 記 : 剰 余 (%) 演 算 子 を Vivado HLS で 合 成 する と、 生 成 さ れた RTL で 適 宜 パ ラ メ ーター 設 定 さ れたザ イ リ ン ク ス<br />
LogiCORE 除 算 コ アが イ ン ス タ ンシエー ト さ れます。<br />
ビ ッ ト 単 位 の 論 理 演 算 子<br />
ビ ッ ト 単 位 の 論 理 演 算 子 はすべて、 2 つのオペラ ン ド の 幅 の 最 大 値 と な る 幅 の 値 を 返 し、 両 方 のオペラ ン ド が 符 号 な<br />
し の 場 合 にのみ 符 号 な し と し て 処 理 さ れます。 そ う でない 場 合 は、 符 号 付 き と し て 処 理 さ れます。<br />
符 号 拡 張 (またはゼロの 追 加 ) は、 デステ ィ ネーシ ョ ン 変 数 ではな く 、 式 の 符 号 に 基 づいて 実 行 されます。<br />
ビット 単 位 の OR<br />
[u]int#W::RType [u]int#W::operator | ([u]int#W op)<br />
2 つのオペラ ン ド のビ ッ ト 単 位 の OR 値 を 返 し ます。<br />
ビット 単 位 の AND<br />
[u]int#W::RType [u]int#W::operator & ([u]int#W op)<br />
2 つのオペラ ン ド のビ ッ ト 単 位 の AND 値 を 返 します。<br />
ビット 単 位 の XOR<br />
[u]int#W::RType [u]int#W::operator ^ ([u]int#W op)<br />
2 つのオペラ ン ド のビ ッ ト 単 位 の XOR 値 を 返 します。<br />
シ フ ト 演 算 子<br />
各 シフ ト 演 算 子 には 2 つのバージ ョ ンがあ り 、 1 つは 符 号 な し の 右 辺 (RHS) オペラ ン ド、 も う 1 つは 符 号 付 き の RHS<br />
です。<br />
符 号 付 き RHS に 負 の 値 が 与 え られる と シフ ト 演 算 の 方 向 を 逆 にし ます。 た と えば、 RHS オペラ ン ド の 絶 対 値 に よ る<br />
シフ ト が 逆 の 方 向 で 発 生 し ます。<br />
シフ ト 演 算 子 は、 左 辺 (LHS) オペラ ン ド と 同 じ 幅 の 値 を 返 し ます。 C/C++ の 場 合 と 同 じ よ う に、 右 シフ ト の LHS オ<br />
ペラ ン ド が 符 号 付 き の 場 合 、 符 号 ビ ッ ト は、 LHS オペラ ン ド の 符 号 を 維 持 しつつ、 最 上 位 ビ ッ ト にコ ピーさ れます。<br />
高 位 合 成 japan.xilinx.com 511<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
符 号 な し 整 数 右 シ フ ト<br />
[u]int#W [u]int#W::operator >>(ap_uint op)<br />
整 数 右 シ フ ト<br />
[u]int#W [u]int#W::operator >>(ap_int op)<br />
符 号 な し 整 数 左 シ フ ト<br />
[u]int#W [u]int#W::operator
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
小 なり<br />
大 なり<br />
bool [u]int#W::operator < ([u]int#W op)<br />
bool [u]int#W::operator > ([u]int#W op)<br />
小 なり イ コール<br />
bool [u]int#W::operator = ([u]int#W op)<br />
ビット レベル 演 算 :サポー ト される 関 数<br />
[u]int#W 型 を 使 用 する と 変 数 を ビ ッ ト レベルの 精 度 で 計 算 する こ と がで き ます。 ビ ッ ト レベル 演 算 を 実 行 する には<br />
ハー ド ウ ェ ア アルゴ リ ズムを 使 用 するのが 最 適 である こ とがよ く あ り ます。 Vivado HLS では 次 のよ う な 関 数 が 提 供<br />
されています。<br />
ビット 操 作<br />
ap_[u]int 型 変 数 に 格 納 さ れてい る 値 に 基 づいて 一 般 的 なビ ッ ト レベル 演 算 を 行 う ために、 次 の メ ソ ッ ド が 提 供 されて<br />
います。<br />
長 さ<br />
apint_bitwidthof()<br />
int<br />
apint_bitwidthof(type_or_value)<br />
任 意 精 度 の 整 数 値 でビ ッ ト 数 を 示 す 整 数 値 を 戻 し ます。 1 つの 型 または 値 で 使 用 する こ と ができ ます。<br />
連 結<br />
int5 Var1, Res1;<br />
Var1= -1;<br />
Res1 = apint_bitwidthof(Var1); // Res1 is assigned 5<br />
Res1 = apint_bitwidthof(int7); // Res1 is assigned 7<br />
apint_concatenate()<br />
int#(N+M)<br />
apint_concatenate(int#N first, int#M second)<br />
2 つの [u]int#W 変 数 を 連 結 し ます。 返 された 値 の 幅 はオペラ ン ド の 幅 の 和 です。<br />
引 数 の 高 い 値 および 低 い 値 は、 それぞれ 結 果 の 高 位 および 低 位 ビ ッ ト にな り ます。<br />
推 奨 : 整 数 リ テ ラ ルを 含 むネ イ テ ィ ブ C 型 は、 予 期 し ない 結 果 を 避 け る ため、 連 結 前 に 該 当 する [u]int#W 型 に 明 示 的<br />
に 型 変 換 し ます。<br />
ビット 選 択<br />
apint_get_bit()<br />
高 位 合 成 japan.xilinx.com 513<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
int<br />
apint_get_bit(int#N source, int index)<br />
任 意 精 度 の 整 数 値 か ら 1 ビッ ト 選 択 し、 それを 戻 します。<br />
ソースは [u]int#W 型 、 イ ンデ ッ ク ス 引 数 は int 値 であ る 必 要 があ り ます。 選 択 する ビ ッ ト の 指 数 を 指 定 し、 最 下 位 ビ ッ<br />
トは 指 数 0 にな り ます。 最 大 指 数 は こ の [u]int#W のビッ ト 幅 から 1 を 引 いた 値 にな り ます。<br />
ビ ッ ト 値 の 設 定<br />
apint_set_bit()<br />
int#N<br />
apint_set_bit(int#N source, int index, int value)<br />
• [u]int#W インスタンス ソースの 指 定 ビ ッ ト 、 指 数 、 を 指 定 値 (0 または 1) に 設 定 し ます。<br />
範 囲 選 択<br />
apint_get_range()<br />
int#N<br />
apint_get_range(int#N source, int high, int low)<br />
• 引 数 で 指 定 さ れる ビ ッ ト の 範 囲 で 表 さ れる 値 を 戻 し ます。<br />
• 引 数 high は、 範 囲 内 の 最 上 位 ビ ッ ト (MSB) を 指 定<br />
• 引 数 low は 範 囲 内 の 最 下 位 ビ ッ ト (LSB) を 指 定<br />
• ソース 変 数 の LSB は 0 の 位 置 にあ り ます。 引 数 high の 値 が low の も の よ り 小 さ い 場 合 、 ビ ッ ト は 逆 順 で 返 さ れ<br />
ます。<br />
範 囲 値 設 定<br />
apint_set_range()<br />
int#N<br />
apint_set_range(int#N source, int high, int low, int#M part)<br />
• high と low 間 の ソース 指 定 ビ ッ ト を part の 値 に 設 定 し ます。<br />
ビット 低 減<br />
AND を 使 用 した 低 減<br />
apint_and_reduce()<br />
int<br />
apint_and_reduce(int#N value)<br />
• 値 のすべてのビ ッ ト に 対 し AND 演 算 を 適 用 し ます。<br />
• 整 数 値 と し て 単 一 ビ ッ ト の 結 果 値 を 戻 し ます (ブールに 型 変 換 可 能 )。<br />
int5 Var1, Res1;<br />
Var1= -1;<br />
Res1 = apint_and_reduce(Var1); // Res1 is assigned 1<br />
Var1= 1;<br />
Res1 = apint_and_reduce(Var1); // Res1 is assigned 0<br />
• -1 と 比 較 して、 次 を 戻 します。 一 致 すれば 1 不 一 致 の 場 合 は 0すべてのビ ッ ト が 1 である こ と をチェ ッ クする 方<br />
法 でも あ り ます。<br />
OR を 使 用 した 低 減<br />
apint_or_reduce()<br />
高 位 合 成 japan.xilinx.com 514<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
int<br />
apint_or_reduce(int#N value)<br />
• 値 のすべてのビ ッ ト に 対 し XOR 演 算 を 適 用 し ます。<br />
• 整 数 値 と し て 単 一 ビ ッ ト の 結 果 値 を 戻 し ます (ブールに 型 変 換 可 能 )。<br />
• この 演 算 は、 0 と 比 較 し て 一 致 すれば 0 を 返 し、 一 致 し なければ 1 を 戻 し ます。<br />
int5 Var1, Res1;<br />
Var1= 1;<br />
Res1 = apint_or_reduce(Var1); // Res1 is assigned 1<br />
Var1= 0;<br />
Res1 = apint_or_reduce(Var1); // Res1 is assigned 0<br />
XOR を 使 用 した 低 減<br />
apint_xor_reduce()<br />
int<br />
apint_xor_reduce(int#N value)<br />
• 値 のすべてのビ ッ ト に 対 し OR 演 算 を 適 用 し ます。<br />
• 整 数 値 と し て 単 一 ビ ッ ト の 結 果 値 を 戻 し ます (ブールに 型 変 換 可 能 )。<br />
• ワード 内 の 1 の 数 をカ ウ ン ト し、 次 を 戻 し ます。<br />
° 偶 数 の 場 合 は 0<br />
° 奇 数 ( 偶 数 パ リ テ ィ ) の 場 合 は 1<br />
int5 Var1, Res1;<br />
Var1= 0;<br />
Res1 = apint_xor_reduce(Var1); // Res1 is assigned 0<br />
Var1= 1;<br />
Res1 = apint_xor_reduce(Var1); // Res1 is assigned 1<br />
NAND を 使 用 した 低 減<br />
apint_nand_reduce()<br />
int<br />
apint_nand_reduce(int#N value)<br />
• 値 のすべてのビ ッ ト に 対 し NAND 演 算 を 適 用 し ます。<br />
• 整 数 値 と し て 単 一 ビ ッ ト の 結 果 値 を 戻 し ます (ブールに 型 変 換 可 能 )。<br />
• この 値 を -1 (すべて 1) と 比 較 し、 一 致 すれば false、 そうでなければ true を 返 し ます。<br />
int5 Var1, Res1;<br />
Var1= 1;<br />
Res1 = apint_nand_reduce(Var1); // Res1 is assigned 1<br />
Var1= -1;<br />
Res1 = apint_nand_reduce(Var1); // Res1 is assigned 0<br />
NOR を 使 用 した 低 減<br />
apint_nor_reduce()<br />
int<br />
apint_nor_reduce(int#N value)<br />
• 値 のすべてのビ ッ ト に 対 し NOR 演 算 を 適 用 し ます。<br />
高 位 合 成 japan.xilinx.com 515<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• 整 数 値 と し て 単 一 ビ ッ ト の 結 果 値 を 戻 し ます (ブールに 型 変 換 可 能 )。<br />
• この 値 を 0 (すべて 0) と 比 較 し、 一 致 すれば true、 そうでなければ false を 返 します。<br />
int5 Var1, Res1;<br />
Var1= 0;<br />
Res1 = apint_nor_reduce(Var1); // Res1 is assigned 1<br />
Var1= 1;<br />
Res1 = apint_nor_reduce(Var1); // Res1 is assigned 0<br />
XNOR を 使 用 した 低 減<br />
apint_xnor_reduce()<br />
int<br />
apint_xnor_reduce(int#N value)<br />
• 値 のすべてのビ ッ ト に 対 し XNOR 演 算 を 適 用 し ます。<br />
• 整 数 値 と し て 単 一 ビ ッ ト の 結 果 値 を 戻 し ます (ブールに 型 変 換 可 能 )。<br />
• ワード 内 の 1 の 数 をカ ウ ン ト し、<br />
• 次 を 戻 します。<br />
° 奇 数 の 場 合 は 1<br />
° 偶 数 ( 奇 数 パ リ テ ィ ) の 場 合 は 0<br />
int5 Var1, Res1;<br />
Var1= 0;<br />
Res1 = apint_xnor_reduce(Var1); // Res1 is assigned 1<br />
Var1= 1;<br />
Res1 = apint_xnor_reduce(Var1); // Res1 is assigned 0<br />
高 位 合 成 japan.xilinx.com 516<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
C++ の 任 意 精 度 型<br />
Vivado HLS では、 ソ フ ト ウ ェア とハード ウ ェア モデ リ ング 間 での 一 貫 し た、 ビ ッ ト 精 度 の 動 作 で、 任 意 精 度 (または<br />
ビッ ト 精 度 ) の 整 数 データ 型 を イ ンプ リ メ ン ト する ap_[u]int という C++ のテンプレート クラスが 提 供 されていま<br />
す。<br />
このクラスは、 ネイティブ C 整 数 型 で 使 用 可 能 なすべての 四 則 演 算 、 ビ ッ ト 単 位 、 論 理 、 関 係 演 算 子 を 提 供 し ていま<br />
す。 さ ら に、64 ビ ッ ト よ り も 幅 が 広 い 変 数 の 初 期 化 および 変 換 を 可 能 にするハー ド ウ ェ ア 演 算 の 一 部 を 処 理 する ため<br />
の メ ソ ッ ド も、 こ の ク ラ スで 提 供 し ています。 演 算 子 および ク ラ ス メ ソ ッ ド の 詳 細 は 次 を 参 照 し て く だ さ い。<br />
ap_[u]int 型 のコ ンパイル<br />
ap_[u]int ク ラ ス を 使 用 する には、 ap_[u]int 変 数 を 参 照 する ソース ファイルすべてに ap_int.h ヘッダー ファイ<br />
ルを 含 める 必 要 があ り ます。<br />
こ れ ら の ク ラ ス を 使 用 する ソ フ ト ウ ェ ア モデルを コ ンパイルする と き、 Vivado HLS のヘッ ダー ファイルの 場 所 を 指<br />
定 する 必 要 があ る 場 合 があ り ます。 た と えば、 gcc コンパイルには -I//include オプシ ョ ン を 追 加 する な<br />
どします。<br />
ヒント : g++ -O3 オプシ ョ ンを 使 用 してコンパイルする 場 合 には、 ソ フ ト ウエア モデルで 最 高 のパフ ォーマン スにな<br />
ります。<br />
ap_[u] 変 数 の 宣 言 / 定 義<br />
次 の よ う にそれぞれ 符 号 付 きおよび 符 号 な し の ク ラ スが 別 々にあ り ます。<br />
• ap_int ( 符 号 付 き)<br />
• ap_uint ( 符 号 な し)<br />
テンプレート パラ メーターの int_W は 宣 言 さ れてい る 変 数 の 合 計 幅 を 指 定 し ます。<br />
次 の 例 にあ る よ う に、 C/C++ の typedef 文 を 使 用 し てユーザー 定 義 型 を 作 成 する こ と がで き ます。<br />
include “ap_int.h”//<br />
typedef ap_uint uint128_t;<br />
ap_int my_wide_var;<br />
use ap_[u]fixed types<br />
// 128-bit user defined type<br />
// a global variable declaration<br />
デフ ォル ト の 幅 の 最 大 許 容 幅 は 1024 ビ ッ ト です。 こ のデフ ォル ト は、 ap_int.h ヘッダー ファイルを 含 める 前 に、<br />
32768 以 下 の 正 の 整 数 値 でマ ク ロ AP_INT_MAX_W を 定 義 する と 上 書 きする こ と がで き ます。<br />
注 意 : AP_INT_MAX_W の 値 を あ ま り 高 く 設 定 する と 、ソ フ ト ウ ェ アの コ ンパイルおよび 実 行 に 時 間 がかか る 可 能 性 が<br />
あります。<br />
次 は AP_INT_MAX_W を 上 書 きする 例 です。<br />
#define AP_INT_MAX_W 4096<br />
#include “ap_int.h”<br />
// Must be defined before next line<br />
ap_int very_wide_var;<br />
高 位 合 成 japan.xilinx.com 517<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
定 数 ( リテラル) からの 初 期 化 および 代 入<br />
クラス コ ン ス ト ラ ク ターおよび 代 入 演 算 子 のオーバーロー ド を 利 用 し、 標 準 C/C++ の 整 数 リ テ ラルを 使 用 し て<br />
ap_[u]fixed 変 数 を 初 期 化 および 代 入 する こ と がで き ます。<br />
しかし、 この ap_[u]fixed 変 数 への 値 の 代 入 方 法 は、 C++ およびソフ ト ウェアが 実 行 されるシステムの 制 限 の 対 象<br />
と な る ので、 通 常 、 整 数 リ テ ラ ルの 64 ビッ ト 制 限 (LL または ULL 接 頭 辞 など) の 影 響 を 受 けます。<br />
ap_[u]fixed ク ラ スでは、 任 意 の 長 さ ( 変 数 の 幅 以 下 の も の) の 文 字 列 か ら 初 期 化 が 可 能 な コ ン ス ト ラ ク タ が 提 供 さ れ<br />
ています。<br />
デフ ォル ト では、 文 字 列 に 有 効 な 16 進 数 (0 から 9 までの 数 字 および a から f の 文 字 ) のみが 含 まれている 限 り 、 文<br />
字 列 は 16 進 数 値 と し て 処 理 さ れます。 その よ う な 文 字 列 か ら 値 を 代 入 する には、 文 字 列 を 該 当 する 型 へ と 、 明 示 的<br />
に C++ 形 式 の 型 変 換 を 行 う 必 要 があ り ます。<br />
64 ビ ッ ト よ り も 大 き な 値 を 含 む 初 期 化 および 代 入 の 例 は 次 の と お り です。<br />
ap_int a_42b_var(-1424692392255LL);<br />
a_42b_var = 0x14BB648B13FLL;<br />
// long long decimal format<br />
// hexadecimal format<br />
a_42b_var = -1;<br />
// negative int literal sign-extended to full width<br />
ap_uint wide_var(“76543210fedcba9876543210”);<br />
wide_var = ap_int(“0123456789abcdef01234567”);<br />
// Greater than 64-bit<br />
ap_[u] コンスト ラクタは、 基 数 2、 8、 10、 または 16 で 数 値 を 表 わ し て 文 字 を 処 理 する よ う に 明 示 的 に 指 定 する こ<br />
と がで き ます。 コ ン ス ト ラ ク タ の 呼 び 出 し に 2 番 目 のパ ラ メ ーター と し て 該 当 する 基 数 値 を 追 加 する と 、 こ の 設 定 が<br />
できます。<br />
指 定 さ れてい る 基 数 に 対 し て 無 効 な 文 字 が 文 字 リ テ ラ ルに 含 まれてい る と 、 コ ンパイル エ ラーが 発 生 し ます。<br />
それぞれの 基 数 フ ォーマッ ト の 例 は 次 の とお り です。<br />
ap_int a_6bit_var(“101010”, 2);<br />
a_6bit_var = ap_int(“40”, 8);<br />
a_6bit_var = ap_int(“55”, 10);<br />
a_6bit_var = ap_int(“2A”, 16);<br />
a_6bit_var = ap_int(“42”, 2);<br />
// 42d in binary format<br />
// 32d in octal format<br />
// decimal format<br />
// 42d in hexadecimal format<br />
// COMPILE-TIME ERROR!“42” is not binary<br />
文 字 列 でエン コー ド さ れてい る 基 数 は、 「0」 の 後 に 「b」、 「o」、 または 「x」 を 続 けた 接 頭 辞 を 付 け る と 、 コ ン ス ト<br />
ラ ク タ で 自 動 推 論 する こ と も で き ます。 「0b」、 「0o」、 および 「0x」 と い う 接 頭 辞 はそれぞれ 2 進 数 、 8 進 数 、 16 進 数<br />
のフ ォーマ ッ ト に 対 応 し ています。<br />
こ の 初 期 化 文 字 列 フ ォーマ ッ ト を 使 用 し た 例 は 次 の と お り です。<br />
ap_int a_6bit_var(“0b101010”, 2);<br />
a_6bit_var = ap_int(“0o40”, 8);<br />
a_6bit_var = ap_int(“0x2A”, 16);<br />
a_6bit_var = ap_int(“0b42”, 2);<br />
// 42d in binary format<br />
// 32d in octal format<br />
// 42d in hexidecimal format<br />
// COMPILE-TIME ERROR!“42” is not binary<br />
ビッ ト 幅 が 53 ビ ッ ト を 超 え る 場 合 、 ap_[u]fixed 値 は 次 の よ う に 文 字 列 で 初 期 化 する 必 要 があ り ます。<br />
ap_ufixed Val(“2460508560057040035.375”);<br />
コンソール I/O ( 出 力 ) のサポー ト<br />
ap_[u]fixed 変 数 の 初 期 化 および 代 入 の 場 合 と 同 様 に、 Vivado HLS では 64 ビッ トよりも 大 きな 値 の 出 力 をサポート<br />
する ための 機 能 が 提 供 さ れています。<br />
高 位 合 成 japan.xilinx.com 518<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
C++ の 標 準 出 力 ス ト リ ームの 使 用<br />
ap_[u]int 変 数 に 格 納 さ れてい る 値 を 出 力 する のに 最 も 簡 単 な 方 法 は、 次 の C++ の 標 準 出 力 ス ト リ ームのいずれかを 使<br />
用 する 方 法 です。<br />
• std::cout (#include )<br />
• std::cout (#include )<br />
ス ト リ ーム 挿 入 演 算 子
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
printf(“%s\n”, Val.to_string(10).c_str()); // => “-2342818482890329542128”<br />
printf(“%s\n”, Val.to_string(8).c_str()); // => “401773345651416625031020”<br />
printf(“%s\n”, Val.to_string(16, true).c_str()); // => “-7F0123456789ABCDF0”<br />
ap_[u] 型 を 使 用 した 式<br />
ap_[u] 型 の 変 数 は、 通 常 C/C++ 演 算 子 を 使 用 し た 式 では 自 由 に 使 用 する こ と がで き ます。 し か し、 一 部 には 予 期 し<br />
ない 動 作 が 見 られる こ とがあ り ます。 これについては、 次 を 参 照 して く ださい。<br />
ビ ッ ト 幅 が 小 さ い 値 を 幅 が 大 きい ものへ 代 入 する 場 合 のゼロまたは 符 号 拡 張<br />
ビ ッ ト 幅 が 小 さ い 符 号 付 き (ap_int) 変 数 の 値 を 幅 の 大 き な も のへ 代 入 する と 、 符 号 に 関 わ らず、 値 はデス テ ィ ネー<br />
ション 変 数 ( 幅 の 大 きい 変 数 ) の 幅 に 符 号 拡 張 さ れます。<br />
同 様 に、 符 号 な し のビ ッ ト 幅 の 小 さ い 変 数 は 代 入 前 にゼ ロ 拡 張 さ れます。<br />
代 入 で 予 期 動 作 を 得 る には、 ソース 変 数 の 明 示 的 な 型 変 換 が 必 要 にな る こ と があ り ます。 次 に 例 を 示 し ます。<br />
ap_uint Result;<br />
ap_int Val1 = 0x7f;<br />
ap_uint Val2 = 0x3f;<br />
Result = Val1;<br />
Result = Val2;<br />
Result = ap_uint(Val1);<br />
Result = ap_int(Val2);<br />
// Yields:0x3ff (sign-extended)<br />
// Yields:0x03f (zero-padded)<br />
// Yields:0x07f (zero-padded)<br />
// Yields:0x3ff (sign-extended)<br />
ビ ッ ト 幅 が 大 きい 値 を 幅 が 小 さ い ものへ 代 入 する 場 合 の 切 り 捨 て<br />
ビ ッ ト 幅 が 大 きいソース 変 数 値 を 幅 の 小 さ な ものへ 代 入 する と、 値 が 切 り 捨 て られ、 デステ ィ ネーシ ョ ン 値 ( 幅 の 小<br />
さいほうの 値 ) の 最 上 位 ビ ッ ト (MSB) を 超 えたビ ッ ト はすべて 失 われます。<br />
こ の 切 り 捨 てが 行 われる と き、 符 号 情 報 が 特 別 に 処 理 さ れる わけではないので、 予 期 し ない 動 作 が 見 られる 可 能 性 が<br />
あ り ます。 予 期 し ない 動 作 を 防 ぐには、 明 示 的 な 型 変 換 を 利 用 し ます。<br />
ク ラ ス 演 算 子 および メ ソ ッ ド<br />
ap_[u]int 型 では、wide ap_[u]int (> 64 ビッ ト) からビルト イン C/C++ 整 数 型 への 暗 示 的 な 変 換 はサポー ト さ れません。<br />
た と えば、 次 の コー ド 例 の 場 合 、 ap_int[65] から if 文 内 の bool 型 への 暗 示 的 なキ ャ ス ト で 0 が 戻 されるので、 戻 り 値<br />
は 1 にな り ます。<br />
bool nonzero(ap_uint data) {<br />
return data; // This leads to implicit truncation to 64b int<br />
}<br />
int main() {<br />
if (nonzero((ap_uint)1
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
幅 の 大 きい ap_[u]int 型 を ビル ト イ ンの 整 数 へ 変 換 する には、 ap_[u]int に 含 まれる 次 の 明 示 的 な 変 換 関 数 を 使 用 し ま<br />
す。<br />
• to_int()<br />
• to_long()<br />
• to_bool()<br />
通 常 、 ネ イ テ ィ ブの C/C++ 整 数 データ 型 で 実 行 可 能 な 有 効 な 演 算 は、 演 算 子 をオーバーロー ド する こ と で、 ap_[u]int<br />
型 でサポー ト されています。<br />
オーバーロー ド さ れた 演 算 子 に 加 え、 一 部 の 特 定 演 算 子 および メ ソ ッ ド を 使 用 し てビ ッ ト レベルの 演 算 を 簡 単 にする<br />
ことができます。<br />
2 進 数 の 演 算 子<br />
任 意 精 度 演 算 を 行 う ため、 標 準 2 進 数 整 数 演 算 子 がオーバーロー ド さ れます。 次 の 演 算 子 では 次 のいずれかが 使 用 さ<br />
れます。<br />
• ap_[u]int の 2 つのオペラ ン ド<br />
• ap_[u]int 型 を 1 つと C/C++ 整 数 データ 型 1 つ<br />
次 に 例 を 示 し ます。<br />
• char<br />
• short<br />
• int<br />
結 果 値 の 幅 および 符 号 は、 デス テ ィ ネーシ ョ ン 変 数 (または 式 ) の 幅 に 基 づいて 符 号 拡 張 、 ゼ ロ の 追 加 、 ま たは 切 り 捨<br />
てが 実 行 さ れる 前 に、 オペラ ン ド の 幅 および 符 号 で 決 ま り ます。 返 さ れる 値 の 詳 細 は 各 演 算 子 で 説 明 さ れています。<br />
式 に ap_[u]int 型 および C/C++ 整 数 型 の 両 方 が 含 まれてい る 場 合 、 C++ 型 では 次 の 幅 が 使 用 されます。<br />
• char (8 ビット)<br />
• short (16 ビッ ト)<br />
• int (32 ビッ ト)<br />
• long (32 ビッ ト)<br />
• long long (64 ビッ ト)<br />
加 算<br />
ap_(u)int::RType ap_(u)int::operator + (ap_(u)int op)<br />
次 の 和 が 戻 されます。<br />
• ap_[u]int を 2 つ<br />
• ap_[u]int 1 つと C/C++ 整 数 データ 型<br />
和 の 幅 は、 次 のいずれかのよ う にな り ます。<br />
• 2 つのオペラ ン ド の 幅 の 大 きいほ う よ り も 1 ビッ ト 大 きくなる<br />
• 幅 の 広 いほ う が 符 号 な しで 幅 の 小 さいほ う が 符 号 付 きの 場 合 のみ 2 ビッ ト 大 きくなる<br />
オペラ ン ド のいずれか (または 両 方 ) が 符 号 付 き であれば、 和 は 符 号 付 き と し て 処 理 さ れる<br />
高 位 合 成 japan.xilinx.com 521<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
減 算<br />
ap_(u)int::RType ap_(u)int::operator - (ap_(u)int op)<br />
2 つの 整 数 の 差 を 計 算 する 式 です。<br />
相 違 値 の 幅 は、 次 の よ う にな り ます。<br />
• 2 つのオペラ ン ド の 幅 の 大 きいほ う よ り も 1 ビッ ト 大 きくなる<br />
• 幅 の 広 いほ う が 符 号 な しで 幅 の 小 さいほ う が 符 号 付 きの 場 合 のみ 2 ビッ ト 大 きくなる<br />
代 入 前 に、 デス テ ィ ネーシ ョ ン 変 数 の 幅 に 基 づいて、 符 号 拡 張 、 ゼ ロ の 追 加 、 ま たは 切 り 捨 てが 実 行 さ れます。<br />
オペラ ン ド の 符 号 に 関 わ らず、 差 は 符 号 付 き と し て 処 理 さ れます。<br />
乗 算<br />
ap_(u)int::RType ap_(u)int::operator * (ap_(u)int op)<br />
2 つの 整 数 値 の 積 を 戻 し ます。<br />
積 の 幅 はオペラ ン ド の 幅 の 合 計 です。<br />
オペラ ン ド のいずれかが 符 号 付 き であれば、 積 は 符 号 付 き と し て 処 理 さ れます。<br />
除 算<br />
ap_(u)int::RType ap_(u)int::operator / (ap_(u)int op)<br />
2 つの 整 数 値 の 商 を 計 算 し ます。<br />
除 数 が 符 号 な し であ る 場 合 、 商 の 幅 は 被 除 数 の 幅 と な り 、 そ う でない 場 合 は、 商 の 幅 は 被 除 数 の 幅 に 1 を 足 したもの<br />
の 幅 と な り ます。<br />
オペラ ン ド のいずれかが 符 号 付 き であれば、 商 は 符 号 付 き と し て 処 理 さ れます。<br />
重 要 : 除 算 演 算 子 を Vivado HLS で 合 成 する と、 生 成 された RTL で 適 宜 パラ メ ーター 設 定 されたザイ リ ン ク ス<br />
LogiCORE 除 算 コ アが イ ン ス タ ンシエー ト さ れます。<br />
剰 余<br />
ap_(u)int::RType ap_(u)int::operator % (ap_(u)int op)<br />
2 つの 整 数 値 の 整 数 除 算 の 余 り を 戻 し ます。<br />
剰 余 と オペラ ン ド 両 方 に 同 じ 符 号 が 付 いてい る 場 合 、 剰 余 の 幅 は、 オペラ ン ド の 幅 の 最 小 値 です。<br />
オペラ ン ド がど ち ら も 同 じ 符 号 であ る 場 合 は、 剰 余 の 幅 はオペラ ン ド の 幅 の 最 小 値 と な り ます。<br />
除 数 が 符 号 な し、 被 除 数 が 符 号 付 き の 場 合 は、 剰 余 の 幅 は 除 数 の 幅 に 1 を 足 したものと な り ます。<br />
重 要 : 剰 余 (%) 演 算 子 を Vivado HLS で 合 成 する と、 生 成 さ れた RTL で 適 宜 パ ラ メ ーター 設 定 さ れたザ イ リ ン ク ス<br />
LogiCORE 除 算 コ アが イ ン ス タ ンシエー ト さ れます。<br />
次 は、 演 算 子 の 例 です。<br />
ap_uint Rslt;<br />
ap_uint Val1 = 5;<br />
高 位 合 成 japan.xilinx.com 522<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ap_int Val2 = -8;<br />
Rslt = Val1 + Val2;<br />
Rslt = Val1 - Val2;<br />
Rslt = Val1 * Val2;<br />
Rslt = 50 / Val2;<br />
Rslt = 50 % Val2;<br />
// Yields:-3 (43 bits) sign-extended to 71 bits<br />
// Yields:+3 sign extended to 71 bits<br />
// Yields:-40 (65 bits) sign extended to 71 bits<br />
// Yields:-6 (33 bits) sign extended to 71 bits<br />
// Yields:+2 (23 bits) sign extended to 71 bits<br />
ビ ッ ト 単 位 の 論 理 演 算 子<br />
ビ ッ ト 単 位 の 論 理 演 算 子 はすべて、 2 つのオペラ ン ド の 幅 の 最 大 値 と な る 幅 の 値 を 戻 し、 両 方 のオペラ ン ド が 符 号 な<br />
し の 場 合 にのみ 符 号 な し と し て 処 理 さ れます。 そ う でない 場 合 は、 符 号 付 き と し て 処 理 さ れます。<br />
符 号 拡 張 (またはゼロの 追 加 ) は、 デステ ィ ネーシ ョ ン 変 数 ではな く 、 式 の 符 号 に 基 づいて 実 行 されます。<br />
ビット 単 位 の OR<br />
ap_(u)int::RType ap_(u)int::operator | (ap_(u)int op)<br />
2 つのオペラ ン ド のビ ッ ト 単 位 の OR 値 を 戻 し ます。<br />
ビット 単 位 の AND<br />
ap_(u)int::RType ap_(u)int::operator & (ap_(u)int op)<br />
2 つのオペラ ン ド のビ ッ ト 単 位 の AND 値 を 戻 します。<br />
ビット 単 位 の XOR<br />
ap_(u)int::RType ap_(u)int::operator ^ (ap_(u)int op)<br />
2 つのオペラ ン ド のビ ッ ト 単 位 の XOR 値 を 戻 します。<br />
単 項 演 算 子<br />
加 算<br />
ap_(u)int ap_(u)int::operator + ()<br />
ap_[u]int オペラ ン ド のセルフ コピーを 戻 します。<br />
減 算<br />
ap_(u)int::RType ap_(u)int::operator - ()<br />
次 が 戻 されます。<br />
• 符 号 付 き の 場 合 は 同 じ 幅 でオペラ ン ド のネゲー ト さ れた 値 を 戻 し、<br />
• 符 号 な し の 場 合 はその 幅 に 1 を 足 した 値 を 戻 します。<br />
戻 り 値 は 常 に 符 号 付 き です。<br />
ビ ッ ト 単 位 の 逆<br />
ap_(u)int::RType ap_(u)int::operator ~ ()<br />
同 じ 幅 および 符 号 で、 オペラ ン ド のビ ッ ト 単 位 の 逆 (NOT) を 戻 します。<br />
高 位 合 成 japan.xilinx.com 523<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
論 理 の 反 転<br />
bool ap_(u)int::operator !()<br />
オペラ ン ド がゼロ (0) ではない 場 合 はブール 形 式 の false を 戻 し ます。<br />
オペラ ン ド がゼロ (0) の 場 合 は true を 戻 し ます。<br />
シ フ ト 演 算 子<br />
各 シフ ト 演 算 子 には 次 の 2 つのバージ ョ ンがあ り ます。<br />
• 符 号 な し の 右 辺 (RHS) オペラ ン ド<br />
• 符 号 付 き の 右 辺 (RHS) オペラ ン ド<br />
符 号 付 き RHS に 負 の 値 が 与 え られる と シフ ト 演 算 の 方 向 が 逆 にな り ます。 た と えば、 RHS オペラ ン ド の 絶 対 値 に よ<br />
る シフ ト が 逆 の 方 向 で 発 生 し ます。<br />
シフ ト 演 算 子 は、 左 辺 (LHS) オペラ ン ド と 同 じ 幅 の 値 を 戻 し ます。 C/C++ の 場 合 と 同 じ よ う に、 右 シフ ト の LHS オ<br />
ペラ ン ド が 符 号 付 き の 場 合 、 符 号 ビ ッ ト は、 LHS オペラ ン ド の 符 号 を 維 持 しつつ、 最 上 位 ビ ッ ト にコ ピーさ れます。<br />
符 号 な し 整 数 右 シ フ ト<br />
ap_(u)int ap_(u)int::operator (ap_uint op)<br />
整 数 左 シ フ ト<br />
ap_(u)int ap_(u)int::operator >> (ap_int op)<br />
注 意 : 左 シフ ト 演 算 子 の 結 果 を 幅 が 広 いほ う のデス テ ィ ネーシ ョ ン 変 数 に 代 入 する と 、 情 報 の 一 部 ま たはすべてが 失<br />
われる 場 合 があ り ますので 注 意 し て く だ さ い。 予 期 し ない 動 作 を 防 ぐ には、 シ フ ト 式 を 代 入 さ れるほ う の 型 に 明 示 的<br />
に 型 変 換 する よ う に し て く だ さ い。<br />
次 は、 シフ ト 演 算 の 例 です。<br />
ap_uint Rslt;<br />
ap_uint Val1 = 0x41;<br />
Rslt = Val1 4;<br />
// Yields:0x0040, i.e. msb of Val1 is lost<br />
// Yields:0x1040, no info lost<br />
//Yields:0x1ffc, sign is maintained and extended<br />
複 合 代 入 演 算 子<br />
Vivado HLS では、 次 の 複 合 演 算 子 がサポー ト さ れています。<br />
• *=<br />
高 位 合 成 japan.xilinx.com 524<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• /=<br />
• %=<br />
• +=<br />
• -=<br />
• =<br />
• &=<br />
• ^=<br />
• |=<br />
RHS 式 はまず 求 めてか ら、 基 本 演 算 子 に RHS オペラ ン ド と し て 与 え られ、 LHS 変 数 に 結 果 が 代 入 さ れます。 式 の 長<br />
さ、 符 号 、 符 号 拡 張 か 切 り 捨 てかのルールは、 関 連 する 演 算 に 対 し 上 記 で 説 明 さ れてい る よ う に、 適 用 さ れます。<br />
ap_uint Val1 = 630;<br />
ap_int Val2 = -3;<br />
ap_uint Val3 = 27;<br />
Val1 += Val2 - Val3;<br />
// Yields:600 and is equivalent to:<br />
// Val1 = ap_uint(ap_int(Val1) +<br />
// ap_int((ap_int(Val2) -<br />
// ap_int(Val3))));<br />
例 4‐1 : 複 合 代 入 文<br />
インクリメントおよびデクリメント 演 算 子<br />
イ ン ク リ メ ン ト およびデ ク リ メ ン ト の 演 算 子 が 提 供 さ れています。 オペラ ン ド と 同 じ 幅 の 値 を 返 し ますが、 両 方 のオ<br />
ペラ ン ド が 符 号 な し の 場 合 のみ 値 は 符 号 な し で、 そ う でない 場 合 は、 符 号 付 き です。<br />
プリインクリメント<br />
ap_(u)int& ap_(u)int::operator ++ ()<br />
オペラ ン ド のイ ン ク リ メ ン ト された 値 を 戻 し ます。<br />
その イ ン ク リ メ ン ト さ れた 値 をオペラ ン ド に 代 入 し ます。<br />
ポス ト インク リ メ ン ト<br />
const ap_(u)int ap_(u)int::operator ++ (int)<br />
イ ン ク リ メ ン ト された 値 をオペラ ン ド 変 数 に 代 入 する 前 に、 オペラ ン ド の 値 を 戻 し ます。<br />
プレデクリ メント<br />
ap_(u)int& ap_(u)int::operator -- ()<br />
オペラ ン ド のデク リ メ ン ト された 値 を 戻 し て、 その 値 をオペラ ン ド に 代 入 し ます。<br />
ポス トデク リ メ ン ト<br />
const ap_(u)int ap_(u)int::operator -- (int)<br />
デ ク リ メ ン ト さ れた 値 をオペラ ン ド 変 数 に 代 入 する 前 に、 オペラ ン ド の 値 を 戻 し ます。<br />
高 位 合 成 japan.xilinx.com 525<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
関 係 演 算 子<br />
Vivado HLS では、 すべての 関 係 演 算 子 がサポー ト されてお り 、 比 較 結 果 に 基 づいてブール 形 式 の 値 が 返 されます。<br />
ap_[u]int 型 の 変 数 は、 こ れら の 演 算 子 を 使 用 し て C/C++ 基 本 整 数 型 と 比 較 する こ と がで き ます。<br />
等 号<br />
bool ap_(u)int::operator == (ap_(u)int op)<br />
等 号 否 定<br />
小 なり<br />
大 なり<br />
bool ap_(u)int::operator != (ap_(u)int op)<br />
bool ap_(u)int::operator < (ap_(u)int op)<br />
bool ap_(u)int::operator > (ap_(u)int op)<br />
小 なり イ コール<br />
bool ap_(u)int::operator = (ap_(u)int op)<br />
その 他 のク ラ ス メソッドおよび 演 算 子<br />
次 のセ ク シ ョ ンでは、 ク ラ ス メ ソ ッ ド および 演 算 子 について 説 明 し ます。<br />
ビット レベル 演 算<br />
次 の メ ソ ッ ド を 使 用 する と、 ap_[u]int 型 変 数 に 格 納 さ れてい る 値 に 基 づいて 一 般 的 なビ ッ ト レベル 演 算 が 行 われま<br />
す。<br />
長 さ<br />
int ap_(u)int::length ()<br />
こ の メ ソ ッ ド は 整 数 値 を 戻 し、 ap_[u]int 変 数 でのビ ッ ト 合 計 を 出 力 し ます。<br />
連 結<br />
ap_concat_ref ap_(u)int::concat (ap_(u)int low)<br />
ap_concat_ref ap_(u)int::operator , (ap_(u)int high, ap_(u)int low)<br />
2 つの ap_[u]int 変 数 を 連 結 し ます。 返 された 値 の 幅 はオペラ ン ド の 幅 の 和 です。<br />
high および low の 引 数 にはそれぞれ 結 果 値 の 高 位 ビ ッ ト または 下 位 ビ ッ ト が 出 力 されます。 concat() メソッドの 場 合<br />
は 下 位 ビ ッ ト が 出 力 されます。<br />
オーバーロー ド さ れたカ ンマ 演 算 子 を 使 用 する と きは 括 弧 が 必 要 です。 カ ンマ 演 算 子 バージ ョ ンが 代 入 の LHS に 現<br />
れるこ と もあり ます。<br />
高 位 合 成 japan.xilinx.com 526<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
推 奨 : 整 数 リ テ ラ ルを 含 む C/C++ ネ イ テ ィ ブ 型 は、 予 期 し ない 結 果 を 避 け る ため、 連 結 前 に 該 当 する ap_[u]int 型 に<br />
明 示 的 に 型 変 換 し ます。<br />
ap_uint Rslt;<br />
ap_int Val1 = -3;<br />
ap_int Val2 = 54;<br />
Rslt = (Val2, Val1); // Yields:0x1B5<br />
Rslt = Val1.concat(Val2); // Yields:0x2B6<br />
(Val1, Val2) = 0xAB; // Yields:Val1 == 1, Val2 == 43<br />
ビット 選 択<br />
例 4‐2 : 連 結 の 例<br />
ap_bit_ref ap_(u)int::operator [] (int bit)<br />
任 意 精 度 の 整 数 値 か ら 1 ビッ ト 選 択 し、 それを 返 します。<br />
戻 さ れた 値 は 参 照 値 で、 こ の ap_[u]int での 対 応 ビ ッ ト を 設 定 ま たは 消 去 する ために 使 用 し ます。<br />
bit 引 数 は int 値 であ る 必 要 があ り ます。 選 択 する ビ ッ ト の 指 数 を 指 定 し、 最 下 位 ビ ッ ト は 指 数 0 にな り ます。 最 高 指<br />
数 はこ の ap_[u]int のビッ ト 幅 から 1 を 引 いた 値 にな り ます。<br />
ap_bit_ref はビッ ト で 指 定 されている この ap_[u]int インスタンスの 1 ビッ トへの 参 照 を 表 してします。<br />
範 囲 選 択<br />
ap_range_ref ap_(u)int::range (unsigned Hi, unsigned Lo)<br />
ap_range_ref ap_(u)int::operator () (unsigned Hi, unsigned Lo)<br />
引 数 で 指 定 さ れる ビ ッ ト の 範 囲 で 表 さ れる 値 を 戻 し ます。<br />
引 数 Hi は、 範 囲 内 の 最 上 位 ビ ッ ト (MSB) を、 Lo は 最 下 位 ビ ッ ト (LSB) を 指 定 し ます。<br />
ソース 変 数 の LSB は 0 の 位 置 にあ り ます。 引 数 Hi の 値 が Lo の も の よ り 小 さ い 場 合 、 ビ ッ ト は 逆 順 で 戻 さ れます。<br />
ap_uint Rslt;<br />
ap_uint Val1 = 0x5f;<br />
ap_uint Val2 = 0xaa;<br />
Rslt = Val1.range(3, 0);<br />
Val1(3,0) = Val2(3, 0);<br />
Val1(4,1) = Val2(4, 1);<br />
Rslt = Val1.range(4, 7);<br />
// Yields:0xF<br />
// Yields:0x5A<br />
// Yields:0x55<br />
// Yields:0xA; bit-reversed!<br />
例 4‐3 : 範 囲 選 択 の 例<br />
AND を 使 用 した 低 減<br />
bool ap_(u)int::and_reduce ()<br />
• ap_(u)int で、 すべてのビ ッ ト に 対 し AND 演 算 を 使 用 し ます。<br />
• 結 果 値 をシングル ビットで 戻 します。<br />
• この 値 を -1 (すべて 1) と 比 較 し、 一 致 すれば true、 そうでなければ false を 戻 し ます。<br />
高 位 合 成 japan.xilinx.com 527<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
OR を 使 用 した 低 減<br />
bool ap_(u)int::or_reduce ()<br />
• ap_(u)int で、 すべてのビ ッ ト に 対 し OR 演 算 を 使 用 し ます。<br />
• 結 果 値 をシングル ビットで 戻 します。<br />
• この 値 を 0 (すべて 0) と 比 較 し、 一 致 すれば false、 そうでなければ true を 戻 します。<br />
XOR を 使 用 した 低 減<br />
bool ap_(u)int::xor_reduce ()<br />
• この ap_int のすべてのビ ッ ト に 対 し XOR 演 算 を 使 用 し ます。<br />
• 結 果 値 をシングル ビットで 戻 します。<br />
• これは、 この 値 の 1 ビッ トの 数 をカウントするのと 同 じで、 カウント 数 が 偶 数 であれば false、 奇 数 であれば true<br />
を 戻 します。<br />
NAND を 使 用 した 低 減<br />
bool ap_(u)int::nand_reduce ()<br />
• この ap_int のすべてのビ ッ ト に 対 し NAND 演 算 を 使 用 し ます。<br />
• 結 果 値 をシングル ビットで 戻 します。<br />
• この 値 を -1 (すべて 1) と 比 較 し、 一 致 すれば false、 そうでなければ true を 戻 し ます。<br />
NOR を 使 用 した 低 減<br />
bool ap_int::nor_reduce ()<br />
• この ap_int のすべてのビ ッ ト に 対 し NOR 演 算 を 使 用 し ます。<br />
• 結 果 値 をシングル ビットで 戻 します。<br />
• この 値 を 0 (すべて 0) と 比 較 し、 一 致 すれば true、 そうでなければ false を 戻 します。<br />
XNOR を 使 用 した 低 減<br />
bool ap_(u)int::xnor_reduce ()<br />
• ap_(u)int で、 すべてのビ ッ ト に 対 し XNOR 演 算 を 使 用 し ます。<br />
• 結 果 値 をシングル ビットで 戻 します。<br />
• これは、 この 値 の 1 ビッ トの 数 をカウントするのと 同 じで、 カウント 数 が 偶 数 であれば true、 奇 数 であれば false<br />
を 戻 します。<br />
ビット 低 減 メソッドの 例<br />
ap_uint Val = 0xaa;<br />
bool t = Val.and_reduce(); // Yields: false<br />
t = Val.or_reduce(); // Yields: true<br />
t = Val.xor_reduce(); // Yields: false<br />
t = Val.nand_reduce(); // Yields: true<br />
t = Val.nor_reduce(); // Yields: false<br />
t = Val.xnor_reduce(); // Yields: true<br />
例 4‐4 : ビット 低 減 メソッドの 例<br />
高 位 合 成 japan.xilinx.com 528<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ビットのリバース<br />
void ap_(u)int::reverse ()<br />
次 のよ う に、 ap_[u]int イ ン ス タ ン スの 内 容 を 逆 転 さ せます。<br />
• LSB は MSB に<br />
• MSB は LSB に<br />
リバース メソッドの 例<br />
ap_uint Val = 0x12;<br />
Val.reverse(); // Yields:0x48<br />
ビット 値 のテスト<br />
bool ap_(u)int::test (unsigned i)<br />
ap_(u)int インスタンスの 指 定 ビッ トが 1 であるかど う かをチェ ッ ク します。<br />
1 の 場 合 は true、 そ う でない 場 合 は false を 戻 し ます。<br />
テスト メソッドの 例<br />
ap_uint Val = 0x12;<br />
bool t = Val.test(5); // Yields: true<br />
ビ ッ ト 値 の 設 定<br />
void ap_(u)int::set (unsigned i, bool v)<br />
void ap_(u)int::set_bit (unsigned i, bool v)<br />
ap_(u)int インスタンスの 指 定 ビッ トを 整 数 V の 値 に 設 定 し ます。<br />
ビットの 設 定 (1)<br />
void ap_(u)int::set (unsigned i)<br />
ap_(u)int の 指 定 ビ ッ ト を 1 に 設 定 し ます。<br />
ビットのクリア (0)<br />
void ap_(u)int::clear(unsigned i)<br />
ap_(u)int の 指 定 ビ ッ ト を 0 に 設 定 し ます。<br />
ビットの 反 転<br />
void ap_(u)int::invert(unsigned i)<br />
ap_(u)int インスタンスの 第 i 位 ビッ ト を 反 転 させます。 第 i 位 ビ ッ ト は、 元 の 値 が 1 の 場 合 0 となり、0 の 場 合 は 1 に<br />
なります。<br />
ビ ッ ト の 設 定 、 ク リ ア、 反 転 メ ソ ッ ド の 例 :<br />
ap_uint Val = 0x12;<br />
Val.set(0, 1);<br />
Val.set_bit(5, false);<br />
Val.set(7);<br />
// Yields:0x13<br />
// Yields:0x03<br />
// Yields:0x83<br />
高 位 合 成 japan.xilinx.com 529<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
Val.clear(1);<br />
Val.invert(5);<br />
// Yields:0x81<br />
// Yields:0x91<br />
右 に 移 動<br />
void ap_(u)int::rrotate(unsigned n)<br />
ap_(u)int インスタンスを n 桁 右 に 移 動 さ せます。<br />
左 に 移 動<br />
void ap_(u)int::lrotate(unsigned n)<br />
ap_(u)int インスタンスを n 桁 左 に 移 動 さ せます。<br />
ap_uint Val = 0x12;<br />
Val.rrotate(3);<br />
Val.lrotate(6);<br />
// Yields:0x42<br />
// Yields:0x90<br />
例 4‐5 : rotate メソッドの 例<br />
ビット 単 位 NOT<br />
void ap_(u)int::b_not()<br />
• ap_(u)int イ ン ス タ ン スの 各 ビ ッ ト を 補 完 し ます。<br />
ap_uint Val = 0x12;<br />
Val.b_not();<br />
// Yields:0xED<br />
例 4‐6 : ビット 単 位 NOT の 例<br />
符 号 のテス ト<br />
bool ap_int::sign()<br />
• ap_(u)int インスタンスが 負 の 値 であ るかど う かをチェ ッ ク し ます。<br />
• 負 の 場 合 は true を 戻 します。<br />
• 正 の 場 合 は false を 戻 します。<br />
明 示 的 な 変 換 メ ソ ッ ド<br />
C/C++ の (u)int 型<br />
int ap_(u)int::to_int ()<br />
unsigned ap_(u)int::to_uint ()<br />
• ap_[u]int に 含 まれている 値 でネ イ テ ィ ブ C/C++ (ほとんどのシステムで 32 ビッ ト) の 整 数 を 戻 し ます。<br />
• 値 が [unsigned] int で 表 さ れる も の よ り 大 き い 場 合 は、 切 り 捨 てが 実 行 さ れます。<br />
C/C++ 64 ビット (u)int 型<br />
long long ap_(u)int::to_int64 ()<br />
unsigned long long ap_(u)int::to_uint64 ()<br />
• ap_[u]int に 含 まれている 値 でネ イ テ ィ ブ C/C++ の 64 ビ ッ ト の 整 数 を 戻 し ます。<br />
• 値 が [unsigned] int で 表 さ れる も の よ り 大 き い 場 合 は、 切 り 捨 てが 実 行 さ れます。<br />
高 位 合 成 japan.xilinx.com 530<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
C/C++ の double 型<br />
double ap_(u)int::to_double ()<br />
• ap_[u]int に 含 まれている 値 のネ イ テ ィ ブ C/C++ の double 型 64 ビ ッ ト の 浮 動 小 数 点 値 を 戻 し ます。<br />
• ap_[u]int が 53 ビッ ト (double の 仮 数 部 のビ ッ ト 数 ) よ り も 大 き い 場 合 、 double 型 の 値 は 期 待 値 と ま った く 同 じ に<br />
ならないことがあります。<br />
Sizeof<br />
標 準 C++ の sizeof() 関 数 が ap_[u]int 型 で 使 用 されると、 多 くのバイ ト 数 が 戻 されます。 次 は var1 の 値 を 32<br />
に 設 定 し ています。<br />
int var1 = sizeof(ap_uint);<br />
高 位 合 成 japan.xilinx.com 531<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
C++ の 任 意 精 度 (AP) 固 定 小 数 点 型<br />
Vivado HLS では、 小 数 算 術 を 簡 単 に 処 理 で き る よ う 、 固 定 小 数 点 型 がサポー ト さ れています。 こ の 利 点 は 次 の 例 で 説<br />
明 されています。<br />
ap_fixed Var1 = 22.96875;<br />
ap_ufixed Var2 = 512.5<br />
ap_fixed Res1;<br />
// 10-bit signed word, 5 fractional bits<br />
// 12-bit word, 1 fractional bit<br />
// 13-bit signed word, 5 fractional bits<br />
Res1 = Var1 + Var2; // Result is 535.46875<br />
Var1 および Var2 の 精 度 は 異 な る のですが、 固 定 小 数 点 型 を 使 用 する こ と で、 演 算 (こ の 場 合 は 加 算 ) が 実 行 される 前<br />
に 小 数 点 が 揃 え ら れます。 小 数 点 を 揃 え る ために C コー ド で 演 算 を 実 行 する 必 要 はあ り ません。<br />
固 定 小 数 点 演 算 の 結 果 値 を 格 納 する のに 使 用 さ れる 型 は、 整 数 ビ ッ ト および 小 数 ビ ッ ト の 両 方 の 結 果 値 を 完 全 に 格 納<br />
する のに 十 分 な 大 き さ であ る 必 要 があ り ます。<br />
そ う ではない 場 合 、 ap_fixed 型 では 次 が 自 動 的 に 実 行 さ れます。<br />
• オーバーフ ロー ( 代 入 さ れた 型 でサポー ト さ れる よ り も MSB が 多 い 場 合 )<br />
• 量 子 化 ( 代 入 さ れた 型 でサポー ト さ れる よ り も LSB が 少 ない 場 合 )<br />
ap_[u]fixed 型 では、 オーバーフ ローおよび 量 子 化 の 実 行 方 法 に 関 し て さ ま ざ ま なオプシ ョ ンが 提 供 さ れています。 次<br />
のセ ク シ ョ ンでは、 その 詳 細 について 説 明 し ます。<br />
ap_[u]fixed 表 現<br />
ap_[u]fixed 型 では、 固 定 小 数 値 は 2 進 小 数 点 の 位 置 を 指 定 し た、 ビ ッ ト シーケン スで 表 現 さ れます。<br />
• 2 進 小 数 点 の 左 側 にあ る ビ ッ ト は 値 の 整 数 部 を 示 し ます。<br />
• 右 側 にあ る ビ ッ ト は 値 の 小 数 部 を 示 し ます。<br />
ap_[u]fixed 型 は 次 のよ う に 定 義 されます。<br />
ap_[u]fixed;<br />
• W 属 性 には、 ワー ド のビ ッ ト 合 計 数 を 指 定 するパ ラ メ ーターを 設 定 し ます。 こ のパ ラ メ ーター 値 には 定 数 の 整 数<br />
式 のみを 使 用 し ます。<br />
• I 属 性 には、 整 数 部 を 表 すビ ッ ト 数 を 指 定 するパ ラ メ ーターを 設 定 し ます。<br />
° I の 値 は W と 等 し いかそれ 以 下 であ る 必 要 があ り ます。<br />
° 小 数 部 を 表 すためのビ ッ ト 数 は W から I を 差 し 引 いた 値 です。<br />
° このパラ メ ーター 値 には 定 数 の 整 数 式 のみを 使 用 し ます。<br />
• Q 属 性 には 量 子 化 モー ド を 指 定 するパラ メ ーターを 設 定 し ます。<br />
° こ のパ ラ メ ーター 値 にはあ ら か じ め 定 義 さ れてい る 列 挙 値 のみを 使 用 し ます。<br />
° デフォル ト 値 は AP_TRN です。<br />
• O 属 性 にはオーバーフ ロー モー ド を 指 定 するパ ラ メ ーターを 設 定 し ます。<br />
° こ のパ ラ メ ーター 値 にはあ ら か じ め 定 義 さ れてい る 列 挙 値 のみを 使 用 し ます。<br />
° デフォル ト 値 は AP_WRAP です。<br />
高 位 合 成 japan.xilinx.com 532<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• N 属 性 には、 オーバーフ ロー ラップ モー ド で 使 用 さ れる 飽 和 ビ ッ ト 数 を 設 定 し ます。<br />
° このパラ メ ーター 値 には 定 数 の 整 数 式 のみを 使 用 し ます。<br />
° デフォル ト 値 は 0 です。<br />
注 記 : 例 にあ る よ う に、 量 子 化 、 オーバーフ ロー、 飽 和 パラ メ ーターが 指 定 さ れていない 場 合 は、 デフ ォル ト 設 定 が<br />
使 用 さ れます。<br />
量 子 化 およびオーバーフ ローのモー ド は 次 で 説 明 し ます。<br />
量 子 化 モー ド<br />
• 正 の 無 限 大 への 丸 め 「AP_RND」<br />
• 0 への 丸 め 「AP_RND_ZERO」<br />
• 負 の 無 限 大 への 丸 め 「AP_RND_MIN_INF」<br />
• 無 限 大 への 丸 め 「AP_RND_INF」<br />
• 収 束 丸 め 「AP_RND_CONV」<br />
• 切 り 捨 て 「AP_TRN」<br />
• 0 への 切 り 捨 て 「AP_TRN_ZERO」<br />
AP_RND<br />
• 特 定 の ap_[u]fixed 型 の 近 似 値 に 値 が 丸 め られます。<br />
ap_fixed UAPFixed4 = 1.25;<br />
ap_fixed UAPFixed4 = -1.25;<br />
// Yields:1.5<br />
// Yields:-1.0<br />
例 4‐7 : AP_RND の 例<br />
AP_RND_ZERO<br />
• 表 示 可 能 なの 近 似 値 に 値 が 丸 め ら れます。<br />
• 0 の 方 向 へ 丸 め ら れます。<br />
° 正 の 値 に 対 し ては 重 複 ビ ッ ト が 削 除 さ れます。<br />
° 負 の 値 に 対 し ては LSB が 追 加 さ れ、 最 も 近 い 表 示 可 能 な 値 が 表 示 さ れます。<br />
ap_fixed UAPFixed4 = 1.25; // Yields:1.0<br />
ap_fixed UAPFixed4 = -1.25; // Yields:-1.0<br />
例 4‐8 : AP_RND_ZERO の 例<br />
AP_RND_MIN_INF<br />
• 表 示 可 能 なの 近 似 値 に 値 が 丸 め ら れます。<br />
• 負 の 無 限 大 の 方 向 へ 丸 め ら れます。<br />
° 正 の 値 に 対 し ては 重 複 ビ ッ ト が 削 除 さ れます。<br />
° 負 の 値 に 対 し ては LSB が 追 加 されます。<br />
ap_fixed UAPFixed4 = 1.25;<br />
ap_fixed UAPFixed4 = -1.25;<br />
// Yields:1.0<br />
// Yields:-1.5<br />
例 4‐9 : AP_RND_MIN_INF の 例<br />
高 位 合 成 japan.xilinx.com 533<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
AP_RND_INF<br />
• 表 示 可 能 なの 近 似 値 に 値 が 丸 め ら れます。<br />
• 丸 めは LSB によって 変 わり ます。<br />
° 正 の 値 に 対 し ては、 LSB が 設 定 さ れてい る 場 合 は 正 の 無 限 大 の 方 向 に 丸 め ら れます。 そ う でない 場 合 は 負 の<br />
無 限 大 の 方 向 に 丸 められます。<br />
° 負 の 値 に 対 し ては、 LSB が 設 定 さ れてい る 場 合 は 負 の 無 限 大 の 方 向 に 丸 め ら れます。 そ う でない 場 合 は 正 の<br />
無 限 大 の 方 向 に 丸 められます。<br />
ap_fixed UAPFixed4 = 1.25; // Yields:1.5<br />
ap_fixed UAPFixed4 = -1.25; // Yields:-1.5<br />
AP_RND_CONV<br />
例 4‐10 : AP_RND_INF の 例<br />
• 表 示 可 能 なの 近 似 値 に 値 が 丸 め ら れます。<br />
• 丸 めは LSB によって 変 わり ます。<br />
° LSB が 設 定 さ れてい る 場 合 は 正 の 無 限 大 の 方 向 に 丸 め ら れます。<br />
° そ う でない 場 合 は 負 の 無 限 大 の 方 向 に 丸 められます。<br />
ap_fixed UAPFixed4 = 0.75;<br />
ap_fixed UAPFixed4 = -1.25;<br />
// Yields:1.0<br />
// Yields:-1.0<br />
例 4‐11 : AP_RND_CONV の 例<br />
AP_TRN<br />
• 表 示 可 能 なの 近 似 値 に 値 が 丸 め ら れます。<br />
• 常 に 負 の 無 限 大 に 向 かって 値 が 丸 め ら れます。<br />
ap_fixed UAPFixed4 = 1.25;<br />
ap_fixed UAPFixed4 = -1.25;<br />
// Yields:1.0<br />
// Yields:-1.5<br />
例 4‐12 : AP_TRN の 例<br />
AP_TRN_ZERO<br />
表 示 可 能 なの 近 似 値 に 値 が 丸 め ら れます。<br />
* 正 の 値 の 場 合 、 AP_TRN モード と 同 じ 丸 めにな り ます。<br />
* 負 の 値 の 場 合 はゼ ロ の 方 向 へ 丸 め ら れます。<br />
ap_fixed UAPFixed4 = 1.25;<br />
ap_fixed UAPFixed4 = -1.25;<br />
// Yields:1.0<br />
// Yields:-1.0<br />
例 4‐13 : AP_TRN_ZERO の 例<br />
オーバーフロー モード<br />
• 飽 和 「AP_SAT」<br />
• 0 への 飽 和 「AP_SAT_ZERO」<br />
• 対 称 飽 和 「AP_SAT_SYM」<br />
高 位 合 成 japan.xilinx.com 534<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• 折 り 返 し 「AP_WRAP」<br />
• 符 号 絶 対 値 の 折 り 返 し 「AP_WRAP_SM」<br />
AP_SAT<br />
値 が 次 のよ う に 飽 和 されます。<br />
• オーバーフ ローが 発 生 し た と きは 値 が 最 大 値 に 飽 和 さ れます。<br />
• 負 のオーバーフ ローの と きは 最 小 値 に 飽 和 さ れます。<br />
ap_fixed UAPFixed4 = 19.0;<br />
ap_fixed UAPFixed4 = -19.0;<br />
ap_ufixed UAPFixed4 = 19.0;<br />
ap_ufixed UAPFixed4 = -19.0;<br />
// Yields:7.0<br />
// Yields:-8.0<br />
// Yields:15.0<br />
// Yields:0.0<br />
例 4‐14 : AP_SAT の 例<br />
AP_SAT_ZERO<br />
オーバーフ ローまたは 負 のオーバーフ ローの 場 合 に 値 を 0 にします。<br />
ap_fixed UAPFixed4 = 19.0;<br />
ap_fixed UAPFixed4 = -19.0;<br />
ap_ufixed UAPFixed4 = 19.0;<br />
ap_ufixed UAPFixed4 = -19.0;<br />
// Yields:0.0<br />
// Yields:0.0<br />
// Yields:0.0<br />
// Yields:0.0<br />
例 4‐15 : AP_SAT_ZERO の 例<br />
AP_SAT_SYM<br />
値 が 次 のよ う に 飽 和 されます。<br />
• オーバーフ ローが 発 生 し た と きは 値 が 最 大 値 に 飽 和 さ れます。<br />
• 負 のオーバーフ ローの と きは 最 小 値 に 飽 和 さ れます。<br />
° 符 号 付 き ap_fixed 型 の 場 合 は 負 の 最 大 値<br />
° 符 号 な し ap_ufixed 型 の 場 合 は 0<br />
ap_fixed UAPFixed4 = 19.0;<br />
ap_fixed UAPFixed4 = -19.0;<br />
ap_ufixed UAPFixed4 = 19.0;<br />
ap_ufixed UAPFixed4 = -19.0;<br />
// Yields:7.0<br />
// Yields:-7.0<br />
// Yields:15.0<br />
// Yields:0.0<br />
例 4‐16 : AP_SAT_SYM の 例<br />
AP_WRAP<br />
オーバーフ ローが 発 生 し た と きは 値 が 折 り 返 さ れます。<br />
ap_fixed UAPFixed4 = 31.0;<br />
ap_fixed UAPFixed4 = -19.0;<br />
ap_ufixed UAPFixed4 = 19.0;<br />
ap_ufixed UAPFixed4 = -19.0;<br />
// Yields:-1.0<br />
// Yields:-3.0<br />
// Yields:3.0<br />
// Yields:13.0<br />
N の 値 が 0 の 場 合 (デフォル ト のオーバーフロー モード) :<br />
例 4‐17 : AP_WRAP の 例<br />
高 位 合 成 japan.xilinx.com 535<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• 範 囲 外 の MSB はすべて 削 除 さ れます。<br />
• 符 号 な し の 場 合 は、 最 大 値 に 達 し た ら 0 に 戻 り ます。<br />
• 符 号 付 き の 場 合 は、 最 大 値 に 達 し た ら 最 小 値 に 戻 り ます。<br />
N が 0 より 大 きい 場 合 :<br />
• N が 0 よ り 大 き い 場 合 、 MSB は 飽 和 する か、 ま たは 1 に 設 定 されます。<br />
• 符 号 ビ ッ ト は 保 持 さ れる ため、 正 の 値 は 正 のま ま、 負 の 値 は 負 のま まにな り ます。<br />
• 飽 和 し ていないビ ッ ト は LSB 側 から コ ピーされます。<br />
AP_WRAP_SM<br />
値 が 符 号 絶 対 値 で 折 り 返 さ れます。<br />
ap_fixed UAPFixed4 = 19.0;<br />
ap_fixed UAPFixed4 = -19.0;<br />
// Yields:-4.0<br />
// Yields:2.0<br />
N の 値 が 0 の 場 合 (デフォル ト のオーバーフロー モード) :<br />
例 4‐18 : AP_WRAP_SM の 例<br />
• こ のモー ド では 符 号 絶 対 値 ラ ッ プが 使 用 さ れます。<br />
• 符 号 ビ ッ ト は 最 下 位 の 削 除 さ れたビ ッ ト の 値 に 設 定 さ れます。<br />
• 最 上 位 の 残 り のビ ッ ト が 元 の MSB と は 異 な る 場 合 、 残 ってい る ビ ッ ト すべてが 反 転 さ れます。<br />
• MSB が 同 じ であ る 場 合 は、 ほかのビ ッ ト が コ ピー さ れます。<br />
a. 重 複 し てい る MSB が 削 除 されます。<br />
b. 新 し い 符 号 ビ ッ ト は 削 除 さ れたビ ッ ト の 最 下 位 ビ ッ ト です。 こ の 場 合 は 0 です。<br />
c. 新 し い 符 号 ビ ッ ト が 新 し い 値 の 符 号 と 比 較 さ れます。<br />
• 異 な る 場 合 は、 すべての 数 値 が 反 転 さ れます。 こ の 場 合 は 数 値 は 異 な り ます。<br />
N が 0 よ り 大 きい 場 合 :<br />
• 符 号 絶 対 値 の 飽 和 が 使 用 さ れます。<br />
• N 個 の MSB が 1 に 飽 和 し ます。<br />
• N =0 のケース と 同 様 の 動 作 にな り ますが、 正 の 数 値 は 正 のま ま、 負 の 数 値 は 負 のま まにな る 点 が 異 な り ます。<br />
ap_[u]fixed 型 のコ ンパイル<br />
ap_[u]fixed クラスを 使 用 するには、ap_[u]fixed 変 数 を 参 照 する ソ ース ファイルすべてに ap_fixed.h ヘッダー<br />
フ ァ イルを 含 め る 必 要 があ り ます。<br />
こ れ ら の ク ラ ス を 使 用 する ソ フ ト ウ ェ ア モデルを コ ンパイルする と き、 Vivado HLS のヘッ ダー ファイルの 場 所 を 指<br />
定 する 必 要 があ る 場 合 があ り ます。 た と えば、 gcc コンパイルには -I//include オプシ ョ ン を 追 加 する な<br />
どします。<br />
ヒント : g++ -O3 オプシ ョ ンを 使 用 してコンパイルする 場 合 には、 ソ フ ト ウエア モデルが 最 高 のパフ ォーマン スにな<br />
ります。<br />
ap_[u]fixed 変 数 の 宣 言 と 定 義<br />
次 の よ う にそれぞれ 符 号 付 きおよび 符 号 な し の ク ラ スが 別 々にあ り ます<br />
高 位 合 成 japan.xilinx.com 536<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• ap_fixed ( 符 号 付 き)<br />
• ap_ufixed ( 符 号 な し)<br />
C/C++ の typedef 文 を 使 用 する と 、 ユーザー 定 義 型 を 作 成 する こ と がで き ます。<br />
#include “ap_fixed.h”<br />
typedef ap_ufixed uint128_t;<br />
// use ap_[u]fixed types<br />
// 128-bit user defined type,<br />
// 32 integer bits<br />
例 4‐19 : ユーザー 定 義 型 の 例<br />
定 数 ( リテラル) からの 初 期 化 および 代 入<br />
ap_[u]fixed 変 数 は、 次 の 一 般 的 な C/C++ 幅 の 標 準 浮 動 小 数 点 定 数 で 初 期 化 さ れます。<br />
• float 型 の 場 合 は 32 ビッ ト<br />
• double 型 の 場 合 は 64 ビッ ト<br />
つま り 、 通 常 は、 浮 動 小 数 点 値 は 単 精 度 ま たは 倍 精 度 です。<br />
こ の よ う な 浮 動 小 数 点 定 数 は、 値 の 符 号 に よ り 、 任 意 精 度 の 固 定 小 数 点 変 数 のフル サ イ ズの 幅 に 処 理 および 変 換 さ れ<br />
ます (C99 規 格 の 16 進 数 の 浮 動 小 数 点 定 数 も サポー ト さ れる 場 合 )。<br />
#include <br />
ap_ufixed my15BitInt = 3.1415;<br />
ap_fixed my42BitInt = -1158.987;<br />
ap_ufixed = 287432.0382911;<br />
ap_fixed = -0x123.456p-1;<br />
ap_[u]fixed 型 では、 それらが std::complex 型 の 配 列 で 使 用 さ れる 場 合 は、 初 期 化 がサポー ト さ れません。<br />
typedef ap_fixed coeff_t; // MUST have IW >= 1<br />
std::complex twid_rom[REAL_SZ/2] = {{ 1, -0 },{ 0.9,-0.006 }, etc.}<br />
初 期 化 値 は、 まず std:complex に 変 換 する 必 要 があ り ます。<br />
typedef ap_fixed coeff_t; // MUST have IW >= 1<br />
std::complex twid_rom[REAL_SZ/2] = {std::complex( 1, -0 ),<br />
std::complex(0.9,-0.006 ),etc.}<br />
コンソール I/O ( 出 力 ) のサポー ト<br />
ap_[u]fixed 変 数 の 初 期 化 および 代 入 の 場 合 と 同 様 に、 Vivado HLS では 64 ビッ トよりも 大 きな 値 の 出 力 をサポート<br />
する ための 機 能 が 提 供 さ れています。<br />
ap_[u]fixed 変 数 に 格 納 さ れてい る 値 を 出 力 する のに 最 も 簡 単 な 方 法 は、 C++ の 標 準 出 力 ス ト リ ーム std::cout (#include<br />
or ) を 使 用 する 方 法 です。 ス ト リ ーム 挿 入 演 算 子
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ap_fixed Val = 3.25;<br />
cout
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
3.1416<br />
3.14159<br />
1.2346e+05<br />
setw マニピュレーターでは、 次 が 実 行 されます。<br />
• フ ィ ール ド 幅 に 使 用 さ れる 文 字 数 を 設 定<br />
• 1 つのパラ メ ーター w を 幅 の 値 と して 使 用<br />
説 明 :<br />
° w では、 一 部 の 出 力 表 示 で 使 用 さ れる 最 小 文 字 数 を 指 定 し ます。<br />
表 示 の 設 定 幅 がフ ィ ール ド 幅 よ り も 短 い 場 合 は、 埋 め 字 で 補 足 されます。 埋 め 字 は、 1 つのパラ メ ーター f を 補 足 文<br />
字 と し て 使 用 する setfill マニピュレーターで 制 御 されます。<br />
次 に 例 を 示 し ます。<br />
ap_fixed aa = 123456;<br />
int precision = 5;<br />
cout
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
オペラ ン ド は、 次 のいずれかの 整 数 型 にな り ます。<br />
• ap_[u]fixed<br />
• ap_[u]int<br />
• C/C++<br />
結 果 の ap_[u]fixed::RType は 2 つのオペラ ン ド の 型 によ って 異 な り ます。<br />
ap_fixed Result;<br />
ap_fixed Val1 = 1625.153;<br />
ap_fixed Val2 = 6721.355992351;<br />
Result = Val1 + Val2; //Yields 6722.480957<br />
例 4‐22 : 2 進 数 演 算 子 の 加 算 の 例<br />
Val2 は、 整 数 部 および 小 数 部 の 両 方 でビ ッ ト 幅 が 大 き いため、 結 果 値 をすべて 格 納 で き る よ う にする には、 結 果 の 型<br />
はこの 同 じビッ ト 幅 に 1 を 足 したものにな り ます。<br />
減 算<br />
ap_[u]fixed::RType ap_[u]fixed::operator - (ap_[u]fixed op)<br />
任 意 のオペラ ン ド op を 使 用 し 任 意 精 度 の 固 定 小 数 点 値 を 減 算 し ます。<br />
結 果 型 ap_[u]fixed::RType は 2 つのオペラ ン ド の 型 によ って 異 な り ます。<br />
ap_fixed Result;<br />
ap_fixed Val1 = 1625.153;<br />
ap_fixed Val2 = 6721.355992351;<br />
Result = Val2 - Val1; // Yields 6720.23057<br />
例 4‐23 : 2 進 数 演 算 子 の 減 算 の 例<br />
Val2 は、 整 数 部 および 小 数 部 の 両 方 でビ ッ ト 幅 が 大 き いため、 結 果 値 をすべて 格 納 で き る よ う にする には、 結 果 の 型<br />
はこの 同 じビッ ト 幅 に 1 を 足 したものにな り ます。<br />
乗 算<br />
ap_[u]fixed::RType ap_[u]fixed::operator * (ap_[u]fixed op)<br />
任 意 のオペラ ン ド op を 使 用 し 任 意 精 度 の 固 定 小 数 点 値 を 乗 算 し ます。<br />
ap_fixed Result;<br />
ap_fixed Val1 = 1625.153;<br />
ap_fixed Val2 = 6721.355992351;<br />
Result = Val1 * Val2; // Yields 7561.525452<br />
例 4‐24 : 2 進 数 演 算 子 の 乗 算 の 例<br />
この 例 では、 Val1 と Val2 を 掛 け 合 わせています。 こ の 結 果 の 型 は、 整 数 部 のビ ッ ト 幅 と 小 数 部 のビ ッ ト 幅 の 和 にな<br />
ります。<br />
高 位 合 成 japan.xilinx.com 540<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
除 算<br />
ap_[u]fixed::RType ap_[u]fixed::operator / (ap_[u]fixed op)<br />
任 意 のオペラ ン ド op を 使 用 し 任 意 精 度 の 固 定 小 数 点 値 を 除 算 し ます。<br />
ap_fixed Result;<br />
ap_fixed Val1 = 1625.153;<br />
ap_fixed Val2 = 6721.355992351;<br />
Result = Val2 / Val1; // Yields 5974.538628<br />
例 4‐25 : 2 進 数 演 算 子 の 除 算 の 例<br />
この 例 では、 Val1 と Val2 を 除 算 し ています。 十 分 な 精 度 を 保 持 する には、 次 の よ う にな り ます。<br />
• 結 果 型 の 整 数 ビ ッ ト 幅 は、 Val1 の 整 数 ビ ッ ト 幅 と、 Val2 の 小 数 ビ ッ ト 幅 の 和 にな り ます。<br />
• 結 果 型 の 小 数 ビ ッ ト 幅 は、 Val1 の 小 数 ビ ッ ト 幅 と、 Val2 の 全 ビ ッ ト 幅 の 和 にな り ます。<br />
ビ ッ ト 単 位 の 論 理 演 算 子<br />
ビット 単 位 の OR<br />
ap_[u]fixed::RType ap_[u]fixed::operator | (ap_[u]fixed op)<br />
任 意 精 度 の 固 定 小 数 点 と 任 意 のオペラ ン ド op にビ ッ ト 単 位 演 算 を 適 用 し ます。<br />
ap_fixed Result;<br />
ap_fixed Val1 = 1625.153;<br />
ap_fixed Val2 = 6721.355992351;<br />
Result = Val1 | Val2; // Yields 6271.480957<br />
ビット 単 位 の AND<br />
例 4‐26 : ビ ッ ト 単 位 の 論 理 演 算 子 の OR の 例<br />
ap_[u]fixed::RType ap_[u]fixed::operator & (ap_[u]fixed op)<br />
任 意 精 度 の 固 定 小 数 点 と 任 意 のオペラ ン ド op にビ ッ ト 単 位 演 算 を 適 用 し ます。<br />
ap_fixed Result;<br />
ap_fixed Val1 = 1625.153;<br />
ap_fixed Val2 = 6721.355992351;<br />
Result = Val1 & Val2; // Yields 1.00000<br />
ビット 単 位 の XOR<br />
例 4‐27 : ビ ッ ト 単 位 の 論 理 演 算 子 の OR の 例<br />
ap_[u]fixed::RType ap_[u]fixed::operator ^ (ap_[u]fixed op)<br />
任 意 精 度 の 固 定 小 数 点 と 任 意 のオペラ ン ド op に xor ビ ッ ト 単 位 演 算 を 適 用 し ます。<br />
ap_fixed Result;<br />
高 位 合 成 japan.xilinx.com 541<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ap_fixed Val1 = 1625.153;<br />
ap_fixed Val2 = 6721.355992351;<br />
Result = Val1 ^ Val2; // Yields 6720.480957<br />
例 4‐28 : ビ ッ ト 単 位 の 論 理 演 算 子 の XOR の 例<br />
インクリメントおよびデクリメント 演 算 子<br />
プリインクリメント<br />
ap_[u]fixed ap_[u]fixed::operator ++ ()<br />
この operator 関 数 の 接 頭 辞 を 使 用 する と 、 任 意 精 度 の 固 定 小 数 点 変 数 が 1 ずつイ ン ク リ メ ン ト さ れます。<br />
ap_fixed Result;<br />
ap_fixed Val1 = 5.125;<br />
Result = ++Val1; // Yields 6.125000<br />
ポス ト インク リ メ ン ト<br />
例 4‐29 : インクリメントおよびデクリメント 演 算 子 : プリインクリメントの 例<br />
ap_[u]fixed ap_[u]fixed::operator ++ (int)<br />
この operator 接 尾 語 関 数 では、 次 が 実 行 さ れます。<br />
• 任 意 精 度 の 固 定 小 数 点 変 数 を 1 ずつイ ン ク リ メ ン ト<br />
• こ の 任 意 精 度 の 固 定 小 数 点 の 元 の 値 を 戻 す<br />
ap_fixed Result;<br />
ap_fixed Val1 = 5.125;<br />
Result = Val1++; // Yields 5.125000<br />
プレデクリ メント<br />
例 4‐30 : インクリメントおよびデクリメント 演 算 子 : ポス ト インク リ メ ン トの 例<br />
ap_[u]fixed ap_[u]fixed::operator -- ()<br />
この operator 関 数 の 接 頭 辞 を 使 用 する と 、 任 意 精 度 の 固 定 小 数 点 変 数 が 1 ずつデ ク リ メ ン ト さ れます。<br />
ap_fixed Result;<br />
ap_fixed Val1 = 5.125;<br />
Result = --Val1; // Yields 4.125000<br />
ポス トデク リ メ ン ト<br />
例 4‐31 : インクリメントおよびデクリメント 演 算 子 : プリデクリメントの 例<br />
ap_[u]fixed ap_[u]fixed::operator -- (int)<br />
高 位 合 成 japan.xilinx.com 542<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
この operator 接 尾 語 関 数 では、 次 が 実 行 さ れます。<br />
• 任 意 精 度 の 固 定 小 数 点 変 数 を 1 ずつデ ク リ メ ン ト<br />
• こ の 任 意 精 度 の 固 定 小 数 点 の 元 の 値 を 戻 す<br />
ap_fixed Result;<br />
ap_fixed Val1 = 5.125;<br />
Result = Val1--; // Yields 5.125000<br />
単 項 演 算 子<br />
加 算<br />
例 4‐32 : インクリメントおよびデクリメント 演 算 子 : ポス トデク リ メ ン トの 例<br />
ap_[u]fixed ap_[u]fixed::operator + ()<br />
任 意 精 度 の 固 定 小 数 点 変 数 のセルフ コピーを 戻 します。<br />
減 算<br />
ap_fixed Result;<br />
ap_fixed Val1 = 5.125;<br />
Result = +Val1; // Yields 5.125000<br />
例 4‐33 : 単 項 演 算 子 : 加 算 の 例<br />
ap_[u]fixed::RType ap_[u]fixed::operator - ()<br />
任 意 精 度 の 固 定 小 数 点 変 数 の 負 の 値 を 戻 し ます。<br />
ap_fixed Result;<br />
ap_fixed Val1 = 5.125;<br />
Result = -Val1; // Yields -5.125000<br />
等 価 ゼロ<br />
bool ap_[u]fixed::operator !()<br />
この operator 関 数 では、 次 が 実 行 さ れます。<br />
• 任 意 精 度 の 固 定 小 数 点 変 数 を 0 と 比 較<br />
• 結 果 を 戻 す<br />
bool Result;<br />
ap_fixed Val1 = 5.125;<br />
例 4‐34 : 単 項 演 算 子 : 減 算 の 例<br />
Result = !Val1;<br />
// Yields false<br />
例 4‐35 : 単 項 演 算 子 : 等 価 ゼロの 例<br />
ビ ッ ト 単 位 の 逆<br />
ap_[u]fixed::RType ap_[u]fixed::operator ~ ()<br />
高 位 合 成 japan.xilinx.com 543<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
任 意 精 度 の 固 定 小 数 点 変 数 のビ ッ ト 単 位 の 補 数 を 戻 し ます。<br />
ap_fixed Result;<br />
ap_fixed Val1 = 5.125;<br />
Result = ~Val1; // Yields -5.25<br />
シ フ ト 演 算 子<br />
符 号 な し 左 シ フ ト<br />
例 4‐36 : 単 項 演 算 子 : ビ ッ ト 単 位 反 転 の 例<br />
ap_[u]fixed ap_[u]fixed::operator
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
• オペラ ン ド が 正 の 場 合 は 右 シフ ト が 実 行 さ れます。<br />
• オペラ ン ド が 負 の 場 合 は 左 シフ ト ( 逆 方 向 ) が 実 行 されます。<br />
オペラ ン ド には 次 の C/C++ の 整 数 型 を 使 用 する こ と がで き ます。<br />
• char<br />
• short<br />
• int<br />
• long<br />
右 シフ ト 演 算 で 戻 さ れる 型 は、 シフ ト さ れてい る 型 と 同 じ 幅 にな り ます。<br />
ap_fixed Result;<br />
ap_uint Val = 5.375;<br />
ap_int Sh = 2;<br />
Result = Val (ap_uint op)<br />
この operator 関 数 では、 次 が 実 行 さ れます。<br />
• 任 意 の 整 数 オペラ ン ド で 右 にシフ ト<br />
• 結 果 を 戻 す<br />
オペラ ン ド には 次 の C/C++ の 整 数 型 を 使 用 する こ と がで き ます。<br />
• char<br />
• short<br />
• int<br />
• long<br />
右 シフ ト 演 算 で 戻 さ れる 型 は、 シフ ト さ れてい る 型 と 同 じ 幅 にな り ます。<br />
ap_fixed Result;<br />
ap_fixed Val = 5.375;<br />
ap_uint sh = 2;<br />
Result = Val >> sh; // Yields 1.25<br />
例 4‐39 : シフ ト 演 算 子 : 符 号 な し 右 シ フ ト の 例<br />
すべての 上 位 ビ ッ ト を 保 持 する 必 要 があ る 場 合 は、 ap_fixed(Val) のよ うに、 まず Val の 小 数 部 のビ ッ ト 幅 を 拡<br />
張 します。<br />
符 号 付 き 右 シ フ ト<br />
ap_[u]fixed ap_[u]fixed::operator >> (ap_int op)<br />
高 位 合 成 japan.xilinx.com 545<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
こ れに よ り 、 次 が 実 行 さ れます。<br />
• 任 意 の 整 数 オペラ ン ド でmigi にシフ ト<br />
• 結 果 を 戻 す<br />
シフ ト の 方 向 はオペラ ン ド が 正 か 負 かに よ り 変 わ り ます。<br />
• オペラ ン ド が 正 の 場 合 は 右 シフ ト にな り ます。<br />
• オペラ ン ド が 負 の 場 合 は 左 シフ ト ( 逆 方 向 ) にな り ます。<br />
オペラ ン ド には C/C++ の 整 数 型 を 使 用 する こ と がで き ます (char、 short、 int、 または long)。<br />
右 シフ ト 演 算 の 返 される 型 は、 シフ ト されている 型 と 同 じ 幅 にな り ます。 次 はその 例 です。<br />
ap_fixed Result;<br />
ap_uint Val = 5.375;<br />
ap_int Sh = 2;<br />
Result = Val >> sh; // Shift right, yields 1.25<br />
Sh = -2;<br />
Result = Val >> sh; // Shift left, yields -10.5<br />
1.25<br />
関 係 演 算 子<br />
等 号<br />
bool ap_[u]fixed::operator == (ap_[u]fixed op)<br />
任 意 のオペラ ン ド で 任 意 精 度 の 固 定 小 数 点 変 数 を 比 較 し ます。<br />
等 しければ true を、 等 し く なければ false を 戻 し ます。<br />
オペラ ン ド op には、 ap_[u]fixed、 ap_int または C/C++ 整 数 型 を 使 用 する こ と がで き ます。 次 はその 例 です。<br />
bool Result;<br />
ap_ufixed Val1 = 1.25;<br />
ap_fixed Val2 = 17.25;<br />
ap_fixed Val3 = 3.25;<br />
Result = Val1 == Val2;<br />
Result = Val1 == Val3;<br />
// Yields true<br />
// Yields false<br />
等 号 否 定<br />
bool ap_[u]fixed::operator != (ap_[u]fixed op)<br />
任 意 のオペラ ン ド で こ の 任 意 精 度 の 固 定 小 数 点 変 数 を 比 較 し ます。<br />
等 し くなければ true を、 等 し く ければ false を 戻 します。<br />
オペラ ン ド op には、 次 を 使 用 する こ と がで き ます。<br />
• ap_[u]fixed<br />
• ap_int<br />
• C または C++ の 整 数 型<br />
高 位 合 成 japan.xilinx.com 546<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
次 はその 例 です。<br />
bool Result;<br />
ap_ufixed Val1 = 1.25;<br />
ap_fixed Val2 = 17.25;<br />
ap_fixed Val3 = 3.25;<br />
Result = Val1 != Val2;<br />
Result = Val1 != Val3;<br />
// Yields false<br />
// Yields true<br />
大 なり イ コール<br />
bool ap_[u]fixed::operator >= (ap_[u]fixed op)<br />
この operator では、 任 意 のオペラ ン ド で 変 数 を 比 較 し ています。<br />
変 数 が 等 し い、 ま たはオペラ ン ド よ り 大 き い 場 合 は true を、 そ う でない 場 合 は false を 戻 します。<br />
オペラ ン ド op には、 ap_[u]fixed, ap_int または C/C++ 整 数 型 を 使 用 する こ と がで き ます。<br />
次 はその 例 です。<br />
bool Result;<br />
ap_ufixed Val1 = 1.25;<br />
ap_fixed Val2 = 17.25;<br />
ap_fixed Val3 = 3.25;<br />
Result = Val1 >= Val2;<br />
Result = Val1 >= Val3;<br />
// Yields true<br />
// Yields false<br />
小 なり イ コール<br />
bool ap_[u]fixed::operator
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
bool Result;<br />
ap_ufixed Val1 = 1.25;<br />
ap_fixed Val2 = 17.25;<br />
ap_fixed Val3 = 3.25;<br />
Result = Val1 > Val2;<br />
Result = Val1 > Val3;<br />
// Yields false<br />
// Yields false<br />
小 なり<br />
bool ap_[u]fixed::operator < (ap_[u]fixed op)<br />
任 意 のオペラ ン ド で 変 数 を 比 較 し、 オペラ ン ド よ り 小 さ い 場 合 は true を 返 し、 そ う でなければ false を 戻 します。<br />
オペラ ン ド op には、 ap_[u]fixed、 ap_int または C/C++ 整 数 型 を 使 用 する こ と がで き ます。 次 はその 例 です。<br />
bool Result;<br />
ap_ufixed Val1 = 1.25;<br />
ap_fixed Val2 = 17.25;<br />
ap_fixed Val3 = 3.25;<br />
Result = Val1 < Val2;<br />
Result = Val1 < Val3;<br />
// Yields false<br />
// Yields true<br />
ビ ッ ト 演 算 子<br />
ビ ッ ト の 選 択 および 設 定<br />
af_bit_ref ap_[u]fixed::operator [] (int bit)<br />
任 意 精 度 の 固 定 小 数 点 値 か ら 1 ビッ ト 選 択 し、 それを 戻 します。<br />
戻 し 値 は、 ap_[u]fixed 変 数 で 対 応 する ビ ッ ト を 設 定 ま たは 消 去 で き る 参 照 値 です。 ビ ッ ト 引 数 は 整 数 値 であ る 必 要 が<br />
あ り 、 選 択 する ビ ッ ト の 指 数 を 指 定 し ます。 最 下 位 ビ ッ ト は 指 数 0 にな り ます。 最 大 指 数 は こ の ap_[u]fixed 変 数 の<br />
ビッ ト 幅 から 1 を 引 いた 値 にな り ます。<br />
結 果 型 は af_bit_ref で 値 は 0 または 1 です。 次 はその 例 です。<br />
ap_int Value = 1.375;<br />
Value[3]; // Yields 1<br />
Value[4]; // Yields 0<br />
Value[2] = 1; // Yields 1.875<br />
Value[3] = 0; // Yields 0.875<br />
ビット 範 囲<br />
af_range_ref af_(u)fixed::range (unsigned Hi, unsigned Lo)<br />
af_range_ref af_(u)fixed::operator [] (unsigned Hi, unsigned Lo)<br />
こ の 演 算 は、 ビ ッ ト 選 択 の 演 算 子 [] に 似 ていますが、 1 ビ ッ ト ではな く ビ ッ ト の 範 囲 に 対 し て 演 算 が 行 われ、<br />
任 意 精 度 の 固 定 小 数 点 変 数 か ら ビ ッ ト のグループを 選 択 し ます。 引 数 Hi は 範 囲 の 上 のほ う のビ ッ ト を 指 定 し、 引 数<br />
Lo は 最 下 位 ビ ッ ト を 指 定 し ます。 Lo が Hi よ り も 大 き い 場 合 は、 選 択 さ れたビ ッ ト が 逆 の 順 序 で 戻 さ れます。<br />
返 される 型 af_range_ref は、 Hi および Lo で 指 定 される ap_[u]fixed 変 数 の 範 囲 の 参 照 です。 次 はその 例 です。<br />
高 位 合 成 japan.xilinx.com 548<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ap_uint Result = 0;<br />
ap_ufixed Value = 1.25;<br />
ap_uint Repl = 0xAA;<br />
Result = Value.range(3, 0);<br />
Value(3, 0) = Repl(3, 0);<br />
// Yields:0x5<br />
// Yields:-1.5<br />
// when Lo > Hi, return the reverse bits string<br />
Result = Value.range(0, 3);<br />
// Yields:0xA<br />
範 囲 選 択<br />
af_range_ref af_(u)fixed::range ()<br />
af_range_ref af_(u)fixed::operator []<br />
こ れは、 範 囲 選 択 演 算 子 [] の 特 殊 ケースで、 任 意 精 度 の 固 定 小 数 点 値 か らすべてのビ ッ ト を 標 準 の 順 序 で 選 択 し ます。<br />
返 される 型 af_range_ref は、 Hi = W - 1 および Lo = 0 で 指 定 さ れる 範 囲 の 参 照 です。 次 はその 例 です。<br />
ap_uint Result = 0;<br />
ap_ufixed Value = 1.25;<br />
ap_uint Repl = 0xAA;<br />
Result = Value.range();<br />
Value() = Repl(3, 0);<br />
// Yields:0x5<br />
// Yields:-1.5<br />
長 さ<br />
int ap_[u]fixed::length ()<br />
任 意 精 度 の 固 定 小 数 点 値 でビ ッ ト 数 を 示 す 整 数 値 を 返 し ます。 1 つの 型 または 値 で 使 用 する こ と ができ ます。 次 はそ<br />
の 例 です。<br />
ap_ufixed My128APFixed;<br />
int bitwidth = My128APFixed.length(); // Yields 128<br />
明 示 的 な 変 換 メ ソ ッ ド<br />
固 定 小 数 点 から double 型<br />
double ap_[u]fixed::to_double ()<br />
このメンバー ファンクションは、 IEEE の 倍 精 度 フ ォーマ ッ ト で 固 定 小 数 点 値 を 返 し ます。 次 に 例 を 示 し ます。<br />
ap_ufixed MyAPFixed = 333.789;<br />
double Result;<br />
Result = MyAPFixed.to_double(); // Yields 333.789<br />
固 定 小 数 点 から ap_int 型<br />
ap_int ap_[u]fixed::to_ap_int ()<br />
このメンバー フ ァ ン ク シ ョ ンは、 こ の 固 定 小 数 点 値 を、すべての 整 数 ビ ッ ト を 取 り 込 む ap_int 型 に 明 示 的 に 変 換 し ま<br />
す ( 小 数 ビ ッ ト は 切 り 捨 て)。 次 に 例 を 示 します。<br />
ap_ufixed MyAPFixed = 333.789;<br />
高 位 合 成 japan.xilinx.com 549<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
ap_uint Result;<br />
Result = MyAPFixed.to_ap_int(); //Yields 333<br />
固 定 小 数 点 から 整 数 型<br />
int ap_[u]fixed::to_int ()<br />
unsigned ap_[u]fixed::to_uint ()<br />
ap_slong ap_[u]fixed::to_int64 ()<br />
ap_ulong ap_[u]fixed::to_uint64 ()<br />
このメンバー フ ァ ン ク シ ョ ンは、 こ の 固 定 小 数 点 値 を C のビル ト イ ン 整 数 型 に 明 示 的 に 変 換 し ます。 次 に 例 を 示 し<br />
ます。<br />
ap_ufixed MyAPFixed = 333.789;<br />
unsigned int Result;<br />
Result = MyAPFixed.to_uint(); //Yields 333<br />
unsigned long long Result;<br />
Result = MyAPFixed.to_uint64(); //Yields 333<br />
高 位 合 成 japan.xilinx.com 550<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
SystemC 型 と Vivado HLS 型 の 比 較<br />
Vivado HLS 型 は SystemC 型 と 同 様 で、 実 質 上 すべての ク ラ スに 互 換 性 があ り ます。 Vivado HLS 型 を 使 用 し て 記 述 さ れ<br />
たコードは、 通 常 SystemC デザイ ンに 移 行 でき、 SystemC 型 を 使 用 し て 記 述 さ れた コー ド は Vivado HLS に 移 行 でき<br />
ます。<br />
Vivado HLS 型 と SystemC 型 のビヘイ ビアーには、 違 いも あ り ます。 これらの 違 いについては、 次 のセ ク シ ョ ンに 分<br />
けて 説 明 し ます。<br />
• デフォル ト コンスト ラクター<br />
• 整 数 除 算<br />
• 整 数 係 数<br />
• 負 のシフ ト<br />
• 左 シフ ト のオーバーフ ロー<br />
• range 演 算<br />
• 固 定 小 数 点 の 除 算<br />
• 固 定 小 数 点 の ラ イ ト シフ ト<br />
• 固 定 小 数 点 の 左 シフ ト<br />
デフォルト コンストラクター<br />
SystemC では、 次 の 型 のコ ン ス ト ラ ク ターによ り 、 プロ グ ラ ム 実 行 前 に 値 が 0 に 初 期 化 さ れます。<br />
• sc_[u]int<br />
• sc_[u]bigint<br />
• sc_[u]fixed<br />
次 の Vivado HLS 型 は こ の コ ン ス ト ラ ク ターでは 初 期 化 さ れません。<br />
• ap_[u]int<br />
• ap_[u]fixed<br />
Vivado HLS のビ ッ ト 精 度 データ 型 :<br />
• ap_[u]int<br />
デフ ォル ト の 初 期 化 な し<br />
• ap_[u]fixed<br />
デフ ォル ト の 初 期 化 な し<br />
高 位 合 成 japan.xilinx.com 551<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
SystemC のビ ッ ト 精 度 データ 型 :<br />
• sc_[u]int<br />
デフォル ト で 0 に 初 期 化<br />
• sc_big[u]int<br />
デフォル ト で 0 に 初 期 化<br />
• sc_[u]fixed<br />
デフォル ト で 0 に 初 期 化<br />
注 意 : SystemC 型 を Vivado HLS 型 に 移 行 する 場 合 は、 変 数 が 読 み 込 まれない よ う に、 ま たは 書 き 出 さ れる まで 条 件 文<br />
に 使 用 されないよ う にし て く だ さい。<br />
出 力 が 書 き 出 さ れたかど う かに 関 係 な く 、 SystemC デザイ ンのすべての 出 力 がデフ ォル ト 値 の 0 で 表 示 され 始 める こ<br />
と があ り ます。 こ の 場 合 、 Vivado HLS 型 と 同 じ 変 数 はそれが 書 き 出 さ れる まで 未 知 の 状 態 のま まです。<br />
整 数 除 算<br />
整 数 除 算 を 使 用 する 場 合 、 Vivado HLS 型 は sc_big[u]int 型 と 同 じになりますが、 sc_[u]int とは 異 なるビヘイビアーに<br />
なります。 図 4-16 はその 例 を 示 しています。<br />
X-Ref Target - Figure 4-16<br />
SystemC の sc_int 型 は、 符 号 な しの 整 数 が 負 の 符 号 付 き 整 数 で 除 算 される と 0 を 戻 し ます。 Vivado HLS 型 の 場 合 、<br />
SystemC の sc_bigint と 同 様 、 負 の 結 果 を 示 し ます。<br />
整 数 係 数<br />
図 4‐16 : 整 数 除 算 の 相 違 点<br />
剰 余 演 算 子 を 使 用 する 場 合 、 Vivado HLS 型 は sc_big[u]int 型 と 同 じになりますが、 sc_[u]int とは 異 なるビヘイビアー<br />
にな り ます。 図 4-17 はその 例 を 示 しています。<br />
高 位 合 成 japan.xilinx.com 552<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
X-Ref Target - Figure 4-17<br />
SystemC の sc_int 型 は、 次 の 場 合 に 剰 余 演 算 の 被 除 数 の 値 を 戻 し ます。<br />
• 被 除 数 (dividend) が 符 号 な しの 整 数<br />
• 除 数 (divisor) が 負 の 符 号 付 き 整 数<br />
Vivado HLS 型 の 場 合 ( 例 : SystemC の sc_bigint 型 )、 正 の 剰 余 演 算 結 果 を 戻 し ます。<br />
負 のシ フ ト<br />
図 4‐17 : 整 数 剰 余 の 相 違 点<br />
シフ ト 演 算 の 値 が 負 の 数 値 の 場 合 、 Vivado HLS の ap_[u]int 型 は 値 を 逆 方 向 にシフ ト し ます。 た と えば、 右 シ フ ト の<br />
場 合 は 左 シフ ト を 戻 し ます。<br />
SystemC 型 の sc_[u]int および sc_big[u]int は、 こ の よ う な 場 合 異 な る ビヘイ ビ アーにな り ます。 図 4-18 は、 こ の 演 算<br />
の 例 を Vivado HLS 型 と SystemC 型 の 両 方 で 示 し ています。<br />
X-Ref Target - Figure 4-18<br />
表 4‐73 : 負 のシ フ ト の 相 違 点 のサマ リ<br />
図 4‐18 : 負 のシ フ ト の 相 違 点<br />
ap_[u]int<br />
型<br />
反 対 方 向 にシ フ ト<br />
操 作<br />
高 位 合 成 japan.xilinx.com 553<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
表 4‐73 : 負 のシ フ ト の 相 違 点 のサマ リ<br />
sc_[u]int<br />
sc_big[u]int<br />
型<br />
0 を 戻 す<br />
シフ ト なし<br />
操 作<br />
シフト レフトのオーバーフロー<br />
シフ ト 演 算 が 実 行 さ れ、 結 果 が 出 力 や 代 入 さ れた 変 数 ではな く 、 入 力 変 数 か ら オーバーフ ローする 場 合 、 Vivado HLS<br />
型 と SystemC 型 のビヘイ ビアーは 異 な り ます。<br />
• Vivado HLS の ap_[u]int は、 値 をシフ ト してから 代 入 をするので、 上 位 ビ ッ ト はオーバーフローして 失 われます。<br />
• SystemC の sc_big(u)int および sc_(u)int 型 の 場 合 は、 両 方 と も 結 果 を 代 入 し てか ら、 上 位 ビ ッ ト を 保 持 しつつシフ<br />
ト を 実 行 し ます。<br />
• 図 4-19 は、 こ の 演 算 の 例 を Vivado HLS 型 と SystemC 型 の 両 方 で 示 し ています。<br />
X-Ref Target - Figure 4-19<br />
range 演 算<br />
図 4‐19 : シフ ト レ フ ト のオーバーフ ローの 相 違 点<br />
range 演 算 が 使 用 さ れ、 その range のサイズがソース とデステ ィ ネーシ ョ ンで 異 なる 場 合 は、 ビヘイ ビアが 異 な り ま<br />
す。 図 4-20 は、 こ の 演 算 の 例 を Vivado HLS 型 と SystemC 型 の 両 方 で 示 し ています。 次 のサマ リ を 参 照 し て く だ さ い。<br />
高 位 合 成 japan.xilinx.com 554<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
X-Ref Target - Figure 4-20<br />
• Vivado HLS の ap_[u]int および SystemC の sc_big[u]int 型 は、 指 定 し た range を 置 き 換 えて、 ターゲッ ト の 範 囲 を<br />
0 で 埋 める よ う に 拡 張 されます。<br />
• SystemC の sc_big[u]int 型 は、 ソースの range のみ 使 用 し てア ッ プデー ト さ れます。<br />
固 定 小 数 点 型 の 除 算<br />
図 4‐20 : range 演 算 の 相 違 点<br />
異 な る サ イ ズの 固 定 小 数 点 型 の 変 数 を 使 用 し て 除 算 を 実 行 する 場 合 、 小 数 値 の 代 入 方 法 が Vivado HLS 型 と SystemC<br />
型 で 異 な り ます。<br />
ap_[u]fixed 型 の 場 合 、 小 数 部 分 はその 被 除 数 よ り も 大 き く はな り ません。 SystemC の sc_[u]fixed 型 では、 除 算 での 小<br />
数 の 精 度 が 保 持 さ れます。 ap_[u]fixed 型 を 使 用 する 場 合 、 代 入 前 に 新 し い 変 数 幅 へキ ャ ス ト する と 、 小 数 部 分 を 保 持<br />
するこ とができます。<br />
図 4-21 は、 こ の 演 算 の 例 を Vivado HLS 型 と SystemC 型 の 両 方 で 示 し ています。<br />
X-Ref Target - Figure 4-21<br />
図 4‐21 : 固 定 小 数 点 の 除 算 の 相 違 点<br />
高 位 合 成 japan.xilinx.com 555<br />
UG902 (v2014.1) 2014 年 4 月 2 日
第 4 章 : 高 位 合 成 リ フ ァ レ ンス ガイド<br />
固 定 小 数 点 型 の 右 シ フ ト<br />
右 シフ ト 演 算 が 実 行 さ れる 場 合 、 Vivado HLS と SystemC の 動 作 は 異 な り ます。<br />
• Vivado HLS の 固 定 小 数 点 型 で 実 行 さ れる と 、 シフ ト が 実 行 さ れてか ら、 値 が 代 入 さ れます。<br />
• SystemC の 固 定 小 数 点 型 の 場 合 、 値 が 代 入 さ れてか ら、 シ フ ト が 実 行 さ れます。<br />
結 果 が よ り 多 く の 小 数 ビ ッ ト を 含 む 固 定 小 数 点 型 の 場 合 、 SystemC 型 では さ ら に 追 加 で 精 度 が 保 持 さ れます。<br />
図 4-22 は、 こ の 演 算 の 例 を Vivado HLS 型 と SystemC 型 の 両 方 で 示 し ています。<br />
X-Ref Target - Figure 4-22<br />
量 子 化 モー ド の 型 は、 ap_[u]fixed の 右 シフ ト の 結 果 には 影 響 し ません。 シ フ ト 演 算 よ り も 前 に 結 果 の 型 のサ イ ズに 代<br />
入 し てお く こ と をお 勧 め し ます。<br />
固 定 小 数 点 型 の 左 シ フ ト<br />
図 4‐22 : 右 シ フ ト を 使 用 し た 固 定 小 数 点 型 の 違 い<br />
ap_[u]fixed 型 を 使 用 し て 左 シフ ト 演 算 を 実 行 する と 、 オペラ ン ド が 符 号 拡 張 さ れてか ら、 シフ ト さ れて、 代 入 さ れま<br />
す。 SystemC の sc_[u]fixed 型 の 場 合 は、 代 入 し てか ら シフ ト が 実 行 さ れます。 こ の 場 合 、 Vivado HLS 型 はすべての 符<br />
号 を 保 持 し ます。<br />
図 4-23 は、 こ の 演 算 の 例 を Vivado HLS 型 と SystemC 型 の 両 方 で 示 し ています。<br />
X-Ref Target - Figure 4-23<br />
図 4‐23 : 左 シ フ ト を 使 用 し た 固 定 小 数 点 型 の 違 い<br />
高 位 合 成 japan.xilinx.com 556<br />
UG902 (v2014.1) 2014 年 4 月 2 日
付 録 A<br />
その 他 の リ ソースおよび 法 的 通 知<br />
ザイリンクス リソース<br />
ア ンサー、 資 料 、 ダ ウ ン ロー ド 、 フ ォーラ ムなどのサポー ト リソースは、 次 のザイ リ ンクス サポー ト サイ ト を 参 照<br />
してください。<br />
ソリューション センター<br />
デバイ ス、 ツール、 IP のサポー ト については、 ザイ リ ンクス ソリューション センターを 参 照 して く ださい。 Topics<br />
include design assistance, advisories, and troubleshooting tips.<br />
Vivado Design Suite ビデオ チュート リアル<br />
Vivado Design Suite ビデオ チュート リ アル<br />
参 照 資 料<br />
1. 『Vivado Design Suite ユーザー ガイド : リリース ノート、 インス トールおよびライセンス』 (UG973)<br />
2. 『Vivado Design Suite ユーザー ガイド : 高 位 合 成 (UG902)<br />
3. 『Vivado Design Suite チュート リ アル : 高 位 合 成 (UG871)<br />
4. Vivado Design Suite ビデオ チュート リ アル (http://japan.xilinx.com/training/vivado/index.htm)<br />
5. Vivado Design Suite 資 料 (http://japan.xilinx.com/support/documentation/dt_vivado2014-1.htm)<br />
法 的 通 知<br />
The information disclosed to you hereunder (the “Materials”) is provided solely for the selection and use of Xilinx products.To the maximum extent<br />
permitted by applicable law:(1) Materials are made available "AS IS" and with all faults, Xilinx hereby DISCLAIMS ALL WARRANTIES AND<br />
CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY,<br />
NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and (2) Xilinx shall not be liable (whether in contract or tort,<br />
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<br />
with, the Materials (including your use of the Materials), including for any direct, indirect, special, incidental, or consequential loss or damage<br />
高 位 合 成 japan.xilinx.com 557<br />
UG902 (v2014.1) 2014 年 4 月 2 日
付 録 A : その 他 の リ ソースおよび 法 的 通 知<br />
(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<br />
damage or loss was reasonably foreseeable or Xilinx had been advised of the possibility of the same.Xilinx assumes no obligation to correct any<br />
errors contained in the Materials or to notify you of updates to the Materials or to product specifications.You may not reproduce, modify, distribute,<br />
or publicly display the Materials without prior written consent.Certain products are subject to the terms and conditions of Xilinx’s limited warranty,<br />
please refer to Xilinx’s Terms of Sale which can be viewed at http://www.xilinx.com/legal.htm#tos; IP cores may be subject to warranty and<br />
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<br />
requiring fail-safe performance; you assume sole risk and liability for use of Xilinx products in such critical applications, please refer to Xilinx’s<br />
Terms of Sale which can be viewed at http://www.xilinx.com/legal.htm#tos.<br />
© Copyright 2012-2014 Xilinx, Inc. Xilinx, the Xilinx logo, Artix, ISE, Kintex, Spartan, Virtex, Vivado, Zynq, and other designated brands<br />
included herein are trademarks of Xilinx in the United States and other countries.All other trademarks are the property of their respective owners.<br />
この 資 料 に 関 する フ ィ ード バッ クおよび リ ン ク などの 問 題 につき ま し ては、 jpn_trans_feedback@xilinx.com まで、 または 各 ページの<br />
右 下 にあ る [フィードバック 送 信 ] ボ タ ン を ク リ ッ ク する と 表 示 さ れる フ ォームか らお 知 らせ く だ さ い。 フ ィ ー ド バ ッ ク は 日 本 語 で<br />
入 力 可 能 です。 いただき ま し たご 意 見 を 参 考 に 早 急 に 対 応 させていただ き ます。 なお、 こ の メ ール ア ド レ スへのお 問 い 合 わせは 受<br />
け 付 けてお り ません。 あ ら か じ めご 了 承 く だ さ い。<br />
高 位 合 成 japan.xilinx.com 558<br />
UG902 (v2014.1) 2014 年 4 月 2 日