vivado design suite user guide: synthesisjapan.xilinx.com/support/documentation/sw...•use project...

274
Vivado Design Suite ユーザー ガイド 合成 UG901 (v2020.1) 2020 6 24 この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料に よっては英語版の更新に対応していないものがあります。日本語版は参考用としてご使用の上、最新情報につきまし ては、必ず最新英語版をご参照ください。

Upload: others

Post on 17-Jul-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

Vivado Design Suite ユーザー ガイド

合成

UG901 (v2020.1) 2020 年 6 月 24 日

すべてのバージョンを表示

この資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。資料によっては英語版の更新に対応していないものがあります。日本語版は参考用としてご使用の上、最新情報につきましては、必ず最新英語版をご参照ください。

Page 2: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 2UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

改訂履歴 次の表に、 この文書の改訂履歴を示します。

セクシ ョ ン 改訂内容

2020 年 6 月 24 日 バージ ョ ン 2020.1

「合成設定」 新しい指示子 LogicCompaction とそのオプシ ョ ン -debug_log の説明を追加。

「ボ ト ムアップ アウ ト オブ コンテキス ト フローの設定」 IP 合成に関する情報をアップデート。

「DONT_TOUCH」 情報を追加。

「DSP_FOLDING_FASTCLOCK」 VHDL 例をアップデート。

「EXTRACT_RESET」 値に関する情報を追加。

「SRL_STYLE」 情報を追加。

「合成属性の伝搬規則」 新規セクシ ョ ンを追加。

「ブロ ッ ク レベル フロー オプシ ョ ン」 PRESERVE_BOUNDARY および LOGIC_COMPACTION オプ

シ ョ ンを追加。

表 7-4 データ型を追加。

表 7-5 一部のシステム タスクおよび関数のステータスをアップ

デート。

「サポート されるデータ型」 データ型を追加。

Page 3: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 3UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

目次

第 1 章: Vivado 合成概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6合成手法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6合成の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7合成の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16ボ ト ムアップ アウ ト オブ コンテキス ト フローの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20インク リ メンタル合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Vivado IP とサードパーティ合成ツール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27プロセスのバッ クグラウンドへの移動 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27合成実行の監視 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28合成終了後のフロー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28合成結果の解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29合成済みデザイン環境の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29ロジッ クの解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30タイ ミ ング解析の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Tcl での合成の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33RTL 合成のマルチスレッ ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35Vivado であらかじめ定義されている合成ス ト ラテジ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

第 2 章: 合成属性概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38サポート される属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Vivado でのカスタム属性のサポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58XDC ファ イルでの合成属性の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59合成属性の伝搬規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

第 3 章: ブロック合成スト ラテジの使用概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61ブロ ッ ク レベル フローの設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63ブロ ッ ク レベル フロー オプシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

第 4 章: HDL コーディング手法概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66VHDL の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66Verilog の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66SystemVerilog の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67フ リ ップフロ ップ、 レジスタ、 およびラ ッチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67ラ ッチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71ト ラ イステート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72シフ ト レジスタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74ダイナミ ッ ク シフ ト レジスタ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

Page 4: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 4UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

乗算器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81複素乗算のコード例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84DSP ブロ ッ クの前置加算器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87UltraScale DSP ブロ ッ クの 2 乗算出機能の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89FIR フ ィルター . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91収束丸め (LSB 訂正手法) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97RAM の HDL コーディング手法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101Vivado 合成での UltraRAM の推論 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104RAM の HDL コード記述のガイ ド ライン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108RAM 内容の初期化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1423D RAM の推論 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148ブラ ッ ク ボッ クス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159FSM コンポーネン ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161ROM の HDL コーディング手法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

第 5 章: VHDL サポート概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167サポート される VHDL データ型とサポート されない VHDL データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167VHDL オブジェク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171VHDL のエンティティ とアーキテクチャの記述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173VHDL の組み合わせ回路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181generate 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182組み合わせプロセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184VHDL の順序ロジッ ク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188VHDL の初期値とセッ ト / リ セッ ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190VHDL の関数とプロシージャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191VHDL の定義済みパッケージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194独自の VHDL パッケージの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196VHDL 構文のサポート ステータス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197VHDL の予約語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

第 6 章: VHDL-2008 言語サポート概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201VHDL-2008 を使用するための Vivado の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201サポート される VHDL-2008 の機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

第 7 章: Verilog サポート概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212Verilog デザイン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212Verilog の機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212Verilog コンス ト ラ ク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222Verilog のシステム タスクおよび関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224変換関数の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225Verilog プリ ミティブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225Verilog の予約キーワード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226Verilog ビヘイビアー記述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227モジュール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234手続き代入文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235タスクおよび関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241

Page 5: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 5UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250特定のファイルで SystemVerilog を使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251プロセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254手続きプログラム代入文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256タスクおよび関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258モジュールおよび階層 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259インターフェイス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259package 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262SystemVerilog コンス ト ラ ク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262

第 9 章: 混合言語サポート概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267VHDL と Verilog の混合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267インスタンシエーシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268VHDL および Verilog ライブラ リ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270VHDL および Verilog の境界規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270バインド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270ジェネ リ ッ クのサポート . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270ポート マップ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271

付録 A: その他のリソースおよび法的通知ザイ リ ンクス リ ソース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272ソ リ ューシ ョ ン センター . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272Documentation Navigator およびデザイン ハブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272参考資料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273お読みください: 重要な法的通知 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274

Page 6: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 6UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章

Vivado 合成

概要

合成は、 RTL で記述されたデザインをゲート レベル記述に変換するプロセスです。 Vivado® 合成はタイ ミ ング ド リ

ブンであ り、 メモ リ使用量およびパフォーマンスで最適化されています。 Vivado 合成では、 次の言語の合成可能な

サブセッ トがサポート されます。

• SystemVerilog: SystemVerilog (統合ハードウェア設計、 仕様、 および検証言語) の IEEE 規格 (IEEE Std 1800-2012)

• Verilog: Verilog ハードウェア記述言語の IEEE 標準規格 (IEEE 標準規格 1364-2005)

• VHDL: VHDL 言語の IEEE 標準規格 (IEEE 標準規格 1076-2002)

• VHDL 2008

• 混合言語: VHDL、 Verilog、 および SystemVerilog の混合をサポート。

Vivado ツールでは、業界標準の Synopsys デザイン制約 (SDC) に基づくザイ リ ンクス デザイン制約 (XDC) もサポート

されています。

重要: Vivado 合成では、 UCF 制約はサポート されません。 UCF 制約は XDC 制約に変換する必要があ り ます。 詳細

は、 『ISE から Vivado Design Suite への移行ガイ ド』 (UG911) [参照 18] のこのセクシ ョ ンを参照してください。

合成を設定して実行するには、 次の 2 つの方法があ り ます。

• プロジェク ト モードを使用 (Vivado 統合設計環境 (IDE) でオプシ ョ ンを選択)。

• 非プロジェク ト モードを使用 (Tcl コマンドまたはスク リプ ト を実行し、 デザイン ファ イルをユーザーが制御)。

操作モードの詳細は、 『Vivado Design Suite ユーザー ガイ ド : デザイン フローの概要』 (UG892) [参照 5] を参照してく

ださい。 この章では、 両方のモードを使用した合成を個別のセクシ ョ ンで説明します。

合成手法

Vivado IDE では、合成およびインプリ メンテーシ ョ ン run をボタンをク リ ッ クするだけで実行可能な環境が提供され

ています。 run のデータは自動的に管理され、 さまざまな RTL ソース バージ ョ ン、 ターゲッ ト デバイス、 合成およ

びインプリ メンテーシ ョ ン オプシ ョ ン、 物理制約およびタイ ミ ング制約を使用して繰り返し実行できます。

Vivado IDE では、 次の操作を実行できます。

• ス ト ラテジを作成および保存。 ス ト ラテジとは、 合成またはインプリ メンテーシ ョ ンのデザイン run に適用さ

れるコマンド オプシ ョ ンの設定です。 「run ス ト ラテジの作成」 を参照してください。

Page 7: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 7UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

• 複数の合成およびインプリ メンテーシ ョ ン run を設定し、 順次に、 またはマルチプロセッサ マシンで同時に実

行。 「合成の実行」 を参照してください。

• 合成またはインプリ メンテーシ ョ ンの進捗状況を監視、 ログ レポート を確認、 run をキャンセル。 「合成実行の

監視」 を参照してください。

合成の使用

このセクシ ョ ンでは、 Vivado 統合設計環境 (IDE) を使用して Vivado 合成を設定および実行する方法を説明します。

ほとんどの Vivado IDE 操作には同等の Tcl コマンドが示されており、『Vivado Design Suite Tcl コマンド リ ファレンス ガイ ド』 (UG835) [参照 4] への直接リ ンクが提供されています。Tcl コマンドおよび Tcl の使用方法の詳細は、『Vivado Design Suite ユーザー ガイ ド : Tcl スク リプ ト機能の使用』 (UG894) [参照 7] に掲載されています。

ビデオ: 詳細は、 Vivado Design Suite QuickTake ビデオ: 合成オプシ ョ ンVivado Design Suite QuickTake ビデオ: デザイン

の合成を参照してください。

合成設定

1. Flow Navigator から [Settings] をク リ ッ ク して [Synthesis] をク リ ッ クするか、 または [Flow] → [Settings] → [Synthesis Settings] をク リ ッ ク します。

次の図に示す [Settings] ダイアログ ボッ クスが開きます。

Page 8: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 8UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

2. [Constraints] エリ アの [Default Constraint Set] で、 デフォルトでアクティブな制約セッ ト とする制約セッ ト を選択

します。 制約セッ トは、 ザイ リ ンクス デザイン制約 (XDC) で記述されたデザイン制約を含む複数の制約ファイ

ルのセッ トです。 デザイン制約には、 次の 2 種類があ り ます。

° 物理制約: ピン配置、 ブロ ッ ク RAM、 LUT、 フ リ ップフロ ップなどのセルの絶対配置または相対配置、 お

よびデバイスのコンフ ィギュレーシ ョ ン設定を定義します。

° タイ ミ ング制約: デザインの周波数要件を定義します。 タイ ミ ング制約を設定しない場合、 デザインがワイ

ヤの長さおよび配線の密集度にのみ基づいて最適化されます。

制約管理の詳細は、 『Vivado Design Suite ユーザー ガイ ド : 制約の使用』 (UG903) [参照 12] のこのセクシ ョ ンを参

照してください。

選択した制約セッ トは新しい run に使用され、 デザインの変更も この制約セッ トに保存されます。

3. [Options] エリ アで、 [Strategy] ド ロ ップダウン リ ス トから合成 run に使用する合成ス ト ラテジを選択します。 次

の図に示す定義済みス ト ラテジがあ り ます。

X-Ref Target - Figure 1-1

図 1-1: [Settings] ダイアログ ボックスの [Synthesis] ページ

Page 9: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 9UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

あらかじめ定義されたス ト ラテジから選択するか、 または独自のス ト ラテジを定義できます。 合成ス ト ラテジ

を選択する と、 使用可能な Vivado ス ト ラテジがダイアログ ボッ クスに表示されます。 オプシ ョ ンの値を変更す

る と、 「run ス ト ラテジの作成」 に説明されているよ うに、 合成ス ト ラテジの設定を変更できます。

すべてのス ト ラテジおよびその設定は、 次の [-directive] オプシ ョ ンのリ ス トおよび表 1-2 を参照してください。

4. 表で次の合成オプシ ョ ンを設定します。

° [-flatten_hierarchy]: Vivado 合成での階層の制御方法を指定します。

- [none]: 階層をフラ ッ ト化しません。 合成の出力には、 元の RTL と同じ階層が含まれます。

- [full]: 最上位以外の階層をすべてフラ ッ ト化します。

- [rebuilt]: 階層をフラ ッ ト化して合成を実行した後に、 元の RTL に基づいて階層を再構築します。 この

設定を使用する と、 境界を越えた最適化を実行できるので QoR が向上し、 最終的な階層は RTL と似た

ものになるので解析しやすくな り ます。

° [-gated_clock_conversion]: ゲーテッ ド ク ロ ッ クをイネーブルに変換する機能をオン/オフにします。

ゲーテッ ド ク ロ ッ クの変換を使用するには、 RTL 属性も必要です。 詳細は、 「GATED_CLOCK」 を参照し

てください。

° [-bufg]: デザインで推論可能な BUFG の最大数を指定します。 このオプシ ョ ンは、 デザイン ネッ ト リ ス トの

ほかの BUFG が合成プロセスで認識されない場合に使用します。

RTL にインスタンシエート されている BUFG の数が検出され、指定された数までの BUFG が推論されます。

たとえば、 [-bufg] が 12 に設定されており、 RTL に 3 つの BUFG がインスタンシエート されている場合、

Vivado 合成でさらに 9 個までの BUFG を推論可能です。

° [-directive]: [-effort_level] に置き換わるオプシ ョ ンで、 Vivado 合成の最適化方法を指定します。 すべてのス

ト ラテジとその設定は、 表 1-2 を参照してください。 値は次のとおりです。

- [Default]: デフォルト設定。 表 1-2 を参照してください。

- [RuntimeOptimized]: 実行する最適化を少なく し、 いくつかの RTL 最適化を削除して、 合成のランタイ

ムを短縮します。

X-Ref Target - Figure 1-2

図 1-2: スト ラテジの選択

Page 10: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 10UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

- [AreaOptimized_high]: 三項加算インプリ メンテーシ ョ ンの強制、 コンパレータのキャ リー チェーンの

使用に対する新しいしきい値の適用、 エ リ アで最適化されたマルチプレクサーのインプリ メン ト を含

む、 全般的なエリ ア最適化を実行します。

- [AreaOptimized_medium]: 制御セッ ト最適化しきい値の変更、 三項加算インプリ メンテーシ ョ ンの強制、

専用 DSP ブロ ッ ク推論のしきい値の低減、 シフ ト レジスタのブロ ッ ク RAM 内への移動、 コンパレー

タのキャ リー チェーンの使用に対するしきい値の低減、 エ リ アで最適化されたマルチプレクサーの操

作を含む、 全般的なエリ ア最適化を実行します。

- [AlternateRoutability]: 配線性を向上するアルゴ リズムを実行します。 MUXF および CARRY の使用数が

削減します。

- [AreaMapLargeShiftRegToBRAM]: 大型のシフ ト レジスタを検出し、 専用ブロ ッ ク RAM を使用してイン

プリ メン ト します。

- [AreaMultThresholdDSP]: 専用 DSP ブロ ッ ク推論のしきい値を低く します。

- [FewerCarryChains]: オペランド サイズのしきい値を高く し、 キャ リー チェーンの代わりに LUT を使用

します。

- [LogicCompaction]: よ り少ないスライスを使用してロジッ クがコンパク トになるよ うに CARRY チェー

ンと LUT を並べ替えます。 これはタイ ミ ング QoR に悪影響を及ぼす可能性があ り ます。

° [-retiming]: 組み合わせゲート または LUT の反対側にレジスタを自動的に移動するこ とによ り、 回路のパ

フォーマンスを向上します。 元の動作および回路のレイテンシは保持され、 RTL ソースを変更する必要は

あ り ません。 デフォルトはオフです。

注記: OOC モードで リ タイ ミ ングを実行する場合、 ポートで駆動されるレジスタおよびポート を駆動する

レジスタはリ タイ ミ ングされません。

° [-fsm_extraction]: 有限ステート マシンの抽出およびマップ方法を指定します。 オプシ ョ ンについては、

「FSM_ENCODING」 を参照してください。

° [-keep_equivalent_registers]: 同じ入力ロジッ クを使用するレジスタが統合されないよ うにします。

° [-resource_sharing]: 異なる信号間での算術演算子の共有を設定します。 設定可能な値は [auto]、 [on]、 [off] です。 [auto] に設定する と、 リ ソースの共有はデザインのタイ ミ ングに応じて実行されます。

° [-control_set_opt_threshold]: ク ロ ッ ク イネーブル最適化のしきい値を設定し、 制御セッ トの数を削減します。

デフォルトは [auto] で、 ターゲッ ト デバイスに基づいてツールによ り値が選択されます。 有効な値は正の

整数です。

制御セッ ト をレジスタの D ロジッ クに移動するために必要なファンアウ トの数を指定します。 ファンアウ

トがこの指定値よ り大きい場合は、その信号でレジスタの制御セッ ト ピンが駆動されるよ う試みられます。

° [-no_lc]: オンにする と、 LUT の組み合わせがオフになり ます。

° [-no_srlextract]: オンにする とデザイン全体で SRL の抽出がオフになり、 SRL は単純なレジスタ と してイン

プリ メン ト されます。

° [-shreg_min_size]: SRL の推論のしきい値を設定します。 デフォルト値は 3 です。 この値は、 遅延が固定され

たチェーンの SRL (スタティ ッ ク SRL) が推論される順次エレ メン トの数を設定します。 ス ト ラテジによっ

て、 5 および 10 に設定されるこ と もあ り ます。 すべてのス ト ラテジとその設定は、 表 1-2 を参照してくだ

さい。

° [-max_bram]: デザインで使用可能なブロ ッ ク RAM の最大数を指定します。 このオプシ ョ ンは通常、 デザイ

ンにブラ ッ ク ボッ クスまたはサードパーティ ネッ ト リ ス トが含まれており、 それらのネッ ト リ ス ト用にエ

リ アを確保するために使用します。

注記: デフォルト設定は -1 で、 指定のパーツで使用可能な最大数に設定されます。

Page 11: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 11UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

° [-max_uram]: デザインで使用可能な UltraRAM (UltraScale+™ デバイスのブロ ッ ク RAM) ブロ ッ クの最大数

を指定します。 デフォルト設定は -1 で、 指定のパーツで使用可能な最大数に設定されます。

° [-max_dsp]: デザインで使用可能な DSP ブロ ッ クの最大数を指定します。 このオプシ ョ ンは通常、 デザイン

にブラ ッ ク ボッ クスまたはサードパーティ ネッ ト リ ス トが含まれており、 これらのネッ ト リ ス ト用にエリ

アを確保するために使用します。 デフォルト設定は -1 で、 指定のパーツで使用可能な最大数に設定されま

す。

° [-max_bram_cascade_height]: ツールでカスケード接続可能なブロ ッ ク RAM の最大数を指定します。 デフォ

ルト設定は -1 で、 指定のパーツで使用可能な最大数に設定されます。

° [-max_uram_cascade_height]: ツールでカスケード接続可能な UltraRAM ブロ ッ クの最大数を指定します。 デ

フォルト設定は -1 で、 指定のパーツで使用可能な最大数に設定されます。

° [-cascade_dsp]: DSP ブロ ッ ク出力の合計の加算をインプリ メン トする方法を制御します。 デフォルトでは、

DSP 出力の合計はブロッ クのビルト イン加算チェーンを使用して算出されます。 [tree] に設定する と、 合計

はファブリ ッ クにインプリ メン ト されます。 設定可能な値は [auto]、 [tree]、 [force] で、 デフォルトは [auto] です。

° [-no_timing_driven] (オプシ ョ ン): デフォルトのタイ ミ ング ド リブン合成アルゴ リズムをディ スエーブルにし

ます。 これによ り合成の実行時間が短縮されますが、 合成に対するタイ ミ ングの影響は無視されます。

° [-sfcu]: 合成をシングル ファ イル コンパイル ユニッ ト モードで実行します。

° [-assert]: VHDL アサート文の評価をイネーブルにします。 エラーの場合は合成フローが停止してエラー メ ッセージが表示され、 警告の場合は警告メ ッセージが表示されます。

° [-debug_log]: 合成ロジッ ク ファ イルにデバッグ用の追加情報を表示します。

° [tcl.pre] および [tcl.post]: 合成の前後に実行する Tcl ファ イルを指定します。

注記: tcl.pre および tcl.post スク リプ ト内のパスは、 現在のプロジェク トに関連付けられている run ディ レク ト リ <project>/<project.runs>/<run_name> を基準と しています。

Tcl スク リプ トの詳細は、『Vivado Design Suite ユーザー ガイ ド : Tcl スク リプ ト機能の使用』 (UG894) [参照 7] のこのセクシ ョ ンを参照してください。

スク リプ ト内の相対パスを定義するには、 現在のプロジェク ト または現在の run の DIRECTORY プロパティ

を使用します。

5. [Finish] をク リ ッ ク します。

プロパティ を取得する Tcl コマンド

get_property DIRECTORY [current_project] get_property DIRECTORY [current_run]

run スト ラテジの作成

ス ト ラテジは、 合成ツールおよびインプリ メンテーシ ョ ンで実行されるさまざまなユーティ リ ティやプログラムの

オプシ ョ ンのあらかじめ定義されたセッ トです。 各メジャー リ リースには、 そのバージ ョ ン専用のス ト ラテジがあ

り ます。

ビデオ: 詳細は、 Vivado Design Suite QuickTake ビデオ: run の作成および管理を参照してください。

Page 12: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 12UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

Flow Navigator から [Settings] をク リ ッ ク して [Synthesis] をク リ ッ ク し、[Strategy] ド ロ ップダウン リ ス ト (図 1-2) から

ス ト ラテジを選択して [OK] をク リ ッ ク します。

ユーザー定義スト ラテジの保存

独自の合成ス ト ラテジを定義できます。 次の手順に従います。

1. [Settings] ダイアログ ボッ クスの [Synthesis] ページで、 既存の run ス ト ラテジを選択します。 オプシ ョ ンを変更

し、 [Save Strategy As] ボタン をク リ ッ ク します。図 1-3 に示す [Save Strategy As] ダイアログ ボッ クスが表示

されます。

2. ス ト ラテジの名前 ([User defined strategy name]) および説明 ([Description]) を入力し、 [OK] をク リ ッ ク します。

作成したス ト ラテジは、 [Strategy] ド ロ ップダウン リ ス トの [User Defined Strategies] の下に表示されます。

合成への入力

Vivado 合成には、 RTL ソース コードおよびタイ ミ ング制約を入力できます。 RTL または制約ファイルを追加するに

は、 次の手順に従います。

X-Ref Target - Figure 1-3

図 1-3: [Save Strategy As] ダイアログ ボックス

Page 13: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 13UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

1. [File] メニューまたは Flow Navigator から [Add Sources] をク リ ッ ク し、次の図に示す Add Sources ウ ィザードを開

きます。

2. 追加するファイルに対応するオプシ ョ ンをオンにし、 [Next] をク リ ッ ク します。

次の図に、 [Add or create design sources] をオンにした場合に表示される [Add or Create Design Sources] ページを示

します。

X-Ref Target - Figure 1-4

図 1-4: Add Sources ウィザード

Page 14: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 14UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

3. 制約、 RTL、 またはその他のプロジェク ト ファ イルを追加し、 [Finish] をク リ ッ クます。

RTL ソース プロジェク ト作成の詳細は、 『Vivado Design Suite ユーザー ガイ ド : システム レベル デザイン入力』 (UG895) [参照 8] のこのセクシ ョ ンを参照してください。

Vivado 合成では、 ザイ リ ンクス ツールでサポート される VHDL、 Verilog、 SystemVerilog、 または混合言語のファイ

ルの合成可能なサブセッ ト を読み込むこ とができます。

サポート される HDL 構文の詳細は、 次の章を参照してください。

• 第 4 章 「HDL コーディング手法」

• 第 5 章 「VHDL サポート 」

• 第 6 章 「VHDL-2008 言語サポート 」

• 第 7 章 「Verilog サポート 」

• 第 8 章 「SystemVerilog サポート 」

• 第 9 章 「混合言語サポート 」

Vivado 合成では、 合成での処理を制御するいくつかの RTL 属性もサポート されています。 これらの属性の説明は、

第 2 章 「合成属性」 を参照してください。 Vivado 合成では、 タイ ミ ング制約に XDC ファ イルが使用されます。

X-Ref Target - Figure 1-5

図 1-5: Add Sources ウィザード : [Add or Create Design Sources] ページ

Page 15: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 15UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

使用可能なブロッ ク合成ス ト ラテジは、 第 3 章 「ブロ ッ ク合成ス ト ラテジの使用」 を参照してください。

重要: Vivado Design Suite では、 UCF フォーマッ トはサポート されません。 UCF から XDC への変換手順は、 『ISE から Vivado Design Suite への移行ガイ ド』 (UG911) [参照 18] のこのセクシ ョ ンを参照してください。

ファイルのコンパイル順

あるファ イルに宣言が含まれ、 別のファイルがその宣言に依存している場合、 特定のコンパイル順が必要になり ま

す。 Vivado IDE では、 RTL ソース ファ イルのコンパイル順は、 [Sources] ウ ィンド ウの [Compile Order] ビューに上か

ら下への順序で表示されます。

Vivado ツールでは、 最上位モジュールと して最適なモジュールが自動的に特定され、 コンパイル順が自動的に管理

されます。 アクティブ階層に含まれる最上位モジュール ファ イルおよびすべてのソース ファ イルが、 合成およびシ

ミ ュレーシ ョ ンで正しい順序で使用されます。

[Sources] ウ ィンド ウのポップアップ メニューには [Hierarchy Update] コマンドがあ り、 最上位モジュールへの変更、

デザインのソース ファ イルへの変更などを Vivado IDE でどのよ うに処理するかを指定できます。

デフォルト設定は [Automatic Update and Compile Order] で、 ツールによ り コンパイル順が管理されて [Compile Order] ビューにその順序が表示され、 [Hierarchy] ビューにどのモジュールが使用されて階層ツ リーのどこに位置するかが

表示されます。

ソース ファ イルを変更する と、 コンパイル順が自動的に更新されます。

合成の前にコンパイル順を変更するには、 ファ イルを選択して右ク リ ッ ク し、 [Hierarchy Update] → [Automatic Update, Manual Compile Order] をク リ ッ ク して、 デザインに最適な最上位モジュールが Vivado IDE で自動的に選択さ

れ、 コンパイル順は手動で指定できるよ うにします。

手動コンパイル順はデフォルトではオフです。 [Sources] ウ ィンド ウの [Compile Order] ビューでファイルを選択して

移動する と、 手動コンパイル順をオンにするかど うかを尋ねるダイアログ ボッ クス (図 1-6) が表示されます。

[Sources] ウ ィンド ウの [Compile Order] ビューで、 ファ イルをド ラ ッグするか、 ポップアップ メニューの [Move Up] または [Move Down] コマンドを使用して、 コンパイル順を変更します。

[Hierarchy Update] メニューには、 次の図に示すよ うにほかのオプシ ョ ンもあ り ます。

X-Ref Target - Figure 1-6

図 1-6: [Move Sources] ダイアログ ボックス

X-Ref Target - Figure 1-7

図 1-7: [Hierarchy Update] メニューのオプシ ョ ン

Page 16: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 16UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

デザイン フローの詳細は、 『Vivado Design Suite ユーザー ガイ ド : デザイン フローの概要』 (UG892) [参照 5] のこのセ

クシ ョ ンを参照してください。

グローバル インクルード ファイルの定義 Vivado IDE では、 1 つまたは複数の Verilog または Verilog ヘッダー ファ イルをグローバル インクルード ファ イルと

して指定できます。 これらのファイルは、 ほかのソースの前に処理されます。 共通ヘッダー ファ イルを使用するデ

ザインでは、 複数の Verilog ソースにそれぞれ複数の `include 文を含める必要がある場合もあ り ます。

Verilog ファ イルまたは Verilog ヘッダー ファ イルをグローバル インクルード ファ イルと して指定するには、 次を実

行します。

1. [Sources] ウ ィンド ウでファ イルを選択します。

2. [Source File Properties] ウ ィンド ウの [Properties] ビューで [Global Include] チェッ ク ボッ クスをオンにします (図 1-8)。

ヒン ト : Verilog では、 1 つの Verilog ソースのみに適用するヘッダー ファ イル (特定の `define マクロなど) は、 グ

ローバル インクルード ファ イルと して指定するのではなく `include 文を使用して参照する必要があ り ます。

[Sources] ウ ィンド ウの詳細は、『Vivado Design Suite ユーザー ガイ ド : Vivado IDE の使用』 (UG893) [参照 6] のこのセク

シ ョ ンを参照してください。

合成の実行

合成 run では、 合成中に使用されるデザインの詳細を定義および設定できます。 合成 run は次を定義します。

° 合成中にターゲッ ト とするザイ リ ンクス デバイス

° 適用する制約セッ ト

° 1 つまたは複数の合成 run を実行するオプシ ョ ン

° 合成エンジンの結果を制御するオプシ ョ ン

RTL ソース ファ イルの run および制約を定義するには、 次の手順に従います。

X-Ref Target - Figure 1-8

図 1-8: [Source File Properties] ウィンドウで [Global Include] をオン

Page 17: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 17UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

1. [Flow] → [Create Runs] をク リ ッ クするか、 [Design Runs] ダイアログ ボッ クスで [Create Runs] ボタン をク

リ ッ ク します。 図 1-9 に示す Create New Runs ウ ィザードが開きます。

2. [Synthesis] をオンにし、 [Next] をク リ ッ ク します。

次の図に示す [Configure Synthesis Runs] ページが表示されます。

3. [Add] ボタンをク リ ッ ク し、 run の名前 ([Name])、 制約セッ ト ([Constraints Set])、 デバイス ([Part])、 ス ト ラテジ ([Strategy]) を選択し、 この run をアクティブ run とする場合は [Make Active] をオンにします。

X-Ref Target - Figure 1-9

図 1-9: Create New Runs ウィザード

X-Ref Target - Figure 1-10

図 1-10: Create New Runs ウィザード : [Configure Synthesis Runs] ページ

Page 18: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 18UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

Vivado IDE にはデフォルトのス ト ラテジが含まれています。 ス ト ラテジ run には、 特定の名前を指定するか、 デ

フォルト名 (synth_1、 synth_2 など) を使用します。 カスタム ス ト ラテジの作成方法は、 「run ス ト ラテジの

作成」 を参照してください。

詳細は、 『Vivado Design Suite ユーザー ガイ ド : 制約の使用』 (UG903) [参照 12] の次のセクシ ョ ンを参照してくだ

さい。

° 制約の使用の詳細は、 このセクシ ョ ンを参照してください。

° 制約の処理順の詳細は、 このセクシ ョ ンを参照してください。

一部の制約がプロジェク ト用に処理される と、 それらの制約属性はデザインの 「プロパティ」 とな り ます。 デ

ザイン プロパティの詳細は、 『Vivado Design Suite プロパティ リ ファレンス ガイ ド』 (UG912) [参照 19] を参照し

てください。

4. [Next] をク リ ッ ク します。 [Launch Options] ページが表示されます。

5. [Launch Options] ページで次のオプシ ョ ンを設定し、 [Next] をク リ ッ ク します。

° [Launch directory] ド ロ ップダウン リ ス トから run を実行するディ レク ト リ を選択します。

° [Options] エリ アで次のいずれかをオンにします。

- [Launch runs on local host]: 作業中のマシンで run を実行します。 [Number of jobs] で実行する run の数を

指定します。

- [Launch runs on remote host] (Linux のみ): run を リモート ホス トで実行し、 そのホス ト を設定します。

Linux のリモート ホス トでの run の実行については、 『Vivado Design Suite ユーザー ガイ ド : インプリ メ

ンテーシ ョ ン』 (UG904) [参照 13] のこのセクシ ョ ンを参照してください。 [Configure Hosts] をク リ ッ ク

する と、 ホス ト を設定するダイアログ ボッ クスが開きます。

- [Generate scripts only]: 後で実行するスク リプ ト を生成します。 runme.bat (Windows) または runme.sh (Linux) を使用して run を開始します。

- [Do not launch now]: 前のページの設定を保存し、 run を後で実行できるよ うにします。

X-Ref Target - Figure 1-11

図 1-11: [Launch Runs] ダイアログ ボックス

Page 19: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 19UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

6. [Create New Runs Summary] ページで [Finish] をク リ ッ ク します。

次の図に示すよ うに、 作成した run が [Design Runs] ウ ィンド ウに表示されます。

[Design Runs] ウィンドウの使用

[Design Runs] ウ ィンド ウには、 プロジェク トで作成された合成 run と インプ リ メンテーシ ョ ン run のすべてが表示さ

れ、 それらを設定、 管理、 実行するためのコマンドを実行できます。

[Design Runs] ウ ィンド ウが表示されていない場合は、 [Window] → [Design Runs] をク リ ッ ク します。 1 つの合成 run に、複数のインプリ メンテーシ ョ ン run を含めるこ とができます。プラス記号 (+) やマイナス記号 (-) をク リ ッ クする

と、 合成 run のツ リー表示を展開したり、 閉じた りできます。 [Design Runs] ウ ィンド ウには、 run のステータス (実行

されていない、 進行中、 完了、 最新の状態でない) が示されます。 ソース ファ イル、 制約、 またはプロジェク ト設定

を変更する と、 run は最新の状態ではなくな り ます。

特定の run を リセッ ト 、 削除、 または変更するには、 run を右ク リ ッ ク して [Reset Runs]、 [Delete]、 または [Change Run Settings] をク リ ッ ク します。

アクテ ィブ run の設定

Vivado IDE で一度にアクティブにできるには、 1 つの合成 run と 1 つのインプリ メンテーシ ョ ン run のみです。 すべ

てのレポートおよびウ ィンド ウには、 アクティブな run の情報が表示されます。 [Project Summary] には、 アクティブ

な run のコンパイル、 リ ソース、 およびサマリ情報が表示されます。

別の run をアクティブにするには、 [Design Runs] ウ ィンド ウで run を右ク リ ッ ク し、 [Make Active] コマンドをク リ ッ

ク します。

合成 run の実行

合成 run を実行するには、 次のいずれかを実行します。

• Flow Navigator で [Run Synthesis] をク リ ッ ク します。

• メ イン メニューから [Flow] → [Run Synthesis] をク リ ッ ク します。

• [Design Runs] ウ ィンド ウで run を右ク リ ッ ク し、 [Launch Runs] をク リ ッ ク します。

最初の 2 つのオプシ ョ ンでは、 アクティブな合成 run が実行されます。 3 つ目のオプシ ョ ンでは、 [Launch Selected Runs] ダイアログ ボッ クスが開きます。

X-Ref Target - Figure 1-12

図 1-12: [Design Runs] ウィンドウ

Page 20: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 20UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

このダイアログ ボッ クスで、 run をローカル ホス ト またはリモート ホス トで実行するか、 あるいはスク リプ ト を生

成するかを指定できます。 リモート ホス トの使用については、 『Vivado Design Suite ユーザー ガイ ド : インプリ メン

テーシ ョ ン』 (UG904) [参照 13] のこのセクシ ョ ンを参照してください。

ヒン ト : run を実行するたびに、 別のプロセスが開始されます。 メ ッセージを確認する際は、 プロセス特定のものに

注意してください。

ボトムアップ アウト オブ コンテキスト フローの設定

HDL オブジェク ト を独立階層モジュールと してアウ ト オブ コンテキス ト (OOC) フローを実行するこ とによ り、 ボ

ト ムアップ フローを設定できます。 OOC フローの概要は、 『Vivado Design Suite ユーザー ガイ ド : デザイン フローの

概要』 (UG892) [参照 5] のこのセクシ ョ ンを参照してください。

OOC フローは、 次のよ うに実行されます。

• 下位 OOC モジュールは最上位から独立させて実行され、 独自の制約セッ トがあ り ます。

• OOC モジュールは必要に応じて実行できます。

• OOC モジュールを一度合成したら、 その run の RTL または制約を変更しない限り、 再度合成を実行する必要は

あ り ません。

• 最上位を実行する と、 下位の OOC run はブラ ッ ク ボッ クス と して処理されます。

注記: IP が OOC モードで合成される と、 最上位合成 run でこれらの IP のブラ ッ ク ボッ クスが推論されます。 このた

め、 最上位合成制約に含まれる IP 内部のピン、 ネッ ト 、 セルなどのオブジェク トは参照できません。 インプリ メン

テーシ ョ ンでは、 IP の DCP からのネッ ト リ ス トが、 最上位デザイン ファ イルの合成で生成されたネッ ト リ ス ト と リ

ンク され、 IP ブラ ッ ク ボッ クスが解決されます。 インプリ メンテーシ ョ ンで使用するために生成された IP の XDC 出力ファイルがユーザー制約と共に適用されます。 IP 内部のものを参照する制約がある場合、 合成中にこれに関す

る警告が表示されますが、 インプリ メンテーシ ョ ンには解決されます。

これによ り、 デザイン全体を合成する必要がなくなるので、 最上位の実行時間を大幅に短縮できます。

OOC run 用にモジュールを設定するには、 [Sources] ウ ィンド ウの [Hierarchy] ビューでモジュールを右ク リ ッ ク して [Set as Out-of-Context for Synthesis] をク リ ッ ク し、 表示されるダイアログ ボッ クス (図 1-13) で [OK] をク リ ッ ク しま

す。

[Set as Out-of Context for Synthesis] ダイアログ ボッ クスには、 次の情報およびオプシ ョ ンが表示されます。

X-Ref Target - Figure 1-13

図 1-13: [Set as Out-of-Context for Synthesis] ダイアログ ボックス

Page 21: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 21UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

° [Source Node]: OOC と して設定するモジュール。

° [New Fileset]: 新しいファイルセッ ト名。 変更可能です。

° [Generate Stub]: スタブ ファ イルを作成する場合にオンにします。

° [Clock Constraint File]: 新しい XDC テンプレートが作成されるよ うにするか、 ド ロ ップダウン リ ス トから既

存の XDC ファ イルを選択してその XDC ファ イルがこのファイルセッ トにコピーされるよ うに設定します。

この XDC ファ イルには、 OOC モジュールのすべてのクロ ッ ク ピンのクロ ッ ク定義が含まれます。

推奨: [Generate Stub] オプシ ョ ンはオンのままにしてください。 このオプシ ョ ンをオフにした場合は、 スタブ ファ イ

ルを作成し、 プロジェク トで設定する必要があ り ます。

OOC run が自動的に設定されます。 作成された OOC run は [Design Runs] ウ ィンド ウに新しい run と して表示されま

す。 OOC と して設定したモジュールは、 [Sources] ウ ィンド ウの [Compile Order] ビューで [Block Sources] の下に表示

されます。

アウ ト オブ コンテキス ト (OOC) フローを設定する と、 新しい run が設定されます。

この run を実行するには、 run を右ク リ ッ ク して [Launch Runs] をク リ ッ ク します ( 「合成 run の実行」 を参照)。 これ

によ り下位モジュールが最上位モジュールと して設定され、 I/O バッファーを作成せずに合成が実行されます。

合成で生成されたネッ ト リ ス トが保存され、 スタブ ファ イルを作成するオプシ ョ ンをオンにした場合は後で使用で

きるよ うにスタブ ファ イルが作成されます。 スタブ ファ イルは、 ブラ ッ ク ボッ クス属性が設定された、 入力と出力

を持つ下位モジュールです。

最上位モジュールを再実行する と、 ボ ト ムアップ合成によ り スタブ ファ イルがフローに挿入され、 下位モジュール

がブラ ッ ク ボッ クス と してコンパイルされます。 インプリ メンテーシ ョ ン run では下位ネッ ト リ ス トが挿入され、

デザインを完了します。

注意: OOC モジュールの下位に OOC モードのザイ リ ンクス IP が含まれる場合は、 ボ ト ムアップ OOC フローを使用

しないでください。 OOC モジュールにザイ リ ンクス IP を含める場合は、 IP の OOC モードをオフにしてください。

X-Ref Target - Figure 1-14

図 1-14: [Sources] ウィンドウの [Compile Order] ビュー

Page 22: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 22UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

また、 OOC モジュールにパラ メーターが設定されている場合や、 OOC モジュールのポートがユーザー定義タイプで

ある場合も、 このフローを使用しないでください。 これらの状況では、 フローの後の方で問題が発生します。

ボトムアップ フローの手動設定とネッ ト リス トのインポート

ボ ト ムアップ フローを手動で実行するには、 下位ネッ ト リ ス ト またはサードパーティ ネッ ト リ ス ト をブラ ッ ク ボッ

クス と してインスタンシエート します。 このよ うにする と、 Vivado ツールによ り合成の完了後にデザインにブラ ッ

ク ボッ クスが挿入されます。 次のセクシ ョ ンで、 このプロセスについて説明します。

重要: Vivado 合成では、 暗号化されている場合でも されていない場合でも、 合成済みネッ ト リ ス トは合成または最適

化されません。 そのため、 XDC 制約または合成属性はインポート されたコア ネッ ト リ ス トには影響しません。 ま

た、 デフォルトではコアのネッ ト リ ス トが読み込まれてインスタンシエート済みコンポーネン トが変更さるこ とは

あ り ません。 ただし、 セキュア IP の RTL は合成されるので、 制約が合成結果に影響します。

下位ネッ ト リス トの作成

下位ネッ ト リ ス ト を作成するには、 ネッ ト リ ス ト を最上位モジュールと して指定してプロジェク ト を設定します。

合成を実行する前に、 図 1-15 に示すよ うに OOC モードを設定します。

X-Ref Target - Figure 1-15

図 1-15: [Settings] ダイアログ ボックスの [Synthesis] ページ

Page 23: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 23UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

[More Options] フ ィールドに 「-mode out_of_context」 を入力する と、 合成でこのレベルに I/O バッファーは挿入され

ません。

合成が終了したら合成済みデザインを開き、 [Tcl Console] ウ ィンド ウに write_edif コマンドを入力します。 構文

は次のとおりです。

write_edif <design_name>.edf

下位ネッ ト リス トのデザインへのインスタンシエーシ ョ ン

最上位デザインを下位ネッ ト リ ス ト またはサードパーティ ネッ ト リ ス ト と共に実行するには、 下位ネッ ト リ ス ト を

ブラ ッ ク ボッ クス と してインスタンシエート し、 下位ネッ ト リ ス トのポート を Vivado ツールに示します。 「ボ ト ム

アップ アウ ト オブ コンテキス ト フローの設定」 では、 これをスタブ ファ イルと呼んでいます。

重要: Vivado ツールに示すポート名とネッ ト リ ス トのポート名が一致している必要があ り ます。

VHDL では、 次のコード例に示すよ うに、 component 文にポート を記述します。

component <name>port (in1, in2 : in std_logic;out1 : out std_logic);

end component;

Verilog にはコンポーネン トに相当するものはないので、 ラ ッパー ファ イルを使用して Vivado ツールにポート を示し

ます。 ラ ッパー ファ イルは通常の Verilog ファ イルと同じですが、 次の例に示すよ うに、 ポート リ ス トのみが含まれ

ます。

module <name> (in1, in2, out1);input in1, in2;output out1;

endmodule

下位ネッ ト リス トの統合

下位ネッ ト リ ス ト を作成して最上位ネッ ト リ ス トに正し く インスタンシエート したら、 プロジェク ト モードでは下

位ネッ ト リ ス ト を Vivado プロジェク トに追加し、 非プロジェク ト モードでは read_edif または read_verilog コマンドを使用して下位ネッ ト リ ス ト を読み込みます。

どちらのモードでも、 合成後にネッ ト リ ス トが結合されます。

注記: デザインがサードパーティ ネッ ト リ ス トでのみ構成されており、 プロジェク トにほかの RTL ファ イルがない

場合は、 プロジェク ト をそれらのネッ ト リ ス トのみで作成するか、 非プロジェク ト モードでは read_edif および read_verilog Tcl コマンド と link_design Tcl コマンドを使用します。

Page 24: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 24UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

インクリ メンタル合成

Vivado 合成はインク リ メンタルに実行できます。 このフローでは、 基準 run を指定して、 その後の run の実行で参照

されるよ うにします。 デザインの変更が検出され、 変更された部分のみが再合成されます。 このフローの主な利点

は、 デザインの変更が少ない場合に、 実行時間が大幅に短縮されるこ とです。 また、 デザインの QoR の変動も小さ

くな り ます。

インク リ メンタル合成は、 プロジェク ト モードおよび非プロジェク ト モードで実行できます。

プロジェク ト モードでのインクリ メンタル合成の設定

プロジェク トでインク リ メンタル合成は、 [Settings] ダイアログ ボッ クスの [Synthesis] ページで設定できます。

重要なオプシ ョ ンが 2 つあ り ます。

• [Write Incremental Synthesis]: インク リ メンタル合成情報を合成後のチェッ クポイン トに書き込みます。 インク リ

メンタル合成を実行するには、 このオプシ ョ ンを設定する必要があ り ます。

• [Incremental synthesis]: インク リ メンタル情報が既に結果に記述されている場合に、 インク リ メンタル合成をど

のよ うに実行するかを指定します。 このフ ィールドの右側にある [Browse] (...) ボタンをク リ ッ クする と、 次の

図に示すダイアログ ボッ クスに 3 つのオプシ ョ ンが表示されます。

X-Ref Target - Figure 1-16

図 1-16: [Settings] ダイアログ ボックスの [Synthesis] ページ

Page 25: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 25UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

プロジェク ト モードでのインク リ メンタル合成では、 次のオプシ ョ ンを使用できます。

• [Automatically use the checkpoint from the previous run]: 前回の run からのインク リ メンタル情報を使用します。 こ

のオプシ ョ ンでは、 フローを管理せずに、 デザインに少しの変更を加えて実行できます。 このオプシ ョ ンを選

択した場合、 初回の run ではデザイン全体が合成されます。

• [Specify design checkpoint]: [Write Incremental Synthesis] をオンにしたチェッ クポイン ト を指定して、 そのチェッ

クポイン トからの情報を使用します。

• [Disable incremental compile]: インク リ メンタル情報が生成されている場合でも、 インク リ メンタル情報を使用し

ないよ うに指定します。 デザイン全体が合成されます。

X-Ref Target - Figure 1-17

図 1-17: インクリ メンタル合成のオプシ ョ ン

Page 26: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 26UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

非プロジェク ト モードでのインクリ メンタル合成の実行

非プロジェク ト モードを使用する場合は、 -incremental_synth オプシ ョ ンを使用する と、 インク リ メンタル合

成情報がチェッ クポイン トに追加されます。 次に例を示します。

write_checkpoint -incremental_synth <name>.dcp

synth_design を実行した後、 これはプロジェク ト モードの [Write Incremental Synthesis] オプシ ョ ンと同じよ うに

機能します。 このオプシ ョ ンはフローのどの段階の後にも追加できますが、 synth_design を同じセッシ ョ ンで実

行する必要があ り ます。

その後のインク リ メンタル run では、 次のコマンドを使用します。

read_checkpoint -incremental <name>.dcp

これを synth_design コマンドの前に実行します。 こ こで指定する .dcp ファ イルは、 -incremental オプシ ョ ン

を使用して生成した .dcp ファ イルである必要があ り ます。

デザインの実行およびログ ファイルの解釈

基準 run を実行する と、 合成の実行時にデザインがパーティシ ョ ンに分割されます。 インク リ メンタル run が開始す

る と、 エラボレート済みデザインが基準 run と比較され、 変更されたモジュールが特定されます。 基準 run からの

パーティシ ョ ンは、 インク リ メンタル run で初期化されます。 変更されたモジュールを含むパーティシ ョ ンと、 それ

らの影響を受けるパーティシ ョ ンがマーク されます。 これに基づいて、 マーク されたパーティシ ョ ンに対して合成

が実行されます。 再合成されたデザインの量および部分は、 インク リ メンタル run の後にログ ファ イルで確認でき

ます。

この情報は、 「Incremental Synthesis Report Summary」 (インク リ メンタル合成レポート サマリ ) セクシ ョ ンにあ り ます。

次にレポートの例を示します。

このセクシ ョ ンには、 変更があったために再合成されたデザインの部分と、 基準 run からの変更量が示されます。

X-Ref Target - Figure 1-18

図 1-18: インクリ メンタル合成レポート サマリ

Page 27: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 27UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

デザイン全体の再合成

デザインの状態またはタイプによっては、 このフローでデザイン全体が再合成される場合があ り ます。 次の場合に

デザイン全体が再合成されます。

1. 最上位階層が変更された

2. 合成設定が変更された

3. パーティシ ョ ンが少ない小型のデザイン

4. 50% 以上のパーティシ ョ ンに変更がある

また、 XDC ファ イルのサイズが非常に大きい場合にも、 デザイン全体が再合成される場合があ り ます。 これは、 今

後のリ リースで改善される予定です。

注記: -mode out_of_context は合成設定ですが、 デザイン全体の再合成はト リガーしません。

Vivado IP とサードパーティ合成ツール

Vivado IP カタログから使用可能なザイ リ ンクス IP は、 Vivado Design Suite で作成、 制約、 および検証します。

注記: -mode out_of_context は合成設定ですが、 デザイン全体の再合成はト リガーしません。

ザイ リ ンクスが提供するほとんどの IP には IEEE P1735 で暗号化された HDL があ り、 サードパーティ合成ツールで

のサポートは提供されていません。

Vivado IDE で提供されるザイ リ ンクス IP をサードパーティ合成ツールにインスタンシエートするには、 次のフロー

を使用するこ とをお勧めします。

1. [Manage IP] 環境で IP カスタマイズを作成します。

2. 合成デザイン チェッ クポイン ト (DCP) を含めた IP の出力ファイルを生成します。

Vivado IDE でスタブ HDL ファ イル (_stub.v|_stub.vhd) が作成されます。このスタブ HDL ファ イルをサード

パーティ合成ツールで使用して、 IP のブラ ッ ク ボッ クスを推論します。 スタブ ファ イルには、 I/O バッファー

が推論されないよ うにする指示子が含まれています。 ほかの合成ツールの指示子をサポートするには、 これら

のファイルを変更する必要がある場合があ り ます。

3. ザイ リ ンクス IP のスタブ ファ イルを含むデザインを合成します。

4. サードパーティ合成ツールで生成されたネッ ト リ ス ト とザイ リ ンクス IP の DCP ファ イルを使用して、Vivado インプリ メンテーシ ョ ンを実行します。 詳細は、 『Vivado Design Suite ユーザー ガイ ド : IP を使用した設計』 (UG896) [参照 9] のこのセクシ ョ ンを参照してください。

プロセスのバックグラウンドへの移動

Vivado IDE で合成またはインプリ メンテーシ ョ ンを実行する と、 ダイアログ ボッ クスにプロセスをバッ クグラウン

ドで実行するオプシ ョ ンが表示されます。 run をバッ クグラウンドに移動する と、 レポート を表示するなど、 Vivado IDE でほかの機能を実行できるよ うにな り ます。

Page 28: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 28UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

合成実行の監視

合成 run のステータスは、 次の図に示す [Log] ウ ィンド ウで確認します。 合成中にこのビューに表示される メ ッセー

ジは、 合成ログ ファ イルにも含まれます。

合成終了後のフロー run が完了する と、 次の図に示す [Synthesis Completed] ダイアログ ボッ クスが表示されます。

次のいずれかをオンにします。

• [Run Implementation]: インプリ メンテーシ ョ ンを現在のインプリ メンテーシ ョ ン プロジェク ト設定を使用して実

行します。

X-Ref Target - Figure 1-19

図 1-19: [Log] ウィンドウ

X-Ref Target - Figure 1-20

図 1-20: [Synthesis Completed] ダイアログ ボックス

Page 29: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 29UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

• [Open Synthesized Design]: 合成済みネッ ト リ ス ト 、 アクティブな制約セッ ト、 ターゲッ ト デバイスを合成済みデ

ザイン環境で開き、 I/O ピン配置、 デザイン解析、 フロアプランを実行できるよ うにします。

• [View Reports]: [Reports] ウ ィンド ウを開き、 レポート を表示できるよ うにします。

• [Don't show this dialog again] をオンにする と、 次回からこのダイアログ ボッ クスは表示されなくな り ます。

ヒン ト : このダイアログ ボッ クスが再び表示されるよ うにするには、 [Tools] → [Settings] をク リ ッ ク し、 左側のペイ

ンで [Window Behavior] をク リ ッ ク します。

合成結果の解析

合成が終了したら、 合成レポート を表示し、 合成済みデザインを開いて解析できます。 [Reports] ウ ィンド ウには、

Vivado IDE での合成およびインプリ メンテーシ ョ ンで生成されたレポートの リ ス トが表示されます。

ビデオ: 詳細は、 Vivado Design Suite QuickTake ビデオ: Vivado を使用した高度な合成を参照してください。

次の図に示す [Reports] ウ ィンド ウを開き、 特定の run のレポート を選択します。

合成済みデザイン環境の使用

Vivado IDE には、 デザインをさまざまな面から解析する環境が含まれています。 合成済みデザインを開く と、 合成

済みネッ ト リ ス ト 、 アクティブな制約セッ ト、 およびターゲッ ト デバイスが読み込まれます。

合成済みデザインを開くには、Flow Navigator または [Flow] メニューで [Open Synthesized Design] をク リ ッ ク します。

X-Ref Target - Figure 1-21

図 1-21: [Reports] ウィンドウ

Page 30: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 30UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

合成済みデザインを開く と、 Vivado IDE に次の図に示す [Device] ウ ィンド ウが表示されます。

この環境から、 デザイン ロジッ ク と階層の確認、 リ ソース使用率およびタイ ミ ング見積も りの表示、 デザイン ルー

ル チェッ ク (DRC) を実行できます。 詳細は、 『Vivado Design Suite ユーザー ガイ ド : デザイン解析およびクロージャ テクニッ ク』 (UG906) [参照 15] を参照してください。

ロジックの解析

Vivado IDE には、 ロジッ クを解析するウ ィンド ウが複数あ り ます。 1 つのウ ィンド ウで選択した情報はほかのウ ィン

ド ウでも選択されるよ うになっており、 必要な情報をすばやく見つけるこ とができます。

• [Netlist] ウ ィンド ウおよび [Sources] ウ ィンド ウの [Hierarchy] ビューには、 ナビゲート可能な階層ツ リー形式の

表示が含まれます。

• [Schematic] ウ ィンド ウでは、 選択したロジッ クを展開したり階層表示にできます。

• [Device] ウ ィンド ウは、 デバイス、 配置ロジッ ク オブジェク ト 、 および接続をグラフ ィカルに表示します。

X-Ref Target - Figure 1-22

図 1-22: [Device] ウィンドウ

Page 31: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 31UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

ロジック階層の表示

[Netlist] ウ ィンド ウには、 合成済みデザインのロジッ ク階層が表示されます。 ネッ ト リ ス ト内のロジッ ク インスタン

スまたはネッ ト を、 展開して選択できます。

別のウ ィンド ウでロジッ ク オブジェク ト を選択する と、[Netlist] ウ ィンド ウが自動的に展開されて選択したロジッ ク オブジェク トが表示され、 [Instance Properties] または [Net Properties] ウ ィンド ウにインスタンスまたはネッ トに関す

る情報が表示されます。

[Sources] ウ ィンド ウの [Hierarchy] ビューには、 RTL ロジッ ク階層がグラフ ィカルに表示されます。 各モジュールの

大きさが、 その他のモジュールに相対的な比率で表示されるので、 選択したロジッ ク モジュールのサイズや位置を

判断できます。

[Hierarchy] ウ ィンド ウを開くには、 [Netlist] ウ ィンド ウを右ク リ ッ ク し、 次の図に示す [Show Hierarchy] をク リ ッ ク

します。 F6 キーを押しても [Hierarchy] ビューを開く こ とができます。

ロジック回路図の解析

[Schematic] ウ ィンド ウでは、 選択したロジッ クを展開して表示できます。 [Schematic] ウ ィンド ウを表示するには、

少なく と も 1 つのロジッ ク オブジェク ト を選択する必要があ り ます。

[Schematic] ウ ィンド ウで、 任意のロジッ クを選択および表示します。 タイ ミ ング パスのグループを表示して、 その

パス上のすべてのインスタンスを表示できます。 これによ り、 タイ ミ ング ク リ ティカルなモジュールが含まれる箇

所を視覚的に表示できるので、 フロアプランしやすくな り ます。

[Schematic] ウ ィンド ウを開くには、 1 つまたは複数のインスタンス、 ネッ ト 、 タイ ミ ング パスを選択し、 ツール

バーまたは右ク リ ッ ク メニューで [Schematic] をク リ ッ クするか、 F4 キーを押します。

[Schematic] ウ ィンド ウ (図 1-24) が開き、 選択したモジュールが表示されます。

X-Ref Target - Figure 1-23

図 1-23: [Show Hierarchy] コマンド

Page 32: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 32UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

この後、 ピン、 インスタンス、 階層モジュールを選択して、 ロジッ クを展開できます。

タイ ミング解析の実行

合成済みデザインのタイ ミ ング解析は、 インプリ メンテーシ ョ ンを効率的に実行するために必要な制約がパスに設

定されているかど うかを確認するのに有益です。 Vivado 合成はタイ ミ ング ド リブンであ り、 設定した制約に基づい

て出力が調整されます。

Pblock や LOC 制約のよ うな物理制約をデザインに割り当てていく と、 よ り正確なタイ ミ ング解析結果が得られるよ

うにな り ますが、 これらの結果に含まれるのはパス遅延の見積も り値です。 合成済みデザインでは、 配線遅延の見

積も り値を使用して解析が実行されます。

この時点でタイ ミ ング解析を実行する と、 パスが正し く制約されているか、 およびタイ ミ ング パスの全体的な状況

を確認できます。

重要: 実際の配線遅延が含まれるのは、 インプリ メンテーシ ョ ン (配置配線) 後のタイ ミ ング解析のみです。 合成済み

デザインのタイ ミ ング解析は、 インプリ メン ト済みデザインのタイ ミ ング解析ほど正確ではあ り ません。

X-Ref Target - Figure 1-24

図 1-24: [Schematic] ウィンドウ

Page 33: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 33UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

Tcl での合成の実行

合成を実行する Tcl コマンドは synth_design です。 通常このコマンドは、 次の例のよ うに複数のオプシ ョ ンを使

用して実行します。

synth_design -part xc7k30tfbg484-2 -top my_top

この例では、 synth_design が -part オプシ ョ ンおよび -top オプシ ョ ンを使用して実行されます。

Tcl コンソールから、 Tcl コマンド オプシ ョ ンを使用して合成オプシ ョ ンを設定して合成を実行できます。 [Tcl Console] ウ ィンド ウで 「synth_design -help」 と入力する と、 オプシ ョ ンのリ ス ト を取得できます。 次に、

「synth_design -help」 と入力したと きの出力の一部を示します。

Description: Synthesize a design using Vivado Synthesis and open that designSyntax: synth_design [-name <arg>] [-part <arg>] [-constrset <arg>] [-top <arg>] [-include_dirs <args>] [-generic <args>] [-verilog_define <args>] [-flatten_hierarchy <arg>] [-gated_clock_conversion <arg>] [-directive <arg>] [-rtl] [-bufg <arg>] [-no_lc] [-shreg_min_size <arg>] [-mode <arg>] [-fsm_extraction <arg>] [-rtl_skip_ip] [-rtl_skip_constraints] [-keep_equivalent_registers] [-resource_sharing <arg>] [-cascade_dsp <arg>] [-control_set_opt_threshold <arg>]

[-max_bram <arg>] [-max_uram <arg>] [-max_dsp <arg>] [-max_bram_cascade_height <arg>] [-max_uram_cascade_height <arg>] [-retiming] [-no_srlextract] [-assert] [-no_timing_driven] [-sfcu] [-quiet] [-verbose]Returns: design objectUsage: Name Description ----------------------------------------- [-name] Design name [-part] Target part [-constrset] Constraint fileset to use [-top] Specify the top module name [-include_dirs] Specify verilog search directories [-generic] Specify generic parameters. Syntax: -generic <name>=<value> -generic <name>=<value> ... [-verilog_define] Specify verilog defines. Syntax: -verilog_define <macro_name>[=<macro_text>] -verilog_define <macro_name>[=<macro_text>] [-flatten_hierarchy] Flatten hierarchy during LUT mapping. Values: full, none, rebuilt Default: rebuilt [-gated_clock_conversion] Convert clock gating logic to flop enable. Values: off, on, auto Default: off [-directive] Synthesis directive. Values: default, RuntimeOptimized, AreaOptimized_high, AreaOptimized_medium, AlternateRoutability, AreaMapLargeShiftRegToBRAM, AreaMultThresholdDSP, FewerCarryChains Default: default [-rtl] Elaborate and open an rtl design

Page 34: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 34UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

[-bufg] Max number of global clock buffers used by synthesis Default: 12 [-no_lc] Disable LUT combining. Do not allow combining [-shreg_min_size] Minimum length for chain of registers to be mapped onto SRL Default: 3 [-mode] The design mode. Values: default, out_of_context Default: default [-fsm_extraction] FSM Extraction Encoding. Values: off, one_hot, sequential, johnson, gray, user_encoding, auto Default: auto [-rtl_skip_ip] Exclude subdesign checkpoints in the RTL elaboration of the design; requires -rtl option. [-rtl_skip_constraints] Do not load and validate constraints against elaborated design; requires -rtl option. [-keep_equivalent_registers] Prevents registers sourced by the same logic from being merged. (Note that the merging can otherwise be prevented using the synthesis KEEP attribute) [-resource_sharing] Sharing arithmetic operators. Value: auto, on, off Default: auto [-cascade_dsp] Controls how adders summing DSP block outputs will be implemented. Value: auto, tree, force Default: auto [-control_set_opt_threshold] Threshold for synchronous control set optimization to lower number of control sets. Valid values are 'auto' and non-negative integers. The higher the number, the more control set optimization will be performed and fewer control sets will result. To disable control set optimization completely, set to 0. Default: auto[-max_bram] Maximum number of block RAM allowed in design. (Note -1 means that the tool will choose the max number allowed for the part in question) Default: -1 [-max_uram] Maximum number of UltraRAM blocks allowed in design. (Note -1 means that the tool will choose the max number allowed for the part in question) Default: -1 [-max_dsp] Maximum number of block DSP allowed in design. (Note -1 means that the tool will choose the max number allowed for the part in question) Default: -1 [-max_bram_cascade_height] Controls the maximum number of BRAM that can be cascaded by the tool. (Note -1 means that the tool will choose the max number allowed for the part in question) Default: -1 [-max_uram_cascade_height] Controls the maximum number of UtraRAM that can

Page 35: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 35UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

be cascaded by the tool. (Note -1 means that the tool will choose the max number allowed for the part in question) Default: -1 [-retiming] Seeks to improve circuit performance for intra-clock sequential paths by automatically moving registers (register balancing) across combinatorial gates or LUTs. It maintains the original behavior and latency of the circuit and does not require changes to the RTL sources. [-no_srlextract] Prevents the extraction of shift registers so that they get implemented as simple registers [-assert] Enable VHDL assert statements to be evaluated. A severity level of failure will stop the synthesis flow and produce an error. [-no_timing_driven] Do not run in timing driven mode. [-sfcu] Run in single-file compilation unit mode. [-quiet] Ignore command errors [-verbose] Suspend message limits during command execution

-generic オプシ ョ ンで VHDL ブール値および std_logic_vector 型を指定する場合、 これらはほかの形式には

存在しないので特別な処理が必要です。 たとえば、 TRUE、 FALSE、 または 0010 の代わりに Verilog 標準を使用する

必要があ り ます。

ブール値の場合、 FALSE 値は次のよ うに指定します。

-generic my_gen=1‘b0

std_logic_vector を値 0010 に設定するには、 次のよ うに指定します。

-generic my_gen=4'b0010

重要: 文字列ジェネ リ ッ クまたはパラ メーターの変更はサポート されていません。

重要: 最上位に -mode out_of_context オプシ ョ ンを使用する場合は、 RTL に I/O バッファーがインスタンシエー

ト されている場合を除き、 PACKAGE_PIN プロパティを使用しないでください。 out_of_context オプシ ョ ンを設定す

る と、 ト ラ イステート バッファーを含むすべての I/O バッファーが挿入されなくな り ます。 バッファーがない場合、

配置でエラーが発生します。

コマンドの詳細は、 『Vivado Design Suite Tcl コマンド リ ファレンス ガイ ド』 (UG835) [参照 4] を参照してください。

Vivado IDE での操作に対応する Tcl コマンドを確認するには、 Vivado IDE でコマンドを実行し、 [Tcl Console] ウ ィン

ド ウまたはログ ファ イルを参照してください。

RTL 合成のマルチスレッ ド マルチプロセッサ システムでは、RTL 合成でデフォルトで複数の CPU コア (最大 4 個) を利用してコンパイル時間を

短縮できます。

Page 36: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 36UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 1 章: Vivado 合成

同時に実行可能なスレッ ドの最大数は、 システム上のプロセッサ、 OS、 およびフローの段階によって異なり ます。

詳細は、 『Vivado Design Suite ユーザー ガイ ド : インプリ メンテーシ ョ ン』 (UG904) [参照 13] のこのセクシ ョ ンを参照

してください。

Vivado のすべてのスレッ ドに共通の Tcl パラ メーター general.maxThreads を使用して、 RTL 合成を実行する際

のスレッ ド数を指定できます。 次に例を示します。

Vivado% set_param general.maxThreads <new limit>

<new limit> に有効な値は、 1 ~ 8 の整数値です。 RTL 合成では、 実質的に設定可能な最大スレッ ド数は 4 です。

Tcl スクリプ ト例

次に、 synth_design の Tcl スク リプ ト例を示します。

# Setup design sources and constraintsread_vhdl -library bftLib [ glob ./Sources/hdl/bftLib/*.vhdl ]read_vhdl ./Sources/hdl/bft.vhdlread_verilog [ glob ./Sources/hdl/*.v ]read_xdc ./Sources/bft_full.xdc# Run synthesissynth_design -top bft -part xc7k70tfbg484-2 -flatten_hierarchy rebuilt# Write design checkpointwrite_checkpoint -force $outputDir/post_synth# Write report utilization and timing estimatesreport_utilization -file utilization.txtreport_timing > timing.txt

制約の設定

表 1-1 に、 Vivado タイ ミ ング制約にサポート される Tcl コマンドを示します。 各コマンドのリ ンクをク リ ッ クする

と、 『Vivado Design Suite Tcl コマンド リ ファレンス ガイ ド』 (UG835) [参照 4] のコマンドを説明するページが開きま

す。

これらのコマンドの詳細は、 次の資料を参照してください。

• 『Vivado Design Suite Tcl コマンド リ ファレンス ガイ ド』 (UG835) [参照 4]

• 『Vivado Design Suite ユーザー ガイ ド : 制約の使用』 (UG903) [参照 12]

• 『Vivado Design Suite チュート リ アル: 制約の使用』 (UG945) [参照 20]

• 『Vivado Design Suite ユーザー ガイ ド : デザイン解析およびクロージャ テクニッ ク』 (UG906) [参照 15]

表 1-1: サポート される合成 Tcl コマンド

コマンド タイプ コマンド

タイ ミング制約

create_clock create_generated_clock set_false_path set_input_delay

set_output_delay set_max_delay set_multicycle_path get_cells

set_clock_latency set_clock_groups set_disable_timing get_ports

オブジェク ト アクセス

all_clocks all_inputs all_outputs

get_clocks get_nets get_pins

Page 37: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

第 1 章: Vivado 合成

合成 37UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

Vivado であらかじめ定義されている合成スト ラテジ

次の表に、 各ス ト ラテジとその設定を示します。

表 1-2: Vivado であらかじめ定義されている合成スト ラテジ

オプシ ョ ン/スト ラテジ Default Flow_AreaOptimized_high

Flow_AreaOptimized_

medium

Flow_AreaMult

ThresholdDSP

Flow_Alternate

Routability

Flow_PerfOptimized_

High

Flow_PerfThreshholdCarry

Flow_RuntimeOptimized

-flatten_hierarchy rebuilt rebuilt rebuilt rebuilt rebuilt rebuilt rebuilt none

-gated_clock_conversion off off off off off off off off

-bufg 12 12 12 12 12 12 12 12

-directive DefaultAreaOptimized

_highAreaOptimized

_mediumAreaMult

ThresholdDSPAlternate

RoutabilityPerformanceO

ptimizedFewerCarry

ChainsRunTimeOptimized

-retiming オフ オフ オフ オフ オフ オフ オフ オフ

-fsm_extraction auto auto auto auto auto one_hot auto off

-keep_equivalent_registers オフ オフ オフ オフ オフ オフ オフ オフ

-resource_sharing auto auto auto auto auto off off auto

-control_set_opt_threshold auto 1 1 auto auto auto auto auto

-no_lc オフ オフ オフ オフ オン オン オン オフ

-no_srlextract オフ オフ オフ オフ オフ オフ オフ オフ

-shreg_min_size 3 3 3 3 10 5 3 3

-max_bram -1 -1 -1 -1 -1 -1 -1 -1

-max_uram -1 -1 -1 -1 -1 -1 -1 -1

-max_dsp -1 -1 -1 -1 -1 -1 -1 -1

-max_bram_cascade_height -1 -1 -1 -1 -1 -1 -1 -1

-max_uram_cascade_height -1 -1 -1 -1 -1 -1 -1 -1

-cascade_dsp auto auto auto auto auto auto auto auto

-assert オフ オフ オフ オフ オフ オフ オフ オフ

Page 38: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 38UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章

合成属性

概要

Vivado® 合成では、 さまざまなタイプの合成属性を使用できます。 ほとんどの場合、 これらの属性は同じ構文で、 同

じ動作になり ます。

• Vivado 合成で属性がサポート される場合、 その属性が使用され、 その属性を反映したロジッ クが作成されます。

• 指定した属性がツールで認識されない場合、 その属性と値は生成されたネッ ト リ ス トに渡されます。

認識されない属性は、 フローの後の方で使用される と想定されます。 たとえば、 LOC 制約は合成では使用されませ

んが、 配置ツールで使用されるので、 合成ツールから転送されます。

サポート される属性

ASYNC_REG

ASYNC_REG 属性は、 Vivado ツール フローのさまざまなプロセスに影響します。 この属性は、 レジスタの D 入力ピ

ンでソース ク ロ ッ クに非同期のデータを受信できる こ と、 またはレジスタが同期化チェーン内の同期化レジスタで

あるこ とを示します。

Vivado 合成では、 この属性は DONT_TOUCH 属性と して処理され、 ASYNC_REG プロパティをネッ ト リ ス トに挿入し

ます。 これによ り、 ASYNC_REG プロパティが設定されたオブジェク トが最適化で削除されるこ とはなくな り、 フ

ローの後のほうのツールで適切に処理されます。

Vivado のほかのツールでこの属性がどのよ うに処理されるかは、 『Vivado Design Suite プロパティ リ ファレンス ガイ

ド』 (UG912) [参照 19] の 「ASYNC_REG」 を参照してください。

この属性はレジスタに設定でき、 有効な値は FALSE (デフォルト ) および TRUE です。 この属性は RTL または XDC で設定できます。

重要: ロードのない信号にこの属性を設定する場合は、 注意が必要です。 属性および信号が保持されない可能性があ

り ます。

ASYNC_REG の Verilog 例

(* ASYNC_REG = "TRUE" *) reg [2:0] sync_regs;

Page 39: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 39UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

ASYNC_REG の VHDL 例

attribute ASYNC_REG : string;attribute ASYNC_REG of sync_regs : signal is "TRUE";attribute ASYNC_REG : boolean;attribute ASYNC_REG of sync_regs : signal is TRUE;

BLACK_BOX

BLACK_BOX 属性は、 すべての階層レベルをオフにし、 合成でそのモジュールまたはエンティティに対してブラ ッ ク ボッ クスを作成できるよ うにするデバッグ用の属性です。 この属性を指定する と、 モジュールまたはエンティティ

に対して有効なロジッ クがあったと しても、 合成ツールでそのレベルに対してブラ ッ ク ボッ クスが作成されます。

この属性はモジュール、 エンティティ、 コンポーネン トに設定できます。 この属性は合成コンパイラに影響するの

で、 RTL でのみ設定可能です。

BLACK_BOX の Verilog 例

(* black_box *) module test(in1, in2, clk, out1);

重要: Verilog では、 値は必要あ り ません。 この属性があれば、 ブラ ッ ク ボッ クスが作成されます。

BLACK_BOX の VHDL 例

attribute black_box : string;attribute black_box of beh : architecture is "yes";

ブラ ッ ク ボッ クスのコーディング スタイルの詳細は、 第 4 章の 「ブラ ッ ク ボッ クス」 を参照してください。

CASCADE_HEIGHT

CASCADE_HEIGHT 属性は、 ブロ ッ ク RAM に配置される大型 RAM のカスケード チェーンの長さを指定します。 複

数のブロ ッ ク RAM で構成される RAM を記述する と、 Vivado 合成でコンフ ィギュレーシ ョ ン方法が決定されます。

通常は、 ブロ ッ ク RAM がカスケード接続されます。 この属性を使用する と、 チェーンの長さを指定できます。 この

属性は RAM に設定し、 RTL ファ イルに含めるこ とができます。 値を 0 または 1 に設定する と、 ブロ ッ ク RAM のカ

スケード接続がオフになり ます。

注記: この属性は、 UltraScale™ アーキテクチャのブロ ッ ク RAM および UltraRAM のみに適用されます。

UltraRAM の CASCADE_HEIGHT 属性の詳細は、 第 4 章の 「CASCADE_HEIGHT」 を参照してください。

CASCADE_HEIGHT の Verilog 例

(* cascade_height = 4 *) reg [31:0] ram [(2**15) - 1:0];

CASCADE_HEIGHT の VHDL 例

attribute cascade_height : integer;attribute cascade_height of ram : signal is 4;

Page 40: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 40UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

CLOCK_BUFFER_TYPE

CLOCK_BUFFER_TYPE 属性は入力クロ ッ クに設定し、 使用するクロ ッ ク バッファーのタイプを指定します。

デフォルトでは、 BUFG がクロ ッ ク バッファーと して使用されます。 有効な値は、 "BUFG"、 "BUFH"、 "BUFIO"、

"BUFMR"、 "BUFR"、 および "none" です。 CLOCK_BUFFER_TYPE 属性は最上位クロ ッ ク ポートに設定できます。

RTL および XDC で設定できます。

CLOCK_BUFFER_TYPE の Verilog 例

(* clock_buffer_type = "none" *) input clk1;

CLOCK_BUFFER_TYPE の VHDL 例

entity test is port(in1 : std_logic_vector (8 downto 0);clk : std_logic;out1 : std_logic_vector(8 downto 0));attribute clock_buffer_type : string;attribute clock_buffer_type of clk: signal is "BUFR";

end test;

CLOCK_BUFFER_TYPE の XDC 例

set_property CLOCK_BUFFER_TYPE BUFG [get_ports clk]

DIRECT_ENABLE

複数のイネーブルがある場合や、 フ リ ップフロ ップのイネーブル ラインが使用されるよ う強制する場合に、 入力

ポート またはその他の信号に DIRECT_ENABLE を設定する と、 それらのポート または信号を直接フ リ ップフロ ップ

のイネーブル ラインに接続できます。

この属性は、 任意のポート または信号に設定できます。

DIRECT_ENABLE の Verilog 例

(* direct_enable = "yes" *) input ena3;

DIRECT_ENABLE の VHDL 例

entity test is port(in1 : std_logic_vector (8 downto 0);clk : std_logic;ena1, ena2, ena3 : in std_logicout1 : std_logic_vector(8 downto 0));attribute direct_enable : string;attribute direct_enable of ena3: signal is "yes";

end test;

DIRECT_ENABLE の XDC 例

set_property direct_enable yes [get_nets -of [get_ports ena3]]

Page 41: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 41UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

注記: XDC で使用する場合、 この属性はネッ トにのみ機能するので、 get_nets コマンドを使用してネッ ト オブ

ジェク ト を取得する必要があ り ます。

DIRECT_RESET

複数のリセッ トがある場合や、 フ リ ップフロ ップのリセッ ト ラインが使用されるよ う強制する場合に、 入力ポート

またはその他の信号に DIRECT_RESET を設定する と、 それらのポート または信号を直接フ リ ップフロ ップのリセッ

ト ラインに接続できます。

この属性は、 任意のポート または信号に設定できます。

DIRECT_RESET の Verilog 例

(* direct_reset = "yes" *) input rst3;

DIRECT_RESET の VHDL 例

entity test is port(in1 : std_logic_vector (8 downto 0);clk : std_logic;rst1, rst2, rst3 : in std_logicout1 : std_logic_vector(8 downto 0));attribute direct_reset : string;attribute direct_reset of rst3: signal is "yes";

end test;

DIRECT_RESET の XDC 例

set_property direct_reset yes [get_nets -of [get_ports rst3]]

注記: XDC で使用する場合、 この属性はネッ トにのみ機能するので、 get_nets コマンドを使用してネッ ト オブ

ジェク ト を取得する必要があ り ます。

DONT_TOUCH

KEEP または KEEP_HIERARCHY の代わりに DONT_TOUCH 属性を使用してください。DONT_TOUCH 属性は KEEP また

は KEEP_HIERARCHY 属性と同じよ うに機能しますが、 KEEP および KEEP_HIERARCHY とは異なり配置配線にフォ

ワード アノテート されるので、 ロジッ ク最適化で削除されるこ とはあ り ません。

\

注意: KEEP および KEEP_HIERARCHY 属性と同様に、 DONT_TOUCH を使用する際には注意が必要です。 ほかの属性

が DONT_TOUCH 属性と競合する場合、 DONT_TOUCH 属性が優先されます。

DONT_TOUCH 属性に有効な値は、 TRUE/FALSE または yes/no です。 この属性は信号、 モジュール、 エンティ

ティ、 コンポーネン トに設定できます。

注記: モジュールまたはエンティティのポートには設定できません。 特定のポート を保持する必要がある場合は、

-flatten_hierarchy none を使用するか、 モジュールまたはエンティティ自体に DONT_TOUCH を設定します。

通常は、 DONT_TOUCH 属性は RTL にのみ設定する必要があ り ます。 XDC ファ イルが読み込まれる前に、 保持する必

要のある信号が最適化で削除されてしま う こ とがあ り ます。 この属性を RTL で設定しておけば、 必ず適用されます。

ただし、 DONT_TOUCH が XDC ファ イルに設定した方がいいユース ケースが 1 つあ り ます。 これは、 DONT_TOUCH

Page 42: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 42UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

が RTL で yes で、 RTL を変更せずに取り除く必要がある場合です。 この場合、 XDC で DONT_TOUCH を no に設定

し、 RTL で同じ信号の DONT_TOUCH を yes に設定する と、 RTL を変更しなくても効率的にその属性が削除できま

す。

注記: XDC を使用して RTL で設定された DONT_TOUCH を削除した場合、 インプリ メンテーシ ョ ン フローで同じ XDC が読み込まれても、 該当の信号が削除されているので、 合成後に警告メ ッセージが表示されるこ とがあ り ま

す。 これらの警告は無視しても問題はあ り ません。 ただし、 合成のみとマーク された XDC に DONT_TOUCH 属性

を指定する と、 それらをバイパスできます。

Page 43: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 43UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

DONT_TOUCH の Verilog 例

Verilog ワイヤの例

(* dont_touch = "yes" *) wire sig1;assign sig1 = in1 & in2;assign out1 = sig1 & in2;

Verilog モジュールの例

(* DONT_TOUCH = "yes" *) module example_dt_ver(clk,In1,In2,out1);

Verilog インスタンスの例

(* DONT_TOUCH = "yes" *) example_dt_ver U0 (.clk(clk), .in1(a), .in2(b), out1(c));

DONT_TOUCH の VHDL 例

VHDL 信号の例

signal sig1 : std_logic;attribute dont_touch : string;attribute dont_touch of sig1 : signal is "true";........sig1 <= in1 and in2;out1 <= sig1 and in3;

VHDL エンティテ ィの例

entity example_dt_vhd isport (clk : in std_logic;In1 : in std_logic;In2 : in std_logic;out1 : out std_logic

);attribute dont_touch : string;attribute dont_touch of example_dt_vhd : entity is "true|yes";

end example_dt_vhd;

VHDL コンポーネン トの例

entity rtl of test is attribute dont_touch : string;component my_comp port (in1 : in std_logic;out1 : out std_logic);

Page 44: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 44UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

end component;attribute dont_touch of my_comp : component is "yes";

VHDL アーキテクチャの例

entity rtl of test isattribute dont_touch : string;attribute dont_touch of rtl : architecture is "yes";

DSP_FOLDING

DSP_FOLDING 属性は、加算器に接続されている 2 つの MAC 構造を 1 つの DSP プリ ミティブにフォールディングす

るかど うかを指定します。

DSP_FOLDING の値は次のとおりです。

• "yes": MAC 構造が変換されます。

• "no": MAC 構造は変換されません。

DSP_FOLDING は RTL でのみサポート されます。 MAC 構造を含むロジッ クのモジュール、 エンティティ、 または

アーキテクチャに配置してください。

VHDL 例

attribute dsp_folding : string;attribute dsp_folding of my_entity : entity is "yes";

Verilog 例

(* dsp_folding = "yes" *) module top .....

DSP_FOLDING_FASTCLOCK

DSP_FOLDING_FASTCLOCK 属性は、 DSP フォールディングを使用した場合に新しい高速クロ ッ クに使用するポー

ト を指定します。

DSP_FOLDING_FASTCLOCK の値は次のとおりです。

• "yes": このポート を新しいクロ ッ クに使用します。

• "no": このポートは新しいクロ ッ クに使用しません。

DSP_FOLDING_FASTCLOCK は RTL でのみサポート されます。 ポート またはピンに設定してください。

VHDL 例

attribute dsp_folding_fastclock : string;

attribute dsp_folding_fastclock of clk_fast : signal is "yes";

Verilog 例

(* dsp_folding_fastclock = "yes" *) input clk_fast;

Page 45: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 45UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

EXTRACT_ENABLE

EXTRACT_ENABLE 属性は、 レジスタにイネーブルを推論するかど うかを制御します。 Vivado ツールでは通常、 多く

のデザインで有益な結果が得られるよ うに、 経験則に基づいてイネーブルを抽出するかしないかが決定されます。

Vivado ツールで希望するよ うに処理されない場合、 この属性を設定して制御できます。

フ リ ップフロ ップの CE ピンに希望しないイネーブルが供給されている場合、 それをこの属性によ り D 入力ロジッ

クに強制できます。 その逆に、 RTL で指定したイネーブルがツールで推論されない場合、 この属性によ りそのイ

ネーブルをフ リ ップフロ ップの CE ピンに移動できます。

EXTRACT_ENABLE 属性はレジスタに設定し、RTL コードでのみサポート されます。有効な値は "yes" および "no" です。

EXTRACT_ENABLE の Verilog 例

(* extract_enable = "yes" *) reg my_reg;

EXTRACT_ENABLE の VHDL 例

signal my_reg : std_logic;attribute extract_enable : string;attribute extract_enable of my_reg: signal is "no";

EXTRACT_RESET

EXTRACT_RESET 属性は、 レジスタにリセッ ト を推論するかど うかを制御します。 Vivado ツールでは通常、 多くの

デザインで有益な結果が得られるよ うに、 経験則に基づいて リセッ ト を抽出するかしないかが決定されます。

Vivado ツールで希望するよ うに処理されない場合、 この属性を設定して制御できます。 フ リ ップフロ ップに希望し

ない同期リセッ トが供給されている場合、 それをこの属性によ り D 入力ロジッ クに強制できます。 その逆に、 RTL で指定した リセッ トがツールで推論されない場合、 この属性によ りそのリセッ ト をフ リ ップフロ ップの専用リセッ

トに移動できます。 この属性は、 同期リセッ トにのみ使用できます。 非同期ロジッ クはこの属性ではサポート され

ません。

EXTRACT_RESET 属性はレジスタに設定し、 RTL コードでのみサポート されます。 有効な値は "yes" および "no" です。 値が no の場合、 リセッ トがレジスタの R ピンに送信されず、 ロジッ クを介してレジスタの D ピンに配線さ

れるよ うにな り ます。 値が yes の場合、 リセッ トが直接レジスタの R ピンに送信されます。

EXTRACT_RESET の Verilog 例

(* extract_reset = "yes" *) reg my_reg;

EXTRACT_RESET の VHDL 例

signal my_reg : std_logic;attribute extract_reset : string;attribute extract_reset of my_reg: signal is "no";

Page 46: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 46UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

FSM_ENCODING

FSM_ENCODING 属性は、 ステート マシンのエンコード方法を指定します。 通常は、 Vivado ツールによ り ステート マシンに対してほとんどのデザインで最適な結果が生成されるエンコード プロ ト コルが選択されます。 デザインの

タイプによっては、 特定のエンコード プロ ト コルが適しているものもあ り ます。

FSM_ENCODING 属性は、 ステート マシン レジスタに設定できます。 有効な値は "one_hot"、 "sequential"、

"johnson"、 "gray"、 "auto"、 および "none" です。 デフォルトは "auto" で、 ツールによ り最適なエンコード

が選択されます。 この属性は RTL または XDC で設定できます。

FSM_ENCODING の Verilog 例

(* fsm_encoding = "one_hot" *) reg [7:0] my_state;

FSM_ENCODING の VHDL 例

type count_state is (zero, one, two, three, four, five, six, seven);signal my_state : count_state;attribute fsm_encoding : string;attribute fsm_encoding of my_state : signal is "sequential";

FSM_SAFE_STATE

FSM_SAFE_STATE 属性は、 ステート マシンが無効なステートになったと きに次のクロ ッ ク サイクルで既知のス

テートにするロジッ クを、 ステート マシンに挿入します。

たとえば、 "one_hot" エンコードに設定されたステート マシンが無効な 0101 ステートになった場合に回復可能で

す。 FSM_ENCODING 属性は、 ステート マシン レジスタに設定できます。 RTL または XDC で設定できます。

有効な値は、 次のとおりです。

• "auto_safe_state": 1 ビッ ト /フ リ ップの自動訂正にハミ ング 3 エンコードを使用します。

• "reset_state": 1 ビッ ト /フ リ ップのハミ ング 2 エンコード検出を使用して、 ステート マシンを強制的にリ

セッ ト ステートにします。

• "power_on_state": 1 ビッ ト /フ リ ップのハミ ング 2 エンコード検出を使用して、 ステート マシンを強制的に

パワーオン ステートにします。

• "default_state": ステート マシンを RTL で指定されたデフォルトのステート (Verilog では case 文の default 分岐で指定されたステート、 VHDL では case 文の others 分岐で指定されたステート ) に強制しま

す。 これを機能させるためには、 RTL に default または others ステート を含める必要があ り ます。

FSM_SAFE_STATE の Verilog 例

(* fsm_safe_state = "reset_state" *) reg [7:0] my_state;

FSM_SAFE_STATE の VHDL 例

type count_state is (zero, one, two, three, four, five, six, seven);signal my_state : count_state;attribute fsm_safe_state : string;attribute fsm_safe_state of my_state : signal is "power_on_state";

Page 47: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 47UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

FULL_CASE (Verilog のみ)FULL_CASE は、 case、 casex または casez 文で可能性のあるすべての case 値が指定されるこ とを示します。 case 値が指定されている場合、 Vivado 合成で case 値に対して余分なロジッ クは作成されません。 この属性は、 case 文に設定できます。

重要: この属性は合成コンパイラに影響し、 デザインの論理動作を変更する可能性があるので、 RTL でのみ設定可能

です。

FULL_CASE の Verilog 例

(* full_case *)case select3’b100 : sig = val1;3’b010 : sig = val2;3’b001 : sig = val3;

endcase

GATED_CLOCK

Vivado 合成では、 ゲーテッ ド ク ロ ッ クの変換が可能です。 この変換を実行するには、 次を使用します。

• Vivado GUI のオプシ ョ ンで変換が実行されるよ う指定します。

• RTL 属性でゲーテッ ド ロジッ クのどの信号がクロ ッ クかを指定します。

この属性は、 ク ロ ッ ク信号またはクロ ッ ク ポートに設定できます。 GUI のオプシ ョ ンを指定するには、 次の手順に

従います。

1. [Tools] → [Settings] → [Synthesis] をク リ ッ ク します。

2. [-gated_clock_conversion] オプシ ョ ンを次のいずれかの値に設定します。

° [off]: ゲーテッ ド ク ロ ッ クの変換をディ スエーブルにします。

° [on]: gated_clock 属性が RTL コードで設定されている場合に、 ゲーテッ ド ク ロ ッ クの変換を実行しま

す。 この設定では、 結果をよ り制御できます。

° [auto]: 次のいずれかの条件が満たされる場合に、 ゲーテッ ド ク ロ ッ クの変換を実行します。

- gated_clock 属性が TRUE に設定されている。

- Vivado 合成でゲートが検出され、 有効なクロ ッ ク制約セッ トがある。 この設定では、 ツールで自動的

に判断されます。

注意: KEEP_HIERARCHY、 DONT_TOUCH、 MARK_DEBUG などの属性を使用する場合は注意が必要です。 ゲー

テッ ド ク ロ ッ ク変換をサポートするために変更する必要のある階層またはインスタンスにこれらの属性が設定され

ている と、 ゲーテッ ド ク ロ ッ ク変換が実行されません。

GATED_CLOCK の Verilog 例

(* gated_clock = "true" *) input clk;

Page 48: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 48UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

GATED_CLOCK の VHDL 例

entity test is port (in1, in2 : in std_logic_vector(9 downto 0);en : in std_logic;clk : in std_logic;out1 : out std_logic_vector( 9 downto 0));attribute gated_clock : string;attribute gated_clock of clk : signal is "true";

end test;

IOB

IOB は合成属性ではなく、 Vivado インプリ メンテーシ ョ ンで使用され、 レジスタを I/O バッファーに配置する必要が

あるかど うかを指定します。 有効な値は true または false です。 この属性は、 I/O バッファーに配置するレジスタ

に設定します。 この属性は RTL でのみ設定できます。

IOB の Verilog 例

(* IOB = "true" *) reg sig1;

IOB の VHDL 例

signal sig1:std_logic;attribute IOB: string;attribute IOB of sig1 : signal is "true";

IO_BUFFER_TYPE

IO_BUFFER_TYPE 属性は最上位ポートに設定し、 バッファーを使用するよ うに指定します。 デフォルトでは、 入力

または出力ポートにバッファーが自動推論されます。 このバッファーの自動推論をディ スエーブルにするには、 こ

の属性を値を "none" に設定して追加します。 この属性は RTL でのみ設定できます。

IO_BUFFER_TYPE の Verilog 例

(* io_buffer_type = "none" *) input in1;

IO_BUFFER_TYPE の VHDL 例

entity test is port(in1 : std_logic_vector (8 downto 0);clk : std_logic;out1 : std_logic_vector(8 downto 0));attribute io_buffer_type : string;attribute io_buffer_type of out1: signal is "none";

end test;

KEEP

KEEP 属性は、 信号が削除されたり ロジッ ク ブロ ッ クに吸収されるよ うな最適化が実行されないよ うに指定します。

この属性が設定された信号は保持され、 ネッ ト リ ス トに含まれます。

Page 49: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 49UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

たとえば、 2 ビッ トの AND ゲートの出力で別の AND ゲート を駆動する信号に KEEP 制約を設定する と、 信号は両方

の AND ゲート を含む大型の LUT には統合されません。

注意: KEEP をほかの属性と共に使用する場合は注意が必要です。 ほかの属性が KEEP 属性と競合する場合、 通常 KEEP 属性が優先されます。

KEEP は、 タイ ミ ング制約と もよ く併用されます。 通常は最適化される信号にタイ ミ ング制約が設定されている場

合、 KEEP を設定する と最適化されなくな り、 正しいタイ ミ ング規則が使用されます。

注記: KEEP 属性はモジュールまたはエンティティのポートには設定できません。 特定のポート を保持する必要があ

る場合は、 -flatten_hierarchy none を使用するか、 モジュールまたはエンティティ自体に DONT_TOUCH を設

定します。

注意: RTL で後の方で使用されない信号に KEEP 属性を設定する場合は、 注意が必要です。 合成ではこれらの信号は

保持されますが、 何も駆動しません。 これによ り、 フローの後の方で問題が発生する可能性があ り ます。

次に例を示します。

• ある信号に MAX_FANOUT 属性が設定されており、 この信号で駆動される信号に KEEP 属性が設定されている場

合、 KEEP 属性が設定されている信号ではファンアウ ト複製は実行されません。

• RAM_STYLE="block" が使用されており、 その RAM の一部となるべきレジスタに KEEP が設定されている と、

KEEP 属性のためにブロ ッ ク RAM が推論されません。

有効な値は、 次のとおりです。

• TRUE: 信号を保持します。

• FALSE: 信号が必要に応じて最適化されるよ うにします。 false を使用しても、 信号が無条件に削除されるこ と

はあ り ません。 デフォルト値は false です。

この属性は信号、 レジスタ、 ワイヤに設定できます。

推奨: この属性は RTL のみで設定します。 XDC ファ イルが読み込まれる前に、 保持する必要のある信号が最適化で

削除されてしま う こ とがあるので、 この属性が必ず使用されるよ うに RTL で設定します。

注記: KEEP 属性を使用しても、 配置配線では信号は保持されません。 DONT_TOUCH 属性を使用してください。

KEEP の Verilog 例

(* keep = "true" *) wire sig1;assign sig1 = in1 & in2;assign out1 = sig1 & in2;

KEEP の VHDL 例

signal sig1 : std_logic;attribute keep : string;attribute keep of sig1 : signal is "true";........sig1 <= in1 and in2;out1 <= sig1 and in3;

Page 50: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 50UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

KEEP_HIERARCHY

KEEP_HIERARCHY は、 階層レベルが変更されないよ うにします。 Vivado 合成では、 RTL で指定されたのと同じ階層

が保持されるよ う試みられますが、 QoR (結果の品質) のために階層がフラ ッ トにされたり、 変更されるこ と もあ り

ます。

インスタンスに KEEP_HIERARCHY を指定する と、 合成でその階層レベルは変更されません。

これが QoR に影響を与える場合があ り ます。 また、 ト ラ イステート出力および I/O バッファーの制御ロジッ クを記

述するモジュールには使用しないでください。 KEEP_HIERARCHY は、 モジュール、 アーキテクチャ レベル、 また

はインスタンスに指定できます。 この属性は RTL および XDC で設定できます。 XDC で使用する場合は、 インスタ

ンスにのみ設定可能です。

KEEP_HIERARCHY の Verilog 例

モジュール:

(* keep_hierarchy = "yes" *) module bottom (in1, in2, in3, in4, out1, out2);

インスタンス:

(* keep_hierarchy = "yes" *)bottom u0 (.in1(in1), .in2(in2), .out1(temp1));

KEEP_HIERARCHY の VHDL 例

アーキテクチャ :

attribute keep_hierarchy : string;attribute keep_hierarchy of beh : entity is "yes";

KEEP_HIERARCHY の XDC 例

インスタンス:

set_property keep_hierarchy yes [get_cells u0]

MARK_DEBUG

この属性は、 内部アレイにアクセス可能なネッ ト オブジェク ト (get_nets コマンドで指定) に適用できます。

注記: 一部のネッ トには、 専用接続があるなど、 デバッグ目的で監視できないものがあ り ます。

有効な値は "TRUE" または "FALSE" です。

構文

Verilog 構文

この属性を設定するには、 信号に適切な Verilog 属性構文を配置します。

(* MARK_DEBUG = "{TRUE|FALSE}" *)

Page 51: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 51UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

Verilog 構文例

// Marks an internal wire for debug(* MARK_DEBUG = "TRUE" *) wire debug_wire,

VHDL 構文

この属性を設定するには、 信号に適切な VHDL 属性構文を配置します。

VHDL 属性は次のよ うに宣言します。

attribute MARK_DEBUG : string;

VHDL 属性は次のよ うに指定します。

attribute MARK_DEBUG of signal_name : signal is "{TRUE|FALSE}";

signal_name は内部信号です。

VHDL 構文例

signal debug_wire : std_logic;attribute MARK_DEBUG : string;-- Marks an internal wire for debugattribute MARK_DEBUG of debug_wire : signal is "TRUE";

XDC 構文

set_property MARK_DEBUG value [get_nets <net_name>]

<net_name> は信号名です。

XDC 構文例

# Marks an internal wire for debugset_property MARK_DEBUG TRUE [get_nets debug_wire]

推奨: MARK_DEBUG 属性は、 通常階層のピンに設定され、 RTL_REG などのエラボレート された順次エレ メン トに使

用できます。 MARK_DEBUG 属性はネッ トに設定するこ とを意図した属性なので、 次のよ うに get_nets および get_pins コマンドの両方を set_property MARK_DEBUG true [get_nets -of [get_pins\ hier1/hier2/<flop_name>/Q]] のよ うに使用するこ とをお勧めします。 これによ り、 ネッ トにどのよ うな名前

が付いていても、 指定したピンに接続されているネッ トに MARK_DEBUG が設定されます。

注記: MARK_DEBUG を bit_vector と して宣言されている信号のビッ トに設定する と、 MARK_DEBUG 属性がバス全体に

適用されます。

MAX_FANOUT

MAX_FANOUT は、 レジスタおよび信号のファンアウ トの制限を設定します。 この属性は、 RTL またはプロジェク ト

への入力と して指定できます。 整数値を指定します。

この属性は、 レジスタおよび組み合わせ信号にのみ使用できます。 ファンアウ トの制限に従うため、 レジスタまた

は組み合わせ信号を駆動する信号が複製されます。 この属性は RTL でのみ設定できます。

Page 52: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 52UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

注記: 入力、 ブラ ッ ク ボッ クス、 EDIF (EDF),および NGC (Native Generic Circuit) ファ イルはサポート されていませ

ん。

重要: Vivado Design Suite では、 UltraScale デバイスに対して NGC フォーマッ トのファ イルはサポート されていませ

ん。 Vivado Design Suite で IP を再生成し、 ネイティブ出力ファイルを使用するこ とをお勧めします。 NGC ファ イル

は NGC2EDIF コマンドで EDIF に変換してインポートするこ と もできますが、今後は XST で生成された NGC フォー

マッ トではなくネイティブ Vivado IP を使用するこ とをお勧めします。

推奨: ファンアウ トの大きいグローバル信号に MAX_FANOUT 属性を使用する と、 合成で最適な複製が実行されませ

ん。 そのため、 MAX_FANOUT は階層内のファンアウ トが中から小のローカル信号にのみ設定するこ とをお勧めし

ます。

MAX_FANOUT の Verilog 例

信号:

(* max_fanout = 50 *) reg sig1;

MAX_FANOUT の VHDL 例

signal sig1 : std_logic;attribute max_fanout : integer;attribute max_fanout of sig1 : signal is 50;

注記: max_fanout の値は、 VHDL では整数です。

PARALLEL_CASE (Verilog のみ)PARALLEL_CASE は、 case 文がパラレル構文で構築される必要のあるこ とを示します。 ロジッ クは if-elsif 構文

では作成されません。 この属性は合成コンパイラに影響し、 デザインの論理動作を変更する可能性があるので、

RTL でのみ設定可能です。

(* parallel_case *) case select3’b100 : sig = val1;3’b010 : sig = val2;3’b001 : sig = val3;

endcase

重要: この制約は、 Verilog RTL でのみ制御できます。

RAM_DECOMP

RAM_DECOMP 属性は、 1 つのブロッ ク RAM プリ ミ ティブには大きすぎる RTL RAM を推論する場合に、 消費電力を

低減する構成を使用するよ う指定します。

たとえば、2K x 36 ワード と指定されている RAM は、隣接する 2 つの 2K x 18 ブロ ッ ク RAM に割り当てられますが、

これはデザインを最高速にするための構成です。 RAM_DECOMP を設定する と、 この RAM は 2 つの 1K x 36 ブロ ッ ク RAM に割り当てられます。 この構成では、 読み出しまたは書き込みで 1 つの RAM とアドレスのみがアクティブに

なるので、 消費電力が低減されます。 ただし、 Vivado 合成でアドレス デコードを使用する必要があるため、 タイ ミ

ングは悪くな り ます。 RAM_DECOMP を設定する と、 その RAM の 2 番目の構成が強制的に使用されます。

Page 53: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 53UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

RAM_DECOMP に有効な値は "power" です。

この属性は、 RTL または XDC で設定できます。 RAM インスタンス自体に設定してください。

RAM_DECOMP の Verilog 例

(* ram_decomp = "power" *) reg [data_size-1:0] myram [2**addr_size-1:0];

RAM_DECOMP の VHDL 例

attribute ram_decomp : string;attribute ram_decomp of myram : signal is "power";

RAM_DECOMP の XDC 例

set_property ram_decomp power [get_cells myram]

RAM_STYLE

RAM_STYLE は、 合成でのメモ リの推論方法を指定します。 有効な値は次のとおりです。

• block: RAMB タイプのコンポーネン トが推論されるよ う指定します。

• distributed: LUT RAM が推論されるよ う指定します。

• registers: RAM の代わりにレジスタが推論されるよ う指定します。

• ultra: UltraScale+™ URAM プリ ミ ティブが使用されるよ う指定します。

デフォルトでは、 ほとんどのデザインで最適な結果が生成されるよ うに、 経験則に基づいて推論する RAM が選択さ

れます。 この属性は、 RAM に宣言する配列または階層レベルに設定します。

• 信号に設定する と、 その指定した信号に適用されます。

• 階層レベルに設定する と、 その階層レベルに含まれるすべての RAM に適用されます。 階層のサブレベルには適

用されません。

RTL または XDC で設定できます。

RAM_STYLE の Verilog 例

(* ram_style = "distributed" *) reg [data_size-1:0] myram [2**addr_size-1:0];

RAM_STYLE の VHDL 例

attribute ram_style : string;attribute ram_style of myram : signal is "distributed";

RAM のコーディング スタイルの詳細は、 第 4 章の 「RAM の HDL コーディング手法」 を参照してください。

RETIMING_BACKWARD

RETIMING_BACKWARD 属性は、 レジスタをロジッ クを通過させて後方に移動し、 駆動する順次エレ メン トに近づけ

ます。 グローバル リ タイ ミ ング設定とは異なり、 この属性はタイ ミ ング ド リブンではなく、 グローバル リ タイ ミ ン

グ設定がアクティブであるかど うか、 タイ ミ ング制約があるかど うかにかかわらず機能します。 グローバル リ タイ

Page 54: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 54UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

ミ ング設定がアクティブの場合、 RETIMING_BACKWARD が最初に実行され、 その後グローバル リ タイ ミ ングでレジ

スタがチェーンのさらに後方に移動されるこ とはあ り ますが、 レジスタが元の場所に戻されてこの属性の効果が

キャンセルされるこ とはあ り ません。

注記: DONT_TOUCH/MARK_DEBUG 属性が設定されたセル、 タイ ミ ング例外 (false_path、 multicycle_path) が設定されたセル、 およびユーザーがインスタンシエート したセルでは、 この属性による処理は実行されません。

RETIMING_BACKWARD 属性に有効な値は、 0 (オフ) または 1 (オン) です。 RTL または XDC で設定できます。

RETIMING_BACKWARD の Verilog 例

(*retiming_backward = 1 *) reg my_sig;

RETIMING_BACKWARD の VHDL 例

attribute retiming_backward : integer;attribute retiming_backward of my_sig : signal is 1;

RETIMING_BACKWARD の XDC 例

set_property retiming_backward 1 [get_cells my_sig];

RETIMING_FORWARD

RETIMING_FORWARD 属性は、 レジスタをロジッ クを通過させて前方に移動し、 駆動される順次エレ メン トに近づ

けます。 グローバル リ タイ ミ ング設定とは異なり、 この属性はタイ ミ ング ド リブンではなく、 グローバル リ タイ ミ

ング設定がアクティブであるかど うか、 タイ ミ ング制約があるかど うかにかかわらず機能します。 グローバル リ タ

イ ミ ング設定がアクティブの場合、 RETIMING_FORWARD が最初に実行され、 その後グローバル リ タイ ミ ングでレ

ジスタがチェーンのさらに前方に移動されるこ とはあ り ますが、 レジスタが元の場所に戻されてこの属性の効果が

キャンセルされるこ とはあ り ません。

注記: DONT_TOUCH/MARK_DEBUG 属性が設定されたセル、 タイ ミ ング例外 (false_path、 multicycle_path) が設定されたセル、 およびユーザーがインスタンシエート したセルでは、 この属性による処理は実行されません。

RETIMING_FORWARD 属性に有効な値は、 0 (オフ) または 1 (オン) です。 RTL または XDC で設定できます。

RETIMING_FORWARD の Verilog 例

(*retiming_forward = 1 *) reg my_sig;

RETIMING_FORWARD の VHDL 例

attribute retiming_forward : integer;attribute retiming_forward of my_sig : signal is 1;

RETIMING_FORWARD の XDC 例

set_property retiming_forward 1 [get_cells my_sig];

ROM_STYLE

ROM_STYLE は、 合成での ROM メモ リの推論方法を指定します。 有効な値は次のとおりです。

Page 55: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 55UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

• block: RAMB タイプのコンポーネン トが推論されるよ う指定します。

• distributed: LUT ROM が推論されるよ う指定します。 デフォルトでは、 ほとんどのデザインで最適な結果が

生成される ROM が推論されます。

この属性は RTL または XDC で設定できます。

ROM_STYLE の Verilog 例

(* rom_style = "distributed" *) reg [data_size-1:0] myrom [2**addr_size-1:0];

ROM_STYLE の VHDL 例

attribute rom_style : string;attribute rom_style of myrom : signal is "distributed";

ROM のコーディング スタイルの詳細は、 第 4 章の 「ROM の HDL コーディング手法」 を参照してください。

RW_ADDR_COLLISION

RW_ADDR_COLLISION 属性は特定のタイプの RAM に使用します。 RAM がシンプル デュアル ポートで読み出しア

ドレスにレジスタが付いている場合、 Vivado 合成でブロッ ク RAM が推論され、書き込みモードは WRITE_FIRST に設定されます。 これは、 タイ ミ ングの理由からです。 また、 デザインで読み出されているアドレスに同時に書き込

みが実行された場合に RAM の出力が不確定になるからです。 RW_ADDR_COLLISION はこの処理を制御します。

RW_ADDR_COLLISION の値は次のとおりです。

• "auto": 前述のデフォルトの処理が実行されます。

• "yes": バイパス ロジッ クが挿入され、 1 つのアドレスに対して読み出し と書き込みが同時に実行された場合に

入力の値が出力に現れる (WRITE_FIRST) よ うにします。

• "no": タイ ミ ングおよび競合が問題とならない場合に使用します。 書き込みモードが NO_CHANGE に設定され、

消費電力が削減されます。

RW_ADDR_COLLISION は RTL でのみサポート されます。

VHDL 例

attribute rw_addr_collision : string;attribute rw_addr_collision of my_ram : signal is "yes";

Verilog 例

(*rw_addr_collision = "yes" *) reg [3:0] my_ram [1023:0];

SHREG_EXTRACT

SHREG_EXTRACT は、 SRL 構造を推論するかど うかを指定します。 有効な値は次のとおりです。

• yes: SRL 構造が推論されます。

• no: SRL 構造は推論されず、 レジスタが作成されます。

Page 56: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 56UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

SHREG_EXTRACT 属性は、 SRL に宣言する信号または SRL を含むモジュール/エンティティに設定します。 RTL また

は XDC で設定できます。

SHREG_EXTRACT の Verilog 例

(* shreg_extract = "no" *) reg [16:0] my_srl;

SHREG_EXTRACT の VHDL 例

attribute shreg_extract : string;attribute shreg_extract of my_srl : signal is "no";

SRL_STYLE

SRL_STYLE 属性は、 SRL メモ リの推論方法を指定します。 有効な値は次のとおりです。

• register: SRL は推論されず、 レジスタのみが使用されます。

• srl: 前後のレジスタなしで SRL が推論されます。

• srl_reg: SRL が推論され、 SRL の後にレジスタが 1 つ残されます。

• reg_srl: SRL が推論され、 SRL の前にレジスタが 1 つ残されます。

• reg_srl_reg: SRL が推論され、 SRL の前後にレジスタが 1 つずつ残されます。

• block: ブロ ッ ク RAM 内に SRL が推論されます。

SRL_STYLE 属性は、 SRL に宣言する信号に設定します。 この属性は RTL および XDC で設定できます。 この属性は

スタティ ッ ク SRL にのみ使用可能です。 ダイナミ ッ ク SRL のインデッ クス ロジッ クは SRL コンポーネン ト内にあ

るので、 コンポーネン ト外のアドレスを調べるために SRL コンポーネン トの周囲にロジッ クを作成するこ とはでき

ません。

注意: SRL_STYLE 属性、 SHREG_EXTRACT 属性、 および -shreg_min_size コマンド ライン オプシ ョ ンを組み合

わせて使用する場合は、 注意が必要です。 SHREG_EXTRACT 属性が常に最優先されます。 SHREG_EXTRACT が "no"、 SRL_STYLE が "srl" に設定されている場合は、 レジスタが使用されます。 -shreg_min_size オプシ ョ ン

はグローバル設定なので、 優先順位は最も低くな り ます。 長さが 10 の SRL の SRL_STYLE 属性が "srl" が設定さ

れており、 -shreg_min_size が 20 に設定されている場合でも、 SRL は推論されます。

注記: 次に示す例では、 SRL はすべてバスと共に作成されており、 SRL は 1 つのビッ トから次のビッ トにシフ ト しま

す。 SRL_STYLE を使用するコードに多数の名前が異なる信号が含まれ、 お互いに駆動し合っている場合は、 チェー

ンの最後の信号に SRL_STYLE 属性を設定してください。 これは、 チェーン内の最後のレジスタがほかのレジスタ

とは別の階層レベルにある場合などです。 属性は常にチェーンの最後のレジスタに適用されます。

SRL_STYLE の Verilog 例

(* srl_style = "register" *) reg [16:0] my_srl;

SRL_STYLE の VHDL 例

attribute srl_style : string;attribute srl_style of my_srl : signal is "reg_srl_reg";

Page 57: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 57UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

SRL_STYLE の XDC 例

set_property srl_style register [get_cells my_shifter_reg*]

TRANSLATE_OFF/TRANSLATE_ON

TRANSLATE_OFF および TRANSLATE_ON は、 合成でコードのブロ ッ クを無視するよ う指定します。 これらの属性

は、 RTL のコ メン ト内で指定します。 コ メン トは、 次のいずれかのキーワードで開始します。

• synthesis

• synopsys

• pragma

• xilinx

translate_off で無視が開始され、 translate_on で終了します。 これらのコマンドはネス ト化できません。

この属性は RTL でのみ設定できます。

TRANSLATE_OFF/TRANSLATE_ON の Verilog 例

// synthesis translate_offCode....// synthesis translate_on

TRANSLATE_OFF/TRANSLATE_ON の VHDL 例

-- synthesis translate_offCode...-- synthesis translate_on

注意: translate 文の間に含めるコードの種類には、 注意が必要です。 デザインの動作に影響するコードの場合、 シ

ミ ュレータで使用され、 シ ミ ュレーシ ョ ンで不一致が発生するこ とがあ り ます。

USE_DSP注記: この属性は、 サイズが異なる新しい DSP ブロ ッ クを含めるため USE_DSP48 から名前が変更されたものです。

USE_DSP48 属性を異なるサイズの DSP に使用しても機能します。

推奨: USE_DSP48 はすべて、 新しい名前 USE_DSP に変更するこ とをお勧めします。

USE_DSP は、 合成の演算構造をどのよ うに処理するかを指定します。 デフォルトでは、 タイ ミ ングの懸念事項やしきい値制限がなければ、 乗算器、 乗加算器、 乗減算器、 乗累算器タイ

プの構造は DSP ブロ ッ クに推論するよ う試みられます。

加算器、 減算器、 アキュムレータも DSP ブロ ッ クに含めるこ とはできますが、 デフォルトでは DSP ブロ ッ クではな

く ロジッ クにインプリ メン ト されます。 USE_DSP 制約を使用する と、 これらの構造を DSP ブロ ッ クに含めるこ とが

できます。

有効な値は "logic"、 "yes"、 および "no" です。

Page 58: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 58UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

• "logic" は、 XOR 構造を DSP 内に配置する場合に使用します。 "logic" を使用する場合、 この属性はモ

ジュール/アーキテクチャ レベルにのみ設定可能です。

• "yes" および "no" は、 ロジッ クを DSP 内に配置するかしないかを指定します。 これらの値は、 RTL の信号、

アーキテクチャ、 コンポーネン ト、 エンティティ、 およびモジュールに設定できます。 優先順位は、 1.信号、 2.アーキテクチャおよびコンポーネン ト、 3.モジュールおよびエンティティです。

この属性を指定しない場合は、 Vivado 合成で最適な動作が決定されます。 この属性は RTL または XDC で設定でき

ます。

USE_DSP の Verilog 例

(* use_dsp = "yes" *) module test(clk, in1, in2, out1);

USE_DSP の VHDL 例

attribute use_dsp : string;attribute use_dsp of P_reg : signal is "no"

Vivado でのカスタム属性のサポート

Vivado 合成では、 RTL でのカスタム属性の使用がサポート されています。 カスタム属性の動作は、 合成では認識さ

れません。 カスタム属性は通常、 合成後に実行されるほかのツールで使用するためのものです。

注意: Vivado 合成は、 不明な属性がある とそれらを次の段階に渡そう と しますが、 設計者はそのリ スクを理解してお

く こ とが必要です。 カスタム属性が設定されていても合成最適化が阻止されるこ とはないので、 カスタム属性が設

定されているオブジェク トが最適化で削除される と、 その属性は失われます。

カスタム属性を合成後の段階に渡す必要がある場合は、 DONT_TOUCH または KEEP_HIERARCHY 属性を使用して、

カスタム属性が必要なオブジェク トが合成最適化によ り削除されないよ うにする必要があ り ます。

カスタム属性を設定可能なオブジェク トは、 階層と信号です。

合成ではデフォルトでデザイン階層がフラ ッ ト化され、 デザインが最適化されてからデザイン階層が再構築される

ので、 カスタム属性を階層に設定する場合は、 -flatten_hierarchy オプシ ョ ンを none に設定するか、 その階

層レベルに KEEP_HIERARCHY を設定する必要があ り ます。

デザイン階層がフラ ッ ト化される と、 階層に設定されたカスタム属性は失われます。

階層に設定されたカスタム属性の Verilog 例(* my_att = "my_value", DONT_TOUCH = "yes" *) module test(....

階層に設定されたカスタム属性の VHDL 例attribute my_att : string;attribute my_att of beh : architecture is "my_value"attribute DONT_TOUCH : string;attribute DONT_TOUCH of beh : architecture is "yes";

Page 59: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 59UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

カスタム属性を信号に設定する場合も注意が必要です。 信号にカスタム属性が設定されている と、 合成ツールはそ

のアイテムにその属性を配置しよ う と しますが、 RTL コードがツールによ り どのよ うに評価されるかによって、 そ

のアイテムがレジスタまたはネッ トに変換されるこ とがあ り ます。 また、 階層に設定されている場合と同様、 信号

にカスタム属性が設定されていても、 その信号が最適化によ り削除され、 属性が失われる可能性があ り ます。 信号

に設定したカスタム属性を保持するには、 それらの信号に DONT_TOUCH または KEEP 属性を設定する必要があ り ま

す。

最後に、 RTL の信号はレジスタおよびレジスタから出力されるネッ ト を記述するので、 合成ツールはカスタム属性

と DONT_TOUCH 属性の両方が設定されたアイテムをチェッ ク します。 カスタム属性の使用方法は複数あ り、 属性が

レジスタに必要な場合とネッ トに必要な場合があるので、 ネッ トがレジスタによ り駆動されている場合、 カスタム

属性はレジスタおよびネッ トにコピーされます。

信号に設定されたカスタム属性の Verilog 例(* my_att = "my_value", DONT_TOUCH = "yes" *) reg my_signal;

信号に設定されたカスタム属性の VHDL 例attribute my_att : string;attribute my_att of my_signal : signal is "my_value";attribute DONT_TOUCH : string;attribute DONT_TOUCH of my_signal : signal is "yes";

XDC ファイルでの合成属性の使用

一部の合成属性は、 RTL ファ イルだけでなく XDC ファ イルでも設定できます。 通常、 合成の最終段階で使用され、

合成でのロジッ クの作成方法を指定する属性は、 XDC ファ イルで設定できます。 合成の初期段階で使用され、 コン

パイラに影響する属性は、 XDC ファ イルでは設定できません。

たとえば、 KEEP および DONT_TOUCH 属性は XDC では設定できません。

これは、 属性が XDC ファ イルから読み込まれた時点では、 KEEP または DONT_TOUCH 属性が設定されたコンポーネ

ン トが既に最適化で削除されてしまっており、 存在していない可能性があるからです。 そのため、 これらの属性は

必ず RTL コードで設定してください。 属性をどこで設定するかについては、 この章の各属性のセクシ ョ ンを参照し

てください。

合成属性を XDC で設定するには、 [Tcl Console] ウ ィンド ウに次の構文を入力します。

set_property <attribute> <value> <target>

次に例を示します。

set_property MAX_FANOUT 15 [get_cells in1_int_reg]

これらの属性は、 エラボレート済みデザインでも設定できます。 これには、 次の手順に従います。

1. エラボレート済みデザインを開き、 次のいずれかの方法を使用して、 属性を設定するアイテムを選択します。

° 回路図でアイテムをク リ ッ ク します。

° 図 2-1 に示すよ うに [RTL Netlist] ウ ィンド ウでアイテムを選択します。

Page 60: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 60UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 2 章: 合成属性

2. [Cell Properties] ウ ィンド ウで [Properties] ビューをク リ ッ ク し、 次のいずれかを実行します。

° プロパティを変更します。

° プロパティが表示されていない場合は、 右ク リ ッ ク して [Add Properties] をク リ ッ クするかツールバーの [Add properties] ボタンをク リ ッ ク して、 [Add Properties] ダイアログ ボッ クスでプロパティを選択します。

これによ り属性が現在の制約ファイルに保存されるか、 制約ファイルが存在しない場合は新しい制約ファイル

に保存されます。

合成属性の伝搬規則

属性を階層に配置するか信号に配置するかの規則は、 各属性の説明を参照してください。

通常、 属性が階層に設定される場合は、 その境界にのみ影響し、 その階層内のほかのものには影響しません。

たとえば、 特定レベルに設定された DONT_TOUCH はそのレベルにのみ適用され、 そのレベル内の信号には適用

されません。

この規則には例外もあ り ます。 その例外とは、 DSP_FOLDING、 RAM_STYLE、 ROM_STYLE、

SHREG_EXTRACT、 USE_DSP などです。 これらの属性が階層に設定される と、 その階層内の信号にも影響しま

す。

X-Ref Target - Figure 2-1

図 2-1: エラボレート済みデザインでの XDC プロパティの追加

Page 61: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 61UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 3 章

ブロック合成スト ラテジの使用

概要

Vivado® 合成では、 合成でデザインがどのよ うに処理されるかをカスタマイズするためのス ト ラテジおよびグロー

バル設定が多数あ り ます。 図 1-2 に [Settings] ダイアログ ボッ クスの [Synthesis] ページで選択可能な定義済みス ト ラ

テジ、 表 1-2 にス ト ラテジ設定を比較する表が示されています。

-retiming などの一部のオプシ ョ ンは RTL ファ イルまたは XDC ファ イルの属性または XDC を使用して設定でき

ますが、 オプシ ョ ンは通常デザイン全体に適用されます。

デザインが複雑になるにつれ、 これらの設定の適用によ りデザインで達成可能な結果が制限されるこ とがあ り ます。

デザインの階層によっては、 特定のオプシ ョ ンがほかのオプシ ョ ンよ り適している場合もあ り ます。 図 3-1 に、 異

なる階層タイプを含む中型のデザインを示します。

Page 62: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 62UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 3 章: ブロック合成スト ラテジの使用

これらの階層をアウ ト オブ コンテキス ト (OOC) モードで合成するのが 1 つの方法であ り、効果的ですが、デザイン フローが複雑になり ます。 OOC フローでは、 OOC モードで合成するよ う設定された階層が分割され、 デザインのほ

かの部分から切り離して実行されます。 これは、 1 つのデザインで合成が複数回実行される という こ とです。 また、

制約もデザインの残りの部分から分割する必要があるので、 複雑性が増します。

ブロ ッ ク レベル合成フロー (BLOCK_SYNTH) では、 ト ップダウン フローで、 全デザインの最上位とは異なる特定の

階層レベルに、 特定のグローバル設定およびス ト ラテジを適用するプロパティを使用します。

X-Ref Target - Figure 3-1

図 3-1: 多数の階層を含むデザイン

Page 63: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 63UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 3 章: ブロック合成スト ラテジの使用

ブロック レベル フローの設定

ブロ ッ ク レベル合成フローを設定するには、 XDC ファ イルで Tcl を使用して BLOCK_SYNTH プロパティを設定しま

す。 構文は次のとおりです。

set_property BLOCK_SYNTH.<option name> <value> [get_cells <instance_name>]

説明:

° <option_name>: 設定するオプシ ョ ンを指定します。

° <value>: オプシ ョ ンに割り当てる値を指定します。

° <instance_name>: オプシ ョ ンを設定する階層インスタンスを指定します。

次に例を示します。

set_property BLOCK_SYNTH.MAX_LUT_INPUT 4 [get_cells fftEngine]

このプロパティは、 エンティティ名またはモジュール名にではなく、 インスタンス名に設定してください。 インス

タンス名を使用する と、 複数回インスタンシエート されているモジュール/エンティティがある場合に、 Vivado 合成

での処理がよ り柔軟なものになり ます。 上記の例では、 fftEngine インスタンスに LUT5 または LUT6 プリ ミティ

ブが使用されないよ う設定しています。

注記: BLOCK_SYNTH をインスタンスに設定する と、 そのインスタンス とその下位にあるインスタンスすべてに適用

されます。 たとえば、 fftEngine 内にほかのモジュールがインスタンシエート されている場合、 それらのモジュー

ルでも LUT5 または LUT6 プリ ミティブは使用されません。

注意: BLOCK_SYNTH プロパティを設定する と、 このインスタンスに影響を与えるのに加え、 このインスタンスの

階層も硬化します。 この階層に I/O バッファーが含まれる場合や、 入力/出力バッファーが推論される場合は、 特に

注意が必要です。

BLOCK_SYNTH プロパティを設定したインスタンスには、 そのオプシ ョ ンに対して指定の値が適用され、 ほかのオ

プシ ョ ンはデフォルト値になり ます。

1 つのインスタンスに複数の BLOCK_SYNTH プロパティを設定し、 異なる組み合わせを試すこ とができます。 次

の例では、 同じロジッ クがソースであるレジスタを統合しないよ うにし、 FSM の推論をディ スエーブルにし、

AlternateRoutability ス ト ラテジを使用するよ う設定しています。

set_property BLOCK_SYNTH.STRATEGY {ALTERNATE_ROUTABILITY} [get_cells mod_inst]set_property BLOCK_SYNTH.KEEP_EQUIVALENT_REGISTER 1 [get_cells mod_inst]set_property BLOCK_SYNTH.FSM_EXTRACTION {OFF} [get_cells mod_inst]

インスタンスに含まれるインスタンスに別のプロパティ設定が必要な場合は、 BLOCK_SYNTH プロパティを複数の

レベルに設定できます。 1 つのレベルのみに設定が必要な場合、 そのレベルにプロパティを設定し、 その下のレベル

に次のコマンドを使用してデフォルト値を設定します。

set_property BLOCK_SYNTH.MAX_LUT_INPUT 6 [get_cells fftEngine/newlevel]

newlevel が fftEngine に含まれる唯一の階層である場合は、 このコマンドによ り fftEngine のみに MAX_LUT_INPUT = 4 プロパティが適用されます。 このレベルにデフォルト とは異なる値を設定するこ と もできま

す。

Page 64: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 64UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 3 章: ブロック合成スト ラテジの使用

注記: ブロ ッ ク レベル フローを実行する と、 デザインが ト ップダウン モードになり、 デザイン全体で合成が実行さ

れます。 BLOCK_SYNTH プロパティを設定したインスタンスでは、 そのレベルが確実に境界内に含まれ、 周辺のロ

ジッ ク と結合されたり しないよ うに、 階層が保持されます。 これは、 QoR (結果の品質) に影響する可能性があ り ま

す。 そのため、 BLOCK_LEVEL プロパティの使用には注意が必要です。 必要なインスタンスにのみ設定するよ うに

して ください。

ブロック レベル フロー オプシ ョ ン ブロ ッ ク レベル フローでは、 ツールで提供される定義済みス ト ラテジの一部がサポート されます。 使用可能なス ト

ラテジは、 DEFAULT、 AREA_OPTIMIZED、 ALTERNATE_ROUTABILITY、 PERFORMANCE_OPTIMIZED です。 XDC 制約構文は、 次のよ うにな り ます。

set_property BLOCK_SYNTH.STRATEGY {<value>} [get_cells <inst_name>]

次の表に、 サポート されている Vivado ブロ ッ ク合成設定を示します。

表 3-1: BLOCK_SYNTH でサポート される設定

オプシ ョ ン データ型 値 説明

RETIMING整数 0、 1

• 0: リ タイ ミ ングをディ スエーブルにします。

• 1: リ タイ ミ ングをイネーブルにします。

ADDER_THRESHOLD

整数 4 ~ 128

キャ リー チェーンを推論する加算器サイズのしきい値

を変更します。

• 値を大き くする と、 LUT が多くな り ます。

• 値を小さ くする と、 キャ リー チェーンが多くな り ま

す。

しきい値は、 加算器オペランドのサイズを加算するこ

とによ り算出されます。 指定する値は、 入力幅の合計

以上にする必要があ り ます。

COMPARATOR_THRESHOLD

整数 4 ~ 128

キャ リー チェーンを推論するコンパレータ サイズのし

きい値を変更します。

• 値を大き くする と、 LUT が多くな り ます。

• 値を小さ くする と、 キャ リー チェーンが多くな り ま

す。

SHREG_MIN_SIZE

整数 3 ~ 32

SRL プリ ミ ティブを推論するレジスタ チェーン サイズ

のしきい値を変更します。

• 値を大き くする と、 レジスタが多くな り ます。

• 値を小さ くする と、 SRL が多くな り ます。

FSM_EXTRACTION

文字列

OFF

ONE_HOT

SEQUENTIAL

GRAY

JOHNSON

AUTO

合成ツールで推論されるステート マシンのエンコード

を設定します。

Page 65: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 65UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 3 章: ブロック合成スト ラテジの使用

LUT_COMBINING整数 0、 1

• 0: LUT の組み合わせをディ スエーブルにします。

• 1: LUT の組み合わせをイネーブルにします。

CONTROL_SET_THRESHOLD

整数 0 ~ 128

制御信号を持つレジスタを推論する制御信号のファン

アウ ト を指定します。

• 値を大き くする と、 制御信号のロジッ クが少なくな

り、 フ リ ップフロ ップの D 入力のロジッ クが多くな

り ます。

• 値を小さ くする と、 制御信号が多くな り、 D 入力の

ロジッ クが少なくな り ます。

MAX_LUT_INPUT

整数 4 ~ 6

• 4: LUT5 または LUT6 プリ ミ ティブは推論されませ

ん。

• 5: LUT6 プリ ミ ティブは推論されません。

• 6: すべての LUT を推論可能です。

MUXF_MAPPING

整数 0、 1

• 0: MUXF7、 MUXF8、 MUXF9 の推論をディ スエーブ

ルにします。

• 1: MUXF7、 MUXF8、 MUXF9 の推論をイネーブルに

します。

KEEP_EQUIVALENT_REGISTER整数 0、 1

• 0: 等価レジスタを統合します。

• 1: 等価レジスタを保持します。

PRESERVE_BOUNDARY

整数 あらゆる数値

このオプシ ョ ンは、 インク リ メンタル合成を使用して

いる場合にのみ使用できます。 変化するこ とがわかっ

ている階層をマークするために使用します。 このオプ

シ ョ ンを使用する と、 階層がスタティ ッ クにな り、 イ

ンク リ メンタル フローが使用できるよ うにな り ます。

このオプシ ョ ンを設定しただけでは十分ではないので、

指定する値は影響しません。

LOGIC_COMPACTION

整数 1よ り少ないスライスを使用してロジッ クがコ

ンパク トになるよ うに CARRY チェーンと LUT を並べ替えます。

表 3-1: BLOCK_SYNTH でサポート される設定

オプシ ョ ン データ型 値 説明

Page 66: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 66UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章

HDL コーディング手法

概要

ハードウェア記述言語 (HDL) のコーディング手法を使用する と、 次が可能になり ます。

• デジタル ロジッ ク回路でよ く使用される機能を記述できます。

• ザイ リ ンクス デバイスのアーキテクチャ機能を利用できます。

• Vivado® Design Suite 統合設計環境 (IDE) からテンプレート を使用できます。 テンプレート を開くには、

[Window] → [Language Templates] をク リ ッ ク します。

この章にはコード例が含まれます。 コード例のファイルは、 この リ ンクからダウンロードできます。

VHDL の利点

• 規則が厳し く、 データ型が厳格に定義されているため、 自由度が低く、 エラーが発生しにくい

• HDL ソース コードでの RAM コンポーネン トの初期化が簡単 (Verilog の初期ブロッ クの方が困難)

• パッケージ サポート

• カスタム型

• 列挙型

• reg と wire の混乱がない

Verilog の利点

• C 言語のよ うな構文

• コードが VHDL よ り もコンパク ト

• ブロ ッ ク コ メン ト

• VHDL のよ うにコンポーネン ト インスタンシエーシ ョ ンが多くない

Page 67: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 67UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

SystemVerilog の利点

• コードが Verilog よ り もコンパク ト

• 構造体および列挙型によ り スケーラビ リ ティに優れている

• 高抽象度のインターフェイス

• Vivado 合成でサポート

フリ ップフロップ、 レジスタ、 およびラッチ

Vivado 合成では、 次の制御信号付きのフ リ ップフロ ップ、 レジスタが認識されます。

• 立ち上がりエッジまたは立ち下がりエッジのクロ ッ ク

• 非同期セッ ト / リ セッ ト

• 同期セッ ト / リ セッ ト

• ク ロ ッ ク イネーブル

フ リ ップフロ ップ、 レジスタ、 およびラ ッチは、 次を使用して記述されます。

• 順次処理文 (VHDL)

• always ブロ ッ ク (Verilog)

• フ リ ップフロ ップには always_ff、 ラ ッチには always_latch (SystemVerilog)

process または always ブロ ッ クのセンシティビティ リ ス トには、 次を含める必要があ り ます。

• ク ロ ッ ク信号

• すべての非同期制御信号

フリ ップフロップおよびレジスタの制御信号

フ リ ップフロ ップおよびレジスタの制御信号には、 次のものがあ り ます。

• ク ロ ッ ク

• 非同期および同期のセッ ト / リ セッ ト信号

• ク ロ ッ ク イネーブル

Page 68: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 68UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

コード記述のガイド ライン

• レジスタを非同期にセッ ト / リ セッ ト しないでください。

° 制御セッ ト をマップし直すこ とができなくな り ます。

° ブロ ッ ク RAM コンポーネン トおよび DSP ブロ ッ クなどのデバイス リ ソースの順次機能は、 同期的にしか

セッ ト またはリセッ トできません。

° レジスタを非同期にセッ ト またはリセッ トする と、 デバイス リ ソースが使用できなくなるか、 それらのリ

ソースが最適に設定されなくな り ます。

• セッ ト と リセッ トの両方を持つフ リ ップフロ ップを記述しないでください。

° 同期または非同期のどちらであっても、 セッ ト と リセッ トの両方を持つフ リ ップフロ ップ プリ ミティブは

あ り ません。

° セッ ト と リセッ トの両方を持つフ リ ップフロ ップは、 エ リ アおよびパフォーマンスに悪影響を与える可能

性があ り ます。

• できる限り、 セッ ト / リ セッ ト ロジッ クを使用しないでください。 初期内容を定義して回路のグローバル リ セッ

ト を使用するなど、 必要な機能を達成できるコス トが低いその他の方法がある可能性があ り ます。

• フ リ ップフロ ップ プリ ミ ティブのクロ ッ ク イネーブル、 セッ ト / リ セッ ト制御入力は常にアクティブ High にし

ます。 アクティブ Low にする と、 反転ロジッ クによ り回路パフォーマンスが悪化するこ とがあ り ます。

フリ ップフロップおよびレジスタの推論

Vivado 合成では、 HDL コードの記述方法によって、 4 種類のレジスタ プリ ミティブが推論されます。

• FDCE: ク ロ ッ ク イネーブルおよび非同期ク リ ア付き D フ リ ップフロ ップ

• FDPE: ク ロ ッ ク イネーブルおよび非同期プリセッ ト付き D フ リ ップフロ ップ

• FDSE: ク ロ ッ ク イネーブルおよび同期セッ ト付き D フ リ ップフロ ップ

• FDRE: ク ロ ッ ク イネーブルおよび同期リセッ ト付き D フ リ ップフロ ップ

フリ ップフロップおよびレジスタの初期化

回路に電源が投入されたと きにレジスタの内容を初期化するには、 信号宣言でデフォルト値を指定します。

フリ ップフロップおよびレジスタのレポート

• HDL 合成中にレジスタが推論される と、 レポートに記述されます。

• HDL 合成中に推論されたレジスタの数は、 Design Summary セクシ ョ ンのフ リ ップフロ ップ プリ ミティブの数と

完全に一致しないこ とがあ り ます。

• フ リ ップフロ ップ プリ ミ ティブの数は、 次の処理によ り異なり ます。

° DSP ブロ ッ クまたはブロ ッ ク RAM コンポーネン トへのレジスタの吸収

° レジスタの複製

° 定数または等価フ リ ップフロ ップの削除

Page 69: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 69UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

フ リ ップフロップおよびレジスタのレポート例

---------------------------------------------------------------------------------

RTL Component Statistics

---------------------------------------------------------------------------------

Detailed RTL Component Info :

+---Registers :

8 Bit Registers := 1

Report Cell Usage:

-----+----+-----

|Cell|Count

-----+----+-----

3 |FDCE| 8

-----+----+-----

フリ ップフロップおよびレジスタのコード例

次に、 フ リ ップフロ ップとレジスタの VHDL および Verilog コード例を示します。 コード例のファイルは、 この リ ン

クからダウンロードできます。

立ち上がりエッジで動作するレジスタのコード例 (Verilog)

ファ イル名: registers_1.v

// 8-bit Register with// Rising-edge Clock// Active-high Synchronous Clear// Active-high Clock Enable// File: registers_1.v

module registers_1(d_in,ce,clk,clr,dout);input [7:0] d_in;input ce;input clk;input clr;output [7:0] dout;reg [7:0] d_reg;

always @ (posedge clk)begin if(clr) d_reg <= 8'b0; else if(ce) d_reg <= d_in;end

assign dout = d_reg;endmodule

Page 70: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 70UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

立ち上がりエッジで動作するフリ ップフロップ レジスタのコード例 (VHDL)

ファ イル名: registers_1.vhd

-- Flip-Flop with-- Rising-edge Clock-- Active-high Synchronous Clear-- Active-high Clock Enable-- File: registers_1.vhd

library IEEE;use IEEE.std_logic_1164.all;

entity registers_1 is port( clr, ce, clk : in std_logic; d_in : in std_logic_vector(7 downto 0); dout : out std_logic_vector(7 downto 0) );end entity registers_1;architecture rtl of registers_1 isbegin process(clk) is begin if rising_edge(clk) then if clr = '1' then dout <= "00000000"; elsif ce = '1' then dout <= d_in; end if; end if; end process;end architecture rtl;

Page 71: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 71UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

ラ ッチ

Vivado ログ ファ イルに認識されたラ ッチのタイプとサイズがレポート されます。

ラ ッチが推論される原因は、 if 文や case 文が不完全であるなど、 HDL コードの間違いであるこ とがほとんどです。

Vivado 合成では、 ラ ッチが推論される と、 次のレポート例に示すよ うに警告メ ッセージが生成されます。 これによ

り、 ラ ッチの推論が意図されたものであるかど うかを確認できます。

ラッチのレポート例

=========================================================================

* Vivado.log *

=========================================================================

WARNING: [Synth 8-327] inferring latch for variable 'Q_reg'

========================================================================= Report Cell Usage:

-----+----+-----

|Cell|Count

-----+----+-----

2 |LD | 1

-----+----+-----

===================================================================

正ゲートおよび非同期リセッ ト付きラッチのコード例 (Verilog)

ファ イル名: latches.v

// Latch with Positive Gate and Asynchronous Reset// File: latches.vmodule latches ( input G, input D, input CLR, output reg Q );always @ *begin if(CLR) Q = 0; else if(G) Q = D;end

endmodule

Page 72: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 72UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

正ゲートおよび非同期リセッ ト付きラッチのコード例 (VHDL)

ファ イル名: latches.vhd

-- Latch with Positive Gate and Asynchronous Reset-- File: latches.vhdlibrary ieee;use ieee.std_logic_1164.all;

entity latches is port( G, D, CLR : in std_logic; Q : out std_logic );end latches;

architecture archi of latches isbegin process(CLR, D, G) begin if (CLR = '1') then Q <= '0'; elsif (G = '1') then Q <= D; end if; end process;end archi;

ト ライステート

• ト ラ イステートは通常、 信号または if-else 構文でモデリ ングされます。

• これは、 バッファーが内部バスを駆動する場合でも、 デバイスが搭載されているボード上の外部バスを駆動す

る場合でも適用されます。

• if-else の分岐の 1 つで信号がハイ インピーダンスに割り当てられています。

コード例のファイルは、 この リ ンクからダウンロードできます。

ト ライステートのインプリ メンテーシ ョ ン

推論された ト ライステート バッファーは、 次のいずれかを駆動するかによって、 異なるデバイス プリ ミ ティブを使

用してインプリ メン ト されます。

• 回路の外部ピン (OBUFT)

• 内部バス (BUFT):

° 推論された BUFT は、 Vivado 合成によ り LUT 内のロジッ クに自動的に変換されます。

° BUFT を推論する内部バスが最上位モジュールの出力を駆動する場合、 OBUF が推論されます。

Page 73: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 73UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

ト ライステートのレポート例

HDL 合成中にト ライステート バッファーが推論される と、 レポートに記述されます。

=========================================================================

* Vivado log file *

=========================================================================

Report Cell Usage:

-----+-----+-----

|Cell |Count

-----+-----+-----

1 |OBUFT| 1

-----+-----+-----

=========================================================================

同時処理代入文を使用したト ライステートのコード例 (Verilog)

ファ イル名: tristates_2.v

// Tristate Description Using Concurrent Assignment// File: tristates_2.v//module tristates_2 (T, I, O);input T, I;output O;

assign O = (~T) ? I: 1'bZ;

endmodule

OBUFT と共にインプリ メン ト された組み合わせプロセスを使用したト ライステート記述のコード例 (VHDL)

ファ イル名: tristates_1.vhd

-- Tristate Description Using Combinatorial Process-- Implemented with an OBUFT (IO buffer)-- File: tristates_1.vhd--library ieee;use ieee.std_logic_1164.all;

entity tristates_1 is port( T : in std_logic; I : in std_logic; O : out std_logic );end tristates_1;

architecture archi of tristates_1 is

Page 74: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 74UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

begin process(I, T) begin if (T = '0') then O <= I; else O <= 'Z'; end if; end process;

end archi;

組み合わせ always ブロックを使用したト ライステート記述のコード例 (Verilog)

ファ イル名: tristates_1.v

// Tristate Description Using Combinatorial Always Block// File: tristates_1.v//module tristates_1 (T, I, O);input T, I;output O;reg O;

always @(T or I)begin if (~T) O = I; else O = 1'bZ;end

endmodule

シフ ト レジスタ

シフ ト レジスタはフ リ ップフロ ップのチェーンで、 固定数 (スタティ ッ ク ) のレイテンシ段を介してデータを伝搬で

きます。 「ダイナミ ッ ク シフ ト レジスタ」 では、 伝搬チェーンの長さを回路の操作中にダイナミ ッ クに変更できま

す。

コード例のファイルは、 この リ ンクからダウンロードできます。

Page 75: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 75UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

スタテ ィ ック シフ ト レジスタの要素

スタティ ッ ク シフ ト レジスタには、 通常次のものが含まれます。

• ク ロ ッ ク

• ク ロ ッ ク イネーブル (オプシ ョ ン)

• シ リ アル データ入力

• シ リ アル データ出力

シフ ト レジスタの SRL ベースのインプリ メンテーシ ョ ン

Vivado 合成では、 シフ ト レジスタが推論される と、 通常次のよ うな SRL 型のリ ソースにインプリ メン ト されます。

• SRL16E

• SRLC32E

シフ ト レジスタの長さによって、 Vivado 合成で次のよ うに処理されます。

• SRL タイプのプリ ミ ティブにインプリ メン ト

• SRLC タイプのプリ ミ ティブのカスケード機能を利用

• デザインの残りの部分でシフ ト レジスタの中間地点のどこかが使用される場合も、 このカスケード機能が利用

されます。

シフ ト レジスタのコード例

次に、 シフ ト レジスタの VHDL および Verilog コード例を示します。

32 ビッ ト シフ ト レジスタのコード例 1 (VHDL)

次のコード例では、 連結コード スタイルを使用しています。

ファ イル名: shift_registers_0.vhd

-- 32-bit Shift Register-- Rising edge clock-- Active high clock enable-- Concatenation-based template-- File: shift_registers_0.vhd

library ieee;use ieee.std_logic_1164.all;entity shift_registers_0 is generic( DEPTH : integer := 32 ); port( clk : in std_logic; clken : in std_logic; SI : in std_logic; SO : out std_logic );

end shift_registers_0;

Page 76: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 76UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

architecture archi of shift_registers_0 is signal shreg : std_logic_vector(DEPTH - 1 downto 0);begin process(clk) begin if rising_edge(clk) then if clken = '1' then shreg <= shreg(DEPTH - 2 downto 0) & SI; end if; end if; end process; SO <= shreg(DEPTH - 1);end archi;

32 ビッ ト シフ ト レジスタのコード例 2 (VHDL)

同じ機能は、 次のよ うにも記述できます。

ファ イル名: shift_registers_1.vhd

-- 32-bit Shift Register-- Rising edge clock-- Active high clock enable-- foor loop-based template-- File: shift_registers_1.vhd

library ieee;use ieee.std_logic_1164.all;entity shift_registers_1 is generic( DEPTH : integer := 32 ); port( clk : in std_logic; clken : in std_logic; SI : in std_logic; SO : out std_logic );

end shift_registers_1;

architecture archi of shift_registers_1 is signal shreg : std_logic_vector(DEPTH - 1 downto 0);begin process(clk) begin if rising_edge(clk) then if clken = ‘1’ then for i in 0 to DEPTH - 2 loop shreg(i + 1) <= shreg(i); end loop; shreg(0) <= SI; end if; end if; end process; SO <= shreg(DEPTH - 1);end archi;

Page 77: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 77UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

8 ビッ ト シフ ト レジスタのコード例 1 (Verilog)

次のコード例では、 連結を使用してレジスタ チェーンを記述しています。

ファ イル名: shift_registers_0.v

// 8-bit Shift Register// Rising edge clock// Active high clock enable// Concatenation-based template// File: shift_registers_0.v

module shift_registers_0 (clk, clken, SI, SO);parameter WIDTH = 32; input clk, clken, SI; output SO;

reg [WIDTH-1:0] shreg;

always @(posedge clk) begin if (clken) shreg = {shreg[WIDTH-2:0], SI}; end

assign SO = shreg[WIDTH-1];

endmodule

32 ビッ ト シフ ト レジスタのコード例 2 (Verilog)

ファ イル名: shift_registers_1.v

// 32-bit Shift Register// Rising edge clock// Active high clock enable// For-loop based template// File: shift_registers_1.v

module shift_registers_1 (clk, clken, SI, SO);parameter WIDTH = 32; input clk, clken, SI; output SO;reg [WIDTH-1:0] shreg;

integer i;always @(posedge clk)begin if (clken) begin for (i = 0; i < WIDTH-1; i = i+1) shreg[i+1] <= shreg[i]; shreg[0] <= SI; endendassign SO = shreg[WIDTH-1];endmodule

Page 78: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 78UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

SRL ベース シフ ト レジスタのレポート

Report Cell Usage: -----+-------+----- |Cell |Count-----+-------+-----1 |SRLC32E| 1

ダイナミ ック シフ ト レジスタ

ダイナミ ッ ク シフ ト レジスタは、 回路の動作中にダイナミ ッ クに長さを変えるこ とができるシフ ト レジスタです。

ダイナミ ッ ク シフ ト レジスタは、 次のよ うに考えるこ とができます。

• 回路の動作中に指定可能な最大長のフ リ ップフロ ップのチェーン。

• 指定されたクロ ッ ク サイクルで伝搬チェーンからデータを抽出する段階を選択するマルチプレクサー。

Vivado 合成では、 任意の最大長のダイナミ ッ ク シフ ト レジスタを推論できます。

Vivado ツールでは、ダイナミ ッ ク レジスタはデバイス ファ ミ リで使用可能な SRL タイプのプリ ミ ティブを使用して

最適にインプリ メン トできます。 次の図に、 ダイナミ ッ ク シフ ト レジスタの機能を示します。

Page 79: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 79UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

ダイナミ ック シフ ト レジスタのコード例

コード例のファイルは、 この リ ンクからダウンロードできます。

32 ビッ ト ダイナミ ック シフ ト レジスタのコード例 (Verilog)

ファ イル名: dynamic_shift_registers_1.v

// 32-bit dynamic shift register.// Download: // File: dynamic_shift_registers_1.v

module dynamic_shift_register_1 (CLK, CE, SEL, SI, DO);parameter SELWIDTH = 5;input CLK, CE, SI;input [SELWIDTH-1:0] SEL;output DO;

localparam DATAWIDTH = 2**SELWIDTH;reg [DATAWIDTH-1:0] data;

assign DO = data[SEL];

always @(posedge CLK) begin if (CE == 1'b1) data <= {data[DATAWIDTH-2:0], SI}; end endmodule

X-Ref Target - Figure 4-1

図 4-1: ダイナミ ック シフ ト レジスタの図

Page 80: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 80UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

32 ビッ ト ダイナミ ック シフ ト レジスタのコード例 (VHDL)

ファ イル名: dynamic_shift_registers_1.vhd

-- 32-bit dynamic shift register.-- File:dynamic_shift_registers_1.vhd-- 32-bit dynamic shift register.library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;

entity dynamic_shift_register_1 is generic( DEPTH : integer := 32; SEL_WIDTH : integer := 5 ); port( CLK : in std_logic; SI : in std_logic; CE : in std_logic; A : in std_logic_vector(SEL_WIDTH - 1 downto 0); DO : out std_logic );

end dynamic_shift_register_1;

architecture rtl of dynamic_shift_register_1 is type SRL_ARRAY is array (DEPTH - 1 downto 0) of std_logic;

signal SRL_SIG : SRL_ARRAY;

begin process(CLK) begin if rising_edge(CLK) then if CE = '1' then SRL_SIG <= SRL_SIG(DEPTH - 2 downto 0) & SI; end if; end if; end process;

DO <= SRL_SIG(conv_integer(A));

end rtl;

Page 81: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 81UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

乗算器

Vivado 合成では、 ソース コードの乗算から乗算器マクロが推論されます。 結果の出力信号のビッ ト数は、 2 つのオ

ペランドの合計ビッ ト数になり ます。 たとえば、 16 ビッ トの信号と 8 ビッ トの信号を乗算する場合、 結果は 24 ビッ

トにな り ます。

推奨: デバイスの上位ビッ ト をすべて使用しない場合、 特に乗算器マクロをスライス ロジッ クにインプリ メン トする

場合は、 オペランドのビッ ト数を必要最小限に削減するこ とをお勧めします。

乗算器のインプリ メンテーシ ョ ン

乗算器マクロは、 次のものにインプリ メン トできます。

• スライス ロジッ ク

• DSP ブロ ッ ク

どちらにインプリ メン ト されるかは、 次の要素に基づいて決定されます。

• オペランドのサイズ

• パフォーマンスを最高にする

乗算器をスライス ロジッ クまたは DSP ブロ ッ クに強制的にインプリ メン トするには、 適切な信号、 エンティティ、

またはモジュールに USE_DSP 属性を設定します。 この属性は、 次のいずれかの値に設定できます。

• no (スライス ロジッ クにインプリ メン ト )

• yes (DSP ブロ ッ クにインプリ メン ト )

DSP ブロックのインプリ メンテーシ ョ ン

乗算器を 1 つの DSP ブロ ッ クにインプリ メン トする場合、 DSP ブロ ッ クのパイプライン機能が利用されます。

Vivado 合成では、 乗算オペランドおよび乗算後にある 2 レベルまでのレジスタを吸収できます。

乗算器が 1 つの DSP ブロ ッ クに収まらない場合、 マクロを分解してインプリ メン ト します。 この場合、 次のいずれ

かにインプリ メン ト されます。

• 複数の DSP ブロ ッ ク

• DSP ブロ ッ ク と スライス ロジッ ク

レジスタが DSP ブロ ッ クに吸収されないよ うにするには、 KEEP 属性を使用します。 たとえば、 乗算器のオペラン

ドにレジスタがある場合、 レジスタの出力に KEEP を設定する と、 レジスタが DSP ブロ ッ クに吸収されなくな り ま

す。

Page 82: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 82UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

乗算器のコード例

符号なし 16x24 ビッ ト乗算器のコード例 (Verilog)

ファ イル名: mult_unsigned.v

// Unsigned 16x24-bit Multiplier// 1 latency stage on operands// 3 latency stage after the multiplication// File: multipliers2.v//module mult_unsigned (clk, A, B, RES);

parameter WIDTHA = 16;parameter WIDTHB = 24;input clk;input [WIDTHA-1:0] A;input [WIDTHB-1:0] B;output [WIDTHA+WIDTHB-1:0] RES;

reg [WIDTHA-1:0] rA;reg [WIDTHB-1:0] rB;reg [WIDTHA+WIDTHB-1:0] M [3:0];

integer i;always @(posedge clk) begin rA <= A; rB <= B; M[0] <= rA * rB; for (i = 0; i < 3; i = i+1) M[i+1] <= M[i]; end assign RES = M[3];

endmodule

符号なし 16x16 ビッ ト乗算器のコード例 (VHDL)

ファ イル名: mult_unsigned.vhd

-- Unsigned 16x16-bit Multiplier-- File: mult_unsigned.vhd--library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity mult_unsigned is generic( WIDTHA : integer := 16; WIDTHB : integer := 16 ); port( A : in std_logic_vector(WIDTHA - 1 downto 0);

Page 83: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 83UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

B : in std_logic_vector(WIDTHB - 1 downto 0); RES : out std_logic_vector(WIDTHA + WIDTHB - 1 downto 0) );end mult_unsigned;

architecture beh of mult_unsigned isbegin RES <= A * B;end beh;

乗加算および乗累算

次のマクロが推論されます。

• 乗加算

• 乗減算

• 乗加減算

• 乗累算

これらのマクロは、 次のものを集約するこ とによ り推論されます。

• 乗算器

• 加減算器

• レジスタ

乗加算と乗累算のインプリ メンテーシ ョ ン

乗加算と乗累算のインプリ メンテーシ ョ ンでは、 次が実行されます。

• 推論された乗加算または乗累算マクロを DSP ブロ ッ ク リ ソースにインプリ メン トできます。

• DSP ブロ ッ クのパイプライン機能が利用されます。

• 次のものが吸収されます。

° 乗算オペランドの 2 レジスタ段。

° 乗算後の 1 レジスタ段。

° 加算器、 減算器、 加減算器の後ろにある 1 レジスタ段。

° 加算/減算の選択信号の 1 レジスタ段。

° 加算器のオプシ ョ ンのキャ リー入力の 1 レジスタ段。

• Vivado 合成では、 インプリ メンテーシ ョ ンに必要な DSP リ ソースが 1 つのみの場合に乗累算 (MAC) を DSP ブロ ッ クにインプリ メン トできます。

• マクロが 1 つの DSP に収まらない場合は、 次のよ うに処理されます。

° 乗算器とアキュムレータ (累算) が別々のマクロ と して処理されます。

° 各マクロが個別に処理されます。

Page 84: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 84UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

DSP ブロック リソースへのマクロのインプリ メンテーシ ョ ン

DSP ブロ ッ ク リ ソースへのマクロのインプリ メンテーシ ョ ンは、 デフォルトで推論されます。

• デフォルト モードでは、 次のよ うに処理されます。

° 乗加算マクロ と乗累算マクロがインプリ メン ト されます。

° ターゲッ ト デバイスで使用可能な DSP ブロ ッ クが考慮されます。

° 使用可能なすべての DSP リ ソースが使用されます。

° DSP ブロ ッ クのパイプライン機能をすべて利用して、 最高の回路パフォーマンスが得られるよ う試みられ

ます。

° レジスタを乗加算マクロまたは乗累算マクロに吸収できるかど うかスキャンされます。

レジスタが DSP ブロ ッ クに吸収されないよ うにするには、 KEEP 属性を使用します。 たとえば、 乗算器のオペラン

ドにあるレジスタが DSP ブロ ッ クに吸収されないよ うにするには、 レジスタの出力に KEEP を設定します。 KEEP 属性の詳細は、 「KEEP」 を参照してください。

コード例のファイルは、 この リ ンクからダウンロードできます。

複素乗算のコード例

次に、 複素乗算の VHDL および Verilog のコード例を示します。 コード例ファイルには、 UltraScale™ アーキテク

チャの 3 つの DSP ブロ ッ クを使用した累算を含む複素乗算の例も含まれています。

複素乗算のコード例 (Verilog)3 つの DSP ブロ ッ クを使用する完全にパイプライン処理された複素乗算の例を示します。

ファ イル名: cmult.v

//// Complex Multiplier (pr+i.pi) = (ar+i.ai)*(br+i.bi)// file: cmult.v

module cmult # (parameter AWIDTH = 16, BWIDTH = 18) ( input clk, input signed [AWIDTH-1:0] ar, ai, input signed [BWIDTH-1:0] br, bi, output signed [AWIDTH+BWIDTH:0] pr, pi );

reg signed [AWIDTH-1:0] ai_d, ai_dd, ai_ddd, ai_dddd ; reg signed [AWIDTH-1:0] ar_d, ar_dd, ar_ddd, ar_dddd ; reg signed [BWIDTH-1:0] bi_d, bi_dd, bi_ddd, br_d, br_dd, br_ddd ; reg signed [AWIDTH:0] addcommon ; reg signed [BWIDTH:0] addr, addi ; reg signed [AWIDTH+BWIDTH:0] mult0, multr, multi, pr_int, pi_int ; reg signed [AWIDTH+BWIDTH:0] common, commonr1, commonr2 ; always @(posedge clk)

Page 85: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 85UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

begin ar_d <= ar; ar_dd <= ar_d; ai_d <= ai; ai_dd <= ai_d; br_d <= br; br_dd <= br_d; br_ddd <= br_dd; bi_d <= bi; bi_dd <= bi_d; bi_ddd <= bi_dd; end // Common factor (ar ai) x bi, shared for the calculations of the real and imaginary final products// always @(posedge clk) begin addcommon <= ar_d - ai_d; mult0 <= addcommon * bi_dd; common <= mult0; end

// Real product//always @(posedge clk) begin ar_ddd <= ar_dd; ar_dddd <= ar_ddd; addr <= br_ddd - bi_ddd; multr <= addr * ar_dddd; commonr1 <= common; pr_int <= multr + commonr1; end

// Imaginary product//always @(posedge clk) begin ai_ddd <= ai_dd; ai_dddd <= ai_ddd; addi <= br_ddd + bi_ddd; multi <= addi * ai_dddd; commonr2 <= common; pi_int <= multi + commonr2; end

assign pr = pr_int;assign pi = pi_int; endmodule // cmult

複素乗算のコード例 (VHDL)3 つの DSP ブロ ッ クを使用する完全にパイプライン処理された複素乗算の例を示します。

ファ イル名: cmult.vhd

Page 86: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 86UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

-- Complex Multiplier (pr+i.pi) = (ar+i.ai)*(br+i.bi)-- ---- cumult.vhd--

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity cmult is generic(AWIDTH : natural := 16; BWIDTH : natural := 16); port(clk : in std_logic; ar, ai : in std_logic_vector(AWIDTH - 1 downto 0); br, bi : in std_logic_vector(BWIDTH - 1 downto 0); pr, pi : out std_logic_vector(AWIDTH + BWIDTH downto 0));end cmult;

architecture rtl of cmult is signal ai_d, ai_dd, ai_ddd, ai_dddd : signed(AWIDTH - 1 downto 0); signal ar_d, ar_dd, ar_ddd, ar_dddd : signed(AWIDTH - 1 downto 0); signal bi_d, bi_dd, bi_ddd, br_d, br_dd, br_ddd : signed(BWIDTH - 1 downto 0); signal addcommon : signed(AWIDTH downto 0); signal addr, addi : signed(BWIDTH downto 0); signal mult0, multr, multi, pr_int, pi_int : signed(AWIDTH + BWIDTH downto 0); signal common, commonr1, commonr2 : signed(AWIDTH + BWIDTH downto 0);

begin process(clk) begin if rising_edge(clk) then ar_d <= signed(ar); ar_dd <= signed(ar_d); ai_d <= signed(ai); ai_dd <= signed(ai_d); br_d <= signed(br); br_dd <= signed(br_d); br_ddd <= signed(br_dd); bi_d <= signed(bi); bi_dd <= signed(bi_d); bi_ddd <= signed(bi_dd); end if; end process;

-- Common factor (ar - ai) x bi, shared for the calculations -- of the real and imaginary final products. -- process(clk) begin if rising_edge(clk) then addcommon <= resize(ar_d, AWIDTH + 1) - resize(ai_d, AWIDTH + 1); mult0 <= addcommon * bi_dd; common <= mult0; end if; end process;

-- Real product --

Page 87: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 87UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

process(clk) begin if rising_edge(clk) then ar_ddd <= ar_dd; ar_dddd <= ar_ddd; addr <= resize(br_ddd, BWIDTH + 1) - resize(bi_ddd, BWIDTH + 1); multr <= addr * ar_dddd; commonr1 <= common; pr_int <= multr + commonr1; end if; end process;

-- Imaginary product -- process(clk) begin if rising_edge(clk) then ai_ddd <= ai_dd; ai_dddd <= ai_ddd; addi <= resize(br_ddd, BWIDTH + 1) + resize(bi_ddd, BWIDTH + 1); multi <= addi * ai_dddd; commonr2 <= common; pi_int <= multi + commonr2; end if; end process;

-- -- VHDL type conversion for output -- pr <= std_logic_vector(pr_int); pi <= std_logic_vector(pi_int);

end rtl;

DSP ブロックの前置加算器

DSP ブロ ッ クをターゲッ ト と して推論コードを記述する際は、 符号付き演算を使用するこ とが推奨されます。 また、

前置加算器が DSP ブロ ッ クに挿入されるよ うに、 前置加算器用に 1 ビッ ト幅を追加する必要があ り ます。

乗算器および後置加算器の前に動的にコンフ ィギュレーシ ョ ンされた前置加算器のコード例 (Verilog)ファ イル名: dynpreaddmultadd.v

// Pre-add/subtract select with Dynamic control// dynpreaddmultadd.vmodule dynpreaddmultadd # (parameter SIZEIN = 16) ( input clk, ce, rst, subadd, input signed [SIZEIN-1:0] a, b, c, d, output signed [2*SIZEIN:0] dynpreaddmultadd_out );

Page 88: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 88UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

// Declare registers for intermediate valuesreg signed [SIZEIN-1:0] a_reg, b_reg, c_reg;reg signed [SIZEIN:0] add_reg;reg signed [2*SIZEIN:0] d_reg, m_reg, p_reg;

always @(posedge clk)begin if (rst) begin a_reg <= 0; b_reg <= 0; c_reg <= 0; d_reg <= 0; add_reg <= 0; m_reg <= 0; p_reg <= 0; end else if (ce) begin a_reg <= a; b_reg <= b; c_reg <= c; d_reg <= d; if (subadd) add_reg <= a_reg - b_reg; else add_reg <= a_reg + b_reg; m_reg <= add_reg * c_reg; p_reg <= m_reg + d_reg; endend

// Output accumulation resultassign dynpreaddmultadd_out = p_reg; endmodule // dynpreaddmultadd

乗算器および後置加算器の前に動的にコンフ ィギュレーシ ョ ンされた前置加算器のコード例 (VHDL)ファ イル名: dynpreaddmultadd.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity dynpreaddmultadd is generic( AWIDTH : natural := 12; BWIDTH : natural := 16; CWIDTH : natural := 17 ); port( clk : in std_logic; subadd : in std_logic; ain : in std_logic_vector(AWIDTH - 1 downto 0);

Page 89: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 89UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

bin : in std_logic_vector(BWIDTH - 1 downto 0); cin : in std_logic_vector(CWIDTH - 1 downto 0); din : in std_logic_vector(BWIDTH + CWIDTH downto 0); pout : out std_logic_vector(BWIDTH + CWIDTH downto 0) );end dynpreaddmultadd;

architecture rtl of dynpreaddmultadd is signal a : signed(AWIDTH - 1 downto 0); signal b : signed(BWIDTH - 1 downto 0); signal c : signed(CWIDTH - 1 downto 0); signal add : signed(BWIDTH downto 0); signal d, mult, p : signed(BWIDTH + CWIDTH downto 0);

begin process(clk) begin if rising_edge(clk) then a <= signed(ain); b <= signed(bin); c <= signed(cin); d <= signed(din); if subadd = '1' then add <= resize(a, BWIDTH + 1) - resize(b, BWIDTH + 1); else add <= resize(a, BWIDTH + 1) + resize(b, BWIDTH + 1); end if; mult <= add * c; p <= mult + d; end if; end process;

-- -- Type conversion for output -- pout <= std_logic_vector(p);

end rtl;

UltraScale DSP ブロックの 2 乗算出機能の使用

UltraScale DSP ブロ ッ ク (DSP48E2) プリ ミティブは、 前置加算器の入力または出力の 2 乗を算出できます。

コード例のファイルは、 この リ ンクからダウンロードできます。

次に、 差分 2 乗の例を示します。 これを使用する と、 差分の絶対値の計算と効率的に置き換えるこ とができます。

1 つの DSP ブロ ッ クに収ま り、 最大速度で動作します。 上記のコード例ファイルには、 UltraScale アーキテクチャの 1 つの DSP ブロ ッ クに配置可能な差分 2 乗のアキュムレータの例も含まれています。

差分 2 乗のコード例 (Verilog)ファ イル名: squarediffmult.v

Page 90: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 90UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

// Squarer support for DSP block (DSP48E2) with // pre-adder configured// as subtractor// File: squarediffmult.v

module squarediffmult # (parameter SIZEIN = 16) ( input clk, ce, rst, input signed [SIZEIN-1:0] a, b, output signed [2*SIZEIN+1:0] square_out );

// Declare registers for intermediate valuesreg signed [SIZEIN-1:0] a_reg, b_reg;reg signed [SIZEIN:0] diff_reg;reg signed [2*SIZEIN+1:0] m_reg, p_reg;

always @(posedge clk)begin if (rst) begin a_reg <= 0; b_reg <= 0; diff_reg <= 0; m_reg <= 0; p_reg <= 0; end else if (ce) begin a_reg <= a; b_reg <= b; diff_reg <= a_reg - b_reg; m_reg <= diff_reg * diff_reg; p_reg <= m_reg; endend

// Output resultassign square_out = p_reg; endmodule // squarediffmult

差分 2 乗のコード例 (VHDL)ファ イル名: squarediffmult.vhd

-- Squarer support for DSP block (DSP48E2) with pre-adder -- configured-- as subtractor-- File: squarediffmult.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity squarediffmult is generic( SIZEIN : natural := 16

Page 91: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 91UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

); port( clk, ce, rst : in std_logic; ain, bin : in std_logic_vector(SIZEIN - 1 downto 0); square_out : out std_logic_vector(2 * SIZEIN + 1 downto 0) );end squarediffmult;

architecture rtl of squarediffmult is

-- Declare intermediate values signal a_reg, b_reg : signed(SIZEIN - 1 downto 0); signal diff_reg : signed(SIZEIN downto 0); signal m_reg, p_reg : signed(2 * SIZEIN + 1 downto 0);

begin process(clk) begin if rising_edge(clk) then if rst = '1' then a_reg <= (others => '0'); b_reg <= (others => '0'); diff_reg <= (others => '0'); m_reg <= (others => '0'); p_reg <= (others => '0'); else a_reg <= signed(ain); b_reg <= signed(bin); diff_reg <= resize(a_reg, SIZEIN + 1) - resize(b_reg, SIZEIN + 1); m_reg <= diff_reg * diff_reg; p_reg <= m_reg; end if; end if; end process;

-- -- Type conversion for output -- square_out <= std_logic_vector(p_reg);

end rtl;

FIR フ ィルター

Vivado 合成は、 RTL から直接 FIR フ ィルターを作成するのにカスケード接続された乗加算器を推論します。

このよ うなフ ィルターにはいくつかのインプリ メンテーシ ョ ン方法があ り ます。 その 1 つは、 『7 シ リーズ FPGA DSP48E1 スライス ユーザー ガイ ド』 (UG479) [参照 2] の図 3-6 「8 タ ップの偶数対称シス ト リ ッ ク FIR」 に示されて

いるシス ト リ ッ ク フ ィルターです。

コード例のファイルは、 この リ ンクからダウンロードできます。

Page 92: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 92UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

8 タ ップ偶数対称シスト リ ック フ ィルターのコード例 (Verilog)ファ イル名: sfir_even_symetric_systolic_top.v

// sfir_even_symmetric_systolic_top.v// FIR Symmetric Systolic Filter, Top module is sfir_even_symmetric_systolic_top

// sfir_shifter - sub module which is used in top level(* dont_touch = "yes" *) module sfir_shifter #(parameter dsize = 16, nbtap = 4) (input clk, [dsize-1:0] datain, output [dsize-1:0] dataout);

(* srl_style = "srl_register" *) reg [dsize-1:0] tmp [0:2*nbtap-1]; integer i;

always @(posedge clk) begin tmp[0] <= datain; for (i=0; i<=2*nbtap-2; i=i+1) tmp[i+1] <= tmp[i]; end

assign dataout = tmp[2*nbtap-1]; endmodule

// sfir_even_symmetric_systolic_element - sub module which is used in topmodule sfir_even_symmetric_systolic_element #(parameter dsize = 16) (input clk, input signed [dsize-1:0] coeffin, datain, datazin, input signed [2*dsize-1:0] cascin, output signed [dsize-1:0] cascdata, output reg signed [2*dsize-1:0] cascout);

reg signed [dsize-1:0] coeff; reg signed [dsize-1:0] data; reg signed [dsize-1:0] dataz; reg signed [dsize-1:0] datatwo; reg signed [dsize:0] preadd; reg signed [2*dsize-1:0] product;

assign cascdata = datatwo; always @(posedge clk) begin coeff <= coeffin; data <= datain; datatwo <= data; dataz <= datazin; preadd <= datatwo + dataz; product <= preadd * coeff; cascout <= product + cascin; end endmodule

module sfir_even_symmetric_systolic_top #(parameter nbtap = 4, dsize = 16, psize = 2*dsize)

Page 93: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 93UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

(input clk, input signed [dsize-1:0] datain, output signed [2*dsize-1:0] firout);

wire signed [dsize-1:0] h [nbtap-1:0]; wire signed [dsize-1:0] arraydata [nbtap-1:0]; wire signed [psize-1:0] arrayprod [nbtap-1:0];

wire signed [dsize-1:0] shifterout; reg signed [dsize-1:0] dataz [nbtap-1:0]; assign h[0] = 7; assign h[1] = 14; assign h[2] = -138; assign h[3] = 129; assign firout = arrayprod[nbtap-1]; // Connect last product to output sfir_shifter #(dsize, nbtap) shifter_inst0 (clk, datain, shifterout); generate genvar I; for (I=0; I<nbtap; I=I+1) if (I==0) sfir_even_symmetric_systolic_element #(dsize) fte_inst0 (clk, h[I], datain, shifterout, {32{1'b0}}, arraydata[I], arrayprod[I]); else sfir_even_symmetric_systolic_element #(dsize) fte_inst (clk, h[I], arraydata[I-1], shifterout, arrayprod[I-1], arraydata[I], arrayprod[I]); endgenerate endmodule // sfir_even_symmetric_systolic_top

8 タ ップ偶数対称シスト リ ック フ ィルターのコード例 (VHDL)ファ イル名: sfir_even_symetric_systolic_top.vhd

---- FIR filter top-- File: sfir_even_symmetric_systolic_top.vhd

-- FIR filter shifter-- submodule used in top (sfir_even_symmetric_systolic_top)library ieee;use ieee.std_logic_1164.all;

entity sfir_shifter is generic( DSIZE : natural := 16; NBTAP : natural := 4 ); port( clk : in std_logic; datain : in std_logic_vector(DSIZE - 1 downto 0); dataout : out std_logic_vector(DSIZE - 1 downto 0) );end sfir_shifter;

Page 94: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 94UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

architecture rtl of sfir_shifter is

-- Declare signals -- type CHAIN is array (0 to 2 * NBTAP - 1) of std_logic_vector(DSIZE - 1 downto 0); signal tmp : CHAIN;

begin process(clk) begin if rising_edge(clk) then tmp(0) <= datain; looptmp : for i in 0 to 2 * NBTAP - 2 loop tmp(i + 1) <= tmp(i); end loop; end if; end process;

dataout <= tmp(2 * NBTAP - 1);

end rtl;

---- FIR filter engine (multiply with pre-add and post-add)-- submodule used in top (sfir_even_symmetric_systolic_top)library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity sfir_even_symmetric_systolic_element is generic(DSIZE : natural := 16); port(clk : in std_logic; coeffin, datain, datazin : in std_logic_vector(DSIZE - 1 downto 0); cascin : in std_logic_vector(2 * DSIZE downto 0); cascdata : out std_logic_vector(DSIZE - 1 downto 0); cascout : out std_logic_vector(2 * DSIZE downto 0));end sfir_even_symmetric_systolic_element;

architecture rtl of sfir_even_symmetric_systolic_element is

-- Declare signals -- signal coeff, data, dataz, datatwo : signed(DSIZE - 1 downto 0); signal preadd : signed(DSIZE downto 0); signal product, cascouttmp : signed(2 * DSIZE downto 0);

begin process(clk) begin if rising_edge(clk) then coeff <= signed(coeffin); data <= signed(datain); datatwo <= data; dataz <= signed(datazin); preadd <= resize(datatwo, DSIZE + 1) + resize(dataz, DSIZE + 1); product <= preadd * coeff; cascouttmp <= product + signed(cascin); end if;

Page 95: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 95UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

end process;

-- Type conversion for output -- cascout <= std_logic_vector(cascouttmp); cascdata <= std_logic_vector(datatwo);

end rtl;

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity sfir_even_symmetric_systolic_top is generic(NBTAP : natural := 4; DSIZE : natural := 16; PSIZE : natural := 33); port(clk : in std_logic; datain : in std_logic_vector(DSIZE - 1 downto 0); firout : out std_logic_vector(PSIZE - 1 downto 0));end sfir_even_symmetric_systolic_top;

architecture rtl of sfir_even_symmetric_systolic_top is

-- Declare signals -- type DTAB is array (0 to NBTAP - 1) of std_logic_vector(DSIZE - 1 downto 0); type HTAB is array (0 to NBTAP - 1) of std_logic_vector(0 to DSIZE - 1); type PTAB is array (0 to NBTAP - 1) of std_logic_vector(PSIZE - 1 downto 0);

signal arraydata, dataz : DTAB; signal arrayprod : PTAB; signal shifterout : std_logic_vector(DSIZE - 1 downto 0);

-- Initialize coefficients and a "zero" for the first filter element -- constant h : HTAB := ((std_logic_vector(TO_SIGNED(63, DSIZE))), (std_logic_vector(TO_SIGNED(18, DSIZE))), (std_logic_vector(TO_SIGNED(-100, DSIZE))), (std_logic_vector(TO_SIGNED(1, DSIZE)))); constant zero_psize : std_logic_vector(PSIZE - 1 downto 0) := (others => '0');

begin

-- Connect last product to output -- firout <= arrayprod(nbtap - 1);

-- Shifter -- shift_u0 : entity work.sfir_shifter generic map(DSIZE, NBTAP) port map(clk, datain, shifterout);

-- Connect the arithmetic building blocks of the FIR -- gen : for I in 0 to NBTAP - 1 generate begin g0 : if I = 0 generate

Page 96: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 96UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

element_u0 : entity work.sfir_even_symmetric_systolic_element generic map(DSIZE) port map(clk, h(I), datain, shifterout, zero_psize, arraydata(I), arrayprod(I)); end generate g0; gi : if I /= 0 generate element_ui : entity work.sfir_even_symmetric_systolic_element generic map(DSIZE) port map(clk, h(I), arraydata(I - 1), shifterout, arrayprod(I - 1), arraydata(I), arrayprod(I)); end generate gi; end generate gen;

end rtl;

Page 97: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 97UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

収束丸め (LSB 訂正手法)DSP ブロ ッ ク プリ ミティブは、 パターン検出回路を利用して、 偶数または奇数への収束丸めを算出します。

次に、 収束丸め推論の例を示します。 この例は、 ブロ ッ クのフル パフォーマンスで推論し、 LSB 訂正をインプリ メ

ン トするため 2 入力 AND ゲート (1 LUT) も推論します。

偶数への丸めのコード例 (Verilog)ファ イル名: convergentRoundingEven.v

// Convergent rounding(Even) Example which makes use of pattern detect // File: convergentRoundingEven.vmodule convergentRoundingEven ( input clk, input [23:0] a, input [15:0] b, output reg signed [23:0] zlast );

reg signed [23:0] areg;reg signed [15:0] breg;reg signed [39:0] z1;

reg pattern_detect; wire [15:0] pattern = 16'b0000000000000000;wire [39:0] c = 40'b0000000000000000000000000111111111111111; // 15 ones

wire signed [39:0] multadd;wire signed [15:0] zero;reg signed [39:0] multadd_reg;

// Convergent Rounding: LSB Correction Technique// --------------------------------------------- // For static convergent rounding, the pattern detector can be used// to detect the midpoint case. For example, in an 8-bit round, if// the decimal place is set at 4, the C input should be set to// 0000.0111. Round to even rounding should use CARRYIN = "1" and// check for PATTERN "XXXX.0000" and replace the units place with 0// if the pattern is matched. See UG193 for more details.

assign multadd = z1 + c + 1'b1;

always @(posedge clk)begin areg <= a; breg <= b; z1 <= areg * breg; pattern_detect <= multadd[15:0] == pattern ? 1'b1 : 1'b0; multadd_reg <= multadd; end

// Unit bit replaced with 0 if pattern is detectedalways @(posedge clk) zlast <= pattern_detect ? {multadd_reg[39:17],1'b0} : multadd_reg[39:16];

Page 98: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 98UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

endmodule // convergentRoundingEven

偶数への丸めのコード例 (VHDL)ファ イル名: convergentRoundingEven.vhd

-- Convergent rounding(Even) Example which makes use of pattern detect -- File: convergentRoundingEven.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity convergentRoundingEven is port (clk : in std_logic; a : in std_logic_vector (23 downto 0); b : in std_logic_vector (15 downto 0); zlast : out std_logic_vector (23 downto 0));end convergentRoundingEven;

architecture beh of convergentRoundingEven is

signal ar : signed(a'range); signal br : signed(b'range); signal z1 : signed(a'length + b'length - 1 downto 0);

signal multaddr : signed(a'length + b'length - 1 downto 0); signal multadd : signed(a'length + b'length - 1 downto 0); signal pattern_detect : boolean;

constant pattern : signed(15 downto 0) := (others => '0'); constant c : signed := "0000000000000000000000000111111111111111";

-- Convergent Rounding: LSB Correction Technique -- --------------------------------------------- -- For static convergent rounding, the pattern detector can be used -- to detect the midpoint case. For example, in an 8-bit round, if -- the decimal place is set at 4, the C input should be set to -- 0000.0111. Round to even rounding should use CARRYIN = "1" and -- check for PATTERN "XXXX.0000" and replace the units place with 0 -- if the pattern is matched. See UG193 for more details.

begin

multadd <= z1 + c + 1;

process(clk) begin if rising_edge(clk) then ar <= signed(a); br <= signed(b); z1 <= ar * br; multaddr <= multadd; if multadd(15 downto 0) = pattern then pattern_detect <= true; else pattern_detect <= false;

Page 99: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 99UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

end if; end if; end process;

-- Unit bit replaced with 0 if pattern is detected process(clk) begin if rising_edge(clk) then if pattern_detect = true then zlast <= std_logic_vector(multaddr(39 downto 17)) & "0"; else zlast <= std_logic_vector(multaddr(39 downto 16)); end if; end if; end process;

end beh;

奇数への丸めのコード例 (Verilog)ファ イル名: convergentRoundingOdd.v

// Convergent rounding(Odd) Example which makes use of pattern detect // File: convergentRoundingOdd.vmodule convergentRoundingOdd ( input clk, input [23:0] a, input [15:0] b, output reg signed [23:0] zlast );

reg signed [23:0] areg;reg signed [15:0] breg;reg signed [39:0] z1;

reg pattern_detect; wire [15:0] pattern = 16'b1111111111111111;wire [39:0] c = 40'b0000000000000000000000000111111111111111; // 15 ones

wire signed [39:0] multadd;wire signed [15:0] zero;reg signed [39:0] multadd_reg;

// Convergent Rounding: LSB Correction Technique// ---------------------------------------------// For static convergent rounding, the pattern detector can be// used to detect the midpoint case. For example, in an 8-bit// round, if the decimal place is set at 4, the C input should// be set to 0000.0111. Round to odd rounding should use// CARRYIN = "0" and check for PATTERN "XXXX.1111" and then// replace the units place bit with 1 if the pattern is// matched. See UG193 for details

assign multadd = z1 + c;

always @(posedge clk)begin

Page 100: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 100UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

areg <= a; breg <= b; z1 <= areg * breg; pattern_detect <= multadd[15:0] == pattern ? 1'b1 : 1'b0; multadd_reg <= multadd; end

always @(posedge clk) zlast <= pattern_detect ? {multadd_reg[39:17],1'b1} : multadd_reg[39:16]; endmodule // convergentRoundingOdd

奇数への丸めのコード例 (VHDL)ファ イル名: convergentRoundingOdd.vhd

-- Convergent rounding(Odd) Example which makes use of pattern detect -- File: convergentRoundingOdd.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity convergentRoundingOdd is port (clk : in std_logic; a : in std_logic_vector (23 downto 0); b : in std_logic_vector (15 downto 0); zlast : out std_logic_vector (23 downto 0));end convergentRoundingOdd;

architecture beh of convergentRoundingOdd is

signal ar : signed(a'range); signal br : signed(b'range); signal z1 : signed(a'length + b'length - 1 downto 0);

signal multadd, multaddr : signed(a'length + b'length - 1 downto 0); signal pattern_detect : boolean;

constant pattern : signed(15 downto 0) := (others => '1'); constant c : signed := "0000000000000000000000000111111111111111";

-- Convergent Rounding: LSB Correction Technique -- --------------------------------------------- -- For static convergent rounding, the pattern detector can be -- used to detect the midpoint case. For example, in an 8-bit -- round, if the decimal place is set at 4, the C input should -- be set to 0000.0111. Round to odd rounding should use -- CARRYIN = "0" and check for PATTERN "XXXX.1111" and then -- replace the units place bit with 1 if the pattern is -- matched. See UG193 for details

begin

multadd <= z1 + c;

process(clk) begin

Page 101: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 101UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

if rising_edge(clk) then ar <= signed(a); br <= signed(b); z1 <= ar * br; multaddr <= multadd; if multadd(15 downto 0) = pattern then pattern_detect <= true; else pattern_detect <= false; end if; end if; end process;

process(clk) begin if rising_edge(clk) then if pattern_detect = true then zlast <= std_logic_vector(multaddr(39 downto 17)) & "1"; else zlast <= std_logic_vector(multaddr(39 downto 16)); end if; end if; end process;

end beh;

RAM の HDL コーディング手法

Vivado 合成では、 さまざまな RAM のコーディング スタイルを解釈し、 分散 RAM またはブラ ッ ク RAM にマップで

きます。 これによ り、 次が可能になり ます。

• 手動で RAM プリ ミティブをインスタンシエートする必要なし

• 時間を短縮

• HDL ソース コードを移行および拡張しやすい

コード例のファイルは、 この リ ンクからダウンロードできます。

分散 RAM と専用ブロック RAM 間の選択

データは、 両方のタイプの RAM に同期に書き込まれます。 分散 RAM とブロ ッ ク RAM の主な違いは、 RAM からの

データの読み出し方法にあ り ます。 次の表を参照してください。

分散 RAM または専用ブロッ ク RAM のどちらを使用するかは、 HDL ソース コードで記述した RAM の特性、 使用可

能なブロ ッ ク RAM リ ソース、および RAM_STYLE 属性を使用して特定のインプリ メンテーシ ョ ン スタイルを指定し

たかど うかによ り ます。

表 4-1: 分散 RAM と専用ブロック RAM の違い

操作 分散 RAM 専用ブロック RAM

書き込み 同期 同期

読み出し 非同期 同期

Page 102: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 102UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

メモリの推論

メモ リの推論機能には、 次のものが含まれます。

• 任意のサイズおよびデータ幅をサポート。 メモ リ記述は 1 つまたは複数の RAM プリ ミティブにマップされま

す。

• シングル ポート、 シンプル デュアル ポート、 完全なデュアル ポート

• 最大 2 つの書き込みポート

• 複数の読み出しポート

記述されている書き込みポートが 1 つのみの場合、 Vivado 合成では書き込みアドレス とは異なるアドレスの RAM の内容にアクセスする読み出しポートが複数ある RAM 記述を認識できます。

• ライ ト イネーブル

• RAM イネーブル (ブロ ッ ク RAM)

• データ出力リセッ ト (ブロ ッ ク RAM)

• オプシ ョ ンの出力レジスタ (ブロ ッ ク RAM)

• バイ ト ライ ト イネーブル (ブロ ッ ク RAM)

• 各 RAM ポートは、 そのクロ ッ ク、 ポート イネーブル、 書き込みイネーブル、 データ出力リセッ トで制御でき

ます。

• 初期内容の指定

• Vivado 合成では、 記述されているデータ幅に対応するため、 パリティ ビッ ト を通常のデータ ビッ ト と して使用

できます。

注記: パリティ ビッ トの詳細は、 ターゲッ ト デバイスのユーザー ガイ ドを参照してください。

Page 103: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 103UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

UltraRAM のコード テンプレート

『UltraScale アーキテクチャ メモ リ リ ソース ユーザー ガイ ド』 (UG573) [参照 3] の第 2 章 「UltraRAM リ ソース」 に、

UltraRAM について次のよ うに説明されています。

UltraRAM は、 UltraScale+™ デバイスで利用可能な 2 ポート、 シングルク ロ ッ クの同期メモ リです。 UltraRAM はカラム状アーキテクチャ と互換性があるため、 複数の UltraRAM をインスタンシエート し、 1 つの UltraRAM カラム内でデバイスの高さまで直接カスケード接続できます。 1 つのクロ ッ ク領域内の 1 カラムに 16 個の UltraRAM ブロ ッ クが含まれます。 UltraRAM を搭載したデバイスでは、 複数の UltraRAM カラムが分散して配

置されています。 UltraScale+ ファ ミ リのほとんどのデバイスが UltraRAM ブロ ッ クを搭載しています。 利用可能

な UltraRAM のデバイス別の容量は、『UltraScale アーキテクチャおよび製品概要』 (DS890) [参照 1] を参照してく

ださい。

コード例に次のファイルが含まれています。

• xilinx_ultraram_single_port_no_change.v

• xilinx_ultraram_single_port_no_change.vhd

• xilinx_ultraram_single_port_read_first.v

• xilinx_ultraram_single_port_read_first.vhd

• xilinx_ultraram_single_port_write_first.v

• xilinx_ultraram_single_port_write_first.vhd

Vivado ツールには、 UltraRAM の VHDL および Verilog コードのテンプレートが含まれています。 次の図に、 テンプ

レート ファ イルを示します。

Page 104: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 104UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

詳細は、 『UltraScale アーキテクチャ メモ リ リ ソース ユーザー ガイ ド』 (UG573) [参照 3] を参照してください。

Vivado 合成での UltraRAM の推論

UltraRAM プリ ミテ ィブの概要

UltraRAM は、 ザイ リ ンクス UltraScale+ デバイスで使用可能な新しい専用メモ リ プリ ミ ティブです。 大型のメモ リ

であ り、 カスケード接続してさ らに大型の RAM ブロ ッ クを作成できます。 詳細は、 『UltraScale アーキテクチャ メモ リ リ ソース ユーザー ガイ ド』 (UG573) [参照 3] を参照してください。

UltraRAM プリ ミテ ィブの説明

UltraRAM プリ ミティブは、 1 つのクロ ッ クを持つデュアル ポートのメモ リです。 1 つのプリ ミティブを 4Kx72 と し

て設定できます。 UltraRAM には 2 つのポートがあ り、 どちらのポートでも RAM の 4K すべてにアクセスできます。

これによ り、 シングル ポート、 シンプル デュアル ポート、 および完全なデュアル ポートの動作が可能です。 各

X-Ref Target - Figure 4-2

図 4-2: UltraRAM のコード テンプレート

Page 105: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 105UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

ポートには、 複数のパイプライン レジスタがあ り ます。 UltraRAM では、 1 つのクロ ッ ク、 グローバル イネーブル、

出力レジスタ リ セッ ト 、 ラ イ ト イネーブル、 およびバイ ト ライ ト イネーブルの制御信号がサポート されます。

UltraRAM とブロック RAM の違い

UltraRAM とブロ ッ ク RAM には、 次のよ うな違いがあ り ます。

° UltraRAM にはクロ ッ クは 1 つしかなく、 完全なデュアル ポート動作はサポート されていますが、 両方の

ポートは同期しています。

° UltraRAM のアスペク ト比はブロ ッ ク RAM のよ うに設定できず、 常に 4Kx72 に設定されます。

° 出力レジスタは、 0 にのみリセッ ト可能です。

° UltraRAM プリ ミティブには書き込みモード (read_first、 write_first、 no_change) はあ り ません。

通常の UltraRAM は no_change モードのよ うに動作します。 RTL で read_first または write_first を記述する と、 Vivado 合成で正しいロジッ クが作成されます。

° UltraRAM に INIT 属性はなく、 電源投入する と 0 になり ます。

UltraRAM の使用方法

UltraRAM プリ ミティブを使用するには、 次の 3 つの方法があ り ます。

° 直接インスタンシエーシ ョ ン: ユーザーが詳細に制御できますが、 最も困難です。

° XPM フロー : RAM のタイプおよび動作を指定できますが、 RTL にアクセスするこ とはできません。

° 推論: 上記 2 つの方法の中間で、 比較的簡単であ り、 RAM の作成方法をユーザーがある程度制御できます。

UltraRAM を制御する属性

Vivado 合成で UltraRAM を制御するには、 RAM_STYLE および CASCADE_HEIGHT の 2 つの属性が必要です。

RAM_STYLE

RAM_STYLE 属性には、 新しい値 ultra が追加されています。 デフォルトでは、 Vivado 合成によ り推論する RAM のタイプ (URAM、 BRAM、 または LUTRAM) が決定されます。 RAM を UltraRAM に強制的にインプリ メン トするに

は、 RAM_STYLE 属性を使用して UltraRAM プリ ミティブが推論されるよ うに指定できます。

詳細は、 第 2 章の 「RAM_STYLE」 を参照してください。

RAM_STYLE の Verilog 例

(* ram_style = "ultra" *) reg [data_size-1:0] myram [2**addr_size-1:0];

RAM_STYLE の VHDL 例

attribute ram_style : string;attribute ram_style of myram : signal is "ultra";

Page 106: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 106UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

CASCADE_HEIGHT

複数の UltraRAM (URAM) をカスケード接続してよ り大型の RAM を作成する と、 配置配線が柔軟に実行できるよ う

にするため、 Vivado 合成でチェーンの高さが 8 に制限されます。 この制限を変更するには、 CASCADE_HEIGHT 属性

を使用します。

注記: この属性は、 UltraScale のブロッ ク RAM および UltraRAM のみに適用されます。

CASCADE_HEIGHT の例 (Verilog)

(* cascade_height = 16 *) reg [data_size-1:0] myram [2**addr_size-1:0];

CASCADE_HEIGHT の例 (VHDL)

attribute cascade_height : integer;attribute cascade_height of my_ram signal is 16;

特定の RAM にのみ適用される属性に加え、 デザイン内のすべての RAM に適用されるグローバル設定があ り ます。

[Project Settings] ダイアログ ボッ クスの [Synthesis] ページにある -max_uram_cascade_height です。 デフォルト

値は -1 で、 Vivado 合成によ り最適な処理が実行されます。 ほかの値に設定するこ と もできます。 このグローバル設

定と CASCADE_HEIGHT 属性が異なる場合は、 その特定の RAM には属性の値が使用されます。

推論機能

Vivado 合成では、 UltraRAM プリ ミティブを使用したさまざまなタイプのメモ リ を推論できます。

「コード記述のガイ ド ライン」 の例を参照してください。

• シングル ポート メモ リでは、 1 つのポートで読み出し と書き込みの両方が実行されます。 ブロ ッ ク RAM の 3 つの書き込みモードすべてがサポート されますが、 UltraRAM 自体は NO_CHANGE モードのメモ リのよ うに動作

します。 RTL に WRITE_FIRST または READ_FIRST モードの動作が記述されている場合、 作成される UltraRAM はシンプル デュアル ポート モードに設定されます。

• シンプル デュアル ポート メモ リでは、 1 つのポートで読み出しを実行し、 も う 1 つのポートで書き込みを実行

します。 Vivado 合成では、 これらのメモ リ を UltraRAM に推論できます。

ヒン ト : ただし、 両方のポートが同じクロ ッ クである必要があ り ます。

• 完全なデュアル ポート モードでは、 両方のポートでメモ リに対して読み出しおよび書き込みを実行できます。

このモードでは、 NO_CHANGE モードのみがサポート されます。

注意: 完全なデュアル ポート RAM をシ ミ ュレーシ ョ ンする際は、 注意が必要です。 以前のバージ ョ ンのブロ ッ ク RAM では、 アドレス競合はシ ミ ュレーシ ョ ン モデルで処理されますが、 UltraRAM では異なり ます。 UltraRAM では、 ポート A への操作が常にポート B への操作の前に実行されます。 あるアドレスに対してポート A が書き込み、

ポート B が読み出しを実行する場合、 書き込みが実行されてから読み出しが実行されます。 ポート A が読み出し、

ポート B が書き込みを実行する場合、 読み出しが実行されてから書き込みが実行されます。

注意: 完全なデュアル ポート メモ リでは、 同じアドレスに対して読み出し と書き込みを同じクロ ッ ク サイクルで実

行しないでください。 RTL と合成後のシ ミ ュレーシ ョ ンの動作が異なるものになる可能性があ り ます。

Page 107: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 107UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

シンプル デュアル ポートおよび完全なデュアル ポート メモ リのどちら も、 両方のポートのクロ ッ クは同じである

必要があ り ます。

異なるスタイルの RAM に加え、 推論可能な UltraRAM の機能がほかにもいくつかあ り ます。 RAM には、 ライ ト イネーブルよ り も優先されるグローバル イネーブル信号があ り ます。 標準のライ ト イネーブルおよびバイ ト ライ ト イネーブルがサポート されています。データ出力には以前のブロッ ク RAM と同様のリセッ トがあ り ますが、 SRVAL は設定できず、 0 へのリセッ トのみがサポート されます。

RAM のパイプライン処理

UltraRAM (URAM) では、 RAM へのパイプライン レジスタがサポート されます。 これは、 複数の UltraRAM を使用

して非常に大型の RAM を作成する際に特に便利です。 RAM を完全にパイプライン処理するには、 RTL で RAM の出力にレジスタを追加する必要があ り ます。 使用するパイプライン レジスタの数を計算するには、 RAM マ ト リ ッ ク

スの行数と列数を加算します。

注記: ツールではパイプライン レジスタは自動的に作成されません。 Vivado 合成でパイプライン レジスタが使用さ

れるよ うにするには、 RTL コードに記述する必要があ り ます。

合成ログ ファ イルには URAM に関するセクシ ョ ンがあ り、 RAM マ ト リ ッ クスを作成するのに使用された行数と列

数が示されます。 このセクシ ョ ンを使用して、 RTL にパイプライン レジスタを追加できます。

マ ト リ ッ クスの行数および列数を自分で計算する場合は、 UltraRAM が常に 4Kx72 と して設定されるこ とに注目して

ください。

行数を計算するには、 RTL の RAM のアドレス空間を 4K で除算します。 この結果が CASCADE_HEIGHT で指定され

ている値よ り大きい場合は、 余分な RAM を削除し、 ログの新しい列で開始します。

パイプライン作成の例 1: 8K x 72

この例では、 8K を 4K で割った値は 2 なので、 行数は 2 です。 CASCADE_HEIGHT が 2 以上に設定されている場合

は、 マ ト リ ッ クスは 2x1 です。 RAM (2 + 1) の出力に 3 段のパイプラインを追加する必要があ り ます。

パイプライン作成の例 2: 8K x 80

この例では、 8K を 4K で割った値は 2 なので、 行数は 2 です。 この計算ではデータ空間は関係ないので、 この例で

もマ ト リ ッ クスは 2x1 で、 パイプライン段数は 3 です。

注記: RAM を作成するためにはデータ空間の追加の 8 ビッ トが必要ですが、 パイプライン レジスタの計算では考慮

する必要はあ り ません。

パイプライン作成の例 3: 16K x 70、 CASCADE_HEIGHT = 3

この例では、 16K を 4K で割った値は 4 ですが、CASCADE_HEIGHT が 3 に設定されているので、マ ト リ ッ クスは 3x2 です。 パイプライン レジスタの段数は 5 になり ます。

Page 108: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 108UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

RAM の HDL コード記述のガイド ライン

コード例のファイルは、 この リ ンクからダウンロードできます。

ブロック RAM の読み出し /書き込みの同期モード

ブロ ッ ク RAM リ ソースは、 読み出し /書き込みポートで次の同期モードを提供するよ う設定できます。

• Read-First (先に読み出し ): 新新しい内容が読み込まれる前に、 既存の内容が読み出されます。

• Write-First (先に書き込み): 新しい内容がすぐに読み出せるよ うにな り ます。 Read-Through と も呼ばれます。

• No-Change (変化なし ): 新しい内容が RAM に読み込まれる間、 データ出力は変化しません。

Vivado 合成では、 これらすべての同期モードの推論がサポート されます。 RAM のポート ごとに、 異なる同期モード

を記述できます。

分散 RAM の例

次に、 分散 RAM の VHDL および Verilog コード例を示します。

非同期読み出し付きデュアル ポート RAM のコード例 (Verilog)

ファ イル名: rams_dist.v

// Dual-Port RAM with Asynchronous Read (Distributed RAM)// File: rams_dist.v

module rams_dist (clk, we, a, dpra, di, spo, dpo);

input clk;input we;input [5:0] a;input [5:0] dpra;input [15:0] di;output [15:0] spo;output [15:0] dpo;reg [15:0] ram [63:0];

always @(posedge clk) begin if (we) ram[a] <= di;end

assign spo = ram[a];assign dpo = ram[dpra];

endmodule

Page 109: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 109UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

非同期読み出し付きシングル ポート RAM のコード例 (VHDL)

ファ イル名: rams_dist.vhd

-- Single-Port RAM with Asynchronous Read (Distributed RAM)-- File: rams_dist.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity rams_dist is port( clk : in std_logic; we : in std_logic; a : in std_logic_vector(5 downto 0); di : in std_logic_vector(15 downto 0); do : out std_logic_vector(15 downto 0) );end rams_dist;

architecture syn of rams_dist is type ram_type is array (63 downto 0) of std_logic_vector(15 downto 0); signal RAM : ram_type;begin process(clk) begin if (clk'event and clk = '1') then if (we = '1') then RAM(to_integer(unsigned(a))) <= di; end if; end if; end process;

do <= RAM(to_integer(unsigned(a)));

end syn;

シングル ポート ブロック RAM の例

リセッ ト可能なデータ出力付きシングル ポート ブロック RAM のコード例 (Verilog)

ファ イル名: rams_sp_rf_rst.v

// Block RAM with Resettable Data Output// File: rams_sp_rf_rst.v

module rams_sp_rf_rst (clk, en, we, rst, addr, di, dout);input clk; input en; input we; input rst;input [9:0] addr; input [15:0] di; output [15:0] dout;

Page 110: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 110UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

reg [15:0] ram [1023:0];reg [15:0] dout;

always @(posedge clk)begin if (en) //optional enable begin if (we) //write enable ram[addr] <= di; if (rst) //optional reset dout <= 0; else dout <= ram[addr]; endend

endmodule

リセッ ト可能なデータ出力付きシングル ポート ブロック RAM のコード例 (VHDL)

ファ イル名: rams_sp_rf_rst.vhd

-- Block RAM with Resettable Data Output-- File: rams_sp_rf_rst.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity rams_sp_rf_rst is port( clk : in std_logic; en : in std_logic; we : in std_logic; rst : in std_logic; addr : in std_logic_vector(9 downto 0); di : in std_logic_vector(15 downto 0); do : out std_logic_vector(15 downto 0) );end rams_sp_rf_rst;

architecture syn of rams_sp_rf_rst is type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0); signal ram : ram_type;begin process(clk) begin if clk'event and clk = '1' then if en = '1' then -- optional enable if we = '1' then -- write enable ram(to_integer(unsigned(addr))) <= di; end if; if rst = '1' then -- optional reset do <= (others => '0'); else do <= ram(to_integer(unsigned(addr))); end if; end if;

Page 111: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 111UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

end if; end process;

end syn;

Write-First モードのシングル ポート ブロック RAM のコード例 (Verilog)

ファ イル名: rams_sp_wf.v

// Single-Port Block RAM Write-First Mode (recommended template)// File: rams_sp_wf.vmodule rams_sp_wf (clk, we, en, addr, di, dout);input clk; input we; input en;input [9:0] addr; input [15:0] di; output [15:0] dout;reg [15:0] RAM [1023:0];reg [15:0] dout;

always @(posedge clk)begin if (en) begin if (we) begin RAM[addr] <= di; dout <= di; end else dout <= RAM[addr]; endendendmodule

Write-First モードのシングル ポート ブロック RAM のコード例 (VHDL)

ファ イル名: rams_sp_wf.vhd

-- Single-Port Block RAM Write-First Mode (recommended template)---- File: rams_sp_wf.vhd--library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity rams_sp_wf is port( clk : in std_logic; we : in std_logic; en : in std_logic; addr : in std_logic_vector(9 downto 0); di : in std_logic_vector(15 downto 0); do : out std_logic_vector(15 downto 0)

Page 112: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 112UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

);end rams_sp_wf;

architecture syn of rams_sp_wf is type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0); signal RAM : ram_type;begin process(clk) begin if clk'event and clk = '1' then if en = '1' then if we = '1' then RAM(to_integer(unsigned(addr))) <= di; do <= di; else do <= RAM(to_integer(unsigned(addr))); end if; end if; end if; end process;

end syn;

Read-First モードのシングル ポート ブロック RAM のコード例 (VHDL)

ファ イル名: rams_sp_rf.vhd

-- Single-Port Block RAM Read-First Mode-- rams_sp_rf.vhd--library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity rams_sp_rf is port( clk : in std_logic; we : in std_logic; en : in std_logic; addr : in std_logic_vector(9 downto 0); di : in std_logic_vector(15 downto 0); do : out std_logic_vector(15 downto 0) );end rams_sp_rf;

architecture syn of rams_sp_rf is type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0); signal RAM : ram_type;begin process(clk) begin if clk'event and clk = '1' then if en = '1' then if we = '1' then RAM(to_integer(unsigned(addr))) <= di; end if;

Page 113: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 113UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

do <= RAM(to_integer(unsigned(addr))); end if; end if; end process;

end syn;

No-Change モードのシングル ポート ブロック RAM のコード例 (Verilog)

ファ イル名: rams_sp_nc.v

// Single-Port Block RAM No-Change Mode// File: rams_sp_nc.v

module rams_sp_nc (clk, we, en, addr, di, dout);

input clk; input we; input en;input [9:0] addr; input [15:0] di; output [15:0] dout;

reg [15:0] RAM [1023:0];reg [15:0] dout;

always @(posedge clk)begin if (en) begin if (we) RAM[addr] <= di; else dout <= RAM[addr]; endendendmodule

No-Change モードのシングル ポート ブロ ッ ク RAM のコード例 (VHDL)

ファ イル名: rams_sp_nc.vhd

-- Single-Port Block RAM No-Change Mode-- File: rams_sp_nc.vhd--

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity rams_sp_nc is port( clk : in std_logic; we : in std_logic; en : in std_logic;

Page 114: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 114UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

addr : in std_logic_vector(9 downto 0); di : in std_logic_vector(15 downto 0); do : out std_logic_vector(15 downto 0) );end rams_sp_nc;

architecture syn of rams_sp_nc is type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0); signal RAM : ram_type;begin process(clk) begin if clk'event and clk = '1' then if en = '1' then if we = '1' then RAM(to_integer(unsigned(addr))) <= di; else do <= RAM(to_integer(unsigned(addr))); end if; end if; end if; end process;

end syn;

シンプル デュアル ポート ブロック RAM の例

1 つのクロックを使用するシンプル デュアル ポート ブロック RAM のコード例 (Verilog)

ファ イル名: simple_dual_one_clock.v

// Simple Dual-Port Block RAM with One Clock// File: simple_dual_one_clock.v

module simple_dual_one_clock (clk,ena,enb,wea,addra,addrb,dia,dob);

input clk,ena,enb,wea;input [9:0] addra,addrb;input [15:0] dia;output [15:0] dob;reg [15:0] ram [1023:0];reg [15:0] doa,dob;

always @(posedge clk) begin if (ena) begin if (wea) ram[addra] <= dia; endend

always @(posedge clk) begin if (enb) dob <= ram[addrb];end

Page 115: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 115UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

endmodule

1 つのクロックを使用するシンプル デュアル ポート ブロック RAM のコード例 (VHDL)

ファ イル名: simple_dual_one_clock.vhd

-- Simple Dual-Port Block RAM with One Clock-- Correct Modelization with a Shared Variable-- File:simple_dual_one_clock.vhd

library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;

entity simple_dual_one_clock is port( clk : in std_logic; ena : in std_logic; enb : in std_logic; wea : in std_logic; addra : in std_logic_vector(9 downto 0); addrb : in std_logic_vector(9 downto 0); dia : in std_logic_vector(15 downto 0); dob : out std_logic_vector(15 downto 0) );end simple_dual_one_clock;

architecture syn of simple_dual_one_clock is type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0); shared variable RAM : ram_type;begin process(clk) begin if clk'event and clk = '1' then if ena = '1' then if wea = '1' then RAM(conv_integer(addra)) := dia; end if; end if; end if; end process;

process(clk) begin if clk'event and clk = '1' then if enb = '1' then dob <= RAM(conv_integer(addrb)); end if; end if; end process;

end syn;

2 つのクロックを使用するシンプル デュアル ポート ブロック RAM のコード例 (Verilog)

ファ イル名: simple_dual_two_clocks.v

// Simple Dual-Port Block RAM with Two Clocks// File: simple_dual_two_clocks.v

Page 116: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 116UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

module simple_dual_two_clocks (clka,clkb,ena,enb,wea,addra,addrb,dia,dob);

input clka,clkb,ena,enb,wea;input [9:0] addra,addrb;input [15:0] dia;output [15:0] dob;reg [15:0] ram [1023:0];reg [15:0] dob;

always @(posedge clka) begin if (ena) begin if (wea) ram[addra] <= dia; endend

always @(posedge clkb) begin if (enb) begin dob <= ram[addrb]; endend

endmodule

2 つのクロックを使用するシンプル デュアル ポート ブロック RAM のコード例 (VHDL)

ファ イル名: simple_dual_two_clocks.vhd

-- Simple Dual-Port Block RAM with Two Clocks-- Correct Modelization with a Shared Variable-- File: simple_dual_two_clocks.vhdlibrary IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;

entity simple_dual_two_clocks is port( clka : in std_logic; clkb : in std_logic; ena : in std_logic; enb : in std_logic; wea : in std_logic; addra : in std_logic_vector(9 downto 0); addrb : in std_logic_vector(9 downto 0); dia : in std_logic_vector(15 downto 0); dob : out std_logic_vector(15 downto 0) );end simple_dual_two_clocks;

architecture syn of simple_dual_two_clocks is type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);

Page 117: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 117UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

shared variable RAM : ram_type;begin process(clka) begin if clka'event and clka = '1' then if ena = '1' then if wea = '1' then RAM(conv_integer(addra)) := dia; end if; end if; end if; end process;

process(clkb) begin if clkb'event and clkb = '1' then if enb = '1' then dob <= RAM(conv_integer(addrb)); end if; end if; end process;

end syn;

完全なデュアル ポート ブロック RAM の例

2 つの書き込みポートがある Read-First モードのデュアル ポート ブロック RAM のコード例 (Verilog)

ファ イル名: ram_tdp_rf_rf.v

// Dual-Port Block RAM with Two Write Ports// File: rams_tdp_rf_rf.v

module rams_tdp_rf_rf (clka,clkb,ena,enb,wea,web,addra,addrb,dia,dib,doa,dob);

input clka,clkb,ena,enb,wea,web;input [9:0] addra,addrb;input [15:0] dia,dib;output [15:0] doa,dob;reg [15:0] ram [1023:0];reg [15:0] doa,dob;

always @(posedge clka)begin if (ena) begin if (wea) ram[addra] <= dia; doa <= ram[addra]; endend

always @(posedge clkb) begin if (enb) begin

Page 118: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 118UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

if (web) ram[addrb] <= dib; dob <= ram[addrb]; endend

endmodule

2 つの書き込みポートがある Read-First モードのデュアル ポート ブロック RAM のコード例 (VHDL)

ファ イル名: ram_tdp_rf_rf.vhd

-- Dual-Port Block RAM with Two Write Ports-- Correct Modelization with a Shared Variable-- File: rams_tdp_rf_rf.vhd

library IEEE;use IEEE.std_logic_1164.all;use ieee.numeric_std.all;

entity rams_tdp_rf_rf is port( clka : in std_logic; clkb : in std_logic; ena : in std_logic; enb : in std_logic; wea : in std_logic; web : in std_logic; addra : in std_logic_vector(9 downto 0); addrb : in std_logic_vector(9 downto 0); dia : in std_logic_vector(15 downto 0); dib : in std_logic_vector(15 downto 0); doa : out std_logic_vector(15 downto 0); dob : out std_logic_vector(15 downto 0) );end rams_tdp_rf_rf;

architecture syn of rams_tdp_rf_rf is type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0); shared variable RAM : ram_type;begin process(CLKA) begin if CLKA’event and CLKA = ‘1’ then if ENA = ‘1’ then DOA <= RAM(to_integer(unsigned(ADDRA))); if WEA = ‘1’ then RAM(to_integer(unsigned(ADDRA))) := DIA; end if; end if; end if; end process;

process(CLKB) begin if CLKB’event and CLKB = ‘1’ then

Page 119: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 119UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

if ENB = ‘1’ then DOB <= RAM(to_integer(unsigned(ADDRB))); if WEB = ‘1’ then RAM(to_integer(unsigned(ADDRB))) := DIB; end if; end if; end if; end process;

end syn;

オプシ ョ ンの出力レジスタ付きブロック RAM のコード例 (Verilog)

ファ イル名: rams_pipeline.v

// Block RAM with Optional Output Registers// File: rams_pipeline

module rams_pipeline (clk1, clk2, we, en1, en2, addr1, addr2, di, res1, res2);input clk1;input clk2;input we, en1, en2;input [9:0] addr1;input [9:0] addr2;input [15:0] di;output [15:0] res1;output [15:0] res2;reg [15:0] res1;reg [15:0] res2;reg [15:0] RAM [1023:0];reg [15:0] do1;reg [15:0] do2;

always @(posedge clk1)begin if (we == 1'b1) RAM[addr1] <= di; do1 <= RAM[addr1];end

always @(posedge clk2)begin do2 <= RAM[addr2];end

always @(posedge clk1)begin if (en1 == 1'b1) res1 <= do1;end

always @(posedge clk2)begin if (en2 == 1'b1) res2 <= do2;end endmodule

Page 120: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 120UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

オプシ ョ ンの出力レジスタ付きブロック RAM のコード例 (VHDL)

ファ イル名: rams_pipeline.vhd

-- Block RAM with Optional Output Registers-- File: rams_pipeline.vhdlibrary IEEE;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use ieee.numeric_std.all;

entity rams_pipeline is port( clk1, clk2 : in std_logic; we, en1, en2 : in std_logic; addr1 : in std_logic_vector(9 downto 0); addr2 : in std_logic_vector(9 downto 0); di : in std_logic_vector(15 downto 0); res1 : out std_logic_vector(15 downto 0); res2 : out std_logic_vector(15 downto 0) );end rams_pipeline;

architecture beh of rams_pipeline is type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0); signal ram : ram_type; signal do1 : std_logic_vector(15 downto 0); signal do2 : std_logic_vector(15 downto 0);begin process(clk1) begin if rising_edge(clk1) then if we = '1' then ram(to_integer(unsigned(addr1))) <= di; end if; do1 <= ram(to_integer(unsigned(addr1))); end if; end process;

process(clk2) begin if rising_edge(clk2) then do2 <= ram(to_integer(unsigned(addr2))); end if; end process;

process(clk1) begin if rising_edge(clk1) then if en1 = '1' then res1 <= do1; end if; end if; end process;

process(clk2) begin if rising_edge(clk2) then

Page 121: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 121UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

if en2 = '1' then res2 <= do2; end if; end if; end process;

end beh;

バイ ト ライ ト イネーブル (ブロック RAM)ザイ リ ンクスでは、 ブロ ッ ク RAM でバイ ト ライ ト イネーブルをサポート しています。

ブロ ッ ク RAM のバイ ト ライ ト イネーブルは、 次の目的で使用します。

• RAM へのデータ書き込みを高度に制御

• アドレス指定されたメモ リの書き込み可能な 8 ビッ ト部分を個別に指定

HDL モデリ ングと推論の視点から考える と、 この概念は列ベースの書き込みと して記述するのが最適です。

• RAM は、 同じサイズの列の集合と考えます。

• 書き込みサイクル中は、 これらの各列への書き込みを個別に制御します。

Vivado 合成の推論では、 ブロ ッ ク RAM のバイ ト ライ ト イネーブル機能を活用できます。 記述された RAM は、 次

の条件を満たしていれば、 バイ ト ライ ト イネーブル機能を使用してブロ ッ ク RAM リ ソースにインプリ メン ト され

ます。

• 書き込み列幅が同じ

• 設定可能な書き込み列幅: 8 ビッ ト 、 9 ビッ ト 、 16 ビッ ト 、 18 ビッ ト (8 ビッ ト または 9 ビッ トの倍数)

5 ビッ トや 12 ビッ ト などの上記以外の書き込み列幅 (8 ビッ ト または 9 ビッ トの倍数以外) を設定する と、各列に個別

の RAM が使用されます。

• 書き込み列数: 任意

• サポート される読み出し /書き込み同期モード : Read-First、 Write-First、 No-Change

Page 122: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 122UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

バイ ト ライ ト イネーブル付きの完全なデュアル ポート ブロック RAM のコード例 (Verilog)

ファ イル名: bytewrite_tdp_ram_rf.v

// True-Dual-Port BRAM with Byte-wide Write Enable// Read-First mode // bytewrite_tdp_ram_rf.v//

module bytewrite_tdp_ram_rf #(//--------------------------------------------------------------------------parameter NUM_COL = 4,parameter COL_WIDTH = 8,parameter ADDR_WIDTH = 10, // Addr Width in bits : 2 *ADDR_WIDTH = RAM Depthparameter DATA_WIDTH = NUM_COL*COL_WIDTH // Data Width in bits //---------------------------------------------------------------------- ) ( input clkA, input enaA, input [NUM_COL-1:0] weA, input [ADDR_WIDTH-1:0] addrA, input [DATA_WIDTH-1:0] dinA, output reg [DATA_WIDTH-1:0] doutA,

input clkB, input enaB, input [NUM_COL-1:0] weB, input [ADDR_WIDTH-1:0] addrB, input [DATA_WIDTH-1:0] dinB, output reg [DATA_WIDTH-1:0] doutB );

// Core Memory reg [DATA_WIDTH-1:0] ram_block [(2**ADDR_WIDTH)-1:0];

integer i; // Port-A Operation always @ (posedge clkA) begin if(enaA) begin for(i=0;i<NUM_COL;i=i+1) begin if(weA[i]) begin ram_block[addrA][i*COL_WIDTH +: COL_WIDTH] <= dinA[i*COL_WIDTH +: COL_WIDTH]; end end doutA <= ram_block[addrA]; end end

// Port-B Operation: always @ (posedge clkB) begin if(enaB) begin for(i=0;i<NUM_COL;i=i+1) begin if(weB[i]) begin

Page 123: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 123UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

ram_block[addrB][i*COL_WIDTH +: COL_WIDTH] <= dinB[i*COL_WIDTH +: COL_WIDTH]; end end doutB <= ram_block[addrB]; end end

endmodule // bytewrite_tdp_ram_rf

バイ ト ライ ト イネーブル付き READ_FIRST モードの完全なデュアル ポート ブロック RAM のコード例 (VHDL)

ファ イル名: bytewrite_tdp_ram_rf.vhd

-- True-Dual-Port BRAM with Byte-wide Write Enable-- Read First mode---- bytewrite_tdp_ram_rf.vhd---- READ_FIRST ByteWide WriteEnable Block RAM Template

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity bytewrite_tdp_ram_rf is generic( SIZE : integer := 1024; ADDR_WIDTH : integer := 10; COL_WIDTH : integer := 9; NB_COL : integer := 4 );

port( clka : in std_logic; ena : in std_logic; wea : in std_logic_vector(NB_COL - 1 downto 0); addra : in std_logic_vector(ADDR_WIDTH - 1 downto 0); dia : in std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0); doa : out std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0); clkb : in std_logic; enb : in std_logic; web : in std_logic_vector(NB_COL - 1 downto 0); addrb : in std_logic_vector(ADDR_WIDTH - 1 downto 0); dib : in std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0); dob : out std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0) );

end bytewrite_tdp_ram_rf;

architecture byte_wr_ram_rf of bytewrite_tdp_ram_rf is type ram_type is array (0 to SIZE - 1) of std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0); shared variable RAM : ram_type := (others => (others => '0'));

Page 124: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 124UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

begin

------- Port A ------- process(clka) begin if rising_edge(clka) then if ena = '1' then doa <= RAM(conv_integer(addra)); for i in 0 to NB_COL - 1 loop if wea(i) = '1' then RAM(conv_integer(addra))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) := dia((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH); end if; end loop; end if; end if; end process;

------- Port B ------- process(clkb) begin if rising_edge(clkb) then if enb = '1' then dob <= RAM(conv_integer(addrb)); for i in 0 to NB_COL - 1 loop if web(i) = '1' then RAM(conv_integer(addrb))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) := dib((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH); end if; end loop; end if; end if; end process;end byte_wr_ram_rf;

バイ ト ライ ト イネーブル (WRITE_FIRST モード ) のコード例 (VHDL)

ファ イル名: bytewrite_tdp_ram_wf.vhd

-- True-Dual-Port BRAM with Byte-wide Write Enable-- Write First mode---- bytewrite_tdp_ram_wf.vhd-- WRITE_FIRST ByteWide WriteEnable Block RAM Template

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity bytewrite_tdp_ram_wf is generic( SIZE : integer := 1024; ADDR_WIDTH : integer := 10; COL_WIDTH : integer := 9; NB_COL : integer := 4 );

Page 125: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 125UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

port( clka : in std_logic; ena : in std_logic; wea : in std_logic_vector(NB_COL - 1 downto 0); addra : in std_logic_vector(ADDR_WIDTH - 1 downto 0); dia : in std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0); doa : out std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0); clkb : in std_logic; enb : in std_logic; web : in std_logic_vector(NB_COL - 1 downto 0); addrb : in std_logic_vector(ADDR_WIDTH - 1 downto 0); dib : in std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0); dob : out std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0) );

end bytewrite_tdp_ram_wf;

architecture byte_wr_ram_wf of bytewrite_tdp_ram_wf is type ram_type is array (0 to SIZE - 1) of std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0); shared variable RAM : ram_type := (others => (others => '0'));

begin

------- Port A ------- process(clka) begin if rising_edge(clka) then if ena = '1' then for i in 0 to NB_COL - 1 loop if wea(i) = '1' then RAM(conv_integer(addra))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) := dia((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH); end if; end loop; doa <= RAM(conv_integer(addra)); end if; end if;

end process;

------- Port B ------- process(clkb) begin if rising_edge(clkb) then if enb = '1' then for i in 0 to NB_COL - 1 loop if web(i) = '1' then RAM(conv_integer(addrb))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) := dib((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH); end if; end loop; dob <= RAM(conv_integer(addrb)); end if; end if; end process;end byte_wr_ram_wf;

Page 126: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 126UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

バイ ト幅ライ ト イネーブル (NO_CHANGE モード ) のコード例 (Verilog)

ファ イル名: bytewrite_tdp_ram_nc.v

//// True-Dual-Port BRAM with Byte-wide Write Enable// No-Change mode//// bytewrite_tdp_ram_nc.v//// ByteWide Write Enable, - NO_CHANGE mode template - Vivado recomendedmodule bytewrite_tdp_ram_nc #( //--------------------------------------------------------------- parameter NUM_COL = 4, parameter COL_WIDTH = 8, parameter ADDR_WIDTH = 10, // Addr Width in bits : 2**ADDR_WIDTH = RAM Depth parameter DATA_WIDTH = NUM_COL*COL_WIDTH // Data Width in bits //--------------------------------------------------------------- ) ( input clkA, input enaA, input [NUM_COL-1:0] weA, input [ADDR_WIDTH-1:0] addrA, input [DATA_WIDTH-1:0] dinA, output reg [DATA_WIDTH-1:0] doutA, input clkB, input enaB, input [NUM_COL-1:0] weB, input [ADDR_WIDTH-1:0] addrB, input [DATA_WIDTH-1:0] dinB, output reg [DATA_WIDTH-1:0] doutB );

// Core Memory reg [DATA_WIDTH-1:0] ram_block [(2**ADDR_WIDTH)-1:0]; // Port-A Operation generate genvar i; for(i=0;i<NUM_COL;i=i+1) begin always @ (posedge clkA) begin if(enaA) begin if(weA[i]) begin ram_block[addrA][i*COL_WIDTH +: COL_WIDTH] <= dinA[i*COL_WIDTH +: COL_WIDTH]; end end end end endgenerate always @ (posedge clkA) begin if(enaA) begin if (~|weA) doutA <= ram_block[addrA]; end end // Port-B Operation: generate for(i=0;i<NUM_COL;i=i+1) begin

Page 127: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 127UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

always @ (posedge clkB) begin if(enaB) begin if(weB[i]) begin ram_block[addrB][i*COL_WIDTH +: COL_WIDTH] <= dinB[i*COL_WIDTH +: COL_WIDTH]; end end end end endgenerate always @ (posedge clkB) begin if(enaB) begin if (~|weB) doutB <= ram_block[addrB]; end end endmodule // bytewrite_tdp_ram_nc

バイ ト幅ライ ト イネーブル (NO_CHANGE モード ) のコード例 (VHDL)

ファ イル名: bytewrite_tdp_ram_nc.vhd

---- True-Dual-Port BRAM with Byte-wide Write Enable-- No change mode---- bytewrite_tdp_ram_nc.vhd---- NO_CHANGE ByteWide WriteEnable Block RAM Template

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity bytewrite_tdp_ram_nc is generic( SIZE : integer := 1024; ADDR_WIDTH : integer := 10; COL_WIDTH : integer := 9; NB_COL : integer := 4 );

port( clka : in std_logic; ena : in std_logic; wea : in std_logic_vector(NB_COL - 1 downto 0); addra : in std_logic_vector(ADDR_WIDTH - 1 downto 0); dia : in std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0); doa : out std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0); clkb : in std_logic; enb : in std_logic; web : in std_logic_vector(NB_COL - 1 downto 0); addrb : in std_logic_vector(ADDR_WIDTH - 1 downto 0); dib : in std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0); dob : out std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0) );

end bytewrite_tdp_ram_nc;

architecture byte_wr_ram_nc of bytewrite_tdp_ram_nc is type ram_type is array (0 to SIZE - 1) of std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0);

Page 128: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 128UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

shared variable RAM : ram_type := (others => (others => '0'));

begin

------- Port A ------- process(clka) begin if rising_edge(clka) then if ena = '1' then if (wea = (wea'range => '0')) then doa <= RAM(conv_integer(addra)); end if; for i in 0 to NB_COL - 1 loop if wea(i) = '1' then RAM(conv_integer(addra))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) := dia((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH); end if; end loop; end if; end if; end process;

------- Port B ------- process(clkb) begin if rising_edge(clkb) then if enb = '1' then if (web = (web'range => '0')) then dob <= RAM(conv_integer(addrb)); end if; for i in 0 to NB_COL - 1 loop if web(i) = '1' then RAM(conv_integer(addrb))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) := dib((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH); end if; end loop; end if; end if; end process;end byte_wr_ram_nc;

非対称 RAM

シンプル デュアル ポート非対称 RAM のコード例 (VHDL): 読み出しの幅が書き込みより広い場合

ファ イル名: asym_ram_sdp_read_wider.vhd

-- Asymmetric port RAM-- Read Wider than Write-- asym_ram_sdp_read_wider.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;

entity asym_ram_sdp_read_wider is generic( WIDTHA : integer := 4; SIZEA : integer := 1024;

Page 129: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 129UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

ADDRWIDTHA : integer := 10; WIDTHB : integer := 16; SIZEB : integer := 256; ADDRWIDTHB : integer := 8 );

port( clkA : in std_logic; clkB : in std_logic; enA : in std_logic; enB : in std_logic; weA : in std_logic; addrA : in std_logic_vector(ADDRWIDTHA - 1 downto 0); addrB : in std_logic_vector(ADDRWIDTHB - 1 downto 0); diA : in std_logic_vector(WIDTHA - 1 downto 0); doB : out std_logic_vector(WIDTHB - 1 downto 0) );

end asym_ram_sdp_read_wider;

architecture behavioral of asym_ram_sdp_read_wider is function max(L, R : INTEGER) return INTEGER is begin if L > R then return L; else return R; end if; end;

function min(L, R : INTEGER) return INTEGER is begin if L < R then return L; else return R; end if; end;

function log2(val : INTEGER) return natural is variable res : natural; begin for i in 0 to 31 loop if (val <= (2 ** i)) then res := i; exit; end if; end loop; return res; end function Log2;

constant minWIDTH : integer := min(WIDTHA, WIDTHB); constant maxWIDTH : integer := max(WIDTHA, WIDTHB); constant maxSIZE : integer := max(SIZEA, SIZEB); constant RATIO : integer := maxWIDTH / minWIDTH;

-- An asymmetric RAM is modeled in a similar way as a symmetric RAM, with an -- array of array object. Its aspect ratio corresponds to the port with the -- lower data width (larger depth) type ramType is array (0 to maxSIZE - 1) of std_logic_vector(minWIDTH - 1 downto 0);

signal my_ram : ramType := (others => (others => '0'));

signal readB : std_logic_vector(WIDTHB - 1 downto 0) := (others => '0'); signal regA : std_logic_vector(WIDTHA - 1 downto 0) := (others => '0');

Page 130: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 130UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

signal regB : std_logic_vector(WIDTHB - 1 downto 0) := (others => '0');

begin

-- Write process process(clkA) begin if rising_edge(clkA) then if enA = '1' then if weA = '1' then my_ram(conv_integer(addrA)) <= diA; end if; end if; end if; end process;

-- Read process process(clkB) begin if rising_edge(clkB) then for i in 0 to RATIO - 1 loop if enB = '1' then readB((i + 1) * minWIDTH - 1 downto i * minWIDTH) <= my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO)))); end if; end loop; regB <= readB; end if; end process;

doB <= regB;

end behavioral;

シンプル デュアル ポート非対称 RAM のコード例 (Verilog): 読み出しの幅が書き込みより広い場合

ファ イル名: asym_ram_sdp_read_wider.v

// Asymmetric port RAM// Read Wider than Write. Read Statement in loop//asym_ram_sdp_read_wider.v

module asym_ram_sdp_read_wider (clkA, clkB, enaA, weA, enaB, addrA, addrB, diA, doB);parameter WIDTHA = 4;parameter SIZEA = 1024;parameter ADDRWIDTHA = 10;

parameter WIDTHB = 16;parameter SIZEB = 256;parameter ADDRWIDTHB = 8;input clkA;input clkB;input weA;input enaA, enaB;input [ADDRWIDTHA-1:0] addrA;input [ADDRWIDTHB-1:0] addrB;input [WIDTHA-1:0] diA;output [WIDTHB-1:0] doB;`define max(a,b) {(a) > (b) ? (a) : (b)}

Page 131: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 131UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

`define min(a,b) {(a) < (b) ? (a) : (b)}

function integer log2;input integer value;reg [31:0] shifted;integer res;begin if (value < 2) log2 = value; else begin shifted = value-1; for (res=0; shifted>0; res=res+1) shifted = shifted>>1; log2 = res; endendendfunction

localparam maxSIZE = `max(SIZEA, SIZEB);localparam maxWIDTH = `max(WIDTHA, WIDTHB);localparam minWIDTH = `min(WIDTHA, WIDTHB);

localparam RATIO = maxWIDTH / minWIDTH;localparam log2RATIO = log2(RATIO);

reg [minWIDTH-1:0] RAM [0:maxSIZE-1];reg [WIDTHB-1:0] readB;

always @(posedge clkA)begin if (enaA) begin if (weA) RAM[addrA] <= diA; end end

always @(posedge clkB)begin : ramread integer i; reg [log2RATIO-1:0] lsbaddr; if (enaB) begin for (i = 0; i < RATIO; i = i+1) begin lsbaddr = i; readB[(i+1)*minWIDTH-1 -: minWIDTH] <= RAM[{addrB, lsbaddr}]; end endendassign doB = readB;

endmodule

Page 132: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 132UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

シンプル デュアル ポート非対称 RAM のコード例 (Verilog): 書き込みの幅が読み出しより広い場合

ファ イル名: asym_ram_sdp_write_wider.v

// Asymmetric port RAM// Write wider than Read. Write Statement in a loop.// asym_ram_sdp_write_wider.v

module asym_ram_sdp_write_wider (clkA, clkB, weA, enaA, enaB, addrA, addrB, diA, doB);parameter WIDTHB = 4;parameter SIZEB = 1024;parameter ADDRWIDTHB = 10;

parameter WIDTHA = 16;parameter SIZEA = 256;parameter ADDRWIDTHA = 8;input clkA;input clkB;input weA;input enaA, enaB;input [ADDRWIDTHA-1:0] addrA;input [ADDRWIDTHB-1:0] addrB;input [WIDTHA-1:0] diA;output [WIDTHB-1:0] doB;`define max(a,b) {(a) > (b) ? (a) : (b)}`define min(a,b) {(a) < (b) ? (a) : (b)}

function integer log2;input integer value;reg [31:0] shifted;integer res;begin if (value < 2) log2 = value; else begin shifted = value-1; for (res=0; shifted>0; res=res+1) shifted = shifted>>1; log2 = res; endendendfunction

localparam maxSIZE = `max(SIZEA, SIZEB);localparam maxWIDTH = `max(WIDTHA, WIDTHB);localparam minWIDTH = `min(WIDTHA, WIDTHB);

localparam RATIO = maxWIDTH / minWIDTH;localparam log2RATIO = log2(RATIO);

reg [minWIDTH-1:0] RAM [0:maxSIZE-1];reg [WIDTHB-1:0] readB;

always @(posedge clkB) begin if (enaB) begin

Page 133: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 133UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

readB <= RAM[addrB]; end endassign doB = readB;

always @(posedge clkA)begin : ramwrite integer i; reg [log2RATIO-1:0] lsbaddr; for (i=0; i< RATIO; i= i+ 1) begin : write1 lsbaddr = i; if (enaA) begin if (weA) RAM[{addrA, lsbaddr}] <= diA[(i+1)*minWIDTH-1 -: minWIDTH]; end endend

endmodule

シンプル デュアル ポート非対称 RAM のコード例 (VHDL): 書き込みの幅が読み出しより広い場合

ファ イル名: asym_ram_sdp_write_wider.vhd

-- Asymmetric port RAM-- Write Wider than Read-- asym_ram_sdp_write_wider.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;

entity asym_ram_sdp_write_wider is generic( WIDTHA : integer := 4; SIZEA : integer := 1024; ADDRWIDTHA : integer := 10; WIDTHB : integer := 16; SIZEB : integer := 256; ADDRWIDTHB : integer := 8 );

port( clkA : in std_logic; clkB : in std_logic; enA : in std_logic; enB : in std_logic; weB : in std_logic; addrA : in std_logic_vector(ADDRWIDTHA - 1 downto 0); addrB : in std_logic_vector(ADDRWIDTHB - 1 downto 0); diB : in std_logic_vector(WIDTHB - 1 downto 0); doA : out std_logic_vector(WIDTHA - 1 downto 0) );

end asym_ram_sdp_write_wider;

architecture behavioral of asym_ram_sdp_write_wider is

Page 134: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 134UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

function max(L, R : INTEGER) return INTEGER is begin if L > R then return L; else return R; end if; end;

function min(L, R : INTEGER) return INTEGER is begin if L < R then return L; else return R; end if; end;

function log2(val : INTEGER) return natural is variable res : natural; begin for i in 0 to 31 loop if (val <= (2 ** i)) then res := i; exit; end if; end loop; return res; end function Log2;

constant minWIDTH : integer := min(WIDTHA, WIDTHB); constant maxWIDTH : integer := max(WIDTHA, WIDTHB); constant maxSIZE : integer := max(SIZEA, SIZEB); constant RATIO : integer := maxWIDTH / minWIDTH;

-- An asymmetric RAM is modeled in a similar way as a symmetric RAM, with an -- array of array object. Its aspect ratio corresponds to the port with the -- lower data width (larger depth) type ramType is array (0 to maxSIZE - 1) of std_logic_vector(minWIDTH - 1 downto 0);

signal my_ram : ramType := (others => (others => '0'));

signal readA : std_logic_vector(WIDTHA - 1 downto 0) := (others => '0'); signal readB : std_logic_vector(WIDTHB - 1 downto 0) := (others => '0'); signal regA : std_logic_vector(WIDTHA - 1 downto 0) := (others => '0'); signal regB : std_logic_vector(WIDTHB - 1 downto 0) := (others => '0');

begin

-- read process process(clkA) begin if rising_edge(clkA) then if enA = '1' then readA <= my_ram(conv_integer(addrA)); end if; regA <= readA; end if; end process;

-- Write process process(clkB) begin if rising_edge(clkB) then for i in 0 to RATIO - 1 loop

Page 135: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 135UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

if enB = '1' then if weB = '1' then my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO)))) <= diB((i + 1) * minWIDTH - 1 downto i * minWIDTH); end if; end if; end loop; regB <= readB; end if; end process;

doA <= regA;

end behavioral;

Read-First モードの完全なデュアル ポート非対称 RAM のコード例 (Verilog)

ファ イル名: asym_ram_tdp_read_first.v

// Asymetric RAM - TDP // READ_FIRST MODE.// asym_ram_tdp_read_first.v

module asym_ram_tdp_read_first (clkA, clkB, enaA, weA, enaB, weB, addrA, addrB, diA, doA, diB, doB);parameter WIDTHB = 4;parameter SIZEB = 1024;parameter ADDRWIDTHB = 10;parameter WIDTHA = 16;parameter SIZEA = 256;parameter ADDRWIDTHA = 8;input clkA;input clkB;input weA, weB;input enaA, enaB;

input [ADDRWIDTHA-1:0] addrA;input [ADDRWIDTHB-1:0] addrB;input [WIDTHA-1:0] diA;input [WIDTHB-1:0] diB;

output [WIDTHA-1:0] doA;output [WIDTHB-1:0] doB;

`define max(a,b) {(a) > (b) ? (a) : (b)}`define min(a,b) {(a) < (b) ? (a) : (b)}

function integer log2;input integer value;reg [31:0] shifted;integer res;begin if (value < 2) log2 = value; else begin shifted = value-1; for (res=0; shifted>0; res=res+1) shifted = shifted>>1; log2 = res; end

Page 136: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 136UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

endendfunction

localparam maxSIZE = `max(SIZEA, SIZEB);localparam maxWIDTH = `max(WIDTHA, WIDTHB);localparam minWIDTH = `min(WIDTHA, WIDTHB);

localparam RATIO = maxWIDTH / minWIDTH;localparam log2RATIO = log2(RATIO);

reg [minWIDTH-1:0] RAM [0:maxSIZE-1];reg [WIDTHA-1:0] readA;reg [WIDTHB-1:0] readB;

always @(posedge clkB)begin if (enaB) begin readB <= RAM[addrB] ; if (weB) RAM[addrB] <= diB; end end

always @(posedge clkA)begin : portA integer i; reg [log2RATIO-1:0] lsbaddr ; for (i=0; i< RATIO; i= i+ 1) begin lsbaddr = i; if (enaA) begin readA[(i+1)*minWIDTH -1 -: minWIDTH] <= RAM[{addrA, lsbaddr}];

if (weA) RAM[{addrA, lsbaddr}] <= diA[(i+1)*minWIDTH-1 -: minWIDTH]; end endend

assign doA = readA;assign doB = readB;

endmodule

Read-First モードの完全なデュアル ポート非対称 RAM のコード例 (VHDL)

ファ イル名: asym_ram_tdp_read_first_first.vhd

-- asymmetric port RAM-- True Dual port read first-- asym_ram_tdp_read_first_first.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;

entity asym_ram_tdp_read_first is generic( WIDTHA : integer := 4; SIZEA : integer := 1024; ADDRWIDTHA : integer := 10;

Page 137: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 137UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

WIDTHB : integer := 16; SIZEB : integer := 256; ADDRWIDTHB : integer := 8 );

port( clkA : in std_logic; clkB : in std_logic; enA : in std_logic; enB : in std_logic; weA : in std_logic; weB : in std_logic; addrA : in std_logic_vector(ADDRWIDTHA - 1 downto 0); addrB : in std_logic_vector(ADDRWIDTHB - 1 downto 0); diA : in std_logic_vector(WIDTHA - 1 downto 0); diB : in std_logic_vector(WIDTHB - 1 downto 0); doA : out std_logic_vector(WIDTHA - 1 downto 0); doB : out std_logic_vector(WIDTHB - 1 downto 0) );

end asym_ram_tdp_read_first;

architecture behavioral of asym_ram_tdp_read_first is function max(L, R : INTEGER) return INTEGER is begin if L > R then return L; else return R; end if; end;

function min(L, R : INTEGER) return INTEGER is begin if L < R then return L; else return R; end if; end;

function log2(val : INTEGER) return natural is variable res : natural; begin for i in 0 to 31 loop if (val <= (2 ** i)) then res := i; exit; end if; end loop; return res; end function Log2;

constant minWIDTH : integer := min(WIDTHA, WIDTHB); constant maxWIDTH : integer := max(WIDTHA, WIDTHB); constant maxSIZE : integer := max(SIZEA, SIZEB); constant RATIO : integer := maxWIDTH / minWIDTH;

-- An asymmetric RAM is modeled in a similar way as a symmetric RAM, with an -- array of array object. Its aspect ratio corresponds to the port with the -- lower data width (larger depth) type ramType is array (0 to maxSIZE - 1) of std_logic_vector(minWIDTH - 1 downto 0);

signal my_ram : ramType := (others => (others => '0'));

Page 138: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 138UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

signal readA : std_logic_vector(WIDTHA - 1 downto 0) := (others => '0'); signal readB : std_logic_vector(WIDTHB - 1 downto 0) := (others => '0'); signal regA : std_logic_vector(WIDTHA - 1 downto 0) := (others => '0'); signal regB : std_logic_vector(WIDTHB - 1 downto 0) := (others => '0');

begin process(clkA) begin if rising_edge(clkA) then if enA = '1' then readA <= my_ram(conv_integer(addrA)); if weA = '1' then my_ram(conv_integer(addrA)) <= diA; end if; end if; regA <= readA; end if; end process;

process(clkB) begin if rising_edge(clkB) then for i in 0 to RATIO - 1 loop if enB = '1' then readB((i + 1) * minWIDTH - 1 downto i * minWIDTH) <= my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO)))); if weB = '1' then my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO)))) <= diB((i + 1) * minWIDTH - 1 downto i * minWIDTH); end if; end if; end loop; regB <= readB; end if; end process;

doA <= regA; doB <= regB;

end behavioral;

Write-First モードの完全なデュアル ポート非対称 RAM のコード例 (Verilog)

ファ イル名: asym_ram_tdp_write_first.v

// Asymmetric port RAM - TDP// WRITE_FIRST MODE.// asym_ram_tdp_write_first.v

module asym_ram_tdp_write_first (clkA, clkB, enaA, weA, enaB, weB, addrA, addrB, diA, doA, diB, doB);parameter WIDTHB = 4;parameter SIZEB = 1024;parameter ADDRWIDTHB = 10;parameter WIDTHA = 16;parameter SIZEA = 256;parameter ADDRWIDTHA = 8;input clkA;input clkB;input weA, weB;

Page 139: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 139UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

input enaA, enaB;

input [ADDRWIDTHA-1:0] addrA;input [ADDRWIDTHB-1:0] addrB;input [WIDTHA-1:0] diA;input [WIDTHB-1:0] diB;

output [WIDTHA-1:0] doA;output [WIDTHB-1:0] doB;

`define max(a,b) {(a) > (b) ? (a) : (b)}`define min(a,b) {(a) < (b) ? (a) : (b)}

function integer log2;input integer value;reg [31:0] shifted;integer res;begin if (value < 2) log2 = value; else begin shifted = value-1; for (res=0; shifted>0; res=res+1) shifted = shifted>>1; log2 = res; endendendfunction

localparam maxSIZE = `max(SIZEA, SIZEB);localparam maxWIDTH = `max(WIDTHA, WIDTHB);localparam minWIDTH = `min(WIDTHA, WIDTHB);

localparam RATIO = maxWIDTH / minWIDTH;localparam log2RATIO = log2(RATIO);

reg [minWIDTH-1:0] RAM [0:maxSIZE-1];reg [WIDTHA-1:0] readA;reg [WIDTHB-1:0] readB;

always @(posedge clkB)begin if (enaB) begin if (weB) RAM[addrB] = diB; readB = RAM[addrB] ; end end

always @(posedge clkA)begin : portA integer i; reg [log2RATIO-1:0] lsbaddr ; for (i=0; i< RATIO; i= i+ 1) begin lsbaddr = i; if (enaA) begin

Page 140: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 140UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

if (weA) RAM[{addrA, lsbaddr}] = diA[(i+1)*minWIDTH-1 -: minWIDTH]; readA[(i+1)*minWIDTH -1 -: minWIDTH] = RAM[{addrA, lsbaddr}]; end endend

assign doA = readA;assign doB = readB;

endmodule

Write-First モードの完全なデュアル ポート非対称 RAM のコード例 (VHDL)

ファ イル名: asym_ram_tdp_write_first.vhd

--Asymmetric RAM--True Dual Port write first mode.--asym_ram_tdp_write_first.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;

entity asym_ram_tdp_write_first is generic( WIDTHA : integer := 4; SIZEA : integer := 1024; ADDRWIDTHA : integer := 10; WIDTHB : integer := 16; SIZEB : integer := 256; ADDRWIDTHB : integer := 8 );

port( clkA : in std_logic; clkB : in std_logic; enA : in std_logic; enB : in std_logic; weA : in std_logic; weB : in std_logic; addrA : in std_logic_vector(ADDRWIDTHA - 1 downto 0); addrB : in std_logic_vector(ADDRWIDTHB - 1 downto 0); diA : in std_logic_vector(WIDTHA - 1 downto 0); diB : in std_logic_vector(WIDTHB - 1 downto 0); doA : out std_logic_vector(WIDTHA - 1 downto 0); doB : out std_logic_vector(WIDTHB - 1 downto 0) );

end asym_ram_tdp_write_first;

architecture behavioral of asym_ram_tdp_write_first is function max(L, R : INTEGER) return INTEGER is begin if L > R then return L; else return R; end if;

Page 141: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 141UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

end;

function min(L, R : INTEGER) return INTEGER is begin if L < R then return L; else return R; end if; end;

function log2(val : INTEGER) return natural is variable res : natural; begin for i in 0 to 31 loop if (val <= (2 ** i)) then res := i; exit; end if; end loop; return res; end function Log2;

constant minWIDTH : integer := min(WIDTHA, WIDTHB); constant maxWIDTH : integer := max(WIDTHA, WIDTHB); constant maxSIZE : integer := max(SIZEA, SIZEB); constant RATIO : integer := maxWIDTH / minWIDTH;

-- An asymmetric RAM is modeled in a similar way as a symmetric RAM, with an -- array of array object. Its aspect ratio corresponds to the port with the -- lower data width (larger depth) type ramType is array (0 to maxSIZE - 1) of std_logic_vector(minWIDTH - 1 downto 0);

signal my_ram : ramType := (others => (others => '0'));

signal readA : std_logic_vector(WIDTHA - 1 downto 0) := (others => '0'); signal readB : std_logic_vector(WIDTHB - 1 downto 0) := (others => '0'); signal regA : std_logic_vector(WIDTHA - 1 downto 0) := (others => '0'); signal regB : std_logic_vector(WIDTHB - 1 downto 0) := (others => '0');

begin process(clkA) begin if rising_edge(clkA) then if enA = '1' then if weA = '1' then my_ram(conv_integer(addrA)) <= diA; readA <= diA; else readA <= my_ram(conv_integer(addrA)); end if; end if; regA <= readA; end if; end process;

process(clkB) begin if rising_edge(clkB) then for i in 0 to RATIO - 1 loop if enB = '1' then if weB = '1' then my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO)))) <= diB((i + 1) * minWIDTH - 1 downto i * minWIDTH); end if;

Page 142: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 142UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

-- The read statement below is placed after the write statement -- on purpose -- to ensure write-first synchronization through the variable -- mechanism readB((i + 1) * minWIDTH - 1 downto i * minWIDTH) <= my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO)))); end if; end loop; regB <= readB; end if; end process;

doA <= regA; doB <= regB;

end behavioral;

RAM 内容の初期化

RAM は、 次の方法で初期化できます。

• 「HDL ソース コードで RAM の初期内容を指定」

• 「外部データ ファ イルで RAM の初期内容を指定」

HDL ソース コードで RAM の初期内容を指定

信号のデフォルト値のメカニズムを使用して、 RAM の初期内容を HDL ソース コードで直接記述します。

VHDL コード例

type ram_type is array (0 to 31) of std_logic_vector(19 downto 0);signal RAM : ram_type :=(X"0200A", X"00300", X"08101", X"04000", X"08601", X"0233A", X"00300", X"08602",

X"02310", X"0203B", X"08300", X"04002", X"08201", X"00500", X"04001", X"02500", X"00340", X"00241", X"04002", X"08300", X"08201", X"00500", X"08101", X"00602", X"04003", X"0241E", X"00301", X"00102", X"02122", X"02021", X"0030D", X"08201");

すべてのビッ ト位置を同じ値に初期化する場合:

type ram_type is array (0 to 127) of std_logic_vector (15 downto 0);signal RAM : ram_type := (others => (others => '0'));

Verilog コード例

すべてのアドレス指定可能なワードを同じ値に初期化する場合:

reg [DATA_WIDTH-1:0] ram [DEPTH-1:0];integer i;initial for (i=0; i<DEPTH; i=i+1) ram[i] = 0;end

Page 143: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 143UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

外部データ ファイルで RAM の初期内容を指定

HDL ソース コードでファイルの読み出し関数を使用して、 外部データ ファ イルから RAM の初期内容を読み込みま

す。

• 外部データ ファ イルは ASCII 形式のテキス ト ファ イルで、 ファ イル名は任意です。

• 外部データ ファ イルの各行に、 RAM のアドレス位置の初期内容を記述します。

• 外部データ ファ イルの行数は、 RAM 配列の行数と同じにする必要があ り ます。 行数が足りない場合、 メ ッセー

ジが表示されます。

• 行に対応するアドレス指定可能な位置は、 RAM を記述する信号の主な範囲の方向で定義されます。

• RAM の内容は、 2 進数または 16 進数で記述できます。 2 進数と 16 進数を混ぜて使用するこ とはできません。

• 外部データ ファ イルには、 コ メン ト などのその他の内容を含めるこ とはできません。

次の外部データ ファ イルは、 8 X 32 ビッ ト RAM を 2 進数値で初期化しています。

00001110110000011001111011000110001010110010110101010010001000110111010001010001100001110000111101000001010000100101001110010100000010011010011111111010001010110010110100101111111010101010011111101111000100111000111101101101100011110100100110010000111011110000000110001110001111001001111111011111001110101011111001001010111001110101001111101100110010101100010000100110110011110010100110001011100101011111111111100001111101011101100100000101101110100100101100000011100101011010111011100001111111001010111010011110011011110110100101000011011100010101010001101111100001100010010011110000111101101111001100001011101011010011110101001001000111000101110000101011111110111010111001011101000100100111010010110101111101110001000001010111011011011110011111000111101010110000110101110100000011101111111000011111000100111101011110001110010111010110111000111110001101010110111110111100000000010011101011011011110000010011010011011111000100000001111111001011011001111101010101100100100000011100100101110000100010000001001110110010100011111100100010001110100101000110000110000000100111010011100111100011110111110100101000101010100001111000000011011110100011111011101110110011010111101111000110011001000101111000010010101101110111001001110010111010111101101011001101010011101101010001110110011010

Page 144: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 144UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

011110110111000101010001010000011000100000011001011011100110101011101000001101010000111001010110111000111111000001111101011101010100101000000000111111110110111100100011000011001000000010001111100110001110101100010010111001001111111111101111010100010100011111000011000101000011100110100000011011010010111110101000111010011000011110110010100111001101011111010110100100101110110010100100010011111110011011010111110010111101100100110111011000010011011110110110110111100101110011100110100111001110010000101111110101100000000000101101111100101011001010100110011010000010001000011011110010101111110010011100011101010010000110001000011100010100100000111100101111110001101101111010110000100010100000000101001000011100000100011000110100010100111010010011010100010001100100100111

Verilog コード例

reg [31:0] ram [0:63];

initial begin$readmemb("rams_20c.data", ram, 0, 63);

end

VHDL コード例

データを次のよ うに読み込みます。

type RamType is array(0 to 7) of bit_vector(31 downto 0);impure function InitRamFromFile (RamFileName : in string) return RamType isFILE RamFile : text is in RamFileName;variable RamFileLine : line;variable RAM : RamType;beginfor I in RamType'range loopreadline (RamFile, RamFileLine);read (RamFileLine, RAM(I));end loop;return RAM;end function;signal RAM : RamType := InitRamFromFile("rams_20c.data");

ブロック RAM の初期化のコード例 (Verilog)

ファ イル名: rams_sp_rom.v

// Initializing Block RAM (Single-Port Block RAM)// File: rams_sp_rom

Page 145: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 145UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

module rams_sp_rom (clk, we, addr, di, dout);input clk;input we;input [5:0] addr;input [19:0] di;output [19:0] dout;

reg [19:0] ram [63:0];reg [19:0] dout;

initial begin ram[63] = 20'h0200A; ram[62] = 20'h00300; ram[61] = 20'h08101; ram[60] = 20'h04000; ram[59] = 20'h08601; ram[58] = 20'h0233A; ram[57] = 20'h00300; ram[56] = 20'h08602; ram[55] = 20'h02310; ram[54] = 20'h0203B; ram[53] = 20'h08300; ram[52] = 20'h04002; ram[51] = 20'h08201; ram[50] = 20'h00500; ram[49] = 20'h04001; ram[48] = 20'h02500; ram[47] = 20'h00340; ram[46] = 20'h00241; ram[45] = 20'h04002; ram[44] = 20'h08300; ram[43] = 20'h08201; ram[42] = 20'h00500; ram[41] = 20'h08101; ram[40] = 20'h00602; ram[39] = 20'h04003; ram[38] = 20'h0241E; ram[37] = 20'h00301; ram[36] = 20'h00102; ram[35] = 20'h02122; ram[34] = 20'h02021; ram[33] = 20'h00301; ram[32] = 20'h00102; ram[31] = 20'h02222; ram[30] = 20'h04001; ram[29] = 20'h00342; ram[28] = 20'h0232B; ram[27] = 20'h00900; ram[26] = 20'h00302; ram[25] = 20'h00102; ram[24] = 20'h04002; ram[23] = 20'h00900; ram[22] = 20'h08201; ram[21] = 20'h02023; ram[20] = 20'h00303; ram[19] = 20'h02433; ram[18] = 20'h00301; ram[17] = 20'h04004; ram[16] = 20'h00301; ram[15] = 20'h00102; ram[14] = 20'h02137; ram[13] = 20'h02036; ram[12] = 20'h00301; ram[11] = 20'h00102; ram[10] = 20'h02237; ram[9] = 20'h04004; ram[8] = 20'h00304; ram[7] = 20'h04040; ram[6] = 20'h02500; ram[5] = 20'h02500; ram[4] = 20'h02500; ram[3] = 20'h0030D; ram[2] = 20'h02341; ram[1] = 20'h08201; ram[0] = 20'h0400D;end always @(posedge clk)begin if (we) ram[addr] <= di; dout <= ram[addr];end

endmodule

Page 146: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 146UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

ブロック RAM の初期化のコード例 (VHDL)

ファ イル名: rams_sp_rom.vhd

-- Initializing Block RAM (Single-Port Block RAM)-- File: rams_sp_rom.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity rams_sp_rom is port( clk : in std_logic; we : in std_logic; addr : in std_logic_vector(5 downto 0); di : in std_logic_vector(19 downto 0); do : out std_logic_vector(19 downto 0) );end rams_sp_rom;

architecture syn of rams_sp_rom is type ram_type is array (63 downto 0) of std_logic_vector(19 downto 0); signal RAM : ram_type := (X"0200A", X"00300", X"08101", X"04000", X"08601", X"0233A", X"00300", X"08602", X"02310", X"0203B", X"08300", X"04002", X"08201", X"00500", X"04001", X"02500", X"00340", X"00241", X"04002", X"08300", X"08201", X"00500", X"08101", X"00602", X"04003", X"0241E", X"00301", X"00102", X"02122", X"02021", X"00301", X"00102", X"02222", X"04001", X"00342", X"0232B", X"00900", X"00302", X"00102", X"04002", X"00900", X"08201", X"02023", X"00303", X"02433", X"00301", X"04004", X"00301", X"00102", X"02137", X"02036", X"00301", X"00102", X"02237", X"04004", X"00304", X"04040", X"02500", X"02500", X"02500", X"0030D", X"02341", X"08201", X"0400D");

begin process(clk) begin if rising_edge(clk) then if we = '1' then RAM(to_integer(unsigned(addr))) <= di; end if; do <= RAM(to_integer(unsigned(addr))); end if; end process;

end syn;

Page 147: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 147UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

外部データ ファイルからのブロック RAM 初期化のコード例 (Verilog)

ファ イル名: rams_init_file.v

// Initializing Block RAM from external data file// Binary data// File: rams_init_file.v

module rams_init_file (clk, we, addr, din, dout);input clk;input we;input [5:0] addr;input [31:0] din;output [31:0] dout;

reg [31:0] ram [0:63];reg [31:0] dout;

initial begin$readmemb("rams_init_file.data",ram);end

always @(posedge clk)begin if (we) ram[addr] <= din; dout <= ram[addr];end endmodule

注記: RAM の初期化に使用する外部ファイルは、 ビッ ト ベクター形式である必要があ り ます。 整数または 16 進数形

式の外部ファイルは機能しません。

外部データ ファイルからのブロック RAM 初期化のコード例 (VHDL)

ファ イル名: rams_init_file.vhd

-- Initializing Block RAM from external data file-- File: rams_init_file.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;use std.textio.all;

entity rams_init_file is port( clk : in std_logic; we : in std_logic; addr : in std_logic_vector(5 downto 0); din : in std_logic_vector(31 downto 0); dout : out std_logic_vector(31 downto 0) );end rams_init_file;

architecture syn of rams_init_file is type RamType is array (0 to 63) of bit_vector(31 downto 0);

Page 148: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 148UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

impure function InitRamFromFile(RamFileName : in string) return RamType is FILE RamFile : text is in RamFileName; variable RamFileLine : line; variable RAM : RamType; begin for I in RamType'range loop readline(RamFile, RamFileLine); read(RamFileLine, RAM(I)); end loop; return RAM; end function;

signal RAM : RamType := InitRamFromFile("rams_init_file.data");begin process(clk) begin if clk'event and clk = '1' then if we = '1' then RAM(to_integer(unsigned(addr))) <= to_bitvector(din); end if; dout <= to_stdlogicvector(RAM(to_integer(unsigned(addr)))); end if; end process;

end syn;

注記: RAM の初期化に使用する外部ファイルは、 ビッ ト ベクター形式である必要があ り ます。 整数または 16 進数形

式の外部ファイルは機能しません。

3D RAM の推論

3D 配列を使用する RAM次に、 3D 配列を使用する RAM の推論例を示します。

シングル ポート 3D RAM の推論 (Verilog)

ファ イル名: rams_sp_3d.sv

// 3-D Ram Inference Example (Single port) // File:rams_sp_3d.svmodule rams_sp_3d #( parameter NUM_RAMS = 2, A_WID = 10, D_WID = 32 ) ( input clk, input [NUM_RAMS-1:0] we, input [NUM_RAMS-1:0] ena, input [A_WID-1:0] addr [NUM_RAMS-1:0],

Page 149: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 149UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

input [D_WID-1:0] din [NUM_RAMS-1:0], output reg [D_WID-1:0] dout [NUM_RAMS-1:0] );

reg [D_WID-1:0] mem [NUM_RAMS-1:0][2**A_WID-1:0];genvar i;

generatefor(i=0;i<NUM_RAMS;i=i+1)begin:u always @ (posedge clk) begin if (ena[i]) begin if(we[i]) begin mem[i][addr[i]] <= din[i]; end dout[i] <= mem[i][addr[i]]; end endendendgenerate

endmodule

シングル ポート 3D RAM の推論 (VHDL)

ファ イル名: ram_sp_3d.vhd

-- 3-D Ram Inference Example (Single port) -- Compile this file in VHDL2008 mode-- File:rams_sp_3d.vhd

library ieee;use ieee.std_logic_1164.all;package mypack is type myarray_t is array(integer range<>) of std_logic_vector; type mem_t is array(integer range<>) of myarray_t;end package;

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;use work.mypack.all;entity rams_sp_3d is generic ( NUM_RAMS : integer := 2; A_WID : integer := 10; D_WID : integer := 32 ); port ( clk : in std_logic; we : in std_logic_vector(NUM_RAMS-1 downto 0); ena : in std_logic_vector(NUM_RAMS-1 downto 0); addr : in myarray_t(NUM_RAMS-1 downto 0)(A_WID-1 downto 0); din : in myarray_t(NUM_RAMS-1 downto 0)(D_WID-1 downto 0); dout : out myarray_t(NUM_RAMS-1 downto 0)(D_WID-1 downto 0) );end rams_sp_3d;

architecture arch of rams_sp_3d is

Page 150: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 150UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

signal mem : mem_t(NUM_RAMS-1 downto 0)(2**A_WID-1 downto 0)(D_WID-1 downto 0);beginprocess(clk)begin if(clk’event and clk=’1’) then for i in 0 to NUM_RAMS-1 loop if(ena(i) = ‘1’) then if(we(i) = ‘1’) then mem(i)(to_integer(unsigned(addr(i)))) <= din(i); end if; dout(i) <= mem(i)(to_integer(unsigned(addr(i)))); end if; end loop; end if;end process;

end arch;

シンプル デュアル ポート 3D RAM の推論 (Verilog)

ファ イル名: rams_sdp_3d.sv

// 3-D Ram Inference Example (Simple Dual port) // File:rams_sdp_3d.svmodule rams_sdp_3d #( parameter NUM_RAMS = 2, A_WID = 10, D_WID = 32 ) ( input clka, input clkb, input [NUM_RAMS-1:0] wea, input [NUM_RAMS-1:0] ena, input [NUM_RAMS-1:0] enb, input [A_WID-1:0] addra [NUM_RAMS-1:0], input [A_WID-1:0] addrb [NUM_RAMS-1:0], input [D_WID-1:0] dina [NUM_RAMS-1:0], output reg [D_WID-1:0] doutb [NUM_RAMS-1:0] );

reg [D_WID-1:0] mem [NUM_RAMS-1:0][2**A_WID-1:0];// PORT_Agenvar i;generate for(i=0;i<NUM_RAMS;i=i+1) begin:port_a_ops always @ (posedge clka) begin if (ena[i]) begin if(wea[i]) begin mem[i][addra[i]] <= dina[i]; end end end endendgenerate

Page 151: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 151UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

//PORT_Bgenerate for(i=0;i<NUM_RAMS;i=i+1) begin:port_b_ops always @ (posedge clkb) begin if (enb[i]) doutb[i] <= mem[i][addrb[i]]; end endendgenerate

endmodule

シンプル デュアル ポート 3D RAM の推論 (VHDL)

ファ イル名: rams_sdp_3d.vhd

-- 3-D Ram Inference Example ( Simple Dual port) -- Compile this file in VHDL2008 mode-- File:rams_sdp_3d.vhd

library ieee;use ieee.std_logic_1164.all;package mypack is type myarray_t is array(integer range<>) of std_logic_vector; type mem_t is array(integer range<>) of myarray_t;end package;

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;use work.mypack.all;entity rams_sdp_3d is generic ( NUM_RAMS : integer := 2; A_WID : integer := 10; D_WID : integer := 32 ); port ( clka : in std_logic; clkb : in std_logic; wea : in std_logic_vector(NUM_RAMS-1 downto 0); ena : in std_logic_vector(NUM_RAMS-1 downto 0); enb : in std_logic_vector(NUM_RAMS-1 downto 0); addra : in myarray_t(NUM_RAMS-1 downto 0)(A_WID-1 downto 0); addrb : in myarray_t(NUM_RAMS-1 downto 0)(A_WID-1 downto 0); dina : in myarray_t(NUM_RAMS-1 downto 0)(D_WID-1 downto 0); doutb : out myarray_t(NUM_RAMS-1 downto 0)(D_WID-1 downto 0) );end rams_sdp_3d;

architecture arch of rams_sdp_3d issignal mem : mem_t(NUM_RAMS-1 downto 0)(2**A_WID-1 downto 0)(D_WID-1 downto 0);beginprocess(clka)begin if(clka'event and clka='1') then for i in 0 to NUM_RAMS-1 loop if(ena(i) = '1') then if(wea(i) = '1') then

Page 152: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 152UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

mem(i)(to_integer(unsigned(addra(i)))) <= dina(i); end if; end if; end loop; end if;end process;

process(clkb)begin if(clkb'event and clkb='1') then for i in 0 to NUM_RAMS-1 loop if(enb(i) = '1') then doutb(i) <= mem(i)(to_integer(unsigned(addrb(i)))); end if; end loop; end if;end process;

end arch;

完全なデュアル ポート 3D RAM の推論 (Verilog)

ファ イル名: rams_tdp_3d.sv

// 3-D Ram Inference Example (True Dual port) // File:rams_tdp_3d.svmodule rams_tdp_3d #( parameter NUM_RAMS = 2, A_WID = 10, D_WID = 32 ) ( input clka, input clkb, input [NUM_RAMS-1:0] wea, input [NUM_RAMS-1:0] web, input [NUM_RAMS-1:0] ena, input [NUM_RAMS-1:0] enb, input [A_WID-1:0] addra [NUM_RAMS-1:0], input [A_WID-1:0] addrb [NUM_RAMS-1:0], input [D_WID-1:0] dina [NUM_RAMS-1:0], input [D_WID-1:0] dinb [NUM_RAMS-1:0], output reg [D_WID-1:0] douta [NUM_RAMS-1:0], output reg [D_WID-1:0] doutb [NUM_RAMS-1:0] );

reg [D_WID-1:0] mem [NUM_RAMS-1:0][2**A_WID-1:0];// PORT_Agenvar i;generate for(i=0;i<NUM_RAMS;i=i+1) begin:port_a_ops always @ (posedge clka) begin if (ena[i]) begin if(wea[i]) begin

Page 153: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 153UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

mem[i][addra[i]] <= dina[i]; end douta[i] <= mem[i][addra[i]]; end end endendgenerate

//PORT_Bgenerate for(i=0;i<NUM_RAMS;i=i+1) begin:port_b_ops always @ (posedge clkb) begin if (enb[i]) begin if(web[i]) begin mem[i][addrb[i]] <= dinb[i]; end doutb[i] <= mem[i][addrb[i]]; end end endendgenerate

endmodule

構造化型およびレコード型を使用した RAM の推論

シングル ポート構造化型 RAM の推論 (Verilog)

ファ イル名: rams_sdp_struct.sv

// RAM Inference using Struct in SV(Simple Dual port) // File:rams_sdp_struct.svtypedef struct packed { logic [3:0] addr; logic [27:0] data; } Packet;

module rams_sdp_struct #( parameter A_WID = 10, D_WID = 32 ) ( input clk, input we, input ena, input [A_WID-1:0] raddr, waddr, input Packet din, output Packet dout );

Page 154: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 154UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

Packet mem [2**A_WID-1:0];

always @ (posedge clk)begin if (ena) begin if(we) mem[waddr] <= din; end end

always @ (posedge clk)begin if (ena) begin dout <= mem[raddr]; end endendmodule

シングル ポート構造化型 RAM の推論 (VHDL)

ファ イル名: rams_sp_record.vhd

-- Ram Inference Example using Records (Single port) -- File:rams_sp_record.vhd

library ieee;use ieee.std_logic_1164.all;package mypack is type Packet is record addr : std_logic_vector(3 downto 0); data : std_logic_vector(27 downto 0); end record Packet; type mem_t is array(integer range<>) of Packet;end package;

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;use work.mypack.all;entity rams_sp_record is generic ( A_WID : integer := 10; D_WID : integer := 32 ); port ( clk : in std_logic; we : in std_logic; ena : in std_logic; addr : in std_logic_vector(A_WID-1 downto 0); din : in Packet; dout : out Packet );end rams_sp_record;

architecture arch of rams_sp_record issignal mem : mem_t(2**A_WID-1 downto 0);beginprocess(clk)

Page 155: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 155UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

begin if(clk'event and clk='1') then if(ena = '1') then if(we = '1') then mem(to_integer(unsigned(addr))) <= din; end if; dout <= mem(to_integer(unsigned(addr))); end if; end if;end process;

end arch;

シンプル デュアル ポート構造化型 RAM の推論 (SystemVerilog)

ファ イル名: rams_sdp_struct.sv

// RAM Inference using Struct in SV(Simple Dual port) // File:rams_sdp_struct.svtypedef struct packed { logic [3:0] addr; logic [27:0] data; } Packet;

module rams_sdp_struct #( parameter A_WID = 10, D_WID = 32 ) ( input clk, input we, input ena, input [A_WID-1:0] raddr, waddr, input Packet din, output Packet dout );

Packet mem [2**A_WID-1:0];

always @ (posedge clk)begin if (ena) begin if(we) mem[waddr] <= din; end end

always @ (posedge clk)begin if (ena) begin dout <= mem[raddr]; end endendmodule

Page 156: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 156UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

シンプル デュアル ポート レコード型 RAM の推論 (VHDL)

ファ イル名: rams_sdp_record.vhd

-- Ram Inference Example using Records (Simple Dual port) -- File:rams_sdp_record.vhd

library ieee;use ieee.std_logic_1164.all;package mypack is type Packet is record addr : std_logic_vector(3 downto 0); data : std_logic_vector(27 downto 0); end record Packet; type mem_t is array(integer range<>) of Packet;end package;

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;use work.mypack.all;entity rams_sdp_record is generic ( A_WID : integer := 10; D_WID : integer := 32 ); port ( clk : in std_logic; we : in std_logic; ena : in std_logic; raddr : in std_logic_vector(A_WID-1 downto 0); waddr : in std_logic_vector(A_WID-1 downto 0); din : in Packet; dout : out Packet );end rams_sdp_record;

architecture arch of rams_sdp_record issignal mem : mem_t(2**A_WID-1 downto 0);beginprocess(clk)begin if(clk'event and clk='1') then if(ena = '1') then if(we = '1') then mem(to_integer(unsigned(waddr))) <= din; end if; end if; end if;end process;

process(clk)begin if(clk'event and clk='1') then if(ena = '1') then dout <= mem(to_integer(unsigned(raddr))); end if; end if;end process;

Page 157: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 157UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

end arch;

完全なデュアル ポート構造型 RAM の推論 (SystemVerilog)

ファ イル名: rams_tdp_struct.sv

// RAM Inference using Struct in SV(True Dual port) // File:rams_tdp_struct.svtypedef struct packed { logic [3:0] addr; logic [27:0] data; } Packet;

module rams_tdp_struct #( parameter A_WID = 10, D_WID = 32 ) ( input clka, input clkb, input wea, input web, input ena, input enb, input [A_WID-1:0] addra, input [A_WID-1:0] addrb, input Packet dina, dinb, output Packet douta, doutb );

Packet mem [2**A_WID-1:0];

always @ (posedge clka)begin if (ena) begin douta <= mem[addra]; if(wea) mem[addra] <= dina; end end

always @ (posedge clkb)begin if (enb) begin doutb <= mem[addrb]; if(web) mem[addrb] <= dinb; end end

endmodule

Page 158: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 158UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

完全なデュアル ポート レコード型 RAM の推論 (VHDL)

ファ イル名: rams_tdp_record.vhd

-- Ram Inference Example using Records (True Dual port) -- File:rams_tdp_record.vhd

library ieee;use ieee.std_logic_1164.all;package mypack is type Packet is record addr : std_logic_vector(3 downto 0); data : std_logic_vector(27 downto 0); end record Packet; type mem_t is array(integer range<>) of Packet;end package;

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;use work.mypack.all;entity rams_tdp_record is generic ( A_WID : integer := 10; D_WID : integer := 32 ); port ( clka : in std_logic; clkb : in std_logic; wea : in std_logic; web : in std_logic; ena : in std_logic; enb : in std_logic; addra : in std_logic_vector(A_WID-1 downto 0); addrb : in std_logic_vector(A_WID-1 downto 0); dina : in Packet; dinb : in Packet; douta : out Packet; doutb : out Packet );end rams_tdp_record;

architecture arch of rams_tdp_record issignal mem : mem_t(2**A_WID-1 downto 0);begin

process(clka)begin if(clka'event and clka='1') then if(ena = '1') then douta <= mem(to_integer(unsigned(addra))); if(wea = '1') then mem(to_integer(unsigned(addra))) <= dina; end if; end if; end if;end process;

Page 159: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 159UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

process(clkb)begin if(clkb'event and clkb='1') then if(enb = '1') then doutb <= mem(to_integer(unsigned(addrb))); if(web = '1') then mem(to_integer(unsigned(addrb))) <= dinb; end if; end if; end if;end process;

end arch;

ブラック ボックス

デザインには、 次で生成された EDIF ファ イルを含めるこ とができます。

• 合成ツール

• 回路図テキス ト エディ ター

• その他のデザイン入力方法

これらのモジュールをデザインのほかの部分に接続するには、 インスタンシエートする必要があ り ます。

HDL ソース コードでブラ ッ ク ボッ クス インスタンシエーシ ョ ンを使用します。

Vivado 合成では、 これらのブラ ッ ク ボッ クス インスタンシエーシ ョ ンに制約を適用できます。

デザインをブラ ッ ク ボッ クスにする と、 そのデザインのほかのインスタンスもブラ ッ ク ボッ クスになり ます。

コード例のファイルは、 この リ ンクからダウンロードできます。

Page 160: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 160UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

ブラ ック ボックスの例 (Verilog)ファ イル名: black_box_1.v

// Black Box// black_box_1.v// (* black_box *) module black_box1 (in1, in2, dout);input in1, in2;output dout;endmodule

module black_box_1 (DI_1, DI_2, DOUT);input DI_1, DI_2;output DOUT;

black_box1 U1 ( .in1(DI_1), .in2(DI_2), .dout(DOUT) );

endmodule

ブラック ボックスの例 (VHDL)ファ イル名: black_box_1.vhd

-- Black Box-- black_box_1.vhdlibrary ieee;use ieee.std_logic_1164.all;

entity black_box_1 is port(DI_1, DI_2 : in std_logic; DOUT : out std_logic);end black_box_1;architecture rtl of black_box_1 is component black_box1 port(I1 : in std_logic; I2 : in std_logic; O : out std_logic); end component;

attribute black_box : string; attribute black_box of black_box1 : component is "yes";

begin U1 : black_box1 port map(I1 => DI_1, I2 => DI_2, O => DOUT);end rtl;

Page 161: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 161UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

FSM コンポーネン ト

Vivado 合成の機能

• 同期有限ステート マシン (FSM) コンポーネン トに特定の推論機能。

• 最適化の目標に対応したビルト イン FSM エンコード ス ト ラテジ。

• FSM 抽出はデフォルトでイネーブル。

• FSM 抽出をディ スエーブルにするには -fsm_extraction off を使用。

FSM 記述

Vivado 合成では、 ムーア型と ミーリー型の両方の有限ステート マシン (FSM) がサポート されます。 FSM には、 次が

含まれます。

• ステート レジスタ

• 次ステート関数

• 出力関数

FSM の図

次に、 ミーリー型マシンとムーア型マシンを組み込んだ FSM の図を示します。

次に、 3 つのプロセスを使用した FSM の図を示します。

X-Ref Target - Figure 4-3

図 4-3: ミーリー型マシンとムーア型マシンを組み込んだ FSM

 

X-Ref Target - Figure 4-4

図 4-4: 3 つのプロセスを使用した FSM

 

Page 162: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 162UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

FSM レジスタ • リ セッ ト または電源投入ステート を指定して有限ステート マシン (FSM) を認識させるか、 FSM_ENCODING を

"none" に設定します。

• ステート レジスタは、 特定のステートに対して非同期または同期にリセッ トできます。

推奨: FSM には、 非同期リセッ ト ロジッ ク よ り も同期リセッ ト ロジッ クを使用するこ とをお勧めします。

自動ステート エンコード

FSM_ENCODING を "auto" に設定する と、 Vivado 合成で各 FSM に最適なエンコード方法が自動的に選択されます。

ワンホッ ト ステート エンコード

ワンホッ ト ステート エンコードには、 次のよ うな特徴があ り ます。

• 32 ステート までのステート マシンのデフォルト エンコード方法です。

• 速度を最適化したり、 消費電力を削減する場合に適しています。

• 各 FSM ステートにコードの各ビッ トが割り当てられます。

• 各ステートに 1 つのフ リ ップフロ ップを使用したステート レジスタをインプリ メン ト します。

• 1 つのクロ ッ ク サイクルで 1 つのステート レジスタのみがアサート されます。

• 2 つのステート間を遷移する際、 2 つのビッ トのみが ト グルします。

グレイ ステート エンコード

グレイ ステート エンコードには、 次のよ うな特徴があ り ます。

• 連続した 2 つのステート間では、 1 ビッ ト しか切り替わり ません。

• 分岐のない長いパスを持つコン ト ローラーに適しています。

• ハザードやグ リ ッチを最小限に抑えます。

• 消費電力を最小限に抑えるために使用できます。

ジ ョ ンソン ステート エンコード

ジ ョ ンソン ステート エンコードは、 グレイ ステート エンコード と同様、 分岐のない長いパスを含むステート マシ

ンに適しています。

シーケンシャル ステート エンコード

シーケンシャル ステート エンコードには、 次のよ うな特徴があ り ます。

• 長いパスを識別します。

• これらのパスのステートに連続する基数コードを 2 つ適用します。

• 次ステートの論理式を最小限に抑えます。

Page 163: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 163UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

FSM の例 (Verilog)

ファ イル名: fsm_1.v

// State Machine with single sequential block//fsm_1.vmodule fsm_1(clk,reset,flag,sm_out);input clk,reset,flag;output reg sm_out;

parameter s1 = 3'b000;parameter s2 = 3'b001;parameter s3 = 3'b010;parameter s4 = 3'b011;parameter s5 = 3'b111;

reg [2:0] state;

always@(posedge clk) begin if(reset) begin state <= s1; sm_out <= 1'b1; end else begin case(state) s1: if(flag) begin state <= s2; sm_out <= 1'b1; end else begin state <= s3; sm_out <= 1'b0; end s2: begin state <= s4; sm_out <= 1'b0; end s3: begin state <= s4; sm_out <= 1'b0; end s4: begin state <= s5; sm_out <= 1'b1; end s5: begin state <= s1; sm_out <= 1'b1; end endcase end endendmodule

1 つのシーケンシャル ブロックを使用する FSM のコード例 (VHDL)

ファ イル名: fsm_1.vhd

-- State Machine with single sequential block-- File: fsm_1.vhdlibrary IEEE;use IEEE.std_logic_1164.all;

entity fsm_1 is

Page 164: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 164UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

port( clk, reset, flag : IN std_logic; sm_out : OUT std_logic );end entity;

architecture behavioral of fsm_1 is type state_type is (s1, s2, s3, s4, s5); signal state : state_type;begin process(clk) begin if rising_edge(clk) then if (reset = '1') then state <= s1; sm_out <= '1';

else case state is when s1 => if flag = '1' then state <= s2; sm_out <= '1';

else state <= s3; sm_out <= '0';

end if; when s2 => state <= s4; sm_out <= '0'; when s3 => state <= s4; sm_out <= '0'; when s4 => state <= s5; sm_out <= '1'; when s5 => state <= s1; sm_out <= '1'; end case; end if; end if; end process;

end behavioral;

FSM のレポート

Vivado 合成では、 有限ステート マシン (FSM) コンポーネン トおよびそのエンコードに関する情報が、 ログ ファ イル

に情報メ ッセージと して表示されます。 次に、 メ ッセージの例を示します。

INFO: [Synth 8-802] inferred FSM for state register 'state_reg' in module 'fsm_test'INFO: [Synth 8-3354] encoded FSM with state register 'state_reg' using encoding 'sequential' in module 'fsm_test'

ROM の HDL コーディング手法

読み出し専用メモ リ (ROM) は、 HDL 記述およびインプリ メンテーシ ョ ンの点ではランダム アクセス メモ リ (RAM) と類似しています。ブロ ッ ク RAM リ ソースに適切にレジスタ付きの ROM をインプリ メン トするには、ROM_STYLE 属性を使用します。 詳細は、 「ROM_STYLE」 を参照してください。

Page 165: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 165UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

ブロック RAM リソースを使用した ROM のコード例 (Verilog)ファ イル名: rams_sp_rom_1.v

// ROMs Using Block RAM Resources.

// File: rams_sp_rom_1.v

//

module rams_sp_rom_1 (clk, en, addr, dout);

input clk;

input en;

input [5:0] addr;

output [19:0] dout;

(*rom_style = "block" *) reg [19:0] data;

always @(posedge clk)

begin

if (en)

case(addr)

6'b000000: data <= 20'h0200A; 6'b100000: data <= 20'h02222;

6'b000001: data <= 20'h00300; 6'b100001: data <= 20'h04001;

6'b000010: data <= 20'h08101; 6'b100010: data <= 20'h00342;

6'b000011: data <= 20'h04000; 6'b100011: data <= 20'h0232B;

6'b000100: data <= 20'h08601; 6'b100100: data <= 20'h00900;

6'b000101: data <= 20'h0233A; 6'b100101: data <= 20'h00302;

6'b000110: data <= 20'h00300; 6'b100110: data <= 20'h00102;

6'b000111: data <= 20'h08602; 6'b100111: data <= 20'h04002;

6'b001000: data <= 20'h02310; 6'b101000: data <= 20'h00900;

6'b001001: data <= 20'h0203B; 6'b101001: data <= 20'h08201;

6'b001010: data <= 20'h08300; 6'b101010: data <= 20'h02023;

6'b001011: data <= 20'h04002; 6'b101011: data <= 20'h00303;

6'b001100: data <= 20'h08201; 6'b101100: data <= 20'h02433;

6'b001101: data <= 20'h00500; 6'b101101: data <= 20'h00301;

6'b001110: data <= 20'h04001; 6'b101110: data <= 20'h04004;

6'b001111: data <= 20'h02500; 6'b101111: data <= 20'h00301;

6'b010000: data <= 20'h00340; 6'b110000: data <= 20'h00102;

6'b010001: data <= 20'h00241; 6'b110001: data <= 20'h02137;

6'b010010: data <= 20'h04002; 6'b110010: data <= 20'h02036;

6'b010011: data <= 20'h08300; 6'b110011: data <= 20'h00301;

6'b010100: data <= 20'h08201; 6'b110100: data <= 20'h00102;

6'b010101: data <= 20'h00500; 6'b110101: data <= 20'h02237;

6'b010110: data <= 20'h08101; 6'b110110: data <= 20'h04004;

6'b010111: data <= 20'h00602; 6'b110111: data <= 20'h00304;

6'b011000: data <= 20'h04003; 6'b111000: data <= 20'h04040;

6'b011001: data <= 20'h0241E; 6'b111001: data <= 20'h02500;

6'b011010: data <= 20'h00301; 6'b111010: data <= 20'h02500;

6'b011011: data <= 20'h00102; 6'b111011: data <= 20'h02500;

6'b011100: data <= 20'h02122; 6'b111100: data <= 20'h0030D;

6'b011101: data <= 20'h02021; 6'b111101: data <= 20'h02341;

6'b011110: data <= 20'h00301; 6'b111110: data <= 20'h08201;

6'b011111: data <= 20'h00102; 6'b111111: data <= 20'h0400D;

endcase

end

assign dout = data;

endmodule

Page 166: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 166UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 4 章: HDL コーディング手法

配列に対する ROM の推論 (VHDL)ファ イル名: roms_1.vhd

-- ROM Inference on array-- File: roms_1.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity roms_1 is port( clk : in std_logic; en : in std_logic; addr : in std_logic_vector(5 downto 0); data : out std_logic_vector(19 downto 0) );end roms_1;

architecture behavioral of roms_1 is type rom_type is array (63 downto 0) of std_logic_vector(19 downto 0); signal ROM : rom_type := (X"0200A", X"00300", X"08101", X"04000", X"08601", X"0233A",X"00300", X"08602", X"02310", X"0203B", X"08300", X"04002",X"08201", X"00500", X"04001", X"02500", X"00340", X"00241", X"04002", X"08300",

X"08201", X"00500" X"08101", X"00602", X"04003", X"0241E", X"00301", X"00102", X"02122", X"02021", X"00301", X"00102", X"02222", X"04001", X"00342", X"0232B", X"00900", X"00302", X"00102", X"04002", X"00900", X"08201", X"02023", X"00303", X"02433", X"00301", X"04004" X"00301",X"00102", X"02137", X"02036", X"00301", X"00102", X"02237",X"04004", X"00304", X"04040", X"02500", X"02500", X"02500",X"0030D", X"02341", X"08201", X"0400D"); attribute rom_style : string; attribute rom_style of ROM : signal is "block";

begin process(clk) begin if rising_edge(clk) then if (en = '1') then data <= ROM(conv_integer(addr)); end if; end if; end process;

end behavioral;

Page 167: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 167UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章

VHDL サポート

概要

この章では、 Vivado® 合成でサポート される VHDL の構文と例外を示します。

VHDL では、 複雑なロジッ クを簡潔に記述でき、 次が可能です。

• システムをサブシステムに分割する方法や、 分割されたサブシステムを相互接続する方法など、 システムの構

造を記述できます。

• 使い慣れた言語形式でシステムの機能を指定できます。

• インプリ メンテーシ ョ ンおよびハードウェアへのプログラム前にシステム デザインをシ ミ ュレーシ ョ ンできま

す。

• 抽象的な記述から、 合成してデバイス特定の詳細なデザイン バージ ョ ンを生成できます。

詳細は、 『IEEE Standard VHDL Language Reference Manual』 (LRM) を参照してください。

サポート される VHDL データ型とサポート されない VHDL データ型

一部の VHDL データ型は、 定義済みパッケージの一部です。 それらのコンパイル場所および読み込み方法は、

「VHDL の定義済みパッケージ」 を参照してください。

データ型は IEEE std_logic_1164 パッケージで定義されています。

サポート されないデータ型

VHDL では、 標準パッケージの real 型は、 ジェネ リ ッ ク値の計算など、 計算を実行する目的でのみサポート されま

す。

重要: real 型の合成可能オブジェク ト を定義するこ とはできません。

Page 168: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 168UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

VHDL データ型

VHDL の定義済み列挙型

Vivado 合成では、 次の表に示す定義済み VHDL 列挙型がサポート されます。

std_logic に使用可能な値

サポート されるオーバーロード列挙型

表 5-1: VHDL 列挙型のサマリ

列挙型 定義されているパッケージ 有効な値

bit 標準パッケージ 0 (論理 0)

1 (論理 1)

boolean 標準パッケージ false

true

std_logic IEEE std_logic_1164 パッケージ 「std_logic に使用可能な値」 を

参照してください。

表 5-2: std_logic に使用可能な値

値 説明 Vivado 合成での処理

U 初期化 Vivado 合成では使用不可

X 不定 ドン ト ケアと して処理

0 Low ロジッ ク 0 と して処理

1 High ロジッ ク 1 と して処理

Z ハイ インピーダンス ハイ インピーダンス と して処理

W 弱い信号の不定 Vivado 合成では使用不可

L 弱い信号の Low 0 と同様に処理

H 弱い信号の High 1 と同様に処理

- ドン ト ケア ドン ト ケアと して処理

表 5-3: サポート されるオーバーロード列挙型

データ型定義されている IEEE パッ

ケージ上位型 含まれる値

std_ulogic std_logic_1164 なし std_logic の値と同じ

定義済み分解関数は含ま

れない

X01 std_logic_1164 std_ulogic X、 0、 1

X01Z std_logic_1164 std_ulogic X、 0、 1、 Z

UX01 std_logic_1164 std_ulogic U、 X、 0、 1

UX01Z std_logic_1164 std_ulogic U、 X、 0、 Z

Page 169: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 169UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

VHDL のユーザー定義の列挙型

ユーザー独自の列挙型を作成できます。 ユーザー定義の列挙型は通常、 有限ステート マシン (FSM) のステート を記

述するのに使用されます。

VHDL ユーザー定義の列挙型のコード例

type STATES is (START, IDLE, STATE1, STATE2, STATE3) ;

サポート される VHDL データ型

VHDL の整数型

整数型は定義済みの VHDL 型です。 Vivado 合成では、 整数はデフォルトで 32 ビッ トにインプリ メン ト されます。 次

のよ うに適用される範囲を明確に定義する と、 インプ リ メンテーシ ョ ンをさ らにコンパク トにできます。

type MSB is range 8 to 15

また、 定義済みの自然数型および正型を利用して、 整数型をオーバーロードするこ と もできます。

VHDL の多次元配列型

Vivado 合成では、 VHDL の多次元配列がサポート されます。

推奨: 次元数に制限はあ り ませんが、 3 次元を超えないよ うに記述してください。

多次元配列型のオブジェク トは、 関数に渡したり、 コンポーネン ト インスタンシエーシ ョ ンで使用できます。 記述

可能な多次元配列のオブジェク トは、 信号、 定数、 変数です。

完全に制約された配列型のコード例

配列型は、 すべての次元で完全に制約する必要があ り ます。

subtype WORD8 is STD_LOGIC_VECTOR (7 downto 0);type TAB12 is array (11 downto 0) of WORD8;type TAB03 is array (2 downto 0) of TAB12;

表 5-4: サポート される VHDL のビッ ト ベクター型

データ型 定義されているパッケージ モデル

bit_vector 標準 ビッ ト要素のベクター

std_logic_vector IEEE std_logic_1164 std_logic 要素のベクター

表 5-5: サポート される VHDL のオーバーロード型

データ型 定義されている IEEE パッケージ

std_ulogic_vector std_logic_1164

unsigned numeric_std

signed numeric_std

unsigned std_logic_arith (Synopsys)

signed std_logic_arith (Synopsys)

Page 170: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 170UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

マ ト リ ッ クスとして宣言された配列のコード例

配列をマ ト リ ッ クス と して宣言できます。

subtype TAB13 is array (7 downto 0,4 downto 0) of STD_LOGIC_VECTOR (8 downto 0);

多次元配列の信号および変数のコード例

次に、 代入文で多次元配列の信号および変数を使用するコード例を示します。

1. 次のよ うに宣言する と します。

subtype WORD8 is STD_LOGIC_VECTOR (7 downto 0);type TAB05 is array (4 downto 0) of WORD8;type TAB03 is array (2 downto 0) of TAB05;signal WORD_A : WORD8;signal TAB_A, TAB_B : TAB05;signal TAB_C, TAB_D : TAB03;constant CNST_A : TAB03 := (("00000000","01000001","01000010","10000011","00001100"),("00100000","00100001","00101010","10100011","00101100"),("01000010","01000010","01000100","01000111","01000100"));

2. これで次を指定できるよ うにな り ます。

° 多次元配列の信号または変数:

TAB_A <= TAB_B; TAB_C <= TAB_D; TAB_C <= CNST_A;

° 1 配列のインデッ クス :

TAB_A (5) <= WORD_A; TAB_C (1) <= TAB_A;

° 最大次元数のインデッ クス :

TAB_A (5) (0) <= ’1’; TAB_C (2) (5) (0) <= ’0’

° 最初の配列のスライス :

TAB_A (4 downto 1) <= TAB_B (3 downto 0);

° 高次元配列のインデッ クス と低次元配列のスライス :

TAB_C (2) (5) (3 downto 0) <= TAB_B (3) (4 downto 1); TAB_D (0) (4) (2 downto 0)\\ <= CNST_A (5 downto 3)

3. 次の宣言を追加します。

subtype MATRIX15 is array(4 downto 0, 2 downto 0) of STD_LOGIC_VECTOR (7 downto 0);signal MATRIX_A : MATRIX15;

4. これで次を指定できるよ うにな り ます。

° 多次元配列の信号または変数:

MATRIXA <= CNST_A

° 配列の 1 行のインデッ クス :

MATRIXA (5) <= TAB_A;

° 最大次元数のインデッ クス :

MATRIXA (5,0) (0) <= ’1’;

注記: インデッ クスは、 変数にできます。

Page 171: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 171UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

VHDL レコード型のコード例

• レコード型のフ ィールド もレコード型にできます。

• 定数をレコード型にできます。

• レコード型に属性を含めるこ とはできません。

• Vivado 合成では、 レコード信号への集合体代入がサポート されます。

次に例を示します。

type mytype is record field1 : std_logic;field2 : std_logic_vector (3 downto 0);

end record;

VHDL オブジェク ト

VHDL オブジェク トには、 「信号」、 「変数」、 「定数」、 および 「演算子」 があ り ます。

信号

VHDL 信号は、 次で宣言できます。

• アーキテクチャ宣言部分: 宣言した VHDL 信号を、 そのアーキテクチャ内の任意の場所で使用します。

• ブロ ッ ク : 宣言した VHDL 信号を、 そのブロ ッ ク内で使用します。

VHDL 信号は、 信号代入演算子 「<=」 を使用して代入します。

signal sig1 : std_logic;sig1 <= ’1’;

変数

VHDL の変数は、 次のよ うに使用されます。

• process または subprogram で宣言します。

• その process または subprogram 内で使用されます。

• 代入演算子 「:=」 を使用して代入します。

variable var1 : std_logic_vector (7 downto 0); var1 := "01010011";

定数

VHDL 定数は、 宣言領域で宣言できます。 定数はその領域内で使用できます。 定数を宣言した後、 その値を変更す

るこ とはできません。

signal sig1 : std_logic_vector(5 downto 0);constant init0 : std_logic_vector (5 downto 0) := "010111";sig1 <= init0;

Page 172: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 172UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

演算子

Vivado 合成では、 VHDL の演算子がサポート されます。

シフ ト演算子の例

表 5-6: シフ ト演算子の例

演算子 例 論理上同一のコード

SLL (Shift Left Logic) sig1 <= A(4 downto 0) sll 2 sig1 <= A(2 downto 0) & "00";

SRL (Shift Right Logic) sig1 <= A(4 downto 0) srl 2 sig1 <= "00" & A(4 downto 2);

SLA (Shift Left Arithmetic) sig1 <= A(4 downto 0) sla 2 sig1 <= A(2 downto 0) & A(0) & A(0);

SRA (Shift Right Arithmetic) sig1 <= A(4 downto 0) sra 2 sig1 <= <= A(4) & A(4) & A(4 downto 2);

ROL (Rotate Left) sig1 <= A(4 downto 0) rol 2 sig1 <= A(2 downto 0) & A(4 downto 3);

ROR (Rotate Right) A(4 downto 0) ror 2 sig1 <= A(1 downto 0) & A(4 downto 2);

Page 173: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 173UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

VHDL のエンティテ ィ とアーキテクチャの記述

VHDL の回路記述

VHDL の回路記述 (デザイン ユニッ ト ) は、 次の部分で構成されています。

• エンティティ宣言: 回路の外部表示を提供します。 I/O ポートおよびジェネ リ ッ クなどの回路のインターフェイ

スを含む、 外側から見えるオブジェク ト を記述します。

• アーキテクチャ : 回路の内部表示を提供し、 回路の動作または構造を記述します。

VHDL のエンティテ ィ宣言

回路の I/O ポートはエンティティで宣言します。 各ポートに次を指定します。

• 名前

• モード (in、 out、 inout、 buffer)

• データ型

制約されたポート と制約されていないポート

ポート を定義する際、 ポートは次のよ うにな り ます。

• 制約を設定するこ と も しないこ と もできます。

• 通常は制約されます。

• エンティティ宣言部分では制約を設定しないままにできます。

° ポートに制約を設定しない場合は、 フォーマル ポート と実際の信号を接続する と きに、 インスタンシエー

シ ョ ンでポートの幅を定義します。

° ポートに制約を設定しない場合、 同じエンティティのインスタンシエーシ ョ ンを複数作成し、 異なるポー

ト幅を定義できます。

推奨: 制約の設定されていないポートは使用しないでください。 ジェネ リ ッ クを使用して制約したポート を定義しま

す。 インスタンシエーシ ョ ン時にこれらのジェネ リ ッ クに異なる値を適用します。 最上位エンティティには制約を

設定していないポート を含めないでください。

ポートには 2 次元以上の配列型は使用できません。

エンティティ宣言でも VHDL ジェネ リ ッ クを宣言できます。

Page 174: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 174UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

バッファー ポート モード

推奨: バッファー ポート モードは使用しないでください。

VHDL では信号が内部および出力ポート と して使用される (内部ド ライバーが 1 つしかない) 場合にバッファー ポー

ト モードが許容されますが、 バッファー ポートは合成中のエラーの原因となる可能性があ り、 合成後の結果をシ

ミ ュレーシ ョ ンで検証するのが困難になり ます。

バッファー ポート モードを使用したコード例 (推奨されない)

entity alu is port(CLK : in STD_LOGIC;A : inSTD_LOGIC_VECTOR(3 downto 0);B : inSTD_LOGIC_VECTOR(3 downto 0);C : buffer STD_LOGIC_VECTOR(3 downto 0));

end alu;

architecture behavioral of alu is beginprocess beginif rising_edge(CLK) thenC <= UNSIGNED(A) + UNSIGNED(B) UNSIGNED(C);

end if;end process;

end behavioral;

バッファー ポート モードを使用しないよう変更

推奨: バッファー ポート モードを使用している場合は、 変更して使用しないよ うにして ください。

上記のコード例では、 信号 C がバッファー モードで記述され、 内部および出力ポートの両方と して使用されており、

C に接続可能な階層レベルもすべてバッファーと して宣言する必要があ り ました。

バッファー モードを使用しないよ うに変更するには、 次の手順に従います。

1. ダ ミー信号を挿入します。

2. ポート C を出力と して宣言します。

Page 175: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 175UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

バッファー ポート モードを使用しないコード例 (推奨)

entity alu is port(CLK : in STD_LOGIC;A : in STD_LOGIC_VECTOR(3 downto 0);B : in STD_LOGIC_VECTOR(3 downto 0);C : out STD_LOGIC_VECTOR(3 downto 0));

end alu;architecture behavioral of alu is-- dummy signalsignal C_INT : STD_LOGIC_VECTOR(3 downto 0);

beginC <= C_INT;process beginif rising_edge(CLK) thenC_INT <= A and B and C_INT;

end if;end process;

end behavioral;

VHDL のアーキテクチャ宣言

アーキテクチャでは、 内部信号を宣言できます。 各内部信号には、 名前とデータ型を定義します。

VHDL のアーキテクチャ宣言のコード例

ibrary IEEE; use IEEE.std_logic_1164.all;

entity EXAMPLE is port ( A,B,C : in std_logic; D,E : out std_logic );

end EXAMPLE;

architecture ARCHI of EXAMPLE is signal T : std_logic;

begin ... end ARCHI;

Page 176: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 176UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

VHDL のコンポーネン ト インスタンシエーシ ョ ン

コンポーネン ト インスタンシエーシ ョ ンを使用する と、 1 つのデザイン ユニッ ト (コンポーネン ト ) を別のデザイン ユニッ ト内にインスタンシエート して、 階層構造デザインを記述できます。

コンポーネン ト インスタンシエーシ ョ ンを実行するには、 次の手順に従います。

1. インスタンシエートする機能を記述したデザイン ユニッ ト (エンティティ とアーキテクチャ ) を作成します。

2. 親デザイン ユニッ トのアーキテクチャの宣言部分にインスタンシエートするコンポーネン ト を宣言します。

3. 親デザイン ユニッ トのアーキテクチャの本体でこのコンポーネン ト をインスタンシエート して接続します。

4. コンポーネン トのフォーマル ポート を親デザイン ユニッ トの実際の信号およびポートにマップ (接続) します。

コンポーネン ト インスタンシエーシ ョ ン文の要素

Vivado 合成では、 コンポーネン ト宣言で制約されていないベクターがサポート されます。

コンポーネン ト インスタンシエーシ ョ ン文の主な要素は、 次のとおりです。

• ラベル: インスタンスを識別します。

• 関連付け リ ス ト : 予約語の port map キーワードで開始し、 コンポーネン トのフォーマル ポート を親デザイン ユニッ トの実際の信号またはポートに接続します。 オプシ ョ ンの関連付け リ ス トは予約語の generic map キーワードで開始し、 実際の値をコンポーネン トで定義されるフォーマル ジェネ リ ッ クに供給します。

コンポーネン ト インスタンシエーシ ョ ンのコード例

次に、 4 つの nand2 コンポーネン トから構成される半加算器の構造記述例を示します。

ファ イル名: instantiation_simple.vhd

---- A simple component instantiation example-- Involves a component declaration and the component instantiation itself---- instantiation_simple.vhd--entity sub is generic( WIDTH : integer := 4 ); port( A, B : in BIT_VECTOR(WIDTH - 1 downto 0); O : out BIT_VECTOR(2 * WIDTH - 1 downto 0) );end sub;

architecture archi of sub isbegin O <= A & B;end ARCHI;

entity instantiation_simple is generic( WIDTH : integer := 2); port(

Page 177: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 177UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

X, Y : in BIT_VECTOR(WIDTH - 1 downto 0); Z : out BIT_VECTOR(2 * WIDTH - 1 downto 0));end instantiation_simple;

architecture ARCHI of instantiation_simple is component sub -- component declaration generic( WIDTH : integer := 2); port( A, B : in BIT_VECTOR(WIDTH - 1 downto 0); O : out BIT_VECTOR(2 * WIDTH - 1 downto 0)); end component;

begin inst_sub : sub -- component instantiation generic map( WIDTH => WIDTH ) port map( A => X, B => Y, O => Z );

end ARCHI;

Page 178: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 178UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

再帰的なコンポーネン ト インスタンシエーシ ョ ン

Vivado 合成では、 再帰的なコンポーネン ト インスタンシエーシ ョ ンがサポート されます。

再帰的なコンポーネン ト インスタンシエーシ ョ ンのコード例

ファ イル名: instantiation_recursive.vhd

---- Recursive component instantiation---- instantiation_recursive.vhd--library ieee;use ieee.std_logic_1164.all;library unisim;use unisim.vcomponents.all;

entity instantiation_recursive is generic( sh_st : integer := 4 ); port( CLK : in std_logic; DI : in std_logic; DO : out std_logic );end entity instantiation_recursive;

architecture recursive of instantiation_recursive is component instantiation_recursive generic( sh_st : integer); port( CLK : in std_logic; DI : in std_logic; DO : out std_logic); end component; signal tmp : std_logic;begin GEN_FD_LAST : if sh_st = 1 generate inst_fd : FD port map(D => DI, C => CLK, Q => DO); end generate; GEN_FD_INTERM : if sh_st /= 1 generate inst_fd : FD port map(D => DI, C => CLK, Q => tmp); inst_sstage : instantiation_recursive generic map(sh_st => sh_st - 1) port map(DI => tmp, CLK => CLK, DO => DO); end generate;end recursive;

Page 179: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 179UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

VHDL のコンポーネン ト コンフ ィギュレーシ ョ ン コンポーネン ト コンフ ィギュレーシ ョ ンを使用する と、 コンポーネン ト を適切なモデルにリ ンクできます。

• モデルはエンティティ /アーキテクチャのペアです。

• Vivado 合成では、 アーキテクチャの宣言部分でコンポーネン ト コンフ ィギュレーシ ョ ンがサポート されます。

次に例を示します。

for instantiation_list : component_name useLibName.entity_Name(Architecture_Name);

下記の文は次を示しています。

• すべての NAND2 コンポーネン トで、 エンティティ NAND2 とアーキテクチャ ARCHI で構成されるデザイン ユニッ トが使用されます。

• デザイン ユニッ トは work ライブラ リにコンパイルされます。

For all : NAND2 use entity work.NAND2(ARCHI);

synth_design コマンドの -top オプシ ョ ン (最上位モジュール名) の値は、 最上位エンティティ名ではなく コン

フ ィギュレーシ ョ ン名です。

VHDL ジェネリ ック

VHDL のジェネ リ ッ クには、 次の特徴があ り ます。

• Verilog のパラ メーターと同等です。

• 拡張可能なデザイン モデルを記述するのに役立ちます。

• コンパク ト な分解可能な VHDL コードを記述できます。

• バス サイズやデザイン ユニッ トの反復エレ メン トの数などの機能をパラ メーター化できます。

同じ機能をバス サイズを変えて何度もインスタンシエートする必要のある場合、 次のよ うにジェネ リ ッ クを使用し

てデザイン ユニッ ト を 1 つだけ記述します。 詳細は、 「ジェネ リ ッ ク パラ メーターの例」 を参照してください。

ジェネリ ックの宣言

ジェネ リ ッ ク パラ メーターは、 エンティティの宣言部分で宣言できます。 サポート されるジェネ リ ッ ク タイプは、

integer、 boolean、 string、 および real です。

Page 180: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 180UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

ジェネリ ック パラメーターの例

ファ イル名: generics_1.vhd

-- VHDL generic parameters example---- generics_1.vhd--library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;

entity addern is generic( width : integer := 8 ); port( A, B : in std_logic_vector(width - 1 downto 0); Y : out std_logic_vector(width - 1 downto 0) );end addern;

architecture bhv of addern isbegin Y <= A + B;end bhv;

Library IEEE;use IEEE.std_logic_1164.all;

entity generics_1 is port( X, Y, Z : in std_logic_vector(12 downto 0); A, B : in std_logic_vector(4 downto 0); S : out std_logic_vector(17 downto 0));end generics_1;

architecture bhv of generics_1 is component addern generic(width : integer := 8); port( A, B : in std_logic_vector(width - 1 downto 0); Y : out std_logic_vector(width - 1 downto 0)); end component; for all : addern use entity work.addern(bhv);

signal C1 : std_logic_vector(12 downto 0); signal C2, C3 : std_logic_vector(17 downto 0);begin U1 : addern generic map(width => 13) port map(X, Y, C1); C2 <= C1 & A; C3 <= Z & B; U2 : addern generic map(width => 18) port map(C2, C3, S);end bhv;

Page 181: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 181UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

注記: インスタンシエーシ ョ ン中にジェネ リ ッ ク値を置き換える場合、 配列要素を分割するこ とはサポート されませ

ん。

たとえば、 ジェネ リ ッ ク my_gen を次のよ うに配列と して定義するこ とはできません。

my_gen(1) => x,my_gen(0) => y

次のよ うに設定する必要があ り ます。

my_gen => (x,y)

VHDL の組み合わせ回路

組み合わせロジッ クは、 アーキテクチャの本体で指定される同時処理信号代入を使用して記述されます。 同時処理

信号代入は、 必要に応じていくつでも記述できます。 アーキテクチャ部分での同時処理信号代入の順序は関係あ り

ません。

VHDL の同時処理信号代入

同時処理信号代入は同時にアクティブで、 代入文の右辺の信号の値が変化したと きに再評価されます。 再評価され

た結果は、 左辺の信号に代入されます。

サポート される同時処理信号代入を、 「シンプルな信号代入の例」 および 「同時選択代入の例」 に示します。

シンプルな信号代入の例

T <= A and B;

同時選択代入の例

ファ イル名: concurrent_selected_asssignment.vhd

-- Concurrent selection assignment in VHDL---- concurrent_selected_assignment.vhd--library ieee;use ieee.std_logic_1164.all;

entity concurrent_selected_assignment is generic( width : integer := 8); port( a, b, c, d : in std_logic_vector(width - 1 downto 0); sel : in std_logic_vector(1 downto 0); T : out std_logic_vector(width - 1 downto 0));end concurrent_selected_assignment;

architecture bhv of concurrent_selected_assignment isbegin with sel select T <=

Page 182: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 182UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

a when "00", b when "01", c when "10", d when others;end bhv;

generate 文次の generate 文があ り ます。

• for-generate 文

• if-generate 文

for-generate 文の使用

for-generate 文は、 反復構造を記述します。

for-generate 文の例 (VHDL)

次の例では、 for-generate 文で、 8 ビッ ト加算器の各ビッ トの結果とキャ リー アウ トの算出を記述しています。

ファ イル名: for-generate.vhd

---- A for-generate example---- for_generate.vhd--entity for_generate is port( A, B : in BIT_VECTOR(0 to 7); CIN : in BIT; SUM : out BIT_VECTOR(0 to 7); COUT : out BIT );end for_generate;

architecture archi of for_generate is signal C : BIT_VECTOR(0 to 8);begin C(0) <= CIN; COUT <= C(8); LOOP_ADD : for I in 0 to 7 generate SUM(I) <= A(I) xor B(I) xor C(I); C(I + 1) <= (A(I) and B(I)) or (A(I) and C(I)) or (B(I) and C(I)); end generate;end archi;

Page 183: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 183UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

if-generate 文の使用

if-generate 文は、 テス ト結果に基づいて HDL ソース コードの特定の部分をアクティブにします。 スタティ ッ ク

条件でサポート されます。

たとえば、 ジェネ リ ッ クがどのデバイス ファ ミ リ をターゲッ トにするか示す場合、 if-generate 文によ り特定の

デバイス ファ ミ リに対してジェネ リ ッ クの値がテス ト され、 HDL ソースコードのそのデバイス ファ ミ リ用に記述さ

れたセクシ ョ ンがアクティベート されます。

if-generate 文内でネスト された for-generate 文の例

次のコード例では、 ジェネ リ ッ クの N ビッ ト加算器 (幅 4 ~ 32) を if-generate および for-generate 文で記述

しています。

ファ イル名: if_for_generate.vhd

-- A for-generate nested in a if-generate---- if_for_generate.vhd--entity if_for_generate is generic( N : INTEGER := 8 ); port( A, B : in BIT_VECTOR(N downto 0); CIN : in BIT; SUM : out BIT_VECTOR(N downto 0); COUT : out BIT );end if_for_generate;

architecture archi of if_for_generate is signal C : BIT_VECTOR(N + 1 downto 0);begin IF_N : if (N >= 4 and N <= 32) generate C(0) <= CIN; COUT <= C(N + 1); LOOP_ADD : for I in 0 to N generate SUM(I) <= A(I) xor B(I) xor C(I); C(I + 1) <= (A(I) and B(I)) or (A(I) and C(I)) or (B(I) and C(I)); end generate; end generate;end archi;

Page 184: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 184UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

組み合わせプロセス

VHDL の組み合わせロジッ クは、 プロセスで記述できます。 プロセスは、 プロセスが実行されるたびに信号に新し

い値を代入します。

重要: 信号に現在の値は保持されません。 プロセスには、 ローカル変数を含めるこ とができます。

メモリ エレメン ト

組み合わせプロセスから推論されたハードウェアには、 メモ リ エレ メン トは含まれません。

プロセスで代入されるすべての信号が、 常にプロセス ブロ ッ ク内のすべての可能なパスで明示的に代入される場合、

メモ リ エレ メン ト プロセスは組み合わせプロセス とな り ます。

if 文または case 文のすべての分岐で信号が明示的に代入されていない場合は、 通常ラ ッチが推論されます。

重要: Vivado 合成で予測されないラ ッチが推論された場合は、 HDL コードに明示的に代入されていない信号がない

かど うかを確認します。

センシティビテ ィ リス ト

組み合わせプロセスには、 センシティビティ リ ス トが含まれます。 センシティビティ リ ス トは、 PROCESS キー

ワードの後にかっこで囲まれます。 センシティビティ リ ス トにある信号のいずれかにイベン ト (値の変化) が発生す

る と、 プロセスが実行されます。 組み合わせプロセスの場合、 センシティビティ リ ス トには次を含める必要があ り

ます。

• if および case などの条件で使用する信号。

• 代入文の右辺の信号。

不足している信号

センシティビティ リ ス トに不足している信号がある場合があ り ます。 センシティビティ リ ス トに 1 つまたは複数の

不足している信号がある場合、 次のよ うにな り ます。

• 合成結果が初期のデザイン仕様と異なるものになる可能性があ り ます。

• Vivado 合成で警告メ ッセージが表示されます。

• 不足している信号がセンシティビティ リ ス トに追加されます。

重要: シ ミ ュレーシ ョ ン中の問題を回避するには、 HDL ソース コードに不足している信号を追加して合成を再実行

します。

変数および信号の代入

Vivado 合成では、 VHDL の変数および信号代入がサポート されます。 プロセスには、 ローカル変数を含めるこ とが

できます。 ローカル変数は、 プロセス内で宣言して使用され、 通常プロセスの外部からは見えません。

Page 185: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 185UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

プロセス内での信号代入の例

ファ イル名: signal_in_process.vhd

-- Signal assignment in a process-- signal_in_process.vhd

entity signal_in_process is port( A, B : in BIT; S : out BIT );end signal_in_process;

architecture archi of signal_in_process isbegin process(A, B) begin S <= '0'; if ((A and B) = '1') then S <= '1'; end if; end process;end archi;

プロセス内での変数および信号代入の例

ファ イル名: variable_in_process.vhd

-- Variable and signal assignment in a process-- variable_in_process.vhd--library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;

entity variable_in_process is port( A, B : in std_logic_vector(3 downto 0); ADD_SUB : in std_logic; S : out std_logic_vector(3 downto 0) );end variable_in_process;

architecture archi of variable_in_process isbegin process(A, B, ADD_SUB) variable AUX : std_logic_vector(3 downto 0); begin if ADD_SUB = '1' then AUX := A + B; else AUX := A - B; end if; S <= AUX;

Page 186: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 186UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

end process;end archi;

if-else 文の使用

if-else 文および if-elsif-else 文では、 真偽条件 (TRUE/FALSE) によって実行される文が決ま り ます。

• 条件が真と判断された場合は if 文が実行されます。

• 条件が偽、 x、 または z と判断された場合は else 文が実行されます。

° 複数の文を含むブロッ クを if または else 分岐文内で実行できます。

° begin および end キーワードが必要です。

° if-else 文はネス ト させるこ とができます。

if-else 文の例 (VHDL)

library IEEE;use IEEE.std_logic_1164.all;

entity mux4 is port (a, b, c, d : in std_logic_vector (7 downto 0);sel1, sel2 : in std_logic;outmux : out std_logic_vector (7 downto 0));

end mux4;

architecture behavior of mux4 is beginprocess (a, b, c, d, sel1, sel2)beginif (sel1 = '1') thenif (sel2 = '1') thenoutmux <= a;

else outmux <= b;else

end if;if (sel2 = '1') then outmux <= c;else

outmux <= d;end if;

end if;end process;

end behavior;

case 文の使用

case 文は次を実行します。

• 論理式を比較し、 複数の並列分岐の 1 つを実行します。

• 記述された順に分岐を評価します。

• 最初に真と評価された分岐を実行します。

どの分岐も偽と評価された場合は、 デフォルトの分岐を実行します。

Page 187: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 187UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

case 文の例 (VHDL)

library IEEE;use IEEE.std_logic_1164.all;

entity mux4 is port (a, b, c, d : in std_logic_vector (7 downto 0);sel : in std_logic_vector (1 downto 0);outmux : out std_logic_vector (7 downto 0));

end mux4;

architecture behavior of mux4 is beginprocess (a, b, c, d, sel)begin

case sel iswhen "00" => outmux <= a;when "01" => outmux <= b;when "10" => outmux <= c;when others => outmux <= d; -- case statement must be complete

end case;end process;

end behavior;

for-loop 文の使用

Vivado 合成では、 for-loop 文で次の要素がサポート されます。

• 定数範囲

• 演算子 <、 <=、 >、 および >= を使用したテス ト ス ト ップ コンディシ ョ ン

• 次のいずれかに適合する次ステップの計算

° var = var + step

° var = var - step

説明:

- ver: ループ変数

- step: 定数値

• next および exit 文

for-loop 文の例 (VHDL)

ファ イル名: for_loop.vhd

---- For-loop example---- for_loop.vhd--library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;

entity for_loop is port(

Page 188: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 188UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

a : in std_logic_vector(7 downto 0); Count : out std_logic_vector(2 downto 0) );end for_loop;

architecture behavior of for_loop isbegin process(a) variable Count_Aux : std_logic_vector(2 downto 0); begin Count_Aux := "000"; for i in a'range loop if (a(i) = '0') then Count_Aux := Count_Aux + 1; end if; end loop; Count <= Count_Aux; end process;end behavior;

VHDL の順序ロジック

プロセス内のすべてのパスで明示的に代入されていない信号がある場合、 VHDL プロセスは組み合わせプロセスで

はなく、 順次プロセスになり ます。 生成されたハードウェアには、 内部ステート またはメモ リ (フ リ ップフロ ップま

たはラ ッチ) が含まれます。

推奨: 順次ロジッ クは、 センシティビティ リ ス ト ベースで記述するこ とをお勧めします。

プロセスを使用したセンシティビティ リ ス ト付き順次プロセスには、 次を記述します。

• ク ロ ッ ク信号

• 順次エレ メン ト を非同期に制御するオプシ ョ ンの信号 (非同期セッ ト / リ セッ ト )

• ク ロ ッ ク イベン ト を記述した if 文

センシティビテ ィ リス ト付き順次プロセス文の構文

process (<sensitivity list>)begin<asynchronous part><clock event><synchronous part>

end;

非同期制御ロジックの記述

非同期制御ロジッ ク (非同期セッ ト / リ セッ ト ) は、 ク ロ ッ ク イベン ト文よ り も前に記述します。

同期制御ロジッ ク (データ、 オプシ ョ ンの同期セッ ト / リ セッ ト 、 オプシ ョ ンのクロ ッ ク イネーブル) は、 ク ロ ッ ク イベン トの if 分岐内で記述します。

Page 189: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 189UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

クロック イベン ト文

ク ロ ッ ク イベン ト文は、 次のよ うに記述します。

• 立ち上がりエッジ ク ロ ッ ク :

if rising_edge (clk) then

• 立ち下がりエッジ ク ロ ッ ク :

if falling_edge (clk) then

不足している信号

センシティビティ リ ス トに不足している信号がある場合、 合成結果が初期のデザイン仕様と異なるものになる可能

性があ り ます。 この場合、 Vivado 合成で警告メ ッセージが表示され、 センシティビティ リ ス トに不足している信号

が追加されます。

重要: シ ミ ュレーシ ョ ン中の問題を回避するには、 HDL ソース コードに不足している信号を追加して合成を再実行

します。

VHDL のセンシティビテ ィ リス トのない順次プロセス文

Vivado 合成では、 wait 文を使用した順次プロセスの記述がサポート されます。 順次プロセスはセンシティビティ リ ス ト なしで記述します。

wait 文を最初の文にし、 wait 文の条件で順序ロジッ ク ク ロ ッ クを記述します。

重要: 同じ順次プロセスにセンシティビティ リ ス ト と wait 文の両方を含めるこ とはできません。 また、 使用可能な wait 文は 1 つのみです。

wait 文を使用した順次プロセスのコード例 (VHDL)

process beginwait until rising_edge(clk);q <= d;

end process;

wait 文でクロック イネーブルを記述した例 (VHDL)

wait 文で、 ク ロ ッ ク と共にクロ ッ ク イネーブル (clken) を記述できます。

process begin

表 5-7: 非同期制御ロジック記述のサマリ

記述するロジック 内容 記述する位置

非同期制御ロジッ ク 非同期セッ ト / リ セッ ト ク ロ ッ ク イベン ト文の前

同期ロジッ ク データ

同期セッ ト / リ セッ ト (オプシ ョ ン)

ク ロ ッ ク イネーブル (オプシ ョ ン)

ク ロ ッ ク イベン トの if 分岐内

Page 190: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 190UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

wait until rising_edge(clk) and clken = '1';q <= d;

end process;

wait 文の後にクロック イネーブルを記述した例 (VHDL)

ク ロ ッ ク イネーブルは、 次のよ うに別に記述するこ と もできます。

process beginwait until rising_edge(clk);if clken = '1' thenq <= d;

end if;end process;

同期制御ロジックの記述

ク ロ ッ ク イネーブルを記述する同じコード記述方法を使用して、 同期リセッ ト またはセッ ト などの同期制御ロジッ

クを記述できます。

重要: センシティビティ リ ス トのないプロセスを使用して非同期制御ロジッ クを持つ順次エレ メン ト を記述するこ と

はできません。 このよ うな機能を記述できるのは、 センシティビティ リ ス ト付きのプロセス文のみです。 Vivado 合成では、 wait 文に基づく ラ ッチの記述は使用できません。 同期ロジッ クは、 センシティビティ リ ス ト付きプロセス

を使用した方が柔軟に記述できます。

VHDL の初期値とセッ ト /リセッ ト レジスタは、 宣言する と きに初期化できます。 初期値は定数値で、 関数呼び出しから生成できます。

レジスタを初期化する例 1 (VHDL)次のコード例は、 回路に電源が入り、 回路のグローバル リ セッ トが適用されたと きに順次エレ メン トが初期化され

るパワーアップ値を指定しています。

signal arb_onebit : std_logic := '0';signal arb_priority : std_logic_vector(3 downto 0) := "1011";

レジスタを初期化する例 2 (VHDL)次のコード例では、 電源投入時の初期化と リセッ トによる初期化の両方が指定されています。

ファ イル名: initial_1.vhd

---- Register initialization-- Specifying initial contents at circuit powes-up-- Specifying an operational set/reset---- File: VHDL_Language_Support/initial/initial_1.vhd--

Page 191: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 191UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

library ieee;use ieee.std_logic_1164.all;

entity initial_1 is Port( clk, rst : in std_logic; din : in std_logic; dout : out std_logic );end initial_1;

architecture behavioral of initial_1 is signal arb_onebit : std_logic := '1'; -- power-up to vccbegin process(clk) begin if (rising_edge(clk)) then if rst = '1' then -- local synchronous reset arb_onebit <= '0'; else arb_onebit <= din; end if; end if; end process;

dout <= arb_onebit;

end behavioral;

VHDL の関数とプロシージャ

デザインでブロ ッ クを複数回使用する場合は、 VHDL の関数およびプロシージャを使用します。 内容は組み合わせ

プロセス と類似しています。

関数およびプロシージャは、 次で宣言します。

• エンティティの宣言部

• アーキテクチャ

• パッケージ

関数またはプロシージャは、 宣言部と本体で構成されます。

宣言部では、 次を指定します。

• input パラ メーター (範囲を制約する必要なし )

• 出力および入出力パラ メーター (プロシージャのみ)

重要: 分解関数は、 IEEE std_logic_1164 パッケージで定義されるもの以外はサポート されません。

Page 192: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 192UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

パッケージ内で宣言された関数の例 (VHDL)コード例のファイルは、 この リ ンクからダウンロードできます。

次に、 ADD 関数をパッケージ内で宣言するコード例を示します。 ADD 関数は 1 ビッ ト加算器で、 4 ビッ ト加算器を作

成するために 4 回呼び出されます。 次の例では、 関数を使用しています。

ファ イル名: function_package_1.vhd

-- Declaration of a function in a package---- function_package_1.vhd--package PKG is function ADD(A, B, CIN : BIT) return BIT_VECTOR;end PKG;

package body PKG is function ADD(A, B, CIN : BIT) return BIT_VECTOR is variable S, COUT : BIT; variable RESULT : BIT_VECTOR(1 downto 0); begin S := A xor B xor CIN; COUT := (A and B) or (A and CIN) or (B and CIN); RESULT := COUT & S; return RESULT; end ADD;end PKG;

use work.PKG.all;

entity function_package_1 is port( A, B : in BIT_VECTOR(3 downto 0); CIN : in BIT; S : out BIT_VECTOR(3 downto 0); COUT : out BIT );end function_package_1;

architecture ARCHI of function_package_1 is signal S0, S1, S2, S3 : BIT_VECTOR(1 downto 0);begin S0 <= ADD(A(0), B(0), CIN); S1 <= ADD(A(1), B(1), S0(1)); S2 <= ADD(A(2), B(2), S1(1)); S3 <= ADD(A(3), B(3), S2(1)); S <= S3(0) & S2(0) & S1(0) & S0(0); COUT <= S3(1);end ARCHI;

パッケージ内で宣言されたプロシージャの例 (VHDL) 次の例では、 パッケージ内でプロシージャを使用しています。

ファ イル名: procedure_package_1.vhd

Page 193: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 193UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

-- Declaration of a procedure in a package---- Download: procedure_package_1.vhd--package PKG is procedure ADD( A, B, CIN : in BIT; C : out BIT_VECTOR(1 downto 0));end PKG;

package body PKG is procedure ADD( A, B, CIN : in BIT; C : out BIT_VECTOR(1 downto 0)) is variable S, COUT : BIT; begin S := A xor B xor CIN; COUT := (A and B) or (A and CIN) or (B and CIN); C := COUT & S; end ADD;end PKG;

use work.PKG.all;

entity procedure_package_1 is port( A, B : in BIT_VECTOR(3 downto 0); CIN : in BIT; S : out BIT_VECTOR(3 downto 0); COUT : out BIT );end procedure_package_1;

architecture ARCHI of procedure_package_1 isbegin process(A, B, CIN) variable S0, S1, S2, S3 : BIT_VECTOR(1 downto 0); begin ADD(A(0), B(0), CIN, S0); ADD(A(1), B(1), S0(1), S1); ADD(A(2), B(2), S1(1), S2); ADD(A(3), B(3), S2(1), S3); S <= S3(0) & S2(0) & S1(0) & S0(0); COUT <= S3(1); end process;end ARCHI;

再帰関数の例 (VHDL)Vivado 合成では、 再帰関数がサポート されます。 次のコード例では、 n! 関数を使用しています。

function my_func(x : integer) return integer is begin if R > 1 then return (R*my_func(R-1)); else return R; end if;

Page 194: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 194UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

end function my_func;

VHDL の assert 文assert 文は、 -assert 合成オプシ ョ ンによ りサポート されます。

注意: アサーシ ョ ンを使用する場合は注意が必要です。 Vivado では、 動作を作成したり動作によ り作成されたり しな

いスタティ ッ ク アサーシ ョ ンのみがサポート されます。 たとえば、 定数または演算子/ジェネ リ ッ クの値に対するア

サーシ ョ ンは機能しますが、 if 文内の信号の値に対するアサーシ ョ ンは機能しません。

VHDL の定義済みパッケージ

Vivado 合成では、 STD および IEEE 標準ライブラ リで定義されている VHDL の定義済みパッケージがサポート され

ます。 ライブラ リはコンパイル済みであ り、 ユーザーがコンパイルする必要はなく、 HDL ソース コードに直接含め

るこ とができます。

VHDL の定義済み標準パッケージ

VHDL の定義済み標準パッケージはデフォルトで提供されており、 基本的な VHDL データ型 (bit、 bit_vector、

integer、 natural、 real、 および boolean) を定義します。

VHDL の IEEE パッケージ

Vivado 合成では、 次の定義済み VHDL IEEE パッケージがサポート されており、 IEEE ライブラ リにコンパイルされ

ています。

• numeric_bit

° ビッ トに基づく符号なしおよび符号付きのベクター型。

° これらのデータ型のオーバーロード された算術演算子、 変換関数、 および拡張関数。

• std_logic_1164

° std_logic、 std_ulogic、 std_logic_vector、 および std_ulogic_vector 型。

° これらのデータ型に基づく変換関数。

• numeric_std

° std_logic に基づく符号なしおよび符号付きのベクター型。

° これらのデータ型のオーバーロード された算術演算子、 変換関数、 および拡張関数。 std_logic_arith と同等。

VHDL のレガシ パッケージ

• std_logic_arith (Synopsys)

° std_logic に基づく符号なしおよび符号付きのベクター型。

° これらのデータ型のオーバーロード された算術演算子、 変換関数、 および拡張関数。

Page 195: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 195UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

• std_logic_unsigned (Synopsys)

° std_logic および std_logic_vector の符号なし算術演算子。

• std_logic_signed (Synopsys)

° std_logic および std_logic_vector の符号付き算術演算子。

• std_logic_misc (Synopsys)

° and_reduce、 or_reduce などの std_logic_1164 パッケージの補足タイプ、 サブタイプ、 定数、 および関

数。

VHDL の定義済み IEEE 実数型および IEEE math_real パッケージ

VHDL の定義済み IEEE 実数型および IEEE math_real パッケージは、ジェネ リ ッ ク値の計算などを実行する目的に

のみ使用でき、 合成可能な機能を記述するこ とはできません。

VHDL の実数定数

次の表に、 VHDL の実数定数を示します。

VHDL の実数関数

次の表に、 VHDL の実数関数を示します。

表 5-8: VHDL の実数定数

定数 値 定数 値

math_e E math_log_of_2 ln2

math_1_over_e 1/e math_log_of_10 ln10

math_pi Π math_log2_of_e log2

math_2_pi 2π math_log10_of_e log10

math_1_over_pi 1/ π math_sqrt_2 √2

math_pi_over_2 π/2 math_1_oversqrt_2 1/√2

math_pi_over_3 π/3 math_sqrt_pi √π

math_pi_over_4 π/4 math_deg_to_rad 2π/360

math_3_pi_over_2 3π/2 math_rad_to_deg 360/2π

表 5-9: VHDL の実数関数

ceil(x) realmax(x,y) exp(x) cos(x) cosh(x)

floor(x) realmin(x,y) log(x) tan(x) tanh(x)

round(x) sqrt(x) log2(x) arcsin(x) arcsinh(x)

trunc(x) cbrt(x) log10(x) arctan(x) arccosh(x)

sign(x) **(n,y) log(x,y) arctan(y,x) arctanh(x)

mod(x,y) **(x,y) sin(x) sinh(x)

Page 196: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 196UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

独自の VHDL パッケージの定義

独自の VHDL パッケージを定義して次を定義できます。

• タイプおよびサブタイプ

• 定数

• 関数およびプロシージャ

• コンポーネン ト宣言

VHDL パッケージを定義する と、 プロジェク トのほかの部分から共有される定義およびモデルを使用できます。

VHDL パッケージを定義するには、 次が必要です。

• パッケージ宣言: 上記の各エレ メン ト を宣言します。

• パッケージ本体: パッケージ宣言で宣言した関数およびプロシージャを記述します。

パッケージ宣言の構文

package mypackage is type mytype is record first : integer; second : integer;

end record; constant myzero : mytype := (first => 0, second => 0); function getfirst (x : mytype) return integer;

end mypackage;

package body mypackage is function getfirst (x : mytype) return integer is begin return x.first;

end function; end mypackage;

VHDL パッケージへのアクセス

VHDL パッケージにアクセスするには、 次を実行します。

1. パッケージがコンパイルされているライブラ リ を library 節で指定します。 次に例を示します。

library library_name;

2. パッケージまたはパッケージに含まれる特有の定義を use 節で指定します。 次に例を示します。

use library_name.package_name.all

3. これらの行は、 パッケージ定義を使用するエンティティ またはアーキテクチャ文の直前に挿入します。

デフォルトのライブラ リは work ライブラ リ なので、 指定したパッケージがこのライブラ リにコンパイルされてい

る場合は、 library 節は必要あ り ません。

Page 197: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 197UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

VHDL 構文のサポート ステータス Vivado 合成では、 VHDL のデザイン エンティティおよびコンフ ィギュレーシ ョ ンが次の表に示すよ うにサポート さ

れます。

表 5-10: VHDL 構文のサポート ステータス

VHDL 構文 サポート ステータス

VHDL エンティテ ィ ヘッダー

ジェネ リ ッ ク サポート あ り

ポート サポート あ り (制約されていないポート を含む)

エンティティ実行部 サポート なし

IP パッケージ

STANDARD TIME はサポート なし

VHDL の物理型

TIME 無視

REAL サポート あ り (定数計算用の関数でのみ)

VHDL モード

リ ンケージ サポート なし

VHDL の宣言

データ型 次をサポート :

• 列挙型

• 定数範囲の正の値の型

• ビッ ト ベクター型

• 多次元配列

VHDL オブジェク ト

定数宣言 サポート あ り (ディファード定数を除く )

信号宣言 サポート あ り (レジスタまたはバス タイプの信号を除く

)

属性宣言 一部の属性のみサポート、 その他はスキップ。

VHDL 仕様

HIGHLOW サポート あ り

LEFT サポート あ り

RIGHT サポート あ り

RANGE サポート あ り

REVERSE_RANGE サポート あ り

LENGTH サポート あ り

POS サポート あ り

ASCENDING サポート あ り

Page 198: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 198UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

コンフ ィギュレーシ ョ ン インスタンス リ ス トの all 節のみでサポート。

• 節が追加されていない場合、 Vivado 合成でデフォル

ト ライブラ リにコンパイルされているエンティティ

またはアーキテクチャが検索されます。

接続解除 サポート なし

アンダースコア オブジェク ト名に DATA_1 のよ うに通常アンダースコ

ア ( _ ) を含めるこ とはできるが、 Vivado 合成では _DATA_1 のよ うに信号名の冒頭文字と してアンダース

コアを使用するこ とは不可。

VHDL の演算子

論理演算子: and、 or、 nand、 nor、 xor、 xnor、 not サポート あ り

比較演算子: =、 /=、 <、 <=、 >、 >= サポート あ り

& (連結) サポート あ り

加算/減算演算子: +、 - サポート あ り

* サポート あ り

/ 右辺のオペランドが 2 のべき乗の定数の場合、 または

両方のオペランドが定数の場合にサポート。

rem 右辺のオペランドが 2 のべき乗の定数の場合にサポー

ト。

mod 右辺のオペランドが 2 のべき乗の定数の場合にサポー

ト。

シフ ト演算子: sll、 srl、 sla、 sra、 rol、 ror サポート あ り

abs サポート あ り

** 左辺のオペランドが 2 のべき乗の場合にサポート。

符号演算子: +、 - サポート あ り

VHDL のオペランド

抽象リテラル 整数リテラルのみサポート。

物理リテラル 無視

列挙リテラル サポート あ り

文字列リテラル サポート あ り

ビッ ト文字列リテラル サポート あ り

レコード集合体 サポート あ り

配列集合体 サポート あ り

関数呼び出し サポート あ り

条件付き論理式 定義済み属性でサポート。

型変換 サポート あ り

表 5-10: VHDL 構文のサポート ステータス (続き)

VHDL 構文 サポート ステータス

Page 199: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 199UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

アロケーター サポート なし

スタティ ッ ク論理式 サポート あ り

wait 文

boolean_expression まで sensitivity_list で待機。

「VHDL の組み合わせ回路」 を参照してください。

センシティビティ リ ス トおよびブール式内の 1 つの信

号でサポート。

• 複数の wait 文はサポート なし。

• ラ ッチの記述の wait 文はサポート なし。

time_expression 待機。

「VHDL の組み合わせ回路」 を参照してください。

サポート なし

アサート文 スタティ ッ ク条件のみサポート。

信号代入文 サポート あ り

遅延は無視されます。

変数代入文 サポート あ り

プロシージャ呼び出し文 サポート あ り

if 文 サポート あ り

case 文 サポート あ り

ループ文

next 文 サポート あ り

exit 文 サポート あ り

return 文 サポート あ り

null 文 サポート あ り

同時処理文

プロセス文 サポート あ り

同時処理プロシージャ呼び出し サポート あ り

同時処理アサート文 無視

同時処理信号代入文 サポート あ り (after 節、transport および guarded オプシ ョ

ン、 波形は除く )。

UNAFFECTED をサポート。

コンポーネン ト インスタンシエーシ ョ ン文 サポート あ り

for-generate 定数範囲のみサポート

if-generate スタティ ッ ク条件のみサポート

表 5-10: VHDL 構文のサポート ステータス (続き)

VHDL 構文 サポート ステータス

Page 200: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 200UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 5 章: VHDL サポート

VHDL の予約語

表 5-11: VHDL の予約語

abs access after alias

all and architecture array

assert attribute begin block

body buffer bus case

component configuration constant disconnect

downto else elsif end

entity exit file for

function generate generic group

guarded if impure in

inertial inout is label

library linkage literal loop

map mod nand new

next nor not null

of on open or

others out package port

postponed procedure process pure

range record register reject

rem report return rol

ror select severity signal

shared sla sll sra

srl subtype then to

transport type unaffected units

until use variable wait

when while with xnor

xor

Page 201: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 201UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 6 章

VHDL-2008 言語サポート

概要

Vivado® 合成では、 VHDL-2008 標準の合成可能なサブセッ トがサポート されます。 次のセクシ ョ ンに、 サポート さ

れるサブセッ ト とその使用方法を説明します。

VHDL-2008 を使用するための Vivado の設定

Vivado で VHDL-2008 ファ イルを使用する方法は複数あ り ます。 GUI で設定する場合は、 [Source File Properties] ウ ィ

ンド ウで [Type] フ ィールドの右側のボタンをク リ ッ ク し、[File type] ド ロ ップダウン リ ス トから [VHDL 2008] を選択

します。 これによ り、 そのファイルのタイプが VHDL-2008 に設定されます。

または、 [Tcl Console] ウ ィンド ウで set_property コマンドを使用してファイルを VHDL-2008 に設定するこ と もで

きます。 構文は次のとおりです。

set_property FILE_TYPE {VHDL 2008} [get_files <file>.vhd]

非プロジェク ト ベース (Tcl) フローで VHDL-2008 を含む VHDL ファ イルを読み込むには、 次のコマンドを使用しま

す。

read_vhdl -vhdl2008 <file>.vhd

複数のファイルを読み込むには、 複数の read_vhdl コマンドを使用するか、 次のよ うに 1 つのコマンドで複数の

ファイルを指定します。

read_vhdl -vhdl2008 {a.vhd b.vhd c.vhd}

Page 202: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 202UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 6 章: VHDL-2008 言語サポート

サポート される VHDL-2008 の機能

Vivado では、 Verilog-2008 の次の機能がサポート されます。

演算子

比較演算子

VHDL-2008 の比較演算子でビッ ト または std_logic 型が返されるよ うにな り ました。 以前の VHDL では、 比較演

算子 (=、 <、 >= など) でブール型が返されていました。 たとえば、 次のよ うに記述する必要のあったコードがある と

します。

if x = y then out1 <= ‘1’; else out1 <= ‘0’;end if;

新しい VHDL-2008 では、 これを次のよ うに記述できます。

out1 <= x ?= y;

次の表に、 Vivado でサポート される比較演算子を示します。

最大値および最小値演算子

VHDL-2008 の新しい最大値演算子と最小値演算子は、 2 つの入力値のうち、 それぞれ大きい方の値または小さい方

の値を返します。 次に例を示します。

out1 <= maximum(const1, const2);

シフ ト演算子 (rol、 ror、 sll、 srl、 sla、 および sra)sla および sra 演算子は、 以前はビッ ト要素およびブール要素のみを定義していました。 VHDL-2008 標準では、 こ

れらは符号付きおよび符号なしライブラ リで定義されています。

表 6-1: サポート される比較演算子

演算子 使用法 説明

?= x ?= y x は y に等しい

?/= x ?/= y x は y に等し くない

?< x ?< y x は y よ り小さい

?<= x ?<= y x は y 以下

?> x ?> y x は y よ り大きい

?>= x ?>= y x は y 以上

Page 203: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 203UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 6 章: VHDL-2008 言語サポート

単項論理簡約演算子

以前のバージ ョ ンの VHDL では、 and、 nand、 or などの演算子は 2 つの入力値を取り込んでビッ ト値またはブール

値を返していました。 VHDL-2008 では、 これらの演算子に単項サポートが追加されており、 入力の論理関数を返し

ます。 たとえば、 次のよ うなコードがある と します。

out1 <= and("0101");

このコードは 4 つのビッ トに対して AND を実行し、 0 を返します。 単項サポートのある論理関数は、 and、 nand、

or、 nor、 xor、 および xnor です。

配列論理演算子とスカラー論理演算子の混合

以前の VHDL では、 論理演算子の両方のオペランドが同じサイズである必要があ り ました。

VHDL-2008 では、 1 つのオペランドが配列、 も う 1 つのオペランドがスカラーである論理演算子がサポート されま

す。 たとえば、 1 つのビッ ト とベクターのすべてのビッ トに対して AND を実行するには、 次のコードが必要でした。

out1(3) <= in1(3) and in2;out1(2) <= in1(2) and in2;out1(1) <= in1(1) and in2;out1(0) <= in1(0) and in2;

これを次のコードに置き換えるこ とができます。

out1<= in1 and in2;

if-else-if および case generate

以前の VHDL では、 if-generate 文は次のよ うに記述されていました。

if condition generate--- statementsend generate;

異なる条件がある場合、 複数の generate 文を記述し、 generate 文の順序にも注意する必要があ り ました。 VHDL-2008 では、 if-else-if generate 文がサポート されています。

if condition generate---statementselsif condition2 generate---statementselse generate---statementsend generate;

また、 VHDL-2008 では case-generate 文もサポート されます。

case expressions generate when condition =>

statements when condition2 =>

statements

Page 204: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 204UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 6 章: VHDL-2008 言語サポート

end generate;

順次代入文

VHDL-2008 では、 条件信号に順次信号および変数代入を使用できます。 たとえば、 イネーブル付きのレジスタは次

のよ うに記述されていました。

process(clk) beginif clk’event and clk=’1’ then if enable thenmy_reg <= my_input;

end if;end if;

end process;

VHDL-2008 では、 これを次のよ うに記述できます。

process(clk) begin if clk’event and clk=’1’ then my_reg <= my_input when enable else my_reg; end if;end process;

case? 文の使用

VHDL-2008 では、 case 文で明示的なドン ト ケア代入を処理する方法があ り ます。 case? 文を使用する と、 明示的な

ドン ト ケアは次の例のよ うに評価されます。

process(clk) beginif clk’event and clk=’1’ then case? my_reg iswhen "01--" => out1 <= in1;when "000-" => out1 <= in2;when "1111" => out1 <= in3;when others => out1 <= in4;

end case?;end if;end process;

注記: この文を機能させるためには、 信号に明示的にドン ト ケアを代入する必要があ り ます。

select? 文の使用

case 文と同様、 select 文でも明示的なドン ト ケア代入を処理する方法があ り ます。 select? 文を使用する と、 明示

的なドン ト ケアは次の例のよ うに評価されます。

process(clk) beginif clk’event and clk=’1’ thenwith my_reg select?out1 <= in1 when "11--", in2 when "000-", in3 when "1111", in4 when others;

end if;end process;

注記: この文を機能させるためには、 信号に明示的にドン ト ケアを代入する必要があ り ます。

Page 205: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 205UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 6 章: VHDL-2008 言語サポート

集合体のスライスの使用

VHDL-2008 では、 配列集合体を構成してそれを 1 つの文で複数の場所に代入できます。

たとえば、 in1 が std_logic_vector(3 downto 0) と して定義されている場合、 次のよ うに記述できます。

(my_reg1, my_reg2, enable, reset) <= in1;

この例は、 4 つの信号が in1 の個々のビッ トに代入されます。

my_reg1 は in1(3) に代入

my_reg2 は in1(2) に代入

enable は in1(1) に代入

reset は in1(0) に代入

また、 次の例に示すよ うに、 これらの信号を異なる順序で代入するこ と もできます。

(1=> enable, 0 => reset, 3 => my_reg1, 2 => my_reg2) <= in1;

データ型

制約なしの要素型

以前の VHDL では、 データ型およびサブタイプをデータ型の宣言部で完全に制約する必要があ り ました。

VHDL-2008 では、 これらを制約せずにおく こ とができ、 制約はそのデータ型のオブジェク トで実行されます。 これ

によ り、 データ型およびサブタイプの用途が広くな り ます。 次に例を示します。

subtype my_type is std_logic_vector;signal my_reg1 : my_type (3 downto 0);signal my_reg2 : my_type (4 downto 0);

以前のバージ ョ ンの VHDL では、 上記の例を記述するのに 2 つのサブタイプが必要でした。 VHDL-2008 では、 これ

を 1 つのサブタイプで記述できます。 これは、 次の例に示すよ うに配列に対しても可能です。

type my_type is array (natural range <>) of std_logic_vector;signal : mytype(1 downto 0)(9 downto 0);

boolean_vector および integer_vector 配列型

VHDL-2008 では、 新しい定義済みの配列型がサポート されます。 Vivado では、 boolean_vector および integer_vector がサポート されます。 これらのデータ型は、 次のよ うに定義されます。

type boolean_vector is array (natural range <>) of booleantype integer_vector is array (natural range <>) of integer

固定小数点のサポート このセクシ ョ ンでは、 Vivado 合成で VHDL-2008 の固定小数点機能を使用する方法を説明します。 VHDL-2008 バー

ジ ョ ンの固定小数点パッケージでは Vivado 合成ではサポート されないパッケージ インスタンシエーシ ョ ンが使用さ

れるので、Vivado インス トール ディ レク ト リに Vivado 合成と互換性のある変更バージ ョ ンである fixed_pkg.vhd ファ イルが含まれています。

Page 206: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 206UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 6 章: VHDL-2008 言語サポート

Vivado シ ミ ュレーシ ョ ンでの固定小数点および浮動小数点パッケージの詳細は、 『Vivado Design Suite ユーザー ガイ

ド : ロジッ ク シ ミ ュレーシ ョ ン』 (UG900) [参照 11] のこのセクシ ョ ンを参照してください。

VHDL コード

インス トール ディ レク ト リに含まれている固定小数点パッケージ (fixed_pkg) を使用するには、 VHDL コードに次

の行を追加する必要があ り ます。

library ieee;use ieee.std_logic_1164;use ieee.fixed_pkg.all;

コード内では、 固定小数点の変数、 信号、 ポートは次のよ うに宣言します。

signal s1: ufixed(21 downto -2);variable v1 : sfixed(10 downto -4);port (.... P1: in ufixed(12 downto -2);....);

固定小数点関連の信号、 変数、 およびポートの構文は、 その他の信号、 変数、 およびポート と似ています。

固定小数点で重要なのは、 次の点です。

• UFixed または SFixed: 符号なし (UFixed) または符号付き (SFixed) の動作を指定します。

• サイズは、 整数部分および分数部分に使用されるビッ ト数を示します。 たとえば、 上記の信号 s1 では整数部分

は 22 ビッ ト (21 downto 0)、分数部分は 2 ビッ ト (-1 downto -2) であ り、上記の P1 宣言では整数部分は 13 ビッ ト (12 downto 0)、 分数部分は 2 ビッ ト (-1 downto -2) です。

Vivado 合成の実行

まず、 IEEE ライブラ リの固定小数点パッケージをコンパイルします。

このパッケージは、 Vivado インス トールの scripts/rt/data/ ディ レク ト リにある fixed_pkg_2008.vhd ファ

イルと して提供されています。

このパッケージは Vivado であらかじめコンパイルされていないので、 デザインでこのファイルをコンパイルする必

要があ り ます。

• GUI を使用してこのファイルをコンパイルするには、 fixed_pkg_2008.vhd ファ イルを Vivado インス トール ディ レク ト リからローカル ディ レク ト リにコピーし、 Vivado IDE でプロジェク トに fixed_pkg_2008.vhd ファ イルをファイルを追加して、 IEEE ライブラ リにコンパイルされるよ うにします。

• Tcl コマンドを使用してコンパイルするには、 Tcl コンソールに次のコマンドを入力します。

add_files -norecurse <path to package file>/fixed_pkg_2008.vhdset_property library ieee [get_files <path to package file>/fixed_pkg_2008.vhd]read_vhdl -vhdl2008 ./my_design.vhdlaunch_runs synth_1 -jobs 4wait_on_run synth_1open_run synth_1 -name synth_1

RTL コードの理解

VHDL-2008 の固定小数点機能を使用する際は、 次の事項に注意する必要があ り ます。

Page 207: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 207UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 6 章: VHDL-2008 言語サポート

合計サイズ

次の 2 つの信号がある と します。

signal s1 : ufixed(21 downto -2);signal s2 : ufixed(20 downto -3);

これらの信号では整数部分と分数部分のビッ ト数は異なり ますが、 総ビッ ト数は同じなので、 S1 から S2 への代入は

エラーなしで実行されますが、 代入される値は異なり ます。

重要: VHDL では型が厳密に指定されておりサイズが一致しない代入は実行されませんが、 このよ うな代入に注意す

る必要があ り ます。 上記の例では、 サイズが一致するので、 VHDL コンパイラで許容されます。

サイズの決定

算術演算では、結果のサイズはオペランドのサイズと演算のタイプによ り ます。先ほどと同じ 2 つの信号 (s1 および s2) を考えてみます。

重要: 実行される演算とオペランドのサイズに応じて、 ターゲッ トの範囲を正し く宣言してください。

先ほどの例で示したよ うに、 合計サイズが正し くても指定された範囲が正し くない場合、 正しい結果は得られませ

ん。

その他

出力ポートの読み出し

以前のバージ ョ ンの VHDL では、 出力以外の信号を out と して宣言するこ とはできませんでした。

そのため、 出力に値を代入し、 その同じ信号をその他のロジッ クに使用するには、 新しい信号を宣言するか、 その

信号で出力およびその他のロジッ クを駆動するよ うにするか、 out を buffer 型に変更する必要があ り ました。

表 6-2: 信号

名前 整数部分のビッ ト数 分数部分のビッ ト数 総ビッ ト数

s1 22 2 24

s2 21 3 24

表 6-3: サイズの決定

演算 整数部分のサイズ整数サイズの決定方

法分数部分のサイ

ズ分数サイズの決定

方法結果のサイズ

S1 + S2 23

(2 つのオペランド

の整数部分が大き

い方のサイズ)

+ 1

3

2 つのオペラン

ドの分数部分が

大きい方のサイ

(22 downto -3)

25 ビッ ト

S1 * S2 432 つのオペランド

の整数部分の合計 52 つのオペラン

ドの分数部分の

合計

(42 downto -5)

48 ビッ ト

Page 208: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 208UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 6 章: VHDL-2008 言語サポート

VHDL-2008 では、 次の例に示すよ うに出力値を使用できます。

entity test is port(in1 : in std_logic;clk : in std_logic;out1, out2 : out std_logic);end test;

その後、 アーキテクチャで次のよ うに記述します。

process(clk) beginif clk’event an clk=’1’ thenout1 <= in1; my_reg <= out1; -- THIS WOULD HAVE BEEN ILLEGAL in VHDL. out2 <= my_reg;

end if;end process;

ポート マップの論理式

VHDL-2008 では、 インスタンシエーシ ョ ンのポート マップ内で関数および代入文を使用できます。 これを使用した

便利な方法と して、 次の例に示すよ うに、 信号を 1 つのデータ型から別のデータ型に変更できます。

U0 : my_entity port map (clk => clk, in1 => to_integer(my_signal)...

上記の例では、 エンティティ my_entity に in1 という integer 型のポートがあ り ますが、 上位の信号 my_signal は std_logic_vector 型です。

以前の VHDL では、 integer 型の新しい信号を作成し、 インスタンシエーシ ョ ン外で変換を実行し、 その新しい信

号をポート マップに割り当てる必要があ り ました。

データ型の変換に加え、 次の例に示すよ うに、 ロジッ クをポート マップに挿入するこ と も可能です。

U0 : my_entity port map (clk => clk, enable => en1 and en2 ...

この例では、 下位に enable 信号があ り ます。 上位では enable が 2 つのほかの信号の AND に接続されています。

以前の VHDL では、 前述の例と同様に、 これに新しい信号と代入文が必要でしたが、 VHDL-2008 ではこれをインス

タンシエーシ ョ ンのポート マップで達成できます。

process (all) 文の使用

VHDL では、 process 文のセンシティビティ リ ス トに要素を リ ス トする際、 process 文で読み込まれるすべての要素を

リ ス トするこ とは設計者の責任でした。 不足しているものがある と、 警告メ ッセージが表示され、 デザインにラ ッ

チが推論される可能性があ り ました。

VHDL-2008 では、 process(all) 文を使用してプロセスへのすべての入力が検索されるよ うにし、 ロジッ クを作成

できます。

process(all) beginenable <= en1 and en2;end process;

ジェネリ ック リス トでのジェネリ ックの参照

VHDL-2008 では、 次の例に示すよ うに、 ジェネ リ ッ クで別のジェネ リ ッ クを参照できます。

Page 209: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 209UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 6 章: VHDL-2008 言語サポート

entity my_entity is generic (gen1 : integer;gen2 : std_logic_vector(gen1 - 1 downto 0));

以前のバージ ョ ンの VHDL では、 gen1 で gen2 の長さを制御するこ とは不可能でした。

パッケージ内のジェネリ ック

VHDL-2008 では、 パッケージ内にジェネ リ ッ クを配置し、 パッケージを宣言する と きにそのジェネ リ ッ クを変更で

きます。 次に例を示します。

package my_pack is generic( length : integer);

subtype my_type is std_logic_vector(length-1 downto 0);end package my_pack;

この例では std_logic_vector のサブタイプが宣言されていますが、 長さは指定されていません。 VHDL ファ イルにこ

のパッケージをインスタンシエートする と きに、 長さを指定します。

library ieee;use leee.std_logic_1164.all;

package my_pack1 is new work.my_pack generic map (length => 5);package my_pack2 is new work.my_pack generic map (length => 3);use work.my_pack1.all;use work.my_pack2.all;

library ieee;use ieee.std_logic_1164.all;

entity test is port ( clk : in std_logic; in1 : in work.my_pack1.my_type; in2 : in work.my_pack2.my_type; out1 : out work.my_pack1.my_type; out2 : out work.my_pack2.my_type);end test;

このコードでは、 同じパッケージを使用して 2 つの異なるサブタイプを宣言しています。

エンティテ ィ内のジェネリ ックのデータ型

VHDL-2008 では、 エンティティのジェネ リ ッ ク文で未定義のデータ型がサポート されます。 次に例を示します。

entity my_entity is generic (type my_type);

port (in1 : in std_logic; out1 : out my_type);end entity my_entity;

このエンティティ宣言では、 データ型が未定義です。 RTL では、 このエンティティ my_entity を次のよ うにインスタ

ンシエート します。

my_inst1 : entity work.my_entity(beh) generic map (my_type => std_logic) port map ...

Page 210: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 210UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 6 章: VHDL-2008 言語サポート

my_inst2 : entity work.my_entity(beh) generic map (my_type => std_logic_vector(3 downto 0)) port map ...

上記のコードは、 my_entity を 2 回インスタンシエート しており、 1 つ目では out1 は 1 ビッ ト 、 2 つ目では out1 は 4 ビッ ト ベクターに指定されています。

ジェネリ ック内の関数

VHDL-2008 では、 エンティティ内で未定義の関数を宣言できます。 次に例を示します。

entity bottom is generic ( function my_func (a,b : unsigned) return unsigned); port .........end entity bottom;

その後、 エンティティのアーキテクチャで次のよ うに記述します。

process(clk) is begin if rising_edge(clk) then y <= my_func(a,b); end if;end process;

上記のコードではエンティティ内で my_func 関数が使用されていますが、 関数が実行するの処理自体は定義されて

いません。 これは、 上位 RTL で bottom をインスタンシエートする と きに定義します。

inst_bot1 : bottom generic map ( my_func => my_func1 ) port map ...

上記のコードでは、 VHDL ファ イルまたはパッケージ ファ イルで宣言されている my_func1 関数をジェネ リ ッ クの my_func 関数に関連付けています。 my_func1 で a および b という 2 つの符号なしの入力が使用されていれば、 この

コードは機能します。

緩和された関数戻り値の規則

以前のバージ ョ ンの VHDL では、 関数 return 式は関数の戻り値型で宣言されているのと同じデータ型である必要が

あ り ました。 VHDL-2008 ではこの規則が緩和され、 return 式を暗示的に戻り値型に変換するこ とが可能です。 次に

例を示します。

subtype my_type1 is std_logic_vector(9 downto 0);subtype my_type2 is std_logic_vector(4 downto 0);

function my_function (a,b : my_type2) return my_type1 isbeginreturn (a&b);end function;

連結はスタティ ッ クではないので、 これは VHDL ではエラーまたは警告とな り ます。 VHDL-2008 では許容されま

す。

Page 211: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 211UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 6 章: VHDL-2008 言語サポート

グローバルおよびローカルでスタテ ィ ックな論理式への拡張

VHDL では、 多くのタイプの場所で論理式がスタティ ッ クである必要があ り ます。 たとえば、 連結を使用する とス

タティ ッ ク値は返されず、 スタティ ッ ク値が必要な演算子または関数で使用する とエラーとな り ます。 VHDL-2008 では、 連結などのよ り多くの論理式でスタティ ッ ク値を返すこ とが可能となっており、 柔軟性が高くなっています。

スタテ ィ ック範囲および範囲内での整数式

VHDL では、 あるオブジェク トの範囲を使用して別のオブジェク トの範囲を宣言するこ とが可能でした。 次に例を

示します。

for I in my_signal’range...

この場合、 my_signal の範囲が固定されている必要があ り、 my_signal が制約なしのデータ型と して宣言されて

いる とエラーになり ます。 VHDL-2008 では、 エラボレーシ ョ ン時に範囲を取得するのでこれが許容されます。

ブロック コ メン ト

VHDL では、 コ メン トの各行に 「--」 が必要でした。 VHDL-2008 では、 /* と */ 行を使用したコ メン トのブロ ッ クが

サポート されます。

process(clk) beginif clk’event and clk=’1’ then/* this is a blockcomment */out1 <= in1;end if;

end process;

Page 212: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 212UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章

Verilog サポート

概要

この章では、 Vivado® 合成での Verilog ハードウェア記述言語のサポートについて説明します。

この章にはコード例が含まれます。 コード例のファイルは、 この リ ンクからダウンロードできます。

Verilog デザイン

複雑な回路は通常、 ト ップダウン手法を使用して設計されます。

• 設計プロセスの各段階で、 さまざまな仕様レベルが必要とな り ます。 たとえば、 アーキテクチャ レベルでは、

仕様はブロッ ク図または ASM (Algorithmic State Machine) チャートに対応します。

• ブロ ッ クまたは ASM 段階は、 次のよ うな N ビッ ト ワイヤで接続されるレジスタ ト ランスファー ブロ ッ クに対

応します。

° レジスタ

° 加算器

° カウンター

° マルチプレクサー

° インターコネク ト ロジッ ク

° 有限ステート マシン (FSM)

• Verilog では、 ASM チャートおよび回路図などをコンピューター言語で記述できます。

Verilog の機能

Verilog では、 ビヘイビアー記述および構造言語記述の両方が可能で、 さまざまな抽象レベルでデザイン オブジェク

ト を表現できます。

• Verilog を使用してハード ウェアを設計する と、 次のよ うなソフ ト ウェアの概念を利用できます。

° 並列処理

° オブジェク ト指向プログラム

• Verilog の構文は、 C 言語および Pascal に類似しています。

Page 213: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 213UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

• Vivado 合成では、 IEEE 1364 がサポート されます。

• Verilog 合成での Verilog サポートでは、 グローバル回路および各ブロッ クを効率的に記述できます。

° 合成は、 各ブロ ッ クに最適な合成フローを使用して実行されます。

° こ こで合成とは、 Verilog のビヘイビアー記述と構造記述を、 フラ ッ ト化されたゲート レベルのネッ ト リ ス

トにコンパイルするこ とを指します。 生成されたネッ ト リ ス トは、 Virtex® デバイスなどのプログラマブル ロジッ ク デバイスをカスタム プログラムするために使用できます。

° 次のものに対して、 それぞれ異なる合成方法が使用されます。

- 数値演算ブロッ ク

- インターコネク ト ロジッ ク

- 有限ステート マシン (FSM) コンポーネン ト

基本的な Verilog の概念については、 『IEEE Standard VHDL Language Reference Manual』 を参照してください。

Verilog-2001 サポート

Vivado 合成では、 Verilog-2001 の次の機能がサポート されます。

• generate 文

• ポート /データ型を 1 つの文で宣言

• ANSI 形式のポート リ ス ト

• モジュール演算子ポート リ ス ト

• ANSI C 形式のタスク /関数宣言

• カンマで区切ったセンシティビティ リ ス ト

• 組み合わせロジッ ク センシティビティ

• 継続代入文のデフォルト ネッ ト

• デフォルト ネッ ト宣言のディ スエーブル

• インデッ クス付きベクター部分選択

• 多次元配列

• ネッ トおよび実数データ型の配列

• 配列ビッ ト選択および部分選択

• 符号付きレジスタ、 ネッ ト 、 およびポート宣言

• 符号付き整数

• 符号付き論理式

• 算術シフ ト演算子

• 32 ビッ ト を超える幅の自動的な拡張

• べき乗演算子

• N サイズのパラ メーター

• 明示的なインライン パラ メーター渡し

• 固定ローカル パラ メーター

Page 214: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 214UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

• 拡張された条件付きコンパイル

• ファ イルおよび行のコンパイラ指示子

• 変数による部分選択

• 再帰タスクおよび関数

• 定数関数

詳細は、 次を参照してください。

• Sutherland, Stuart 著 『Verilog 2001: A Guide to the New Features of the Verilog Hardware Description Language』 (2002)

• 『IEEE Standard Verilog Hardware Description Language Manual』 (IEEE Standard1364-2001)

Verilog-2001 の変数による部分選択

Verilog-2001 では、 変数を使用してベクターからビッ トのグループを選択できます。

変数による部分選択は、 2 つの明示的な値で範囲を指定するのではなく、 範囲の始点とベクターの幅を指定して定義

します。 部分選択の始点はさまざまです。 部分選択の幅は定数のままです。

表 7-1 に、 変数による部分選択の記号を示します。

変数による部分選択の Verilog コード例

reg [3:0] data;reg [3:0] select; // a value from 0 to 7wire [7:0] byte = data[select +: 8];

構造 Verilog構造 Verilog 記述を使用する と、 複数のコード ブロ ッ クを統合し、 デザインを階層構造にできます。 次の表に、 ハー

ド ウェア構造とその説明を示します。

次の表に、 Verilog コンポーネン ト と、 その表示および内容を示します。

表 7-1: 変数による部分選択

記号 説明

+ (プラス) 部分選択は始点から増分

- (マイナス) 部分選択は始点から減分

表 7-2: ハードウェア構造の基本概念

概念 説明

コンポーネン ト 構築または基本ブロッ ク

ポート コンポーネン トの I/O コネクタ

信号 コンポーネン ト間のワイヤに対応

Page 215: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 215UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

• コンポーネン トはデザイン モジュールで表されます。

• コンポーネン ト間の接続は、 コンポーネン ト インスタンシエーシ ョ ン文で指定されます。

• コンポーネン ト インスタンシエーシ ョ ン文には、 次の特徴があ り ます。

° コンポーネン ト を別のコンポーネン ト または回路で使用する場合に、 コンポーネン トのインスタンスを指

定します。

° 識別子で区別されます。

° ローカル コンポーネン ト宣言部分で宣言されたコンポーネン トの名前が指定されます。

° 関連付け リ ス ト (かっこで囲まれた リ ス ト ) が含まれます。 この リ ス トでは、 該当するローカル ポートに関

連付けられている信号およびポートが指定されます。

ビルト イン ロジック ゲート

Verilog では、 多数のビルト イン ロジッ ク ゲートが提供されており、 それらをインスタンシエート して大型のロジッ

ク回路を構築します。 ビルト イン ロジッ ク ゲートで記述される論理関数は、 次のとおりです。

° AND

° OR

° XOR

° NAND

° NOR

° NOT

2 入力 XOR 関数の例

次のコード例では、 ビルト イン モジュールの各インスタンスに a_inv、 b_inv、 out などの固有のインスタンス名

が指定されています。

module build_xor (a, b, c);input a, b;output c;wire c, a_not, b_not;

not a_inv (a_not, a); not b_inv (b_not, b); and a1 (x, a_not, b); and a2 (y, b_not, a); or out (c, x, y);endmodule

半加算器の例

次に、 4 つの 2 入力 NAND モジュールから構成される半加算器の構造記述例を示します。

表 7-3: Verilog のコンポーネン ト

項目 表示 内容

宣言 外部 コンポーネン ト ポート を含む外観

本体 内部 コンポーネン トのビヘイビアーまたは構造

Page 216: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 216UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

module halfadd (X, Y, C, S);input X, Y;output C, S;wire S1, S2, S3;

nand NANDA (S3, X, Y); nand NANDB (S1, X, S3); nand NANDC (S2, S3, Y); nand NANDD (S, S1, S2); assign C = S3;endmodule

定義済みプリ ミテ ィブのインスタンシエーシ ョ ン

Verilog の構造記述では、 ゲート、 レジスタなどの定義済みプリ ミ ティブや、 CLKDLL および BUFG のよ うなザイ リ ン

クス特有のプリ ミティブをインスタンシエート して回路を記述できます。

これらのプリ ミ ティブは、 ザイ リ ンクス Verilog のプリ ミティブに追加され、 XST Verilog ライブラ リ (unisim_comp.v) で提供されます。

FDC および BUFG プリ ミテ ィブをインスタンシエートする例

FDC および BUFG の定義は、 unisim_comp.v ライブラ リ ファ イルに含まれます。

module example (sysclk, in, reset, out);input sysclk, in, reset;output out;reg out;wire sysclk_out;

FDC register (out, sysclk_out, reset, in); //position based referencingBUFG clk (.O(sysclk_out),.I(sysclk)); //name based referencing

Verilog のパラメーター

Verilog のパラ メーターには、 次の特徴があ り ます。

• 簡単に再利用および拡張可能なパラ メーター指定コードを作成できます。

• コードを読みやすく し、 コンパク トで管理しやすいものにします。

• これらの機能は、 次のよ うに記述します。

° バス サイズ

° デザイン ユニッ トの特定の反復エレ メン トの量

• Verilog パラ メーターは定数です。 パラ メーター モジュールの各インスタンシエーシ ョ ンで、 デフォルトの演算

子の値を変更可能です。

• VHDL のジェネ リ ッ ク と同等です。 null 文字列パラ メーターはサポート されていません。

ジェネ リ ッ ク コマンド ライン オプシ ョ ンを使用する と、 最上位デザイン ブロ ッ クで定義される Verilog パラ

メーターを再定義できます。 これによ り、 ソースコードを変更しなくてもデザインを簡単に変更できます。 こ

れは、 IP コアの生成およびフロー テス トで便利な機能です。

Page 217: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 217UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

Verilog パラメーターの例

コード例のファイルは、 この リ ンクからダウンロードできます。

ファ イル名: parameter_1.v

// A Verilog parameter allows to control the width of an instantitated// block describing register logic//// // File:parameter_1.v//module myreg (clk, clken, d, q);

parameter SIZE = 1;

input clk, clken; input [SIZE-1:0] d; output reg [SIZE-1:0] q; always @(posedge clk) begin if (clken) q <= d; end endmodule

module parameter_1 (clk, clken, di, do);

parameter SIZE = 8;

input clk, clken; input [SIZE-1:0] di; output [SIZE-1:0] do;

myreg #8 inst_reg (clk, clken, di, do);

endmodule

Verilog パラメーターおよび generate-for の例

次のコード例は、 パラ メーターと generate-for 構文を使用して反復エレ メン トの作成を制御する方法を示します。 詳

細は、 「generate ループ文」 を参照してください。

ファ イル名: parameter_generate_for_1.v

//// A shift register description that illustrates the use of parameters and// generate-for constructs in Verilog//// File: parameter_generate_for_1.v//module parameter_generate_for_1 (clk, si, so);

parameter SIZE = 8;

input clk;

Page 218: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 218UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

input si;output so;

reg [0:SIZE-1] s;

assign so = s[SIZE-1];

always @ (posedge clk) s[0] <= si;

genvar i;generate for (i = 1; i < SIZE; i = i+1) begin : shreg always @ (posedge clk) begin s[i] <= s[i-1]; end end endgenerate endmodule

Verilog パラメーターと属性の競合

次が原因で Verilog パラ メーターと属性が競合するこ とがあ り ます。

• Verilog コードのインスタンス とモジュールの両方にパラ メーターおよび属性を適用できる。

• 属性を制約ファイルでも指定できる。

Verilog の使用制限

Vivado 合成で Verilog を使用する場合、 次のよ うな制限があ り ます。

• 大文字/小文字の区別

• ブロ ッキングおよびノンブロ ッキング代入文

• 整数の処理

大文字/小文字の区別

Vivado 合成では、 大文字と小文字が区別されます。

• Verilog では大文字と小文字が区別されるので、 モジュール名、 インスタンス名、 および信号名は、 大文字と小

文字が異なれば別の名前と して識別されます。

° Vivado 合成では、 大文字/小文字だけが異なるインスタンス名および信号名を含むデザインは合成可能で

す。

° 大文字/小文字だけが異なるモジュール名が含まれる場合は、 エラーが発生します。

• オブジェク ト名を大文字/小文字の違いだけで区別するこ とはお勧めしません。 大文字/小文字だけで名前を区別

する と、 混合言語プロジェク トで問題が発生します。

Page 219: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 219UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

ブロッキングおよびノンブロッキング代入文

Vivado 合成では、 ブロ ッキングおよびノンブロ ッキング代入文がサポート されます。

• ブロ ッキング代入文と ノンブロ ッキング代入文を混合しないでください。

• ブロ ッキング代入文と ノンブロ ッキング代入文を混合してもデザインはエラーなしで合成されますが、 シ ミ ュ

レーシ ョ ンでエラーが発生するこ とがあ り ます。

Vivado シ ミ ュレーシ ョ ン用の Verilog フォーマッ トの詳細は、 『Vivado Design Suite ユーザー ガイ ド : ロジッ ク シ ミ ュ

レーシ ョ ン』 (UG900) [参照 11] のこのセクシ ョ ンを参照してください。

使用不可能な例 1

同じ信号にブロッキング代入文と ノンブロ ッキング代入文を混合しないでください。

always @(in1)beginif (in2)out1 = in1;

end elseout1 <= in2;

使用不可能な例 2

同じ信号の異なるビッ トにブロ ッキング代入文と ノンブロ ッキング代入文を混合しないでください。

if (in2)beginout1[0] = 1'b0;out1[1] <= in1;

end else beginout1[0] = in2;out1[1] <= 1'b1;

end

整数の処理

Vivado 合成では、 整数がほかの合成ツールと異なる方法で処理される場合があ り ます。 その場合、 整数を特定の方

法でコード記述する必要があ り ます。

Verilog case 文での整数処理

case 項目式にサイズが指定されていない整数がある と、 結果が予測不可能になるこ とがあ り ます。

Verilog case 文での整数処理の例

次のコード例では、 case 項目式 4 のサイズが指定されていないので、 結果が予測不可能になり ます。 この問題を解

決するには、 この case 項目式 4 のサイズを 3 ビッ トにします。

reg [2:0] condition1; always @(condition1) begincase(condition1)4 : data_out = 2; // Generates faulty logic

Page 220: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 220UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

3'd4 : data_out = 2; // Does workendcase

end

連結文での整数処理

Verilog 連結文にサイズが指定されていない整数がある と、 結果が予測不可能になるこ とがあ り ます。 整数のサイズ

が指定されない式を使用する と、 次のよ うにな り ます。

• その式が一時的な信号に代入されます。

• 連結文に一時的な信号が使用されます。

reg [31:0] temp;assign temp = 4'b1111 % 2;assign dout = {12/3,temp,din};

Verilog-2001 の属性と メ タ コ メン ト

Verilog-2001 属性

• 合成ツールなどのプログラムに特定の情報を渡すために使用します。

• 広く使用されています。

• モジュール宣言およびインスタンシエーシ ョ ン内で、 演算子または信号に指定できます。

• コンパイラでほかの属性宣言がサポート されていても、 Vivado 合成では無視されます。

• Verilog-2001 属性を使用して次のものに制約を設定します。

° 次のよ うな個別のオブジェク ト :

- モジュール

- インスタンス

- ネッ ト

° 次の合成制約を設定します。

- フル ケース

- パラレル ケース

Verilog メ タ コ メン ト

• Verilog メ タ コ メン トは、 Verilog パーサーで認識されます。

• Verilog メ タ コ メン トは、 次のよ うな個々のオブジェク トに制約を設定します。

° モジュール

° インスタンス

° ネッ ト

• Verilog メ タ コ メン トは、 合成で次の指示子を設定します。

° parallel_case および full_case

° translate_on および translate_off

Page 221: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 221UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

° ツール特定の指示子 (syn_sharing など)

Verilog メ タ コ メン トのサポート

Vivado 合成では、 次がサポート されます。

• C スタイルおよび Verilog スタイルのメ タ コ メン ト

° C スタイル

/* ...*/

• C スタイルでは、 コ メン ト を複数行にできます。

° Verilog スタイル

// ...

Page 222: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 222UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

Verilog スタイルのコ メン トは、 行末で終了します。

• translate_off と translate_on

// synthesis translate_on// synthesis translate_off

• パラレル ケース

// synthesis parallel_case full_case// synthesis parallel_case// synthesis full_case

• 個々のオブジェク トに対する制約

Verilog メ タ コ メン トの構文

// synthesis attribute [of] ObjectName [is] AttributeValue

Verilog メ タ コ メン トの構文例

// synthesis attribute RLOC of u123 is R11C1.S0// synthesis attribute HUSET u1 MY_SET// synthesis attribute fsm_extract of State2 is "yes"// synthesis attribute fsm_encoding of State2 is "gray"

Verilog コンスト ラク ト

次の表に、 Vivado 合成での Verilog コンス ト ラ ク トのサポート ステータスを示します。

表 7-4: Verilog コンスト ラク ト

Verilog 定数 サポート ステータス

定数

整数 サポート あ り

実数 サポート あ り

文字列 サポート なし

Verilog データ型

ネッ ト型

• tri0

• tri1

• trireg

サポート なし

• wand

• wor

サポート あ り

すべての駆動電流 無視

real および realtime レジスタ サポート なし

すべての名前付きイベン ト サポート なし

遅延 無視

Page 223: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 223UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

Verilog 手続き代入文

assign 制限付きでサポート。 「assign 文および deassign 文の使用」 を参照してください。

deassign 制限付きでサポート。 「assign 文および deassign 文の使用」 を参照してください。

force サポート なし

release サポート なし

forever 文 サポート なし

repeat 文 サポート あ り (repeat 値は定数にする必要あ り )

for 文 サポート あ り (範囲はスタティ ッ クにする必要あ り )

delay (#) 無視

event (@) サポート なし

wait サポート なし

名前付きイベン ト サポート なし

並列ブロッ ク サポート なし

指定ブロッ ク 無視

disable サポート あ り (for および repeat ループ文を除く )

Verilog デザイン階層

モジュール定義 サポート あ り

マクロモジュール定義 サポート なし

階層名 サポート あ り

defparam サポート あ り

インスタンスの配列 サポート あ り

Verilog コンパイラ指示子

`celldefine `endcelldefine 無視

`default_nettype サポート あ り

`define サポート あ り

`ifdef `else `endif サポート あ り

`undef、 `ifndef、 `elsif サポート あ り

`include サポート あ り

`resetall 無視

`timescale 無視

`unconnected_drive `nounconnected_drive

無視

`uselib サポート なし

`file、 `line サポート あ り

表 7-4: Verilog コンスト ラク ト (続き)

Verilog 定数 サポート ステータス

Page 224: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 224UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

Verilog のシステム タスクおよび関数

Vivado 合成では、 次の表に示すシステム タスクまたは関数がサポート されます。 サポート されないシステム タスク

は無視されます。

表 7-5: システム タスクとそのサポート ステータス

システム タスクおよび関数 ステータス 注記

$display サポート なし

$fclose サポート なし

$fdisplay 無視

$fgets サポート なし

$finish 無視

$fopen 無視

$fscanf 無視 エスケープ シーケンスは %b および %d に制限

されます。

$fwrite 無視

$monitor 無視

$random 無視

$readmemb サポート あ り

$readmemh サポート あ り

$signed サポート あ り

$stop 無視

$strobe 無視

$time 無視

$unsigned サポート あ り

$write サポート なし

$clog2 サポート あ り SystemVerilog でのみサポート されます。

$floor 制限付きサポート パラ メーターのみ。

$ceil 制限付きサポート パラ メーターのみ。

$rtoi サポート あ り

$itor サポート あ り

その他すべて 無視

Page 225: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 225UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

変換関数の使用

$signed および $unsigned システム タスクは、 任意の式で次の構文を使用して呼び出すこ とができます。

$signed(expr) or $unsigned(expr)

• これらの呼び出しの戻り値は、 入力値と同じサイズです。

• 戻り値の符号は、 以前の符号にかかわらず強制されます。

ファイル I/O タスクを使用したメモリの内容の読み込み

$readmemb および $readmemh システム タスクは、 ブロ ッ ク メモ リの初期化に使用できます。

• 2 進数の場合は $readmemb を使用します。

• 16 進数の場合は $readmemh を使用します。

• Vivado 合成とシ ミ ュレータで処理の違いが発生しないよ うにするため、 インデッ クス パラ メーターを使用しま

す。

$readmemb("rams_20c.data",ram, 0, 7);

サポート されるエスケープ シーケンス

• %h

• %d

• %o

• %b

• %c

• %s

Verilog プリ ミテ ィブ

Vivado 合成では、 表 7-6 に示すプリ ミティブを除く Verilog ゲート レベル プリ ミティブがサポート されます。

次の Verilog スイ ッチ レベル プリ ミ ティブはサポート されません。

cmos, nmos, pmos, rcmos, rnmos, rpmos rtran, rtranif0, rtranif1, tran, tranif0, tranif1

ゲート レベル プリ ミテ ィブの構文

gate_type instance_name (output, inputs,...);

ゲート レベル プリ ミテ ィブの例

and U1 (out, in1, in2); bufif1 U2 (triout, data, trienable);

Page 226: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 226UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

サポート されない Verilog ゲート レベル プリ ミテ ィブ

次の表に、 Vivado 合成でサポート されていないゲート レベル プリ ミ ティブを示します。

Verilog の予約キーワード

次の表に、 予約キーワードを示します。 アスタ リ スク (*) の付いているキーワードは Verilog の予約キーワードで、

Vivado 合成ではサポート されません。

表 7-6: サポート されない Verilog ゲート レベル プリ ミテ ィブ

プリ ミテ ィブ ステータス

プルダウンおよびプルアップ サポート なし

駆動電流および遅延 無視

プリ ミティブの配列 サポート なし

表 7-7: Verilog の予約キーワード

always and assign automatic

begin buf bufif0 bufif1

case casex casez cell*

cmos config* deassign default

defparam design* disable edge

else end endcase endconfig*

endfunction endgenerate endmodule endprimitive

endspecify endtable endtask event

for force forever fork

function generate genvar highz0

highz1 if ifnone incdir*

include* initial inout input

instance* integer join larger

liblist* library* localparam macromodule

medium module nand negedge

nmos nor noshow-cancelled* not

notif0 notif1 or output

parameter pmos posedge primitive

pull0 pull1 pullup* pulldown*

pulsestyle_ondetect* pulsestyle_onevent* rcmos real

realtime reg release repeat

rnmos rpmos rtran rtranif0

rtranif1 scalared show-cancelled* signed

Page 227: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 227UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

Verilog ビヘイビアー記述

Vivado 合成では、 特に記述のない限り、 Verilog ビヘイビアー記述がサポート されます。

Verilog ビヘイビアー記述の変数

• Verilog ビヘイビアー記述の変数は、 整数と して宣言します。

• これらの宣言はテス ト コードでのみ使用されます。 実際のハードウェア記述では、 reg や wire などのデータ

型を使用できます。

• reg と wire の違いは、 変数の値が reg では手続きブロ ッ クで、 wire では継続代入文で指定される点です。

° reg および wire のデフォルト幅はどちらも 1 ビッ ト (スカラー ) です。

° reg または wire 宣言で N ビッ ト幅 (ベクター ) を指定するには、 角かっこ ([ ]) 内に左のビッ ト位置と右の

ビッ ト位置をコロンで区切って定義します。

° Verilog-2001 では、 reg および wire データ型のどちらも符号付きまたは符号なしにできます。

変数宣言の例

reg [3:0] arb_priority;wire [31:0] arb_request;wire signed [8:0] arb_signed;

初期値

Verilog-2001 では、 レジスタを宣言する と きにに初期化できます。

• 指定可能な初期値は、 次のよ うな値です

° 定数値です。

° 以前の初期値に依存させるこ とはできません。

° 関数またはタスク呼び出しは使用できません。

° レジスタに伝搬するパラ メーター値にできます。

° ベクターのすべてのビッ ト を指定します。

small specify specparam strong0

strong1 supply0 supply1 table

task time tran tranif0

tranif1 tri tri0 tri1

triand trior trireg use*

vectored wait wand weak0

weak1 while wire wor

xnor xor

表 7-7: Verilog の予約キーワード (続き)

Page 228: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 228UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

• 宣言部でレジスタの初期値を指定した場合、 グローバルリセッ ト時または電源投入時にレジスタの出力がその

値に初期化されます。

• この方法で指定された初期値は、 次のよ うにな り ます。

° レジスタの INIT 属性と して Verilog ファ イルに渡されます。

° ローカル リ セッ トには依存しません。

レジスタへの初期値の割り当て

レジスタにセッ ト / リ セッ ト (初期) 値を指定できます。

• レジスタのリセッ ト ラインが最適な値になったと きにレジスタに代入する値を指定します。 次のコード例を参

照してください。

• 初期値と して変数を指定する と、 値は次のよ うにな り ます。

° 値はフ リ ップフロ ップと してインプリ メン ト され、 その出力はローカル リ セッ トで制御されます。

° 値は FDP または FDC フ リ ップフロ ップと して Verilog ファ イルに渡されます。

初期値の例 1

reg arb_onebit = 1'b0;reg [3:0] arb_priority = 4'b1011;

初期値の例 2

always @(posedge clk)beginif (rst)arb_onebit <= 1'b0;

end

reg および wire の配列

Verilog では、 reg および wire の配列を使用できます。

配列の例 1

次のコード例は、 32 エレ メン トの配列を示します。 エレ メン トの幅はそれぞれ 4 ビッ トです。

reg [3:0] mem_array [31:0];

配列の例 2

次のコード例は、 64 個の 8 ビッ ト幅エレ メン トの配列を示します。 これらのエレ メン トは、 構造記述の Verilog コー

ドでのみ代入できます。

wire [7:0] mem_array [63:0];

多次元配列

Vivado 合成では、 2 次元までの多次元配列型がサポート されます。

• 次の多次元配列が可能です。

Page 229: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 229UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

° 任意のネッ ト

° 任意の変数データ型

• 配列を使用したコード代入や数値演算が可能です。

• 一度に選択できる配列のエレ メン トは 1 つのみです。

• 多次元配列を次のものに渡すこ とはできません。

° システム タスクまたは関数

° 通常タスクまたは関数

多次元配列の例 1

次のコード例は、 256 x 16 ワイヤ エレ メン ト (各 8 ビッ ト ) の配列を記述しています。 これらのエレ メン トは、構造記

述の Verilog コードでのみ代入できます。

wire [7:0] array2 [0:255][0:15];

多次元配列の例 2

次のコード例は、 256 x 8 レジスタ エレ メン ト (各 64 ビッ ト ) の配列を記述しています。 これらのエレ メン トは、 ビヘ

イビアー記述の Verilog コードでのみ代入できます。

reg [63:0] regarray2 [255:0][7:0];

データ型

Verilog のビッ ト データ型には、 次の 4 つの値があ り ます。

• 0: 論理 0

• 1: 論理 1

• x: 不明の論理値

• z: ハイ インピーダンス

サポート されるデータ型

• ネッ ト

° wire

° wand

° wor

• レジスタ

° reg

° integer

• 定数

° parameter

° 多次元配列 (メモ リ )

Page 230: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 230UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

ネッ トおよびレジスタ

ネッ トおよびレジスタは次のいずれかにできます。

• 単ビッ ト (スカラー )

• 複数ビッ ト (ベクター )

ビヘイビアー記述のデータ型の例

次に、 Verilog モジュールの宣言部に含まれる Verilog データ型の例を示します。

wire net1; // single bit net reg r1; // single bit registertri [7:0] bus1; // 8 bit tristate bus reg [15:0] bus1; // 15 bit registerreg [7:0] mem[0:127]; // 8x128 memory register parameter state1 = 3'b001; // 3 bit constant parameter component = "TMS380C16"; // string

使用可能な文

Vivado 合成では、 Verilog ビヘイビアー記述で有効な文がサポート されます。

• 有効な文 (変数および信号代入) は次のとおりです。

° <変数> = <論理式>

° if (<条件>) 文

° else 文

° case (<論理式>) 文

expression: statement...default: statementendcase

° for (<変数> = <論理式>; <条件>; <変数> = <変数> + <論理式>) 文

° while (<条件>) 文

° forever 文

° function および task

• すべての変数は、 integer (整数) または reg (レジスタ ) と して宣言されます。

• 変数は wire と して宣言するこ とはできません。

論理式

Verilog ビヘイビアー記述の論理式には、 次のものがあ り ます。

• 定数

• 次の演算子を含む変数

° 算術演算子

Page 231: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 231UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

° 論理演算子

- ビッ ト

- 論理演算子

° 比較演算子

° 条件演算子

論理演算子

論理演算子がビッ ト または論理のどちらのカテゴ リに属するかは、 演算子が適用される論理式に 1 ビッ トが含まれ

るか複数のビッ トが含まれるかによ り ます。

サポート される演算子

サポート される論理式

表 7-8: サポート される演算子

算術演算子 論理演算子 比較演算子 条件演算子

+ & < ?

- && ==

* | ===

** || <=

/ ^ >=

% ~ >=

~^ !=

^~ !==

<< >

>>

<<<

>>>

表 7-9: サポート される論理式

論理式 記号 ステータス

連結 {} サポート あ り

複製 {{}} サポート あ り

算術演算 +、 -、 *、 ** サポート あ り

除算 / 2 番目のオペランドが 2 のべき乗の定数の場合、 または両

方のオペランドが定数の場合にサポート。

剰余 % 2 番目のオペランドが 2 のべき乗の定数の場合にサポート。

加算 + サポート あ り

減算 - サポート あ り

乗算 * サポート あ り

Page 232: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 232UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

べき乗 ** サポート あ り

• 両方のオペランドが定数で、 2 番目のオペランドが負で

ない場合。

• 最初のオペランドが 2 の場合、 2 番目のオペランドは変

数にするこ とが可能。

• Vivado 合成では実数データ型はサポート されず、 結果

が実数となるオペランドの組み合わせを使用する とエ

ラーが発生。

• X (不明) および Z (ハイインピーダンス) は使用不可。

比較演算 >、 <、 >=、 <= サポート あ り

論理否定 ! サポート あ り

論理 AND && サポート あ り

論理 OR || サポート あ り

論理等号 == サポート あ り

論理不等号 != サポート あ り

ケース等号 === サポート あ り

ケース不等号 !== サポート あ り

ビッ ト単位否定 ~ サポート あ り

ビッ ト単位 AND & サポート あ り

ビッ ト単位 OR | サポート あ り

ビッ ト単位排他的 OR ^ サポート あ り

ビッ ト単位等価 ~^、 ^~ サポート あ り

リ ダクシ ョ ン AND & サポート あ り

リ ダクシ ョ ン NAND ~& サポート あ り

リ ダクシ ョ ン OR | サポート あ り

リ ダクシ ョ ン NOR ~| サポート あ り

リ ダクシ ョ ン XOR ^ サポート あ り

リダクシ ョ ン XNOR ~^、 ^~ サポート あ り

左シフ ト << サポート あ り

符号付き右シフ ト >>> サポート あ り

符号付き左シフ ト <<< サポート あ り

右シフ ト >> サポート あ り

条件演算子 ?: サポート あ り

イベン ト OR or、 ',' サポート あ り

表 7-9: サポート される論理式 (続き)

論理式 記号 ステータス

Page 233: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 233UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

論理式の評価

次の表の === と !== には、 次のよ うな特徴があ り ます。

• 特殊な比較演算子です。

• シ ミ ュレーシ ョ ンで使用され、 変数に値 x または z が代入されているかを確認します。

• 合成では、 これらの演算子は == および != と して処理されます。

Vivado シ ミ ュレーシ ョ ン用の Verilog フォーマッ トの詳細は、 『Vivado Design Suite ユーザー ガイ ド : ロジッ ク シミ ュレーシ ョ ン』 (UG900) [参照 11] のこのセクシ ョ ンを参照してください。

最もよ く使用される演算子での論理式の評価結果

ブロック

Vivado 合成では、 一部のブロッ ク文がサポート されています。

• ブロ ッ ク文は、 複数の文をグループ化します。 begin キーワードで開始し、 end キーワードで終了します。 ブ

ロ ッ ク内では、 記述された順に文が実行されます。

• Vivado 合成では、 順次ブロッ クのみがサポート されます。

• Vivado 合成では、 パラレル ブロ ッ クはサポート されません。

• ブロ ッ ク内の手続き文は、 すべてモジュール内で定義します。

• 手続き型ブロ ッ クには、 initial ブロ ッ ク と always ブロ ッ クの 2 種類があ り ます。

表 7-10: 最もよ く使用される演算子での論理式の評価結果

a b a==b a===b a!=b a!==b a&b a&&b a|b a||b a^b

0 0 1 1 0 0 0 0 0 0 0

0 1 0 0 1 1 0 0 1 1 1

0 x x 0 x 1 0 0 x x x

0 z x 0 x 1 0 0 x x x

1 0 0 0 1 1 0 0 1 1 1

1 1 1 1 0 0 1 1 1 1 0

1 x x 0 x 1 x x 1 1 x

1 z x 0 x 1 x x 1 1 x

x 0 x 0 x 1 0 0 x x x

x 1 x 0 x 1 x x 1 1 x

x x x 1 x 0 x x x x x

x z x 0 x 1 x x x x x

z 0 x 0 x 1 0 0 x x x

z 1 x 0 x 1 x x 1 1 x

z x x 0 x 1 x x x x x

z z x 1 x 0 x x x x x

Page 234: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 234UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

• 各ブロッ クは begin キーワードで開始し、 end キーワードで終了します。 initial ブロ ッ クは合成では無視され

るので、 こ こでは always ブロ ッ クのみを説明します。

• always ブロ ッ クは通常、 次のフォーマッ トで記述されます。 各文は手続き代入文であ り、 セ ミ コロンで区切

られます。

always begin statement.... end

モジュール

Verilog では、 デザイン コンポーネン トはモジュールで表されます。 モジュールは宣言およびインスタンシエートす

る必要があ り ます。

モジュール宣言

• Verilog ビヘイビアー記述のモジュール宣言には、 次が含まれます。

° モジュール名

° I/O ポートの リ ス ト

° 機能を定義するモジュール本体

• endmodule 文で終了します。

回路の I/O ポート

• 回路の I/O ポートはモジュール宣言にリ ス ト します。

• 各 I/O ポートに次を指定します。

° 名前

° モード : 入力、 出力、 入出力

° ポートが配列型の場合、 範囲情報

Verilog ビヘイビアー記述のモジュール宣言の例 1

module example (A, B, O);input A, B;output O;assign O = A & B;

endmodule

Verilog ビヘイビアー記述のモジュール宣言の例 2

module example ( input A, inputB, output O);

assign O = A & B;endmodule

Page 235: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 235UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

モジュール インスタンシエーシ ョ ン

Verilog ビヘイビアー記述のモジュール インスタンシエーシ ョ ン文には、 次の特徴があ り ます。

• インスタンス名を定義します。

• ポート関連リ ス トが含まれます。 ポート関連リ ス トでは、 インスタンスが親モジュールでどのよ うに接続され

るかが指定されます。 ポート関連リ ス トの各エレ メン トは、 モジュール宣言のフォーマル ポート と親モジュー

ルの実際のネッ ト を関連付けます。

• 別のモジュールにインスタンシエート されます。 次のコード例を参照してください。

Verilog ビヘイビアー記述のモジュール インスタンシエーシ ョ ンのコード例

module top (A, B, C, O); input A, B, C; output O;wire tmp;

example inst_example (.A(A), .B(B), .O(tmp));

assign O = tmp | C;

endmodule

継続代入文

Vivado 合成では、 明示的継続代入文および暗示的継続代入文の両方がサポート されます。

• 継続代入文は、 組み合わせロジッ クを簡潔に記述するために使用します。

• Vivado 合成では、 継続代入文で指定した遅延および駆動電流は無視されます。

• 継続代入文は、 wire および tri データ型にのみ使用可能です。

明示的継続代入文

明示的継続代入は、 ネッ ト を定義した後に assign キーワードを使用してで代入式を指定します。

wire mysignal;...assign mysignal = select ? b : a;

暗示的継続代入文

暗示的継続代入文では assign キーワードは使用せず、 宣言文と代入式の組み合わせで定義します。

wire misignal = a | b;

手続き代入文

• Verilog ビヘイビアー記述の手続き代入文には、 次のよ うな特徴があ り ます。

° reg と して宣言された変数に値を代入します。

° always ブロ ッ ク、 タスク、 関数で最初に使用されます。

Page 236: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 236UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

° レジスタおよび有限ステート マシン (FSM) コンポーネン ト を記述します。

• Vivado 合成では、 次がサポート されます。

° 組み合わせ関数

° 組み合わせおよび順次タスク

° 組み合わせおよび順次 always ブロ ッ ク

組み合わせ always ブロック

組み合わせロジッ クは、 Verilog のタイ ミ ング制御文を使用する と効率的に記述できます。

• 遅延タイ ミ ング制御文 [#]

• イベン ト制御タイ ミ ング制御文 [@]

遅延タイ ミング制御文

遅延タイ ミ ング制御文 [#] には、 次のよ うな特徴があ り ます。

• シ ミ ュレーシ ョ ンにのみ関係します。

• 合成では無視されます。

Vivado シ ミ ュレーシ ョ ン用の Verilog フォーマッ トの詳細は、 『Vivado Design Suite ユーザー ガイ ド : ロジッ ク シミ ュレーシ ョ ン』 (UG900) [参照 11] のこのセクシ ョ ンを参照してください。

イベン ト制御タイ ミング制御文

イベン ト制御タイ ミ ング制御文 [@] を使用した組み合わせロジッ クの記述は、 次のよ うなものです。

• 組み合わせ always ブロ ッ クには、 always@ の後にかっこで囲まれたセンシティビティ リ ス トがあ り ます。

• センシティビティ リ ス トにある信号のいずれかにイベン ト (値の変化またはエッジ) が発生する と、 always ブロ ッ クが実行されます。

• センシティビティ リ ス トには、 次を含めるこ とができます。

° if や case などの条件で使用する信号。

° 代入文の右辺の信号。

• 信号のリ ス トの代わりに ( ) のなしで @ を使用する と、 説明したよ うに、 always ブロ ッ クの信号のいずれかに

イベン トが発生した場合に、 always ブロ ッ クが実行されます。

• 組み合わせプロセスでは、 if 文または case 文のすべての分岐で信号が明示的に代入されていない場合、 最後の

値を保持するラ ッチが生成されます。

• プロセスには、 次の文が使用されます。

° 変数代入文および信号代入文

° if-else 文

° case 文

° for-while ループ文

° 関数およびタスク呼び出し

Page 237: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 237UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

if-else 文の使用

Vivado 合成では、 if-else 文がサポート されています。

• if-else 文では、 真偽条件 (true/false) によって実行される文が決ま り ます。

° 条件が真と判断された場合は、 最初の文が実行されます。

° 条件が偽、 x、 または z と判断された場合は else 文が実行されます。

• キーワード begin および end を使用する と、 複数の文を含むブロッ クを実行できます。

• if-else 文はネス ト させるこ とができます。

if-else 文の例

次のコード例は、 if-else 文を使用してマルチプレクサーを記述しています。

module mux4 (sel, a, b, c, d, outmux);input [1:0] sel;input [1:0] a, b, c, d;output [1:0] outmux;reg [1:0] outmux;

always @(sel or a or b or c or d)beginif (sel[1])if (sel[0])outmux = d;elseelseoutmux = c;if (sel[0])outmux = b;

end endmoduleelseoutmux = a;

case 文Vivado 合成では、 case 文がサポート されています。

• case 文は論理式を比較し、 複数の並列分岐の 1 つを実行します。

° 分岐は記述された順に評価されます。

° 最初に真と判断された分岐が実行されます。

° どの分岐も偽である場合は、 default 分岐が実行されます。

• case 文では、 サイズ指定のない整数を使用しないでください。 整数のサイズを必ずビッ ト数で指定してくださ

い。 そ う しないと、 結果が予測不可能なものになり ます。

• casez は、 分岐のすべてのビッ ト位置の z 値をドン ト ケアと して処理します。

• casex は、 分岐のすべてのビッ ト位置の x および z 値をドン ト ケアと して処理します。

• casez 文または casex 文では、 クエスチョ ン マーク (?) も ドン ト ケアと して使用できます。

Page 238: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 238UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

case 文を使用したマルチプレクサーの例 (Verilog)

ファ イル名: top.v

// Multiplexer using case statement module mux4 (sel, a, b, c, d, outmux);input [1:0] sel;input [1:0] a, b, c, d;output [1:0] outmux;reg [1:0] outmux;

always @ * begin case(sel) 2'b00 : outmux = a;

2'b01 : outmux = b; 2'b10 : outmux = c; 2'b11 : outmux = d; endcase end endmodule

優先順処理の回避

• 上記の case 文の例では、 入力 sel の値が記述された順に評価されます。

• この優先順処理を回避するには、 次を実行します。

° parallel_case という Verilog 属性を使用して、 sel 入力が並列に評価されるよ うにします。

° case 文を次のものに置き換えます。

(* parallel_case *) case(sel)

for および repeat 文Vivado 合成では、 for および repeat 文がサポート されています。 always ブロ ッ クでは、 繰り返しまたはビッ ト スライス構造を記述するのにも for 文または repeat 文を使用できます。

for 文の使用

for 文では、 定数の範囲、 および <、 <=、 >、 >= 演算子を使用したテス ト条件の停止がサポート されます。

for 文では、 次のいずれかに適合する次ステップの計算もサポート されます。

• var = var + step

• var = var - step

説明:

° ver: ループ変数

° step : 定数値

Page 239: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 239UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

repeat 文repeat 文では定数値のみがサポート されます。

while ループの使用

always ブロ ッ クでは、 while ループを使用して繰り返し処理を実行できます。

• while ループには、 次の特徴があ り ます。

° テス ト式が始めから偽の場合は実行されません。

° テス ト式が偽になるまで、 ほかの文を実行します。

• 有効な Verilog 論理式であれば、 どれでもテス ト式と して使用できます。

• ループが恒久的に実行されるのを防ぐには、 -loop_iteration_limit オプシ ョ ンを使用します。

• while ループには、 disable 文を含めるこ とができます。 disable 文は、 ラベルが付いているブロ ッ ク内で

次のよ うに使用します。

disable <blockname>

while ループの例

parameter P = 4; always @(ID_complete) begin : UNIDENTIFIEDinteger i; reg found; unidentified = 0; i = 0;found = 0;while (!found && (i < P))beginfound = !ID_complete[i];unidentified[i] = !ID_complete[i];i = i + 1;

end

順次 always ブロックの使用

Vivado 合成では、 順次 always ブロ ッ クがサポート されています。

• always ブロ ッ ク と次のエッジ ト リ ガー イベン ト (posedge または negedge) を含むセンシティビティ リ ス ト

を使用して順序回路を記述します。

° ク ロ ッ ク イベン ト (必須)

° オプシ ョ ンのセッ ト / リ セッ ト イベン ト (非同期セッ ト / リ セッ ト制御ロジッ クの記述)

• オプシ ョ ンの非同期信号を記述しない場合、 always ブロ ッ クは次のよ うな構文になり ます。

always @(posedge CLK)begin<synchronous_part>end

• オプシ ョ ンの非同期信号を記述する場合、 always ブロ ッ クは次のよ うな構文になり ます。

always @(posedge CLK or posedge ACTRL1 or à )beginif (ACTRL1)<$asynchronous part>

else

Page 240: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 240UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

<$synchronous_part>end

順次 always ブロックの例

次のコード例では、 立ち上がりエッジ ク ロ ッ クを使用した 8 ビッ ト レジスタを記述しています。 その他の制御信号

はあ り ません。

module seq1 (DI, CLK, DO);input [7:0] DI;input CLK;output [7:0] DO;reg [7:0] DO;

always @(posedge CLK) DO <= DI ;endmodule

次のコード例では、 アクティブ High の非同期リセッ ト を追加しています。

module EXAMPLE (DI, CLK, ARST, DO);input [7:0] DI;input CLK, ARST;output [7:0] DO;reg [7:0] DO;

always @(posedge CLK or posedge ARST) if (ARST == 1'b1) DO <= 8'b00000000;

else DO <= DI;

endmodule

次のコード例では、 アクティブ High の非同期リセッ トおよびアクティブ Low の非同期セッ ト を記述しています。

module EXAMPLE (DI, CLK, ARST, ASET, DO);input [7:0] DI;input CLK, ARST, ASET;output [7:0] DO;reg [7:0] DO;

always @(posedge CLK or posedge ARST or negedge ASET)if (ARST == 1'b1)DO <= 8'b00000000;

elsif (ASET == 1'b1) DO <= 8'b11111111;else

DO <= DI;endmodule

次のコード例では、 非同期セッ ト / リ セッ トはな く、 同期リセッ ト を持つレジスタを記述しています。

module EXAMPLE (DI, CLK, SRST, DO);input [7:0] DI;input CLK, SRST;output [7:0] DO;reg [7:0] DO;

always @(posedge CLK)

Page 241: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 241UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

if (SRST == 1'b1) DO <= 8'b00000000;

else DO <= DI;

endmodule

assign 文および deassign 文の使用

Vivado 合成では、 assign 文および deassign 文はサポート されません。

32 ビッ ト を超える場合のビッ トの拡張

代入文の左辺のビッ ト幅が右辺よ り も広い場合は、 次の規則に従って左辺の左にパディングが追加されます。

• 右辺が符号付きの場合は、 左辺に符号付きビッ トがパディングと して追加されます。

• 右辺が符号なしの場合は、 左辺に 0 がパディングと して追加されます。

• サイズ指定のない x または z 定数の場合は、 次の規則に従います。

右辺の最も左側のビッ トが z (ハイ インピーダンス) または x (不明) の場合、右辺が符号付きまたは符号なしにか

かわらず、 左辺にその値 (z または x) がパディングと して追加されます。

タスクおよび関数

• デザインで同じコードを複数回使用する場合、 タスクや関数を使用する と、 次が可能になり ます。

° コードの量を削減。

° メ ンテナンスが容易。

• タスクおよび関数は、 モジュール内で宣言して使用する必要があ り ます。 ヘッダー部には、 次のパラ メーター

が含まれます。

° 入力パラ メーター (関数の場合)。

° 入力/出力/入出力パラ メーター (タスクの場合)。

• 関数の戻り値は、 符号付きまたは符号なしで宣言します。 内容は、 組み合わせ always ブロ ッ ク と類似してい

ます。

Page 242: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 242UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

タスクおよび関数の例

ファ イル名: functions_1.v

//// An example of a function in Verilog //// File: functions_1.v//module functions_1 (A, B, CIN, S, COUT); input [3:0] A, B; input CIN; output [3:0] S; output COUT; wire [1:0] S0, S1, S2, S3;

function signed [1:0] ADD; input A, B, CIN; reg S, COUT; begin S = A ^ B ^ CIN; COUT = (A&B) | (A&CIN) | (B&CIN); ADD = {COUT, S}; end endfunction

assign S0 = ADD (A[0], B[0], CIN), S1 = ADD (A[1], B[1], S0[1]), S2 = ADD (A[2], B[2], S1[1]), S3 = ADD (A[3], B[3], S2[1]), S = {S3[0], S2[0], S1[0], S0[0]}, COUT = S3[1];

endmodule

次の例では、 同じ機能をタスクを使用して記述しています。

ファ イル名: task_1.v

// Verilog tasks // tasks_1.v//module tasks_1 (A, B, CIN, S, COUT);input [3:0] A, B;input CIN;output [3:0] S;output COUT;reg [3:0] S;reg COUT;reg [1:0] S0, S1, S2, S3;

task ADD;input A, B, CIN;output [1:0] C;reg [1:0] C;reg S, COUT; begin

Page 243: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 243UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

S = A ^ B ^ CIN; COUT = (A&B) | (A&CIN) | (B&CIN); C = {COUT, S}; endendtask

always @(A or B or CIN)begin ADD (A[0], B[0], CIN, S0); ADD (A[1], B[1], S0[1], S1); ADD (A[2], B[2], S1[1], S2); ADD (A[3], B[3], S2[1], S3); S = {S3[0], S2[0], S1[0], S0[0]}; COUT = S3[1];end

endmodule

再帰タスクおよび関数の使用

Verilog-2001 では、 再帰タスクおよび関数がサポート されます。

• 再帰は、 automatic キーワードでのみ使用してください。

• 再帰呼び出しが恒久的に実行されるのを防ぐため、 繰り返し回数は 64 回 (デフォルト ) に制限されます。

• 再帰呼び出しの繰り返し回数を変更するには、 -recursion_iteration_limit オプシ ョ ンを使用します。

再帰タスクおよび関数の例

function automatic [31:0] fac;input [15:0] n;if (n == 1)fac = 1;

else

fac = n * fac(n-1); //recursive function callendfunction

定数関数および定数式の使用

Vivado 合成では、 定数値を算出する関数呼び出しがサポート されます。

定数は 10 進数の整数である と想定されます。

• 定数は、 2 進、 8 進、 10 進、 16 進で指定できます。

• 定数を指定するには、 適切な構文で適切な接頭辞を使用します。

定数関数の例

ファ イル名: functions_contant.v

// A function that computes and returns a constant value//

Page 244: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 244UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

// functions_constant.v//module functions_constant (clk, we, a, di, do); parameter ADDRWIDTH = 8; parameter DATAWIDTH = 4; input clk; input we; input [ADDRWIDTH-1:0] a; input [DATAWIDTH-1:0] di; output [DATAWIDTH-1:0] do;

function integer getSize; input addrwidth; begin getSize = 2**addrwidth; end endfunction

reg [DATAWIDTH-1:0] ram [getSize(ADDRWIDTH)-1:0];

always @(posedge clk) begin if (we) ram[a] <= di; end assign do = ram[a];

endmodule

定数式の例

次の定数式はすべて同じ値を表します。

• 4'b1010

• 4'o12

• 4'd10

• 4'ha

Page 245: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 245UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

ブロッキングおよびノンブロッキング手続き代入文の使用

ブロ ッキングおよびノンブロ ッキング手続き代入文には、 タイ ミ ングを制御する要素が組み込まれています。

• # および @ はタイ ミ ング制御文です。

• 指定されたイベン トが発生するまで、 その後に続く文は実行されません。

• 合成では、 # の遅延は無視されます。

ブロッキング手続き代入文の例 1

reg a;a = #10 (b | c);

ブロッキング手続き代入文の例 2 (代替法)

if (in1) out = 1’b0;else out = in2;

この代入文は、 プロセスに含まれる追加の文が同時に実行されないよ うにし、 主にシ ミ ュレーシ ョ ンで使用されま

す。

Vivado シ ミ ュレーシ ョ ン用の Verilog フォーマッ トの詳細は、 『Vivado Design Suite ユーザー ガイ ド : ロジッ ク シ ミ ュ

レーシ ョ ン』 (UG900) [参照 11] のこのセクシ ョ ンを参照してください。

ノンブロッキング手続き代入文の例 1

variable <= @(posedge_or_negedge_bit) expression;

ノンブロ ッキング代入文は、 文が実行される と きに式を評価し、 同じプロセス内のほかの文も同時に実行できます。

変数は、 指定された遅延後に変更されます。

ノンブロッキング手続き代入文の例 2

次に、 ノンブロ ッキング手続き代入文の使用例を示します。

if (in1) out <= 1’b1;else out <= in2;

Page 246: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 246UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

Verilog マクロ

Verilog では、 マクロは次のよ うに定義されます。

'define TESTEQ1 4'b1101

定義されたマクロは、 次のよ うに参照されます。

if (request == 'TESTEQ1)

'ifdef および 'endif 文は、 次を実行します。

° マクロが定義されているかど うかを判断します。

° 条件付きコンパイルを定義します。

'ifdef で呼び出されたマクロが定義されている場合、 そのコードはコンパイルされます。

• マクロが定義されていない場合は、 'else コマンドに続く コードがコンパイルされます。

• 'else は必須ではあ り ませんが、 条件文の最後に 'endif が必要です。

Verilog マクロは、 Verilog マクロ コマンド ライン オプシ ョ ンを使用して定義または再定義します。

• Verilog マクロを使用する と、 HDL ソース コードを変更せずにデザインを変更できます。

• Verilog マクロは、 IP コアの生成およびフロー テス トに有益です。

マクロの例 1

'define myzero 0assign mysig = 'myzero;

マクロの例 2

'ifdef MYVARmodule if_MYVAR_is_declared;...endmodule'elsemodule if_MYVAR_is_not_declared;...endmodule'endif

注記: 合成を実行する と、 Vivado によ り SYNTHESIS マクロが自動的に設定されます。 `ifdef SYNTHESIS を使用する

と、 合成の実行中にこのマクロが実行されます。

インクルード ファイル

Verilog では、 HDL ソース コードを複数のファイルに分割できます。 別のファイルに含まれるコードを参照するに

は、 現在のファイルで次の構文を使用します。

`include <path/file-to-be-included>

この構文を使用する と、 指定したファイルの内容が現在のファイルの `include が含まれる行に挿入されます。

Page 247: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 247UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

パスは相対パスまたは絶対パスで指定できます。 相対パスを使用する場合、 Verilog コンパイラで次の 2 箇所から

ファイルが検索されます。

° `include 文を含むファイルを基準と した相対パス。 この場所にファイルが見つかった場合、 そのファイ

ルの内容が挿入されます。

° -include_dirs オプシ ョ ンで指定された場所 ([Project Settings] ダイアログ ボッ クスの [General] ページの [Verilog options] で指定)。

1 つの Verilog ファ イルに複数の 'include 文を含めるこ とができます。

Verilog ビヘイビアー記述のコ メン ト

Verilog ビヘイビアー記述のコ メン ト方法は、 C++ などのプログラ ミ ング言語と同様です。

1 行のコメン ト

コ メン トが 1 行の場合は、 // で開始します。

// This is a one-line comment.

複数行のブロック コ メン ト

コ メン トが複数行の場合は、 /* で開始し、 */ で終了します。

/* This is a multiple-line comment.*/

generate 文Verilog ビヘイビアー記述の generate 文には、 次のよ うな特徴があ り ます。

• 次を作成できます。

° パラ メーター変更可能なスケーラブル コード。

° 反復的またはスケーラブルな構造。

° 特定の条件を満たすかど うかに依存。

• Verilog のエラボレーシ ョ ン中に実行されます。

• 条件に応じてデザインにインスタンシエート されます。

• モジュール範囲内で記述されます。

• generate キーワードで開始します。

• endgenerate キーワードで終了します。

generate 文を使用して作成した構造

generate 文では、 次のよ うな構造を作成できます。

• プリ ミ ティブまたはモジュールのインスタンス

• initial または always 手続きブロ ッ ク

Page 248: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 248UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

• 継続代入文

• ネッ トおよび変数の宣言

• パラ メーターの再定義

• タスクまたは関数の定義

サポート される generate 文Vivado 合成では、 Verilog ビヘイビアー記述の次の generate 文がサポート されます。

• generate ループ文 (generate-for)

• generate 条件文 (generate-if-else)

• generate ケース文 (generate-case)

generate ループ文

generate-for ループ文を使用する と、 モジュール内に 1 つ以上のインスタンスを作成できます。

generate-for ループ文は通常の Verilog for ループ文と同様に使用できますが、 次のよ うな制限があ り ます。

• generate-for ループ文のインデッ クスには、 genvar 変数を使用する必要があ り ます。

• for ループ制御の代入文では、 genvar 変数を参照する必要があ り ます。

• for ループ文の内容は begin 文と end 文で囲みます。

• begin 文には、 固有の名前を付けます。

generate ループ文を使用した 8 ビッ ト加算器の例

generate genvar i; for (i=0; i<=7; i=i+1) begin : for_name adder add (a[8*i+7 : 8*i], b[8*i+7 : 8*i], ci[i], sum_for[8*i+7 : 8*i],

c0_or[i+1]); end

endgenerate

generate 条件文

generate-if-else 文は、 オブジェク トの生成を条件で制御するために使用します。

• if-else 文の各分岐は begin 文と end 文で囲みます。

• begin 文には、 固有の名前を付けます。

generate 条件文のコード例

次の例では、 データ ワードの幅に基づいて、 乗算器の 2 つの異なるインプリ メンテーシ ョ ンをインスタンシエート

しています。

generateif (IF_WIDTH < 10) begin : if_name

Page 249: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 249UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 7 章: Verilog サポート

multiplier_imp1 # (IF_WIDTH) u1 (a, b, sum_if); end

else begin : else_name multiplier_imp2 # (IF_WIDTH) u2 (a, b, sum_if);

endendgenerate

generate case 文

generate-case 文は、 どの条件でどのオブジェク ト を生成するかを制御します。

• generate-case 文の各分岐は、 begin 文と end 文で囲みます。

• begin 文には、 固有の名前を付けます。

Verilog ビヘイビアー記述の generate-case 文のコード例

次の例では、 データ ワードの幅に基づいて、 加算器の 2 つ以上の異なるインプリ メンテーシ ョ ンをインスタンシ

エート しています。

generatecase (WIDTH)1:begin : case1_name

adder #(WIDTH*8) x1 (a, b, ci, sum_case, c0_case);end

2:begin : case2_name

adder #(WIDTH*4) x2 (a, b, ci, sum_case, c0_case); end default:begin : d_case_nameadder x3 (a, b, ci, sum_case, c0_case);endendcase endgenerate

Page 250: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 250UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章

SystemVerilog サポート

概要

Vivado® 合成では、 合成可能な SystemVerilog RTL の一部がサポート されます。 次のセクシ ョ ンで、 これらのデータ

型を説明します。

特定のファイルで SystemVerilog を使用

デフォルトでは、 *.v ファ イルは Verilog 2005 構文で、 *.sv ファ イルは SystemVerilog 構文でコンパイルされます。

Vivado IDE で特定の *.v ファ イルに SystemVerilog を使用するには、 ファ イルを右ク リ ッ ク し、 [Source Node Properties] をク リ ッ ク します。 [Source File Properties] ビューで [Type] フ ィールドの右側にあるボタンをク リ ッ ク し、

[Set Type] ダイアログ ボッ クスで [File Type] を [SystemVerilog] に変更して、 [OK] をク リ ッ ク します。

プロパティ を設定する Tcl コマンド

または、 [Tcl Console] ウ ィンド ウで次の Tcl コマンドを使用します。

set_property file_type SystemVerilog [get_files <filename>.v]

次のセクシ ョ ンで、 Vivado IDE でサポート される SystemVerilog のデータ型を説明します。

Page 251: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 251UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

データ型

次のデータ型とその制御方法がサポート されています。

宣言

RTL の変数は次のよ うに宣言します。

[var] [DataType] name;

説明:

° var はオプシ ョ ンで、 宣言文にない場合は自動的に推測されます。

° DataType は次のいずれかになり ます。

- integer_vector_type: bit、 logic、 または reg

- integer_atom_type: byte、 shortint、 int、 longint、 integer、 または time

- non_integer_type: shortreal、 real、 または realtime

- struct

- enum

整数データ型

SystemVerilog では、 次の整数型がサポート されます。

• shortint: 2 値の 16 ビッ ト符号付き整数

• int: 2 値の 32 ビッ ト符号付き整数

• longint: 2 値の 64 ビッ ト符号付き整数

• byte: 2 値の 8 ビッ ト符号付き整数

• bit: 2 値のユーザー定義のベクター サイズ

• logic: 4 値のユーザー定義のベクター サイズ

• reg: 4 値のユーザー定義のベクター サイズ

• integer: 4 値の 32 ビッ ト符号付き整数

• time: 4 値の 64 ビッ ト符号なし整数

4 値および 2 値とは、 これらのデータ型に割り当てるこ とのできる値を示しています。

• 2 値の場合は 0 および 1 を使用できます。

• 4 値の場合は X と Z も使用できます。

X と Z 値は常に合成できるわけではないので、 2 値と 4 値は同じよ うに合成されます。

注意: 4 値の変数を使用する場合、 RTL とシ ミ ュレーシ ョ ンの不一致が発生する可能性があるので、 注意してくださ

い。

Page 252: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 252UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

• デフォルトでは、 byte、 shortint、 int、 integer、 および longint データ型は符号付きの値になり ます。

• bit、 reg、 および logic は符号なしの値になり ます。

シ ミ ュレーシ ョ ン用の Verilog フォーマッ トの詳細は、 『Vivado Design Suite ユーザー ガイ ド : ロジッ ク シ ミ ュ

レーシ ョ ン』 (UG900) [参照 11] のこのセクシ ョ ンを参照してください。

実数

合成では実数がサポート されますが、 ロジッ クを作成するためには使用できず、 パラ メーター値と してのみ使用で

きます。 SystemVerilog では、 次の実数型がサポート されます。

• real

• shortreal

• realtime

Void データ型 void データ型は、 戻り値のない関数でのみサポート されます。

ユーザー定義型

Vivado 合成では、 typedef キーワードを使用してユーザーが定義したデータ型がサポート されます。 次の構文を使

用します。

typedef data_type type_identifier {size};

または

typedef [enum, struct] type_identifier;

列挙型

列挙型は、 次の構文で宣言できます。

enum [type] {enum_name1, enum_name2...enum_namex} identifier

データ型を指定しない場合は、 enum はデフォルトで int になり ます。 次に例を示します。

enum {sun, mon, tues, wed, thurs, fri, sat} day_of_week;

このコードでは、 7 つの値を含む int の enum が生成されます。 これらの名前には 0 から開始する値が割り当てら

れ、 sun = 0 および sat = 6 とな り ます。

デフォルト値を変更するには、 次の例のよ うなコードを使用します。

enum {sun=1, mon, tues, wed, thurs, fri, sat} day_of week;

この場合、 sun の値は 1 で sat の値は 7 になり ます。

次の例は、 デフォルト値を変更する別の方法を示します。

enum {sun, mon=3, tues, wed, thurs=10, fri=12, sat} day_of_week;

Page 253: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 253UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

この場合、 sun=0、 mon=3、 tues=4、 wed=5、 thurs=10、 fri=12、 および sat=13 になり ます。

列挙型は、 typedef キーワードでも使用できます。

typedef enum {sun,mon,tues,wed,thurs,fri,sat} day_of_week;day_of_week my_day;

この例では、 day_of_week というデータ型の my_day という信号を定義しています。 enum の範囲を指定するこ と

もできます。 たとえば、 上記の例の場合は次のよ うに指定できます。

enum {day[7]} day_of_week;

これによ り、 day0、 day1…day6 という 7 個の要素を含む day_of_week という列挙型が作成されます。

次は、 列挙型を使用した例です。

enum {day[1:7]} day_of_week; // creates day1,day2...day7enum {day[7] = 5} day_of_week; //creates day0=5, day1=6... day6=11

定数

SystemVerilog には、 次の 3 種類のエラボレーシ ョ ン時間定数があ り ます。

• parameter: Verilog 規格と同じで、 同様に使用できます。

• localparameter: parameter と似ていますが、 上位モジュールのものよ り も優先されます。

• specparam: 遅延と タイ ミ ング値を指定するために使用されますが、 Vivado 合成ではサポート されません。

const という ランタイム定数宣言もあ り ます。

型演算子

型演算子を使用する と、 パラ メーターをデータ型と して指定でき、 モジュールの異なるインスタンスに異なるデー

タ型のパラ メーターを設定できます。

キャスト演算子

SystemVerilog では、 あるデータ型の値を別のデータ型の値に割り当てるこ とはできませんが、 キャス ト演算子 (') を使用する と可能になり ます。 キャス ト演算子を使用する と、 データ型を変換できます。 次のよ うに使用します。

casting_type'(expression)

casting_type は次のいずれかになり ます。

• integer_type

• non_integer_type

• real_type

• 符号なしの定数値

• ユーザーが作成した符号付き値型

Page 254: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 254UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

集合体データ型

集合体データ型には、 構造体 (struct) と共用体 (union) があ り ます。 次にこれらについて説明します。

構造体 (struct)

構造体とは、 異なるデータ型の値を 1 つにまとめて格納し、 参照できるよ うにしたものです。 各要素はメンバーと

呼ばれます。 これは、 VHDL のレコード型と類似しています。 構造体の構文は次のよ うにな り ます。

struct {struct_member1; struct_member2;...struct_memberx;} structure_name;

共用体 (union)

共用体は、 異なる方法で参照可能な 1 つのデータ セクシ ョ ンです。 共用体を指定する構文は、 次のとおりです。

typedef union packed {union_member1; union_member2...union_memberx;} unions_name;

パック型配列とアンパック型配列

Vivado 合成では、 パッ ク型配列とアンパッ ク型配列のどちらもサポート されます。

logic [5:0] sig1; //packed array

logic sig2 [5:0]; //unpacked array

幅が決まっているデータ型では、 パッ ク される次元を宣言する必要はあ り ません。

integer sig3; //equivalent to logic signed [31:0] sig3

プロセス

always プロシージャ

always プロシージャには、 次の 4 つがあ り ます。

• always

• always_comb

• always_latch

• always_ff

always_comb プロシージャは、 組み合わせロジッ クを記述します。 センシティビティ リ ス トは、 always_comb 文を駆動するロジッ クによ り推論されます。

always 文では、 ユーザーがセンシティビティ リ ス ト を指定する必要があ り ます。 次の例では、 in1 および in2 センシティビティ リ ス トが使用されます。

always@(in1 or in2)out1 = in1 & in2;always_comb out1 = in1 & in2;

Page 255: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 255UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

always_latch プロシージャでは、 ラ ッチをすばやく作成できます。 always_comb と同様、 センシティビティ リス トは推論されますが、 次の例に示すよ うにラ ッチ イネーブルの制御信号を指定する必要があ り ます。

always_latchif(gate_en) q <= d;

always_ff プロシージャでは、 フ リ ップフロ ップが作成されます。 always と同様、 ユーザーがセンシティビティ リス ト を指定する必要があ り ます。

always_ff@(posedge clk)out1 <= in1;

ブロック文

ブロ ッ ク文は、 複数の文をグループ化します。 シーケンシャル ブロ ッ クの場合は、 文が begin と end で囲まれま

す。 ブロ ッ クでは、 そのブロ ッ ク特有の変数を宣言できます。 シーケンシャル ブロ ッ クには、 そのブロ ッ クに関連

した名前を付けるこ と もできます。 フォーマッ トは次のとおりです。

begin [: block name][declarations][statements]end [: block name]

begin : my_blocklogic temp;temp = in1 & in2;out1 = temp;end : my_block

上記の例では、 ブロ ッ ク名が end の後にも指定されていますが、 これはコードを読みやすくするためで、 必須では

あ り ません。

注記: パラレル ブロ ッ ク (fork-join ブロ ッ ク ) は Vivado 合成ではサポート されません。

手続きタイ ミング制御

SystemVerilog では、 次の 2 種類のタイ ミ ング制御がサポート されます。

• 遅延制御: 文とそれが実行されるまでの時間を指定します。 これを合成に使用する利点はないので、 Vivado 合成

では、 代入するロジッ クは作成されますが、 タイム文は無視されます。

• イベン ト制御: always@(posedge clk) など、 指定したイベン トが発生したと きに代入が実行されるよ うにし

ます。 これは Verilog の規格ですが、 SystemVerilog では機能が追加されています。

論理 or 演算子を使用する と、 任意の数のイベン ト を指定でき、 どのイベン トでも文の実行を ト リガーできます。 こ

れには、 センシティビティ リ ス トでイベン ト を or またはカンマで区切り ます。 たとえば、 次の 2 つの文は同じで

す。

always@(a or b or c)always@(a,b,c)

SystemVerilog では、 event_expression @* もサポート されるので、 センシティビティ リ ス トの問題によるシ ミ ュ

レーシ ョ ンでの不一致を回避できます。

次に例を示します。

Page 256: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 256UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

Logic always@* begin

シ ミ ュレーシ ョ ン用の Verilog フォーマッ トの詳細は、 『Vivado Design Suite ユーザー ガイ ド : ロジッ ク シ ミ ュレー

シ ョ ン』 (UG900) [参照 11] のこのセクシ ョ ンを参照してください。

演算子

Vivado 合成では、 次の SystemVerilog の演算子がサポート されます。

• 代入演算子 (=、 +=、 -=、 *=、 /=、 %=、 &=、 |=、 ^=、 <<=、 >>=、 <<<=、 >>>=)

• 単項演算子 (+、 -、 !、 ~、 &、 ~&、 |、 ~|、 ^、 ~^、 ^~)

• インク リ メン ト /デク リ メン ト演算子 (++、 --)

• 2 項演算子 (+、 -、 *、 /、 %、 ==、 ~=、 ===、 ~==、 &&、 ||、 **、 <、 <=、 >、 >=、 &、 |、 ^、 ^~、 ~^、 >>、

<<、 >>>、 <<<)

注記: A**B は、 A が 2 のべき乗であるか、 B が定数の場合にサポート されます。

• 条件演算子 (? :)

• 連結演算子 ({...})

符号付き演算式

Vivado 合成では、 符号付き演算と符号なし演算のどちらもサポート されます。 信号は、 符号あ り となしのどちらに

でも宣言できます。 次に例を示します。

logic [5:0] reg1;

logic signed [5:0] reg2;

手続きプログラム代入文

if-else 条件文

if-else 条件文の構文は、 次のよ うにな り ます。

if (expression)command1;

elsecommand2;

else 文はオプシ ョ ンで、 ク ロ ッ ク文の有無によってラ ッチまたはフ リ ップフロ ップが想定されます。 次のよ うな複

数の if および else 文もサポート されます。

If (expression1)Command1;

elsif (expression2)command2;

elsif (expression3)command3;

elsecommand4;

Page 257: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 257UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

このコードは、 priority if 文と して合成されます。

• 最初の条件文が真である場合、 その他の条件文は評価されません。

• Vivado 合成では、 unique if-else 文は parallel_case と して、 priority if-elese 文は full_case と して処理

されます。

case 文case 文の構文は、 次のよ うにな り ます。

case (expression)value1: statement1;value2: statement2;value3: statement3;default: statement4;

endcase

case 文内の default 文はオプシ ョ ンです。 値は順番に評価されるので、 value1 と value3 の両方が真の場合、

statement1 が実行されます。

case 文のほかに casex 文および casez 文があ り ます。 casex ではドン ト ケアを、 casez ではト ライステート条

件を処理できます。

Vivado 合成では、 unique case 文は parallel_case と して、 priority case 文は full_case と して処理されます。

ループ文

Vivado 合成および SystemVerilog では、 数種のループ文がサポート されます。 最もよ く使用されるのは for ループ文

です。 構文は次のとおりです。

for (initialization; expression; step)

statement;

for 文では、 まず初期化が実行されてから、 条件式が評価されます。 結果が 0 の場合は停止して実行し、 1 の場合は

文が続行されます。 文の実行が終了したら、 ステップ関数が実行されます。

• repeat ループ文では、 指定した回数分だけ関数が繰り返し実行されます。 構文は次のとおりです。

repeat (expression)

statement;

この構文は、 statement を expression で指定した数値の回数だけ繰り返し実行します。

• for-each ループ文では、 配列内の各エレ メン トに対して文が実行されます。

• while ループ文では、 演算式が false になるまでその文が実行されます。

• do-while ループ文は while ループ文と同じですが、 文の後に条件式が評価される点が異なり ます。

• forever ループはずっと実行され続けます。 無限ループにならないよ うにするため、 ループを脱出するための break 文と共に使用してください。

Page 258: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 258UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

タスクおよび関数

タスク

タスク宣言の構文は、 次のとおりです。

task name (ports);[optional declarations];statements;

endtask

タスクには、 次の 2 種類があ り ます。

• スタティ ッ ク タスク : 宣言文に、 次にタスクが呼び出されたと きに前の値が保持されます。

• 自動タスク : 宣言文には前の値は保持されません。

注意: Vivado 合成ではすべてのタスクが自動タスク と して処理されるので、 タスクを使用する際は注意が必要です。

多くのシ ミ ュレータでは、 スタティ ッ クか自動かを指定しない場合のデフォルトがスタティ ッ ク タスクなので、 シ

ミ ュレーシ ョ ンで不一致が発生する可能性があ り ます。 タスクを自動またはスタティ ッ クに指定する方法は、 次の

とおりです。

task automatic my_mult... //or task static my_mult ...

関数 (自動またはスタテ ィ ック )関数はタスク と類似していますが、 値が返される点が異なり ます。 関数の構文は、 次のとおりです。

function data_type function_name(inputs);declarations;statements;endfunction : function_name

最後の function_name はオプシ ョ ンですが、 この方がコードが読みやすくな り ます。

関数は値を返すので、 return 文を使用するか、 関数名を記述しておく必要があ り ます。

function_name = ....

タスク と同様、 関数も自動またはスタティ ッ クにできます。

注意: Vivado 合成ではすべての関数が自動と して処理されますが、 シ ミ ュレータによっては動作が異なり ます。 関数

をサードパーティ シ ミ ュレータで使用する場合は注意が必要です。

Page 259: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 259UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

モジュールおよび階層

SystemVerilog のモジュールは Verilog と似ていますが、 次のセクシ ョ ンで説明するよ うにさ らに機能が追加されてい

ます。

モジュールの接続

モジュールのインスタンシエートおよび接続には、 主に 3 つの方法があ り ます。

• 最初の 2 つ (順序付き リ ス トおよび名前による方法) は Verilog と同じです。

• 3 つ目はポート名による方法です。

モジュールのポート名がインスタンシエート モジュールの信号と名前およびタイプが同じ場合、 下位モジュールを

名前で接続できます。 次に例を示します。

module lower (

output [4:0] myout;

input clk;

input my_in;

input [1:0] my_in2;

......

endmodule

//in the instantiating level.

lower my_inst (.myout, .clk, .my_in, .my_in2);

ワイルドカード ポート を使用したモジュールの接続

ワイルドカードを使用してモジュールを接続するこ と もできます。 たとえば、 上記の例は次のよ うにな り ます。

// in the instantiating module

lower my_inst (.*);

上位モジュールの名前と タイプが正しければ、 インスタンス全体が接続されます。

また、 これらを混合して使用できます。 次に例を示します。

lower my_inst (.myout(my_sig), .my_in(din), .*);

この例では、 myout ポートが my_sig 信号に、 my_in ポートが din 信号に、 clk および my_in2 が clk および my_in2 信号に接続されます。

インターフェイス

インターフェイスは、 ブロ ッ ク間の通信を指定するために使用します。 インターフェイス とは、 モジュール間の接

続を記述しやすくする目的でまとめられたネッ トおよび変数のグループです。 基本的なインターフェイスの構文は、

次のとおりです。

Page 260: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 260UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

interface interface_name;

parameters and ports;

items;

endinterface : interface_name

最後の interface_name はオプシ ョ ンで、 コードを読みやすくする目的で追加されています。 次に例を示します。

module bottom1 (input clk,input [9:0] d1,d2,input s1,input [9:0] result,output logic sel,output logic [9:0] data1, data2,output logic equal);

//logic//

endmodule

module bottom2 (input clk,input sel,input [9:0] data1, data2,output logic [9:0] result);

//logic//

endmodule

module top (input clk,input s1,input [9:0] d1, d2,output equal);

logic [9:0] data1, data2, result;logic sel;

bottom1 u0 (clk, d1, d2, s1, result, sel, data1, data2, equal);bottom2 u1 (clk, sel, data1, data2, result);

endmodule

上記のコードでは、 共通する信号を持つ 2 つの下位モジュールがインスタンシエート されています。

これらの共通信号はすべてインターフェイスを使用して指定できます。

interface my_intlogic sel;logic [9:0] data1, data2, result;

endinterface : my_int

これで 2 つの bottom モジュールを次のよ うに変更できます。

module bottom1 (my_int int1,input clk, input [9:0] d1, d2,

Page 261: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 261UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

input s1,output logic equal);

および

module bottom2 (my_int int1,input clk);

これらのモジュール内では、 sel、 data1、 data2、 result へのアクセス方法を変更するこ と もできます。 これ

は、 モジュールの視点からは、 これらの名前のポートが存在しないからです。 その代わりに、 my_int という名前

のポートがあ り ます。 これには、 次の変更を加える必要があ り ます。

if (sel)result <= data1;to:if (int1.sel)int1.result <= int1.data1;

最後に、 最上位モジュールにそのインターフェイスをインスタンシエートする必要があ り ます。 これで、 インスタ

ンスでそのインターフェイスが参照されます。

module top(input clk,input s1,input [9:0] d1, d2,output equal);my_int int3(); //instantiation

bottom1 u0 (int3, clk, d1, d2, s1, equal);bottom2 u1 (int3, clk);

endmodule

modport キーワード

上記の例では、 インターフェイス内の信号が入力または出力と して記述されなくなっています。 インターフェイス

が追加される前は、 sel ポートが bottom1 の出力および bottom2 の入力でした。

インターフェイスが追加される と、 それが明確ではなくな り ます。 実際、 Vivado 合成エンジンではこれらが双方向

ポート と考慮されるよ うになったこ とに対して警告メ ッセージは表示されず、 階層を使用して生成されたネッ ト リ

ス トではこれらが入出力と して定義されます。 これは、 生成されたロジッ クの観点からは問題ではあ り ませんが、

混乱の原因とな り ます。

方向を指定するには、 次のコード例に示すよ うに modport キーワードを使用します。

interface my_int; logic sel; logic [9:0] data1, data2, result;

modport b1 (input result, output sel, data1, data2); modport b2 (input sel, data1, data2, output result);endinterface : my_int

この後、 bottom モジュールの宣言に次を使用します。

module bottom1 (my_int.b1 int1,

Page 262: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 262UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

これで、 入力と出力が正し く関連付けられます。

その他のインターフェイス機能

インターフェイスには、 信号だけでなく、 タスクおよび関数も含めるこ とができ、 そのインターフェイスに特有の

タスクを作成できます。 インターフェイスのパラ メーターも指定できます。 前述の例の場合、 data1 および data2 は両方と も 10 ビッ トのベクターですが、 これらのインターフェイスはパラ メーターを設定するこ とによ り任意のサ

イズに変更できます。

package 文package 文を使用する と、 さまざまなコンス ト ラ ク ト を共有できます。 これは、 VHDL のパッケージ文と同じよ うに

動作します。 package 文には、 関数、 タスク、 データ型、 列挙型などを含めるこ とができます。 package 文の構文は、

次のとおりです。

package package_name;items

endpackage : package_name

最後の package_name は、 コードを読みやすくするためで、 必須ではあ り ません。 パッケージは、 ほかのモジュー

ルで import コマンドを使用して参照されます。 構文は次のとおりです。

import package_name::item or *;

import コマンドでは、 インポートするパッケージからのアイテムを指定するか、 パッケージ全体を指定する必要

があ り ます。

SystemVerilog コンスト ラク ト

次の表に、 SystemVerilog コンス ト ラ ク ト を示します。 サポート されていないコンス ト ラ ク トは、 そのセルに灰色で

陰影が付けられています。

表 8-1: SystemVerilog コンスト ラク ト

プライマリ コンスト ラク ト セカンダリ コンスト ラク ト ステータス

データ型

単体型および集合体型 サポート あ り

ネッ トおよび変数 サポート あ り

変数宣言 サポート あ り

ベクター宣言 サポート あ り

2 ステート (2 値) および 4 ステート (4 値) データ型

サポート あ り

符号付きおよび符号なし整数データ型 サポート あ り

ユーザー定義型 サポート あ り

列挙型 サポート あ り

Page 263: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 263UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

新規データ型を列挙型と して定義 サポート あ り

列挙型の範囲 サポート あ り

型チェッ ク サポート あ り

数式の列挙型 サポート あ り

列挙型メ ソ ッ ド サポート あ り

型パラ メーター サポート あ り

型演算子 サポート あ り

キャス ト演算子 サポート あ り

ビッ ト ス ト リーム キャス ト サポート あ り

ク ラス サポート なし

const 定数 サポート なし

$cast ダイナミ ッ ク キャス ト サポート なし

real、 shortreal、 および realtime データ型 サポート なし

集合体データ型

構造体 (struct) サポート あ り

パッ ク型/アンパッ ク型構造体 サポート あ り

構造体への代入 サポート あ り

パッ ク型配列 サポート あ り

アンパッ ク型配列 サポート あ り

配列の演算 サポート あ り

多次元配列 サポート あ り

配列のインデッ クスおよびスライス サポート あ り

配列代入 サポート あ り

サブルーチンへの引数と しての配列 サポート あ り

配列操作メ ソ ッ ド (キュー型を戻さない

メ ソ ッ ド )サポート なし

配列クエリ関数 サポート なし

アンパッ ク型共用体 サポート あ り

タグ付き共用体 サポート なし (1)

パッ ク型共用体 サポート あ り

プロセス

組み合わせロジッ クの always_comb プロシージャ

サポート あ り

暗示的な always_comb のセンシティビ

ティ リ ス ト

サポート あ り

ラ ッチ ロジッ クの always_latch プロ

シージャ

サポート あ り

順次ブロッ ク サポート あ り

表 8-1: SystemVerilog コンスト ラク ト (続き)

プライマリ コンスト ラク ト セカンダリ コンスト ラク ト ステータス

Page 264: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 264UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

順序ロジッ クの always_ff プロシー

ジャ

サポート あ り

iff イベン ト修飾子 サポート あ り

エイ リ アス サポート なし

条件付きイベン ト制御 サポート なし

並列ブロッ ク サポート なし

手続き的タイ ミ ング制御 サポート なし

順次イベン ト サポート なし

代入文

連続代入文 サポート あ り

変数宣言代入 (変数初期化) サポート あ り

代入のよ うなコンテキス ト サポート あ り

配列代入パターン サポート あ り

構造代入パターン サポート あ り

アンパッ ク型配列連結 サポート あ り

ネッ ト エイ リ アス サポート なし

演算子および演算式

$error、 $warning、 $info 初期ブロッ ク内でのみサポート され、 定

数式 (パラ メーターなど) を評価するため

にのみ使用可能です。

集合体式 サポート あ り

符号なしおよび符号付き型を使用した演

算式

サポート あ り

代入演算子 サポート あ り

演算式内の代入 サポート あ り

連結演算子 サポート あ り

定数式 サポート あ り

インク リ メン トおよびデク リ メン ト演算

サポート あ り

ロジッ ク (4 値) およびビッ ト (2 値) 型の

演算

サポート あ り

ワイルドカード等価演算子 サポート あ り

stream_expressions の連結 サポート なし

実数オペランドを使用する演算子 サポート なし

ジェネ リ ッ ク ス ト リームの並べ替え サポート なし

メンバーシップ演算子の設定 サポート なし

代入ターゲッ ト と してのス ト リーミ ング

連結 (アンパッ ク型)サポート なし

動的にサイズが決定されるデータのス ト

リーミ ング

サポート なし

表 8-1: SystemVerilog コンスト ラク ト (続き)

プライマリ コンスト ラク ト セカンダリ コンスト ラク ト ステータス

Page 265: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 265UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

手続きプログラム文

case 文違反レポートおよび複数プロセス

サポート あ り

ループ文 サポート あ り

unique-if、 unique0-if および priority-if

サポート あ り

assert 文 サポート なし

if 文違反レポートおよび複数プロセス文 サポート なし

ジャンプ文 推奨されない

パターン一致条件文 サポート なし

メンバーシップ case 文の設定 サポート なし

unique-case、 unique0-case、 およ

び priority-caseサポート なし

unique-if、 unique0-if、 および priority-if コンス ト ラ ク トで生成された違

反レポート

サポート なし

タスク

スタティ ッ クおよび自動タスク サポート あ り

タスクのメモ リ使用量および同時アク

ティベーシ ョ ン

サポート なし

関数

戻り値と void 関数 サポート あ り

スタティ ッ クおよび自動関数 サポート あ り

定数関数 サポート あ り

関数呼び出しで起動されるバッ クグラウ

ンド プロセス

サポート なし

仮想関数 サポート なし

サブルーチン呼び出しおよび引数渡し

名前による引数バインド サポート あ り

デフォルトの引数値 サポート あ り

参照渡し サポート あ り

値渡し サポート あ り

オプシ ョ ンの引数リ ス ト サポート なし

コンパイラ指示子

サポート あ り

モジュールおよび階層

デフォルトのポート値 サポート あ り

外部モジュール サポート あ り

モジュール インスタンシエーシ ョ ン構

サポート あ り

表 8-1: SystemVerilog コンスト ラク ト (続き)

プライマリ コンスト ラク ト セカンダリ コンスト ラク ト ステータス

Page 266: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 266UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 8 章: SystemVerilog サポート

メ ンバー選択 サポート あ り

モジュール パラ メーターのオーバーラ

イ ド

サポート あ り

最上位モジュールおよび $root サポート なし

スコープまたはインスタンスへの補助

コードのバインド

サポート なし

階層名 サポート あ り

上方向の名前参照 サポート なし

仮想ポート サポート なし

インターフェイス

インターフェイス構文 サポート あ り

modport 式 サポート あ り

パラ メーター指定されたインターフェイ

サポート あ り

インターフェイスのポート サポート あ り

インターフェイスの配列 サポート あ り

ク ロ ッキング ブロ ッ クおよび modport サポート なし

動的配列 サポート なし

タスクおよび関数のエクスポート例 サポート なし

複数タスクのエクスポート例 サポート なし

インターフェイスおよび指定ブロッ ク サポート なし

入れ子のインターフェイス サポート なし

仮想インターフェイス サポート なし

パッケージ

パッケージ宣言 サポート あ り

パッケージ内のデータの参照 サポート あ り

モジュール ヘッダーでのパッケージの

使用

サポート あ り

パッケージからのインポート された名前

のエクスポート

サポート なし

std ビルト イン パッケージ サポート なし

generate コンスト ラク ト

サポート あ り

注記:1. 使用した場合、 タグは無視され、 警告メ ッセージが表示されます。

表 8-1: SystemVerilog コンスト ラク ト (続き)

プライマリ コンスト ラク ト セカンダリ コンスト ラク ト ステータス

Page 267: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 267UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 9 章

混合言語サポート

概要

Vivado® 合成では、 特に記述のない限り、 VHDL と Verilog の混合言語プロジェク トがサポート されます。

VHDL と Verilog の混合

プロジェク ト を構成する VHDL および Verilog ファ イルは、 独自の HDL プロジェク ト ファ イルで指定します。

VHDL と Verilog を混合する際の規則は、 次のとおりです。

° VHDL と Verilog の混合は、 デザイン ユニッ ト (セル) のインスタンシエーシ ョ ンに制限されます。

° VHDL コードから Verilog モジュールをインスタンシエートでき、 Verilog コードから VHDL エンティティを

インスタンシエートできます。 それ以外の VHDL および Verilog の混合はサポート されません。 たとえば、

VHDL ソース コードに Verilog ソース コードを直接埋め込むこ とはできません。

° VHDL デザインでは、 VHDL のデータ型、 ジェネ リ ッ ク、 ポートのサブセッ ト を Verilog モジュールとの境

界に使用できます。 Verilog デザインでは、 Verilog のデータ型、 パラ メーター、 ポートのサブセッ ト を VHDL エンティティ との境界に使用できます。 「VHDL および Verilog の境界規則」 を参照してください。

° Vivado 合成では、 HDL エラボレーシ ョ ン段階で VHDL デザイン ユニッ トが Verilog モジュールにバインド

されます。

Page 268: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 268UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 9 章: 混合言語サポート

インスタンシエーシ ョ ン

インスタンシエーシ ョ ンでは、 次の規則が適用されます。

° Verilog モジュールを VHDL デザイン ユニッ トにバインドするには、 コンポーネン ト インスタンシエー

シ ョ ンに基づくデフォルトのバインドが使用されます。

° VHDL に Verilog モジュールをインスタンシエートする場合、 Vivado 合成では次はサポート されていませ

ん。

- コンフ ィギュレーシ ョ ン仕様

- 直接インスタンシエーシ ョ ン

- コンポーネン ト コンフ ィギュレーシ ョ ン

Verilog への VHDL のインスタンシエート

Verilog デザインに VHDL デザイン ユニッ ト をインスタンシエートするには、 次の手順に従います。

1. インスタンシエートする VHDL エンティティ と同じモジュール名 (オプシ ョ ンでその後にアーキテクチャ名を追

加) を宣言します。

2. 通常の Verilog インスタンシエーシ ョ ンを実行します。

VHDL への Verilog のインスタンシエート

VHDL デザインに Verilog モジュールをインスタンシエートするには、 次の手順に従います。

1. インスタンシエートする Verilog モジュールと同じ名前の VHDL コンポーネン ト を宣言します。 Verilog モジュー

ルをインスタンシエートする際、 VHDL の直接エンティティ インスタンシエーシ ョ ンはサポート されません。

2. 大文字/小文字の別を確認します。

3. VDHL コンポーネン ト をインスタンシエートするのと同様に、 Verilog コンポーネン ト をインスタンシエート し

ます。

° VHDL コンフ ィギュレーシ ョ ン宣言を使用して、 このコンポーネン ト を特定のライブラ リからの特定のデ

ザイン ユニッ トにバインドする方法はサポート されていません。 サポート されるのは、 デフォルトの Verilog モジュール バインドのみです。

° VHDL デザインにインスタンシエートできる Verilog コンス ト ラ ク トは Verilog モジュールのみです。 その他

の Verilog コンス ト ラ ク トは VHDL コードで認識されません。

° エラボレーシ ョ ンの段階で、 デフォルトのバインド処理が実行されるすべてのコンポーネン トは、 対応す

るコンポーネン トの名前と同じ名前のデザイン ユニッ ト と して扱われます。

° バインド段階では、 コンポーネン ト名は VHDL デザイン ユニッ ト名と して扱われ、 work という論理ライブ

ラ リ内で検索されます。

- VHDL デザイン ユニッ トが見つかった場合は、 それがバインド されます。

- VHDL デザイン ユニッ トが見つからない場合、 コンポーネン ト名は Verilog モジュール名と して扱わ

れ、 大文字/小文字を区別して検索されます。 最初に名前が一致した Verilog モジュールが選択されてバ

インド されます。

Page 269: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 269UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 9 章: 混合言語サポート

° ライブラ リは統一されているため、 VHDL デザイン ユニッ ト と同じ名前の Verilog セルを同じ論理ライブラ

リに共存させるこ とはできません。

° 同じ名前のセルまたはユニッ トが新し く コンパイルされる と、 以前にコンパイルされたセルまたはユニッ

トが上書きされます。

インスタンシエーシ ョ ンの制限

Verilog への VHDL

Verilog モジュールに VHDL デザイン ユニッ ト をインスタンシエートする場合、 Vivado 合成では次の制限があ り ま

す。

• Verilog デザインにインスタンシエートできる VHDL コンス ト ラ ク トは VHDL エンティティのみです。その他の VHDL コンス ト ラ ク トは Verilog コードで認識されません。 Vivado 合成では、 エンティティ /アーキテクチャ ペアが Verilog と VHDL の境界と して使用されます。

• ポートは明示的に関連付ける必要があ り ます。 ポート マップでは、 有効なフォーマル ポート名を指定してくだ

さい。

• パラ メーターは、 値を変更していない場合でも、 インスタンシエート時にすべて渡されます。

• パラ メーター値の変更は、 名前で指定され、 順序は指定されません。 defparams を使用するのではなく、 イン

スタンシエーシ ョ ンで実行されます。

使用可能な例

ff #(.init(2'b01)) u1 (.sel(sel), .din(din), .dout(dout));

使用不可能な例

ff u1 (.sel(sel), .din(din), .dout(dout));defpa u1.init = 2'b01;

VHDL への Verilog

Verilog モジュールから VHDL デザイン ユニッ ト をインスタンシエートする場合、 Vivado 合成では次の制限があ り ま

す。

• ポートは明示的に関連付ける必要があ り ます。 ポート マップでは、 有効なフォーマル ポート名を指定してくだ

さい。

• パラ メーターは、 値を変更していない場合でも、 インスタンシエート時にすべて渡されます。

• パラ メーター値の変更は、 名前で指定され、 順序は指定されません。 defparams を使用するのではなく、 イン

スタンシエーシ ョ ンで実行されます。

• Verilog モジュールを VHDL にインスタンシエートする場合、 コンポーネン ト インスタンシエーシ ョ ンのみがサ

ポート されます。 直接エンティティ インスタンシエーシ ョ ンはサポート されません。

Page 270: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 270UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 9 章: 混合言語サポート

VHDL および Verilog ライブラリ

VHDL と Verilog を混合する際、 ライブラ リは次のよ うに扱われます。

• VHDL および Verilog ライブラ リは、 論理的に統一されます。

• コンパイル用のデフォルトの work ディ レク ト リは、 VHDL および Verilog でも使用できます。

• 混合言語プロジェク トでは、 デザイン ユニッ ト (セル) を統一された論理ライブラ リで検索するための検索順を

指定できます。 エラボレーシ ョ ンの段階でこの検索順に従って VHDL エンティティ または Verilog モジュールが

検索され、 混合言語プロジェク トにバインド されます。

VHDL および Verilog の境界規則

VHDL および Verilog の境界規則は、 次のとおりです。

° VHDL および Verilog 間の境界は、 デザイン ユニッ ト レベルによ り強制されます。

° VHDL エンティティ またはアーキテクチャには、 Verilog モジュールをインスタンシエートできます。 詳細

は、 「Verilog への VHDL のインスタンシエート 」 を参照してください。

° Verilog モジュールには、 VHDL エンティティをインスタンシエートできます。 「VHDL への Verilog のイン

スタンシエート 」 を参照してください。

バインド

Vivado 合成では、 バインドはエラボレーシ ョ ン段階で実行されます。 バインド中は、 次が実行されます。

1. インスタンシエート されたモジュールと同じ名前の Verilog モジュールが、 統一された論理ライブラ リのユー

ザー指定リ ス トでユーザー指定順に検索されます。

2. モジュール インスタンシエーシ ョ ンで指定されたアーキテクチャ名は無視されます。

3. Verilog モジュールが見つかった場合は、 その名前がバインド されます。

4. Verilog モジュールが見つからない場合は、 Verilog モジュールは VHDL エンティティ と して扱われ、 統一された

論理ライブラ リのユーザー指定リ ス トでユーザー指定順で、 その名前の VHDL エンティティが大文字と小文字

を区別して検索されます。 これには、 VHDL デザイン ユニッ トは拡張指示子付きで格納されている と想定され

ます。

ジェネリ ックのサポート

Vivado 合成では、 混合言語デザインで integer、 real、 string、 boolean の VHDL ジェネ リ ッ ク データ型と対応する Verilog のデータ型がサポート されます。

Page 271: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 271UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

第 9 章: 混合言語サポート

ポート マップ Vivado 合成では、 Verilog にインスタンシエート された VHDL および VHDL にインスタンシエート された Verilog のポート マップがサポート されます。

Verilog にインスタンシエート された VHDL のポート マップ

VHDL エンティティが Verilog モジュールにインスタンシエート される場合、 フォーマル ポートに次の特性を使用で

きます。

• サポート される方向: in、 out、 inout

• サポート されない指示子: buffer、 linkage

• 使用可能なデータ型: bit、 bit_vector、 std_logic、 std_ulogic、 std_logic_vector、std_ulogic_vector

VHDL にインスタンシエート された Verilog のポート マップ

Verilog モジュールが VHDL エンティティにインスタンシエート される場合、 フォーマル ポートには次の特性を使用

できます。

• サポート される方向: in、 out、 inout

• 使用可能なデータ型: wire および reg

• Vivado 合成では、 次はサポート されません。

° Verilog の双方向パス オプシ ョ ンへの接続。

° 混合デザイン境界での名前の付いていない Verilog ポートの使用。

大文字と小文字が混合している Verilog モジュールのポート名を接続する場合は、 同等のコンポーネン ト宣言を使用

してください。 Verilog ポート名はすべて小文字である と判断されます。

Page 272: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 272UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

付録 A

その他のリソースおよび法的通知

ザイリンクス リソース

アンサー、 資料、 ダウンロード、 フォーラムなどのサポート リ ソースは、 ザイ リ ンクス サポート サイ ト を参照して

ください。

ソリューシ ョ ン センター

デバイス、 ツール、 IP のサポートについては、 ザイ リ ンクス ソ リ ューシ ョ ン センターを参照してください。 デザイ

ン アシスタン ト、 デザイン アドバイザリ、 ト ラブルシューティングのヒン ト などが含まれます。

Documentation Navigator およびデザイン ハブ

ザイ リ ンクス Documentation Navigator (DocNav) では、 ザイ リ ンクスの資料、 ビデオ、 サポート リ ソースにアクセス

でき、 特定の情報を取得するためにフ ィルター機能や検索機能を利用できます。 DocNav を開くには、 次のいずれか

を実行します。

• Vivado IDE で [Help] → [Documentation and Tutorials] をク リ ッ ク します。

• Windows で [スタート ] → [すべてのプログラム] → [Xilinx Design Tools] → [DocNav] をク リ ッ ク します。

• Linux コマンド プロンプ トに 「docnav」 と入力します。

ザイ リ ンクス デザイン ハブには、 資料やビデオへのリ ンクがデザイン タスクおよびト ピッ クごとにま とめられてお

り、 これらを参照するこ とでキー コンセプ ト を学び、 よ くある質問 (FAQ) を参考に問題を解決できます。 デザイン ハブにアクセスするには、 次のいずれかを実行します。

• DocNav で [Design Hubs View] タブをク リ ッ ク します。

• ザイ リ ンクス ウェブサイ トのデザイン ハブ ページを参照します。

注記: DocNav の詳細は、 ザイ リ ンクス ウェブサイ トの Documentation Navigator ページを参照してください。

注意: DocNav からは、 日本語版は参照できません。 ウェブサイ トのデザイン ハブ ページをご利用ください。

Page 273: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 273UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

付録 A: その他のリソースおよび法的通知

参考資料

Vivado 資料

注記: 日本語版のバージ ョ ンは、 英語版よ り古い場合があ り ます。

1. 『UltraScale アーキテクチャおよび製品データシート : 概要』 (DS890: 英語版、 日本語版)

2. 『7 シ リーズ FPGA DSP48E1 スライス ユーザー ガイ ド』 (UG479: 英語版、 日本語版)

3. 『UltraScale アーキテクチャ メモ リ リ ソース ユーザー ガイ ド』 (UG573: 英語版、 日本語版)

4. 『Vivado Design Suite Tcl コマンド リ ファレンス ガイ ド』 (UG835)

5. 『Vivado Design Suite ユーザー ガイ ド : デザイン フローの概要』 (UG892)

6. 『Vivado Design Suite ユーザー ガイ ド : Vivado IDE の使用』 (UG893)

7. 『Vivado Design Suite ユーザー ガイ ド : Tcl スク リプ ト機能の使用』 (UG894)

8. 『Vivado Design Suite ユーザー ガイ ド : システム レベル デザイン入力』 (UG895)

9. 『Vivado Design Suite ユーザー ガイ ド : IP を使用した設計』 (UG896)

10. 『Vivado Design Suite ユーザー ガイ ド : I/O およびクロ ッ ク プランニング』 (UG899)

11. 『Vivado Design Suite ユーザー ガイ ド : ロジッ ク シ ミ ュレーシ ョ ン』 (UG900)

12. 『Vivado Design Suite ユーザー ガイ ド : 制約の使用』 (UG903)

13. 『Vivado Design Suite ユーザー ガイ ド : インプリ メンテーシ ョ ン』 (UG904)

14. 『Vivado Design Suite ユーザー ガイ ド : 階層デザイン』 (UG905)

15. 『Vivado Design Suite ユーザー ガイ ド : デザイン解析およびクロージャ テクニッ ク』 (UG906)

16. 『Vivado Design Suite ユーザー ガイ ド : 消費電力解析および最適化』 (UG907)

17. 『Vivado Design Suite ユーザー ガイ ド : プログラムおよびデバッグ』 (UG908)

18. 『ISE から Vivado Design Suite への移行ガイ ド』 (UG911)

19. 『Vivado Design Suite プロパティ リ ファレンス ガイ ド』 (UG912)

20. 『Vivado Design Suite チュート リ アル: 制約の使用』 (UG945)

21. 『Vivado Design Suite ユーザー ガイ ド : リ リース ノート、 インス トールおよびライセンス』 (UG973)

22. 『Vivado Design Suite ユーザー ガイ ド : カスタム IP の作成とパッケージ』 (UG1118)

23. 『Vivado Design Suite チュート リ アル: カスタム IP の作成とパッケージ』 (UG1119)

24. Vivado Design Suite の資料

合成コード例

25. コード例

ト レーニング リソース

26. Vivado Design Suite QuickTake ビデオ: 合成オプシ ョ ン

27. Vivado Design Suite QuickTake ビデオ: run の作成および管理

28. Vivado Design Suite QuickTake ビデオ: Vivado を使用した高度な合成

29. Vivado Design Suite QuickTake ビデオ チュート リ アル

Page 274: Vivado Design Suite User Guide: Synthesisjapan.xilinx.com/support/documentation/sw...•Use Project Mode, selecting options from the Vivado Integrated Design Environment (IDE). •Use

合成 274UG901 (v2020.1) 2020 年 6 月 24 日 japan.xilinx.com

付録 A: その他のリソースおよび法的通知

お読みください: 重要な法的通知本通知に基づいて貴殿または貴社 (本通知の被通知者が個人の場合には 「貴殿」、 法人その他の団体の場合には 「貴社」。 以下同じ ) に開示される情報 (以下 「本情報」 といいます) は、 ザイ リ ンクスの製品を選択および使用するこ とのためにのみ提供されます。 (1) 本情報は 「現状有姿」、 およびすべて受領者の責任で (with all faults) という状態で提供され、 ザイ リ ンクスは、 本通知をもって、 明

示、 黙示、 法定を問わず (商品性、 非侵害、 特定目的適合性の保証を含みますがこれらに限られません)、 すべての保証および条件

を負わない (否認する ) ものと します。 また、 (2) ザイ リ ンクスは、 本情報 (貴殿または貴社による本情報の使用を含む) に関係し、 起

因し、 関連する、 いかなる種類 ・性質の損失または損害についても、 責任を負わない (契約上、 不法行為上 (過失の場合を含む)、 そ

の他のいかなる責任の法理によるかを問わない) ものと し、 当該損失または損害には、 直接、 間接、 特別、 付随的、 結果的な損失

または損害 (第三者が起こした行為の結果被った、 データ、 利益、 業務上の信用の損失、 その他あらゆる種類の損失や損害を含み

ます) が含まれるものと し、 それは、 たとえ当該損害や損失が合理的に予見可能であったり、 ザイ リ ンクスがそれらの可能性につ

いて助言を受けていた場合であったと しても同様です。 ザイ リ ンクスは、 本情報に含まれるいかなる誤り も訂正する義務を負わず、

本情報または製品仕様のアップデート を貴殿または貴社に知らせる義務も負いません。 事前の書面による同意のない限り、 貴殿ま

たは貴社は本情報を再生産、 変更、 頒布、 または公に展示してはなり ません。 一定の製品は、 ザイ リ ンクスの限定的保証の諸条件

に従う こ と となるので、 https://japan.xilinx.com/legal.htm#tos で見られるザイ リ ンクスの販売条件を参照してください。 IP コアは、 ザ

イ リ ンクスが貴殿または貴社に付与したライセンスに含まれる保証と補助的条件に従う こ とにな り ます。 ザイ リ ンクスの製品は、

フェイルセーフと して、 または、 フェイルセーフの動作を要求するアプリ ケーシ ョ ンに使用するために、 設計されたり意図された

り していません。 そのよ うな重大なアプリ ケーシ ョ ンにザイ リ ンクスの製品を使用する場合のリ スク と責任は、 貴殿または貴社が

単独で負う ものです。 https://japan.xilinx.com/legal.htm#tos で見られるザイ リ ンクスの販売条件を参照してください。

自動車用のアプリ ケーシ ョ ンの免責条項

オートモーティブ製品 (製品番号に 「XA」 が含まれる ) は、 ISO 26262 自動車用機能安全規格に従った安全コンセプ ト または余剰性

の機能 ( 「セーフティ設計」 ) がない限り、 エアバッグの展開における使用または車両の制御に影響するアプリ ケーシ ョ ン ( 「セー

フティ アプリ ケーシ ョ ン」 ) における使用は保証されていません。 顧客は、 製品を組み込むすべてのシステムについて、 その使用

前または提供前に安全を目的と して十分なテス ト を行う ものと します。 セーフティ設計なしにセーフティ アプリ ケーシ ョ ンで製品

を使用する リ スクはすべて顧客が負い、 製品の責任の制限を規定する適用法令および規則にのみ従う ものと します。

© Copyright 2012-2020 Xilinx, Inc. Xilinx、 Xilinx のロゴ、 Artix、 ISE、 Kintex、 Spartan、 Virtex、 Vivado、 Zynq、 およびこの文書に含

まれるその他の指定されたブランドは、 米国およびその他各国のザイ リ ンクス社の商標です。 AMBA、 AMBA Designer、 Arm、

ARM1176JZ-S、 CoreSight、 Cortex、 PrimeCell、 Mali、 および MPCore は、 EU およびその他各国の Arm Limited の商標です。

MATLAB および Simulink は、 MathWorks, Inc. の登録商標です。 PCI、 PCIe、 および PCI Express は PCI-SIG の商標であ り、 ラ イセン

スに基づいて使用されています。 すべてのその他の商標は、 それぞれの保有者に帰属します。

この資料に関するフ ィードバッ クおよびリ ンクなどの問題につきましては、 [email protected] まで、 または各ページの

右下にある [フ ィードバッ ク送信] ボタンをク リ ッ クする と表示されるフォームからお知らせください。 フ ィードバッ クは日本語で

入力可能です。 いただきましたご意見を参考に早急に対応させていただきます。 なお、 このメール アドレスへのお問い合わせは受

け付けており ません。 あらかじめご了承ください。