vivado design suite - xilinx...合成 10 ug901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第...

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

Upload: others

Post on 15-Oct-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

Vivado Design Suite ユーザー ガイ ド

合成

UG901 (v2019.1) 2019 年 6 月 12 日

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

Page 2: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

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

セクシ ョ ン 改訂内容

2019 年 6 月 12 日 バージ ョ ン 2019.1

「イ ン ク リ メ ン タル合成」 イ ン ク リ メ ン タル合成の詳細と さ まざまな条件で実行する

方法を説明する新しいセ ク シ ョ ン。

表 8-1 SystemVerilog コ ン ス ト ラ ク ト およびサポー ト されるプロセ

ス をア ッ プデー ト 。

資料全体 構文および用語をア ッ プデー ト 。

文法および構造を必要に応じ て修正。

2018 年 12 月 19 日 バージ ョ ン 2018.3

資料全体 ヘデ ィ ングおよびラベルを この リ リ ースに合わせてア ッ プ

デー ト 。

編集上の変更。

「ブロ ッ ク レベル フ ローの設定」 BLOCK_SYNTH プロパテ ィ 、 階層、 および I/O バッ フ ァー

に関する注意に情報を追加。

「32 ビ ッ ト シフ ト レジス タのコード例 2 (VHDL)」 ソース フ ァ イルを修正。

「符号な し 16x24 ビ ッ ト 乗算器のコード例 (Verilog)」 Verilog コード例フ ァ イルを置換。

「SystemVerilog コ ン ス ト ラ ク ト 」 共用体およびイ ン ターフ ェ イ スのサポー ト ステータ ス を

ア ッ プデー ト 。

2018 年 6 月 6 日 バージ ョ ン 2018.2

資料全体 編集上の更新のみ。 技術内容の変更な し。

2018 年 4 月 13 日 バージ ョ ン 2018.1

資料全体 メ ニューおよびコマン ド をア ッ プデー ト 。

「合成の使用」 -retiming オプシ ョ ンに注記を追加。

[Settings] ダ イ ア ロ グ ボ ッ ク ス と

ス ト ラ テジの図をア ッ プデー ト 。

「サポー ト される属性」 「DSP_FOLDING」、 「DSP_FOLDING_FASTCLOCK」、

「RW_ADDR_COLLISION」 属性を追加。

「CLOCK_BUFFER_TYPE」 の説明を変更。

「CLOCK_BUFFER_TYPE の XDC 例」 を追加。

「GATED_CLOCK」 に注意を追加。

「TRANSLATE_OFF/TRANSLATE_ON」 キーワード の リ ス ト に xilinx を追加。

「ブロ ッ ク レベル フ ローの設定」 BLOCK_SYNTH プロパテ ィ の使用に関する注意を追加。

「32 ビ ッ ト ダ イナ ミ ッ ク シフ ト レジス タのコード例

(VHDL)」

コード例をア ッ プデー ト 。

合成 2UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 3: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

「HDL コーデ ィ ング手法」 次のコード例をア ッ プデー ト 。

フ ァ イル名: rams_dist.vhd

フ ァ イル名: rams_init_file.vhd

フ ァ イル名: rams_pipeline.vhd

フ ァ イル名: rams_sp_rf_rst.vhd

フ ァ イル名: ram_tdp_rf_rf.vhd

フ ァ イル名: rams_sp_rom.vhd

フ ァ イル名: rams_dist.vhd

フ ァ イル名: rams_sp_nc.vhd

フ ァ イル名: rams_sp_wf.vhd

「サポー ト される VHDL のオーバーロード型」 std_logic_arith 文に Synopsys を追加。

「シフ ト 演算子の例」 srl を sra に修正。

「VHDL のレガシ パッ ケージ」 IEEE パッ ケージを こ のセ ク シ ョ ンに移動。

「文」 構文を変更。

セクシ ョ ン 改訂内容

合成 3UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 4: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

目次

第 1 章: Vivado 合成概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

合成手法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

合成の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

合成の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

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

イ ン ク リ メ ン タル合成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

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

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

合成実行の監視 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

合成終了後のフ ロー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

合成結果の解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

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

ロ ジ ッ ク の解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

タ イ ミ ング解析の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

Tcl での合成の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

RTL 合成のマルチス レ ッ ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

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

第 2 章: 合成属性概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

サポー ト される属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

Vivado でのカ ス タ ム属性のサポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

XDC フ ァ イルでの合成属性の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

第 3 章: ブロ ッ ク合成ス ト ラ テジの使用概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

第 4 章: HDL コーデ ィ ング手法概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

VHDL の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

Verilog の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

SystemVerilog の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

フ リ ッ プフ ロ ッ プ、 レジス タ、 およびラ ッチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

ラ ッチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

ト ラ イ ステー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

シフ ト レジス タ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

ダ イナ ミ ッ ク シフ ト レジス タ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

乗算器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

複素乗算のコード例 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

DSP ブロ ッ ク の前置加算器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

合成 4UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 5: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

UltraScale DSP ブロ ッ ク の 2 乗算出機能の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

FIR フ ィ ルター . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

偶数丸め (LSB 訂正手法) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

RAM の HDL コーデ ィ ング手法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

Vivado 合成での UltraRAM の推論 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

RAM の HDL コード記述のガイ ド ラ イ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

RAM 内容の初期化 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

3D RAM の推論 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161

ブラ ッ ク ボ ッ ク ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

FSM コ ンポーネン ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

ROM の HDL コーデ ィ ング手法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

第 5 章: VHDL サポー ト概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

サポー ト される VHDL データ型と サポー ト されない VHDL データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

VHDL オブジェ ク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

VHDL のエンテ ィ テ ィ と アーキテ クチャの記述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188

VHDL の組み合わせ回路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

generate 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198

組み合わせプロセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

VHDL の順序ロ ジ ッ ク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206

VHDL の初期値 と セ ッ ト / リ セ ッ ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208

VHDL の関数 と プロ シージャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

VHDL の定義済みパッ ケージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

独自の VHDL パッ ケージの定義 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

VHDL 構文のサポー ト ステータ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

VHDL の予約語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

第 6 章: VHDL-2008 言語サポー ト概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221

VHDL-2008 を使用する ための Vivado の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221

サポー ト される VHDL-2008 の機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

第 7 章: Verilog サポー ト概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

Verilog デザイ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

Verilog の機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234

Verilog コ ン ス ト ラ ク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245

Verilog のシステム タ ス クおよび関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

変換関数の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

Verilog プ リ ミ テ ィ ブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249

Verilog の予約キーワード . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250

Verilog ビヘイ ビアー記述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

モジュール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259

手続き代入文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

タ ス クおよび関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267

第 8 章: SystemVerilog サポー ト概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275

特定のフ ァ イルで SystemVerilog を使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275

合成 5UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 6: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276

プロセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279

手続きプロ グ ラ ム代入文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

タ ス クおよび関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283

モジュールおよび階層 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284

イ ン ターフ ェ イ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285

package 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

SystemVerilog コ ン ス ト ラ ク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288

第 9 章: 混合言語サポー ト概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

VHDL と Verilog の混合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

イ ン ス タ ンシエーシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292

VHDL および Verilog ラ イブラ リ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

VHDL および Verilog の境界規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295

バイ ン ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295

ジェネ リ ッ ク のサポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295

ポー ト マ ッ プ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

付録 A: その他のリ ソースおよび法的通知ザイ リ ン ク ス リ ソース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297

ソ リ ューシ ョ ン セン ター . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297

Documentation Navigator およびデザイ ン ハブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297

参考資料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298

お読み く ださ い: 重要な法的通知 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

合成 6UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 7: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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] を参照し て く

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

合成 7UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 8: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

合成手法

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

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

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

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

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

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

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

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

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

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

合成の使用

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

ほ と んどの Vivado IDE 操作には同等の Tcl コマン ド が示されてお り 、『Vivado Design Suite Tcl コマン ド リ フ ァ レ ン ス

ガイ ド』 (UG835) [参照 4] への直接 リ ン ク が提供されています。Tcl コマン ドおよび Tcl の使用方法の詳細は、『Vivado

Design Suite ユーザー ガイ ド : Tcl ス ク リ プ ト 機能の使用』 (UG894) [参照 7] に掲載されています。

ビデオ: 詳細は、 次の QuickTake ビデオを参照し て く ださい。

Vivado Design Suite QuickTake ビデオ: 合成オプシ ョ ン

Vivado Design Suite QuickTake ビデオ: デザイ ンの合成

合成設定

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

[Synthesis Settings] を ク リ ッ ク し ます。

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

合成 8UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 10: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

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

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

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

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

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

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

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

照し て く ださい。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

X-Ref Target - Figure 1-2

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

合成 10UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 11: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

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

て く ださい。

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

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

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

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

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

° [-fanout_limit]: 信号で駆動可能な ロード の 大数を指定し ます。 ロード の数がこれよ り 大き く な る場合は、

ロ ジ ッ ク が複製されます。 このグ ローバル設定は一般的なガイ ド ラ イ ンであ り 、 ツールで必要と判断され

た場合は無視されます。 制限を強制する必要があ る場合は、 第 2 章 「合成属性」 に説明されている

MAX_FANOUT を参照し て く ださい。

注記: -fanout_limit オプシ ョ ンは制御信号 (セ ッ ト 、 リ セ ッ ト 、 ク ロ ッ ク イネーブルなど) には適用され

ないので、 これらの信号を複製する必要があ る場合は MAX_FANOUT を使用し て く ださい。

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

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

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

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

ムを短縮し ます。

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

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

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

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

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

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

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

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

削減し ます。

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

プ リ メ ン ト し ます。

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

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

し ます。

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

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

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

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

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

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

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

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

合成 11UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 12: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

° [-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 で、 指定のパーツで使用可能な 大数に設定されます。

° [-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 アサー ト 文の評価を イネーブルにし ます。 エラーの場合は合成フ ローが停止し てエラー

メ ッ セージが表示され、 警告の場合は警告 メ ッ セージが表示されます。

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

注記: tcl.pre および tcl.post ス ク リ プ ト 内のパスは、 現在のプロ ジェ ク ト に関連付け られている run

デ ィ レ ク ト リ <project>/<project.runs>/<run_name> を基準と し ています。

Tcl ス ク リ プ ト の詳細は、『Vivado Design Suite ユーザー ガイ ド : Tcl ス ク リ プ ト 機能の使用』 (UG894) [参照 7]

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

合成 12UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 13: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

を使用し ます。

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

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

get_property DIRECTORY [current_project] get_property DIRECTORY [current_run]

run ス ト ラ テジの作成

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

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

り ます。

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

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] の下に表示されます。

X-Ref Target - Figure 1-3

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

合成 13UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 14: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

合成への入力

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

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

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

き ます。

X-Ref Target - Figure 1-4

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

合成 14UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 15: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

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

し ます。

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 フ ァ イルが使用されます。

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

X-Ref Target - Figure 1-5

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

合成 15UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 16: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

重要: 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] メ ニューのオプシ ョ ン

合成 16UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 17: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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] のこのセ ク

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

X-Ref Target - Figure 1-8

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

合成 17UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 18: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

合成の実行

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

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

° 適用する制約セ ッ ト

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

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

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

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

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

X-Ref Target - Figure 1-9

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

合成 18UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 19: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

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

3. [Add] ボタ ンを ク リ ッ ク し、 run の名前 ([Name])、 制約セ ッ ト ([Constraints Set])、 デバイ ス ([Part])、 ス ト ラ テジ

([Strategy]) を選択し、 こ の run をア ク テ ィ ブ run とする場合は [Make Active] をオンにし ます。

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

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

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

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

さい。

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

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

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

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

て く ださい。

X-Ref Target - Figure 1-10

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

合成 19UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 20: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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: Create New Runs ウ ィ ザー ド : [Launch Options] ページ

合成 20UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 21: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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] ウ ィ ン ド ウ

合成 21UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 22: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 用にモジュールを設定するには、 [Sources] ウ ィ ン ド ウの [Hierarchy] ビ ューでモジュールを右ク リ ッ ク して

[Set as Out-of-Context for Synthesis] を ク リ ッ ク し、表示されるダイ アロ グ ボ ッ ク ス (図 1-13) で [OK] を ク リ ッ ク し ます。

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

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

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

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

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

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

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

X-Ref Target - Figure 1-13

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

合成 22UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 23: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

推奨: [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 モード をオフにし て く ださ い。

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

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

X-Ref Target - Figure 1-14

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

合成 23UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 24: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

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

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

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

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

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

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

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

下位ネ ッ ト リ ス ト の作成

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

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

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

れません。

X-Ref Target - Figure 1-15

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

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

Page 25: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

合成が終了し た ら合成済みデザイ ンを開き、 [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 コマン ド を使用し ます。

合成 25UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 26: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

イ ン ク リ メ ン タル合成

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

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

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

く な り ます。

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

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

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

ます。

重要なオプシ ョ ンが 2 つあ り ます。 [Write Incremental Synthesis] チェ ッ ク ボ ッ ク ス : イ ン ク リ メ ン タル合成情報を合

成後のチェ ッ ク ポイ ン ト に書き込みます。 イ ン ク リ メ ン タル合成を実行するには、 このオプシ ョ ンを設定する必要

があ り ます。

[Incremental synthesis]: イ ン ク リ メ ン タル合成をどのよ う に実行するかを指定し ます。 このフ ィ ール ド の右側にあ るボ

タ ンを ク リ ッ クする と、 次の図に示すダ イ ア ロ グ ボ ッ ク スが表示され、 3 つのオプシ ョ ンが示されます。

X-Ref Target - Figure 1-16

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

合成 26UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 27: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

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

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

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

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

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

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

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

非プロ ジェ ク ト モード を使用する場合は、 -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 オプシ ョ ン

を使用し て生成し た ものであ る必要があ り ます。

X-Ref Target - Figure 1-17

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

合成 27UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 28: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

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

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

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

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

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

き ます。

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

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

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

デザイ ン全体の再合成

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

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

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

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

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

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

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

X-Ref Target - Figure 1-18

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

合成 28UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 29: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

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

ザイ リ ン ク スが提供するほ と んどの 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 でほかの機能を実行でき る よ う にな り ます。

合成 29UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 30: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

合成実行の監視

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

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

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

X-Ref Target - Figure 1-19

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

X-Ref Target - Figure 1-20

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

合成 30UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 31: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

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

行し ます。

• [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 のレポー ト を選択し ます。

X-Ref Target - Figure 1-21

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

合成 31UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 32: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

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

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

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

合成済みデザイ ンを開 く と、 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] ウ ィ ン ド ウ

合成 32UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 33: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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] コマン ド

合成 33UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 34: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

タ イ ミ ング解析の実行

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

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

て出力が調整されます。

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

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

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

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

を確認でき ます。

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

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

X-Ref Target - Figure 1-24

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

合成 34UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 35: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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] [-fanout_limit <arg>] [-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

合成 35UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 36: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

[-bufg] Max number of global clock buffers used by synthesis Default: 12 [-no_lc] Disable LUT combining. Do not allow combining LUT pairs into single dual output LUTs. [-fanout_limit] Fanout limit. This switch does not impact control signals (such as set,reset, clock enable) use MAX_FANOUT to replicate these signals if needed. Default: 10000 [-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

合成 36UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 37: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

[-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 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] ウ ィ ン

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

合成 37UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 38: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

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

短縮でき ます。

同時に実行可能なス レ ッ ド の 大数は、 システム上のプロセ ッ サ、 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

合成 38UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 39: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

制約の設定

表 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]

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

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

表 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

合成 39UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 40: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 1 章: Vivado 合成

合 40UG

_Perfmized_igh

Flow_PerfThreshholdCarry

Flow_RuntimeOptimized

-f built rebuilt none

-g off off off

-b 12 12 12

-f 00 10,000 10,000

-d faultFewerCarry

Chains

RunTime

Optimized

-r フ オフ オフ

-f e_hot auto off

-k フ オフ オフ

-r off off auto

-c uto auto auto

-n ン オン オフ

-n フ オフ オフ

-s 5 3 3

-m -1 -1 -1

-m -1 -1 -1

-m -1 -1 -1

-m -1 -1 -1

-m -1 -1 -1

-c uto auto auto

-a フ オフ オフ

成901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

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

オプシ ョ ン/ス ト ラテジ デフ ォル トFlow_

AreaOptimized_high

Flow_AreaOptimized_

medium

Flow_AreaMultiThresholdDSP

Flow_AltRoutability

FlowOpti

H

latten_hierarchy rebuilt rebuilt rebuilt rebuilt rebuilt re

ated_clock_conversion off off off off off

ufg 12 12 12 12 12

anout_limit 10,000 10,000 10,000 10,000 10,000 4

irective DefaultAreaOptimized

_high

AreaOptimized

_medium

AreaMutl

Threshold

DSP

Alternate

RoutabilityDe

etiming オフ オフ オフ オフ オフ オ

sm_extraction auto auto auto auto auto on

eep_equivalent_registers オフ オフ オフ オフ オフ オ

esource_sharing auto auto auto auto auto

ontrol_set_opt_threshold auto 1 1 auto auto a

o_lc オフ オフ オフ オフ オン オ

o_srlextract オフ オフ オフ オフ オフ オ

hreg_min_size 3 3 3 3 10

ax_bram -1 -1 -1 -1 -1

ax_uram -1 -1 -1 -1 -1

ax_dsp -1 -1 -1 -1 -1

ax_bram_cascade_height -1 -1 -1 -1 -1

ax_uram_cascade_height -1 -1 -1 -1 -1

ascade_dsp auto auto auto auto auto a

ssert オフ オフ オフ オフ オフ オ

Page 41: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 41UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 42: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 42UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 43: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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]]

合成 43UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 44: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 を設定し ます。

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

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

合成 44UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 45: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 45UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 46: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

VHDL コ ンポーネン ト の例

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

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 でのみサポー ト されます。 ポー ト またはピンに設定し て く ださい。

