05.01.2015 Views

GMwcI

GMwcI

GMwcI

SHOW MORE
SHOW LESS

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 日

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!