合成 46UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 47: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

VHDL 例

attribute dsp_folding_fastclock : string;attribute rw_addr_collision of clk_fast : signal is “yes”;

Verilog 例

(* dsp_folding_fastclock = “yes” *) input clk_fast;

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"

です。

EXTRACT_RESET の Verilog 例

(* extract_reset = “yes” *) reg my_reg;

合成 47UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 48: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

EXTRACT_RESET の VHDL 例

signal my_reg : std_logic;attribute extract_reset : string;attribute extract_reset of my_reg: signal is “no”;

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;

合成 48UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 49: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

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";

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 などの属性を使用する場合は注意が必要です。 ゲー

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

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

合成 49UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 50: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

GATED_CLOCK の Verilog 例

(* gated_clock = “true” *) input clk;

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 または XDC で設定でき ます。

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 または XDC で設定でき ます。

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;

合成 50UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 51: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

KEEP

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

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

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

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

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

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

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

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

定し ます。

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

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

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

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;

合成 51UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 52: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

KEEP の VHDL 例

signal sig1 : std_logic;attribute keep : string;attribute keep of sig1 : signal is “true”;........sig1 <= in1 and in2;out1 <= sig1 and in3;

KEEP_HIERARCHY

KEEP_HIERARCHY は、 階層レベルが変更されないよ う にし ます。 Vivado 合成では、 RTL で指定されたの と同じ階層

が保持される よ う 試みられますが、 QoR (結果の品質) のために階層がフ ラ ッ ト にされた り 、 変更される こ と も あ り

ます。

イ ン ス タ ン スに KEEP_HIERARCHY を指定する と、 合成でその階層レベルは変更されません。

これが QoR に影響を与え る場合があ り ます。 また、 ト ラ イ ステー ト 出力および I/O バッ フ ァーの制御ロ ジ ッ ク を記

述するモジュールには使用し ないで く ださい。 KEEP_HIERARCHY は、 モジュール、 アーキテ クチャ レベル、 また

はイ ン ス タ ン スに指定でき ます。 この属性は RTL でのみ設定でき ます。

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”;

イ ン ス タ ン スの場合

attribute keep_hierarchy : string;attribute keep_hierarchy of u0 : label is “yes”;

合成 52UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 53: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

MARK_DEBUG

この属性は、 内部アレ イにア ク セス可能なネ ッ ト オブジェ ク ト (get_nets コマン ド で指定) に適用でき ます。

注記: 一部のネ ッ ト には、 専用接続があ る など、 デバッ グ目的で監視でき ないものがあ り ます。

有効な値は "TRUE" または "FALSE" です。

構文

Verilog 構文

この属性を設定するには、 信号に適切な Verilog 属性構文を配置し ます。

(* MARK_DEBUG = “{TRUE|FALSE}” *)

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]

合成 53UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 54: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

推奨: 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 または XDC で設定でき ます。

MAX_FANOUT は、 合成のグ ローバル オプシ ョ ン -fanout_limit のデフ ォル ト 値よ り も優先されます。 デザイ ン全

体のデフ ォル ト 値は、 [Settings] ダ イ ア ロ グ ボ ッ ク スの [Synthesis] ページまたは synth_design コマン ド の

-fanout_limit オプシ ョ ンを使用し て設定し ます。

MAX_FANOUT 属性は強制的に適用されますが、 -fanout_limit はガイ ド ラ イ ン と し て使用され、 強制されません。

フ ァ ンア ウ ト を厳密に制御する必要があ る場合は、 MAX_FANOUT を使用し て く ださい。 また、 -fanout_limit オ

プシ ョ ン と は異な り 、 MAX_FANOUT は制御信号にも適用されます。 -fanout_limit オプシ ョ ンは制御信号 (セ ッ

ト 、 リ セ ッ ト 、 ク ロ ッ ク イネーブルなど) には適用されないので、 これらの信号を複製する必要があ る場合は

MAX_FANOUT を使用し て く ださい。

注記: 入力、 ブラ ッ ク ボ ッ ク ス、 EDIF (EDF),および NGC (Native Generic Circuit) フ ァ イルはサポー ト されていません。

重要: Vivado Design Suite では、 UltraScale デバイ スに対し て NGC フ ォーマ ッ ト のフ ァ イルはサポー ト されていませ

ん。 Vivado Design Suite で IP を再生成し、 ネイ テ ィ ブ出力フ ァ イルを使用する こ と をお勧めし ます。 NGC フ ァ イル

は NGC2EDIF コマン ド で EDIF に変換し て イ ンポー ト する こ と も でき ますが、今後は XST で生成された NGC フ ォー

マ ッ ト ではな く ネイ テ ィ ブ Vivado IP を使用する こ と をお勧めし ます。

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 では整数です。

合成 54UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 55: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

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 番目の構成が強制的に使用されます。

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 プ リ ミ テ ィ ブが使用される よ う 指定し ます。

合成 55UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 56: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

デフ ォル ト では、 ほ と んどのデザイ ンで 適な結果が生成される よ う に、 経験則に基づいて推論する 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 属性は、 レジス タ を ロ ジ ッ ク を通過させて後方に移動し、 駆動する順次エレ メ ン ト に近づけ

ます。 グ ローバル リ タ イ ミ ング設定と は異な り 、 こ の属性はタ イ ミ ング ド リ ブンではな く 、 グ ローバル リ タ イ ミ ン

グ設定がア ク テ ィ ブであ るかど う か、 タ イ ミ ング制約があ るかど う かにかかわらず機能し ます。 グ ローバル リ タ イ

ミ ング設定がア ク テ ィ ブの場合、 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];

合成 56UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 57: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

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 メ モ リ の推論方法を指定し ます。 有効な値は次の とお り です。

• 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 コーデ ィ ング手法」 を参照し て く ださい。

合成 57UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 58: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

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 構造は推論されず、 レジス タが作成されます。

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”;

合成 58UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 59: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

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”;

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

合成 59UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 60: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

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" です。

• "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);

合成 60UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 61: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

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”;

カス タ ム属性を信号に設定する場合も注意が必要です。 信号にカス タ ム属性が設定されている と、 合成ツールはその

ア イテムにその属性を配置し よ う と し ますが、 RTL コード がツールによ り どのよ う に評価されるかによ って、 そのア

イテムがレジス タ またはネ ッ ト に変換される こ と があ り ます。 また、 階層に設定されている場合と同様、 信号にカス

タ ム属性が設定されていて も、 その信号が 適化によ り 削除され、 属性が失われる可能性があ り ます。 信号に設定し

たカス タ ム属性を保持するには、 それらの信号に DONT_TOUCH または KEEP 属性を設定する必要があ り ます。

後に、 RTL の信号はレジス タおよびレジス タから出力されるネ ッ ト を記述するので、 合成ツールはカス タ ム属性

と DONT_TOUCH 属性の両方が設定されたア イ テムをチェ ッ ク し ます。 カ ス タ ム属性の使用方法は複数あ り 、 属性が

レジス タに必要な場合 と ネ ッ ト に必要な場合があ るので、 ネ ッ ト がレジス タによ り 駆動されている場合、 カス タ ム

属性はレジス タおよびネ ッ ト にコ ピーされます。

合成 61UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 62: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

信号に設定されたカス タム属性の 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] ウ ィ ン ド ウでア イ テムを選択し ます。

合成 62UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 63: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 2 章: 合成属性

2. [Cell Properties] ウ ィ ン ド ウで [Properties] ビ ューを ク リ ッ ク し、 次のいずれかを実行し ます。

° プロパテ ィ を変更し ます。

° プロパテ ィ が表示されていない場合は、 右ク リ ッ ク し て [Add Properties] を ク リ ッ クするかツールバーの

[Add properties] ボタ ンを ク リ ッ ク し て、 [Add Properties] ダ イ ア ロ グ ボ ッ ク スでプロパテ ィ を選択し ます。

これによ り 属性が現在の制約フ ァ イルに保存されるか、 制約フ ァ イルが存在し ない場合は新しい制約フ ァ イル

に保存されます。

X-Ref Target - Figure 2-1

図 2-1: エラボレー ト 済みデザイ ンでの XDC プロパテ ィ の追加

合成 63UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 64: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 3 章

ブロ ッ ク合成ス ト ラ テジの使用

概要

Vivado 合成では、 合成でデザイ ンがどのよ う に処理されるかをカス タマイ ズする ためのス ト ラ テジおよびグ ローバ

ル設定が多数あ り ます。 図 1-2 に [Settings] ダ イ ア ロ グ ボ ッ ク スの [Synthesis] ページで選択可能な定義済みス ト ラ テ

ジ、 表 1-2 にス ト ラ テジ設定を比較する表が示されています。

-fanout_limit や -retiming などの一部のオプシ ョ ンは RTL フ ァ イルまたは XDC フ ァ イルの属性または XDC

を使用し て設定でき ますが、 オプシ ョ ンは通常デザイ ン全体に適用されます。

デザイ ンが複雑になるにつれ、 これらの設定の適用によ り デザイ ンで達成可能な結果が制限される こ と があ り ます。

デザイ ンの階層によ っては、 特定のオプシ ョ ンがほかのオプシ ョ ン よ り 適し ている場合も あ り ます。 図 3-1 に、 異

なる階層タ イプを含む中型のデザイ ンを示し ます。

これらの階層をアウ ト オブ コ ンテキス ト (OOC) モード で合成するのが 1 つの方法であ り 、 効果的ですが、 デザイ ン

フ ローが複雑にな り ます。 OOC フ ローでは、 OOC モード で合成する よ う 設定された階層が分割され、 デザイ ンのほ

かの部分から切 り 離し て実行されます。 これは、 1 つのデザイ ンで合成が複数回実行される と い う こ と です。 また、

制約もデザイ ンの残 り の部分から分割する必要があ るので、 複雑性が増し ます。

X-Ref Target - Figure 3-1

図 3-1: 多数の階層を含むデザイ ン

合成 64UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 65: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 3 章: ブロ ッ ク合成ス ト ラテジの使用

ブロ ッ ク レベル合成フ ロー (BLOCK_SYNTH) では、 ト ッ プダウ ン フ ローで、 全デザイ ンの 上位と は異なる特定の

階層レベルに、 特定のグ ローバル設定およびス ト ラ テジを適用するプロパテ ィ を使用し ます。

ブロ ッ ク レベル フ ローの設定

ブロ ッ ク レベル合成フ ローを設定するには、 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 プロパテ ィ が適用されます。 このレベルにデフォル ト とは異なる値を設定する こ と もでき ます。

合成 65UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 66: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 3 章: ブロ ッ ク合成ス ト ラテジの使用

注記: ブロ ッ ク レベル フ ローを実行する と、 デザイ ンが ト ッ プダウ ン モード にな り 、 デザイ ン全体で合成が実行さ

れます。 BLOCK_SYNTH プロパテ ィ を設定し た イ ン ス タ ン スでは、 そのレベルが確実に境界内に含まれ、 周辺のロ

ジ ッ ク と結合された り し ないよ う に、 階層が保持されます。 これは、 QoR (結果の品質) に影響する可能性があ り ま

す。 そのため、 BLOCK_LEVEL プロパテ ィ の使用には注意が必要です。 必要な イ ン ス タ ン スにのみ設定する よ う に

し て く ださい。

ブロ ッ ク レベル フ ロー オプシ ョ ン ブロ ッ ク レベル フ ローでは、 ツールで提供される定義済みス ト ラ テジの一部がサポー ト されます。 使用可能なス ト

ラ テジは、 DEFAULT、 AREA_OPTIMIZED、 ALTERNATE_ROUTABILITY、 PERFORMANCE_OPTIMIZED です。 これ

ら を使用するには、 次の構文を使用し ます。

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

合成ツールで推論される ステー ト マシンのエン コード

を設定し ます。

LUT_COMBINING整数 0、 1

• 0: LUT の組み合わせをデ ィ スエーブルにし ます。

• 1: LUT の組み合わせを イネーブルにし ます。

合成 66UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 67: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 3 章: ブロ ッ ク合成ス ト ラテジの使用

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: 等価レジス タ を保持し ます。

表 3-1: BLOCK_SYNTH でサポー ト されるス ト ラ テジ (続き)

オプシ ョ ン データ型 値 説明

合成 67UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 68: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章

HDL コーデ ィ ング手法

概要

ハード ウ ェア記述言語 (HDL) のコーデ ィ ング手法を使用する と、 次が可能にな り ます。

• デジタル ロ ジ ッ ク回路でよ く 使用される機能を記述でき ます。

• ザイ リ ン ク ス デバイ スのアーキテ クチャ機能を利用でき ます。

• Vivado® 統合設計環境 (IDE) から テンプレー ト を使用でき ます。 テンプレー ト を開 く には、 [Window] →

[Language Templates] を ク リ ッ ク し ます。

この章にはコード例が含まれます。 コード例のフ ァ イルは、 この リ ン ク から ダウ ン ロード でき ます。

VHDL の利点

• 規則が厳し く 、 データ型が厳格に定義されているため、 自由度が低 く 、 エラーが発生しに く い

• HDL ソース コード での RAM コ ンポーネン ト の初期化が簡単 (Verilog の初期ブロ ッ ク の方が困難)

• パッ ケージ サポー ト

• カ ス タ ム型

• 列挙型

• reg と wire の混乱がない

Verilog の利点

• C 言語のよ う な構文

• コード が VHDL よ り も コ ンパク ト

• ブロ ッ ク コ メ ン ト

• VHDL のよ う にコ ンポーネン ト イ ン ス タ ンシエーシ ョ ンが多 く ない

合成 68UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 69: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

SystemVerilog の利点

• コード が Verilog よ り も コ ンパク ト

• 構造体および列挙型によ り スケーラ ビ リ テ ィ に優れている

• 高抽象度のイ ン ターフ ェ イ ス

• Vivado 合成でサポー ト

フ リ ッ プ フ ロ ッ プ、 レジス タ、 およびラ ッ チ

Vivado 合成では、 次の制御信号付きのフ リ ッ プフ ロ ッ プ、 レジス タが認識されます。

• 立ち上が り エ ッ ジまたは立ち下が り エ ッ ジのク ロ ッ ク

• 非同期セ ッ ト / リ セ ッ ト

• 同期セ ッ ト / リ セ ッ ト

• ク ロ ッ ク イ ネーブル

フ リ ッ プフ ロ ッ プ、 レジス タ、 およびラ ッチは、 次を使用し て記述されます。

• 順次処理文 (VHDL)

• always ブロ ッ ク (Verilog)

• フ リ ッ プフ ロ ッ プには always_ff、 ラ ッチには always_latch (SystemVerilog)

process または always ブロ ッ ク のセンシテ ィ ビテ ィ リ ス ト には、 次を含める必要があ り ます。

• ク ロ ッ ク信号

• すべての非同期制御信号

フ リ ッ プ フ ロ ッ プおよびレジス タの制御信号

フ リ ッ プフ ロ ッ プおよびレジス タの制御信号には、 次のものがあ り ます。

• ク ロ ッ ク

• 非同期および同期のセ ッ ト / リ セ ッ ト 信号

• ク ロ ッ ク イ ネーブル

合成 69UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 70: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

コー ド記述のガイ ド ラ イ ン

• レジス タ を非同期にセ ッ ト / リ セ ッ ト し ないで く ださい。

° 制御セ ッ ト をマ ッ プし直すこ と ができ な く な り ます。

° ブロ ッ ク RAM コ ンポーネン ト および DSP ブロ ッ ク などのデバイ ス リ ソースの順次機能は、 同期的にしか

セ ッ ト または リ セ ッ ト でき ません。

° レジス タ を非同期にセ ッ ト または リ セ ッ ト する と、 デバイ ス リ ソースが使用でき な く な るか、 それらの リ

ソースが 適に設定されな く な り ます。

• セ ッ ト と リ セ ッ ト の両方を持つフ リ ッ プフ ロ ッ プを記述し ないで く ださい。

° 同期または非同期のどち らであって も、 セ ッ ト と リ セ ッ ト の両方を持つフ リ ッ プフ ロ ッ プ プ リ ミ テ ィ ブは

あ り ません。

° セ ッ ト と リ セ ッ ト の両方を持つフ リ ッ プフ ロ ッ プは、 エ リ アおよびパフ ォーマン スに悪影響を与え る可能

性があ り ます。

• でき る限 り 、 セ ッ ト / リ セ ッ ト ロ ジ ッ ク を使用し ないで く ださい。 初期内容を定義し て回路のグ ローバル リ セ ッ

ト を使用する など、 必要な機能を達成でき る コ ス ト が低いその他の方法があ る可能性があ り ます。

• フ リ ッ プフ ロ ッ プ プ リ ミ テ ィ ブのク ロ ッ ク イネーブル、 セ ッ ト / リ セ ッ ト 制御入力は常にア ク テ ィ ブ High にし

ます。 ア ク テ ィ ブ Low にする と、 反転ロ ジ ッ ク によ り 回路パフ ォーマン スが悪化する こ と があ り ます。

フ リ ッ プ フ ロ ッ プおよびレジス タの推論

Vivado 合成では、 HDL コード の記述方法によ って、 4 種類のレジス タ プ リ ミ テ ィ ブが推論されます。

• FDCE: ク ロ ッ ク イ ネーブルおよび非同期ク リ ア付き D フ リ ッ プフ ロ ッ プ

• FDPE: ク ロ ッ ク イネーブルおよび非同期プ リ セ ッ ト 付き D フ リ ッ プフ ロ ッ プ

• FDSE: ク ロ ッ ク イネーブルおよび同期セ ッ ト 付き D フ リ ッ プフ ロ ッ プ

• FDRE: ク ロ ッ ク イ ネーブルおよび同期 リ セ ッ ト 付き D フ リ ッ プフ ロ ッ プ

フ リ ッ プ フ ロ ッ プおよびレジス タの初期化

回路に電源が投入された と きにレジス タの内容を初期化するには、 信号宣言でデフ ォル ト 値を指定し ます。

フ リ ッ プ フ ロ ッ プおよびレジス タのレポー ト

• HDL 合成中にレジス タが推論される と、 レポー ト に記述されます。

• HDL 合成中に推論されたレジス タの数は、 Design Summary セ ク シ ョ ンのフ リ ッ プフ ロ ッ プ プ リ ミ テ ィ ブの数と

完全に一致し ないこ と があ り ます。

• フ リ ッ プフ ロ ッ プ プ リ ミ テ ィ ブの数は、 次の処理によ り 異な り ます。

° DSP ブロ ッ ク またはブロ ッ ク RAM コ ンポーネン ト へのレジス タの吸収

° レジス タの複製

° 定数または等価フ リ ッ プフ ロ ッ プの削除

合成 70UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 71: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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

合成 71UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 72: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 72UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 73: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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

合成 73UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 74: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

\

合成 74UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 75: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

ト ラ イステー ト

• ト ラ イ ステー ト は通常、 信号または if-else 構文でモデ リ ング されます。

• これは、 バッ フ ァーが内部バス を駆動する場合でも、 デバイ スが搭載されているボード 上の外部バス を駆動す

る場合でも適用されます。

• if-else の分岐の 1 つで信号がハイ イ ンピーダン スに割 り 当て られています。

コード例のフ ァ イルは、 この リ ン ク から ダウ ン ロード でき ます。

ト ラ イステー ト のイ ンプ リ メ ンテーシ ョ ン

推論された ト ラ イ ステー ト バッ フ ァーは、 次のいずれかを駆動するかによ って、 異なるデバイ ス プ リ ミ テ ィ ブを使

用し て イ ンプ リ メ ン ト されます。

• 回路の外部ピン (OBUFT)

• 内部バス (BUFT):

° 推論された BUFT は、 Vivado 合成によ り LUT 内のロ ジ ッ ク に自動的に変換されます。

° BUFT を推論する内部バスが 上位モジュールの出力を駆動する場合、 OBUF が推論されます。

ト ラ イステー ト のレポー ト 例

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

合成 75UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 76: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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 isbegin 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

合成 76UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 77: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

シフ ト レジス タ

シフ ト レジス タはフ リ ップフ ロ ップのチェーンで、 固定数 (ス タテ ィ ッ ク ) のレ イ テンシ段を介してデータ を伝搬でき

ます。 「ダイナ ミ ッ ク シフ ト レジス タ」 では、 伝搬チェーンの長さ を回路の操作中にダイナ ミ ッ クに変更でき ます。

コード例のフ ァ イルは、 この リ ン ク から ダウ ン ロード でき ます。

ス タ テ ィ ッ ク シフ ト レジス タの要素

ス タ テ ィ ッ ク シフ ト レジス タには、 通常次のものが含まれます。

• ク ロ ッ ク

• ク ロ ッ ク イ ネーブル (オプシ ョ ン)

• シ リ アル データ入力

• シ リ アル データ出力

シフ ト レジス タの SRL ベースのイ ンプ リ メ ンテーシ ョ ン

Vivado 合成では、 シフ ト レジス タが推論される と、 通常次のよ う な SRL 型の リ ソースにイ ンプ リ メ ン ト されます。

• SRL16E

• SRLC32E

シフ ト レジス タの長さ によ って、 Vivado 合成で次のよ う に処理されます。

• SRL タ イプのプ リ ミ テ ィ ブにイ ンプ リ メ ン ト

• SRLC タ イプのプ リ ミ テ ィ ブのカスケード機能を利用

• デザイ ンの残 り の部分でシフ ト レジス タの中間地点のど こ かが使用される場合も、 こ のカス ケード機能が利用

されます。

合成 77UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 78: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

シフ ト レジス タのコー ド例

次に、 シフ ト レジス タの 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;

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;

合成 78UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 79: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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;

合成 79UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 80: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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

合成 80UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 81: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

SRL ベース シフ ト レジス タのレポー ト

Report Cell Usage: -----+-------+----- |Cell |Count-----+-------+-----1 |SRLC32E| 1

ダイナ ミ ッ ク シフ ト レジス タ

ダ イナ ミ ッ ク シフ ト レジス タは、 回路の動作中にダ イナ ミ ッ ク に長さ を変え る こ と ができ る シフ ト レジス タです。

ダ イナ ミ ッ ク シフ ト レジス タは、 次のよ う に考え る こ と ができ ます。

• 回路の動作中に指定可能な 大長のフ リ ッ プフ ロ ッ プのチェーン。

• 指定された ク ロ ッ ク サイ クルで伝搬チェーンからデータ を抽出する段階を選択するマルチプレ ク サー。

Vivado 合成では、 任意の 大長のダ イナ ミ ッ ク シフ ト レジス タ を推論でき ます。

Vivado ツールでは、 ダ イナ ミ ッ ク レジス タはデバイ ス フ ァ ミ リ で使用可能な SRL タ イプのプ リ ミ テ ィ ブを使用し て

適にイ ンプ リ メ ン ト でき ます。 次の図に、 ダ イナ ミ ッ ク シフ ト レジス タの機能を示し ます

X-Ref Target - Figure 4-1

X-Ref Target - Figure 4-2

図 4-1: ダイナ ミ ッ ク シフ ト レジス タの図

合成 81UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 82: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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

合成 82UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 83: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 83UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 84: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 ブロ ッ クに吸収されな く な り ます。

合成 84UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 85: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

乗算器のコー ド例

符号な し 16x24 ビ ッ ト 乗算器のコー ド例 (Verilog)

フ ァ イル名: mult_unsigned.v

// Unsigned 16x24-bit Multiplier// 1 latency stage on operands// 3 latency stage after the multiplication// File: mult_unsigned.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

合成 85UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 86: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

符号な し 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); 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;

乗加算および乗累算

次のマ ク ロが推論されます。

• 乗加算

• 乗減算

• 乗加減算

• 乗累算

これらのマ ク ロは、 次のものを集約する こ と によ り 推論されます。

• 乗算器

• 加減算器

• レジス タ

合成 86UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 87: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

乗加算と乗累算のイ ンプ リ メ ンテーシ ョ ン

乗加算 と乗累算のイ ンプ リ メ ンテーシ ョ ンでは、 次が実行されます。

• 推論された乗加算または乗累算マ ク ロ を DSP ブロ ッ ク リ ソースにイ ンプ リ メ ン ト でき ます。

• DSP ブロ ッ クのパイプラ イ ン機能が利用されます。

• 次のものが吸収されます。

° 乗算オペラ ン ド の 2 レジス タ段 。

° 乗算後の 1 レジス タ段。

° 加算器、 減算器、 加減算器の後ろにあ る 1 レジス タ段。

° 加算/減算の選択信号の 1 レジス タ段。

° 加算器のオプシ ョ ンのキ ャ リ ー入力の 1 レジス タ段。

• Vivado 合成では、 イ ンプ リ メ ンテーシ ョ ンに必要な DSP リ ソースが 1 つのみの場合に乗累算 (MAC) を DSP ブ

ロ ッ ク にイ ンプ リ メ ン ト でき ます。

• マ ク ロが 1 つの DSP に収ま ら ない場合は、 次のよ う に処理されます。

° 乗算器 と アキ ュ ムレータ (累算) が別々のマ ク ロ と し て処理されます。

° 各マ ク ロが個別に処理されます。

DSP ブロ ッ ク リ ソースへのマク ロのイ ンプ リ メ ンテーシ ョ ン

DSP ブロ ッ ク リ ソースへのマ ク ロのイ ンプ リ メ ンテーシ ョ ンは、 デフ ォル ト で推論されます。

• デフ ォル ト モード では、 次のよ う に処理されます。

° 乗加算マ ク ロ と乗累算マ ク ロがイ ンプ リ メ ン ト されます。

° ターゲ ッ ト デバイ スで使用可能な DSP ブロ ッ クが考慮されます。

° 使用可能なすべての DSP リ ソースが使用されます。

° DSP ブロ ッ ク のパイプ ラ イ ン機能をすべて利用し て、 高の回路パフ ォーマン スが得られる よ う 試みられ

ます。

° レジス タ を乗加算マ ク ロ または乗累算マ ク ロに吸収でき るかど う かスキ ャ ン されます。

レジス タが DSP ブロ ッ ク に吸収されないよ う にするには、 KEEP 属性を使用し ます。 た と えば、 乗算器のオペラ ン

ド にあ る レジス タが DSP ブロ ッ ク に吸収されないよ う にするには、 レジス タの出力に KEEP を設定し ます。 KEEP 属

性の詳細は、 「KEEP」 を参照し て く ださい。

コード例のフ ァ イルは、 この リ ン ク から ダウ ン ロード でき ます。

合成 87UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 88: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

複素乗算のコー ド例

次に、 複素乗算の 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) 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

合成 88UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 89: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

// 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

合成 89UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 90: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

複素乗算のコー ド例 (VHDL)3 つの DSP ブロ ッ ク を使用する完全にパイプラ イ ン処理された複素乗算の例を示し ます。

フ ァ イル名: cmult.vhd

-- 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);

合成 90UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 91: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

mult0 <= addcommon * bi_dd; common <= mult0; end if; end process;

-- Real product -- 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;

合成 91UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 92: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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 );

// 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

合成 92UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 93: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

乗算器および後置加算器の前に動的にコ ン フ ィ ギュ レーシ ョ ン された前置加算器のコー ド例 (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); 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;

合成 93UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 94: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

UltraScale DSP ブロ ッ クの 2 乗算出機能の使用

UltraScale DSP ブロ ッ ク (DSP48E2) プ リ ミ テ ィ ブは、 前置加算器の入力または出力の 2 乗を算出でき ます。

コード例のフ ァ イルは、 この リ ン ク から ダウ ン ロード でき ます。

次に、 差分 2 乗の例を示し ます。 これを使用する と、 差分の絶対値の計算 と効率的に置き換え る こ と ができ ます。

1 つの DSP ブロ ッ ク に収ま り 、 大速度で動作し ます。 上記のコード例フ ァ イルには、 UltraScale アーキテ クチャの

1 つの DSP ブロ ッ ク に配置可能な差分 2 乗のアキ ュ ム レータの例も含まれています。

差分 2 乗のコー ド例 (Verilog)フ ァ イル名: squarediffmult.v

// 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

合成 94UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 95: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

差分 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 ); 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;

合成 95UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 96: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

FIR フ ィ ルター

Vivado 合成は、 RTL から直接 FIR フ ィ ルターを作成するのにカ スケード接続された乗加算器を推論し ます。

このよ う なフ ィ ルターにはい く つかのイ ンプ リ メ ンテーシ ョ ン方法があ り ます。 その 1 つは、 『7 シ リ ーズ FPGA

DSP48E1 ス ラ イ ス ユーザー ガイ ド』 (UG479) [参照 2] の図 3-6 「8 タ ッ プの偶数対称シス ト リ ッ ク FIR」 に示されて

いる シス ト リ ッ ク フ ィ ルターです。

コード例のフ ァ イルは、 この リ ン ク から ダウ ン ロード でき ます。

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;

合成 96UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 97: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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) (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

合成 97UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 98: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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;

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;

合成 98UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 99: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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; 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);

合成 99UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 100: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

-- 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 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;

合成 100UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 101: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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]; endmodule // convergentRoundingEven

合成 101UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 102: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

偶数への丸めのコー ド例 (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; end if; end if; end process;

合成 102UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 103: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

-- 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;

合成 103UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 104: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

奇数への丸めのコー ド例 (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 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

合成 104UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 105: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

奇数への丸めのコー ド例 (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 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;

合成 105UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 106: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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;

合成 106UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 107: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

RAM の HDL コーデ ィ ング手法

Vivado 合成では、 さ まざまな RAM のコーデ ィ ング ス タ イルを解釈し、 分散 RAM またはブラ ッ ク RAM にマ ッ プで

き ます。 これによ り 、 次が可能にな り ます。

• 手動で RAM プ リ ミ テ ィ ブを イ ン ス タ ンシエー ト する必要な し

• 時間を短縮

• HDL ソース コード を移行および拡張しやすい

コード例のフ ァ イルは、 この リ ン ク から ダウ ン ロード でき ます。

分散 RAM と専用ブロ ッ ク RAM 間の選択

データは、 両方のタ イプの RAM に同期に書き込まれます。 分散 RAM と ブロ ッ ク RAM の主な違いは、 RAM からの

データの読み出し方法にあ り ます。 次の表を参照し て く ださい。

分散 RAM または専用ブロ ッ ク RAM のどち ら を使用するかは、 HDL ソース コード で記述し た RAM の特性、 使用可

能なブロ ッ ク RAM リ ソース、 および RAM_STYLE 属性を使用し て特定のイ ンプ リ メ ンテーシ ョ ン ス タ イルを指定

し たかど う かによ り ます。

メ モ リの推論

メ モ リ の推論機能には、 次のものが含まれます。

• 任意のサイズおよびデータ幅をサポー ト 。 メ モ リ 記述は 1 つまたは複数の RAM プ リ ミ テ ィ ブにマ ップされます。

• シングル ポー ト 、 シンプル デュ アル ポー ト 、 完全なデュ アル ポー ト

• 大 2 つの書き込みポー ト

• 複数の読み出しポー ト

記述されている書き込みポー ト が 1 つのみの場合、 Vivado 合成では書き込みア ド レ ス と は異な る ア ド レ スの RAM の

内容にア ク セスする読み出しポー ト が複数あ る RAM 記述を認識でき ます。

• ラ イ ト イ ネーブル

• RAM イネーブル (ブロ ッ ク RAM)

• データ出力 リ セ ッ ト (ブロ ッ ク RAM)

• オプシ ョ ンの出力レジス タ (ブロ ッ ク RAM)

• バイ ト ラ イ ト イネーブル (ブロ ッ ク RAM)

• 各 RAM ポー ト は、 その ク ロ ッ ク、 ポー ト イネーブル、 書き込みイネーブル、 データ出力 リ セ ッ ト で制御でき

ます。

表 4-1: 分散 RAM と専用ブロ ッ ク RAM の違い

操作 分散 RAM 専用ブロ ッ ク RAM

書き込み 同期 同期

読み出し 非同期 同期

合成 107UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 108: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

• 初期内容の指定

• Vivado 合成では、 記述されているデータ幅に対応する ため、 パ リ テ ィ ビ ッ ト を通常のデータ ビ ッ ト と し て使用

でき ます。

注記: パ リ テ ィ ビ ッ ト の詳細は、 ターゲ ッ ト デバイ スのユーザー ガ イ ド を参照し て く ださい。

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 コード のテンプレー ト が含まれています。 次の図に、 テンプ

レー ト フ ァ イルを示し ます。

合成 108UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 109: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

詳細は、 『UltraScale アーキテ クチャ メ モ リ リ ソース ユーザー ガイ ド』 (UG573) [参照 3] を参照し て く ださい。

X-Ref Target - Figure 4-2

図 4-2: UltraRAM のコー ド テンプレー ト

合成 109UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 110: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

Vivado 合成での UltraRAM の推論

UltraRAM プ リ ミ テ ィ ブの概要

UltraRAM は、 ザイ リ ン ク ス UltraScale+ デバイ スで使用可能な新しい専用 メ モ リ プ リ ミ テ ィ ブです。 大型の メ モ リ

であ り 、 カ スケード接続し て さ らに大型の RAM ブロ ッ ク を作成でき ます。 詳細は、 『UltraScale アーキテ クチャ メ

モ リ リ ソース ユーザー ガイ ド』 (UG573) [参照 3] を参照し て く ださい。

UltraRAM プ リ ミ テ ィ ブの説明

UltraRAM プ リ ミ テ ィ ブは、 1 つのク ロ ッ ク を持つデュ アル ポー ト の メ モ リ です。 1 つのプ リ ミ テ ィ ブを 4Kx72 と し

て設定でき ます。 UltraRAM には 2 つのポー ト があ り 、 どち らのポー ト でも RAM の 4K すべてにア ク セスでき ます。

これによ り 、 シングル ポー ト 、 シンプル デュ アル ポー ト 、 および完全なデュ アル ポー ト の動作が可能です。 各

ポー ト には、 複数のパイプラ イ ン レジス タがあ り ます。 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 の作成方法をユーザーがあ る程度制御でき ます。

合成 110UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 111: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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”;

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 には属性の値が使用されます。

合成 111UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 112: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

推論機能

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 と合成後のシ ミ ュ レーシ ョ ンの動作が異なる ものになる可能性があ り ます。

シンプル デュ アル ポー ト および完全なデュ アル ポー ト メ モ リ のどち ら も、 両方のポー ト のク ロ ッ クは同じであ る

必要があ り ます。

異なる ス タ イルの RAM に加え、 推論可能な UltraRAM の機能がほかにもい く つかあ り ます。 RAM には、 ラ イ ト イ

ネーブルよ り も優先される グ ローバル イネーブル信号があ り ます。 標準のラ イ ト イネーブルおよびバイ ト ラ イ ト

イネーブルがサポー ト されています。 データ出力には以前のブロ ッ ク RAM と同様の リ セ ッ ト があ り ますが、 SRVAL

は設定できず、 0 への リ セ ッ ト のみがサポー ト されます。

合成 112UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 113: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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 にな り ます。

合成 113UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 114: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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

合成 114UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 115: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 115UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 116: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

シングル ポー ト ブロ ッ ク 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;

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

合成 116UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 117: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

リ セ ッ ト 可能なデータ出力付きシングル ポー ト ブロ ッ ク 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; end if; end process;

end syn;

合成 117UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 118: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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

合成 118UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 119: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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) );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;

合成 119UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 120: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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; do <= RAM(to_integer(unsigned(addr))); end if; end if; end process;

end syn;

合成 120UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 121: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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

合成 121UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 122: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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; 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;

合成 122UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 123: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

シンプル デュアル ポー ト ブロ ッ ク 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

endmodule

合成 123UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 124: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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;

合成 124UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 125: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

2 つのク ロ ッ ク を使用するシンプル デュアル ポー ト ブロ ッ ク RAM のコー ド例 (Verilog)

フ ァ イル名: simple_dual_two_clocks.v

// Simple Dual-Port Block RAM with Two Clocks// File: simple_dual_two_clocks.v

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

合成 125UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 126: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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); 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;

合成 126UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 127: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

完全なデュアル ポー ト ブロ ッ ク 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 if (web) ram[addrb] <= dib; dob <= ram[addrb]; endend

endmodule

合成 127UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 128: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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 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;

合成 128UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 129: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

オプシ ョ ンの出力レジス タ付きブロ ッ ク 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

合成 129UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 130: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 if en2 = '1' then res2 <= do2; end if; end if; end process;

end beh;

合成 130UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 131: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

バイ ト ラ イ ト イネーブル (ブロ ッ ク 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

バイ ト ラ イ ト イネーブル付きの完全なデュアル ポー ト ブロ ッ ク 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,

合成 131UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 132: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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 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

合成 132UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 133: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

バイ ト ラ イ ト イネーブル付き 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'));

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);

合成 133UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 134: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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 );

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);

合成 134UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 135: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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;

合成 135UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 136: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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)

合成 136UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 137: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

doutA <= ram_block[addrA]; end end // Port-B Operation: generate for(i=0;i<NUM_COL;i=i+1) begin 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);

合成 137UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 138: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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); 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;

合成 138UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 139: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

非対称 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; 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;

合成 139UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 140: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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'); 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;

合成 140UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 141: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

シンプル デュアル ポー ト 非対称 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)}`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

合成 141UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 142: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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

シンプル デュアル ポー ト 非対称 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)

合成 142UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 143: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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 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

合成 143UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 144: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

シンプル デュアル ポー ト 非対称 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 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;

合成 144UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 145: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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 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;

合成 145UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 146: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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; 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];

合成 146UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 147: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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; WIDTHB : integer := 16; SIZEB : integer := 256; ADDRWIDTHB : integer := 8 );

port(

合成 147UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 148: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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'));

合成 148UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 149: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 149UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 150: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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;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];

合成 150UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 151: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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

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 );

合成 151UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 152: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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; 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'));

合成 152UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 153: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 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; -- 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;

合成 153UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 154: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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

外部データ フ ァ イルで RAM の初期内容を指定

HDL ソース コー ド でフ ァ イルの読み出し関数を使用し て、 外部データ フ ァ イルか ら RAM の初期内容を読み込み

ます。

• 外部データ フ ァ イルは ASCII 形式のテキス ト フ ァ イルで、 フ ァ イル名は任意です。

• 外部データ フ ァ イルの各行に、 RAM のア ド レ ス位置の初期内容を記述し ます。

• 外部データ フ ァ イルの行数は、 RAM 配列の行数と同じにする必要があ り ます。 行数が足 り ない場合、 メ ッ セー

ジが表示されます。

• 行に対応する ア ド レ ス指定可能な位置は、 RAM を記述する信号の主な範囲の方向で定義されます。

• RAM の内容は、 2 進数または 16 進数で記述でき ます。 2 進数と 16 進数を混ぜて使用する こ と はでき ません。

• 外部データ フ ァ イルには、 コ メ ン ト などのその他の内容を含める こ と はでき ません。

合成 154UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 155: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

次の外部データ フ ァ イルは、 8 X 32 ビ ッ ト RAM を 2 進数値で初期化し ています。

000011101100000110011110110001100010101100101101010100100010001101110100010100011000011100001111010000010100001001010011100101000000100110100111111110100010101100101101001011111110101010100111111011110001001110001111011011011000111101001001100100001110111100000001100011100011110010011111110111110011101010111110010010101110011101010011111011001100101011000100001001101100111100101001100010111001010111111111111000011111010111011001000001011011101001001011000000111001010110101110111000011111110010101110100111100110111101101001010000110111000101010100011011111000011000100100111100001111011011110011000010111010110100111101010010010001110001011100001010111111101110101110010111010001001001110100101101011111011100010000010101110110110111100111110001111010101100001101011101000000111011111110000111110001001111010111100011100101110101101110001111100011010101101111101111000000000100111010110110111100000100110100110111110001000000011111110010110110011111010101011001001000000111001001011100001000100000010011101100101000111111001000100011101001010001100001100000001001110100111001111000111101111101001010001010101000011110000000110111101000111110111011101100110101111011110001100110010001011110000100101011011101110010011100101110101111011010110011010100111011010100011101100110100111101101110001010100010100000110001000000110010110111001101010111010000011010100001110010101101110001111110000011111010111010101001010000000001111111101101111001000110000110010000000100011111001100011101011000100101110010011111111111011110101000101000111110000110001010000111001101000000110110100101111101010001110100110000111101100101001110011010111110101101001001011101100101001000100111111100110110101111100101111011001001101110110000100110111101101101101111001011100111001101001110011100100001011111101011000000000001011011111001010110010

合成 155UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 156: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

10100110011010000010001000011011110010101111110010011100011101010010000110001000011100010100100000111100101111110001101101111010110000100010100000000101001000011100000100011000110100010100111010010011010100010001100100100111

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");

合成 156UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 157: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

ブロ ッ ク RAM の初期化のコー ド例 (Verilog)

フ ァ イル名: rams_sp_rom.v

// Initializing Block RAM (Single-Port Block RAM)// File: rams_sp_rom 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

合成 157UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 158: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 158UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 159: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 進数形

式の外部フ ァ イルは機能し ません。

合成 159UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 160: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

外部データ フ ァ イルからのブロ ッ ク 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);

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 進数形

式の外部フ ァ イルは機能し ません。

合成 160UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 161: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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], 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

合成 161UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 162: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

シングル ポー ト 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 issignal 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;

合成 162UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 163: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

シンプル デュアル ポー ト 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

//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

合成 163UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 164: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

シンプル デュアル ポー ト 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 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

合成 164UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 165: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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 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

合成 165UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 166: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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_sp_struct.sv

// RAM Inference using Struct in SV (Single Port) // File:rams_sp_struct.svtypedef struct packed { logic [3:0] addr; logic [27:0] data; } Packet;

module rams_sp_struct #( parameter A_WID = 10, D_WID = 32 ) ( input clk, input we, input ena, input [A_WID-1:0] addr, input Packet din, output Packet dout );

Packet mem [2**A_WID-1:0];

always @ (posedge clk)begin if (ena) begin dout <= mem[addr]; if(we) mem[addr] <= din; end endendmodule

合成 166UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 167: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

シングル ポー ト レ コー ド型 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)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;

合成 167UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 168: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

シンプル デュアル ポー ト 構造化型 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

合成 168UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 169: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

end arch;

合成 169UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 170: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

完全なデュアル ポー ト 構造型 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

合成 170UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 171: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 171UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 172: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 172UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 173: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

ブ ラ ッ ク ボ ッ クス

デザイ ンには、 次で生成された EDIF フ ァ イルを含める こ と ができ ます。

• 合成ツール

• 回路図テキス ト エデ ィ ター

• その他のデザイ ン入力方法

これらのモジュールをデザイ ンのほかの部分に接続するには、 イ ン ス タ ンシエー ト する必要があ り ます。

HDL ソース コード でブラ ッ ク ボ ッ ク ス イ ン ス タ ンシエーシ ョ ンを使用し ます。

Vivado 合成では、 これらのブラ ッ ク ボ ッ ク ス イ ン ス タ ンシエーシ ョ ンに制約を適用でき ます。

デザイ ンをブラ ッ ク ボ ッ ク スにする と、 そのデザイ ンのほかのイ ン ス タ ン ス もブラ ッ ク ボ ッ ク スにな り ます。

コード例のフ ァ イルは、 この リ ン ク から ダウ ン ロード でき ます。

ブ ラ ッ ク ボ ッ クスの例 (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

合成 173UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 174: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

ブ ラ ッ ク ボ ッ クスの 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;

FSM コ ンポーネン ト

Vivado 合成の機能

• 同期有限ステー ト マシン (FSM) コ ンポーネン ト に特定の推論機能。

• 適化の目標に対応し たビル ト イ ン FSM エン コード ス ト ラ テジ。

• FSM 抽出はデフ ォル ト でイネーブル。

• FSM 抽出をデ ィ スエーブルにするには -fsm_extraction off を使用。

FSM 記述

Vivado 合成では、 ムーア型と ミ ー リ ー型の両方の有限ステー ト マシン (FSM) がサポー ト されます。 FSM には、 次が

含まれます。

• ステー ト レジス タ

• 次ステー ト 関数

• 出力関数

合成 174UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 175: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

FSM の図

次に、 ミ ー リ ー型マシン と ムーア型マシンを組み込んだ FSM の図を示し ます。

次に、 3 つのプロセス を使用し た FSM の図を示し ます。

FSM レジス タ

• リ セ ッ ト または電源投入ステー ト を指定し て有限ステー ト マシン (FSM) を認識させるか、 FSM_ENCODING を

"none" に設定し ます。

• ステー ト レジス タは、 特定のステー ト に対し て非同期または同期に リ セ ッ ト でき ます。

推奨: FSM には、 非同期 リ セ ッ ト ロ ジ ッ ク よ り も同期 リ セ ッ ト ロ ジ ッ ク を使用する こ と をお勧めし ます。

X-Ref Target - Figure 4-3

図 4-3: ミ ーリー型マシン とムーア型マシンを組み込んだ FSM

X-Ref Target - Figure 4-4

図 4-4: 3 つのプロセスを使用し た FSM

合成 175UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 176: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

自動ステー ト エン コー ド

FSM_ENCODING を "auto" に設定する と、 Vivado 合成で各 FSM に 適なエン コード方法が自動的に選択されます。

ワンホ ッ ト ステー ト エン コー ド

ワ ンホ ッ ト ステー ト エン コード には、 次のよ う な特徴があ り ます。

• 32 ステー ト までのステー ト マシンのデフ ォル ト エン コード方法です。

• 速度を 適化し た り 、 消費電力を削減する場合に適し ています。

• 各 FSM ステー ト にコード の各ビ ッ ト が割 り 当て られます。

• 各ステー ト に 1 つのフ リ ッ プフ ロ ッ プを使用し たステー ト レジス タ を イ ンプ リ メ ン ト し ます。

• 1 つの ク ロ ッ ク サイ クルで 1 つのステー ト レジス タのみがアサー ト されます。

• 2 つのステー ト 間を遷移する際、 2 つのビ ッ ト のみが ト グルし ます。

グレ イ ステー ト エン コー ド

グレ イ ステー ト エン コード には、 次のよ う な特徴があ り ます。

• 連続し た 2 つのステー ト 間では、 1 ビ ッ ト しか切 り 替わ り ません。

• 分岐のない長いパス を持つコ ン ト ローラーに適し ています。

• ハザードやグ リ ッチを 小限に抑えます。

• 消費電力を 小限に抑え るために使用でき ます。

ジ ョ ン ソ ン ステー ト エン コー ド

ジ ョ ン ソ ン ステー ト エン コード は、 グレ イ ステー ト エン コード と同様、 分岐のない長いパス を含むステー ト マシ

ンに適し ています。

シーケンシ ャル ステー ト エン コー ド

シーケンシャル ステー ト エン コード には、 次のよ う な特徴があ り ます。

• 長いパス を識別し ます。

• これらのパスのステー ト に連続する基数コード を 2 つ適用し ます。

• 次ステー ト の論理式を 小限に抑えます。

合成 176UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 177: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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

合成 177UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 178: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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 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;

合成 178UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 179: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 4 章: HDL コーデ ィ ング手法

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」 を参照し て く ださい。

合成 179UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 180: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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; endcaseend

assign dout = data;

endmodule

合成 180UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 181: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 181UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 182: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章

VHDL サポー ト

概要

この章では、 Vivado 合成でサポー ト される VHDL の構文と例外を示し ます。

VHDL では、 複雑な ロ ジ ッ ク を簡潔に記述でき、 次が可能です。

• システムをサブシステムに分割する方法や、 分割されたサブシステムを相互接続する方法など、 システムの構

造を記述でき ます。

• 使い慣れた言語形式でシステムの機能を指定でき ます。

• イ ンプ リ メ ンテーシ ョ ンおよびハード ウ ェアへのプログ ラ ム前にシステム デザイ ンをシ ミ ュ レーシ ョ ンでき ます。

• 抽象的な記述から、 合成し てデバイ ス特定の詳細なデザイ ン バージ ョ ンを生成でき ます。

詳細は、 『IEEE Standard VHDL Language Reference Manual』 (LRM) を参照し て く ださい。

サポー ト される VHDL データ型とサポー ト されない VHDL データ型

一部の VHDL データ型は、 定義済みパッ ケージの一部です。 それらのコ ンパイル場所および読み込み方法は、

「VHDL の定義済みパッ ケージ」 を参照し て く ださい。

データ型は IEEE std_logic_1164 パッ ケージで定義されています。

サポー ト されないデータ型

VHDL では、 標準パ ッ ケージの real 型は、 ジ ェネ リ ッ ク値の計算など、 計算を実行する目的でのみサポー ト され

ます。

重要: real 型の合成可能オブジェ ク ト を定義する こ と はでき ません。

合成 182UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 183: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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

合成 183UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 184: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

VHDL のユーザー定義の列挙型

ユーザー独自の列挙型を作成でき ます。 ユーザー定義の列挙型は通常、 有限ステー ト マシン (FSM) のステー ト を記

述するのに使用されます。

VHDL ユーザー定義の列挙型のコー ド例

type STATES is (START, IDLE, STATE1, STATE2, STATE3) ;

サポー ト される VHDL のビ ッ ト ベク ター型

サポー ト される VHDL のオーバーロー ド型

VHDL の整数型

整数型は定義済みの VHDL 型です。 Vivado 合成では、 整数はデフ ォル ト で 32 ビ ッ ト にイ ンプ リ メ ン ト されます。 次

のよ う に適用される範囲を明確に定義する と、 イ ンプ リ メ ンテーシ ョ ンを さ らにコ ンパク ト にでき ます。

type MSB is range 8 to 15

また、 定義済みの自然数型および正型を利用し て、 整数型をオーバーロード する こ と もでき ます。

VHDL の多次元配列型

Vivado 合成では、 VHDL の多次元配列がサポー ト されます。

推奨: 次元数に制限はあ り ませんが、 3 次元を超えないよ う に記述し て く ださい。

多次元配列型のオブジェ ク ト は、 関数に渡し た り 、 コ ンポーネン ト イ ン ス タ ンシエーシ ョ ンで使用でき ます。 記述

可能な多次元配列のオブジェ ク ト は、 信号、 定数、 変数です。

表 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)

合成 184UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 185: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

完全に制約された配列型のコー ド例

配列型は、 すべての次元で完全に制約する必要があ り ます。

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;

マ ト リ ッ クス と し て宣言された配列のコー ド例

配列をマ ト リ ッ ク ス と し て宣言でき ます。

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;

合成 185UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 186: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

4. これで次を指定でき る よ う にな り ます。

° 多次元配列の信号または変数:

MATRIXA <= CNST_A

° 配列の 1 行のイ ンデッ ク ス :

MATRIXA (5) <= TAB_A;

° 大次元数のイ ンデッ ク ス :

MATRIXA (5,0) (0) <= ’1’;

注記: イ ンデッ ク スは、 変数にでき ます。

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’;

合成 186UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 187: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

変数

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;

演算子

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);

合成 187UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 188: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

VHDL のエンテ ィ テ ィ と アーキテ クチャの記述

VHDL の回路記述

VHDL の回路記述 (デザイ ン ユニ ッ ト ) は、 次の部分で構成されています。

• エンテ ィ テ ィ 宣言: 回路の外部表示を提供し ます。 I/O ポー ト およびジェネ リ ッ ク などの回路のイ ン ターフ ェ イ

ス を含む、 外側から見え るオブジェ ク ト を記述し ます。

• アーキテ クチャ : 回路の内部表示を提供し、 回路の動作または構造を記述し ます。

VHDL のエンテ ィ テ ィ 宣言

回路の I/O ポー ト はエンテ ィ テ ィ で宣言し ます。 各ポー ト に次を指定し ます。

• 名前

• モード (in、 out、 inout、 buffer)

• データ型

制約されたポー ト と制約されていないポー ト

ポー ト を定義する際、 ポー ト は次のよ う にな り ます。

• 制約を設定する こ と も し ないこ と もでき ます。

• 通常は制約されます。

• エンテ ィ テ ィ 宣言部分では制約を設定し ないま まにでき ます。

° ポー ト に制約を設定し ない場合は、 フ ォーマル ポー ト と実際の信号を接続する と きに、 イ ン ス タ ンシエー

シ ョ ンでポー ト の幅を定義し ます。

° ポー ト に制約を設定し ない場合、 同じエンテ ィ テ ィ のイ ン ス タ ンシエーシ ョ ンを複数作成し、 異なるポー

ト 幅を定義でき ます。

推奨: 制約の設定されていないポー ト は使用し ないで く ださ い。 ジェネ リ ッ ク を使用し て制約し たポー ト を定義し ま

す。 イ ン ス タ ンシエーシ ョ ン時にこれらのジェネ リ ッ ク に異なる値を適用し ます。 上位エンテ ィ テ ィ には制約を

設定し ていないポー ト を含めないで く ださい。

ポー ト には 2 次元以上の配列型は使用でき ません。

エンテ ィ テ ィ 宣言でも VHDL ジェネ リ ッ ク を宣言でき ます。

合成 188UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 189: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 を出力と し て宣言し ます。

合成 189UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 190: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 190UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 191: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

VHDL のコ ンポーネン ト イ ンス タ ンシエーシ ョ ン

コ ンポーネン ト イ ン ス タ ンシエーシ ョ ンを使用する と、 1 つのデザイ ン ユニ ッ ト (コ ンポーネン ト ) を別のデザイ ン

ユニ ッ ト 内にイ ン ス タ ンシエー ト し て、 階層構造デザイ ンを記述でき ます。

コ ンポーネン ト イ ン ス タ ンシエーシ ョ ンを実行するには、 次の手順に従います。

1. イ ン ス タ ンシエー ト する機能を記述し たデザイ ン ユニ ッ ト (エンテ ィ テ ィ と アーキテ クチャ ) を作成し ます。

2. 親デザイ ン ユニ ッ ト のアーキテ クチャの宣言部分にイ ン ス タ ンシエー ト する コ ンポーネン ト を宣言し ます。

3. 親デザイ ン ユニ ッ ト のアーキテ クチャの本体でこ のコ ンポーネン ト を イ ン ス タ ンシエー ト し て接続し ます。

4. コ ンポーネン ト のフ ォーマル ポー ト を親デザイ ン ユニ ッ ト の実際の信号およびポー ト にマ ッ プ (接続) し ます。

コ ンポーネン ト イ ンス タ ンシエーシ ョ ン文の要素

Vivado 合成では、 コ ンポーネン ト 宣言で制約されていないベク ターがサポー ト されます。

コ ンポーネン ト イ ン ス タ ンシエーシ ョ ン文の主な要素は、 次の とお り です。

• ラベル: イ ン ス タ ン ス を識別し ます。

• 関連付け リ ス ト : 予約語の port map キーワード で開始し、 コ ンポーネン ト のフ ォーマル ポー ト を親デザイ ン

ユニ ッ ト の実際の信号またはポー ト に接続し ます。 オプシ ョ ンの関連付け リ ス ト は予約語の generic map

キーワード で開始し、 実際の値を コ ンポーネン ト で定義される フ ォーマル ジェネ リ ッ ク に供給し ます。

合成 191UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 192: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

コ ンポーネン ト イ ンス タ ンシエーシ ョ ンのコー ド例

次に、 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( 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;

合成 192UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 193: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 193UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 194: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 です。

合成 194UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 195: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 195UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 196: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

注記: イ ン ス タ ンシエーシ ョ ン中にジェネ リ ッ ク値を置き換え る場合、 配列要素を分割する こ と はサポー ト されませ

ん。 た と えば、 ジェネ リ ッ ク my_gen を次のよ う に配列と し て定義する こ と はでき ません。

my_gen(1) => x,my_gen(0) => y

次のよ う に設定する必要があ り ます。

my_gen => (x,y)

合成 196UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 197: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

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 <= a when "00", b when "01", c when "10", d when others;end bhv;

合成 197UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 198: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

generate 文次の generate 文があ り ます。

• for-generate 文

• if-generate 文

for-generate 文for-generate 文は、 反復構造を記述し ます。

for-generate 文の例

次の例では、 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;

合成 198UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 199: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 199UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 200: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

組み合わせプロセス

VHDL の組み合わせロ ジ ッ クは、 プロセスで記述でき ます。 プロセスは、 プロセスが実行される たびに信号に新し

い値を代入し ます。

重要: 信号に現在の値は保持されません。 プロセスには、 ローカル変数を含める こ と ができ ます。

メ モ リ エレ メ ン ト

組み合わせプロセスから推論されたハード ウ ェ アには、 メ モ リ エレ メ ン ト は含まれません。

プロセスで代入されるすべての信号が、 常にプロセス ブロ ッ ク内のすべての可能なパスで明示的に代入される場合、

メ モ リ エレ メ ン ト プロセスは組み合わせプロセス と な り ます。

if 文または case 文のすべての分岐で信号が明示的に代入されていない場合は、 通常ラ ッチが推論されます。

重要: Vivado 合成で予測されないラ ッチが推論された場合は、 HDL コード に明示的に代入されていない信号がない

かど う かを確認し ます。

センシテ ィ ビテ ィ リ ス ト

組み合わせプロセスには、 センシテ ィ ビテ ィ リ ス ト が含まれます。 センシテ ィ ビテ ィ リ ス ト は、 PROCESS キー

ワード の後にかっ こ で囲まれます。 センシテ ィ ビテ ィ リ ス ト にあ る信号のいずれかにイベン ト (値の変化) が発生す

る と、 プロセスが実行されます。

組み合わせプロセスの場合、 センシテ ィ ビテ ィ リ ス ト には次を含める必要があ り ます。

• if および case などの条件で使用する信号。

• 代入文の右辺の信号。

不足し ている信号

センシテ ィ ビテ ィ リ ス ト に不足し ている信号があ る場合があ り ます。 センシテ ィ ビテ ィ リ ス ト に 1 つまたは複数の

不足し ている信号があ る場合、 次のよ う にな り ます。

• 合成結果が初期のデザイ ン仕様 と異なる ものになる可能性があ り ます。

• Vivado 合成で警告 メ ッ セージが表示されます。

• 不足し ている信号がセンシテ ィ ビテ ィ リ ス ト に追加されます。

重要: シ ミ ュ レーシ ョ ン中の問題を回避するには、 HDL ソース コード に不足し ている信号を追加し て合成を再実行

し ます。

合成 200UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 201: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

変数および信号の代入

Vivado 合成では、 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;

合成 201UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 202: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

プロセス内での変数および信号代入の例

フ ァ イル名: 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; end process;end archi;

合成 202UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 203: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

if-else 文if-else 文および if-elsif-else 文では、 真偽条件 (TRUE/FALSE) によ って実行される文が決ま り ます。

• 条件が真 と判断された場合は if 文が実行されます。

• 条件が偽、 x、 または z と判断された場合は else 文が実行されます。

° 複数の文を含むブロ ッ ク を if または else 分岐文内で実行でき ます。

° begin および end キーワード が必要です。

° if-else 文はネス ト させる こ と ができ ます。

if-else 文の例

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;

合成 203UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 204: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

case 文case 文は次を実行し ます。

• 論理式を比較し、 複数の並列分岐の 1 つを実行し ます。

• 記述された順に分岐を評価し ます。

• 初に真 と評価された分岐を実行し ます。

どの分岐も偽 と評価された場合は、 デフ ォル ト の分岐を実行し ます。

case 文の例

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;

合成 204UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 205: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

for-loop 文Vivado 合成では、 for-loop 文で次の要素がサポー ト されます。

• 定数範囲

• 演算子 <、 <=、 >、 および >= を使用し たテス ト ス ト ッ プ コ ンデ ィ シ ョ ン

• 次のいずれかに適合する次ステ ッ プの計算

° var = var + step

° var = var - step

説明:

- var: ループ変数

- step: 定数値

• next および exit 文

for-loop 文の例

フ ァ イル名: 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( 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;

合成 205UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 206: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

VHDL の順序ロジ ッ ク

プロセス内のすべてのパスで明示的に代入されていない信号があ る場合、 VHDL プロセスは組み合わせプロセスで

はな く 、 順次プロセスにな り ます。 生成されたハード ウ ェ アには、 内部ステー ト または メ モ リ (フ リ ッ プフ ロ ッ プま

たはラ ッチ) が含まれます。

推奨: 順次ロ ジ ッ クは、 センシテ ィ ビテ ィ リ ス ト ベースで記述する こ と をお勧めし ます。

プロセス を使用し たセンシテ ィ ビテ ィ リ ス ト 付き順次プロセスには、 次を記述し ます。

• ク ロ ッ ク信号

• 順次エレ メ ン ト を非同期に制御するオプシ ョ ンの信号 (非同期セ ッ ト / リ セ ッ ト )

• ク ロ ッ ク イベン ト を記述し た if 文

センシテ ィ ビテ ィ リ ス ト 付き順次プロセス文の構文

process (<sensitivity list>)begin<asynchronous part><clock event><synchronous part>

end;

非同期制御ロジ ッ クの記述

非同期制御ロ ジ ッ ク (非同期セ ッ ト / リ セ ッ ト ) は、 ク ロ ッ ク イベン ト 文よ り も前に記述し ます。

同期制御ロ ジ ッ ク (データ、 オプシ ョ ンの同期セ ッ ト / リ セ ッ ト 、 オプシ ョ ンのク ロ ッ ク イネーブル) は、 ク ロ ッ ク イ

ベン ト の if 分岐内で記述し ます。

ク ロ ッ ク イベン ト 文

ク ロ ッ ク イベン ト 文は、 次のよ う に記述し ます。

• 立ち上が り エ ッ ジ ク ロ ッ ク :

if rising_edge (clk) then

• 立ち下が り エ ッ ジ ク ロ ッ ク :

If falling_edge (clk) then

表 5-7: 非同期制御ロジ ッ ク記述のサマ リ

記述するロジ ッ ク 内容 記述する位置

非同期制御ロ ジ ッ ク 非同期セ ッ ト / リ セ ッ ト ク ロ ッ ク イベン ト 文の前

同期ロ ジ ッ ク データ

同期セ ッ ト / リ セ ッ ト (オプシ ョ ン)

ク ロ ッ ク イネーブル (オプシ ョ ン)

ク ロ ッ ク イベン ト の if 分岐内

合成 206UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 207: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

不足し ている信号

センシテ ィ ビテ ィ リ ス ト に不足し ている信号があ る場合、 合成結果が初期のデザイ ン仕様と異な る ものにな る可能

性があ り ます。 この場合、 Vivado 合成で警告 メ ッ セージが表示され、 センシテ ィ ビテ ィ リ ス ト に不足し ている信号

が追加されます。

重要: シ ミ ュ レーシ ョ ン中の問題を回避するには、 HDL ソース コード に不足し ている信号を追加し て合成を再実行

し ます。

VHDL のセンシテ ィ ビテ ィ リ ス ト のない順次プロセス文

Vivado 合成では、 wait 文を使用し た順次プロセスの記述がサポー ト されます。 順次プロセスはセンシテ ィ ビテ ィ

リ ス ト な しで記述し ます。

wait 文を 初の文にし、 wait 文の条件で順序ロ ジ ッ ク ク ロ ッ ク を記述し ます。

重要: 同じ順次プロセスにセンシテ ィ ビテ ィ リ ス ト と wait 文の両方を含める こ と はでき ません。 また、 使用可能な

wait 文は 1 つのみです。

wait 文を使用し た順次プロセスの例

process beginwait until rising_edge(clk);q <= d;

end process;

wait 文でク ロ ッ ク イネーブルを記述し たコー ド例

wait 文で、 ク ロ ッ ク と共にク ロ ッ ク イ ネーブル (clken) を記述でき ます。

process beginwait until rising_edge(clk) and clken = '1';q <= d;

end process;

wait 文の後にク ロ ッ ク イネーブルを記述し た例

ク ロ ッ ク イ ネーブルは、 次のよ う に別に記述する こ と もでき ます。

process beginwait until rising_edge(clk);if clken = '1' thenq <= d;

end if;end process;

合成 207UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 208: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

同期制御ロジ ッ クの記述

ク ロ ッ ク イ ネーブルを記述する同じ コード記述方法を使用し て、 同期 リ セ ッ ト またはセ ッ ト などの同期制御ロ ジ ッ

ク を記述でき ます。

重要: センシテ ィ ビテ ィ リ ス ト のないプロセス を使用し て非同期制御ロ ジ ッ ク を持つ順次エレ メ ン ト を記述する こ と

はでき ません。 このよ う な機能を記述でき るのは、 センシテ ィ ビテ ィ リ ス ト 付きのプロセス文のみです。 Vivado 合

成では、 wait 文に基づ く ラ ッチの記述は使用でき ません。 同期ロ ジ ッ クは、 センシテ ィ ビテ ィ リ ス ト 付きプロセ

ス を使用し た方が柔軟に記述でき ます。

VHDL の初期値と セ ッ ト /リ セ ッ ト レジス タは、 宣言する と きに初期化でき ます。 初期値は定数値で、 関数呼び出しから生成でき ます。

レジス タ を初期化する例 1次のコード例は、 回路に電源が投入された と き、 およびグ ローバル リ セ ッ ト が適用された と きの順次エレ メ ン ト の

初期値を指定し ています。

signal arb_onebit :std_logic := '0';signal arb_priority : std_logic_vector(3 downto 0) := "1011";

合成 208UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 209: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

レジス タ を初期化する例 2次のコード例では、 電源投入時の初期化 と リ セ ッ ト によ る初期化の両方が指定されています。

フ ァ イル名: 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--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;

合成 209UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 210: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

VHDL の関数と プロシージャ

デザイ ンでブロ ッ ク を複数回使用する場合は、 VHDL の関数およびプロ シージ ャ を使用し ます。 内容は組み合わせ

プロセス と類似し ています。

関数およびプロ シージャは、 次で宣言し ます。

• エンテ ィ テ ィ の宣言部

• アーキテ クチャ

• パッ ケージ

関数またはプロ シージャは、 宣言部 と本体で構成されます。

宣言部では、 次を指定し ます。

• input パラ メ ーター (範囲を制約する必要な し )

• 出力および入出力パラ メ ーター (プロ シージ ャのみ)

重要: 分解関数は、 IEEE std_logic_1164 パッ ケージで定義される もの以外はサポー ト されません。

合成 210UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 211: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: 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;

合成 211UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 212: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

パッ ケージ内で宣言されたプロシージャの例 次の例では、 パッ ケージ内でプロ シージャ を使用し ています。

フ ァ イル名: procedure_package_1.vhd

-- 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;

合成 212UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 213: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

再帰関数の例

Vivado 合成では、 再帰関数がサポー ト されます。 次のコード例では、 n! 関数を使用し ています。

function my_func(x : integer) return integer is beginif x = 1 then return x;else return (x*my_func(x-1));end if;

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 (Synopsys)

° std_logic に基づ く 符号な しおよび符号付きのベク ター型。

° これらのデータ型のオーバーロード された算術演算子、 変換関数、 および拡張関数。 std_logic_arith

と同等。

合成 213UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 214: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

VHDL のレガシ パッ ケージ

• std_logic_arith (Synopsys)

° std_logic に基づ く 符号な しおよび符号付きのベク ター型。

° これらのデータ型のオーバーロード された算術演算子、 変換関数、 および拡張関数。

• 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 の実数定数を示し ます。

表 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π

合成 214UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 215: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

VHDL の実数関数

次の表に、 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;

表 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)

合成 215UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 216: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

VHDL パッ ケージへのアクセス

VHDL パッ ケージにア ク セスするには、 次を実行し ます。

1. パッ ケージがコ ンパイルされている ラ イブラ リ を library 節で指定し ます。 次に例を示し ます。

library library_name;

2. パッ ケージまたはパッ ケージに含まれる特有の定義を use 節で指定し ます。 次に例を示し ます。

use library_name.package_name.all;

3. これらの行は、 パッ ケージ定義を使用するエンテ ィ テ ィ またはアーキテ クチャ文の直前に挿入し ます。

デフ ォル ト のラ イブラ リ は work ラ イブラ リ なので、 指定し たパッ ケージがこ のラ イブラ リ にコ ンパイルされてい

る場合は、 library 節は必要あ り ません。

合成 216UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 217: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 5 章: VHDL サポー ト

VHDL 構文のサポー ト ステータ ス Vivado 合成では、 VHDL のデザイ ン エンテ ィ テ ィ およびコ ンフ ィ ギュ レーシ ョ ンが次の表に示すよ う にサポー ト さ

れます。

表 5-10: VHDL 構文のサポー ト ステータ ス

VHDL 構文 サポー ト ステータ ス

VHDL エンテ ィ テ ィ ヘ ッ ダー

ジェネ リ ッ ク サポー ト あ り

ポー ト サポー ト あ り (制約されていないポー ト を含む)

エンテ ィ テ ィ 実行部 サポー ト な し

VHDL パッ ケージ

STANDARD TIME はサポー ト な し

VHDL の物理型

TIME 無視

REAL サポー ト あ り (定数計算用の関数でのみ)

VHDL モー ド

リ ンケージ サポー ト な し

VHDL の宣言

データ型 次をサポー ト :

• 列挙型

• 定数範囲の正の値の型

• ビ ッ ト ベク ター型

• 多次元配列

VHDL オブジ ェ ク ト

定数宣言 サポー ト あ り (デ ィ フ ァード定数を除 く )

信号宣言 サポー ト あ り (レジス タ またはバス タ イプの信号を除 く )

属性宣言 一部の属性のみサポー ト 、 その他はスキ ッ プ。

VHDL 仕様

HIGHLOW サポー ト あ り

LEFT サポー ト あ り

RIGHT サポー ト あ り

RANGE サポー ト あ り

REVERSE_RANGE サポー ト あ り

LENGTH サポー ト あ り

POS サポー ト あ り

ASCENDING サポー ト あ り

合成 217UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 218: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 構文 サポー ト ステータ ス

合成 218UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 219: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 構文 サポー ト ステータ ス

合成 219UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 220: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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

合成 220UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 221: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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}

合成 221UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 222: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 以上

合成 222UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 223: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 6 章: VHDL-2008 言語サポー ト

単項論理簡約演算子

以前のバージ ョ ンの VHDL では、 and、 nand、 or などの演算子は 2 つの入力値を取 り 込んでビ ッ ト 値またはブール

値を返し ていま し た。 VHDL-2008 では、 これらの演算子に単項サポー ト が追加されてお り 、 入力の論理関数を返し

ます。 た と えば、 次のよ う なコード があ る と し ます。

out1 <= and("0101");

このコード は 4 つのビ ッ ト に対し て AND を実行し、 1 を返し ます。 単項サポー ト のあ る論理関数は、 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 =>

statementsend generate;

合成 223UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 224: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 6 章: VHDL-2008 言語サポー ト

順次代入文

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;

注記: この文を機能させるためには、 信号に明示的に ド ン ト ケアを代入する必要があ り ます。

合成 224UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 225: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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

合成 225UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 226: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 6 章: VHDL-2008 言語サポー ト

固定小数点のサポー ト このセ ク シ ョ ンでは、 Vivado 合成で VHDL-2008 の固定小数点機能を使用する方法を説明し ます。 VHDL-2008 バー

ジ ョ ンの固定小数点パッ ケージでは Vivado 合成ではサポー ト されないパッ ケージ イ ン ス タ ンシエーシ ョ ンが使用さ

れるので、Vivado イ ン ス ト ール デ ィ レ ク ト リ に Vivado 合成と互換性のあ る変更バージ ョ ンであ る fixed_pkg.vhd

フ ァ イルが含まれています。

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) です。

合成 226UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 227: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 6 章: VHDL-2008 言語サポー ト

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 の固定小数点機能を使用する際は、 次の事項に注意する必要があ り ます。

合計サイズ

次の 2 つの信号があ る と し ます。

signal s1 : ufixed(21 downto -2);signal s2 : ufixed(20 downto -3);

これらの信号では整数部分 と分数部分のビ ッ ト 数は異な り ますが、 総ビ ッ ト 数は同じ なので、 S1 から S2 への代入は

エラーな しで実行されますが、 代入される値は異な り ます。

重要: VHDL では型が厳密に指定されてお り サイ ズが一致し ない代入は実行されませんが、 このよ う な代入に注意す

る必要があ り ます。 上記の例では、 サイ ズが一致するので、 VHDL コ ンパイ ラで許容されます。

表 6-2: 信号

名前 整数部分のビ ッ ト 数 分数部分のビ ッ ト 数 総ビ ッ ト 数

s1 22 2 24

s2 21 3 24

合成 227UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 228: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 6 章: VHDL-2008 言語サポー ト

サイズの決定

算術演算では、 結果のサイ ズはオペラ ン ド のサイ ズ と演算のタ イプによ り ます。 先ほど と同じ 2 つの信号 (s1 および

s2) を考えてみます。

重要: 実行される演算と オペラ ン ド のサイ ズに応じ て、 ターゲ ッ ト の範囲を正し く 宣言し て く ださい。

先ほどの例で示したよ う に、 合計サイズが正し く ても指定された範囲が正し く ない場合、 正しい結果は得られません。

その他

出力ポー ト の読み出し

以前のバージ ョ ンの VHDL では、 出力以外の信号を out と し て宣言する こ と はでき ませんでし た。

そのため、 出力に値を代入し、 その同じ信号をその他のロ ジ ッ ク に使用するには、 新しい信号を宣言するか、 その

信号で出力およびその他のロ ジ ッ ク を駆動する よ う にするか、 out を buffer 型に変更する必要があ り ま し た。

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;

表 6-3: サイズの決定

演算 整数部分のサイズ 整数サイズの決定方法 分数部分のサイズ 分数サイズの決定方法 結果のサイズ

S1 + S2 23(2 つのオペラ ン ド の

整数部分が大きい方

のサイ ズ) + 1

32 つのオペラ ン ド の

分数部分が大きい方

のサイ ズ

(22 downto -3)

25 ビ ッ ト

S1 * S2 432 つのオペラ ン ド の

整数部分の合計5

2 つのオペラ ン ド の

分数部分の合計

(42 downto -5)

48 ビ ッ ト

合成 228UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 229: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 6 章: VHDL-2008 言語サポー ト

ポー ト マ ッ プの論理式

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 では、 次の例に示すよ う に、 ジェネ リ ッ ク で別のジェネ リ ッ ク を参照でき ます。

entity my_entity is generic (gen1 : integer;gen2 : std_logic_vector(gen1 - 1 downto 0));

以前のバージ ョ ンの VHDL では、 gen1 で gen2 の長さ を制御する こ と は不可能でし た。

合成 229UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 230: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 6 章: VHDL-2008 言語サポー ト

パッ ケージ内のジ ェ ネ リ ッ ク

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 …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

ビ ッ ト ベク ターに指定されています。

合成 230UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 231: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 6 章: VHDL-2008 言語サポー ト

ジ ェ ネ リ ッ ク内の関数

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 では許容されます。

グローバルおよびローカルでス タ テ ィ ッ クな論理式への拡張

VHDL では、 多 く のタ イプの場所で論理式がス タ テ ィ ッ ク であ る必要があ り ます。 た と えば、 連結を使用する と ス

タ テ ィ ッ ク値は返されず、 ス タ テ ィ ッ ク値が必要な演算子または関数で使用する と エラーと な り ます。 VHDL-2008

では、 連結などのよ り 多 く の論理式でス タ テ ィ ッ ク値を返すこ と が可能 と なってお り 、 柔軟性が高 く なっています。

合成 231UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 232: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 6 章: 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;

合成 232UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 233: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章

Verilog サポー ト

概要

この章では、 Vivado® 合成での Verilog ハード ウ ェ ア記述言語のサポー ト について説明し ます。

この章にはコード例が含まれます。 コード例のフ ァ イルは、 この リ ン ク から ダウ ン ロード でき ます。

Verilog デザイ ン

複雑な回路は通常、 ト ッ プダウ ン手法を使用し て設計されます。

• 設計プロセスの各段階で、 さ まざまな仕様レベルが必要 と な り ます。 た と えば、 アーキテ クチャ レベルでは、

仕様はブロ ッ ク図または ASM (Algorithmic State Machine) チャー ト に対応し ます。

• ブロ ッ ク または ASM 段階は、 次のよ う な N ビ ッ ト ワ イヤで接続される レジス タ ト ラ ン ス フ ァー ブロ ッ ク に対

応し ます。

° レジス タ

° 加算器

° カ ウ ン ター

° マルチプレ ク サー

° イ ン ターコネ ク ト ロ ジ ッ ク

° 有限ステー ト マシン (FSM)

• Verilog では、 ASM チャー ト および回路図などを コ ンピ ューター言語で記述でき ます。

合成 233UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 234: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

Verilog の機能

Verilog では、 ビヘイ ビアー記述および構造言語記述の両方が可能で、 さ まざまな抽象レベルでデザイ ン オブジェ ク

ト を表現でき ます。

• Verilog を使用し てハード ウ ェ アを設計する と、 次のよ う な ソ フ ト ウ ェアの概念を利用でき ます。

° 並列処理

° オブジェ ク ト 指向プロ グ ラ ム

• Verilog の構文は、 C 言語および Pascal に類似し ています。

• 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 形式のタ ス ク /関数宣言

• カンマで区切ったセンシテ ィ ビテ ィ リ ス ト

• 組み合わせロ ジ ッ ク センシテ ィ ビテ ィ

• 継続代入文のデフ ォル ト ネ ッ ト

• デフ ォル ト ネ ッ ト 宣言のデ ィ スエーブル

• イ ンデッ ク ス付きベク ター部分選択

• 多次元配列

• ネ ッ ト および実数データ型の配列

• 配列ビ ッ ト 選択および部分選択

合成 234UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 235: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

• 符号付き レジス タ、 ネ ッ ト 、 およびポー ト 宣言

• 符号付き整数

• 符号付き論理式

• 算術シフ ト 演算子

• 32 ビ ッ ト を超え る幅の自動的な拡張

• べき乗演算子

• N サイ ズのパラ メ ーター

• 明示的な イ ン ラ イ ン パラ メ ーター渡し

• 固定ローカル パラ メ ーター

• 拡張された条件付き コ ンパイル

• フ ァ イルおよび行のコ ンパイ ラ指示子

• 変数によ る部分選択

• 再帰タ ス クおよび関数

• 定数関数

詳細は、 次を参照し て く ださい。

• 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];

表 7-1: 変数による部分選択

記号 説明

+ (プラ ス) 部分選択は始点から増分

- (マイナス) 部分選択は始点から減分

合成 235UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 236: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

構造 Verilog構造 Verilog 記述を使用する と、 複数のコード ブロ ッ ク を統合し、 デザイ ンを階層構造にする こ と ができ ます。 次の

表に、 ハード ウ ェ ア構造 と その説明を示し ます。

次の表に、 Verilog コ ンポーネン ト と、 その表示および内容を示し ます。

• コ ンポーネン ト はデザイ ン モジュールで表されます。

• コ ンポーネン ト 間の接続は、 コ ンポーネン ト イ ン ス タ ンシエーシ ョ ン文で指定されます。

• コ ンポーネン ト イ ン ス タ ンシエーシ ョ ン文には、 次の特徴があ り ます。

° コ ンポーネン ト を別のコ ンポーネン ト または回路で使用する場合に、 コ ンポーネン ト のイ ン ス タ ン ス を指

定し ます。

° 識別子で区別されます。

° ローカル コ ンポーネン ト 宣言部分で宣言されたコ ンポーネン ト の名前が指定されます。

° 関連付け リ ス ト (かっ こ で囲まれた リ ス ト ) が含まれます。 この リ ス ト では、 該当する ローカル ポー ト に関

連付け られている信号およびポー ト が指定されます。

ビル ト イ ン ロジ ッ ク ゲー ト

Verilog では、 多数のビル ト イ ン ロ ジ ッ ク ゲー ト が提供されています。

• ロ ジ ッ ク ゲー ト を イ ン ス タ ンシエー ト し て、 大型のロ ジ ッ ク回路を構築し ます。

• ビル ト イ ン ロ ジ ッ ク ゲー ト で記述される論理関数は、 次の とお り です。

° AND

° OR

° XOR

° NAND

° NOR

° NOT

表 7-2: ハー ド ウ ェ ア構造の基本概念

概念 説明

コ ンポーネン ト 構築または基本ブロ ッ ク

ポー ト コ ンポーネン ト の I/O コネ ク タ

信号 コ ンポーネン ト 間のワ イヤに対応

表 7-3: Verilog のコ ンポーネン ト

項目 表示 内容

宣言 外部 コ ンポーネン ト ポー ト を含む外観

本体 内部 コ ンポーネン ト のビヘイ ビアーまたは構造

合成 236UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 237: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

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 モジ ュールから構成される半加算器の構造記述例を示し ます。

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) で提供さ

れます。

合成 237UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 238: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

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 コ アの生成およびフ ロー テス ト で便利な機能です。

合成 238UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 239: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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

合成 239UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 240: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

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;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 コード のイ ン ス タ ン ス と モジュールの両方にパラ メ ーターおよび属性を適用でき る。

• 属性を制約フ ァ イルでも指定でき る。

合成 240UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 241: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

Verilog の使用制限

Vivado 合成で Verilog を使用する場合、 次のよ う な制限があ り ます。

• 大文字/小文字の区別

• ブロ ッ キングおよび ノ ンブロ ッ キング代入文

• 整数の処理

大文字/小文字の区別

Vivado 合成では、 大文字と小文字が区別されます。

• Verilog では大文字と小文字が区別されるので、 モジュール名、 イ ン ス タ ン ス名、 および信号名は、 大文字と小

文字が異なれば別の名前 と し て識別されます。

° Vivado 合成では、 大文字/小文字だけが異なる イ ンス タ ンス名および信号名を含むデザイ ンは合成可能です。

° 大文字/小文字だけが異な るモジ ュール名が含まれる場合は、 エラーが発生し ます。

• オブジェ ク ト 名を大文字/小文字の違いだけで区別する こ と はお勧めし ません。 大文字/小文字だけで名前を区別

する と、 混合言語プロ ジェ ク ト で問題が発生し ます。

ブロ ッ キングおよび ノ ンブロ ッキング代入文

Vivado 合成では、 ブロ ッ キングおよびノ ンブロ ッ キング代入文がサポー ト されます。

• ブロ ッ キング代入文 と ノ ンブロ ッ キング代入文を混合し ないで く ださい。

• ブロ ッ キング代入文 と ノ ンブロ ッ キング代入文を混合し て もデザイ ンはエラーな しで合成されますが、 シ ミ ュ

レーシ ョ ンでエラーが発生する こ と があ り ます。

Vivado シ ミ ュ レーシ ョ ン用の Verilog フ ォーマ ッ ト の詳細は、 『Vivado Design Suite ユーザー ガイ ド : ロ ジ ッ ク シ ミ ュ

レーシ ョ ン』 (UG900) [参照 11] のこのセ ク シ ョ ンを参照し て く ださい。

使用不可能な例 1

同じ信号にブロ ッ キング代入文 と ノ ンブロ ッ キング代入文を混合し ないで く ださい。

always @(in1)beginif (in2)out1 = in1;

end elseout1 <= in2;

合成 241UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 242: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

使用不可能な例 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 logic3'd4 : data_out = 2; // Does workendcase

end

連結文での整数処理

Verilog 連結文にサイ ズが指定されていない整数があ る と、 結果が予測不可能になる こ と があ り ます。 整数のサイ ズ

が指定されない式を使用する と、 次のよ う にな り ます。

• その式が一時的な信号に代入されます。

• 連結文に一時的な信号が使用されます。

reg [31:0] temp;assign temp = 4'b1111 % 2;assign dout = {12/3,temp,din};

合成 242UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 243: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

Verilog-2001 の属性と メ タ コ メ ン ト

Verilog-2001 属性

• 合成ツールなどのプロ グ ラ ムに特定の情報を渡すために使用し ます。

• 広 く 使用されています。

• モジュール宣言およびイ ン ス タ ンシエーシ ョ ン内で、 演算子または信号に指定でき ます。

• コ ンパイ ラでほかの属性宣言がサポー ト されていて も、 Vivado 合成では無視されます。

• Verilog-2001 属性を使用し て次のものに制約を設定し ます。

° 次のよ う な個別のオブジェ ク ト :

- モジュール

- イ ン ス タ ン ス

- ネ ッ ト

° 次の合成制約を設定し ます。

- フル ケース

- パラ レル ケース

Verilog メ タ コ メ ン ト

• Verilog メ タ コ メ ン ト は、 Verilog パーサーで認識されます。

• Verilog メ タ コ メ ン ト は、 次のよ う な個々のオブジェ ク ト に制約を設定し ます。

° モジュール

° イ ン ス タ ン ス

° ネ ッ ト

• Verilog メ タ コ メ ン ト は、 合成で次の指示子を設定し ます。

° parallel_case および full_case

° translate_on および translate_off

° ツール特定の指示子 (syn_sharing など)

Verilog メ タ コ メ ン ト のサポー ト

Vivado 合成では、 次がサポー ト されます。

• C ス タ イルおよび Verilog ス タ イルの メ タ コ メ ン ト

° C ス タ イル

/* ...*/

• C ス タ イルでは、 コ メ ン ト を複数行にでき ます。

° Verilog ス タ イル

// ...

Verilog ス タ イルのコ メ ン ト は、 行末で終了し ます。

合成 243UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 244: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: 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”

合成 244UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 245: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

Verilog コ ンス ト ラ ク ト

次の表に、 Vivado 合成での Verilog コ ン ス ト ラ ク ト のサポー ト ステータ ス を示し ます。

表 7-4: Verilog コ ンス ト ラ ク ト

Verilog コ ンス ト ラ ク ト サポー ト ステータ ス

Verilog 定数

整数 サポー ト あ り

実数 サポー ト あ り

文字列 サポー ト な し

Verilog データ型

ネ ッ ト 型

• tri0

• tri1

• trireg

サポー ト な し

すべての駆動電流 無視

real および realtime レジス タ サポー ト な し

すべての名前付き イベン ト サポー ト な し

遅延 無視

Verilog 手続き代入文

assign 制限付きでサポー ト 。 「assign 文および deassign

文」 を参照し て く ださい。

deassign 制限付きでサポー ト 。 「assign 文および deassign

文」 を参照し て く ださい。

force サポー ト な し

release サポー ト な し

forever 文 サポー ト な し

repeat 文 サポー ト あ り (repeat 値は定数にする必要あ り )

for 文 サポー ト あ り (範囲はス タ テ ィ ッ ク にする必要あ り )

delay (#) 無視

event (@) サポー ト な し

wait サポー ト な し

名前付き イベン ト サポー ト な し

並列ブロ ッ ク サポー ト な し

指定ブロ ッ ク 無視

disable サポー ト あ り (for および repeat ループ文を除 く )

合成 245UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 246: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

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 コ ンス ト ラ ク ト サポー ト ステータ ス

合成 246UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 247: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 サポー ト な し

その他すべて 無視

合成 247UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 248: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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

合成 248UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 249: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

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);

サポー ト されない Verilog ゲー ト レベル プ リ ミ テ ィ ブ

次の表に、 Vivado 合成でサポー ト されていないゲー ト レベル プ リ ミ テ ィ ブを示し ます。

表 7-6: サポー ト されない Verilog ゲー ト レベル プ リ ミ テ ィ ブ

プ リ ミ テ ィ ブ ステータ ス

プルダウ ンおよびプルア ッ プ サポー ト な し

駆動電流および遅延 無視

プ リ ミ テ ィ ブの配列 サポー ト な し

合成 249UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 250: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

Verilog の予約キーワー ド

次の表に、 予約キーワード を示し ます。 アス タ リ ス ク (*) の付いている キーワード は Verilog の予約キーワード で、

Vivado 合成ではサポー ト されません。

表 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

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

合成 250UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 251: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 では、 レジス タ を宣言する と きにに初期化でき ます。

• 指定可能な初期値は、 次のよ う な値です

° 定数値です。

° 以前の初期値に依存させる こ と はでき ません。

° 関数またはタ ス ク呼び出しは使用でき ません。

° レジス タに伝搬するパラ メ ーター値にでき ます。

° ベク ターのすべてのビ ッ ト を指定し ます。

• 宣言部でレジス タの初期値を指定し た場合、 グ ローバル リ セ ッ ト 時または電源投入時にレジス タの出力がその

値に初期化されます。

• この方法で指定された初期値は、 次のよ う にな り ます。

° レジス タの INIT 属性と し て Verilog フ ァ イルに渡されます。

° ローカル リ セ ッ ト には依存し ません。

合成 251UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 252: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: 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];

合成 252UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 253: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

多次元配列

Vivado 合成では、 2 次元までの多次元配列型がサポー ト されます。

• 次の多次元配列が可能です。

° 任意のネ ッ ト

° 任意の変数データ型

• 配列を使用し た コード代入や数値演算が可能です。

• 一度に選択でき る配列のエレ メ ン ト は 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

• レジス タ

° reg

° integer

合成 253UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 254: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

• 定数

° parameter

° 多次元配列 ( メ モ リ )

ネ ッ ト およびレジス タ

ネ ッ ト およびレジス タは次のいずれかにでき ます。

• 単ビ ッ ト (ス カ ラー )

• 複数ビ ッ ト (ベク ター )

ビヘイ ビアー記述のデータ型の例

次に、 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 と し て宣言する こ と はでき ません。

合成 254UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 255: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

論理式

Verilog ビヘイ ビアー記述の論理式には、 次のものがあ り ます。

• 定数

• 次の演算子を含む変数

° 算術演算子

° 論理演算子

- ビ ッ ト

- 論理演算子

° 比較演算子

° 条件演算子

論理演算子

論理演算子がビ ッ ト または論理のどち らのカテゴ リ に属するかは、 演算子が適用される論理式に 1 ビ ッ ト が含まれ

るか複数のビ ッ ト が含まれるかによ り ます。

サポー ト される演算子

表 7-8: サポー ト される演算子

算術演算子 論理演算子 比較演算子 条件演算子

+ & < ?

- && ==

* | ===

** || <=

/ ^ >=

% ~ >=

~^ !=

^~ !==

<< >

>>

<<<

>>>

合成 255UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 256: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

サポー ト される論理式

表 7-9: サポー ト される論理式

論理式 記号 ステータ ス

連結 {} サポー ト あ り

複製 {{}} サポー ト あ り

算術演算 +、 -、 *、 ** サポー ト あ り

除算 / 2 番目のオペラ ン ド が 2 のべき乗の定数の場合、

または両方のオペラ ン ド が定数の場合にサポー ト 。

剰余 % 2 番目のオペラ ン ド が 2 のべき乗の定数の場合に

サポー ト 。

加算 + サポー ト あ り

減算 - サポー ト あ り

乗算 * サポー ト あ り

べき乗 ** サポー ト あ り

• 両方のオペラ ン ド が定数で、 2 番目のオペラ ン ド

が負でない場合。

• 初のオペラ ン ド が 2 の場合、 2 番目のオペラ ン

ド は変数にする こ と が可能。

• Vivado 合成では実数データ型はサポー ト されず、

結果が実数と な るオペラ ン ド の組み合わせを使

用する と エラーが発生。

• X (不明) および Z (ハイ イ ンピーダン ス) は

使用不可。

比較演算 >、 <、 >=、 <= サポー ト あ り

論理否定 ! サポー ト あ り

論理 AND && サポー ト あ り

論理 OR || サポー ト あ り

論理等号 == サポー ト あ り

論理不等号 != サポー ト あ り

ケース等号 === サポー ト あ り

ケース不等号 !== サポー ト あ り

ビ ッ ト 単位否定 ~ サポー ト あ り

ビ ッ ト 単位 AND & サポー ト あ り

ビ ッ ト 単位 OR | サポー ト あ り

ビ ッ ト 単位排他的 OR ^ サポー ト あ り

ビ ッ ト 単位等価 ~^、 ^~ サポー ト あ り

リ ダ ク シ ョ ン AND & サポー ト あ り

リ ダ ク シ ョ ン NAND ~& サポー ト あ り

リ ダ ク シ ョ ン OR | サポー ト あ り

合成 256UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 257: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

論理式の評価

次の表の === と !== には、 次のよ う な特徴があ り ます。

• 特殊な比較演算子です。

• シ ミ ュ レーシ ョ ンで使用され、 変数に値 x または z が代入されているかを確認し ます。

• 合成では、 これらの演算子は == および != と し て処理されます。

Vivado シ ミ ュ レーシ ョ ン用の Verilog フ ォーマ ッ ト の詳細は、 『Vivado Design Suite ユーザー ガイ ド : ロ ジ ッ ク シ

ミ ュ レーシ ョ ン』 (UG900) [参照 11] のこのセ ク シ ョ ンを参照し て く ださい。

リ ダ ク シ ョ ン NOR ~| サポー ト あ り

リ ダ ク シ ョ ン XOR ^ サポー ト あ り

リ ダ ク シ ョ ン XNOR ~^、 ^~ サポー ト あ り

左シフ ト << サポー ト あ り

符号付き右シフ ト >>> サポー ト あ り

符号付き左シフ ト <<< サポー ト あ り

右シフ ト >> サポー ト あ り

条件演算子 ?: サポー ト あ り

イベン ト OR or、 ',' サポー ト あ り

表 7-9: サポー ト される論理式 (続き)

論理式 記号 ステータ ス

合成 257UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 258: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

も よ く 使用される演算子での論理式の評価結果

ブロ ッ ク

Vivado 合成では、 一部のブロ ッ ク文がサポー ト されています。

• ブロ ッ ク文には、 次のよ う な特徴があ り ます。

° 複数の文をグループ化。

° begin キーワード で開始し、 end キーワード で終了。

° ブロ ッ ク内では、 記述された順に文が実行される。

• Vivado 合成では、 順次ブロ ッ ク のみがサポー ト されます。

• Vivado 合成では、 パラ レル ブロ ッ クはサポー ト されません。

• ブロ ッ ク内の手続き文は、 すべてモジュール内で定義し ます。

• 手続き型ブロ ッ ク には、 次の 2 種類があ り ます。

° initial ブロ ッ ク

° always ブロ ッ ク

• 各ブロ ッ クは begin キーワード で開始し、 end キーワード で終了し ます。 initial ブロ ッ クは合成では無視され

るので、 こ こ では always ブロ ッ クのみを説明し ます。

表 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

合成 258UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 259: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

• 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

合成 259UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 260: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 260UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 261: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

手続き代入文

• Verilog ビヘイ ビアー記述の手続き代入文には、 次のよ う な特徴があ り ます。

° reg と し て宣言された変数に値を代入し ます。

° always ブロ ッ ク、 タ ス ク、 関数で 初に使用されます。

° レジス タおよび有限ステー ト マシン (FSM) コ ンポーネン ト を記述し ます。

• Vivado 合成では、 次がサポー ト されます。

° 組み合わせ関数

° 組み合わせおよび順次タ ス ク

° 組み合わせおよび順次 always ブロ ッ ク

組み合わせ always ブロ ッ ク

組み合わせロ ジ ッ クは、 Verilog のタ イ ミ ング制御文を使用する と効率的に記述でき ます。

• 遅延タ イ ミ ング制御文 [#]

• イベン ト 制御タ イ ミ ング制御文 [@]

遅延タ イ ミ ング制御文

遅延タ イ ミ ング制御文 [#] には、 次のよ う な特徴があ り ます。

• シ ミ ュ レーシ ョ ンにのみ関係し ます。

• 合成では無視されます。

Vivado シ ミ ュ レーシ ョ ン用の Verilog フ ォーマ ッ ト の詳細は、 『Vivado Design Suite ユーザー ガイ ド : ロ ジ ッ ク シ

ミ ュ レーシ ョ ン』 (UG900) [参照 11] のこのセ ク シ ョ ンを参照し て く ださい。

イベン ト 制御タ イ ミ ング制御文

イベン ト 制御タ イ ミ ング制御文 [@] を使用し た組み合わせロ ジ ッ ク の記述は、 次のよ う な ものです。

• 組み合わせ always ブロ ッ ク には、 always@ の後にかっ こ で囲まれたセンシテ ィ ビテ ィ リ ス ト があ り ます。

• センシテ ィ ビテ ィ リ ス ト にあ る信号のいずれかにイベン ト (値の変化またはエ ッ ジ) が発生する と、 always ブ

ロ ッ ク が実行されます。

• センシテ ィ ビテ ィ リ ス ト には、 次を含める こ と ができ ます。

° if や case などの条件で使用する信号。

° 代入文の右辺の信号。

• 信号の リ ス ト の代わ り に ( ) のな しで @ を使用する と、 説明し た よ う に、 always ブロ ッ ク の信号のいずれかに

イベン ト が発生し た場合に、 always ブロ ッ ク が実行されます。

• 組み合わせプロセスでは、 if 文または case 文のすべての分岐で信号が明示的に代入されていない場合、 後の

値を保持する ラ ッチが生成されます。

合成 261UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 262: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

• プロセスには、 次の文が使用されます。

° 変数代入文および信号代入文

° if-else 文

° case 文

° for-while ループ文

° 関数およびタ ス ク呼び出し

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;

合成 262UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 263: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

case 文Vivado 合成では、 case 文がサポー ト されています。

• case 文は論理式を比較し、 複数の並列分岐の 1 つを実行し ます。

° 分岐は記述された順に評価されます。

° 初に真 と判断された分岐が実行されます。

° どの分岐も偽であ る場合は、 default 分岐が実行されます。

• case 文では、 サイ ズ指定のない整数を使用し ないで く ださい。 整数のサイ ズを必ずビ ッ ト 数で指定し て く ださ

い。 そ う し ない と、 結果が予測不可能な ものにな り ます。

• casez は、 分岐のすべてのビ ッ ト 位置の z 値を ド ン ト ケア と し て処理し ます。

• casex は、 分岐のすべてのビ ッ ト 位置の x および z 値を ド ン ト ケア と し て処理し ます。

• casez 文または casex 文では、 ク エスチ ョ ン マーク (?) も ド ン ト ケア と し て使用でき ます。

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)

合成 263UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 264: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

for および repeat 文Vivado 合成では、 for および repeat 文がサポー ト されています。 always ブロ ッ ク では、 繰 り 返し またはビ ッ ト ス ラ

イ ス構造を記述するのにも for 文または repeat 文を使用でき ます。

for 文for 文では、 定数の範囲、 および <、 <=、 >、 >= 演算子を使用し たテス ト 条件の停止がサポー ト されます。

for 文では、 次のいずれかに適合する次ステ ッ プの計算もサポー ト されます。

• var = var + step

• var = var - step

説明:

° ver: ループ変数

° step : 定数値

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

合成 264UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 265: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

順次 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<$synchronous_part>

end

順次 always ブロ ッ クの例 1

次のコード例では、 立ち上が り エ ッ ジ ク ロ ッ ク を使用し た 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

順次 always ブロ ッ クの例 2

次のコード例では、 ア ク テ ィ ブ 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

合成 265UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 266: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

順次 always ブロ ッ クの例 3

次のコード例では、 ア ク テ ィ ブ 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

順次 always ブロ ッ クの例 4

次のコード例では、 非同期セ ッ ト / リ セ ッ ト はな く 、 同期 リ セ ッ ト を持つレジス タ を記述し ています。

module EXAMPLE (DI, CLK, SRST, DO);input [7:0] DI;input CLK, SRST;output [7:0] DO;reg [7:0] DO;

always @(posedge CLK) if (SRST == 1'b1) DO <= 8'b00000000;

else DO <= DI;

endmodule

assign 文および deassign 文Vivado 合成では、 assign 文および deassign 文はサポー ト されません。

32 ビ ッ ト を超える場合のビ ッ ト の拡張

代入文の左辺のビ ッ ト 幅が右辺よ り も広い場合は、 次の規則に従って左辺の左にパデ ィ ングが追加されます。

• 右辺が符号付きの場合は、 左辺に符号付き ビ ッ ト がパデ ィ ング と し て追加されます。

• 右辺が符号な しの場合は、 左辺に 0 がパデ ィ ング と し て追加されます。

• サイ ズ指定のない x または z 定数の場合は、 次の規則に従います。

右辺の も左側のビ ッ ト が z (ハイ イ ンピーダン ス) または x (不明) の場合、右辺が符号付き または符号な しにか

かわらず、 左辺にその値 (z または x) がパデ ィ ング と し て追加されます。

合成 266UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 267: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

タ スクおよび関数

• デザイ ンで同じ コード を複数回使用する場合、 タ ス クや関数を使用する と、 次が可能にな り ます。

° コード の量を削減。

° メ ンテナン スが容易。

• タ ス クおよび関数は、 モジュール内で宣言し て使用する必要があ り ます。 ヘッ ダー部には、 次のパラ メ ーター

が含まれます。

° 入力パラ メ ーター (関数の場合)。

° 入力/出力/入出力パラ メ ーター (タ ス ク の場合)。

• 関数の戻 り 値は、 符号付き または符号な しで宣言し ます。 内容は、 組み合わせ always ブロ ッ ク と類似し てい

ます。

タ スクおよび関数の例 1 フ ァ イル名: 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

合成 267UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 268: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

タ スクおよび関数の例 2次の例では、 同じ機能を タ ス ク を使用し て記述し ています。

フ ァ イル名: 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 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 オプシ ョ ンを使用し ます。

合成 268UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 269: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

再帰タ スクおよび関数の例

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//// 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

合成 269UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 270: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

定数式の例

次の定数式はすべて同じ値を表し ます。

• 4'b1010

• 4'o12

• 4'd10

• 4'ha

ブロ ッ キングおよび ノ ンブロ ッキング手続き代入文

ブロ ッ キングおよび ノ ンブロ ッ キング手続き代入文には、 タ イ ミ ングを制御する要素が組み込まれています。

• # および @ はタ イ ミ ング制御文です。

• 指定された イベン ト が発生する まで、 その後に続 く 文は実行されません。

• 合成では、 # の遅延は無視されます。

ブロ ッ キング手続き代入文の例 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;

合成 270UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 271: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 を使用す

る と、 合成の実行中にこのマ ク ロが実行されます。

合成 271UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 272: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

イ ン クルー ド フ ァ イル

Verilog では、 HDL ソース コード を複数のフ ァ イルに分割でき ます。 別のフ ァ イルに含まれる コード を参照するに

は、 現在のフ ァ イルで次の構文を使用し ます。

`include <path/file-to-be-included>

この構文を使用する と、 指定し たフ ァ イルの内容が現在のフ ァ イルの `include が含まれる行に挿入されます。

パスは相対パス または絶対パスで指定でき ます。 相対パス を使用する場合、 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 キーワード で終了し ます。

合成 272UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 273: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

generate 文を使用し て作成し た構造

generate 文では、 次のよ う な構造を作成でき ます。

• プ リ ミ テ ィ ブまたはモジュールのイ ン ス タ ン ス

• initial または always 手続きブロ ッ ク

• 継続代入文

• ネ ッ ト および変数の宣言

• パラ メ ーターの再定義

• タ ス ク または関数の定義

サポー ト される 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 文には、 固有の名前を付けます。

合成 273UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 274: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 7 章: Verilog サポー ト

generate 条件文のコー ド例

次の例では、 データ ワード の幅に基づいて、 乗算器の 2 つの異なる イ ンプ リ メ ンテーシ ョ ンを イ ン ス タ ンシエー ト

し ています。

generateif (IF_WIDTH < 10) begin : if_name multiplier_imp1 # (IF_WIDTH) u1 (a, b, sum_if);

endelse 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

合成 274UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 275: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 のデータ型を説明し ます。

合成 275UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 276: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 と シ ミ ュ レーシ ョ ンの不一致が発生する可能性があるので、 注意して く ださい。

• デフ ォル ト では、 byte、 shortint、 int、 integer、 および longint データ型は符号付きの値にな り ます。

合成 276UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 277: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

• 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;

この場合、 sun=0、 mon=3、 tues=4、 wed=5、 thurs=10、 fri=12、 および sat=13 にな り ます。

合成 277UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 278: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

列挙型は、 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

• 符号な しの定数値

• ユーザーが作成し た符号付き値型

合成 278UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 279: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 279UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 280: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 @* もサポー ト されるので、 センシテ ィ ビテ ィ リ ス ト の問題によ る シ ミ ュ

レーシ ョ ンでの不一致を回避でき ます。

合成 280UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 281: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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;

合成 281UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 282: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

手続きプログラム代入文

if-else 条件文

if-else 条件文の構文は、 次のよ う にな り ます。

if (expression)command1;

elsecommand2;

else 文はオプシ ョ ンで、 ク ロ ッ ク文の有無によ って ラ ッチまたはフ リ ッ プフ ロ ッ プが想定されます。 次のよ う な複

数の if および else 文もサポー ト されます。

If (expression1)Command1;

elsif (expression2)command2;

elsif (expression3)command3;

elsecommand4;

このコード は、 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 と し て処理されます。

合成 282UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 283: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

ループ文

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 文 と共に使用し て く ださい。

タ スクおよび関数

タ スク

タ ス ク宣言の構文は、 次の とお り です。

task name (ports);[optional declarations];statements;

endtask

タ ス ク には、 次の 2 種類があ り ます。

• ス タ テ ィ ッ ク タ ス ク : 宣言文に、 次にタ ス ク が呼び出された と きに前の値が保持されます。

• 自動タ ス ク : 宣言文には前の値は保持されません。

注意: Vivado 合成ではすべてのタ ス ク が自動タ ス ク と し て処理されるので、 タ ス ク を使用する際は注意が必要です。

多 く のシ ミ ュ レータでは、 ス タ テ ィ ッ ク か自動かを指定し ない場合のデフ ォル ト がス タ テ ィ ッ ク タ ス ク なので、 シ

ミ ュ レーシ ョ ンで不一致が発生する可能性があ り ます。 タ ス ク を自動またはス タ テ ィ ッ クに指定する方法は、 次の

とお り です。

task automatic my_mult... //or task static my_mult ...

合成 283UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 284: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

関数 (自動またはス タ テ ィ ッ ク )関数はタ ス ク と類似し ていますが、 値が返される点が異な り ます。 関数の構文は、 次の とお り です。

function data_type function_name(inputs);declarations;statements;

endfunction : function_name

後の function_name はオプシ ョ ンですが、 こ の方がコード が読みやす く な り ます。

関数は値を返すので、 return 文を使用するか、 関数名を記述し てお く 必要があ り ます。

function_name = ....

タ ス ク と同様、 関数も自動またはス タ テ ィ ッ ク にでき ます。

注意: Vivado 合成ではすべての関数が自動 と し て処理されますが、 シ ミ ュ レータによ っては動作が異な り ます。 関数

をサード パーテ ィ シ ミ ュ レータで使用する場合は注意が必要です。

モジュールおよび階層

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);

合成 284UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 285: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

ワイルド カー ド ポー ト を使用し たモジュールの接続

ワ イル ド カード を使用し てモジュールを接続する こ と もでき ます。 た と えば、 上記の例は次のよ う にな り ます。

// 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 信号に接続されます。

イ ン ターフ ェ イス

イ ン ターフ ェ イ スは、 ブロ ッ ク間の通信を指定するために使用し ます。 イ ン ターフ ェ イ ス と は、 モジュール間の接

続を記述しやす く する目的でま と められたネ ッ ト および変数のグループです。 基本的な イ ン ターフ ェ イ スの構文は、

次の とお り です。

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 (

合成 285UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 286: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

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,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

合成 286UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 287: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

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,

これで、 入力 と出力が正し く 関連付け られます。

その他のイ ン ターフ ェ イス機能

イ ン ターフ ェ イ スには、 信号だけでな く 、 タ ス クおよび関数も含める こ と ができ、 そのイ ン ターフ ェ イ スに特有の

タ ス ク を作成でき ます。 イ ン ターフ ェ イ スのパラ メ ーターも指定でき ます。 前述の例の場合、 data1 および data2

は両方 と も 10 ビ ッ ト のベク ターですが、 これらのイ ン ターフ ェ イ スはパラ メ ーターを設定する こ と によ り 任意のサ

イ ズに変更でき ます。

package 文package 文を使用する と、 さ まざまなコ ン ス ト ラ ク ト を共有でき ます。 これは、 VHDL のパッ ケージ文と同じ よ う に

動作し ます。 package 文には、 関数、 タ ス ク、 データ型、 列挙型など を含める こ と ができ ます。 package 文の構文は、

次の とお り です。

package package_name;items

endpackage : package_name

後の package_name は、 コード を読みやす く する ためで、 必須ではあ り ません。 パッ ケージは、 ほかのモジュー

ルで import コマン ド を使用し て参照されます。 構文は次の とお り です。

import package_name::item or *;

import コマン ド では、 イ ンポー ト するパッ ケージからのア イ テムを指定するか、 パッ ケージ全体を指定する必要

があ り ます。

合成 287UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 288: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

SystemVerilog コ ンス ト ラ ク ト

次の表に、 SystemVerilog コ ン ス ト ラ ク ト を示し ます。 サポー ト されていないコ ン ス ト ラ ク ト は、 そのセルに灰色で

陰影が付け られています。

表 8-1: SystemVerilog コ ンス ト ラ ク ト

プ ラ イマ リ コ ンス ト ラ ク ト セカ ンダ リ コ ンス ト ラ ク ト ステータ ス

データ型

単体型および集合体型 サポー ト あ り

ネ ッ ト および変数 サポー ト あ り

変数宣言 サポー ト あ り

ベク ター宣言 サポー ト あ り

2 ステー ト (2 値) および 4 ステー ト (4 値) データ型 サポー ト あ り

符号付きおよび符号な し整数データ型 サポー ト あ り

ユーザー定義型 サポー ト あ り

列挙型 サポー ト あ り

新規データ型を列挙型と し て定義 サポー ト あ り

列挙型の範囲 サポー ト あ り

型チェ ッ ク サポー ト あ り

数式の列挙型 サポー ト あ り

列挙型 メ ソ ッ ド サポー ト あ り

型パラ メ ーター サポー ト あ り

型演算子 サポー ト あ り

キ ャ ス ト 演算子 サポー ト あ り

ビ ッ ト ス ト リ ーム キ ャ ス ト サポー ト あ り

ク ラ ス サポー ト な し

const 定数 サポー ト な し

$cast ダ イナ ミ ッ ク キ ャ ス ト サポー ト な し

real、 shortreal、 および realtime データ型 サポー ト な し

集合体データ型

構造体 (struct) サポー ト あ り

パッ ク型/アンパッ ク型構造体 サポー ト あ り

構造体への代入 サポー ト あ り

パッ ク型配列 サポー ト あ り

アンパッ ク型配列 サポー ト あ り

配列の演算 サポー ト あ り

多次元配列 サポー ト あ り

配列のイ ンデッ ク スおよびス ラ イ ス サポー ト あ り

配列代入 サポー ト あ り

サブルーチンへの引数と し ての配列 サポー ト あ り

合成 288UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 289: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

配列操作 メ ソ ッ ド (キ ュー型を戻さ ない メ ソ ッ ド ) サポー ト な し

配列ク エ リ 関数 サポー ト な し

アンパッ ク型共用体 サポー ト な し

タ グ付き共用体 サポー ト な しa

パッ ク型共用体 サポー ト あ り

プロセス

組み合わせロ ジ ッ ク の always_comb プロ シージャ サポー ト あ り

暗示的な always_comb のセンシテ ィ ビテ ィ リ ス ト サポー ト あ り

ラ ッチ ロ ジ ッ ク の always_latch プロ シージ ャ サポー ト あ り

順次ブロ ッ ク サポー ト あ り

順序ロ ジ ッ ク の always_ff プロ シージ ャ サポー ト あ り

iff イベン ト 修飾子 サポー ト あ り

エイ リ アス サポー ト な し

条件付き イベン ト 制御 サポー ト な し

並列ブロ ッ ク サポー ト な し

手続き的タ イ ミ ング制御 サポー ト な し

順次イベン ト サポー ト な し

代入文

連続代入文 サポー ト あ り

変数宣言代入 (変数初期化) サポー ト あ り

代入のよ う なコ ンテキス ト サポー ト あ り

配列代入パターン サポー ト あ り

構造代入パターン サポー ト あ り

アンパッ ク型配列連結 サポー ト あ り

ネ ッ ト エイ リ アス サポー ト な し

演算子および演算式

$error、 $warning、 $info 初期ブロ ッ ク内でのみサポー

ト され、 定数式 (パラ メ ー

ターなど) を評価する ために

のみ使用可能です。

集合体式 サポー ト あ り

符号な しおよび符号付き型を使用し た演算式 サポー ト あ り

代入演算子 サポー ト あ り

演算式内の代入 サポー ト あ り

連結演算子 サポー ト あ り

定数式 サポー ト あ り

イ ン ク リ メ ン ト およびデク リ メ ン ト 演算子 サポー ト あ り

ロ ジ ッ ク (4 値) およびビ ッ ト (2 値) 型の演算 サポー ト あ り

ワ イル ド カード等価演算子 サポー ト あ り

表 8-1: SystemVerilog コ ンス ト ラ ク ト (続き)

プ ラ イマ リ コ ンス ト ラ ク ト セカ ンダ リ コ ンス ト ラ ク ト ステータ ス

合成 289UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 290: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

stream_expressions の連結 サポー ト な し

実数オペラ ン ド を使用する演算子 サポー ト な し

ジェネ リ ッ ク ス ト リ ームの並べ替え サポー ト な し

メ ンバーシ ッ プ演算子の設定 サポー ト な し

代入ターゲ ッ ト と し てのス ト リ ー ミ ング連結 (アン

パッ ク型)

サポー ト な し

動的にサイ ズが決定されるデータのス ト リ ー ミ ング サポー ト な し

手続きプログラム文

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 コ ンス ト ラ ク ト (続き)

プ ラ イマ リ コ ンス ト ラ ク ト セカ ンダ リ コ ンス ト ラ ク ト ステータ ス

合成 290UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 291: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 8 章: SystemVerilog サポー ト

モジュールおよび階層

デフ ォル ト のポー ト 値 サポー ト あ り

外部モジュール サポー ト あ り

モジュール イ ン ス タ ンシエーシ ョ ン構文 サポー ト あ り

メ ンバー選択 サポー ト あ り

モジュール パラ メ ーターのオーバーラ イ ド サポー ト あ り

上位モジュールおよび $root サポー ト な し

ス コープまたはイ ン ス タ ン スへの補助コード のバイ

ン ド

サポー ト な し

階層名 サポー ト あ り

上方向の名前参照 サポー ト な し

仮想ポー ト サポー ト な し

イ ン ターフ ェ イス

イ ン ターフ ェ イ ス構文 サポー ト あ り

modport 式 サポー ト あ り

パラ メ ーター指定された イ ン ターフ ェ イ ス サポー ト あ り

イ ン ターフ ェ イ スのポー ト サポー ト あ り

イ ン ターフ ェ イ スの配列 サポー ト あ り

ク ロ ッ キング ブロ ッ クおよび modport サポー ト な し

動的配列 サポー ト な し

タ ス クおよび関数のエ ク スポー ト 例 サポー ト な し

複数タ ス ク のエ ク スポー ト 例 サポー ト な し

イ ン ターフ ェ イ スおよび指定ブロ ッ ク サポー ト な し

入れ子のイ ン ターフ ェ イ ス サポー ト な し

仮想イ ン ターフ ェ イ ス サポー ト な し

パッ ケージ

パッ ケージ宣言 サポー ト あ り

パッ ケージ内のデータの参照 サポー ト あ り

モジュール ヘッ ダーでのパッ ケージの使用 サポー ト あ り

パッ ケージからのイ ンポー ト された名前のエ ク ス

ポー ト

サポー ト な し

std ビル ト イ ン パッ ケージ サポー ト な し

generate コ ンス ト ラ ク ト

サポー ト あ り

a. 使用し た場合、 タ グは無視され、 警告 メ ッ セージが表示されます。

表 8-1: SystemVerilog コ ンス ト ラ ク ト (続き)

プ ラ イマ リ コ ンス ト ラ ク ト セカ ンダ リ コ ンス ト ラ ク ト ステータ ス

合成 291UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 292: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 モジュールにバイ ン ド

されます。

イ ンス タ ンシエーシ ョ ン

イ ン ス タ ンシエーシ ョ ンでは、 次の規則が適用されます。

° Verilog モジュールを VHDL デザイ ン ユニ ッ ト にバイ ン ドするには、 コ ンポーネン ト イ ン ス タ ンシエー

シ ョ ンに基づ く デフ ォル ト のバイ ン ド が使用されます。

° VHDL に Verilog モジュールを イ ンス タ ンシエー ト する場合、 Vivado 合成では次はサポー ト されていません。

- コ ンフ ィ ギュ レーシ ョ ン仕様

- 直接イ ン ス タ ンシエーシ ョ ン

- コ ンポーネン ト コ ンフ ィ ギュ レーシ ョ ン

合成 292UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 293: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 9 章: 混合言語サポー ト

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 モジ ュールが選択されてバ

イ ン ド されます。

° ラ イブラ リ は統一されているため、 VHDL デザイ ン ユニ ッ ト と同じ名前の Verilog セルを同じ論理ラ イブラ

リ に共存させる こ と はでき ません。

° 同じ名前のセルまたはユニ ッ ト が新し く コ ンパイルされる と、 以前にコ ンパイルされたセルまたはユニ ッ

ト が上書き されます。

合成 293UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 294: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 9 章: 混合言語サポー ト

イ ンス タ ンシエーシ ョ ンの制限

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 にイ ン ス タ ンシエー ト する場合、 コ ンポーネン ト イ ン ス タ ンシエーシ ョ ンのみがサ

ポー ト されます。 直接エンテ ィ テ ィ イ ン ス タ ンシエーシ ョ ンはサポー ト されません。

VHDL および Verilog ラ イブ ラ リ

VHDL と Verilog を混合する際、 ラ イブラ リ は次のよ う に扱われます。

• VHDL および Verilog ラ イブラ リ は、 論理的に統一されます。

• コ ンパイル用のデフ ォル ト の work デ ィ レ ク ト リ は、 VHDL および Verilog でも使用でき ます。

• 混合言語プロ ジェ ク ト では、 デザイ ン ユニ ッ ト (セル) を統一された論理ラ イブラ リ で検索する ための検索順を

指定でき ます。 エラ ボレーシ ョ ンの段階でこの検索順に従って VHDL エンテ ィ テ ィ または Verilog モジュールが

検索され、 混合言語プロ ジェ ク ト にバイ ン ド されます。

合成 294UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 295: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 9 章: 混合言語サポー ト

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 のデータ型がサポー ト されます。

合成 295UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 296: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

第 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 ポー ト 名はすべて小文字であ る と判断されます。

合成 296UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 297: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

付録 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 からは、 日本語版は参照でき ません。 ウ ェブサイ ト のデザイ ン ハブ ページをご利用 く ださい。

合成 297UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 298: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

付録 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 ビデオ チュー ト リ アル

合成 298UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com

Page 299: Vivado Design Suite - Xilinx...合成 10 UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com 第 1 章: Vivado 合成 2. [Constraints] エリアの [Default Constraint Set] で、デフォルトでアクティブな制約セットとする制約セットを選択

付録 A: その他のリ ソースおよび法的通知

お読み く だ さい: 重要な法的通知本通知に基づいて貴殿または貴社 (本通知の被通知者が個人の場合には 「貴殿」、 法人その他の団体の場合には 「貴社」。 以下同じ ) に開示される情報 (以下 「本情報」 と いいます) は、 ザイ リ ン ク スの製品を選択および使用する こ と のためにのみ提供されます。

(1) 本情報は 「現状有姿」、 およびすべて受領者の責任で (with all faults) と い う 状態で提供され、 ザイ リ ン ク スは、 本通知を も って、

明示、 黙示、 法定を問わず (商品性、 非侵害、 特定目的適合性の保証を含みますがこれらに限られません)、 すべての保証および条

件を負わない (否認する ) もの と し ます。 また、 (2) ザイ リ ン ク スは、 本情報 (貴殿または貴社によ る本情報の使用を含む) に関係し、

起因し、 関連する、 いかな る種類 ・ 性質の損失または損害について も、 責任を負わない (契約上、 不法行為上 (過失の場合を含む)、その他のいかな る責任の法理によ るかを問わない) もの と し、 当該損失または損害には、 直接、 間接、 特別、 付随的、 結果的な損

失または損害 (第三者が起こ し た行為の結果被った、 データ、 利益、 業務上の信用の損失、 その他あ らゆる種類の損失や損害を含

みます) が含まれる もの と し、 それは、 た と え当該損害や損失が合理的に予見可能であった り 、 ザイ リ ン ク スがそれらの可能性に

ついて助言を受けていた場合であった と し て も同様です。 ザイ リ ン ク スは、 本情報に含まれるいかな る誤 り も訂正する義務を負わ

ず、 本情報または製品仕様のア ッ プデー ト を貴殿または貴社に知らせる義務も負いません。 事前の書面によ る同意のない限 り 、 貴

殿または貴社は本情報を再生産、 変更、 頒布、 または公に展示し てはな り ません。 一定の製品は、 ザイ リ ン ク スの限定的保証の諸

条件に従 う こ と と な るので、 https://japan.xilinx.com/legal.htm#tos で見られるザイ リ ン ク スの販売条件を参照し て く ださい。 IP コ ア

は、 ザイ リ ン ク スが貴殿または貴社に付与し た ラ イセン スに含まれる保証と補助的条件に従 う こ と にな り ます。 ザイ リ ン ク スの製

品は、 フ ェ イルセーフ と し て、 または、 フ ェ イルセーフの動作を要求する アプ リ ケーシ ョ ンに使用する ために、 設計された り 意図

された り し ていません。 そのよ う な重大なアプ リ ケーシ ョ ンにザイ リ ン ク スの製品を使用する場合の リ ス ク と責任は、 貴殿または

貴社が単独で負 う ものです。 https://japan.xilinx.com/legal.htm#tos で見られるザイ リ ン ク スの販売条件を参照し て く ださい。

自動車用のアプ リ ケーシ ョ ンの免責条項

オー ト モーテ ィ ブ製品 (製品番号に 「XA」 が含まれる ) は、 ISO 26262 自動車用機能安全規格に従った安全コ ンセプ ト または余剰性

の機能 ( 「セーフテ ィ 設計」 ) がない限 り 、 エアバッ グの展開におけ る使用または車両の制御に影響する アプ リ ケーシ ョ ン ( 「セー

フテ ィ アプ リ ケーシ ョ ン」 ) におけ る使用は保証されていません。 顧客は、 製品を組み込むすべてのシステムについて、 その使用

前または提供前に安全を目的と し て十分なテス ト を行 う もの と し ます。 セーフテ ィ 設計な しにセーフテ ィ アプ リ ケーシ ョ ンで製品

を使用する リ ス クはすべて顧客が負い、 製品の責任の制限を規定する適用法令および規則にのみ従 う もの と し ます。

AMBA、 AMBA Designer、 Arm、 ARM1176JZ-S、 CoreSight、 Cortex、 PrimeCell、 Mali、 および MPCore は、 EU およびその他各国の Arm Limited の商標です。 MATLAB および Simulink は、 MathWorks, Inc. の登録商標です。 PCI、 PCIe、 および PCI Express は PCI-SIG の商標であ り 、 ラ イ セン スに基づいて使用されています。 すべてのその他の商標は、 それぞれの保有者に帰属し ます。

© Copyright 2012-2019 Xilinx, Inc. Xilinx、 Xilinx のロ ゴ、 Artix、 ISE、 Kintex、 Spartan、 Virtex、 Vivado、 Zynq、 およびこ の文書に含

まれるその他の指定されたブラ ン ド は、 米国およびその他各国のザイ リ ン ク ス社の商標です。

こ の資料に関する フ ィ ード バッ クおよび リ ン ク などの問題につき ま し ては、 [email protected] まで、 または各ページの

右下にあ る [フ ィ ード バッ ク送信] ボ タ ンを ク リ ッ クする と 表示される フ ォームからお知らせ く ださい。 フ ィ ード バッ クは日本語で

入力可能です。 いただき ま し たご意見を参考に早急に対応させていただき ます。 なお、 こ の メ ール ア ド レ スへのお問い合わせは受

け付けてお り ません。 あ らかじめご了承 く ださい。

合成 299UG901 (v2019.1) 2019 年 6 月 12 日 japan.xilinx.com