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

Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

Vivado Design Suite ユーザー ガイ ド

合成

UG901 (v2015.3) 2015 年 9 月 30 日

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

Page 2: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

合成 japan.xilinx.com 2UG901 (v2015.3) 2015 年 9 月 30 日

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

日付 バージ ョ ン 改訂内容

2015 年 9 月 30 日 2015.3 次のよ う に変更

• 11 ページの 「run ス ト ラ テジの作成」 および 34 ページの表 1-2 に新しいス ト ラ テジを 追加

• 15 ページの図 1-9 および 15 ページの図 1-10 を追加 • 第 1 章 「Vivado 合成」 に HDL 言語サポー ト をすべて リ ス ト • 資料全体にほかの資料への直接 リ ン ク を追加

• 33 ページの表 1-1 に Tcl コマン ドへの直接 リ ン ク を追加 • 30 ページの 「Tcl での合成の実行」 に新しいオプシ ョ ンを追加

• 36 ページの 「CASCADE_HEIGHT」 属性を追加 • 44 ページの 「MARK_DEBUG」 の内容を変更 • 49 ページの 「USE_DSP48」 の内容を変更

• 50 ページの 「Vivado でのカス タ ム属性のサポー ト 」 を追加 • 84 ページの 「偶数丸め (LSB 訂正手法)」 に偶数への丸めおよび奇数への丸めの Verilog

例と VHDL 例を追加

• 第 5 章 「VHDL-2008 言語サポー ト 」 を追加

2015 年 6 月 24 日 2015.2 次のよ う に変更 • 重要な注記を追加 • ス ク リ ーン シ ョ ッ ト を 2015.2 のものに変更

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

2015 年 4 月 1 日 2015.1 2015.1 用の リ リ ース 次のよ う に変更 :• 言語サポー ト の章でコード例を修正 • -cascade_dsp strategy オプシ ョ ンを追加 • 言語サポー ト の章への相互参照を追加 • 「run ス ト ラ テジの作成」 の手順をわか り やす く 変更 • ク ロ ッ ク の配線に対する Vivado ツールの使用に関する説明を明確化 • 上位での -mode out_of_context オプシ ョ ンの使用に関する説明を明確化 • 制約の優先順位の説明への リ ン ク を追加

• ASYNC_REG の使用に関する説明を明確化 • 複数の順次 always ブロ ッ ク の例を追加 • イ ン ターフ ェ イ スの例を追加 • 乗算器のコード例に関する内容を追加 • 「UltraScale DSP ブロ ッ ク の 2 乗算出機能の使用」に UltraScale DSP ブロ ッ ク (DSP48E2)

に関する内容を追加

Page 3: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

目次

改訂履歴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

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

合成手法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

合成の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

レポー ト の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

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

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

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

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

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

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

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

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

第 3 章 : HDL コーデ ィ ング手法概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

VHDL の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Verilog の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

SystemVerilog の利点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

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

ラ ッチ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

ト ラ イ ステー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

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

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

乗算器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

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

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

FIR フ ィ ルター . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

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

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

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

ブラ ッ ク ボ ッ ク ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

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

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

第 4 章 : VHDL サポー ト概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

合成 japan.xilinx.com 3UG901 (v2015.3) 2015 年 9 月 30 日

Page 4: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

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

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

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

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

VHDL のアサー ト 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

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

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

VHDL の予約語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

第 5 章 : VHDL-2008 言語サポー ト概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

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

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

第 6 章 : Verilog サポー ト概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

Verilog デザイ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191

Verilog の機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192

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

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

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

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

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

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

モジュール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

手続き代入文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

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

第 7 章 : SystemVerilog サポー ト概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232

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

データ型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

プロセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237

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

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

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

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

第 8 章 : 混合言語サポー ト概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246

VHDL と Verilog の混合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246

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

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

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

バイ ン ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

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

合成 japan.xilinx.com 4UG901 (v2015.3) 2015 年 9 月 30 日

Page 5: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

参考資料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

ト レーニング リ ソース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

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

合成 japan.xilinx.com 5UG901 (v2015.3) 2015 年 9 月 30 日

Page 6: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 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) [参照 7] の 「UCF 制約の XDC 制約への移行」 を参照し て く だ さい。

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

• プロ ジェ ク ト モード を使用

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

操作モード の詳細は、 『Vivado Design Suite ユーザー ガイ ド : デザイ ン フ ローの概要』 (UG892) [参照 8] を参照し て く ださい。 この章では、 両方のモード を使用し た合成を個別のセ ク シ ョ ンで説明し ます。

合成 japan.xilinx.com 6UG901 (v2015.3) 2015 年 9 月 30 日

Page 7: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

合成手法Vivado IDE では、 合成およびイ ンプ リ メ ンテーシ ョ ン run をボタ ンを ク リ ッ クするだけで実行可能な環境が提供され ています。 run のデータは自動的に管理され、 さ まざまな RTL ソース バージ ョ ン、 ターゲ ッ ト デバイ ス、 合成およ びイ ンプ リ メ ンテーシ ョ ン オプシ ョ ン、 物理制約およびタ イ ミ ング制約を使用し て繰 り 返し実行でき ます。

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

• ス ト ラ テジを作成および保存。 ス ト ラ テジ と は、 合成またはイ ンプ リ メ ンテーシ ョ ンのデザイ ン run に適用され る コマン ド オプシ ョ ンの設定です。 詳細は、 11 ページの 「run ス ト ラ テジの作成」 を参照し て く ださい。

• 複数の合成およびイ ンプ リ メ ンテーシ ョ ン run を設定し、 順次に、 またはマルチプロセ ッサ マシンで同時に実 行。 詳細は、 17 ページの 「合成の実行」 を参照し て く ださい。

• 合成またはイ ンプ リ メ ンテーシ ョ ンの進捗状況を監視、ロ グ レポー ト を確認、run をキ ャ ンセル。詳細は、25 ペー ジの 「合成実行の監視」 を参照し て く ださい。

合成の使用このセ ク シ ョ ンでは、Vivado 統合設計環境 (IDE) を使用し て Vivado 合成を設定および実行する方法を説明し ます。各 Vivado IDE 操作の下に、 同等の Tcl コマン ド を示し ます。

Tcl コマン ド の詳細および Tcl の使用方法は、 次のガイ ド を参照し て く ださい。

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

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

合成設定 デザイ ンの合成オプシ ョ ンを設定するには、 次の手順に従います。

1. Flow Navigator で [Synthesis] → [Synthesis Settings] を ク リ ッ ク し ます (図 1-1)。

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

X-Ref Target - Figure 1-1

図 1-1 : Flow Navigator : [Synthesis] セクシ ョ ン

合成 japan.xilinx.com 7UG901 (v2015.3) 2015 年 9 月 30 日

Page 8: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

2. [Project Settings] ダ イ ア ロ グ ボ ッ ク スで、 次のよ う に設定し ます。

a. [Synthesis] ページの [Constraints] で、 [Default constraint set] にア ク テ ィ ブな制約セ ッ ト とする制約セ ッ ト を選 択し ます。 制約セ ッ ト は、 ザイ リ ン ク ス デザイ ン制約 (XDC) で記述されたデザイ ン制約を含む複数の制約 フ ァ イルのセ ッ ト です。 デザイ ン制約には、 次の 2 種類があ り ます。

- 物理制約 : ピン配置、 ブロ ッ ク RAM、 LUT、 フ リ ッ プフ ロ ッ プなどのセルの絶対配置または相対配置、 およびデバイ スのコ ンフ ィ ギュ レーシ ョ ン設定を定義し ます。

- タ イ ミ ング制約 : デザイ ンの周波数要件を定義し ます。 タ イ ミ ング制約を設定し ない場合、 デザイ ンが ワ イヤの長さおよび配線の密集度にのみ基づいて 適化されます。

制約の整理の詳細は、 『Vivado Design Suite ユーザー ガイ ド : 制約の使用』 (UG903) [参照 9] の 「制約の整理」 を参照し て く ださい。

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

ターゲッ ト 制約セ ッ ト を設定する Tcl コマン ド

-constrset <arg>

X-Ref Target - Figure 1-2

図 1-2 : [Project Settings] ダイアログ ボ ッ クス

合成 japan.xilinx.com 8UG901 (v2015.3) 2015 年 9 月 30 日

Page 9: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

b. [Options] エ リ アで、 [Strategy] ド ロ ッ プダウ ン リ ス ト から合成 run に使用する合成ス ト ラ テジを選択し ます。 次の図に示す定義済みス ト ラ テジがあ り ます。

あ らかじめ定義されたス ト ラ テジから選択するか、 または独自のス ト ラ テジを定義でき ます。 合成ス ト ラ テジを選択する と、 使用可能な Vivado ス ト ラ テジがダ イ ア ロ グ ボ ッ ク スに表示されます。 オプシ ョ ンの値を 変更する と、 11 ページの 「run ス ト ラ テジの作成」 に説明されている よ う に、 合成ス ト ラ テジの設定を変更 でき ます。 34 ページの表 1-2 に、 各ス ト ラ テジ と その設定を示し ます。

c. 表示されているオプシ ョ ンを選択し ます。 次のオプシ ョ ンがあ り ます。

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

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

Tcl ス ク リ プ ト の詳細は、『Vivado Design Suite ユーザー ガイ ド : Tcl ス ク リ プ ト 機能の使用』 (UG894) [参 照 4] の 「Tcl フ ッ ク ス ク リ プ ト の定義」 を参照し て く ださい。

現在のプロ ジェ ク ト または現在の run の DIRECTORY プロパテ ィ を使用し て、 ス ク リ プ ト 内の相対パス を定義でき ます。

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

- get_property DIRECTORY [current_project] - get_property DIRECTORY [current_run]

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

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

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

- [rebuilt] : 階層をフ ラ ッ ト 化し て合成を実行し た後に、 元の RTL に基づいて階層を再構築し ます。 この 設定を使用する と、 境界を越えた 適化を実行でき るので QoR が向上し、 終的な階層は RTL と似た ものになるので解析しやす く な り ます。

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

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

X-Ref Target - Figure 1-3

図 1-3 : 定義済みス ト ラ テジ

合成 japan.xilinx.com 9UG901 (v2015.3) 2015 年 9 月 30 日

Page 10: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

- [-bufg] : デザイ ンで推論可能な BUFG の 大数を指定し ます。 このオプシ ョ ンは、 デザイ ン ネ ッ ト リ ス ト のほかの BUFG が合成プロセスで認識されない場合に使用し ます。

RTL にイ ン ス タ ンシエー ト されている BUFG の数が検出され、 指定された数までの BUFG が推論され ます。 た と えば、 –bufg オプシ ョ ンを 12 に設定し、 RTL に 3 つの BUFG がイ ン ス タ ンシエー ト されて いる とする と、 あ と 9 個の BUFG を推論可能です。

- [-fanout_limit] : 信号で駆動可能な ロード の 大数を指定し ます。 ロード の数がこれよ り 大き く なる場合 は、 ロ ジ ッ ク が複製されます。 このグ ローバル設定は一般的なガイ ド ラ イ ンであ り 、 ツールで必要と判断された場合は無視されます。 制限を強制する必要があ る場合は、 第 2 章 「合成属性」 に説明されてい る MAX_FANOUT を参照し て く ださ い。

注記 : -fanout_limit オプシ ョ ンは、 制御信号 (セ ッ ト 、 リ セ ッ ト 、 ク ロ ッ ク イネーブルなど) には適 用されません。 これらの信号を複製する必要があ る場合は、 MAX_FANOUT を使用し て く ださい。

- [-directive] : [-effort_level] に置き換わるオプシ ョ ンで、 Vivado 合成の 適化方法を指定し ます。 設定可 能な値は [Default] と [RuntimeOptimized] です。 [RuntimeOptimized] を選択する と、 合成が 適化を少な く し て高速に実行されます。

- [-fsm_extraction] : 有限ステー ト マシンの抽出およびマ ッ プ方法を指定し ます。 オプシ ョ ンについては、 40 ページの 「FSM_ENCODING」 を参照し て く ださい。

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

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

- [-control_set_opt_threshold] : ク ロ ッ ク イネーブル 適化のし きい値を設定し、 制御セ ッ ト の数を削減し ます。 デフ ォル ト は auto で、 ターゲ ッ ト デバイ スに基づいてツールによ り 値が選択されます。 有効な 値は正の整数です。

制御セ ッ ト を レジス タの D ロ ジ ッ ク に移動する ために必要なフ ァ ンア ウ ト の数を指定し ます。 フ ァ ン ア ウ ト が指定の値よ り 大きい場合は、 その信号でレジス タの制御セ ッ ト ピ ンが駆動される よ う 試みら れます。

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

- [-shreg_min_size] : SRL の推論のし きい値を設定し ます。 デフ ォル ト 値は 3 です。 この値は、 遅延が固定 されたチェーンの SRL (ス タ テ ィ ッ ク SRL) が推論される順次エレ メ ン ト の数を設定し ます。 ス ト ラ テ ジでは、 これは 5 および 10 に も設定されます。 すべてのス ト ラ テジ と その設定は、 34 ページの表 1-2 を参照し て く ださい。

- [-max_bram] : デザイ ンで使用可能なブロ ッ ク RAM の 大数を指定し ます。 このオプシ ョ ンは通常、 デ ザイ ンにブラ ッ ク ボ ッ ク ス またはサード パーテ ィ ネ ッ ト リ ス ト が含まれてお り 、 これらのネ ッ ト リ ス ト 用にエ リ アを確保するために使用し ます。

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

- [-max_dsp] : デザイ ンで使用可能な DSP ブロ ッ ク の 大数を指定し ます。 このオプシ ョ ンは通常、 デザ イ ンにブラ ッ ク ボ ッ ク ス またはサー ド パーテ ィ ネ ッ ト リ ス ト が含まれてお り 、 これらのネ ッ ト リ ス ト 用にエ リ アを確保するために使用し ます。

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

- [-cascade_dsp] : DSP ブロ ッ ク出力の合計の加算を イ ンプ リ メ ン ト する方法を制御し ます。 デフ ォル ト で は、 DSP 出力の合計はブロ ッ ク のビル ト イ ン加算チェーンを使用し て算出されます。 [tree] に設定する と、 合計はフ ァブ リ ッ ク にイ ンプ リ メ ン ト されます。 設定可能な値は [auto]、 [tree]、 [force] で、 デフ ォ ル ト は [auto] です。

合成 japan.xilinx.com 10UG901 (v2015.3) 2015 年 9 月 30 日

Page 11: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

run ス ト ラ テジの作成

ス ト ラ テジは、 合成ツールおよびイ ンプ リ メ ンテーシ ョ ンで実行される さ ま ざ まなユーテ ィ リ テ ィ やプロ グ ラ ムのオプシ ョ ンのあ ら か じめ定義されたセ ッ ト です。 各 メ ジ ャー リ リ ースには、 そのバージ ョ ン専用のス ト ラ テジがあ り ます。

1. 既存のス ト ラ テジを使用するには、 [Project Settings] ダ イ ア ロ グ ボ ッ ク スの [Synthesis] ページで [Strategy] から ス ト ラ テジを選択し て [OK] を ク リ ッ ク し ます。

2. 既存のス ト ラ テジを変更するには、 [Project Settings] ダ イ ア ロ グ ボ ッ ク スの [Synthesis] ページで定義済みのス ト ラ テジを選択し て変更し た後、 [Save Strategy As] ボタ ン を ク リ ッ ク し ます。

次の図に示す [Save Strategy As] ダ イ ア ロ グ ボ ッ ク スが表示されます。

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

[User defined strategies] には、 既に作成されているユーザー定義ス ト ラ テジが リ ス ト されます。

4. [OK] を ク リ ッ ク し ます。

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

カ ス タ ム ス ト ラ テジは、 [Vivado Options] ダ イ ア ロ グ ボ ッ ク スの [Strategies] ページから作成する こ と も でき ます。 こ のページからは、 既存のス ト ラ テジのコ ピーを作成し て変更するか、 新規ス ト ラ テジを作成でき ます。

1. [Tools] → [Options] を ク リ ッ ク し、 左側のペイ ンで [Strategies] を ク リ ッ ク し ます。

2. [Flow] ド ロ ッ プダウ ン リ ス ト から [Vivado Synthesis] を選択し、 既存のス ト ラ テジのいずれかを選択し ます。

X-Ref Target - Figure 1-4

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

合成 japan.xilinx.com 11UG901 (v2015.3) 2015 年 9 月 30 日

Page 12: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

3. 次のいずれかを実行し ます。

° ツールバーの [Create New Strategy of this Strategy] ボタ ン を ク リ ッ ク し、 既存のス ト ラ テジのコ ピーを 作成し ます。 必要に応じ てコ ピーに変更を加え、 [Apply] を ク リ ッ ク し ます。

° ツールバーの [Create New Strategy] ボタ ン を ク リ ッ ク し、[New Strategy] ダ イ ア ロ グ ボ ッ ク ス (図 1-6) を開き ます。

[New Strategy] ダ イ ア ロ グ ボ ッ ク スでス ト ラ テジの名前 ([Name])、ス ト ラ テジのタ イプ ([Type])、ツール バー ジ ョ ン ([Tool version]) を指定し ま す。 説明 ([Description]) も入力でき ます。 [OK] を ク リ ッ ク し ます。

作成し たス ト ラ テジは、 [User Defined Strategies] の下に表示されます。

X-Ref Target - Figure 1-5

図 1-5 : Vivado ス ト ラテジ

X-Ref Target - Figure 1-6

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

合成 japan.xilinx.com 12UG901 (v2015.3) 2015 年 9 月 30 日

Page 13: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

合成への入力

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

RTL または制約フ ァ イルを追加するには、 次の手順に従います。

1. Flow Navigator で [Project Manager] → [Add Sources] を ク リ ッ ク し、 Add Sources ウ ィ ザード (図 1-7) を開き、 追加 する フ ァ イルに対応するオプシ ョ ンをオンにし ます。図 1-8 は、 初のページで [Add or Create Design Sources] を オンにし て [Next] を ク リ ッ ク し た と きに表示される [Add or Create Design Sources] ページを示し ます。

X-Ref Target - Figure 1-7

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

X-Ref Target - Figure 1-8

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

合成 japan.xilinx.com 13UG901 (v2015.3) 2015 年 9 月 30 日

Page 14: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

2. 制約、 RTL、 またはその他のプロ ジェ ク ト フ ァ イルを追加し ます。 RTL ソース プロ ジェ ク ト 作成の詳細は、 『Vivado Design Suite ユーザー ガイ ド : システム レベル デザイ ン入力』 (UG895) [参照 15] の 「RTL プロ ジェ ク ト の作成」 を参照し て く ださい。

Vivado 合成では、 ザイ リ ン ク ス ツールでサポー ト される VHDL、 Verilog、 または SystemVerilog のフ ァ イルの合成可 能なサブセ ッ ト を読み込むこ と ができ ます。

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

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

• 第 4 章 「VHDL サポー ト 」

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

• 第 6 章 「Verilog サポー ト 」

• 第 7 章 「SystemVerilog サポー ト 」

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

Vivado 合成では、 合成での処理を制御するい く つかの RTL 属性も サポー ト さ れています。 これら の属性の説明は、 第 2 章 「合成属性」 を参照し て く ださい。

Vivado 合成は、 タ イ ミ ング制約に XDC フ ァ イルが使用されます。

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

フ ァ イルのコ ンパイル順

あ る フ ァ イルに宣言が含まれ、別のフ ァ イルがその宣言に依存し ている場合、特定のコ ンパイル順が必要にな り ます。Vivado IDE では、 RTL ソース フ ァ イルのコ ンパイル順は、 [Sources] ウ ィ ン ド ウの [Compile Order] ビ ューに上から下 への順序で表示されます。

Vivado ツールでは、 上位モジュール と し て 適なモジュールが自動的に特定され、 コ ンパイル順が自動的に管理さ れます。ア ク テ ィ ブ階層に含まれる 上位モジュール フ ァ イルおよびすべてのソース フ ァ イルが、合成およびシ ミ ュ レーシ ョ ンで正しい順序で使用されます。

[Sources] ウ ィ ン ド ウのポ ッ プア ッ プ メ ニ ューには [Hierarchy Update] コ マン ド があ り 、 上位モジ ュールへの変更、 デザイ ンのソース フ ァ イルへの変更などの処理方法を指定し て階層をア ッ プデー ト でき ます。

デフ ォル ト 設定は [Automatic Update and Compile Order] で、 次のよ う に処理されます。

• [Compile Order] ビ ューに示すよ う にコ ンパイル順が管理されます。

• [Hierarchy] ビ ューにどのモジュールが使用され、 階層ツ リ ーのど こに位置するかが表示されます。

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

合成の前にコ ンパイル順を変更するには、 次の手順に従います。

1. フ ァ イルを選択し て右ク リ ッ ク し、 [Hierarchy Update] → [Automatic Update, Manual Compile Order] を ク リ ッ ク し て、 デザイ ンに 適な 上位モジュールが自動的に選択され、 コ ンパイル順は手動で指定でき る よ う にし ます。

手動コ ンパイル順はデフ ォル ト ではオフです。 [Sources] ウ ィ ン ド ウの [Compile Order] ビ ューでフ ァ イルを選択 し て移動する と 、 手動コ ンパイル順をオンにするかど う かを尋ねる次の図に示すダ イ ア ロ グ ボ ッ ク スが表示さ れます。

合成 japan.xilinx.com 14UG901 (v2015.3) 2015 年 9 月 30 日

Page 15: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

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

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

デザイ ン フ ローの詳細は、 『Vivado Design Suite ユーザー ガイ ド : Vivado IDE の使用』 (UG893) [参照 2] の 「使用 モデル」 を参照し て く ださい。

グローバル イ ン クルー ド フ ァ イルの定義 Vivado IDE では、 1 つまたは複数の Verilog または Verilog ヘッ ダー フ ァ イルをグ ローバル イ ン クルー ド フ ァ イル と し て指定でき ます。 これらのフ ァ イルは、 ほかのソースの前に処理されます。

Verilog では通常、 別の Verilog フ ァ イルやヘッ ダー フ ァ イルからの内容を参照する Verilog ソース フ ァ イルの冒頭に `include 文を含める必要があ り ます。 共通ヘッ ダー フ ァ イルを使用するデザイ ンでは、 複数の Verilog ソースにそ れぞれ複数の `include 文を含める必要があ る場合も あ り ます。

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

1. [Sources] ウ ィ ン ド ウでフ ァ イルを右ク リ ッ ク し ます。

2. [Set Global Include] を ク リ ッ ク し ます。 または、 [Source File Properties] ウ ィ ン ド ウの [Properties] ビ ューで [IS_GLOBAL_INCLUDE] チェ ッ ク ボ ッ ク ス をオンにし ます。

X-Ref Target - Figure 1-9

図 1-9 : Move Sources Option

X-Ref Target - Figure 1-10

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

合成 japan.xilinx.com 15UG901 (v2015.3) 2015 年 9 月 30 日

Page 16: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

ヒ ン ト : Verilog では、 1 つの Verilog ソースのみに適用するヘッ ダー フ ァ イル (特定の `define マ ク ロ など) は、 グ ローバル イ ン クルード フ ァ イル と し て指定するのではな く `include 文を使用し て参照する必要があ り ます。

[Sources] ウ ィ ン ド ウの詳細は、『Vivado Design Suite ユーザー ガ イ ド : Vivado IDE の使用』 (UG893) [参照 2] の「[Sources] ウ ィ ン ド ウ」 を参照し て く ださい。

X-Ref Target - Figure 1-11

図 1-11 : [Source File Properties] ウ ィ ン ド ウ

合成 japan.xilinx.com 16UG901 (v2015.3) 2015 年 9 月 30 日

Page 17: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

合成の実行

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

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

• 適用する制約セ ッ ト

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

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

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

1. メ イ ン メ ニューから [Flow] → [Create Runs] を ク リ ッ クするか、[Create Runs] ボタ ン を ク リ ッ ク し ます。

Create New Runs ウ ィ ザード が開き ます。

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

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

X-Ref Target - Figure 1-12

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

合成 japan.xilinx.com 17UG901 (v2015.3) 2015 年 9 月 30 日

Page 18: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

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

Vivado IDE にはデフ ォル ト のス ト ラ テジが含まれています。 ス ト ラ テジ run には、 特定の名前を指定するか、 デ フ ォル ト 名 (synth_1、 synth_2 など) を使用し ます。 カ ス タ ム ス ト ラ テジの作成方法は、 11 ページの 「run ス ト ラ テジの作成」 を参照し て く ださい。

制約の詳細は、 『Vivado Design Suite ユーザー ガイ ド : 制約の使用』 (UG903) [参照 9] の 「XDC 制約について」 を 参照し て く ださい。

制約の処理順の詳細は、 『Vivado Design Suite ユーザー ガイ ド : 制約の使用』 (UG903) [参照 9] の 「IP コアを含む場 合の制約フ ァ イルの順序」 を参照して く ださい。

一部の制約がプロ ジェ ク ト 用に処理される と、 それらの制約属性はデザイ ンの 「プロパテ ィ 」 と な り ます。 プロパテ ィ の詳細は、 『Vivado Design Suite プロパテ ィ リ フ ァ レ ン ス ガイ ド』 (UG912) [参照 12] を参照し て く ださい。

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

X-Ref Target - Figure 1-13

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

X-Ref Target - Figure 1-14

図 1-14 : [Launch Options] ページ

合成 japan.xilinx.com 18UG901 (v2015.3) 2015 年 9 月 30 日

Page 19: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

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

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

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

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

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

重要 : [Launch runs on remote host] オプシ ョ ンは、 Linux でのみ表示されます。

Linux の リ モー ト ホス ト での run の実行については、 『Vivado Design Suite ユーザー ガ イ ド : イ ンプ リ メ ンテーシ ョ ン』 (UG904) [参照 5] の「 リ モー ト ホス ト および LSF の使用」を参照し て く ださい。[Configure Hosts] を ク リ ッ クする と、 ホス ト を設定する ダ イ ア ロ グ ボ ッ ク スが開き ます。

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

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

4. [Finish] を ク リ ッ ク し て run を作成し ます。 作成し た run を実行する と、 図 1-15 に示す [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] を ク リ ッ ク し ます。

X-Ref Target - Figure 1-15

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

合成 japan.xilinx.com 19UG901 (v2015.3) 2015 年 9 月 30 日

Page 20: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

アク テ ィ ブ 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] ダ イ ア ロ グ ボ ッ ク スが開き ます。 このダ イ ア ロ グ ボ ッ ク スで、 run を ローカル ホス ト または リ モー ト ホス ト で 実行するか、 あ るいはス ク リ プ ト を生成するかを指定でき ます。

リ モー ト ホス ト の使用については、『Vivado Design Suite ユーザー ガイ ド : イ ンプ リ メ ンテーシ ョ ン』 (UG904) [参照 5] の 「 リ モー ト ホス ト および LSF の使用」 を参照し て く ださい。

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

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

HDL オブジェ ク ト を独立階層モジュール と し てア ウ ト オブ コ ンテキス ト (OOC) フ ローを実行する こ と によ り 、ボ ト ムア ッ プ フ ローを設定でき ます。 OOC フ ローの概要は、 『Vivado Design Suite ユーザー ガイ ド : デザイ ン フ ローの概 要』 (UG892) [参照 8] の 「ア ウ ト オブ コ ンテキス ト デザイ ン フ ロー」 を参照し て く ださい。

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

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

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

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

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

OOC run 用にモジ ュールを設定するには、 次の手順に従います。

1. [Sources] ウ ィ ン ド ウの [Hierarchy] ビ ューでモジ ュールを右ク リ ッ ク し、 [Set as Out-of Context for Synthesis] を ク リ ッ ク し ます。

X-Ref Target - Figure 1-16

図 1-16 : [Set as Out-of Context for Synthesis] コ マン ド

合成 japan.xilinx.com 20UG901 (v2015.3) 2015 年 9 月 30 日

Page 21: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

次の図に示す [Set as Out-of Context for Synthesis] ダ イ ア ロ グ ボ ッ ク スが開き ます。

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

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

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

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

° [Clock Constraint File] : 新しい XDC テンプレー ト が作成される よ う にするか、 ド ロ ッ プダウ ン リ ス ト から既 存の XDC フ ァ イルを選択し てその XDC フ ァ イルがこのフ ァ イルセ ッ ト にコ ピーされる よ う に設定し ます。 この XDC フ ァ イルには、 OOC モジ ュールのすべてのク ロ ッ ク ピンの ク ロ ッ ク定義が含まれます。

推奨 : [Generate Stub] オプシ ョ ンはオンのま まにし て く ださい。 こ のオプシ ョ ンをオフにし た場合は、 ス タブ フ ァ イ ルを作成し、 プロ ジェ ク ト で設定する必要があ り ます。

2. [OK] を ク リ ッ ク し ます。

OOC run が自動的に設定されます。作成された OOC run は [Design Runs] ウ ィ ン ド ウに新しい run と し て表示され ます。 OOC と し て設定し たモジュールは、 [Sources] ウ ィ ン ド ウの [Compile Order] ビ ューで [Block Sources] の下 に表示されます。

X-Ref Target - Figure 1-17

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

X-Ref Target - Figure 1-18

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

合成 japan.xilinx.com 21UG901 (v2015.3) 2015 年 9 月 30 日

Page 22: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

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

この run を実行するには、 run を右ク リ ッ ク し て [Launch Runs] を ク リ ッ ク し ます (20 ページの 「合成 run の実行」 を 参照)。 これによ り 下位モジ ュールが 上位モジ ュール と し て設定され、 I/O バッ フ ァーを作成せずに合成が実行され ます。

注記 : 解析目的で、 右ク リ ッ ク し て イ ンプ リ メ ンテーシ ョ ン も実行でき ます。 これには、 ク ロ ッ ク ツ リ ーが配線され ていないので、 正確な タ イ ミ ングは含まれません。 ツールで ク ロ ッ ク が配線される よ う にするには、 XDC フ ァ イル で各ク ロ ッ ク の OOC レベルに次のコマン ド を使用し ます。

set_property HD.CLK_SRC_BUFGCTRL_X0Y0 [get_ports <clk_port_name>]

注記 : 詳細は、 『Vivado Design Suite ユーザー ガイ ド : 階層デザイ ン』 (UG905) [参照 6] を参照し て く ださい。

重要 : イ ンプ リ メ ン ト 済み IP は解析専用で、 上位デザイ ンの合成またはイ ンプ リ メ ンテーシ ョ ンには使用されませ ん。 IP の イ ンプ リ メ ン ト 済みバージ ョ ンの使用については、 『Vivado Design Suite ユーザー ガ イ ド : 階層デザ イ ン』 (UG905) [参照 6] を参照し て く ださい。

合成で生成されたネ ッ ト リ ス ト が保存され、ス タブ フ ァ イルを作成するオプシ ョ ンをオンにし た場合は後で使用でき る よ う にス タブ フ ァ イルが作成されます。 ス タブ フ ァ イルは、 ブラ ッ ク ボ ッ ク ス属性が設定された、 入力と出力を 持つ下位モジュールです。

上位モジュールを再実行する と、ボ ト ムア ッ プ合成によ り ス タブ フ ァ イルがフ ローに挿入され、下位モジュールが ブラ ッ ク ボ ッ ク ス と し てコ ンパイルされます。 イ ンプ リ メ ンテーシ ョ ン run では下位ネ ッ ト リ ス ト が挿入され、 デザ イ ンを完了し ます。

注意 : OOC モジュールの下位に OOC モード のザイ リ ン ク ス IP が含まれる場合は、ボ ト ムア ッ プ OOC フ ローを使用 し ないで く ださい。OOC モジュールにザイ リ ン ク ス IP を含める場合は、 IP の OOC モード をオフにし て く ださい。 ま た、 OOC モジュールにパラ メ ーターが設定されている場合や、 OOC モジュールのポー ト がユーザー定義タ イプであ る場合も、 このフ ローを使用し ないで く ださい。 これらの状況では、 フ ローの後の方で問題が発生し ます。

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

ボ ト ムア ッ プ フ ローを手動で実行するには、 下位ネ ッ ト リ ス ト またはサード パーテ ィ ネ ッ ト リ ス ト をブラ ッ ク ボ ッ ク ス と し て イ ン ス タ ンシエー ト し ます。 こ のよ う にする と、 Vivado ツールによ り 合成の完了後にデザイ ンにブラ ッ ク ボ ッ ク スが挿入されます。 次のセ ク シ ョ ンで、 このプロセスについて説明し ます。

重要 : Vivado 合成では、 暗号化されている場合でも されていない場合でも、 合成済みネ ッ ト リ ス ト は合成または 適 化されません。 そのため、 XDC 制約または合成属性はイ ンポー ト された コ ア ネ ッ ト リ ス ト には影響し ません。 また、 デフ ォル ト ではコ アのネ ッ ト リ ス ト が読み込まれて イ ン ス タ ンシエー ト 済みコ ンポーネン ト が変更さ る こ と はあ りません。 ただし、 セキ ュ ア IP の RTL は合成されるので、 制約が合成結果に影響し ます。

合成 japan.xilinx.com 22UG901 (v2015.3) 2015 年 9 月 30 日

Page 23: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

下位ネ ッ ト リ ス ト の作成

下位ネ ッ ト リ ス ト を作成するには、 ネ ッ ト リ ス ト を 上位モジュール と し て指定し てプロ ジェ ク ト を設定し ます。 合成を実行する前に、 次の図に示すよ う に OOC モード を設定し ます。

この設定によ り 、 合成でこのレベルに I/O バッ フ ァーは挿入されません。

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

write_edif <design_name>.edf

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

上位デザイ ンを下位ネ ッ ト リ ス ト またはサード パーテ ィ ネ ッ ト リ ス ト と共に実行するには、下位ネ ッ ト リ ス ト をブ ラ ッ ク ボ ッ ク ス と し て イ ン ス タ ンシエー ト し ます。 これには、 下位ネ ッ ト リ ス ト のポー ト を Vivado ツールに示す必 要があ り ます。 20 ページの 「ボ ト ムア ッ プ ア ウ ト オブ コ ンテキス ト フ ローの設定」 では、 これを ス タブ フ ァ イル と呼んでいま し た。

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

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

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

end component;

X-Ref Target - Figure 1-19

図 1-19 : [Project Settings] ダイアログ ボ ッ クスの [Synthesis] ページの [More Options] フ ィ ールド

合成 japan.xilinx.com 23UG901 (v2015.3) 2015 年 9 月 30 日

Page 24: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

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 コマン ド を使用し ます。

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|.vhd) が作成されます。 こ のス タブ HDL フ ァ イルをサード パー テ ィ 合成ツールで使用し て、 IP のブラ ッ ク ボ ッ ク ス を推論し ます。

ス タブ フ ァ イルには、 I/O バッ フ ァーが推論されないよ う にする指示子が含まれています。 ほかの合成ツールの 指示子をサポー ト するには、 これらのフ ァ イルを変更する必要があ る場合があ り ます。

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

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

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

Vivado IDE で合成またはイ ンプ リ メ ンテーシ ョ ンを実行する と、 ダ イ ア ロ グ ボ ッ ク スにプロ セス をバッ ク グ ラ ウ ン ド で実行するオプシ ョ ンが表示されます。 run をバッ ク グ ラ ウ ン ド に移動する と、 レポー ト を表示する など、 Vivado IDE でほかの機能を実行でき る よ う にな り ます。

合成 japan.xilinx.com 24UG901 (v2015.3) 2015 年 9 月 30 日

Page 25: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

合成実行の監視

合成 run のステータ スは、 次の図に示す [Log] ウ ィ ン ド ウで確認し ます。 合成中にこ のウ ィ ン ド ウに表示される メ ッ セージは、 合成ロ グ フ ァ イルにも含まれます。

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

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

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

° [Open Synthesized Design] : 合成済みネ ッ ト リ ス ト 、 ア ク テ ィ ブな制約セ ッ ト 、 ターゲ ッ ト デバイ ス を合成済 みデザイ ン環境で開き、 I/O ピン配置、 デザイ ン解析、 フ ロ アプラ ンを実行でき る よ う にし ます。

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

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

X-Ref Target - Figure 1-20

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

X-Ref Target - Figure 1-21

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

合成 japan.xilinx.com 25UG901 (v2015.3) 2015 年 9 月 30 日

Page 26: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

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

合成結果の解析

合成が終了し た ら、 合成レポー ト を表示し、 合成済みデザイ ンを開いて解析でき ます。 [Reports] ウ ィ ン ド ウには、 合 成およびイ ンプ リ メ ンテーシ ョ ンで生成されたレポー ト の リ ス ト が表示されます。

[Reports] ウ ィ ン ド ウ を開き、 レポー ト を開いて特定の run の詳細を確認し ます。

X-Ref Target - Figure 1-22

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

合成 japan.xilinx.com 26UG901 (v2015.3) 2015 年 9 月 30 日

Page 27: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

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

Vivado IDE には、 デザイ ンを さ まざまな面から解析する環境が含まれています。 合成済みデザイ ンを開 く と、 合成済 みネ ッ ト リ ス ト 、 ア ク テ ィ ブな制約セ ッ ト 、 およびターゲ ッ ト デバイ スが読み込まれます。

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

または、 メ イ ン メ ニューから [Flow] → [Open Synthesized Design] を ク リ ッ ク し て も同じ動作を実行でき ます。

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

こ の環境か ら、 デザ イ ン ロ ジ ッ ク と 階層の確認、 リ ソ ース使用率およびタ イ ミ ン グ予測の表示、 デザ イ ン ルール チェ ッ ク (DRC) を実行でき ます。

詳細は、 『Vivado Design Suite ユーザー ガイ ド : デザイ ン解析およびク ロージ ャテ ク ニ ッ ク』 (UG906) [参照 10] を参照 し て く ださい。

X-Ref Target - Figure 1-23

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

合成 japan.xilinx.com 27UG901 (v2015.3) 2015 年 9 月 30 日

Page 28: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

レポー ト の表示Vivado 合成を実行する と、 [Reports] ウ ィ ン ド ウから Vivado 合成レポー ト および使用率レポー ト を表示でき ます。

ロジ ッ クの解析Vivado IDE では、 ロ ジ ッ ク を解析する ウ ィ ン ド ウが複数あ り ます。 1 つのウ ィ ン ド ウで選択し た情報はほかのウ ィ ン ド ウでも選択される よ う になってお り 、 必要な情報をすばや く 見つける こ と ができ ます。

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

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

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

ロジ ッ ク階層の表示

[Netlist] ウ ィ ン ド ウには、 合成済みデザイ ンのロ ジ ッ ク階層が表示されます。 ネ ッ ト リ ス ト 内のロ ジ ッ ク イ ン ス タ ン ス またはネ ッ ト を、 展開し て選択でき ます。

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

[Sources] ウ ィ ン ド ウの [Hierarchy] ビ ューには、 RTL ロ ジ ッ ク階層がグ ラ フ ィ カルに表示されます。 各モジ ュールの 大き さが、その他のモジュールに相対的な比率で表示されるので、選択し た ロ ジ ッ ク モジ ュールのサイ ズや位置を判 断でき ます。

[Sources] ウ ィ ン ド ウの [Hierarchy] ビ ューを開 く には、 次の手順に従います。

1. [Netlist] ウ ィ ン ド ウ を右ク リ ッ ク し ます。

2. 次の図に示す [Show Hierarchy] を ク リ ッ ク し ます。 F6 キーを押し て も [Hierarchy] ビ ューを開 く こ と ができ ます。

X-Ref Target - Figure 1-24

図 1-24 : 合成後の [Reports] ウ ィ ン ド ウ

合成 japan.xilinx.com 28UG901 (v2015.3) 2015 年 9 月 30 日

Page 29: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

ロジ ッ ク回路図の解析

[Schematic] ウ ィ ン ド ウでは、 選択し た ロ ジ ッ ク を展開し て表示でき ます。 [Schematic] ウ ィ ン ド ウ を表示するには、 少 な く と も 1 つのロ ジ ッ ク オブジェ ク ト を選択する必要があ り ます。

[Schematic] ウ ィ ン ド ウで、 任意のロ ジ ッ ク を選択および表示し ます。 タ イ ミ ング パスのグループを表示し て、 その パス上のすべてのイ ン ス タ ン ス を表示でき ます。 これによ り 、 タ イ ミ ング ク リ テ ィ カルなモジュールが含まれる箇所 を視覚的に表示でき るので、 フ ロ アプラ ン しやす く な り ます。

[Schematic] ウ ィ ン ド ウ を開 く には、 次の手順に従います。

1. 1 つまたは複数のイ ン ス タ ン ス、 ネ ッ ト 、 タ イ ミ ング パス を選択し ます。

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

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

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

X-Ref Target - Figure 1-25

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

X-Ref Target - Figure 1-26

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

合成 japan.xilinx.com 29UG901 (v2015.3) 2015 年 9 月 30 日

Page 30: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

タ イ ミ ング解析の実行

合成済みデザイ ンのタ イ ミ ング解析は、 イ ンプ リ メ ンテーシ ョ ンを効率的に実行するために必要な制約がパスに設定されているかど う かを確認するのに有益です。 Vivado 合成はタ イ ミ ング ド リ ブンであ り 、 設定し た制約に基づいて 出力が調整されます。

Pblock や LOC 制約のよ う な物理制約をデザイ ンに割 り 当ててい く と、 よ り 正確な タ イ ミ ング解析結果が得られる よ う にな り ますが、 これらの結果に含まれるのはパス遅延の予測値です。 合成済みデザイ ンでは、 予測される配線遅延を使用し て解析が実行されます。

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

重要 : 実際の配線遅延が含まれるのは、 イ ンプ リ メ ンテーシ ョ ン (配置配線) 後のタ イ ミ ング解析のみです。 合成済み デザイ ンのタ イ ミ ング解析は、 イ ンプ リ メ ン ト 済みデザイ ンのタ イ ミ ング解析ほど正確ではあ り ません。

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>] [-seu_max_util <arg>] [-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>] [-keep_equivalent_registers] [-resource_sharing <arg>] [-control_set_opt_threshold <arg>] [-max_bram <arg>] [-max_dsp <arg>] [-cascade_dsp] [-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:

合成 japan.xilinx.com 30UG901 (v2015.3) 2015 年 9 月 30 日

Page 31: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

-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, AreaOptimized_high, AreaMutlThresholdDSP AlternateRoutability FewerCarryChains RunTimeOptimized Default: default [-rtl] Elaborate and open an rtl design [-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, auto Default: auto [-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 [-control_set_opt_threshold] Threshold for synchronous control set optimization to lower number of control sets. Valid values are 'auto', integer 0 to 16. 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

合成 japan.xilinx.com 31UG901 (v2015.3) 2015 年 9 月 30 日

Page 32: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

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 Default: -1[-cascade_dsp] Controls how adders in sum DSP block outputs are implemented. The values are: auto, tree, and force.[-quiet] Ignore command errors[-verbose] Suspend message limits during execution

-generic オプシ ョ ンで VHDL ブール値および std_logic ベク ター型を指定する場合、これらはほかの形式には存 在し ないので特別な処理が必要です。 た と えば、 TRUE、 FALSE、 または 0010 の代わ り に Verilog 標準を使用する必 要があ り ます。

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

-generic my_gen=1‘b0

std_logic ベク ターを値 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) [参照 3] を参照し て く だ さ い。 Vivado IDE での操作に対応する Tcl コマン ド を確認するには、 Vivado IDE でコマン ド を実行し、 [Tcl Console] ウ ィ ン ド ウ またはロ グ フ ァ イルを参照し て く ださい。

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

同時に実行可能なス レ ッ ド の 大数は、 システム上のプロセ ッサ、 OS、 およびフ ローの段階によ って異な り ます。 詳細は、 『Vivado Design Suite ユーザー ガイ ド : イ ンプ リ メ ンテーシ ョ ン』 (UG904) の 「 リ モー ト ホス ト および LSF の使 用」 を参照し て く だ さ い。 Vivado のすべてのス レ ッ ド に共通の Tcl パラ メ ーター general.maxThreads を使用し て、 RTL 合成を実行する際のス レ ッ ド数を指定でき ます。 次に例を示し ます。

Vivado% set_param general.maxThreads <new limit>

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

合成 japan.xilinx.com 32UG901 (v2015.3) 2015 年 9 月 30 日

Page 33: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

Tcl スク リ プ ト 例

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

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

制約の設定

表 1-1 に、Vivado タ イ ミ ング制約にサポー ト される Tcl コマン ド を示し ます。 各コマン ド の リ ン ク を ク リ ッ クする と、 『Vivado Design Suite Tcl コマン ド リ フ ァ レン ス ガイ ド』 (UG835) [参照 3] のコマン ド を説明するページが開き ます。

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

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

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

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

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

表 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

合成 japan.xilinx.com 33UG901 (v2015.3) 2015 年 9 月 30 日

Page 34: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 1 章 : Vivado 合成

合 34UG

erfimized_

igh

PerfThreshholdCarry RuntimeOptimized

built rebuilt none

off off off

12 12 12

400 10,000 10,000

efault FewerCarryChains RunTimeOptimized

e_hot auto off

ン オン オフ

off off auto

uto auto auto

ン オン オフ

5 3 3

-1 -1 -1

-1 -1 -1

uto auto auto

成 japan.xilinx.com901 (v2015.3) 2015 年 9 月 30 日

Vivado であらかじめ定義されている合成ス ト ラ テジ34 ページの表 1-2 に、 各ス ト ラ テジ と その設定を示し ます。

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

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

Optimized_High

Flow_AreaOptimized_

medium

MultiThresholdDSP AltRoutability

POpt

H

-flatten_hierarchy rebuilt rebuilt rebuilt rebuilt rebuilt re

-gated_clock_conversion off off off off off

-bufg 12 12 12 12 12

-fanout_limit 10,000 10,000 400 10,000 10,000

-directive DefaultAreaOptimized

_highDefault

AreaMutlThresholdDSP

AlternateRoutability D

-fsm_extraction auto auto auto auto auto on

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

-resource_sharing auto auto off auto auto

-control_set_opt_threshold auto 1 auto auto auto a

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

-shreg_min_size 3 3 5 3 10

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

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

-cascade_dsp auto auto auto auto auto a

Page 35: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章

合成属性

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

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

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

認識されない属性は、 フ ローの後の方で使用される と想定されます。 た と えば、 LOC 制約は合成では使用されません が、 配置ツールで使用されるので、 合成ツールから転送されます。

サポー ト される属性

ASYNC_REGASYNC_REG 属性は、 Vivado ツール フ ローのさ まざまなプロセスに影響し ます。 この属性は、 レジス タの D 入力ピン でソース ク ロ ッ ク に非同期のデータ を受信でき る こ と、またはレジス タが同期化チェーン内の同期化レジス タであ る こ と を示し ます。

Vivado 合成では、 この属性は DONT_TOUCH 属性と し て処理され、ASYNC_REG プロパテ ィ をネ ッ ト リ ス ト に挿入し ま す。 これによ り 、 ASYNC_REG プロパテ ィ が設定されたオブジェ ク ト が 適化で削除される こ と はな く な り 、 フ ロー の後のほ う のツールで適切に処理されます。

Vivado のほかのツールでこの属性がどのよ う に処理されるかは、 『Vivado Design Suite プロパテ ィ リ フ ァ レ ン ス ガイ ド』 (UG912) [参照 12] の 「ASYNC_REG」 を参照し て く ださい。

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

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

ASYNC_REG の Verilog 例

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

ASYNC_REG の VHDL 例

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

合成 japan.xilinx.com 35UG901 (v2015.3) 2015 年 9 月 30 日

Page 36: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

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

ブ ラ ッ ク ボ ッ ク スのコーデ ィ ング ス タ イルのよ り 詳細な情報は、 138 ページの 「ブラ ッ ク ボ ッ ク ス」 を参照し て く ださい。

CASCADE_HEIGHTCASCADE_HEIGHT 属性は、 ブロ ッ ク RAM に配置される大型 RAM のカ ス ケード チェーンの長さ を指定し ます。 複 数のブロ ッ ク RAM で構成される RAM を記述する と、 Vivado 合成でどのよ う にコ ンフ ィ ギ ュ レーシ ョ ン されるかが 決定されます。

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

この属性は RAM に設定し、 RTL フ ァ イルに含める こ と ができ ます。

値を 0 または 1 に設定する と、 ブロ ッ ク RAM のカ スケード接続がオフにな り ます。

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;

合成 japan.xilinx.com 36UG901 (v2015.3) 2015 年 9 月 30 日

Page 37: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

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

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;

合成 japan.xilinx.com 37UG901 (v2015.3) 2015 年 9 月 30 日

Page 38: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

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;

DONT_TOUCHKEEP または 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 で設定し ておけば、 必ず適用されます。

DONT_TOUCH の Verilog 例

Verilog ワイヤの例

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

合成 japan.xilinx.com 38UG901 (v2015.3) 2015 年 9 月 30 日

Page 39: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

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_logicattribute dont_touch : string;attribute dont_touch of sig1 : signal is "true";........sig1 <= in1 and in2;out1 <= sig1 and in3;

VHDL エンテ ィ テ ィ の例

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

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

end example_dt_vhd;

VHDL コ ンポーネン ト の例

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

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

合成 japan.xilinx.com 39UG901 (v2015.3) 2015 年 9 月 30 日

Page 40: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

FSM_ENCODINGFSM_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_STATEFSM_SAFE_STATE 属性は、ステー ト マシンが不正なステー ト になった と きに次のク ロ ッ ク サイ クルで既知のステー ト にする ロ ジ ッ ク を、 ステー ト マシンに挿入し ます。

た と えば、 "one_hot" エン コー ド に設定されたステー ト マシンが不正な 0101 ステー ト になった場合に回復可能 です。 FSM_ENCODING 属性は、 ステー ト マシン レジス タに設定でき ます。 RTL または XDC で設定でき ます。

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

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

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

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

• "default_state" : ハ ミ ング 2 エン コード検出を使用し て、 ステー ト マシンを RTL で指定されたデフ ォル ト のステー ト (Verilog では case 文の "default" 分岐で指定されたステー ト 、 VHDL では case 文の others 分 岐で指定されたステー ト ) に、 そのステー ト に到達でき ない場合でも強制し ます。

FSM_SAFE_STATE の Verilog 例

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

FSM_SAFE_STATE の VHDL 例

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

合成 japan.xilinx.com 40UG901 (v2015.3) 2015 年 9 月 30 日

Page 41: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

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

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

FULL_CASE の例 (Verilog)

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

endcase

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

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

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

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

GUI のオプシ ョ ンを指定するには、 次の手順に従います。

1. Flow Navigator で [Synthesis Settings] を ク リ ッ ク し ます。

2. [Options] フ ィ ール ド で -gated_clock_conversion オプシ ョ ンを次のいずれかの値に設定し ます。

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

° [on] : gated_clock 属性が RTL コード で設定されている場合に、ゲーテ ッ ド ク ロ ッ ク の変換を実行し ます。 この設定では、 結果を よ り 制御でき ます。

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

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

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

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;

合成 japan.xilinx.com 41UG901 (v2015.3) 2015 年 9 月 30 日

Page 42: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

IOBIOB は合成属性ではな く 、 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_TYPEIO_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;

KEEPKEEP 属性は、 信号が削除された り ロ ジ ッ ク ブロ ッ ク に吸収される よ う な 適化が実行されないよ う に指定し ます。 この属性が設定された信号は保持され、 ネ ッ ト リ ス ト に含まれます。

た と えば、 2 ビ ッ ト の AND ゲー ト の出力で別の AND ゲー ト を駆動する信号に KEEP 制約を設定する と、 信号は両方 の AND ゲー ト を含むよ り 大きい LUT には統合されません。

KEEP は、 タ イ ミ ング制約と も よ く 併用されます。通常は 適化される信号にタ イ ミ ング制約が設定されている場合、 KEEP を設定する と 適化されな く な り 、 正しいタ イ ミ ング規則が使用されます。

注記 : KEEP 属性はモジ ュールまたはエンテ ィ テ ィ のポー ト には設定でき ません。 特定のポー ト を保持する必要があ る場合は、-flatten_hierarchy none を使用するか、モジュールまたはエンテ ィ テ ィ 自体に KEEP を設定し ます。

注意 : RTL で後の方で使用されない信号に KEEP 属性を設定する場合は、 注意が必要です。 合成ではこれらの信号は 保持されますが、 何も駆動し ません。 これによ り 、 フ ローの後の方で問題が発生する可能性があ り ます。

合成 japan.xilinx.com 42UG901 (v2015.3) 2015 年 9 月 30 日

Page 43: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

注意 : 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;

KEEP の例 (VHDL)

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

合成 japan.xilinx.com 43UG901 (v2015.3) 2015 年 9 月 30 日

Page 44: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

KEEP_HIERARCHYKEEP_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 : architecture is "yes";

イ ンス タ ンスの場合

attribute keep_hierarchy : string;attribute keep_hierarchy of u0 : label is "yes";

MARK_DEBUGMARK_DEBUG 属性は、 Vivado ラ ボ ツールを使用し てデバッ グする必要のあ るネ ッ ト に設定し ます。 この属性を設定 し た信号は、 適化で削除される こ と はあ り ません。FPGA の動作中に信号の値を簡単に監視でき る よ う にな り ます。

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

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

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

構文

Verilog 構文

この属性を設定するには、 上位出力ポー ト 宣言の前に適切な Verilog 属性構文を配置し て く ださい。

(* MARK_DEBUG = "{TRUE|FALSE}" *)

Verilog の構文例

// Marks an internal wire for debug(* MARK_DEBUG = "TRUE" *) wire debug_wire,

合成 japan.xilinx.com 44UG901 (v2015.3) 2015 年 9 月 30 日

Page 45: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

VHDL 構文

この属性を設定するには、 上位出力ポー ト 宣言の前に適切な VHDL 属性構文を配置し て く ださい。

VHDL 属性を次のよ う に宣言し ます。

attribute MARK_DEBUG : string;

VHDL 属性を次のよ う に指定し ます。

attribute MARK_DEBUG of signal_name : signal is “{TRUE|FALSE}”;

signal_name は内部信号です。

VHDL の構文例

signal debug_wire : std_logic;attribute MARK_DEBUG : string;-- Marks an internal wire for debugattribute MARK_DEBUG of debug_wire : signal is “TRUE”;

XDC 構文

set_property MARK_DEBUG value [get_nets net_name]

net_name は信号名です。

XDC の構文例

# Marks an internal wire for debugset_property MARK_DEBUG TRUE [get_nets debug_wire]

推奨 : MARK_DEBUG は、階層のピンに設定される こ と がよ く あ り ます。MARK_DEBUG 属性はネ ッ ト に設定する こ と を 意図し た属性なので、 get_nets および get_pins コマン ド の両方を使用する こ と をお勧めし ます。

set_property MARK_DEBUG TRUE [get nets -of [get_pins hier1/hier2/port_name]]

これによ り 、 ネ ッ ト にどのよ う な名前が付いていて も、 指定し たピ ンに接続されているネ ッ ト に MARK_DEBUG が設 定されます。

MAX_FANOUTMAX_FANOUT は、 レジス タおよび信号のフ ァ ンア ウ ト の制限を設定し ます。 こ の属性は、 RTL またはプロ ジ ェ ク ト への入力 と し て指定でき ます。 整数値を指定し ます。

この属性は、 レジス タおよび組み合わせ信号にのみ使用でき ます。 フ ァ ンア ウ ト の制限に従 う ため、 レジス タ または組み合わせ信号を駆動する信号が複製されます。 RTL または XDC で設定でき ます。

MAX_FANOUT は、 合成のグ ローバル オプシ ョ ン -fanout_limit のデフ ォル ト 値よ り も優先されます。 デザイ ン全 体のデフ ォル ト 値は、 [Project Settings] ダ イ ア ロ グ ボ ッ ク スの [Synthesis] ページまたは synth_design コ マン ド の -fanout_limit オプシ ョ ンを使用し て設定し ます。

MAX_FANOUT 属性は強制的に適用されますが、 -fanout_limit はガイ ド ラ イ ン と し て使用され、 強制されません。 フ ァ ンア ウ ト を厳密に制御する必要があ る場合は、 MAX_FANOUT を使用し て く だ さ い。 また、 -fanout_limit オ プシ ョ ン と は異な り 、MAX_FANOUT は制御信号にも適用されます。-fanout_limit オプシ ョ ンは制御信号 (セ ッ ト 、 リ セ ッ ト 、 ク ロ ッ ク イ ネーブル な ど) には適用 さ れ な いの で、 こ れ ら の信号 を 複製す る 必要が あ る 場合は MAX_FANOUT を使用し て く ださい。

合成 japan.xilinx.com 45UG901 (v2015.3) 2015 年 9 月 30 日

Page 46: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

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

重要 : Vivado Design Suite では、 UltraScale デバイ スに対し て NGC フ ォーマ ッ ト のフ ァ イルはサポー ト されていませ ん。 Vivado Design Suite の IP カ ス タマ イ ズ機能でネ イ テ ィ ブ出力フ ァ イルを使用し て IP を再生成する こ と をお勧め し ます。 NGC2EDIF コマン ド を使用し て NGC フ ァ イルを 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 では整数です。

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

• block : RAMB タ イプのコ ンポーネン ト が推論される よ う 指定し ます。

• distributed : LUT RAM が推論される よ う 指定し ます。

• registers : 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;

合成 japan.xilinx.com 46UG901 (v2015.3) 2015 年 9 月 30 日

Page 47: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

attribute ram_style of myram : signal is "distributed";

RAM のコーデ ィ ング ス タ イルの詳細は、 90 ページの 「RAM の HDL コーデ ィ ング手法」 を参照し て く ださい。

ROM_STYLEROM_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 のコーデ ィ ング ス タ イルの詳細は、 144 ページの 「ROM の HDL コーデ ィ ング手法」 を参照して く ださい。

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

SRL_STYLESRL_STYLE 属性は、 SRL メ モ リ の推論方法を指定し ます。 有効な値は次の とお り です。

• register : SRL は推論されず、 レジス タのみが使用されます。

• srl : 前後のレジス タ な しで SRL が推論されます。

• srl_reg : SRL が推論され、 SRL の後にレジス タが 1 つ残されます。

• reg_srl : SRL が推論され、 SRL の前にレジス タが 1 つ残されます。

• reg_srl_reg : SRL が推論され、 SRL の前後にレジス タが 1 つずつ残されます。

合成 japan.xilinx.com 47UG901 (v2015.3) 2015 年 9 月 30 日

Page 48: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

SRL_STYLE 属性は、 SRL に宣言する信号に設定し ます。 RTL でのみ設定可能で、 XDC では現在の と こ ろサポー ト さ れていません。 また、 こ の属性はス タ テ ィ ッ ク SRL にのみ使用可能です。 ダ イナ ミ ッ ク SRL のイ ンデッ ク ス ロ ジ ッ クは SRL コ ンポーネン ト 内にあ るので、 コ ンポーネン ト 外のア ド レ ス を調べるために SRL コ ンポーネン ト の周囲に ロ ジ ッ ク を作成でき ません。

注意 : SRL_STYLE 属性を SHREG_EXTRACT 属性または shreg_min_size コマン ド ラ イ ン オプシ ョ ン と使用する 場合は注意が必要です。 どち ら も SRL_STYLE 属性よ り 優先されます。 た と えば、 SHREG_EXTRACT を no に設定し、 SRL_STYLE を srl_reg に設定する と、 SHREG_EXTRACT が優先され、 レジス タのみが使用されます。

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

TRANSLATE_OFF/TRANSLATE_ONTRANSLATE_OFF および TRANSLATE_ON は、合成でコード のブロ ッ ク を無視する よ う 指定し ます。 これらの属性は、 RTL のコ メ ン ト 内で指定し ます。 コ メ ン ト は、 次のいずれかのキーワード で開始し ます。

• synthesis

• synopsys

• pragma

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 文の間に含める コード の種類には、注意が必要です。デザイ ンの動作に影響する コード の場合、 シ ミ ュ レータで使用され、 シ ミ ュ レーシ ョ ンで不一致が発生する こ と があ り ます。

合成 japan.xilinx.com 48UG901 (v2015.3) 2015 年 9 月 30 日

Page 49: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

USE_DSP48USE_DSP48 は、 合成の演算構造を どのよ う に処理するかを指定し ます。 デフ ォル ト では、 タ イ ミ ングの懸念事項や し きい値制限がなければ、 乗算器、 乗加算器、 乗減算器、 乗累算器タ イプの構造は DSP48 ブロ ッ ク に推論する よ う 試みられます。

加算器、 減算器、 アキ ュ ム レータ も これら のブロ ッ ク に含める こ と はでき ますが、 デフ ォル ト では DSP48 ブロ ッ ク ではな く ロ ジ ッ ク にイ ンプ リ メ ン ト されます。 USE_DSP48 制約を使用する と、 こ のデフ ォル ト 動作が変更され、 こ れらの構造が DSP48 ブロ ッ ク に含まれる よ う にな り ます。

有効な値は、 yes および no です。 この属性は、 RTL の信号、 アーキテ クチャおよびコ ンポーネン ト 、 エンテ ィ テ ィ およびモジュールに指定でき ます。 優先順位は次の とお り です。

1. 信号

2. アーキテ クチャおよびコ ンポーネン ト

3. モジュールおよびエンテ ィ テ ィ

この属性を指定しない場合は、Vivado 合成で 適な動作が決定されます。この属性は RTL または XDC で設定でき ます。

USE_DSP48 の例 (Verilog)(* use_dsp48 = "yes" *) module test(clk, in1, in2, out1);

USE_DSP48 の例 (VHDL)attribute use_dsp48 : string;attribute use_dsp48 of P_reg : signal is "no"

合成 japan.xilinx.com 49UG901 (v2015.3) 2015 年 9 月 30 日

Page 50: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

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 属性の両方が設定されたア イ テムをチェ ッ ク し ます。 カス タ ム属性の使用方法は複数あ り 、属性がレジ ス タに必要な場合 と ネ ッ ト に必要な場合があ るので、 ネ ッ ト がレジス タによ り 駆動されている場合、 カ ス タ ム属性はレジス タおよびネ ッ ト にコ ピーされます。

信号に設定されたカス タム属性の例 (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”;

合成 japan.xilinx.com 50UG901 (v2015.3) 2015 年 9 月 30 日

Page 51: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 2 章 : 合成属性

XDC フ ァ イルでの合成属性の使用一部の合成属性は、 RTL フ ァ イルだけでな く XDC フ ァ イルで も設定でき ます。 通常、 合成の 終段階で使用され、 合成でのロ ジ ッ ク の作成方法を指定する属性は、 XDC フ ァ イルで設定でき ます。 合成の初期段階で使用され、 コ ン パイ ラに影響する属性は、 XDC フ ァ イルでは設定でき ません。

た と えば、 KEEP および DONT_TOUCH 属性は XDC では設定でき ません。 これは、 属性が XDC フ ァ イルか ら読み込 まれた時点では、KEEP または DONT_TOUCH 属性が設定された コ ンポーネン ト が既に 適化で削除されて し ま ってお り 、 存在し ていない可能性があ るか ら です。 そのため、 これらの属性は必ず RTL コー ド で設定し て く だ さ い。 属性 をど こ で設定するかについては、 この章の各属性のセ ク シ ョ ンを参照し て く ださい。

合成属性を XDC で設定するには、 次の構文を使用し ます。

set_property <attribute> <value> <target>

次に例を示し ます。

set_property MAX_FANOUT 15 [get_cells in1_int_reg]

これらの属性は、 エラ ボレー ト 済みデザイ ンでも設定でき ます。 これには、 次の手順に従います。

1. エラ ボレー ト 済みデザイ ンを開き (図 2-1)、 次のいずれかの方法を使用し て、 属性を設定する ア イ テムを選択し ます。

° 回路図でア イ テムを ク リ ッ ク し ます。

° [RTL Netlist] ウ ィ ン ド ウでア イ テムを選択し ます。

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

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

° プロパテ ィ が表示されていない場合は、 右ク リ ッ ク し て [Add Properties] を ク リ ッ クするかツールバーの [Add properties] ボタ ンを ク リ ッ ク し て、 [Add Properties] ダ イ ア ロ グ ボ ッ ク スでプロパテ ィ を選択し ます。

3. プロパテ ィ を設定し た ら、 [File] → [Save Constraints] を ク リ ッ ク し ます。

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

X-Ref Target - Figure 2-1

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

合成 japan.xilinx.com 51UG901 (v2015.3) 2015 年 9 月 30 日

Page 52: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 3 章

HDL コーデ ィ ング手法

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

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

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

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

この章ではコード例を示し ます。 コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

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

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

• パッ ケージ サポー ト

• カ ス タ ム型

• 列挙型

• reg と wire の混乱がない

Verilog の利点• C 言語のよ う な構文

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

• ブロ ッ ク コ メ ン ト

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

合成 japan.xilinx.com 52UG901 (v2015.3) 2015 年 9 月 30 日

Page 53: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

SystemVerilog の利点• コード が Verilog よ り も コ ンパク ト

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

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

• Vivado 合成でサポー ト

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

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

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

• 同期セ ッ ト / リ セ ッ ト

• ク ロ ッ ク イ ネーブル

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

• 順次処理文 (VHDL)

• always ブロ ッ ク (Verilog)

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

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

• ク ロ ッ ク信号

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

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

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

• ク ロ ッ ク

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

• ク ロ ッ ク イ ネーブル

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

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

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

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

° レジス タ を非同期にセ ッ ト または リ セ ッ ト する と、 デバイ ス リ ソースが使用でき な く なるか、 適にコ ン フ ィ ギュ レーシ ョ ン されな く な り ます。

合成 japan.xilinx.com 53UG901 (v2015.3) 2015 年 9 月 30 日

Page 54: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

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

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

• でき る限 り 、 セ ッ ト / リ セ ッ ト ロ ジ ッ ク を使用し ないで く ださい。 初期内容を定義し て回路のグ ローバル リ セ ッ ト を使用する など、 必要な機能を達成でき る コ ス ト が低いその他の方法があ る可能性があ り ます。

• フ リ ッ プフ ロ ッ プ プ リ ミ テ ィ ブのク ロ ッ ク イネーブル、セ ッ ト / リ セ ッ ト 制御入力は常にア ク テ ィ ブ High にし ま す。 ア ク テ ィ ブ Low にする と、 反転ロ ジ ッ ク によ り 回路パフ ォーマン スが悪化する こ と があ り ます。

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

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

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

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

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

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

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

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

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

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

• HDL 合成中に推論されたレジス タの数は、 Design Summary セ ク シ ョ ンのフ リ ッ プフ ロ ッ プ プ リ ミ テ ィ ブの数と 完全に一致し ないこ と があ り ます。

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

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

° レジス タの複製

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

合成 japan.xilinx.com 54UG901 (v2015.3) 2015 年 9 月 30 日

Page 55: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

---------------------------------------------------------------------------------

RTL Component Statistics

---------------------------------------------------------------------------------

Detailed RTL Component Info :

+---Registers :

8 Bit Registers := 1

Report Cell Usage:

-----+----+-----

|Cell|Count

-----+----+-----

3 |FDCE| 8

-----+----+-----

フ リ ッ プ フ ロ ッ プおよびレジス タのコー ド例

次に、 フ リ ッ プフ ロ ッ プ と レジス タの VHDL および Verilog コード例を示し ます。 コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

立ち上がり エ ッ ジで動作するレジス タのコー ド例 (Verilog)

// 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)beginif(clr)d_reg <= 8'b0;

else if(ce)d_reg <= d_in;

end

assigndout = d_reg;endmodule

合成 japan.xilinx.com 55UG901 (v2015.3) 2015 年 9 月 30 日

Page 56: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

立ち上がり エ ッ ジで動作する フ リ ッ プ フ ロ ッ プ レジス タのコー ド例 (VHDL)

-- 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 isport(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 isbeginprocess(clk) isbeginif rising_edge(clk) then

if clr = '1' then dout <= "00000000";

elsif ce = '1' thendout <= d_in;

end if;end if;

end process;end architecture rtl;

合成 japan.xilinx.com 56UG901 (v2015.3) 2015 年 9 月 30 日

Page 57: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 3 章 : 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

-----+----+-----

===================================================================

正ゲー ト および非同期リ セ ッ ト 付き ラ ッ チのコー ド例 (VHDL)

-- Latch with Positive Gate and Asynchronous Reset-- File: latches.vhdlibrary ieee;use ieee.std_logic_1164.all;

entity latches isport(G, D, CLR : in std_logic;Q : out std_logic

);end latches;

architecture archi of latches isbeginprocess(CLR, D, G)beginif (CLR = '1') thenQ <= '0';

elsif (G = '1') thenQ <= D;

end if;end process;

end archi;

\

合成 japan.xilinx.com 57UG901 (v2015.3) 2015 年 9 月 30 日

Page 58: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

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

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

コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

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

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

• 内部バス (BUFT)

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

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

• 回路の外部ピン (OBUFT)

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

HDL 合成中に ト ラ イ ステー ト バッ フ ァーが推論される と、 レポー ト に記述されます。

=========================================================================

* Vivado log file *

=========================================================================

Report Cell Usage:

-----+-----+-----

|Cell |Count

-----+-----+-----

1 |OBUFT| 1

-----+-----+-----

=========================================================================

同時処理代入文を使用し た ト ラ イステー ト のコー ド例 (Verilog)

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

合成 japan.xilinx.com 58UG901 (v2015.3) 2015 年 9 月 30 日

Page 59: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

OBUF と共にイ ンプ リ メ ン ト された組み合わせプロセスを使用し た ト ラ イステート 記述のコー ド例 (VHDL)

-- Tristate Description Using Combinatorial Process-- Implemented with an OBUF (internal buffer)---- File: tristates_3.vhd--library ieee;use ieee.std_logic_1164.all;

entity tristates_3 isgeneric(WIDTH : integer := 8

);port(T : in std_logic;I : in std_logic_vector(WIDTH - 1 downto 0);O : out std_logic_vector(WIDTH - 1 downto 0)

);

end tristates_3;

architecture archi of tristates_3 issignal S : std_logic_vector(WIDTH - 1 downto 0);

beginprocess(I, T)beginif (T = '1') thenS <= I;

elseS <= (others => 'Z');

end if;end process;

O <= not (S);

end archi;

合成 japan.xilinx.com 59UG901 (v2015.3) 2015 年 9 月 30 日

Page 60: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

OBUFT と共にイ ンプ リ メ ン ト された組み合わせプロセスを使用し た ト ラ イステー ト 記述のコー ド例 (VHDL)

-- 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 isport(T : in std_logic;I : in std_logic;O : out std_logic

);end tristates_1;

architecture archi of tristates_1 isbeginprocess(I, T)beginif (T = '0') thenO <= I;

elseO <= 'Z';

end if;end process;

end archi;

組み合わせ always ブロ ッ ク を使用し た ト ラ イステー ト 記述のコー ド例 (Verilog)

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

合成 japan.xilinx.com 60UG901 (v2015.3) 2015 年 9 月 30 日

Page 61: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

シフ ト レジス タシフ ト レジス タはフ リ ッ プフ ロ ッ プのチェーンで、 固定数 (ス タ テ ィ ッ ク ) のレ イ テンシ段を介し てデータ を伝搬で き ます。 65 ページの 「ダ イナ ミ ッ ク シフ ト レジス タ」 では、 伝搬チェーンの長さ を回路の操作中にダ イナ ミ ッ ク に 変更でき ます。

コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

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

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

• ク ロ ッ ク

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

• シ リ アル データ入力

• シ リ アル データ出力

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

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

• SRL16E

• SRLC32E

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

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

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

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

合成 japan.xilinx.com 61UG901 (v2015.3) 2015 年 9 月 30 日

Page 62: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

次に、 シフ ト レジス タの VHDL および Verilog コード例を示し ます。

32 ビ ッ ト シフ ト レジス タのコー ド例 1 (VHDL)

次のコード例では、 連結コード ス タ イルを使用し ています。

-- 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 isgeneric(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 issignal shreg : std_logic_vector(DEPTH - 1 downto 0);

beginprocess(clk)beginif rising_edge(clk) thenif clken = '1' thenshreg <= shreg(DEPTH - 2 downto 0) & SI;

end if;end if;

end process;SO <= shreg(DEPTH - 1);

end archi;

合成 japan.xilinx.com 62UG901 (v2015.3) 2015 年 9 月 30 日

Page 63: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

32 ビ ッ ト シフ ト レジス タのコー ド例 2 (VHDL)

同じ機能は、 次のよ う にも記述でき ます。

-- 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 isgeneric(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 issignal shreg : std_logic_vector(DEPTH - 1 downto 0);

beginprocess(clk)beginif rising_edge(clk) thenif clken = '1' thenfor i in 0 to DEPTH - 2 loopshreg(i + 1) <= shreg(i);

end loop;shreg(0) <= SI;

end if;end if;

end process;SO <= shreg(DEPTH - 1);

end archi;

合成 japan.xilinx.com 63UG901 (v2015.3) 2015 年 9 月 30 日

Page 64: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

8 ビ ッ ト シフ ト レジス タのコー ド例 1 (Verilog)

次のコード例では、 連結を使用し てレジス タ チェーンを記述し ています。

// 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; inputclk, 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)

// 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; inputclk, 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

合成 japan.xilinx.com 64UG901 (v2015.3) 2015 年 9 月 30 日

Page 65: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

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

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

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

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

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

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

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

X-Ref Target - Figure 3-1

X-Ref Target - Figure 3-2

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

合成 japan.xilinx.com 65UG901 (v2015.3) 2015 年 9 月 30 日

Page 66: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

ダイナ ミ ッ ク シフ ト レジス タのコー ド例 コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

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

-- 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 isgeneric(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 istype SRL_ARRAY is array (DEPTH - 1 downto 0) of std_logic;

signal SRL_SIG : SRL_ARRAY;

beginprocess(CLK)beginif rising_edge(CLK) thenif CE = '1' thenSRL_SIG <= SRL_SIG(DEPTH - 2 downto 0) & SI;

end if;end if;

end process;

DO <= SRL_SIG(conv_integer(A));

end rtl;

合成 japan.xilinx.com 66UG901 (v2015.3) 2015 年 9 月 30 日

Page 67: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

// 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;inputCLK, CE, SI;input[SELWIDTH-1:0] SEL;outputDO;

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

乗算器Vivado 合成では、 ソース コード の乗算から乗算器マ ク ロが推論されます。

• 結果の出力信号のビ ッ ト 数は、 2 つのオペラ ン ド の合計ビ ッ ト 数にな り ます。 た と えば、 16 ビ ッ ト の信号 と 8 ビ ッ ト の信号を乗算する場合、 結果は 24 ビ ッ ト にな り ます。

推奨 : デバイ スの上位ビ ッ ト をすべて使用し ない場合、特に乗算器マ ク ロ を ス ラ イ ス ロ ジ ッ ク にイ ンプ リ メ ン ト する 場合は、 オペラ ン ド のビ ッ ト 数を必要 小限に削減する こ と をお勧めし ます。

乗算器のイ ンプ リ メ ンテーシ ョ ン

乗算器マ ク ロは、 次のものにイ ンプ リ メ ン ト でき ます。

• ス ラ イ ス ロ ジ ッ ク

• DSP ブロ ッ ク

どち らにイ ンプ リ メ ン ト されるかは、 次の要素に基づいて決定されます。

• オペラ ン ド のサイ ズ

• パフ ォーマン ス を 高にする

乗算器を ス ラ イ ス ロ ジ ッ ク または DSP ブロ ッ ク に強制的にイ ンプ リ メ ン ト するには、 適切な信号、 エンテ ィ テ ィ 、 またはモジュールに USE_DSP48 属性を設定し ます。 この属性は、 次のいずれかの値に設定でき ます。

• no (ス ラ イ ス ロ ジ ッ ク にイ ンプ リ メ ン ト )

• yes (DSP ブロ ッ ク にイ ンプ リ メ ン ト )

合成 japan.xilinx.com 67UG901 (v2015.3) 2015 年 9 月 30 日

Page 68: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

DSP ブロ ッ クのイ ンプ リ メ ンテーシ ョ ン

乗算器を 1 つの DSP ブロ ッ ク にイ ンプ リ メ ン ト する場合、DSP ブロ ッ クのパイプラ イ ン機能が利用されます。Vivado 合成では、 次の箇所にあ る 2 レベルまでのレジス タ を吸収でき ます。

• 乗算オペラ ン ド

• 乗算後

乗算器が 1 つの DSP ブロ ッ ク に収ま ら ない場合、 マ ク ロ を分解し て イ ンプ リ メ ン ト し ます。 こ の場合、 次のいずれ かにイ ンプ リ メ ン ト されます。

• 複数の DSP ブロ ッ ク

• DSP ブロ ッ ク と ス ラ イ ス ロ ジ ッ ク

レジス タが DSP ブロ ッ ク に吸収されないよ う にするには、 KEEP 属性を使用し ます。 た と えば、 乗算器のオペラ ン ド にレジス タがあ る場合、 レジス タの出力に KEEP を設定する と、 レジス タが DSP ブロ ッ ク に吸収されな く な り ます。

乗算器のコー ド例

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

// Unsigned 16x24-bit Multiplier//1 latency stage on operands//3 latency stage after the multiplication// File: multipliers2.v//module mult_unsigned (clk, A, B, RES);

parameter WIDTHA = 16;parameter WIDTHB = 24;inputclk;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

合成 japan.xilinx.com 68UG901 (v2015.3) 2015 年 9 月 30 日

Page 69: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

-- 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 isgeneric(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 isbeginRES <= A * B;

end beh;

乗加算および乗累算

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

• 乗加算

• 乗減算

• 乗加減算

• 乗累算

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

• 乗算器

• 加減算器

• レジス タ

合成 japan.xilinx.com 69UG901 (v2015.3) 2015 年 9 月 30 日

Page 70: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

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

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

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

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

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

° 乗算後の 1 レジス タ段

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

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

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

• Vivado 合成 では、イ ンプ リ メ ンテーシ ョ ンに必要な DSP48 リ ソースが 1 つのみの場合に乗累算 (MAC) を DSP48 ブロ ッ ク にイ ンプ リ メ ン ト でき ます。

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

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

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

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

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

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

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

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

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

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

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

レジス タが DSP ブロ ッ ク に吸収されないよ う にするには、 KEEP 属性を使用し ます。 た と えば、 乗算器のオペラ ン ド にあ る レジス タが DSP ブロ ッ ク に吸収されないよ う にするには、 レジス タの出力に KEEP を設定し ます。 KEEP 属性 の詳細は、 42 ページの 「KEEP」 を参照し て く ださい。

コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

合成 japan.xilinx.com 70UG901 (v2015.3) 2015 年 9 月 30 日

Page 71: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

複素乗算のコー ド例 (VHDL)次に、 複素乗算の VHDL および Verilog のコー ド 例を示し ます。 コー ド 例フ ァ イルには、 UltraScale アーキテ ク チャ の 3 つの DSP ブロ ッ ク を使用し た累算を含む複素乗算の例も含まれています。

3 つの DSP48 ブロ ッ ク を使用する完全にパイプラ イ ン処理された複素乗算の例を示し ます。

-- 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 isgeneric(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 issignal 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);

beginprocess(clk)beginif rising_edge(clk) thenar_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)beginif rising_edge(clk) then

合成 japan.xilinx.com 71UG901 (v2015.3) 2015 年 9 月 30 日

Page 72: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

addcommon <= resize(ar_d, AWIDTH + 1) - resize(ai_d, AWIDTH + 1);mult0 <= addcommon * bi_dd;common <= mult0;

end if;end process;

-- Real product--process(clk)beginif rising_edge(clk) thenar_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)beginif rising_edge(clk) thenai_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;

合成 japan.xilinx.com 72UG901 (v2015.3) 2015 年 9 月 30 日

Page 73: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

複素乗算のコー ド例 (Verilog)3 つの DSP48 ブロ ッ ク を使用する完全にパイプラ イ ン処理された複素乗算の例を示し ます。

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

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

合成 japan.xilinx.com 73UG901 (v2015.3) 2015 年 9 月 30 日

Page 74: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

合成 japan.xilinx.com 74UG901 (v2015.3) 2015 年 9 月 30 日

Page 75: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

DSP ブロ ッ クの前置加算器DSP ブロ ッ ク を ターゲ ッ ト と し て推論コー ド を記述する際は、 符号付き演算を使用する こ と が推奨されます。 また、 前置加算器が DSP ブロ ッ ク に挿入される よ う に、 前置加算器用に 1 ビ ッ ト 幅を追加する必要があ り ます。

乗算器および後置加算器の前に動的にコ ン フ ィ ギュ レーシ ョ ン された前置加算器 (Verilog)

// 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 - b; else add_reg <= a + b; m_reg <= add_reg * c_reg; p_reg <= m_reg + d_reg; endend

// Output accumulation resultassign dynpreaddmultadd_out = p_reg; endmodule // dynpreaddmultadd

合成 japan.xilinx.com 75UG901 (v2015.3) 2015 年 9 月 30 日

Page 76: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

乗算器および後置加算器の前に動的にコ ン フ ィ ギュ レーシ ョ ン された前置加算器 (VHDL)

library ieee;use ieee.std_logic_1164.all;use ieee.numeric_std.all;

entity dynpreaddmultadd isgeneric(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 issignal 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);

beginprocess(clk)beginif rising_edge(clk) thena <= signed(ain);b <= signed(bin);c <= signed(cin);d <= signed(din);if subadd = '1' thenadd <= resize(a, BWIDTH + 1) - resize(b, BWIDTH + 1);

elseadd <= 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;

合成 japan.xilinx.com 76UG901 (v2015.3) 2015 年 9 月 30 日

Page 77: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

UltraScale DSP ブロ ッ クの 2 乗算出機能の使用UltraScale DSP ブロ ッ ク (DSP48E2) プ リ ミ テ ィ ブは、 前置加算器の入力または出力の 2 乗を算出でき ます。

コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

次に、 差分 2 乗の例を示し ます。 これを差分の絶対値の計算 と 置き換え る と 有利です。 1 つの DSP ブロ ッ ク に収ま り 、 大速度で動作し ます。 上記のコード例フ ァ イルには、 UltraScale アーキテ クチャの 1 つの DSP ブロ ッ ク に配置 可能な差分 2 乗のアキ ュ ム レータの例も含まれています。

差分 2 乗のコー ド例 (Verilog)// 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; end

end

// Output resultassign square_out = p_reg; endmodule // squarediffmult

合成 japan.xilinx.com 77UG901 (v2015.3) 2015 年 9 月 30 日

Page 78: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

差分 2 乗のコー ド例 (VHDL)

-- 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 isgeneric(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 valuessignal 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);

beginprocess(clk)beginif rising_edge(clk) thenif rst = '1' thena_reg <= (others => '0');b_reg <= (others => '0');diff_reg <= (others => '0');m_reg <= (others => '0');p_reg <= (others => '0');

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

合成 japan.xilinx.com 78UG901 (v2015.3) 2015 年 9 月 30 日

Page 79: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

FIR フ ィ ルターVivado 合成は、 RTL から直接 FIR フ ィ ルターを作成するのにカ スケード接続された乗加算器を推論し ます。

こ の よ う な フ ィ ル ターにはい く つかの イ ンプ リ メ ン テーシ ョ ン方法があ り ます。 その 1 つは、 『7 シ リ ーズ FPGA DSP48E1 ス ラ イ ス ユーザー ガイ ド』 (UG479) [参照 13] の図 3-6 「8 タ ッ プの偶数対称シス ト リ ッ ク FIR」 に示されて いる シス ト リ ッ ク フ ィ ルターです。

コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

8 タ ッ プ偶数対称シス ト リ ッ ク フ ィ ルター (Verilog)// sfir_even_symmetric_systolic_top.v// FIR Symmetric Systolic Filter, Top module is sfir_even_symmetric_systolic_top

// sfir_shifter - sub module which is used in top level(* dont_touch = "yes" *) module sfir_shifter #(parameter dsize = 16, nbtap = 4) (input clk, [dsize-1:0] datain, output [dsize-1:0] dataout);

(* srl_style = "srl_register" *) reg [dsize-1:0] tmp [0:2*nbtap-1]; integer i;

always @(posedge clk) begin tmp[0] <= datain; for (i=0; i<=2*nbtap-2; i=i+1) tmp[i+1] <= tmp[i]; end

assign dataout = tmp[2*nbtap-1]; endmodule

// sfir_even_symmetric_systolic_element - sub module which is used in topmodule sfir_even_symmetric_systolic_element #(parameter dsize = 16) (input clk, input signed [dsize-1:0] coeffin, datain, datazin, input signed [2*dsize-1:0] cascin, output signed [dsize-1:0] cascdata, output reg signed [2*dsize-1:0] cascout);

reg signed [dsize-1:0] coeff; reg signed [dsize-1:0] data; reg signed [dsize-1:0] dataz; reg signed [dsize-1:0] datatwo; reg signed [dsize:0] preadd; reg signed [2*dsize-1:0] product;

assign cascdata = datatwo; always @(posedge clk) begin coeff <= coeffin; data <= datain; datatwo <= data; dataz <= datazin;

合成 japan.xilinx.com 79UG901 (v2015.3) 2015 年 9 月 30 日

Page 80: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

合成 japan.xilinx.com 80UG901 (v2015.3) 2015 年 9 月 30 日

Page 81: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

8 タ ッ プ偶数対称シス ト リ ッ ク フ ィ ルター (VHDL)---- 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 isgeneric(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;

beginprocess(clk)beginif rising_edge(clk) thentmp(0) <= datain;looptmp : for i in 0 to 2 * NBTAP - 2 looptmp(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 isgeneric(DSIZE : natural := 16);port(clk : in std_logic; coeffin, datain, datazin : in std_logic_vector(DSIZE - 1 downto 0); cascin : in std_logic_vector(2 * DSIZE downto 0);

合成 japan.xilinx.com 81UG901 (v2015.3) 2015 年 9 月 30 日

Page 82: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

beginprocess(clk)beginif rising_edge(clk) thencoeff <= 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 isgeneric(NBTAP : natural := 4; DSIZE : natural := 16; PSIZE : natural := 33);

port(clk : in std_logic; datain : in std_logic_vector(DSIZE - 1 downto 0); firout : out std_logic_vector(PSIZE - 1 downto 0));

end sfir_even_symmetric_systolic_top;

architecture rtl of sfir_even_symmetric_systolic_top is

-- Declare signals--type DTAB is array (0 to NBTAP - 1) of std_logic_vector(DSIZE - 1 downto 0);type HTAB is array (0 to NBTAP - 1) of std_logic_vector(0 to DSIZE - 1);type PTAB is array (0 to NBTAP - 1) of std_logic_vector(PSIZE - 1 downto 0);

signal arraydata, dataz : DTAB;signal arrayprod : PTAB;signal shifterout : std_logic_vector(DSIZE - 1 downto 0);

-- Initialize coefficients and a "zero" for the first filter element

合成 japan.xilinx.com 82UG901 (v2015.3) 2015 年 9 月 30 日

Page 83: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

--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_shiftergeneric map(DSIZE, NBTAP)port map(clk, datain, shifterout);

-- Connect the arithmetic building blocks of the FIR--gen : for I in 0 to NBTAP - 1 generatebeging0 : if I = 0 generateelement_u0 : entity work.sfir_even_symmetric_systolic_elementgeneric map(DSIZE)port map(clk, h(I), datain, shifterout, zero_psize, arraydata(I),

arrayprod(I));end generate g0;gi : if I /= 0 generateelement_ui : entity work.sfir_even_symmetric_systolic_elementgeneric 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;

合成 japan.xilinx.com 83UG901 (v2015.3) 2015 年 9 月 30 日

Page 84: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

偶数丸め (LSB 訂正手法)DSP ブロ ッ ク プ リ ミ テ ィ ブは、 パターン検出回路を利用し て、 偶数または奇数への偶数丸めを算出し ます。

次に、 偶数丸め推論の例を示し ます。 ブロ ッ ク のフル パフ ォーマン スで動作し ます。 LSB 訂正を イ ンプ リ メ ン ト す るため、 2 入力 AND ゲー ト (1 LUT) も推論されます。

偶数への丸め (Verilog)// 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)beginareg <= 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

合成 japan.xilinx.com 84UG901 (v2015.3) 2015 年 9 月 30 日

Page 85: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

偶数への丸め (VHDL)-- 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;

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;

-- Unit bit replaced with 0 if pattern is detected process(clk)

合成 japan.xilinx.com 85UG901 (v2015.3) 2015 年 9 月 30 日

Page 86: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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;

合成 japan.xilinx.com 86UG901 (v2015.3) 2015 年 9 月 30 日

Page 87: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

奇数への丸め (Verilog)// 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

合成 japan.xilinx.com 87UG901 (v2015.3) 2015 年 9 月 30 日

Page 88: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

奇数への丸め (VHDL)-- 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;

process(clk) begin

合成 japan.xilinx.com 88UG901 (v2015.3) 2015 年 9 月 30 日

Page 89: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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;

合成 japan.xilinx.com 89UG901 (v2015.3) 2015 年 9 月 30 日

Page 90: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

RAM の HDL コーデ ィ ング手法Vivado 合成では、 さ まざまな RAM のコーデ ィ ング ス タ イルを解釈し、 分散 RAM またはブラ ッ ク RAM にマ ッ プで き ます。 これによ り 、 次が可能にな り ます。

• 手動で RAM プ リ ミ テ ィ ブを イ ン ス タ ンシエー ト する必要な し

• 時間を短縮

• HDL ソース コード を移行および拡張しやすい

コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

分散 RAM と専用ブロ ッ ク RAM 間の選択

データは、 両方のタ イプの RAM に同期に書き込まれます。 分散 RAM と ブロ ッ ク RAM の主な違いは、 RAM からの データの読み出し方法にあ り ます。 次の表を参照し て く ださい。

分散 RAM または専用ブロ ッ ク RAM のどち ら を使用するかは、 HDL ソース コード で記述し た RAM の特性、 使用可 能なブロ ッ ク RAM リ ソース、 および RAM_STYLE 属性を使用し て特定のイ ンプ リ メ ンテーシ ョ ン ス タ イルを指定 し たかど う かによ り ます。 詳細は、 46 ページの 「RAM_STYLE」 を参照し て く ださい。

メ モ リの推論

メ モ リ の推論機能には、 次のものが含まれます。

• 任意のサイ ズおよびデータ幅をサポー ト 。メ モ リ 記述は 1 つまたは複数の RAM プ リ ミ テ ィ ブにマ ッ プ されます。

• シングル ポー ト 、 シンプル デュ アル ポー ト 、 完全なデュ アル ポー ト

• 大 2 つの書き込みポー ト

• 複数の読み出しポー ト

記述されている書き込みポー ト が 1 つのみの場合、 Vivado 合成では書き込みア ド レ ス と は異な る ア ド レ スの RAM の 内容にア ク セスする読み出しポー ト が複数あ る RAM 記述を認識でき ます。

• 書き込みイネーブル

• RAM イネーブル (ブロ ッ ク RAM)

• データ出力 リ セ ッ ト (ブロ ッ ク RAM)

• オプシ ョ ンの出力レジス タ (ブロ ッ ク RAM)

• バイ ト ラ イ ト イネーブル (ブロ ッ ク RAM)

• 各 RAM ポー ト は、そのク ロ ッ ク、ポー ト イネーブル、書き込みイネーブル、データ出力 リ セ ッ ト で制御でき ます。

• 初期内容の指定

• Vivado 合成では、 記述されているデータ幅に対応するため、 パ リ テ ィ ビ ッ ト を通常のデータ ビ ッ ト と し て使用 でき ます。

注記 : パ リ テ ィ ビ ッ ト の詳細は、 ターゲ ッ ト デバイ スのユーザー ガイ ド を参照し て く ださい。

表 3-1 : 分散 RAM と専用ブロ ッ ク RAM の違い

操作 分散 RAM 専用ブロ ッ ク RAM

書き込み 同期 同期

読み出し 非同期 同期

合成 japan.xilinx.com 90UG901 (v2015.3) 2015 年 9 月 30 日

Page 91: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

RAM の HDL コー ド記述のガイ ド ラ イ ンコード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

ブロ ッ ク RAM の読み出し /書き込みの同期モー ド

ブロ ッ ク RAM リ ソースは、読み出し /書き込みポー ト で次の同期モード を提供する よ う コ ンフ ィ ギュ レーシ ョ ンでき ます。

• Read-First (先に読み出し ) : 新しい内容が読み込まれる前に、 既存の内容が読み出されます。

• Write-First (先に書き込み) : 新しい内容がすぐに読み出せる よ う にな り ます。 Read-Through と も呼ばれます。

• No-Change (変化な し ) : 新しい内容が RAM に読み込まれる間、 データ出力は変化し ません。

Vivado 合成では、 これらすべての同期モー ド の推論がサポー ト されます。 RAM のポー ト ご と に、 異なる同期モード を記述でき ます。

分散 RAM の例

次に、 分散 RAM の VHDL および Verilog コード例を示し ます。

非同期読み出し付きデュアル ポー ト RAM のコー ド例 (Verilog)

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

合成 japan.xilinx.com 91UG901 (v2015.3) 2015 年 9 月 30 日

Page 92: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

非同期読み出し付き RAM のコー ド例 (VHDL)

-- Single-Port RAM with Asynchronous Read (Distributed RAM)-- File: rams_dist.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity rams_dist isport(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 istype ram_type is array (63 downto 0) of std_logic_vector(15 downto 0);signal RAM : ram_type;

beginprocess(clk)beginif (clk'event and clk = '1') thenif (we = '1') thenRAM(conv_integer(a)) <= di;

end if;end if;

end process;

do <= RAM(conv_integer(a));

end syn;

合成 japan.xilinx.com 92UG901 (v2015.3) 2015 年 9 月 30 日

Page 93: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

シングル ポー ト ブロ ッ ク RAM

Read-First モー ドのシングル ポー ト ブロ ッ ク RAM コー ド例 (VHDL)

-- Single-Port Block RAM Read-First Mode-- rams_sp_rf.vhd--library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity rams_sp_rf isport(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 istype ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);signal RAM : ram_type;

beginprocess(clk)beginif clk'event and clk = '1' thenif en = '1' thenif we = '1' thenRAM(conv_integer(addr)) <= di;

end if;do <= RAM(conv_integer(addr));

end if;end if;

end process;

end syn;

合成 japan.xilinx.com 93UG901 (v2015.3) 2015 年 9 月 30 日

Page 94: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

Write-First モー ドのシングル ポー ト ブロ ッ ク RAM のコー ド例 (VHDL)

-- Single-Port Block RAM Write-First Mode (recommended template)---- File: rams_sp_wf.vhd--library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity rams_sp_wf isport(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 istype ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);signal RAM : ram_type;

beginprocess(clk)beginif clk'event and clk = '1' thenif en = '1' thenif we = '1' thenRAM(conv_integer(addr)) <= di;do <= di;

elsedo <= RAM(conv_integer(addr));

end if;end if;

end if;end process;

end syn;

合成 japan.xilinx.com 94UG901 (v2015.3) 2015 年 9 月 30 日

Page 95: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

Write-First モー ドのシングル ポー ト ブロ ッ ク RAM のコー ド例 (Verilog)

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

合成 japan.xilinx.com 95UG901 (v2015.3) 2015 年 9 月 30 日

Page 96: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

No-Change モー ドのシングル ポー ト ブロ ッ ク RAM のコー ド例 (Verilog)

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

合成 japan.xilinx.com 96UG901 (v2015.3) 2015 年 9 月 30 日

Page 97: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

リ セ ッ ト 可能なデータ出力付きシングル ポー ト ブロ ッ ク RAM のコー ド例 (VHDL)

-- Block RAM with Resettable Data Output-- File: rams_sp_rf_rst.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity rams_sp_rf_rst isport(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 istype ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);signal ram : ram_type;

beginprocess(clk)beginif clk'event and clk = '1' thenif en = '1' then -- optional enableif we = '1' then -- write enableram(conv_integer(addr)) <= di;

end if;if rst = '1' then -- optional resetdo <= (others => '0');

elsedo <= ram(conv_integer(addr));

end if;end if;

end if;end process;

end syn;

合成 japan.xilinx.com 97UG901 (v2015.3) 2015 年 9 月 30 日

Page 98: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

リ セ ッ ト 可能なデータ出力付きブロ ッ ク RAM のコー ド例 (Verilog)

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

合成 japan.xilinx.com 98UG901 (v2015.3) 2015 年 9 月 30 日

Page 99: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

シンプル デュアル ポー ト ブロ ッ ク RAM の例

1 つのク ロ ッ ク を使用するシンプル デュアル ポー ト ブロ ッ ク RAM のコー ド例 (VHDL)

-- 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 isport(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 istype ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);shared variable RAM : ram_type;

beginprocess(clk)beginif clk'event and clk = '1' thenif ena = '1' thenif wea = '1' thenRAM(conv_integer(addra)) := dia;

end if;end if;

end if;end process;

process(clk)beginif clk'event and clk = '1' thenif enb = '1' thendob <= RAM(conv_integer(addrb));

end if;end if;

end process;

end syn;

合成 japan.xilinx.com 99UG901 (v2015.3) 2015 年 9 月 30 日

Page 100: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

1 つのク ロ ッ ク を使用するシンプル デュアル ポー ト ブロ ッ ク RAM のコー ド例 (Verilog)

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

合成 japan.xilinx.com 100UG901 (v2015.3) 2015 年 9 月 30 日

Page 101: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

2 つのク ロ ッ ク を使用するシンプル デュアル ポー ト ブロ ッ ク RAM のコー ド例 (VHDL)

-- 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 isport(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 istype ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);shared variable RAM : ram_type;

beginprocess(clka)beginif clka'event and clka = '1' thenif ena = '1' thenif wea = '1' thenRAM(conv_integer(addra)) := dia;

end if;end if;

end if;end process;

process(clkb)beginif clkb'event and clkb = '1' thenif enb = '1' thendob <= RAM(conv_integer(addrb));

end if;end if;

end process;

end syn;

合成 japan.xilinx.com 101UG901 (v2015.3) 2015 年 9 月 30 日

Page 102: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

2 つのク ロ ッ ク を使用するシンプル デュアル ポー ト ブロ ッ ク RAM のコー ド例 (Verilog)

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

合成 japan.xilinx.com 102UG901 (v2015.3) 2015 年 9 月 30 日

Page 103: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

完全なデュアル ポー ト ブロ ッ ク RAM のコー ド例

2 つの書き込みポー ト がある Read-First モー ドのデュアル ポー ト ブロ ッ ク RAM のコー ド例 (VHDL)

-- 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.std_logic_unsigned.all;

entity rams_tdp_rf_rf isport(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 istype ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);shared variable RAM : ram_type;

beginprocess(CLKA)beginif CLKA’event and CLKA = ‘1’ thenif ENA = ‘1’ thenDOA <= RAM(conv_integer(ADDRA));if WEA = ‘1’ thenRAM(conv_integer(ADDRA)) := DIA;

end if;end if;

end if;end process;

process(CLKB)beginif CLKB’event and CLKB = ‘1’ thenif ENB = ‘1’ thenDOB <= RAM(conv_integer(ADDRB));if WEB = ‘1’ thenRAM(conv_integer(ADDRB)) := DIB;

end if;end if;

end if;end process;

end syn;

合成 japan.xilinx.com 103UG901 (v2015.3) 2015 年 9 月 30 日

Page 104: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

2 つの書き込みポー ト がある Read-First モー ドのデュアル ポー ト ブロ ッ ク RAM のコー ド例 (Verilog)

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

オプシ ョ ンの出力レジス タ付きブロ ッ ク RAM のコー ド例 (VHDL)

-- Block RAM with Optional Output Registers-- File: rams_pipeline.vhdlibrary IEEE;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity rams_pipeline isport(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)

);

合成 japan.xilinx.com 104UG901 (v2015.3) 2015 年 9 月 30 日

Page 105: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

end rams_pipeline;

architecture beh of rams_pipeline istype 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);

beginprocess(clk1)beginif rising_edge(clk1) thenif we = '1' thenram(conv_integer(addr1)) <= di;

end if;do1 <= ram(conv_integer(addr1));

end if;end process;

process(clk2)beginif rising_edge(clk2) thendo2 <= ram(conv_integer(addr2));

end if;end process;

process(clk1)beginif rising_edge(clk1) thenif en1 = '1' thenres1 <= do1;

end if;end if;

end process;

process(clk2)beginif rising_edge(clk2) thenif en2 = '1' thenres2 <= do2;

end if;end if;

end process;

end beh;

合成 japan.xilinx.com 105UG901 (v2015.3) 2015 年 9 月 30 日

Page 106: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

オプシ ョ ンの出力レジス タ付きブロ ッ ク RAM のコー ド例 (Verilog)

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

合成 japan.xilinx.com 106UG901 (v2015.3) 2015 年 9 月 30 日

Page 107: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 3 章 : 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

バイ ト ラ イ ト イネーブル付きの完全なデュアル ポー ト BRAM の例

バイ ト ラ イ ト イネーブル (READ_FIRST モー ド ) のコー ド例 (Verilog)

// True-Dual-Port BRAM with Byte-wide Write Enable// Read-First mode // bytewrite_tdp_ram_rf.v//

module bytewrite_tdp_ram_rf #(//--------------------------------------------------------------------------parameter NUM_COL = 4,parameter COL_WIDTH = 8,parameter ADDR_WIDTH = 10, // Addr Width in bits : 2 *ADDR_WIDTH = RAM Depthparameter DATA_WIDTH = NUM_COL*COL_WIDTH // Data Width in bits //---------------------------------------------------------------------- ) ( input clkA, input enaA, input [NUM_COL-1:0] weA, input [ADDR_WIDTH-1:0] addrA, input [DATA_WIDTH-1:0] dinA, output reg [DATA_WIDTH-1:0] doutA,

input clkB, input enaB, input [NUM_COL-1:0] weB, input [ADDR_WIDTH-1:0] addrB,

合成 japan.xilinx.com 107UG901 (v2015.3) 2015 年 9 月 30 日

Page 108: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

バイ ト ラ イ ト イネーブル (READ_FIRST モー ド ) のコー ド例 (VHDL)

-- 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 isgeneric(SIZE : integer := 1024;ADDR_WIDTH : integer := 10;COL_WIDTH : integer := 9;NB_COL : integer := 4

合成 japan.xilinx.com 108UG901 (v2015.3) 2015 年 9 月 30 日

Page 109: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

);

port(clka : in std_logic;ena : in std_logic;wea : in std_logic_vector(NB_COL - 1 downto 0);addra : in std_logic_vector(ADDR_WIDTH - 1 downto 0);dia : in std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0);doa : out std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0);clkb : in std_logic;enb : in std_logic;web : in std_logic_vector(NB_COL - 1 downto 0);addrb : in std_logic_vector(ADDR_WIDTH - 1 downto 0);dib : in std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0);dob : out std_logic_vector(NB_COL * COL_WIDTH - 1 downto 0)

);

end bytewrite_tdp_ram_rf;

architecture byte_wr_ram_rf of bytewrite_tdp_ram_rf istype 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)beginif rising_edge(clka) thenif ena = '1' thendoa <= RAM(conv_integer(addra));for i in 0 to NB_COL - 1 loopif wea(i) = '1' thenRAM(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)beginif rising_edge(clkb) thenif enb = '1' thendob <= RAM(conv_integer(addrb));for i in 0 to NB_COL - 1 loopif web(i) = '1' thenRAM(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;

合成 japan.xilinx.com 109UG901 (v2015.3) 2015 年 9 月 30 日

Page 110: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

バイ ト ラ イ ト イネーブル (WRITE_FIRST モー ド ) のコー ド例 (VHDL)

-- 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 isgeneric(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_wf;

architecture byte_wr_ram_wf of bytewrite_tdp_ram_wf istype 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)beginif rising_edge(clka) thenif ena = '1' thenfor i in 0 to NB_COL - 1 loopif wea(i) = '1' thenRAM(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;

合成 japan.xilinx.com 110UG901 (v2015.3) 2015 年 9 月 30 日

Page 111: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

end process;

------- Port B-------process(clkb)beginif rising_edge(clkb) thenif enb = '1' thenfor i in 0 to NB_COL - 1 loopif web(i) = '1' thenRAM(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;

バイ ト 幅ラ イ ト イネーブル (NO_CHANGE モー ド ) のコー ド例 (VHDL)

---- 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 isgeneric(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)

);

合成 japan.xilinx.com 111UG901 (v2015.3) 2015 年 9 月 30 日

Page 112: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

end bytewrite_tdp_ram_nc;

architecture byte_wr_ram_nc of bytewrite_tdp_ram_nc istype 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)beginif rising_edge(clka) thenif ena = '1' thenif (wea = (wea'range => '0')) thendoa <= RAM(conv_integer(addra));

end if;for i in 0 to NB_COL - 1 loopif wea(i) = '1' thenRAM(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)beginif rising_edge(clkb) thenif enb = '1' thenif (web = (web'range => '0')) thendob <= RAM(conv_integer(addrb));

end if;for i in 0 to NB_COL - 1 loopif web(i) = '1' thenRAM(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;

合成 japan.xilinx.com 112UG901 (v2015.3) 2015 年 9 月 30 日

Page 113: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

バイ ト 幅ラ イ ト イネーブル (NO_CHANGE モー ド ) のコー ド例 (Verilog)

//// True-Dual-Port BRAM with Byte-wide Write Enable// No-Change mode//// bytewrite_tdp_ram_nc.v//// ByteWide Write Enable, - NO_CHANGE mode template - Vivado recomendedmodule bytewrite_tdp_ram_nc #( //--------------------------------------------------------------- parameter NUM_COL = 4, parameter COL_WIDTH = 8, parameter ADDR_WIDTH = 10, // Addr Width in bits : 2**ADDR_WIDTH = RAM Depth parameter DATA_WIDTH = NUM_COL*COL_WIDTH // Data Width in bits //--------------------------------------------------------------- ) ( input clkA, input enaA, input [NUM_COL-1:0] weA, input [ADDR_WIDTH-1:0] addrA, input [DATA_WIDTH-1:0] dinA, output reg [DATA_WIDTH-1:0] doutA, input clkB, input enaB, input [NUM_COL-1:0] weB, input [ADDR_WIDTH-1:0] addrB, input [DATA_WIDTH-1:0] dinB, output reg [DATA_WIDTH-1:0] doutB );

// Core Memory reg [DATA_WIDTH-1:0] ram_block [(2**ADDR_WIDTH)-1:0]; // Port-A Operation generate genvar i; for(i=0;i<NUM_COL;i=i+1) begin always @ (posedge clkA) begin if(enaA) begin if(weA[i]) begin ram_block[addrA][i*COL_WIDTH +: COL_WIDTH] <= dinA[i*COL_WIDTH +: COL_WIDTH]; end end end end endgenerate always @ (posedge clkA) begin if(enaA) begin if (~|weA) doutA <= ram_block[addrA]; end end // Port-B Operation: generate for(i=0;i<NUM_COL;i=i+1) begin always @ (posedge clkB) begin if(enaB) begin

合成 japan.xilinx.com 113UG901 (v2015.3) 2015 年 9 月 30 日

Page 114: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

合成 japan.xilinx.com 114UG901 (v2015.3) 2015 年 9 月 30 日

Page 115: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

非対称 RAM

シンプル デュアル ポー ト 非対称 RAM のコー ド例 (VHDL) : 読み出しの幅が書き込みよ り広い場合

-- 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 isgeneric(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 isfunction max(L, R : INTEGER) return INTEGER isbeginif L > R thenreturn L;

elsereturn R;

end if;end;

function min(L, R : INTEGER) return INTEGER isbeginif L < R thenreturn L;

elsereturn R;

end if;end;

function log2(val : INTEGER) return natural is

合成 japan.xilinx.com 115UG901 (v2015.3) 2015 年 9 月 30 日

Page 116: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

variable res : natural;beginfor i in 0 to 31 loopif (val <= (2 ** i)) thenres := 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 processprocess(clkA)beginif rising_edge(clkA) thenif enA = '1' thenif weA = '1' thenmy_ram(conv_integer(addrA)) <= diA;

end if;end if;

end if;end process;

-- Read processprocess(clkB)beginif rising_edge(clkB) thenfor i in 0 to RATIO - 1 loopif enB = '1' thenreadB((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;

合成 japan.xilinx.com 116UG901 (v2015.3) 2015 年 9 月 30 日

Page 117: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

シンプル デュアル ポー ト 非対称 RAM のコー ド例 (Verilog) : 読み出しの幅が書き込みよ り広い場合

// 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;beginif (value < 2)log2 = value;

elsebeginshifted = value-1;for (res=0; shifted>0; res=res+1)shifted = shifted>>1;

log2 = res;end

endendfunction

localparam maxSIZE = `max(SIZEA, SIZEB);localparam maxWIDTH = `max(WIDTHA, WIDTHB);localparam minWIDTH = `min(WIDTHA, WIDTHB);

localparam RATIO = maxWIDTH / minWIDTH;localparam log2RATIO = log2(RATIO);

reg [minWIDTH-1:0] RAM [0:maxSIZE-1];reg [WIDTHB-1:0] readB;

always @(posedge clkA)beginif (enaA) begin if (weA)RAM[addrA] <= diA;

合成 japan.xilinx.com 117UG901 (v2015.3) 2015 年 9 月 30 日

Page 118: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

endend

always @(posedge clkB)begin : ramreadinteger i;reg [log2RATIO-1:0] lsbaddr;if (enaB) beginfor (i = 0; i < RATIO; i = i+1) begin lsbaddr = i;readB[(i+1)*minWIDTH-1 -: minWIDTH] <= RAM[{addrB, lsbaddr}];

endend

endassigndoB = readB;

endmodule

合成 japan.xilinx.com 118UG901 (v2015.3) 2015 年 9 月 30 日

Page 119: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

シンプル デュアル ポー ト 非対称 RAM の コー ド例 (VHDL) : 書き込みの幅が読み出し よ り広い場合

-- 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 isgeneric(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 isfunction max(L, R : INTEGER) return INTEGER isbeginif L > R thenreturn L;

elsereturn R;

end if;end;

function min(L, R : INTEGER) return INTEGER isbeginif L < R thenreturn L;

elsereturn R;

end if;end;

function log2(val : INTEGER) return natural isvariable res : natural;

begin

合成 japan.xilinx.com 119UG901 (v2015.3) 2015 年 9 月 30 日

Page 120: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

for i in 0 to 31 loopif (val <= (2 ** i)) thenres := 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 processprocess(clkA)beginif rising_edge(clkA) thenif enA = '1' thenreadA <= my_ram(conv_integer(addrA));

end if;regA <= readA;

end if;end process;

-- Write processprocess(clkB)beginif rising_edge(clkB) thenfor i in 0 to RATIO - 1 loopif enB = '1' thenif weB = '1' thenmy_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;

合成 japan.xilinx.com 120UG901 (v2015.3) 2015 年 9 月 30 日

Page 121: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

シンプル デュアル ポー ト 非対称 RAM のコー ド例 (Verilog) : 書き込みの幅が読み出し よ り広い場合

// 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;beginif (value < 2)log2 = value;

elsebeginshifted = value-1;for (res=0; shifted>0; res=res+1)shifted = shifted>>1;

log2 = res;end

endendfunction

localparam maxSIZE = `max(SIZEA, SIZEB);localparam maxWIDTH = `max(WIDTHA, WIDTHB);localparam minWIDTH = `min(WIDTHA, WIDTHB);

localparam RATIO = maxWIDTH / minWIDTH;localparam log2RATIO = log2(RATIO);

reg [minWIDTH-1:0] RAM [0:maxSIZE-1];reg [WIDTHB-1:0] readB;

always @(posedge clkB) beginif (enaB) beginreadB <= RAM[addrB];

end

合成 japan.xilinx.com 121UG901 (v2015.3) 2015 年 9 月 30 日

Page 122: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

endassign doB = readB;

always @(posedge clkA)begin : ramwriteinteger i;reg [log2RATIO-1:0] lsbaddr;for (i=0; i< RATIO; i= i+ 1) begin : write1lsbaddr = i;if (enaA) begin if (weA)RAM[{addrA, lsbaddr}] <= diA[(i+1)*minWIDTH-1 -: minWIDTH];

endend

end

endmodule

合成 japan.xilinx.com 122UG901 (v2015.3) 2015 年 9 月 30 日

Page 123: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

Read-First モー ドの完全なデュアル ポー ト 非対称 RAM のコー ド例 (VHDL)

-- asymmetric port RAM-- True Dual port read first-- asym_ram_tdp_read_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 isgeneric(WIDTHA : integer := 4;SIZEA : integer := 1024;ADDRWIDTHA : integer := 10;WIDTHB : integer := 16;SIZEB : integer := 256;ADDRWIDTHB : integer := 8

);

port(clkA : in std_logic;clkB : in std_logic;enA : in std_logic;enB : in std_logic;weA : in std_logic;weB : in std_logic;addrA : in std_logic_vector(ADDRWIDTHA - 1 downto 0);addrB : in std_logic_vector(ADDRWIDTHB - 1 downto 0);diA : in std_logic_vector(WIDTHA - 1 downto 0);diB : in std_logic_vector(WIDTHB - 1 downto 0);doA : out std_logic_vector(WIDTHA - 1 downto 0);doB : out std_logic_vector(WIDTHB - 1 downto 0)

);

end asym_ram_tdp_read;

architecture behavioral of asym_ram_tdp_read isfunction max(L, R : INTEGER) return INTEGER isbeginif L > R thenreturn L;

elsereturn R;

end if;end;

function min(L, R : INTEGER) return INTEGER isbeginif L < R thenreturn L;

elsereturn R;

end if;end;

function log2(val : INTEGER) return natural isvariable res : natural;

beginfor i in 0 to 31 loop

合成 japan.xilinx.com 123UG901 (v2015.3) 2015 年 9 月 30 日

Page 124: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

if (val <= (2 ** i)) thenres := 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');

beginprocess(clkA)beginif rising_edge(clkA) thenif enA = '1' thenreadA <= my_ram(conv_integer(addrA));if weA = '1' thenmy_ram(conv_integer(addrA)) <= diA;

end if;end if;regA <= readA;

end if;end process;

process(clkB)beginif rising_edge(clkB) thenfor i in 0 to RATIO - 1 loopif enB = '1' thenreadB((i + 1) * minWIDTH - 1 downto i * minWIDTH) <=

my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO))));if weB = '1' thenmy_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;

合成 japan.xilinx.com 124UG901 (v2015.3) 2015 年 9 月 30 日

Page 125: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

Read-First モー ドの完全なデュアル ポー ト 非対称 RAM のコー ド例 (Verilog)

// 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;beginif (value < 2)log2 = value;

elsebeginshifted = value-1;for (res=0; shifted>0; res=res+1)shifted = shifted>>1;

log2 = res;end

endendfunction

localparam maxSIZE = `max(SIZEA, SIZEB);localparam maxWIDTH = `max(WIDTHA, WIDTHB);localparam minWIDTH = `min(WIDTHA, WIDTHB);

localparam RATIO = maxWIDTH / minWIDTH;localparam log2RATIO = log2(RATIO);

reg [minWIDTH-1:0] RAM [0:maxSIZE-1];reg [WIDTHA-1:0] readA;reg [WIDTHB-1:0] readB;

合成 japan.xilinx.com 125UG901 (v2015.3) 2015 年 9 月 30 日

Page 126: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

always @(posedge clkB)beginif (enaB) beginreadB <= RAM[addrB] ;if (weB)RAM[addrB] <= diB;

endend

always @(posedge clkA)begin : portAinteger i;reg [log2RATIO-1:0] lsbaddr ;for (i=0; i< RATIO; i= i+ 1) begin lsbaddr = i;

if (enaA) beginreadA[(i+1)*minWIDTH -1 -: minWIDTH] <= RAM[{addrA, lsbaddr}];

if (weA)RAM[{addrA, lsbaddr}] <= diA[(i+1)*minWIDTH-1 -: minWIDTH];

endend

end

assign doA = readA;assign doB = readB;

endmodule

合成 japan.xilinx.com 126UG901 (v2015.3) 2015 年 9 月 30 日

Page 127: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

Write-First モー ドの完全なデュアル ポー ト 非対称 RAM のコー ド例 (VHDL)

--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 isgeneric(WIDTHA : integer := 4;SIZEA : integer := 1024;ADDRWIDTHA : integer := 10;WIDTHB : integer := 16;SIZEB : integer := 256;ADDRWIDTHB : integer := 8

);

port(clkA : in std_logic;clkB : in std_logic;enA : in std_logic;enB : in std_logic;weA : in std_logic;weB : in std_logic;addrA : in std_logic_vector(ADDRWIDTHA - 1 downto 0);addrB : in std_logic_vector(ADDRWIDTHB - 1 downto 0);diA : in std_logic_vector(WIDTHA - 1 downto 0);diB : in std_logic_vector(WIDTHB - 1 downto 0);doA : out std_logic_vector(WIDTHA - 1 downto 0);doB : out std_logic_vector(WIDTHB - 1 downto 0)

);

end asym_ram_tdp_write_first;

architecture behavioral of asym_ram_tdp_write_first isfunction max(L, R : INTEGER) return INTEGER isbeginif L > R thenreturn L;

elsereturn R;

end if;end;

function min(L, R : INTEGER) return INTEGER isbeginif L < R thenreturn L;

elsereturn R;

end if;end;

function log2(val : INTEGER) return natural isvariable res : natural;

beginfor i in 0 to 31 loopif (val <= (2 ** i)) thenres := i;

合成 japan.xilinx.com 127UG901 (v2015.3) 2015 年 9 月 30 日

Page 128: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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');

beginprocess(clkA)beginif rising_edge(clkA) thenif enA = '1' thenif weA = '1' thenmy_ram(conv_integer(addrA)) <= diA;readA <= diA;

elsereadA <= my_ram(conv_integer(addrA));

end if;end if;regA <= readA;

end if;end process;

process(clkB)beginif rising_edge(clkB) thenfor i in 0 to RATIO - 1 loopif enB = '1' thenif weB = '1' thenmy_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 -- mechanismreadB((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;

合成 japan.xilinx.com 128UG901 (v2015.3) 2015 年 9 月 30 日

Page 129: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

Write-First モー ドの完全なデュアル ポー ト 非対称 RAM のコー ド例 (Verilog)

// 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;beginif (value < 2)log2 = value;

elsebeginshifted = value-1;for (res=0; shifted>0; res=res+1)shifted = shifted>>1;

log2 = res;end

endendfunction

localparam maxSIZE = `max(SIZEA, SIZEB);localparam maxWIDTH = `max(WIDTHA, WIDTHB);localparam minWIDTH = `min(WIDTHA, WIDTHB);

localparam RATIO = maxWIDTH / minWIDTH;localparam log2RATIO = log2(RATIO);

reg [minWIDTH-1:0] RAM [0:maxSIZE-1];reg [WIDTHA-1:0] readA;reg [WIDTHB-1:0] readB;

合成 japan.xilinx.com 129UG901 (v2015.3) 2015 年 9 月 30 日

Page 130: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

always @(posedge clkB)beginif (enaB) beginif (weB)RAM[addrB] = diB;

readB = RAM[addrB] ;end

end

always @(posedge clkA)begin : portAinteger 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

合成 japan.xilinx.com 130UG901 (v2015.3) 2015 年 9 月 30 日

Page 131: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 3 章 : 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 進数を混ぜて使用する こ と はでき ません。

• 外部データ フ ァ イルには、 コ メ ン ト などのその他の内容を含める こ と はでき ません。

• 次の外部データ フ ァ イルは、 8 X 32 ビ ッ ト RAM を 2 進数値で初期化し ています。

0000111011000001100111101100011000101011001011010101001000100011011101000101000110000111000011110100000101000010010100111001010000001001101001111111101000101011001011010010111111101010101001111110111100010011100011110110110110001111010010011001000011101111

合成 japan.xilinx.com 131UG901 (v2015.3) 2015 年 9 月 30 日

Page 132: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

0000000110001110001111001001111111011111001110101011111001001010111001110101001111101100110010101100010000100110110011110010100110001011100101011111111111100001111101011101100100000101101110100100101100000011100101011010111011100001111111001010111010011110011011110110100101000011011100010101010001101111100001100010010011110000111101101111001100001011101011010011110101001001000111000101110000101011111110111010111001011101000100100111010010110101111101110001000001010111011011011110011111000111101010110000110101110100000011101111111000011111000100111101011110001110010111010110111000111110001101010110111110111100000000010011101011011011110000010011010011011111000100000001111111001011011001111101010101100100100000011100100101110000100010000001001110110010100011111100100010001110100101000110000110000000100111010011100111100011110111110100101000101010100001111000000011011110100011111011101110110011010111101111000110011001000101111000010010101101110111001001110010111010111101101011001101010011101101010001110110011010011110110111000101010001010000011000100000011001011011100110101011101000001101010000111001010110111000111111000001111101011101010100101000000000111111110110111100100011000011001000000010001111100110001110101100010010111001001111111111101111010100010100011111000011000101000011100110100000011011010010111110101000111010011000011110110010100111001101011111010110100100101110110010100100010011111110011011010111110010111101100100110111011000010011011110110110110111100101110011100110100111001110010000101111110101100000000000101101111100101011001010100110011010000010001000011011110010101111110010011100011101010010000110001000011100010100100000111100101111110001101101111010110000100010100000000101001000011100000100011000110100010100111010010011010100010001100100100111

合成 japan.xilinx.com 132UG901 (v2015.3) 2015 年 9 月 30 日

Page 133: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

Verilog 例

2 進数データ を読み込むには $readmemb、 16 進数データ を読み込むには $readmemh を使用し ます。

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

合成 japan.xilinx.com 133UG901 (v2015.3) 2015 年 9 月 30 日

Page 134: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

ブロ ッ ク RAM の初期化のコー ド例 (Verilog)

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

合成 japan.xilinx.com 134UG901 (v2015.3) 2015 年 9 月 30 日

Page 135: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

ブロ ッ ク RAM の初期化のコー ド例 (VHDL)

-- Initializing Block RAM (Single-Port Block RAM)-- File: rams_sp_rom.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity rams_sp_rom isport(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 istype 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");

beginprocess(clk)beginif rising_edge(clk) thenif we = '1' thenRAM(conv_integer(addr)) <= di;

end if;do <= RAM(conv_integer(addr));

end if;end process;

end syn;

合成 japan.xilinx.com 135UG901 (v2015.3) 2015 年 9 月 30 日

Page 136: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

外部データ フ ァ イルからのブロ ッ ク RAM の初期化のコー ド例 (Verilog)

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

合成 japan.xilinx.com 136UG901 (v2015.3) 2015 年 9 月 30 日

Page 137: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

外部データ フ ァ イルからのブロ ッ ク RAM の初期化のコー ド例 (VHDL)

-- Initializing Block RAM from external data file-- File: rams_init_file.vhd

library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use std.textio.all;

entity rams_init_file isport(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 istype RamType is array (0 to 63) 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_init_file.data");beginprocess(clk)beginif clk'event and clk = '1' thenif we = '1' thenRAM(conv_integer(addr)) <= to_bitvector(din);

end if;dout <= to_stdlogicvector(RAM(conv_integer(addr)));

end if;end process;

end syn;

合成 japan.xilinx.com 137UG901 (v2015.3) 2015 年 9 月 30 日

Page 138: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

ブ ラ ッ ク ボ ッ クスデザイ ンには、 次で生成された EDIF フ ァ イルを含める こ と ができ ます。

• 合成ツール

• 回路図テキス ト エデ ィ ター

• その他のデザイ ン入力方法

これらのモジュールをデザイ ンのほかの部分に接続するには、 イ ン ス タ ンシエー ト する必要があ り ます。

HDL ソース コード でブラ ッ ク ボ ッ ク ス イ ン ス タ ンシエーシ ョ ンを使用し ます。

Vivado 合成では、 これらのブラ ッ ク ボ ッ ク ス イ ン ス タ ンシエーシ ョ ンに制約を適用でき ます。

デザイ ンをブラ ッ ク ボ ッ ク スにする と、 そのデザイ ンのほかのイ ン ス タ ン ス もブラ ッ ク ボ ッ ク スにな り ます。

コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

ブ ラ ッ ク ボ ッ ク スの例 (Verilog)

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

合成 japan.xilinx.com 138UG901 (v2015.3) 2015 年 9 月 30 日

Page 139: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

ブ ラ ッ ク ボ ッ ク スの例 (VHDL)

-- Black Box-- black_box_1.vhdlibrary ieee;use ieee.std_logic_1164.all;

entity black_box_1 isport(DI_1, DI_2 : in std_logic; DOUT : out std_logic);

end black_box_1;architecture rtl of black_box_1 iscomponent black_box1port(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";

beginU1 : black_box1 port map(I1 => DI_1, I2 => DI_2, O => DOUT);

end rtl;

合成 japan.xilinx.com 139UG901 (v2015.3) 2015 年 9 月 30 日

Page 140: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

FSM コ ンポーネン ト

Vivado 合成の機能

• 同期有限ステー ト マシン (FSM) コ ンポーネン ト に特定の推論機能

• 適化の目標に対応し たビル ト イ ン FSM エン コード ス ト ラ テジ

• FSM 抽出はデフ ォル ト でイネーブル

• FSM 抽出をデ ィ スエーブルにするには -fsm_extraction off を使用

FSM 記述

Vivado 合成では、 ムーア型と ミ ー リ ー型の両方の有限ステー ト マシン (FSM) がサポー ト されます。 FSM には、 次が 含まれます。

• ステー ト レジス タ

• 次ステー ト 関数

• 出力関数

FSM の図

次に、 ミ ー リ ー型マシン と ムーア型マシンを組み込んだ FSM の図を示し ます。

次に、 3 つのプロセス を使用し た FSM の図を示し ます。

X-Ref Target - Figure 3-2

図 3-2 : ミ ーリー型マシン とムーア型マシンを組み込んだ FSM

X-Ref Target - Figure 3-3

図 3-3 : 3 つのプロセスを使用し た FSM

合成 japan.xilinx.com 140UG901 (v2015.3) 2015 年 9 月 30 日

Page 141: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

FSM レジス タ

• リ セ ッ ト または電源投入ステー ト を指定し て有限ステー ト マシン (FSM) を認識させるか、 FSM_ENCODING を "none" に設定し ます。

• ステー ト レジス タは、 特定のステー ト に対し て非同期または同期に リ セ ッ ト でき ます。

推奨 : FSM には、 非同期 リ セ ッ ト ロ ジ ッ ク よ り も同期 リ セ ッ ト ロ ジ ッ ク を使用する こ と をお勧めし ます。

自動ステー ト エン コー ド

FSM_ENCODING を "auto" に設定する と、 Vivado 合成で各 FSM に 適なエン コード方法が自動的に選択されます。

ワンホ ッ ト ステー ト エン コー ド

ワ ンホ ッ ト ステー ト エン コード には、 次のよ う な特徴があ り ます。

• 32 ステー ト までのステー ト マシンのデフ ォル ト エン コード方法です。

• 速度を 適化し た り 、 消費電力を削減する場合に適し ています。

• 各 FSM ステー ト にコード の各ビ ッ ト が割 り 当て られます。

• 各ステー ト に 1 つのフ リ ッ プフ ロ ッ プを使用し たステー ト レジス タ を イ ンプ リ メ ン ト し ます。

• 1 つの ク ロ ッ ク サイ クルで 1 つのステー ト レジス タのみがアサー ト されます。

• 2 つのステー ト 間を遷移する際、 2 つのビ ッ ト のみが ト グルし ます。

グレ イ ステー ト エン コー ド

グレ イ ステー ト エン コード には、 次のよ う な特徴があ り ます。

• 連続し た 2 つのステー ト 間では、 1 ビ ッ ト しか切 り 替わ り ません。

• 分岐のない長いパス を持つコ ン ト ローラに適し ています。

• ハザードやグ リ ッチを 小限に抑えます。

• 消費電力を 小限に抑え るために使用でき ます。

ジ ョ ン ソ ン ステー ト エン コー ド

ジ ョ ン ソ ン ステー ト エン コード は、 グレ イ ステー ト エン コード と同様、分岐のない長いパス を含むステー ト マシン に適し ています。

シーケンシ ャル ステー ト エン コー ド

シーケンシャル ステー ト エン コード には、 次のよ う な特徴があ り ます。

• 長いパス を識別し ます。

• これらのパスのステー ト に連続する基数コード を 2 つ適用し ます。

• 次ステー ト の論理式を 小限に抑えます。

合成 japan.xilinx.com 141UG901 (v2015.3) 2015 年 9 月 30 日

Page 142: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

FSM の例 (Verilog)

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

合成 japan.xilinx.com 142UG901 (v2015.3) 2015 年 9 月 30 日

Page 143: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

1 つのシーケンシ ャル ブロ ッ ク を使用する FSM のコー ド例 (VHDL)

-- State Machine with single sequential block-- File: fsm_1.vhdlibrary IEEE;use IEEE.std_logic_1164.all;

entity fsm_1 isport(clk, reset, flag : IN std_logic;sm_out : OUT std_logic

);end entity;

architecture behavioral of fsm_1 istype state_type is (s1, s2, s3, s4, s5);signal state : state_type;

beginprocess(clk)beginif rising_edge(clk) thenif (reset = '1') thenstate <= s1;sm_out <= '1';

elsecase state iswhen s1 => if flag = '1' then

state <= s2;sm_out <= '1';

elsestate <= 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;

合成 japan.xilinx.com 143UG901 (v2015.3) 2015 年 9 月 30 日

Page 144: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 3 章 : 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 属性を使用し ます。 詳細は、 47 ページの 「ROM_STYLE」 を参照し て く ださい。

ブロ ッ ク RAM リ ソースを使用し た ROM のコー ド例 (Verilog)// ROMs Using Block RAM Resources.// File: rams_sp_rom_1.v//module rams_sp_rom_1 (clk, en, addr, dout);inputclk;inputen;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;

合成 japan.xilinx.com 144UG901 (v2015.3) 2015 年 9 月 30 日

Page 145: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

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

合成 japan.xilinx.com 145UG901 (v2015.3) 2015 年 9 月 30 日

Page 146: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

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

配列に対する ROM の推論の例 (VHDL)-- ROM Inference on array-- File: roms_1.vhdlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;

entity roms_1 isport(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 istype 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";

beginprocess(clk)beginif rising_edge(clk) thenif (en = '1') thendata <= ROM(conv_integer(addr));

end if;end if;

end process;

end behavioral;

合成 japan.xilinx.com 146UG901 (v2015.3) 2015 年 9 月 30 日

Page 147: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章

VHDL サポー ト

概要この章では、 Vivado 合成でサポー ト される VHDL の構文と例外を示し ます。

VHDL では、 複雑な ロ ジ ッ ク を簡潔に記述でき、 次が可能です。

• システムをサブシステムに分割する方法や、 分割されたサブシステムを相互接続する方法など、 システムの構造を記述でき ます。

• 使い慣れたプロ グ ラ ミ ング言語形式でシステムの機能を指定でき ます。

• イ ンプ リ メ ンテーシ ョ ンおよびハード ウ ェアへのプログ ラ ム前にシステム デザイ ンをシ ミ ュ レーシ ョ ンでき ます。

• 抽象的な記述から、 合成し てデバイ ス特定の詳細なデザイ ン バージ ョ ンを生成でき ます。

詳細は、 『IEEE Standard VHDL Language Reference Manual』 (LRM) を参照し て く ださい。

サポー ト される VHDL データ型とサポー ト されない VHDL データ型一部の VHDL データ型は、定義済みパッ ケージの一部です。それらのコ ンパイル場所および読み込み方法は、174 ペー ジの 「VHDL の定義済みパッ ケージ」 を参照し て く ださい。

IEEE std_logic_1164 パッ ケージで定義されるデータ型

サポー ト されないデータ型

VHDL では、標準パッ ケージの real 型は、ジェネ リ ッ ク値の計算など、計算を実行する目的でのみサポー ト されます。

重要 : real 型の合成可能オブジェ ク ト を定義する こ と はでき ません。

合成 japan.xilinx.com 147UG901 (v2015.3) 2015 年 9 月 30 日

Page 148: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

VHDL データ型

VHDL の定義済み列挙型

Vivado 合成では、 ハード ウ ェ ア記述で次の定義済み VHDL 列挙型がサポー ト されます。

std_logic に使用可能な値

サポー ト されるオーバーロー ド列挙型

表 4-1 : VHDL 列挙型のサマ リ

列挙型 定義されているパッ ケージ 有効な値

bit 標準パッ ケージ 0 (論理 0)1 (論理 1)

boolean 標準パッ ケージ falsetrue

std_logic IEEE std_logic_1164 パッ ケージ 「std_logic に使用可能な値」 を参照

表 4-2 : std_logic に使用可能な値

値 説明 Vivado 合成での処理

U 初期化 Vivado 合成では使用不可

X 不定 ド ン ト ケア と し て処理

0 Low ロ ジ ッ ク 0 と し て処理

1 High ロ ジ ッ ク 1 と し て処理

Z ハイ イ ンピーダン ス ハイ イ ンピーダン ス と し て処理

W 弱い信号の不定 Vivado 合成では使用不可

L 弱い信号の Low 0 と同様に処理

H 弱い信号の High 1 と同様に処理

- ド ン ト ケア ド ン ト ケア と し て処理

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

合成 japan.xilinx.com 148UG901 (v2015.3) 2015 年 9 月 30 日

Page 149: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : 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 次元を超えないよ う に記述する こ と をお勧めし ます。

多次元配列型のオブジェ ク ト は、 関数に渡し た り 、 コ ンポーネン ト イ ン ス タ ンシエーシ ョ ンで使用でき ます。 記述可 能な多次元配列のオブジェ ク ト は、 信号、 定数、 変数です。

完全に制約された配列型のコー ド例

配列型は、 すべての次元で完全に制約する必要があ り ます。

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;

表 4-4 : サポー ト される VHDL のビ ッ ト ベク ター型

データ型 定義されているパッ ケージ モデル

bit_vector 標準 ビ ッ ト 要素のベク ター

std_logic_vector IEEE std_logic_1164 std_logic 要素のベク ター

表 4-5 : サポー ト される VHDL のオーバーロー ド型

データ型 定義されている IEEE パッ ケージ

std_ulogic_vector std_logic_1164

unsigned std_logic_arith

signed std_logic_arith

合成 japan.xilinx.com 149UG901 (v2015.3) 2015 年 9 月 30 日

Page 150: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

マ ト リ ッ クス と し て宣言された配列のコー ド例

配列をマ ト リ ッ ク ス と し て宣言でき ます。

subtype TAB13 is array (7 downto 0,4 downto 0) of STD_LOGIC_VECTOR (8 downto 0);

多次元配列の信号および変数のコー ド例

次に、 代入文で多次元配列の信号および変数を使用する コード例を示し ます。

1. 次のよ う に宣言する と し ます。

subtype WORD8 is STD_LOGIC_VECTOR (7 downto 0);type TAB05 is array (4 downto 0) of WORD8;type TAB03 is array (2 downto 0) of TAB05;signal WORD_A : WORD8;signal TAB_A, TAB_B : TAB05;signal TAB_C, TAB_D : TAB03;constant CNST_A : TAB03 := (("00000000","01000001","01000010","10000011","00001100"),("00100000","00100001","00101010","10100011","00101100"),("01000010","01000010","01000100","01000111","01000100"));

2. これで次を指定でき る よ う にな り ます。

• 多次元配列の信号または変数 :

TAB_A <= TAB_B; TAB_C <= TAB_D; TAB_C <= CNST_A;

• 1 配列のイ ンデッ ク ス :

TAB_A (5) <= WORD_A; TAB_C (1) <= TAB_A;

• 大次元数のイ ンデッ ク ス :

TAB_A (5) (0) <= ’1’; TAB_C (2) (5) (0) <= ’0’

• 初の配列のス ラ イ ス :

TAB_A (4 downto 1) <= TAB_B (3 downto 0);

• 高次元配列のイ ンデッ ク ス と低次元配列のス ラ イ ス :

TAB_C (2) (5) (3 downto 0) <= TAB_B (3) (4 downto 1); TAB_D (0) (4) (2 downto 0)\\ <= CNST_A (5 downto 3)

3. 次の宣言を追加し ます。

subtype MATRIX15 is array(4 downto 0, 2 downto 0) of STD_LOGIC_VECTOR (7 downto 0);signal MATRIX_A : MATRIX15;

4. これで次を指定でき る よ う にな り ます。

• 多次元配列の信号または変数 :

MATRIXA <= CNST_A

• 配列の 1 行のイ ンデッ ク ス :

MATRIXA (5) <= TAB_A;

• 大次元数のイ ンデッ ク ス :

MATRIXA (5,0) (0) <= ’1’;

注記 : イ ンデッ ク スは、 変数にでき ます。

合成 japan.xilinx.com 150UG901 (v2015.3) 2015 年 9 月 30 日

Page 151: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

VHDL レ コー ド型のコー ド例

• レ コード型のフ ィ ール ド も レ コード型にでき ます。

• 定数を レ コード型にでき ます。

• レ コード型に属性を含める こ と はでき ません。

• Vivado 合成では、 レ コード信号への集合代入がサポー ト されます。

次に例を示し ます。

type mytype is record field1 : std_logic;field2 : std_logic_vector (3 downto 0)

end record;

VHDL オブジ ェ ク トVHDL オブジェ ク ト には、 「信号」、 「変数」、 「定数」、 および 「演算子」 があ り ます。

信号

VHDL 信号は、 次で宣言でき ます。

• アーキテ クチャ宣言部分 : 宣言し た VHDL 信号を、 そのアーキテ クチャ内の任意の場所で使用し ます。

• ブロ ッ ク : 宣言し た VHDL 信号を、 そのブロ ッ ク内で使用し ます。

VHDL 信号は、 信号代入演算子 「<=」 を使用し て代入し ます。

signal sig1 : std_logic;sig1 <= ’1’;

変数

VHDL の変数は、 次のよ う に使用されます。

• process または subprogram で宣言し ます。

• その process または subprogram 内で使用されます。

• 代入演算子 「:=」 を使用し て代入し ます。

variable var1 : std_logic_vector (7 downto 0); var1 := “01010011”;

定数

VHDL 定数は、 宣言領域で宣言でき ます。 定数はその領域内で使用でき ます。 定数を宣言し た後、 その値を変更する こ と はでき ません。

signal sig1 : std_logic_vector (5 downto 0);constant init0 :std_logic_vector (5 downto 0) := "010111";sig1 <= init0;

合成 japan.xilinx.com 151UG901 (v2015.3) 2015 年 9 月 30 日

Page 152: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

演算子

Vivado 合成では、 VHDL の演算子がサポー ト されます。

シ フ ト 演算子の例

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

VHDL の回路記述

VHDL の回路記述 (デザイ ン ユニ ッ ト ) は、 次の部分で構成されています。

• エンテ ィ テ ィ 宣言 : 回路の外部表示を提供し ます。 I/O ポー ト およびジェネ リ ッ ク などの回路のイ ン ターフ ェ イ ス を含む、 外側から見え るオブジェ ク ト を記述し ます。

• アーキテ クチャ : 回路の内部表示を提供し、 回路の動作または構造を記述し ます。

VHDL のエンテ ィ テ ィ 宣言

回路の I/O ポー ト はエンテ ィ テ ィ で宣言し ます。 各ポー ト に次を指定し ます。

• 名前

• モード (in、 out、 inout、 buffer)

• データ型

制約されたポー ト と制約されていないポー ト

ポー ト を定義する際、 ポー ト は次のよ う にな り ます。

• 制約を設定する こ と も し ないこ と も でき ます。

• 通常は制約されます。

• エンテ ィ テ ィ 宣言部分では制約を設定し ないま まにでき ます。

° ポー ト に制約を設定し ない場合は、 フ ォーマル ポー ト と実際の信号を接続する と きに、 イ ン ス タ ンシエー シ ョ ンでポー ト の幅を定義し ます。

° ポー ト に制約を設定し ない場合、 同じエンテ ィ テ ィ のイ ン ス タ ンシエーシ ョ ンを複数作成し、 異なるポー ト幅を定義でき ます。

表 4-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) srl 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);

合成 japan.xilinx.com 152UG901 (v2015.3) 2015 年 9 月 30 日

Page 153: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

推奨 : 制約の設定されていないポー ト は使用し ないで く ださい。 ジェネ リ ッ ク を使用し て制約し たポー ト を定義し ま す。 イ ン ス タ ンシエーシ ョ ン時にこれらのジェネ リ ッ ク に異なる値を適用し ます。 上位エンテ ィ テ ィ には制約を設定し ていないポー ト を含めないで く ださい。

ポー ト には 2 次元以上の配列型は使用でき ません。

エンテ ィ テ ィ 宣言でも 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 を出力と し て宣言し ます。

合成 japan.xilinx.com 153UG901 (v2015.3) 2015 年 9 月 30 日

Page 154: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : 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;

合成 japan.xilinx.com 154UG901 (v2015.3) 2015 年 9 月 30 日

Page 155: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

VHDL のコ ンポーネン ト イ ンス タ ンシエーシ ョ ン

コ ンポーネン ト イ ン ス タ ンシエーシ ョ ンを使用する と、 1 つのデザイ ン ユニ ッ ト (コ ンポーネン ト ) を別のデザイ ン ユニ ッ ト 内にイ ン ス タ ンシエー ト し て、 階層構造デザイ ンを記述でき ます。

コ ンポーネン ト イ ン ス タ ンシエーシ ョ ンを実行するには、 次の手順に従います。

1. イ ン ス タ ンシエー ト する機能を記述し たデザイ ン ユニ ッ ト (エンテ ィ テ ィ と アーキテ クチャ ) を作成し ます。

2. 親デザイ ン ユニ ッ ト のアーキテ クチャの宣言部分にイ ン ス タ ンシエー ト する コ ンポーネン ト を宣言し ます。

3. 親デザイ ン ユニ ッ ト のアーキテ クチャの本体でこ のコ ンポーネン ト を イ ン ス タ ンシエー ト し て接続し ます。

4. コ ンポーネン ト のフ ォーマル ポー ト を親デザイ ン ユニ ッ ト の実際の信号およびポー ト にマ ッ プ (接続) し ます。

コ ンポーネン ト イ ンス タ ンシエーシ ョ ン文の要素

Vivado 合成では、 コ ンポーネン ト 宣言で制約されていないベク ターがサポー ト されます。

コ ンポーネン ト イ ン ス タ ンシエーシ ョ ン文の主な要素は、 次の とお り です。

• ラベル : イ ン ス タ ン ス を識別し ます。

• 関連付け リ ス ト : 予約語の port map キーワード で開始し、 コ ンポーネン ト のフ ォーマル ポー ト を親デザイ ン ユニ ッ ト の実際の信号またはポー ト に接続し ます。オプシ ョ ンの関連付け リ ス ト は予約語の generic map キー ワード で開始し、 実際の値を コ ンポーネン ト で定義される フ ォーマル ジェネ リ ッ ク に供給し ます。

合成 japan.xilinx.com 155UG901 (v2015.3) 2015 年 9 月 30 日

Page 156: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

VHDL のコ ンポーネン ト イ ンス タ ンシエーシ ョ ンのコー ド例

次に、 4 つの nand2 コ ンポーネン ト から構成される半加算器の構造記述例を示し ます。

---- A simple component instantiation example-- Involves a component declaration and the component instantiation itself---- instantiation_simple.vhd--entity sub isgeneric(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 isbeginO <= A & B;

end ARCHI;

entity instantiation_simple isgeneric(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 iscomponent sub -- component declarationgeneric(WIDTH : integer := 2);

port(A, B : in BIT_VECTOR(WIDTH - 1 downto 0);O : out BIT_VECTOR(2 * WIDTH - 1 downto 0));

end component;

begininst_sub : sub -- component instantiationgeneric map(WIDTH => WIDTH

)port map(A => X,B => Y,O => Z

);

end ARCHI;

合成 japan.xilinx.com 156UG901 (v2015.3) 2015 年 9 月 30 日

Page 157: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

再帰的な コ ンポーネン ト イ ンス タ ンシエーシ ョ ン

Vivado 合成では、 再帰的なコ ンポーネン ト イ ン ス タ ンシエーシ ョ ンがサポー ト されます。

再帰的な コ ンポーネン ト イ ンス タ ンシエーシ ョ ンのコー ド例

---- Recursive component instantiation---- instantiation_recursive.vhd--library ieee;use ieee.std_logic_1164.all;library unisim;use unisim.vcomponents.all;

entity instantiation_recursive isgeneric(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 iscomponent instantiation_recursivegeneric(sh_st : integer);

port(CLK : in std_logic;DI : in std_logic;DO : out std_logic);

end component;signal tmp : std_logic;

beginGEN_FD_LAST : if sh_st = 1 generateinst_fd : FD port map(D => DI, C => CLK, Q => DO);

end generate;GEN_FD_INTERM : if sh_st /= 1 generateinst_fd : FD port map(D => DI, C => CLK, Q => tmp);inst_sstage : instantiation_recursivegeneric map(sh_st => sh_st - 1)port map(DI => tmp, CLK => CLK, DO => DO);

end generate;end recursive;

合成 japan.xilinx.com 157UG901 (v2015.3) 2015 年 9 月 30 日

Page 158: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : 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 つだけ記述し ます。 詳細は、 159 ページの 「ジェネ リ ッ ク パラ メ ーターの例」 を参照し て く ださい。

ジ ェ ネ リ ッ クの宣言

ジ ェ ネ リ ッ ク パラ メ ーターは、 エンテ ィ テ ィ の宣言部分で宣言でき ます。 サポー ト される ジ ェ ネ リ ッ ク タ イ プは、 integer、 boolean、 string、 および real です。

合成 japan.xilinx.com 158UG901 (v2015.3) 2015 年 9 月 30 日

Page 159: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

ジ ェ ネ リ ッ ク パラ メ ーターの例

-- VHDL generic parameters example---- generics_1.vhd--library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;

entity addern isgeneric(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 isbeginY <= A + B;

end bhv;

Library IEEE;use IEEE.std_logic_1164.all;

entity generics_1 isport(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 iscomponent adderngeneric(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);

beginU1 : 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;

合成 japan.xilinx.com 159UG901 (v2015.3) 2015 年 9 月 30 日

Page 160: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

VHDL の組み合わせ回路組み合わせロ ジ ッ ク は、 アーキテ ク チャの本体で指定される同時処理信号代入を使用し て記述されます。 同時処理信号代入は、 必要に応じ てい く つで も記述でき ます。 アーキテ ク チャ部分での同時処理信号代入の順序は関係あ りません。

VHDL の同時処理信号代入

同時処理信号代入は同時にア ク テ ィ ブで、 代入文の右辺の信号の値が変化し た と きに再評価されます。 再評価された結果は、 左辺の信号に代入されます。

サポー ト される同時処理信号代入を、 「シンプルな信号代入の例」 および 「同時選択代入の例」 に示し ます。

シンプルな信号代入の例

T <= A and B;

同時選択代入の例

-- Concurrent selection assignment in VHDL---- concurrent_selected_assignment.vhd--library ieee;use ieee.std_logic_1164.all;

entity concurrent_selected_assignment isgeneric(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 isbeginwith sel select T <=a when "00",b when "01",c when "10",d when others;

end bhv;

合成 japan.xilinx.com 160UG901 (v2015.3) 2015 年 9 月 30 日

Page 161: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

generate 文次の generate 文があ り ます。

• for-generate 文

• if-generate 文

for-generate 文

for-generate 文は、 反復構造を記述し ます。

for-generate 文の例

次の例では、 for-generate 文で、 8 ビ ッ ト 加算器の各ビ ッ ト の結果と キ ャ リ ー ア ウ ト の算出を記述し ています。

---- A for-generate example---- for_generate.vhd--entity for_generate isport(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 issignal C : BIT_VECTOR(0 to 8);

beginC(0) <= CIN;COUT <= C(8);LOOP_ADD : for I in 0 to 7 generateSUM(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;

if-generate 文

if-generate 文は、 テス ト 結果に基づいて HDL ソース コード の特定の部分をア ク テ ィ ブにし ます。 ス タ テ ィ ッ ク 条件でサポー ト されます。

た と えば、 ジェネ リ ッ ク がどのデバイ ス フ ァ ミ リ を ターゲ ッ ト にするか示す場合、 if-generate 文によ り 特定のデ バイ ス フ ァ ミ リ に対し てジェネ リ ッ ク の値がテス ト され、 HDL ソース コード のそのデバイ ス フ ァ ミ リ 用に記述され たセ ク シ ョ ンがア ク テ ィ ブにな り ます。

合成 japan.xilinx.com 161UG901 (v2015.3) 2015 年 9 月 30 日

Page 162: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

if-generate 文内でネス ト された for-generate 文の例

次のコード 例では、 ジェネ リ ッ ク の N ビ ッ ト 加算器 (幅 4 ~ 32) を if-generate および for-generate 文で記述 し ています。

-- A for-generate nested in a if-generate---- if_for_generate.vhd--entity if_for_generate isgeneric(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 issignal C : BIT_VECTOR(N + 1 downto 0);

beginIF_N : if (N >= 4 and N <= 32) generateC(0) <= CIN;COUT <= C(N + 1);LOOP_ADD : for I in 0 to N generateSUM(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;

組み合わせプロセス

VHDL の組み合わせロ ジ ッ クは、 プロセスで記述でき ます。 プロセスは、 プロセスが実行されるたびに信号に新しい 値を代入し ます。

重要 : 信号に現在の値は保持されません。 プロセスには、 ローカル変数を含める こ と ができ ます。

メ モ リ エレ メ ン ト

組み合わせプロセスから推論されたハード ウ ェ アには、 メ モ リ エレ メ ン ト は含まれません。

プロセスで代入されるすべての信号が、 常にプロセス ブロ ッ ク内のすべての可能なパスで明示的に代入される場合、 メ モ リ エレ メ ン ト プロセスは組み合わせプロセス と な り ます。

if 文または case 文のすべての分岐で信号が明示的に代入されていない場合は、 通常ラ ッチが推論されます。

重要 : Vivado 合成で予測されないラ ッチが推論された場合は、HDL コード に明示的に代入されていない信号がないか ど う かを確認し ます。

合成 japan.xilinx.com 162UG901 (v2015.3) 2015 年 9 月 30 日

Page 163: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

センシテ ィ ビテ ィ リ ス ト

組み合わせプロセスには、 センシテ ィ ビテ ィ リ ス ト が含まれます。 センシテ ィ ビテ ィ リ ス ト は、 PROCESS キーワー ド の後にかっ こ で囲まれます。 センシテ ィ ビテ ィ リ ス ト にあ る信号のいずれかにイベン ト (値の変化) が発生する と、 プロセスが実行されます。

組み合わせプロセスの場合、 センシテ ィ ビテ ィ リ ス ト には次を含める必要があ り ます。

• if および case などの条件で使用する信号

• 代入文の右辺の信号

不足し ている信号

センシテ ィ ビテ ィ リ ス ト に不足し ている信号があ る場合があ り ます。 センシテ ィ ビテ ィ リ ス ト に 1 つまたは複数の 不足し ている信号があ る場合、 次のよ う にな り ます。

• 合成結果が初期のデザイ ン仕様 と異なる ものになる可能性があ り ます。

• Vivado 合成で警告 メ ッ セージが表示されます。

• 不足し ている信号がセンシテ ィ ビテ ィ リ ス ト に追加されます。

重要 : シ ミ ュ レーシ ョ ン中の問題を回避するには、 HDL ソース コー ド に不足し ている信号を追加し て合成を再実行 し ます。

変数および信号の代入

Vivado 合成では、 VHDL の変数および信号代入がサポー ト されます。 プロセスには、 ローカル変数を含める こ と がで き ます。 ローカル変数は、 プロセス内で宣言し て使用され、 通常プロセスの外部からは見えません。

プロセス内での信号代入の例

-- Signal assignment in a process-- signal_in_process.vhd

entity signal_in_process isport(A, B : in BIT;S : out BIT

);end signal_in_process;

architecture archi of signal_in_process isbeginprocess(A, B)beginS <= '0';if ((A and B) = '1') thenS <= '1';

end if;end process;

end archi;

合成 japan.xilinx.com 163UG901 (v2015.3) 2015 年 9 月 30 日

Page 164: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

プロセス内での変数および信号代入の例

-- 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 isport(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 isbeginprocess(A, B, ADD_SUB)variable AUX : std_logic_vector(3 downto 0);

beginif ADD_SUB = '1' thenAUX := A + B;

elseAUX := A - B;

end if;S <= AUX;

end process;end archi;

if-else 文

if-else 文および if-elsif-else 文では、 真偽条件 (TRUE/FALSE) によ って実行される文が決ま り ます。

• 条件が真 と判断された場合は if 文が実行されます。

• 条件が偽、 x、 または z と判断された場合は else 文が実行されます。

° 複数の文を含むブロ ッ ク を if または else 分岐文内で実行でき ます。

° begin および end キーワード が必要です。

° if-else 文はネス ト させる こ と ができ ます。

合成 japan.xilinx.com 164UG901 (v2015.3) 2015 年 9 月 30 日

Page 165: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

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;

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;

合成 japan.xilinx.com 165UG901 (v2015.3) 2015 年 9 月 30 日

Page 166: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

for-loop 文

Vivado 合成 では、 for-loop 文で次の要素がサポー ト されます。

• 定数範囲

• 演算子 <、 <=、 >、 および >= を使用し たテス ト ス ト ッ プ コ ンデ ィ シ ョ ン

• 次のいずれかに適合する次ステ ッ プの計算

° var = var + step

° var = var - step

説明 :

- var : ループ変数

- step : 定数値

• next および exit 文

for-loop 文の例

---- For-loop example---- for_loop.vhd--library IEEE;use IEEE.std_logic_1164.all;use IEEE.std_logic_unsigned.all;

entity for_loop isport(a : in std_logic_vector(7 downto 0);Count : out std_logic_vector(2 downto 0)

);end for_loop;

architecture behavior of for_loop isbeginprocess(a)variable Count_Aux : std_logic_vector(2 downto 0);

beginCount_Aux := "000";for i in a'range loopif (a(i) = '0') thenCount_Aux := Count_Aux + 1;

end if;end loop;Count <= Count_Aux;

end process;end behavior;

合成 japan.xilinx.com 166UG901 (v2015.3) 2015 年 9 月 30 日

Page 167: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : 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

表 4-7 : 非同期制御ロジ ッ ク記述のサマ リ

記述するロジ ッ ク 内容 記述する位置

非同期制御ロ ジ ッ ク 非同期セ ッ ト / リ セ ッ ト ク ロ ッ ク イベン ト 文の前

同期ロ ジ ッ ク データ

同期セ ッ ト / リ セ ッ ト (オプシ ョ ン)ク ロ ッ ク イネーブル (オプシ ョ ン)

ク ロ ッ ク イベン ト の if 分岐内

合成 japan.xilinx.com 167UG901 (v2015.3) 2015 年 9 月 30 日

Page 168: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : 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;

合成 japan.xilinx.com 168UG901 (v2015.3) 2015 年 9 月 30 日

Page 169: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

同期制御ロジ ッ クの記述

ク ロ ッ ク イ ネーブルを記述する同じ コード記述方法を使用し て、同期 リ セ ッ ト またはセ ッ ト などの同期制御ロ ジ ッ ク を記述でき ます。

重要 : センシテ ィ ビテ ィ リ ス ト のないプロ セス を使用し て非同期制御ロ ジ ッ ク を持つ順次エレ メ ン ト を記述する こ と はでき ません。 このよ う な機能を記述でき るのは、 センシテ ィ ビテ ィ リ ス ト 付きのプロセス文のみです。Vivado 合 成では、 wait 文に基づ く ラ ッチの記述は使用でき ません。 同期ロ ジ ッ クは、 センシテ ィ ビテ ィ リ ス ト 付きプロセス を使用し た方が柔軟に記述でき ます。

VHDL の初期値と セ ッ ト /リ セ ッ ト レジス タは、 宣言する と きに初期化でき ます。 初期値は定数値で、 関数呼び出しから生成でき ます (外部データ フ ァ イルから初期値の読み込みなど)。 初期値は次のよ う にな り ます。

• 以前の初期値に依存させる こ と はでき ません。

• レジス タに伝搬するパラ メ ーター値にでき ます。

レジス タ を初期化する例 1

次のコード例は、回路に電源が投入された と き、およびグ ローバル リ セ ッ ト が適用された と きの順次エレ メ ン ト の初 期値を指定し ています。

signal arb_onebit :std_logic := '0';signal arb_priority : std_logic_vector(3 downto 0) := "1011";

合成 japan.xilinx.com 169UG901 (v2015.3) 2015 年 9 月 30 日

Page 170: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

レジス タ を初期化する例 2

次のコード例では、 電源投入時の初期化 と リ セ ッ ト によ る初期化の両方が指定されています。

---- 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 isPort(clk, rst : in std_logic;din : in std_logic;dout : out std_logic);

end initial_1;

architecture behavioral of initial_1 issignal arb_onebit : std_logic := '1'; -- power-up to vcc

beginprocess(clk)beginif (rising_edge(clk)) thenif rst = '1' then -- local synchronous resetarb_onebit <= '0';

elsearb_onebit <= din;

end if;end if;

end process;

dout <= arb_onebit;

end behavioral;

合成 japan.xilinx.com 170UG901 (v2015.3) 2015 年 9 月 30 日

Page 171: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

VHDL の関数と プロシージャデザイ ンでブロ ッ ク を複数回使用する場合は、 VHDL の関数およびプロ シージャ を使用し ます。 内容は組み合わせプ ロセス と類似し ています。

関数およびプロ シージャは、 次で宣言し ます。

• エンテ ィ テ ィ の宣言部

• アーキテ クチャ

• パッ ケージ

関数またはプロ シージャは、 宣言部 と本体で構成されます。

宣言部では、 次を指定し ます。

• input パラ メ ーター (範囲を制約する必要な し )

• 出力および入出力パラ メ ーター (プロ シージ ャのみ)

重要 : 解決関数は、 IEEE std_logic_1164 パッ ケージで定義される もの以外はサポー ト されません。

合成 japan.xilinx.com 171UG901 (v2015.3) 2015 年 9 月 30 日

Page 172: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

パッ ケージ内で宣言された関数の例

コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

次に、 ADD 関数をパッ ケージ内で宣言する コード例を示し ます。 ADD 関数は 1 ビ ッ ト 加算器で、 4 ビ ッ ト 加算器を作 成するために 4 回呼び出されます。 次の例では、 関数を使用し ています。

-- Declaration of a function in a package---- function_package_1.vhd--package PKG isfunction ADD(A, B, CIN : BIT) return BIT_VECTOR;

end PKG;

package body PKG isfunction ADD(A, B, CIN : BIT) return BIT_VECTOR isvariable S, COUT : BIT;variable RESULT : BIT_VECTOR(1 downto 0);

beginS := 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 isport(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 issignal S0, S1, S2, S3 : BIT_VECTOR(1 downto 0);

beginS0 <= 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;

合成 japan.xilinx.com 172UG901 (v2015.3) 2015 年 9 月 30 日

Page 173: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

パッ ケージ内で宣言されたプロシージャの例 次の例では、 パッ ケージ内でプロ シージャ を使用し ています。

-- Declaration of a procedure in a package---- Download: procedure_package_1.vhd--package PKG isprocedure ADD(A, B, CIN : in BIT;C : out BIT_VECTOR(1 downto 0));

end PKG;

package body PKG isprocedure ADD(A, B, CIN : in BIT;C : out BIT_VECTOR(1 downto 0)) isvariable S, COUT : BIT;

beginS := 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 isport(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 isbeginprocess(A, B, CIN)variable S0, S1, S2, S3 : BIT_VECTOR(1 downto 0);

beginADD(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;

合成 japan.xilinx.com 173UG901 (v2015.3) 2015 年 9 月 30 日

Page 174: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : 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 のアサー ト 文アサー ト 文は、 Vivado 合成ではサポー ト されません。

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 型

• 次のデータ型に基づ く 変換関数

° std_logic_arith (Synopsys)

° std_logic に基づ く 符号な しおよび符号付きのベク ター型

• 次のデータ型のオーバーロード された数値演算子、 変換関数、 および拡張関数

° numeric_std

° std_logic に基づ く 符号な しおよび符号付きのベク ター型

合成 japan.xilinx.com 174UG901 (v2015.3) 2015 年 9 月 30 日

Page 175: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

• 次のデータ型のオーバーロード された数値演算子、 変換関数、 および拡張関数

° std_logic_arith と同等

° 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 固定小数点パッ ケージ fixed_pkg は、固定小数点演算用の関数を含み、 ieee_proposed ラ イブラ リ にコ ンパ イルされています。 このパッ ケージを起動するには、 次を使用し ます。

ieee.std_logic_1164.all;ieee.numeric_std.all;library ieee_proposed;ieee_proposed.fixed_pkg.all;

定義済みの IEEE 浮動小数点パッ ケージ float_pkg は、 浮動小数点演算用の関数を含み、 ieee_proposed ラ イブ ラ リ にコ ンパイルされています。

このパッ ケージを起動するには、 次を使用し ます。

ieee.std_logic_1164.all;ieee.numeric_std.all;library ieee_proposed;ieee_proposed.float_pkg.all;

VHDL の定義済み IEEE 実数型および IEEE math_real パッ ケージ

VHDL の定義済み IEEE 実数型および IEEE math_real パッ ケージは、 ジェネ リ ッ ク値の計算などを実行する目的に のみ使用でき、 合成可能な機能を記述する こ と はでき ません。

VHDL の実数定数

次の表に、 VHDL の実数定数を示し ます。

表 4-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π

合成 japan.xilinx.com 175UG901 (v2015.3) 2015 年 9 月 30 日

Page 176: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : 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;

表 4-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)

合成 japan.xilinx.com 176UG901 (v2015.3) 2015 年 9 月 30 日

Page 177: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

VHDL パッ ケージへのアクセス

VHDL パッ ケージにア ク セスするには、 次を実行し ます。

1. パッ ケージがコ ンパイルされている ラ イブラ リ を library 節で指定し ます。 次に例を示し ます。

library library_name;

2. パッ ケージまたはパッ ケージに含まれる特有の定義を use 節で指定し ます。 次に例を示し ます。

use library_name.package_name.all;

3. これらの行は、 パッ ケージ定義を使用するエンテ ィ テ ィ またはアーキテ クチャ文の直前に挿入し ます。

デフ ォル ト のラ イブラ リ は work ラ イブラ リ なので、 指定し たパッ ケージがこ のラ イブラ リ にコ ンパイルされている 場合は、 library 節は必要あ り ません。

VHDL 構文のサポー ト ステータ ス Vivado 合成では、 VHDL のデザイ ン エンテ ィ テ ィ およびコ ンフ ィ ギ ュ レーシ ョ ンが次の表に示すよ う にサポー ト さ れます。

表 4-10 : VHDL 構文のサポー ト ステータ ス

VHDL 構文 サポー ト ステータ ス

VHDL エンテ ィ テ ィ ヘ ッ ダー

ジェネ リ ッ ク サポー ト あ り

ポー ト サポー ト あ り (制約されていないポー ト を含む)

エンテ ィ テ ィ 実行部 サポー ト な し

VHDL パッ ケージ

STANDARD TIME はサポー ト な し

VHDL の物理型

TIME 無視

REAL サポー ト あ り (定数計算用の関数でのみ)

VHDL モー ド

リ ンケージ サポー ト な し

VHDL の宣言

データ型 次をサポー ト :• 列挙型

• 定数範囲の正の値の型

• ビ ッ ト ベク ター型

• 多次元配列

VHDL オブジ ェ ク ト

定数宣言 サポー ト あ り (デ ィ フ ァード定数を除 く )

信号宣言 サポー ト あ り (レジス タ またはバス タ イプの信号を除 く )

属性宣言 一部の属性のみサポー ト 、 その他はスキ ッ プ

合成 japan.xilinx.com 177UG901 (v2015.3) 2015 年 9 月 30 日

Page 178: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

VHDL 仕様

HIGHLOW サポー ト あ り

LEFT サポー ト あ り

RIGHT サポー ト あ り

RANGE サポー ト あ り

REVERSE_RANGE サポー ト あ り

LENGTH サポー ト あ り

POS サポー ト あ り

ASCENDING サポー ト あ り

コ ンフ ィ ギュ レーシ ョ ン イ ン ス タ ン ス リ ス ト の all 節のみでサポー ト

• 節が追加されていない場合、デフ ォル ト ラ イブラ リ に コ ンパ イ ル さ れてい る エンテ ィ テ ィ ま たはアーキテクチャ を使用

接続解除 サポー ト な し

アンダース コ ア オブジ ェ ク ト 名に 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 のオペラ ン ド

抽象 リ テ ラル 整数 リ テ ラルのみサポー ト

物理 リ テ ラル 無視

列挙 リ テ ラル サポー ト あ り

文字列 リ テ ラル サポー ト あ り

ビ ッ ト 文字列 リ テ ラル サポー ト あ り

レ コード集合 サポー ト あ り

表 4-10 : VHDL 構文のサポー ト ステータ ス (続き)

VHDL 構文 サポー ト ステータ ス

合成 japan.xilinx.com 178UG901 (v2015.3) 2015 年 9 月 30 日

Page 179: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : 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 ス タ テ ィ ッ ク条件のみサポー ト

表 4-10 : VHDL 構文のサポー ト ステータ ス (続き)

VHDL 構文 サポー ト ステータ ス

合成 japan.xilinx.com 179UG901 (v2015.3) 2015 年 9 月 30 日

Page 180: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 4 章 : VHDL サポー ト

VHDL の予約語

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

合成 japan.xilinx.com 180UG901 (v2015.3) 2015 年 9 月 30 日

Page 181: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 5 章

VHDL-2008 言語サポー ト

概要Vivado 合成では、 VHDL-2008 標準の合成可能なサブセ ッ ト がサポー ト されます。 次のセ ク シ ョ ンに、 サポー ト されるサブセ ッ ト と その使用方法を説明し ます。

VHDL-2008 を使用するための Vivado の設定VHDL-2008 の設定はデフ ォル ト ではオフになってお り 、 非表示です。 VHDL フ ァ イルを VHDL-2008 と し てコ ンパイルするには、 次の Tcl パラ メ ーターを使用し ます。

set_param project.enableVHDL2008 1

このパラ メ ーターは、 Vivado IDE の [Tcl Console] ウ ィ ン ド ウに入力するか、 VHDL フ ァ イルを読み込む前にコマン ドラ イ ンに入力し ます。 パラ メ ーターを設定し た ら、 プロ ジェ ク ト ベース フ ローまたは非プロ ジェ ク ト ベース フ ローの両方で VHDL フ ァ イルを VHDL-2008 に設定でき ます。

合成 japan.xilinx.com 181UG901 (v2015.3) 2015 年 9 月 30 日

Page 182: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 5 章 : VHDL-2008 言語サポー ト

プロジ ェ ク ト ベース フ ロー

[Project Settings] ダ イ ア ロ グ ボ ッ ク スの [General] ページで [Target language] を [VHDL] に設定し、 [Use VHDL 2008] をオンにし ます。

X-Ref Target - Figure 5-1

図 5-1 : [Project Settings] ダイアログ ボッ クス : [General] ページ

合成 japan.xilinx.com 182UG901 (v2015.3) 2015 年 9 月 30 日

Page 183: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 5 章 : VHDL-2008 言語サポー ト

[Use VHDL 2008] オプシ ョ ンをオンにする と、 次の図に示すよ う に、 フ ァ イルを選択し て [Source File Properties] ウ ィン ド ウで [Type] に [VHDL 2008] を選択する こ と によ り 、 フ ァ イルを個別に VHDL-2008 に設定でき ます。

または、 [Tcl Console] ウ ィ ン ド ウに次のコマン ド を入力し て も フ ァ イルを VHDL-2008 に設定でき ます。

• Tcl コマン ド : set_property FILE_TYPE {VHDL 2008} [get_files <file>.vhd]

注記 : VHDL-2008 の一部の ラ イブ ラ リ (std_logic_1164、 std_logic_signed など) がア ッ プデー ト されています。 VivadoIDE で [Use VHDL 2008] をオンにする と、 VHDL フ ァ イルを コ ンパイルし た と きに新しい VHDL-2008 ラ イブラ リ が使用されます。個々のフ ァ イルが VHDL-2008 と し てマーク されていな く て も、新しい VHDL-2008 ラ イブラ リ が使用されます。

非プロジ ェ ク ト ベース フ ロー

非プロ ジ ェ ク ト ベース (Tcl) フ ローでは、 VHDL-2008 を含む VHDL フ ァ イルを読み込むには次のコマン ド を使用します。

• Tcl コマン ド : read_vhdl -vhdl2008 <file>.vhd

複数のフ ァ イルを読み込むには、 複数の read_vhdl コマン ド を使用するか、 1 つのコマン ド で複数のフ ァ イルを指定し ます。

• Tcl コマン ド : read_vhdl -vhdl2008 {a.vhd b.vhd c.vhd}

X-Ref Target - Figure 5-2

図 5-2 : [Source File Properties] ウ ィ ン ド ウ

合成 japan.xilinx.com 183UG901 (v2015.3) 2015 年 9 月 30 日

Page 184: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 5 章 : 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 標準では、 これらは符号付きおよび符号な し ラ イブラ リ で定義されています。

表 5-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 以上

合成 japan.xilinx.com 184UG901 (v2015.3) 2015 年 9 月 30 日

Page 185: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 5 章 : 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

--- statements

end generate;

異な る 条件が あ る 場合、 複数の generate 文 を 記述 し、 generate 文の順序に も 注意す る 必要が あ り ま し た。VHDL-2008 では、 if-else-if generate 文がサポー ト されています。

if condition generate---statementselse if condition2 generate---statementselse generate---statementsend generate;

また、 VHDL-2008 では case-generate 文もサポー ト されます。

case expressions generate when condition ->

statements when condition2 ->

statementsend generate;

合成 japan.xilinx.com 185UG901 (v2015.3) 2015 年 9 月 30 日

Page 186: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 5 章 : VHDL-2008 言語サポー ト

順次代入文

VHDL-2008 では、 条件信号に順次信号および変数代入を使用でき ます。 た と えば、 イ ネーブル付きのレジス タは次のよ う に記述されていま し た。

process(clk) beginif clk’event and clk=’1’ thenif enable thenmy_reg <= my_input;

end if;end ifend 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 "11--" => 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;

注記 : こ の文を機能させるためには、 信号に明示的に ド ン ト ケアを代入する必要があ り ます。

合成 japan.xilinx.com 186UG901 (v2015.3) 2015 年 9 月 30 日

Page 187: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 5 章 : 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 つのサブタ イプが必要でし た。

現在では、 これを 1 つのサブタ イプで記述でき ます。 これは、 次の例に示すよ う に配列に対し て も可能です。

type my_type is array (natural range <>) of std_logic_vector;signal : mytype(1 downto 0)(9 downto 0);

boolean_vector/integer_vectorVHDL-2008 では、 新しい定義済みの配列型がサポー ト されます。 Vivado では、 boolean_vector および integer_vector がサポー ト されます。 これらのデータ型は、 次のよ う に定義されます。

type boolean_vector is array (natural range <>) of booleantype integer_vector is array (natural range <>) of integer

合成 japan.xilinx.com 187UG901 (v2015.3) 2015 年 9 月 30 日

Page 188: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 5 章 : VHDL-2008 言語サポー ト

その他

出力ポー ト の読み出し

以前のバージ ョ ンの 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;

ポー ト マ ッ プの論理式

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 end en2 …

この例では、 下位に enable 信号があ り ます。 上位では enable が 2 つのほかの信号の AND に接続されています。

以前の VHDL では、 前述の例と 同様に、 これに新しい信号 と代入文が必要でし たが、 VHDL-2008 ではこれを イ ン スタ ンシエーシ ョ ンのポー ト マ ッ プで達成でき ます。

合成 japan.xilinx.com 188UG901 (v2015.3) 2015 年 9 月 30 日

Page 189: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 5 章 : 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 の長さ を制御する こ と は不可能でし た。

緩和された関数戻り値の規則

以前のバージ ョ ンの 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 では、 連結などのよ り 多 く の論理式でス タ テ ィ ッ ク値を返すこ と が可能 と なってお り 、 柔軟性が高 く なっています。

ス タ テ ィ ッ ク範囲および範囲内での整数式

VHDL では、 あ るオブジェ ク ト の範囲を使用し て別のオブジェ ク ト の範囲を宣言する こ と が可能でし た。 次に例を示し ます。

for I in my_signal’range…

この場合、 my_signal’range が固定されている必要があ り 、 my_signal が制約な しのデータ型と し て宣言されている と エラーにな り ます。 VHDL-2008 では、 エラ ボレーシ ョ ン時に範囲を取得するのでこれが許容されます。

合成 japan.xilinx.com 189UG901 (v2015.3) 2015 年 9 月 30 日

Page 190: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 5 章 : VHDL-2008 言語サポー ト

ブロ ッ ク コ メ ン ト

VHDL では、 コ メ ン ト の各行に 「--」 が必要でし た。 VHDL-2008 では、 /* と */ 行を使用し た コ メ ン ト のブロ ッ ク がサポー ト されます。

process(clk) beginif clk’event and clk=’1’ then/* this is a blockcomment */out1 <= in1;end if;end process;

合成 japan.xilinx.com 190UG901 (v2015.3) 2015 年 9 月 30 日

Page 191: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章

Verilog サポー ト

概要この章では、 Vivado® 合成での Verilog ハード ウ ェ ア記述言語のサポー ト について説明し ます。

Verilog デザイ ン複雑な回路は通常、 ト ッ プダウ ン手法を使用し て設計されます。

• 設計プロセスの各段階で、 さ まざまな仕様レベルが必要と な り ます。 た と えば、 アーキテ クチャ レベルでは、 仕 様はブロ ッ ク図または ASM (Algorithmic State Machine) チャー ト に対応し ます。

• ブロ ッ ク または ASM 段階は、 次のよ う な N ビ ッ ト ワ イヤで接続される レジス タ ト ラ ン ス フ ァー ブロ ッ ク に対 応し ます。

° レジス タ

° 加算器

° カ ウ ン ター

° マルチプレ ク サー

° イ ン ターコネ ク ト ロ ジ ッ ク

° 有限ステー ト マシン (FSM)

• Verilog では、 ASM チャー ト および回路図などを コ ンピ ューター言語で記述でき ます。

合成 japan.xilinx.com 191UG901 (v2015.3) 2015 年 9 月 30 日

Page 192: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : 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 形式のタ ス ク /関数宣言

• カンマで区切ったセンシテ ィ ビテ ィ リ ス ト

• 組み合わせロ ジ ッ ク センシテ ィ ビテ ィ

• 継続代入文のデフ ォル ト ネ ッ ト

• デフ ォル ト ネ ッ ト 宣言のデ ィ スエーブル

• イ ンデッ ク ス付きベク ター部分選択

• 多次元配列

• ネ ッ ト および実数データ型の配列

• 配列ビ ッ ト 選択および部分選択

• 符号付き レジス タ、 ネ ッ ト 、 およびポー ト 宣言

• 符号付き整数

• 符号付き論理式

• 算術シフ ト 演算子

合成 japan.xilinx.com 192UG901 (v2015.3) 2015 年 9 月 30 日

Page 193: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : 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 つの明示的な値で範囲を指定するのではな く 、 範囲の開始点とベク ターの幅を指定し て定 義し ます。 部分選択の開始点はさ まざまです。 部分選択の幅は定数のま まです。

変数による部分選択の Verilog コー ド例

reg [3:0] data;reg [3:0] select; // a value from 0 to 7wire [7:0] byte = data[select +: 8];

表 6-1 : 変数による部分選択

シンボル 説明

+ (プラ ス) 部分選択は開始点から増分

- (マイナス) 部分選択は開始点から減分

合成 japan.xilinx.com 193UG901 (v2015.3) 2015 年 9 月 30 日

Page 194: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

構造 Verilog構造 Verilog 記述を使用する と、 複数のコード ブロ ッ ク を統合し、 デザイ ンを階層構造にする こ と ができ ます。

• コ ンポーネン ト はデザイ ン モジュールで表されます。

• コ ンポーネン ト 間の接続は、 コ ンポーネン ト イ ン ス タ ンシエーシ ョ ン文で指定されます。

• コ ンポーネン ト イ ン ス タ ンシエーシ ョ ン文には、 次の特徴があ り ます。

° コ ンポーネン ト を別のコ ンポーネン ト または回路で使用する場合に、 コ ンポーネン ト のイ ン ス タ ン ス を指定し ます。

° 識別子で区別されます。

° ローカル コ ンポーネン ト 宣言部分で宣言されたコ ンポーネン ト の名前が指定されます。

° 関連付け リ ス ト (かっ こ で囲まれた リ ス ト ) が含まれます。 この リ ス ト では、 該当する ローカル ポー ト に関 連付け られている信号およびポー ト が指定されます。

ビル ト イ ン ロジ ッ ク ゲー ト

Verilog では、 多数のビル ト イ ン ロ ジ ッ ク ゲー ト が提供されています。

• ロ ジ ッ ク ゲー ト を イ ン ス タ ンシエー ト し て、 大型のロ ジ ッ ク回路を構築し ます。

• ビル ト イ ン ロ ジ ッ ク ゲー ト で記述される論理関数は、 次の とお り です。

° AND

° OR

° XOR

° NAND

° NOR

° NOT

表 6-2 : ハー ド ウ ェ ア構造の基本概念

概念 説明

コ ンポーネン ト 構築または基本ブロ ッ ク

ポー ト コ ンポーネン ト の I/O コネ ク タ

信号 コ ンポーネン ト 間のワ イヤに対応

表 6-3 : Verilog のコ ンポーネン ト

項目 表示 内容

宣言 外部 コ ンポーネン ト ポー ト を含む外観

本体 内部 コ ンポーネン ト のビヘイ ビアーまたは構造

合成 japan.xilinx.com 194UG901 (v2015.3) 2015 年 9 月 30 日

Page 195: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : 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

合成 japan.xilinx.com 195UG901 (v2015.3) 2015 年 9 月 30 日

Page 196: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

定義済みプ リ ミ テ ィ ブのイ ンス タ ンシエーシ ョ ン

Verilog の構造記述では、 ゲー ト 、 レジス タ などの定義済みプ リ ミ テ ィ ブや、 CLKDLL および BUFG のよ う なザイ リ ン ク ス特有のプ リ ミ テ ィ ブを イ ン ス タ ンシエー ト し て回路を記述でき ます。

これらのプ リ ミ テ ィ ブは、 Verilog のプ リ ミ テ ィ ブに追加され、 XST Verilog ラ イブ ラ リ (unisim_comp.v) で提供さ れます。

FDC および BUFG プ リ ミ テ ィ ブを イ ンス タ ンシエー ト する例

FDC および BUFG の定義は、 unisim_comp.v ラ イブラ リ フ ァ イルに含まれます。

module example (sysclk, in, reset, out);input sysclk, in, reset;output out;reg out;wire sysclk_out;

FDC register (out, sysclk_out, reset, in); //position based referencingBUFG clk (.O(sysclk_out),.I(sysclk)); //name based referencing

Verilog のパラ メ ーター

Verilog のパラ メ ーターには、 次の特徴があ り ます。

• 簡単に再利用および拡張可能なパラ メ ーター指定コード を作成でき ます。

• コード を読みやす く し、 コ ンパク ト で管理しやすいものにし ます。

• これらの機能は、 次のよ う に記述し ます。

° バス サイ ズ

° デザイ ン ユニ ッ ト の特定の反復エレ メ ン ト の量

• Verilog パラ メ ーターは定数です。 パラ メ ーター モジ ュールの各イ ン ス タ ンシエーシ ョ ンで、 デフ ォル ト のパラ メ ーター値を変更可能です。

• VHDL のジェネ リ ッ ク と同等です。 null 文字列パラ メ ーターはサポー ト されていません。

ジェネ リ ッ ク コマン ド ラ イ ン オプシ ョ ンを使用する と、 上位デザイ ン ブロ ッ ク で定義される Verilog パラ メ ー ターを再定義でき ます。 これによ り 、 ソース コー ド を変更し な く て もデザイ ンを簡単に変更でき ます。 これは、IP コ アの生成およびフ ロー テス ト で便利な機能です。

合成 japan.xilinx.com 196UG901 (v2015.3) 2015 年 9 月 30 日

Page 197: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

Verilog パラ メ ーターの例

この章ではコード例を示し ます。

コード例のフ ァ イルは、 次のサイ ト から ダウ ン ロード でき ます。 https://secure.xilinx.com/webreg/clickthrough.do?cid=396394

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

合成 japan.xilinx.com 197UG901 (v2015.3) 2015 年 9 月 30 日

Page 198: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

パラ メ ーターおよび generate-for の例

次のコード例は、パラ メ ーターと generate-for 構文を使用し て反復エレ メ ン ト の作成を制御する方法を示し ます。 詳細は、 229 ページの 「generate ループ文」 を参照し て く ださい。

//// 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 コード のイ ン ス タ ン ス と モジュールの両方にパラ メ ーターおよび属性を適用でき る。

• 属性を制約フ ァ イルでも指定でき る。

合成 japan.xilinx.com 198UG901 (v2015.3) 2015 年 9 月 30 日

Page 199: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

Verilog の使用制限

Vivado 合成で Verilog を使用する場合、 次のよ う な制限があ り ます。

• 大文字/小文字の区別

• ブロ ッ キングおよび ノ ンブロ ッ キング代入文

• 整数の処理

大文字/小文字の区別

Vivado 合成では、 大文字と小文字が区別されます。

• Verilog では大文字と小文字が区別されるので、 モジュール名、 イ ン ス タ ン ス名、 および信号名は、 大文字と小文 字が異なれば別の名前 と し て識別されます。

° Vivado 合成では、 大文字/小文字だけが異な る イ ン ス タ ン ス名および信号名を含むデザイ ンは合成可能です。

° 大文字/小文字だけが異なるモジ ュール名が含まれる場合は、 エラーが発生し ます。

• オブジェ ク ト 名を大文字/小文字の違いだけで区別する こ と はお勧めし ません。 大文字/小文字だけで名前を区別する と、 混合言語プロ ジェ ク ト で問題が発生し ます。

ブロ ッ キングおよび ノ ンブロ ッ キング代入文

Vivado 合成では、 ブロ ッ キングおよびノ ンブロ ッ キング代入文がサポー ト されます。

• ブロ ッ キング代入文 と ノ ンブロ ッ キング代入文を混合し ないで く ださい。

• ブ ロ ッ キング代入文 と ノ ンブロ ッ キング代入文を混合し て もデザイ ンはエ ラーな し で合成さ れますが、 シ ミ ュレーシ ョ ンでエラーが発生する こ と があ り ます。

使用不可能な例 1

同じ信号にブロ ッ キング代入文 と ノ ンブロ ッ キング代入文を混合し ないで く ださい。

always @(in1)beginif (in2)out1 = in1;

end elseout1 <= in2;

使用不可能な例 2

同じ信号の異なる ビ ッ ト にブロ ッ キング代入文 と ノ ンブロ ッ キング代入文を混合し ないで く ださい。

if (in2)beginout1[0] = 1'b0;out1[1] <= in1;

end else beginout1[0] = in2;out1[1] <= 1'b1;

end

合成 japan.xilinx.com 199UG901 (v2015.3) 2015 年 9 月 30 日

Page 200: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

整数の処理

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

Verilog-2001 の属性と メ タ コ メ ン ト

Verilog-2001 属性

• 合成ツールなどのプロ グ ラ ムに特定の情報を渡すために使用し ます。

• 広 く 使用されています。

• モジュール宣言およびイ ン ス タ ンシエーシ ョ ン内で、 演算子または信号に指定でき ます。

• コ ンパイ ラでほかの属性宣言がサポー ト されていて も、 Vivado 合成では無視されます。

• 次のよ う に使用し ます。

° 次のよ う な個々のオブジェ ク ト に制約を設定し ます。

- モジュール

- イ ン ス タ ン ス

- ネ ッ ト

° 次の合成制約を設定し ます。

- フル ケース

- パラ レル ケース

合成 japan.xilinx.com 200UG901 (v2015.3) 2015 年 9 月 30 日

Page 201: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

Verilog メ タ コ メ ン ト

• Verilog メ タ コ メ ン ト は、 Verilog パーサーで認識されます。

• Verilog メ タ コ メ ン ト は、 次のよ う な個々のオブジェ ク ト に制約を設定し ます。

° モジュール

° イ ン ス タ ン ス

° ネ ッ ト

• Verilog メ タ コ メ ン ト は、 合成で次の指示子を設定し ます。

° parallel_case および full_case

° translate_on および translate_off

° ツール特定の指示子 (syn_sharing など)

Verilog メ タ コ メ ン ト のサポー ト

Vivado 合成では、 次がサポー ト されます。

• C ス タ イルおよび Verilog ス タ イルの メ タ コ メ ン ト

° C ス タ イル

/* ...*/

• C ス タ イルでは、 コ メ ン ト を複数行にでき ます。

° Verilog ス タ イル

// ...

Verilog ス タ イルのコ メ ン ト は、 行末で終了し ます。

• translate_off と translate_on

// synthesis translate_on// synthesis translate_off

• パラ レル ケース

// synthesis parallel_case full_case// synthesis parallel_case// synthesis full_case

• 個々のオブジェ ク ト に対する制約

合成 japan.xilinx.com 201UG901 (v2015.3) 2015 年 9 月 30 日

Page 202: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

Verilog メ タ コ メ ン ト の構文

// synthesis attribute [of] ObjectName [is] AttributeValue

Verilog メ タ コ メ ン ト の構文例

// synthesis attribute RLOC of u123 is R11C1.S0// synthesis attribute HUSET u1 MY_SET// synthesis attribute fsm_extract of State2 is “yes”// synthesis attribute fsm_encoding of State2 is “gray”

Verilog コ ンス ト ラ ク ト次の表に、 Vivado 合成での Verilog コ ン ス ト ラ ク ト のサポー ト ステータ ス を示し ます。

表 6-4 : Verilog コ ンス ト ラ ク ト

Verilog 定数

定数 サポー ト ステータ ス

整数 サポー ト あ り

実数 サポー ト あ り

文字列 サポー ト な し

Verilog データ型

ネ ッ ト 型 • tri0• tri1• trireg

サポー ト な し

すべての駆動電流 無視

real および realtime レジス タ サポー ト な し

すべての名前付き イベン ト サポー ト な し

遅延 無視

Verilog 手続き代入文

assign 制限付きでサポー ト 。詳細は、「assign および deassign 文」 を参照し て く ださい。

deassign 制限付きでサポー ト 。詳細は、「assign および deassign 文」 を参照し て く ださい。

force サポー ト な し

release サポー ト な し

forever 文 サポー ト な し

repeat 文 サポー ト あ り (repeat 値は定数にする必要あ り )

for 文 サポー ト あ り (範囲はス タ テ ィ ッ ク にする必要あ り )

delay (#) 無視

event (@) サポー ト な し

合成 japan.xilinx.com 202UG901 (v2015.3) 2015 年 9 月 30 日

Page 203: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

wait サポー ト な し

名前付き イベン ト サポー ト な し

並列ブロ ッ ク サポー ト な し

指定ブロ ッ ク 無視

デ ィ スエーブル サポー ト あ り (for および repeat ループ文を除 く )

Verilog デザイ ン階層

モジュール定義 サポー ト あ り

マ ク ロモジュール定義 サポー ト な し

階層名 サポー ト な し

defparam サポー ト あ り

イ ン ス タ ン スの配列 サポー ト あ り

Verilog コ ンパイ ラ指示子

`celldefine `endcelldefine 無視

`default_nettype サポー ト あ り

`define サポー ト あ り

`ifdef `else `endif サポー ト あ り

`undef、 `ifndef、 `elsif サポー ト あ り

`include サポー ト あ り

`resetall 無視

`timescale 無視

`unconnected_drive `nounconnected_drive

無視

`uselib サポー ト な し

`file、 `line サポー ト あ り

表 6-4 : Verilog コ ンス ト ラ ク ト (続き)

Verilog 定数

定数 サポー ト ステータ ス

合成 japan.xilinx.com 203UG901 (v2015.3) 2015 年 9 月 30 日

Page 204: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

Verilog のシステム タ スクおよび関数Vivado 合成では、 次の表に示すシステム タ ス ク または関数がサポー ト されます。 サポー ト されないシステム タ ス ク は無視されます。

表 6-5 : システム タ スク と そのサポー ト ステータ ス

システム タ スクおよび関数 ステータ ス コ メ ン ト

$display サポー ト あ り エ ス ケープ シー ケ ン ス は %d、 %b、 %h、 %o、 %c、 および %s に制限されます。

$fclose サポー ト あ り

$fdisplay 無視

$fgets サポー ト あ り

$finish サポー ト あ り ア ク テ ィ ブにな る こ と のない条件分岐文でのみサポー ト されます。

$fopen サポー ト あ り

$fscanf サポー ト あ り エス ケープ シーケン スは %b および %d に制限 されます。

$fwrite 無視

$monitor 無視

$random 無視

$readmemb サポー ト あ り

$readmemh サポー ト あ り

$signed サポー ト あ り

$stop 無視

$strobe 無視

$time 無視

$unsigned サポー ト あ り

$write サポー ト あ り エ ス ケープ シー ケ ン ス は %d、 %b、 %h、 %o、 %c、 および %s に制限されます。

その他すべて 無視

合成 japan.xilinx.com 204UG901 (v2015.3) 2015 年 9 月 30 日

Page 205: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

変換関数の使用$signed および $unsigned システム タ ス クは、 任意の式で次の構文を使用し て呼び出すこ と ができ ます。

$signed(expr) または $unsigned(expr)

• これらの呼び出しの戻 り 値は、 入力値 と同じサイ ズです。

• 戻 り 値の符号は、 以前の符号にかかわらず強制されます。

フ ァ イル I/O タ スク を使用し た メ モ リの内容の読み込み

$readmemb および $readmemh システム タ ス クは、 ブロ ッ ク メ モ リ の初期化に使用でき ます。

• 2 進数の場合は $readmemb を使用し ます。

• 16 進数の場合は $readmemh を使用し ます。

• Vivado 合成と シ ミ ュ レータで処理の違いが発生しないよ う にするため、 イ ンデッ ク ス パラ メーターを使用し ます。

$readmemb("rams_20c.data",ram, 0, 7);

サポー ト されるエスケープ シーケンス

• %h

• %d

• %o

• %b

• %c

• %s

構文例

次に、 2 進数の定数値を10 進数でレポー ト する構文例を示し ます。

parameter c = 8’b00101010;initial begin$display ("The value of c is %d", c);

end

ログ フ ァ イルの例

Vivado 合成では、 次の情報がロ グ フ ァ イルに記述されます。

Analyzing top module <example>. c = 8'b00101010"foo.v" line 9:$display : The value of c is 42

合成 japan.xilinx.com 205UG901 (v2015.3) 2015 年 9 月 30 日

Page 206: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

Verilog プ リ ミ テ ィ ブVivado 合成では、 表 6-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 合成でサポー ト されていないゲー ト レベル プ リ ミ テ ィ ブを示し ます。

表 6-6 : サポー ト されない Verilog ゲー ト レベル プ リ ミ テ ィ ブ

プ リ ミ テ ィ ブ ステータ ス

プルダウ ンおよびプルア ッ プ サポー ト な し

駆動電流および遅延 無視

プ リ ミ テ ィ ブの配列 サポー ト な し

合成 japan.xilinx.com 206UG901 (v2015.3) 2015 年 9 月 30 日

Page 207: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

Verilog の予約キーワー ド次の表に、 予約キーワー ド を示し ます。 ア ス タ リ ス ク (*) の付いている キーワー ド は Verilog の予約キーワー ド です が、 Vivado 合成ではサポー ト されません。

.

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

合成 japan.xilinx.com 207UG901 (v2015.3) 2015 年 9 月 30 日

Page 208: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : 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 フ ァ イルに渡されます。

° ローカル リ セ ッ ト には依存し ません。

レジス タへの初期値の割り当て

レジス タにセ ッ ト / リ セ ッ ト (初期) 値を指定でき ます。

• レジス タの リ セ ッ ト ラ イ ンが 適な値になった と きにレジス タに代入する値を指定し ます。次のコード例を参照 し て く ださい。

• 初期値 と し て変数を指定する と、 値は次のよ う にな り ます。

° 値はフ リ ッ プフ ロ ッ プ と し て イ ンプ リ メ ン ト され、 その出力はローカル リ セ ッ ト で制御されます。

° 値は FDP または FDC フ リ ッ プフ ロ ッ プ と し て Verilog フ ァ イルに渡されます。

合成 japan.xilinx.com 208UG901 (v2015.3) 2015 年 9 月 30 日

Page 209: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

初期値の例 1

reg arb_onebit = 1'b0;reg [3:0] arb_priority = 4'b1011;

初期値の例 2

always @(posedge clk)beginif (rst)arb_onebit <= 1'b0;

end

reg および wire の配列

Verilog では、 reg および wire の配列を使用でき ます。

配列の例 1

次のコード例は、 32 エレ メ ン ト の配列を示し ます。 エレ メ ン ト の幅はそれぞれ 4 ビ ッ ト です。

reg [3:0] mem_array [31:0];

配列の例 2

次のコード例は、 64 個の 8 ビ ッ ト 幅エレ メ ン ト の配列を示し ます。 これらのエレ メ ン ト は、 構造記述の Verilog コー ド でのみ代入でき ます。

wire [7:0] mem_array [63:0];

多次元配列

Vivado 合成では、 2 次元までの多次元配列型がサポー ト されます。

• 次の多次元配列が可能です。

° 任意のネ ッ ト

° 任意の変数データ型

• 配列を使用し た コード代入や数値演算が可能です。

• 一度に選択でき る配列のエレ メ ン ト は 1 つのみです。

• 多次元配列を次のものに渡すこ と はでき ません。

° システム タ ス ク または関数

° 通常タ ス ク または関数

多次元配列の例 1

次のコード例は、 256 x 16 ワ イヤ エレ メ ン ト (各 8 ビ ッ ト ) の配列を記述し ています。 これらのエレ メ ン ト は、 構造記 述の Verilog コード でのみ代入でき ます。

wire [7:0] array2 [0:255][0:15];

合成 japan.xilinx.com 209UG901 (v2015.3) 2015 年 9 月 30 日

Page 210: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

多次元配列の Verilog 例 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

• 定数

° 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

合成 japan.xilinx.com 210UG901 (v2015.3) 2015 年 9 月 30 日

Page 211: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

使用可能な文

Vivado 合成では、 Verilog ビヘイ ビアー記述で有効な文がサポー ト されます。

• 有効な文 (変数および信号代入) は次の とお り です。

° <変数> = <論理式>

° if (<条件>) 文

° else 文

° case (<論理式>) 文

expression: statement...default: statementendcase

° for (<変数> = <論理式>; <条件>; <変数> = <変数> + <論理式>) 文

° while (<条件>) 文

° forever 文

° function および task

• すべての変数は、 integer (整数) または reg (レジス タ ) と し て宣言されます。

• 変数は wire と し て宣言する こ と はでき ません。

論理式

Verilog ビヘイ ビアー記述の論理式には、 次のものがあ り ます。

• 定数

• 次の演算子を含む変数

° 数値演算子

° 論理演算子

- ビ ッ ト

- 論理

° 比較演算子

° 条件演算子

論理演算子

論理演算子がビ ッ ト または論理のどち らのカテゴ リ に属するかは、演算子が適用される論理式に 1 ビ ッ ト が含まれる か複数のビ ッ ト が含まれるかによ り ます。

合成 japan.xilinx.com 211UG901 (v2015.3) 2015 年 9 月 30 日

Page 212: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

サポー ト される演算子

サポー ト される論理式

表 6-8 : サポー ト される演算子

数値演算子 論理演算子 比較演算子 条件演算子

+ & < ?

- && ==

* | ===

** || <=

/ ^ >=

% ~ >=

~^ !=

^~ !==

<< >

>>

<<<

>>>

表 6-9 : サポー ト される論理式

論理式 シンボル ステータ ス

連結 {} サポー ト あ り

複製 {{}} サポー ト あ り

数値演算 +、 -、 *、 ** サポー ト あ り

除算 / 2 番目のオペラ ン ド が 2 のべき乗の定数の場合、 または両方のオペラ ン ド が定数の場合にサポー ト

剰余 % 2 番目のオペラ ン ド が 2 のべき乗の定数の場合に サポー ト

加算 + サポー ト あ り

減算 - サポー ト あ り

乗算 * サポー ト あ り

べき乗 ** サポー ト あ り • 両方のオペラ ン ド が定数で、 2 番目のオペラ ン ド が

負でない場合

• 初のオペラ ン ド が 2 の場合、 2 番目のオペラ ン ド は変数にする こ と が可能

• Vivado 合成では実数データ型はサポー ト されず、 結 果が実数 と な る オペ ラ ン ド の組み合わせを使用する と エラーが発生

• X (不明) およびZ (ハイ イ ンピーダン ス) は使用不可

比較演算 >、 <、 >=、 <= サポー ト あ り

論理否定 ! サポー ト あ り

合成 japan.xilinx.com 212UG901 (v2015.3) 2015 年 9 月 30 日

Page 213: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

論理 AND && サポー ト あ り

論理 OR || サポー ト あ り

論理等号 == サポー ト あ り

論理不等号 != サポー ト あ り

ケース等号 === サポー ト あ り

ケース不等号 !== サポー ト あ り

ビ ッ ト 単位の否定 ~ サポー ト あ り

ビ ッ ト 単位の AND & サポー ト あ り

ビ ッ ト 単位の OR | サポー ト あ り

ビ ッ ト 単位の排他的 OR ^ サポー ト あ り

ビ ッ ト 単位の等価 ~^、 ^~ サポー ト あ り

リ ダ ク シ ョ ン AND & サポー ト あ り

リ ダ ク シ ョ ン NAND ~& サポー ト あ り

リ ダ ク シ ョ ン OR | サポー ト あ り

リ ダ ク シ ョ ン NOR ~| サポー ト あ り

リ ダ ク シ ョ ン XOR ^ サポー ト あ り

リ ダ ク シ ョ ン XNOR ~^、 ^~ サポー ト あ り

左シフ ト << サポー ト あ り

符号付き右シフ ト >>> サポー ト あ り

符号付き左シフ ト <<< サポー ト あ り

右シフ ト >> サポー ト あ り

条件演算子 ?: サポー ト あ り

イベン ト OR or、 ',' サポー ト あ り

表 6-9 : サポー ト される論理式 (続き)

論理式 シンボル ステータ ス

合成 japan.xilinx.com 213UG901 (v2015.3) 2015 年 9 月 30 日

Page 214: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

論理式の評価

次の表の === と !== には、 次のよ う な特徴があ り ます。

• 特殊な比較演算子です。

• シ ミ ュ レーシ ョ ンで使用され、 変数に値 x または z が代入されているかを確認し ます。

• 合成では、 これらの演算子は == および != と し て処理されます。

も よ く 使用される演算子での論理式の評価結果

ブロ ッ ク

Vivado 合成では、 一部のブロ ッ ク文がサポー ト されています。

• ブロ ッ ク文には、 次のよ う な特徴があ り ます。

° 複数の文をグループ化

° begin キーワード で開始し、 end キーワード で終了

° ブロ ッ ク内では、 記述された順に文が実行される

• Vivado 合成では、 順次ブロ ッ ク のみがサポー ト されます。

• Vivado 合成では、 パラ レル ブロ ッ クはサポー ト されません。

• ブロ ッ ク内の手続き文は、 すべてモジュール内で定義し ます。

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

合成 japan.xilinx.com 214UG901 (v2015.3) 2015 年 9 月 30 日

Page 215: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

• 手続き型ブロ ッ ク には、 次の 2 種類があ り ます。

° initial ブロ ッ ク

° always ブロ ッ ク

• 各ブロ ッ クは begin キーワード で開始し、 end キーワード で終了し ます。 initial ブロ ッ クは合成では無視さ れるので、 こ こ では always ブロ ッ クのみを説明し ます。

• always ブロ ッ クは通常、 次のフ ォーマ ッ ト で記述されます。 各文は手続き代入文であ り 、 セ ミ コ ロ ンで区切ら れます。

always begin statement.... end

モジュールVerilog では、 デザイ ン コ ンポーネン ト はモジ ュールで表されます。 モジ ュールは宣言およびイ ン ス タ ンシエー ト す る必要があ り ます。

モジュール宣言

• Verilog ビヘイ ビアー記述のモジュール宣言には、 次が含まれます。

° モジュール名

° I/O ポー ト の リ ス ト

° 機能を定義するモジュール本体

• モジュールは、 endmodule で終了する必要があ り ます。

I/O ポー ト

• 回路の I/O ポー ト はモジュール宣言に リ ス ト し ます。

• 各 I/O ポー ト に次を指定し ます。

° 名前

° モード : 入力、 出力、 入出力

° ポー ト が配列型の場合、 範囲情報

Verilog ビヘイ ビアー記述のモジュール宣言の例 1

module example (A, B, O);input A, B;output O;assign O = A & B;

endmodule

Verilog ビヘイ ビアー記述のモジュール宣言の例 2

module example ( input A, inputB, output O);

assign O = A & B;

endmodule

合成 japan.xilinx.com 215UG901 (v2015.3) 2015 年 9 月 30 日

Page 216: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : 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;

合成 japan.xilinx.com 216UG901 (v2015.3) 2015 年 9 月 30 日

Page 217: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

手続き代入文• Verilog ビヘイ ビアー記述の手続き代入文には、 次のよ う な特徴があ り ます。

° reg と し て宣言された変数に値を代入し ます。

° always ブロ ッ ク、 タ ス ク、 関数で 初に使用されます。

° レジス タおよび有限ステー ト マシン (FSM) コ ンポーネン ト を記述し ます。

• Vivado 合成では、 次がサポー ト されます。

° 組み合わせ関数

° 組み合わせおよび順次タ ス ク

° 組み合わせおよび順次 always ブロ ッ ク

組み合わせ always ブロ ッ ク

組み合わせロ ジ ッ クは、 Verilog のタ イ ミ ング制御文を使用する と効率的に記述でき ます。

• 遅延タ イ ミ ング制御文 [#]

• イベン ト 制御タ イ ミ ング制御文 [@]

遅延タ イ ミ ング制御文

遅延タ イ ミ ング制御文 [#] には、 次のよ う な特徴があ り ます。

• シ ミ ュ レーシ ョ ンにのみ関係し ます。

• 合成では無視されます。

イベン ト 制御タ イ ミ ング制御文

イベン ト 制御タ イ ミ ング制御文 [@] を使用し た組み合わせロ ジ ッ ク の記述は、 次のよ う な ものです。

• 組み合わせ always ブロ ッ クには、 always@ の後にかっ こ で囲まれたセンシテ ィ ビテ ィ リ ス ト があ り ます。 .

• センシテ ィ ビテ ィ リ ス ト にあ る信号のいずれかにイベン ト (値の変化またはエ ッ ジ) が発生する と、 always ブ ロ ッ ク が実行されます。

• センシテ ィ ビテ ィ リ ス ト には、 次を含める こ と ができ ます。

° if や case などの条件で使用する信号

° 代入文の右辺の信号

• 信号の リ ス ト の代わ り に ( ) のな しで @ を使用する と、 説明し た よ う に、 always ブロ ッ ク の信号のいずれかに イベン ト が発生し た場合に、 always ブロ ッ ク が実行されます。

• 組み合わせプロセスでは、 if 文または case 文のすべての分岐で信号が明示的に代入されていない場合、 後 の値を保持する ラ ッチが生成されます。

• プロセスには、 次の文が使用されます。

° 変数代入文および信号代入文

° if-else 文

° case 文

° for-while ループ文

° 関数およびタ ス ク呼び出し

合成 japan.xilinx.com 217UG901 (v2015.3) 2015 年 9 月 30 日

Page 218: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

if-else 文Vivado 合成では、 if-else 文がサポー ト されています。

• if-else 文では、 真偽条件 (true/false) によ って実行される文が決ま り ます。

° 条件が真 と判断された場合は、 初の文が実行されます。

° 条件が偽、 x、 または z と判断された場合は else 文が実行されます。

• キーワード begin および end を使用する と、 複数の文を含むブロ ッ ク を実行でき ます。

• if-else 文はネス ト させる こ と ができ ます。

if-else 文の例

次のコード例は、 if-else 文を使用し てマルチプレ クサーを記述し ています。

module mux4 (sel, a, b, c, d, outmux);input [1:0] sel;input [1:0] a, b, c, d;output [1:0] outmux;reg [1:0] outmux;

always @(sel or a or b or c or d)beginif (sel[1])if (sel[0])outmux = d;elseelseoutmux = c;if (sel[0])outmux = b;

end endmoduleelseoutmux = a;

合成 japan.xilinx.com 218UG901 (v2015.3) 2015 年 9 月 30 日

Page 219: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

case 文Vivado 合成では、 case 文がサポー ト されています。

• case 文は論理式を比較し、 複数の並列分岐の 1 つを実行し ます。

° 分岐は記述された順に評価されます。

° 初に真 と判断された分岐が実行されます。

° どの分岐も偽であ る場合は、 default 分岐が実行されます。

• case 文では、 サイ ズ指定のない整数を使用し ないで く ださい。 整数のサイ ズを必ずビ ッ ト 数で指定し て く ださ い。 そ う し ない と、 結果が予測不可能な ものにな り ます。

• casez は、 分岐のすべてのビ ッ ト 位置の z 値を ド ン ト ケア と し て処理し ます。

• casex は、 分岐のすべてのビ ッ ト 位置の x および z 値を ド ン ト ケア と し て処理し ます。

• casez 文または casex 文では、 ク エスチ ョ ン マーク (?) も ド ン ト ケア と し て使用でき ます。

case 文を使用し たマルチプレ クサーの例

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) begin if (sel[1]) if (sel[0]) outmux = d;

else else outmux = c;

if (sel[0]) outmux = b;

end endmodule

優先順処理の回避

• 上記の case 文の例では、 入力 sel の値が記述された順に評価されます。

• この優先順処理を回避するには、 次を実行し ます。

° parallel_case と い う Verilog 属性を使用し て、 sel 入力が並列に評価される よ う にし ます。

° case 文を次のものに置き換えます。

(* parallel_case *) case(sel)

合成 japan.xilinx.com 219UG901 (v2015.3) 2015 年 9 月 30 日

Page 220: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : 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

合成 japan.xilinx.com 220UG901 (v2015.3) 2015 年 9 月 30 日

Page 221: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : 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

合成 japan.xilinx.com 221UG901 (v2015.3) 2015 年 9 月 30 日

Page 222: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : 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;

else if (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;

assign および deassign 文Vivado 合成では、 assign 文および deassign 文はサポー ト されません。

32 ビ ッ ト を超える場合のビ ッ ト の拡張

代入文の左辺のビ ッ ト 幅が右辺よ り も広い場合は、 次の規則に従って左辺の左にパデ ィ ングが追加されます。

• 右辺が符号付きの場合は、 左辺に符号付き ビ ッ ト がパデ ィ ング と し て追加されます。

• 右辺が符号な しの場合は、 左辺に 0 がパデ ィ ング と し て追加されます。

• サイ ズ指定のない x または z 定数の場合は、 次の規則に従います。

右辺の も左側のビ ッ ト が z (ハイ イ ンピーダン ス) または x (不明) の場合、右辺が符号付き または符号な しにか かわらず、 左辺にその値 (z またはx) がパデ ィ ング と し て追加されます。

合成 japan.xilinx.com 222UG901 (v2015.3) 2015 年 9 月 30 日

Page 223: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

タ スクおよび関数• デザイ ンで同じ コード を複数回使用する場合、 タ ス クや関数を使用する と、 次が可能にな り ます。

° コード の量を削減

° メ ンテナン スが容易

• タ ス クおよび関数は、 モジュール内で宣言し て使用する必要があ り ます。 ヘッ ダー部には、 次のパラ メ ーターが含まれます。

° 入力パラ メ ーター (関数の場合)

° 入力/出力/入出力パラ メ ーター (タ ス ク の場合)

• 関数の戻 り 値は、符号付き または符号なしで宣言し ます。内容は、組み合わせ always ブロ ッ ク と類似しています。

タ スクおよび関数の例 1//// 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

合成 japan.xilinx.com 223UG901 (v2015.3) 2015 年 9 月 30 日

Page 224: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

タ スクおよび関数の例 2次の例では、 同じ機能を タ ス ク を使用し て記述し ています。

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

合成 japan.xilinx.com 224UG901 (v2015.3) 2015 年 9 月 30 日

Page 225: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

再帰タ スクおよび関数

Verilog-2001 では、 再帰タ ス クおよび関数がサポー ト されます。

• 再帰は、 automatic キーワード でのみ使用し て く ださい。

• 再帰呼び出しが恒久的に実行されるのを防ぐため、 繰 り 返し回数は 64 回 (デフ ォル ト ) に制限されます。

• 再帰呼び出しの繰 り 返し回数を変更するには、 -recursion_iteration_limit オプシ ョ ンを使用し ます。

再帰タ スクおよび関数の例

function automatic [31:0] fac;input [15:0] n;if (n == 1)fac = 1;

else

fac = n * fac(n-1); //recursive function callendfunction

定数関数および定数式

Vivado 合成では、 定数値を算出する関数呼び出しがサポー ト されます。

定数は 10 進数の整数であ る と想定されます。

• 定数は、 2 進、 8 進、 10 進、 16 進で指定でき ます。

• 定数を指定するには、 適切な構文で適切な接頭辞を使用し ます。

合成 japan.xilinx.com 225UG901 (v2015.3) 2015 年 9 月 30 日

Page 226: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

定数関数の例

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

定数式の例

次の定数式はすべて同じ値を表し ます。

• 4'b1010

• 4'o12

• 4'd10

• 4'ha

合成 japan.xilinx.com 226UG901 (v2015.3) 2015 年 9 月 30 日

Page 227: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

ブロ ッ キングおよび ノ ンブロ ッ キング手続き代入文

ブロ ッ キングおよび ノ ンブロ ッ キング手続き代入文には、 タ イ ミ ングを制御する要素が組み込まれています。

• # および @ はタ イ ミ ング制御文です。

• 指定された イベン ト が発生する まで、 その後に続 く 文は実行されません。

• 合成では、 # の遅延は無視されます。

ブロ ッ キング手続き代入文の例 1

reg a;a = #10 (b | c);

ブロ ッ キング手続き代入文の例 2 (代替方法)

if (in1) out = 1’b0;else out = in2;

この代入文は、プロセスに含まれる追加の文が同時に実行されないよ う にし、主にシ ミ ュ レーシ ョ ンで使用されます。

ノ ンブロ ッ キング手続き代入文の例 1

variable <= @(posedge_or_negedge_bit) expression;

ノ ンブロ ッ キング代入文は、 文が実行される と きに式を評価し、 同じプロセス内のほかの文も同時に実行でき ます。変数は、 指定された遅延後に変更されます。

ノ ンブロ ッ キング手続き代入文の例 2

次に、 ノ ンブロ ッ キング手続き代入文の使用例を示し ます。

if (in1) out <= 1’b1;else out <= in2;

Verilog マク ロ

• Verilog では、 マ ク ロは次のよ う に定義されます。

'define TESTEQ1 4'b1101

• 定義されたマ ク ロは、 次のよ う に参照されます。

if (request == 'TESTEQ1)

• 'ifdef および 'endif 文は、 次を実行し ます。

° マ ク ロが定義されているかど う かを判断し ます。

° 条件付き コ ンパイルを定義し ます。

• 'ifdef で呼び出されたマ ク ロが定義されている場合、 そのコード はコ ンパイルされます。

° マ ク ロが定義されていない場合は、 'else コマン ド に続 く コード がコ ンパイルされます。

° 'else は必須ではあ り ませんが、 条件文の 後に 'endif が必要です。

• Verilog マ ク ロは、 Verilog マ ク ロ コマン ド ラ イ ン オプシ ョ ンを使用し て定義または再定義し ます。

° Verilog マ ク ロ を使用する と、 HDL ソース コード を変更せずにデザイ ンを変更でき ます。

° Verilog マ ク ロは、 IP コ アの生成およびフ ロー テス ト に有益です。

合成 japan.xilinx.com 227UG901 (v2015.3) 2015 年 9 月 30 日

Page 228: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

マク ロの例 1

'define myzero 0assign mysig = 'myzero;

マク ロの例 2

'ifdef MYVARmodule if_MYVAR_is_declared;...endmodule'elsemodule if_MYVAR_is_not_declared;...endmodule'endif

イ ン クルー ド フ ァ イル

Verilog では、HDL ソース コード を複数のフ ァ イルに分割でき ます。別のフ ァ イルに含まれる コード を参照するには、 現在のフ ァ イルで次の構文を使用し ます。

'include "path/file-to-be-included"

• 相対パス または絶対パスのどち らでも使用でき ます。

• 同じ Verilog フ ァ イルに複数の 'include 文を含める こ と ができ ます。 このよ う にする と、 異なる フ ァ イルで異 なるモジュールを記述するチーム デザイ ン環境で、 コード を管理しやす く な り ます。

• 'include 文で指定し たフ ァ イルを認識させるには、 Vivado 合成 でこのフ ァ イルのデ ィ レ ク ト リ を指定し、 こ のフ ァ イルをプロ ジェ ク ト デ ィ レ ク ト リ に含めます。 Vivado 合成では、 デフ ォル ト でプロ ジェ ク ト デ ィ レ ク ト リ が検索されます。

• 'include 文に相対パス または絶対パス を含めます。 このパスによ り 、 プロ ジェ ク ト デ ィ レ ク ト リ 以外のデ ィ レ ク ト リ を指定でき ます。 Verilog のイ ン クルード フ ァ イル検索パス (include_dirs) を使用し ます。 このオプ シ ョ ンによ り 、 イ ン クルード フ ァ イルのデ ィ レ ク ト リ を直接指定でき ます。

• デザイ ン階層を構築するのにイ ン クルード フ ァ イルが必要な場合、 フ ァ イルはプロ ジェ ク ト デ ィ レ ク ト リ に含 めるか、 相対パス または絶対パス を使用し て参照する必要があ り ます。 フ ァ イルをプロ ジェ ク ト に追加する必要はあ り ません。

Verilog ビヘイ ビアー記述のコ メ ン ト

Verilog ビヘイ ビアー記述のコ メ ン ト 方法は、 C++ などのプロ グ ラ ミ ング言語と同様です。

1 行のコ メ ン ト

コ メ ン ト が 1 行の場合は、 // で開始し ます。

// This is a one-line comment.

複数行のブロ ッ ク コ メ ン ト

コ メ ン ト が複数行の場合は、 /* で開始し、 */ で終了し ます。

/* This is a multiple-line comment.*/

合成 japan.xilinx.com 228UG901 (v2015.3) 2015 年 9 月 30 日

Page 229: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

generate 文Verilog ビヘイ ビアー記述の generate 文には、 次のよ う な特徴があ り ます。

• 次を作成でき ます。

° パラ メ ーター変更可能なスケーラブル コード

° 反復的またはスケーラブルな構造

° 特定の条件を満たすかど う かに依存

• Verilog のエラ ボレーシ ョ ン中に実行されます。

• 条件に応じ てデザイ ンにイ ン ス タ ンシエー ト されます。

• モジュール範囲内で記述されます。

• generate キーワード で開始し ます。

• endgenerate キーワード で終了し ます。

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 文には、 固有の名前を付けます。

合成 japan.xilinx.com 229UG901 (v2015.3) 2015 年 9 月 30 日

Page 230: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

generate ループ文を使用し た 8 ビ ッ ト 加算器の例

generate genvar i; for (i=0; i<=7; i=i+1) begin : for_name adder add (a[8*i+7 : 8*i], b[8*i+7 : 8*i], ci[i], sum_for[8*i+7 : 8*i],

c0_or[i+1]); end

endgenerate

generate 条件文

generate-if-else 文は、 オブジェ ク ト の生成を条件で制御する ために使用し ます。

• if-else 文の各分岐は begin 文と end 文で囲みます。

• begin 文には、 固有の名前を付けます。

generate 条件文のコー ド例

次の例では、データ ワード の幅に基づいて、乗算器の 2 つの異な る イ ンプ リ メ ンテーシ ョ ンを イ ン ス タ ンシエー ト し ています。

generateif (IF_WIDTH < 10) begin : if_name 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 文には、 固有の名前を付けます。

合成 japan.xilinx.com 230UG901 (v2015.3) 2015 年 9 月 30 日

Page 231: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 6 章 : Verilog サポー ト

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

endcase endgenerateend

合成 japan.xilinx.com 231UG901 (v2015.3) 2015 年 9 月 30 日

Page 232: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章

SystemVerilog サポー ト

概要Vivado® 合成では、 合成可能な SystemVerilog RTL の一部がサポー ト されます。 次のセ ク シ ョ ンに、 これらのデータ型 を説明し ます。

特定のフ ァ イルで SystemVerilog を使用デフ ォル ト では、 *.v フ ァ イルは Verilog 2005 構文で、 *.sv フ ァ イルは SystemVerilog 構文でコ ンパイルされます。

Vivado IDE で特定の *.v フ ァ イルに SystemVerilog を使用するには、 次の手順に従います。

1. フ ァ イルを右ク リ ッ ク し、 [Source Node Properties] を ク リ ッ ク し ます。

2. [Source File Properties] ウ ィ ン ド ウで、 [Type] フ ィ ール ド の右側にあ るボタ ンを ク リ ッ ク し、 [Set Type] ダ イ ア ロ グ ボ ッ ク スで [File Type] を [Verilog] から [SystemVerilog] に変更し て、 [OK] を ク リ ッ ク し ます。

または、 [Tcl Console] ウ ィ ン ド ウで次の Tcl コマン ド を使用し ます。

set_property file_type SystemVerilog [get_files <filename>.v]

次のセ ク シ ョ ンで、 Vivado IDE でサポー ト される SystemVerilog のデータ型を説明し ます。

合成 japan.xilinx.com 232UG901 (v2015.3) 2015 年 9 月 30 日

Page 233: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : 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 のデータ型は符号付きの値にな り ます。

• bit、 reg、 および logic は符号な しの値にな り ます。

合成 japan.xilinx.com 233UG901 (v2015.3) 2015 年 9 月 30 日

Page 234: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : SystemVerilog サポー ト

実数

合成では実数がサポー ト されますが、 ロ ジ ッ ク を作成する ためには使用できず、 パラ メ ーター値と し てのみ使用できます。 SystemVerilog では、 次の実数型がサポー ト されます。

• real

• shortreal

• realtime

Void データ型 void データ型は、 戻 り 値のない関数でのみサポー ト されます。

ユーザー定義型

Vivado 合成では、 typedef キーワー ド を使用し てユーザーが定義し たデータ型がサポー ト されます。 次の構文を使 用し ます。

typedef data_type type_identifier {size};

または

typedef [enum, struct, union] type_identifier;

列挙型

列挙型は、 次の構文で宣言でき ます。

enum [type] {enum_name1, enum_name2...enum_namex} identifier

データ型を指定し ない場合は、 デフ ォル ト で 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 にな り ます。

列挙型は、 typedef キーワード でも使用でき ます。

typedef enum {sun,mon,tues,wed,thurs,fri,sat} day_of_week;day_of_week my_day;

合成 japan.xilinx.com 234UG901 (v2015.3) 2015 年 9 月 30 日

Page 235: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : SystemVerilog サポー ト

この例では、 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...day7

enum {day[7] = 5} day_of_week; //creates day0=5, day1=6... day6=11

定数

SystemVerilog には、 次の 3 種類のエラ ボレーシ ョ ン時間定数があ り ます。

• parameter : Verilog 規格と同じで、 同様に使用でき ます。

• localparam : parameter と似ていますが、 上位モジ ュールのものよ り も優先されます。

• specparam : 遅延と タ イ ミ ング値を指定する ために使用されますが、 Vivado 合成ではサポー ト されません。

const と い う ラ ン タ イ ム定数宣言も あ り ます。

型演算子

型演算子を使用する と、 パラ メ ーターをデータ型と し て指定でき、 モジ ュールの異な る イ ン ス タ ン スに異なるデータ型のパラ メ ーターを設定でき ます。

キャス ト 演算子

SystemVerilog では、 あ るデータ型の値を別のデータ型の値に割 り 当てる こ と はでき ませんが、 キ ャ ス ト 演算子 (’) を 使用する と可能にな り ます。 キ ャ ス ト 演算子を使用する と、 データ型を変換でき ます。 次のよ う に使用し ます。

casting_type’(expression)

casting_type は次のいずれかにな り ます。

• integer_type

• non_integer_type

• real_type

• 符号な しの定数値

• ユーザーが作成し た符号付き値型

合成 japan.xilinx.com 235UG901 (v2015.3) 2015 年 9 月 30 日

Page 236: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : SystemVerilog サポー ト

複合データ型

複合データ型には、 構造体 (struct) と共用体 (union) があ り ます。 次にこれらについて説明し ます。

構造体 (struct)

構造体 と は、 異なるデータ型の値を 1 つにま と めて格納し、 参照でき る よ う にし た ものです。 各要素は メ ンバーと呼 ばれます。 これは、 VHDL のレ コード型と類似し ています。 構造体の構文は次のよ う にな り ます。

struct {struct_member1; struct_member2;...struct_memberx;} structure_name;

共用体 (union)

共用体は、 複数のデータ型を含むデータ型ですが、 その う ち 1 つのみが使用されます。 これは、 データ型が使用方法 によ って変化する場合などに便利な方法です。 次に例を示し ます。

typedef union {int i; logic [7:0] j} my_union;my_union sig1;my_union sig2;sig1.i = 32; //sig1 gets the int formatsig2.j = 8’b00001111; //sig2 get the 8bit logic format.

パッ ク配列と アンパッ ク配列

Vivado 合成では、 パッ ク配列と アンパッ ク配列のどち ら もサポー ト されます。

logic [5:0] sig1; //packed arraylogic sig2 [5:0]; //unpacked array

幅が決ま っているデータ型では、 パッ ク される次元を宣言する必要はあ り ません。

integer sig3; //equivalent to logic signed [31:0] sig3

合成 japan.xilinx.com 236UG901 (v2015.3) 2015 年 9 月 30 日

Page 237: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : SystemVerilog サポー ト

プロセス

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;

always_latch プロ シージ ャでは、 ラ ッ チをすばや く 作成でき ます。 always_comb と 同様、 センシテ ィ ビテ ィ リ ス ト は推論されますが、 次の例に示すよ う にラ ッチ イネーブルの制御信号を指定する必要があ り ます。

always_latch if(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 合成ではサポー ト されません。

合成 japan.xilinx.com 237UG901 (v2015.3) 2015 年 9 月 30 日

Page 238: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : SystemVerilog サポー ト

手続き タ イ ミ ング制御

SystemVerilogでは、 次の 2 種類のタ イ ミ ング制御がサポー ト されます。

• 遅延制御 : 文と それが実行される までの時間を指定し ます。 これを合成に使用する利点はないので、 Vivado 合成 では、 代入する ロ ジ ッ クは作成されますが、 タ イ ム文は無視されます。

• イベン ト 制御 : always@(posedge clk) など、指定し た イベン ト が発生し た と きに代入が実行される よ う にし ます。 これは Verilog の規格ですが、 SystemVerilog では機能が追加されています。

論理 or 演算子を使用する と、任意の数のイベン ト を指定でき、 いずれかのイベン ト で文の実行を ト リ ガーでき ます。 これには、センシテ ィ ビテ ィ リ ス ト でイベン ト を or またはカンマで区切 り ます。た と えば、次の 2 つの文は同じです。

always@(a or b or c)

always@(a,b,c)

SystemVerilog では、 event_expression @* もサポー ト されるので、 センシテ ィ ビテ ィ リ ス ト の問題によ る シ ミ ュ レーシ ョ ンでの不一致を回避でき ます。 次に例を示し ます。

Logic always@* begin

演算子

Vivado 合成では、 次の SystemVerilog の演算子がサポー ト されます。

• 代入演算子

(=、 +=、 -=、 *=、 /=、 %=、 &=、 |=、 ^=、 <<=、 >>=、 <<<=、 >>>=)

• 単項演算子 (+、 -、 !、 ~、 &、 ~&、 |、 ~|、 ^、 ~^、 ^~)

• イ ン ク リ メ ン ト /デク リ メ ン ト 演算子 (++、 --)

• 2 項演算子 (+、-、*、/、%、==、~=、===、~==、&&、||、**、< 、<=、>、>=、&、|、^、^~、~^、>>、<<、>>>、<<<)

注記 : A**B は、 A が 2 のべき乗であ るか、 B が定数の場合にサポー ト されます。

• 条件演算子 ( ? :)

• 連結演算子 ({…})

符号付き演算式

Vivado 合成では、 符号付き演算と符号な し演算のどち ら もサポー ト されます。 信号は、 符号あ り と な しのどち らにで も宣言でき ます。 次に例を示し ます。

logic [5:0] reg1;logic signed [5:0] reg2;

合成 japan.xilinx.com 238UG901 (v2015.3) 2015 年 9 月 30 日

Page 239: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : SystemVerilog サポー ト

手続きプログラム代入文

if-else 条件文

if-else 条件文の構文は、 次のよ う にな り ます。

if (expression)command1;

elsecommand2;

else 文はオプシ ョ ンで、 ク ロ ッ ク文の有無によ って ラ ッ チまたはフ リ ッ プフ ロ ッ プが想定されます。 次のよ う な複 数の if および else 文もサポー ト されます。

If (expression1)Command1;

else if (expression2)command2;

else if (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 と し て処理されます。

合成 japan.xilinx.com 239UG901 (v2015.3) 2015 年 9 月 30 日

Page 240: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : 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 ...

合成 japan.xilinx.com 240UG901 (v2015.3) 2015 年 9 月 30 日

Page 241: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : 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);

合成 japan.xilinx.com 241UG901 (v2015.3) 2015 年 9 月 30 日

Page 242: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : SystemVerilog サポー ト

ワイルド カー ド ポー ト を使用し たモジュールの接続

ワ イル ド カード を使用し てモジュールを接続する こ と もでき ます。 た と えば、 上記の例は次のよ う にな り ます。

// in the instantiating modulelower my_inst (.*);

上位モジュールの名前 と タ イプが正し ければ、 イ ン ス タ ン ス全体が接続されます。

また、 これら を混合し て使用でき ます。 次に例を示し ます。

lower my_inst (.myout(my_sig), .my_in(din), .*);

こ の例では、 myout ポー ト が my_sig 信号に、 my_in ポー ト が din 信号に、 clk お よ び my_in2 が clk お よ び my_in2 信号に接続されます。

合成 japan.xilinx.com 242UG901 (v2015.3) 2015 年 9 月 30 日

Page 243: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : SystemVerilog サポー ト

イ ン ターフ ェ イスイ ン ターフ ェ イ スは、 ブロ ッ ク間の通信を指定するために使用し ます。 イ ン ターフ ェ イ ス と は、 モジュール間の接続を記述しやす く する目的でま と められたネ ッ ト および変数のグループです。 基本的な イ ン ターフ ェ イ スの構文は、 次 の とお り です。

interface interface_name;parameters and ports;items;endinterface : interface_name

後の interface_name はオプシ ョ ンで、 コード を読みやす く する目的で追加されています。 次に例を示し ます。

module bottom1 (input clk,input [9:0] d1,d2,input s1,input [9:0] result,output logic sel,output logic [9:0] data1, data2,output logic equal);

//logic//

endmodule

module bottom2 (input clk,input sel,input [9:0] data1, data2,output logic [9:0] result);

//logic//

endmodule

module top (input clk,input s1,input [9:0] d1, d2,output equal);

logic [9:0] data1, data2, result;logic sel;

bottom1 u0 (clk, d1, d2, s1, result, sel, data1, data2, equal);bottom2 u1 (clk, sel, data1, data2, result);

endmodule

上記のコード では、 共通する信号を持つ 2 つの下位モジュールがイ ン ス タ ンシエー ト されています。

合成 japan.xilinx.com 243UG901 (v2015.3) 2015 年 9 月 30 日

Page 244: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : SystemVerilog サポー ト

これらの共通信号はすべて イ ン ターフ ェ イ ス を使用し て指定でき ます。

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;

上記を次のよ う に変更し ます。

if (int1.sel)int1.result <= int1.data1;

後に、 上位モジュールにそのイ ン ターフ ェ イ ス を イ ン ス タ ンシエー ト する必要があ り ます。 これで、 イ ン ス タ ンスでそのイ ン ターフ ェ イ スが参照されます。

module top(input clk,input s1,input [9:0] d1, d2,output equal);my_int int3(); //instantiationbottom1 u0 (int2, clk, d1, d2, s1, equal);bottom2 u1 (int2, clk);

endmodule

合成 japan.xilinx.com 244UG901 (v2015.3) 2015 年 9 月 30 日

Page 245: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 7 章 : 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 コマン ド では、 イ ンポー ト するパッ ケージからのア イ テムを指定するか、 パッ ケージ全体を指定する必要が あ り ます。

合成 japan.xilinx.com 245UG901 (v2015.3) 2015 年 9 月 30 日

Page 246: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 8 章

混合言語サポー ト

概要Vivado 合成では、 特に記述のない限 り 、 VHDL と Verilog の混合言語プロ ジェ ク ト がサポー ト されます。

VHDL と Verilog の混合• VHDL と Verilog の混合は、 デザイ ン ユニ ッ ト (セル) のイ ン ス タ ンシエーシ ョ ンに制限されます。

° VHDL コード から Verilog モジュールを イ ン ス タ ンシエー ト でき ます。

° Verilog コード から VHDL エンテ ィ テ ィ を イ ン ス タ ンシエー ト でき ます。

° それ以外の VHDL および Verilog の混合はサポー ト されません。 た と えば、 VHDL ソース コード に Verilog ソース コード を直接埋め込むこ と はでき ません。

• VHDL デザイ ンでは、 VHDL のデータ型、 ジェネ リ ッ ク、 ポー ト のサブセ ッ ト を Verilog モジュール と の境界に 使用でき ます。

• Verilog デザイ ンでは、 Verilog のデータ型、 パラ メ ーター、 ポー ト のサブセ ッ ト を VHDL エンテ ィ テ ィ と の境界 に使用でき ます。

• Vivado 合成では、 HDL エラ ボレーシ ョ ン段階で VHDL デザイ ン ユニ ッ ト が Verilog モジュールにバイ ン ド され ます。

• プロ ジェ ク ト を構成する VHDL および Verilog フ ァ イルは、 独自の HDL プロ ジェ ク ト フ ァ イルで指定し ます。

イ ンス タ ンシエーシ ョ ン• Verilog モジュールを VHDL デザイ ン ユニ ッ ト にバイ ン ドするには、 コ ンポーネン ト イ ン ス タ ンシエーシ ョ ンに

基づ く デフ ォル ト のバイ ン ド が使用されます。

• VHDL に Verilog モジュールを イ ン ス タ ンシエー ト する場合、 Vivado 合成では次はサポー ト されていません。

° コ ンフ ィ ギュ レーシ ョ ン仕様

° 直接イ ン ス タ ンシエーシ ョ ン

° コ ンポーネン ト コ ンフ ィ ギュ レーシ ョ ン

合成 japan.xilinx.com 246UG901 (v2015.3) 2015 年 9 月 30 日

Page 247: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 8 章 : 混合言語サポー ト

VHDL および Verilog ラ イブ ラ リ• VHDL および Verilog ラ イブラ リ は、 論理的に統一されます。

• コ ンパイル用のデフ ォル ト の work デ ィ レ ク ト リ は、 VHDL および Verilog でも使用でき ます。

• 混合言語プロ ジェ ク ト では、 デザイ ン ユニ ッ ト (セル) を統一された論理ラ イブラ リ で検索するための検索順を 指定でき ます。 エラ ボレーシ ョ ンの段階でこの検索順に従って VHDL エンテ ィ テ ィ または Verilog モジュールが 検索され、 混合言語プロ ジェ ク ト にバイ ン ド されます。

VHDL および Verilog の境界規則VHDL および Verilog 間の境界は、 デザイ ン ユニ ッ ト レベルによ り 決定し ます。

• VHDL エンテ ィ テ ィ またはアーキテ クチャには、 Verilog モジ ュールを イ ン ス タ ンシエー ト でき ます。 詳細は、 「Verilog への VHDL のイ ン ス タ ンシエー ト 」 を参照し て く ださい。

• Verilog モジュールには、 VHDL エンテ ィ テ ィ を イ ン ス タ ンシエー ト でき ます。 詳細は、 「VHDL への Verilog のイ ン ス タ ンシエー ト 」 を参照し て く ださい。

Verilog への VHDL のイ ンス タ ンシエー ト

Verilog デザイ ンに VHDL デザイ ン ユニ ッ ト を イ ン ス タ ンシエー ト するには、 次の手順に従います。

1. イ ン ス タ ンシエー ト する VHDL エンテ ィ テ ィ と同じモジュール名 (オプシ ョ ンでその後にアーキテ クチャ名を追 加) を宣言し ます。

2. 通常の Verilog イ ン ス タ ンシエーシ ョ ンを実行し ます。

Verilog に VHDL を イ ンス タ ンシエー ト する際の制限

Verilog モジュールに VHDL デザイ ン ユニ ッ ト を イ ン ス タ ンシエー ト する場合、Vivado 合成には次の制限があ り ます。

• Verilog デザイ ンにイ ン ス タ ンシエー ト でき る VHDL コ ン ス ト ラ ク ト は VHDL エンテ ィ テ ィ のみです。

° その他の VHDL コ ン ス ト ラ ク ト は Verilog コード で認識されません。

° Vivado 合成では、 エンテ ィ テ ィ /アーキテ クチャ ペアが Verilog と VHDL の境界 と し て使用されます。

• ポー ト は明示的に関連付ける必要があ り ます。 ポー ト マ ッ プでは、 正式で有効なポー ト 名を指定し て く ださ い。

• パラ メ ーターは、 値を変更し ていない場合でも、 イ ン ス タ ンシエー ト 時にすべて渡されます。

• パラ メ ーター値の変更は、 名前で指定され、 順序は指定されません。 defparams を使用するのではな く 、 イ ン ス タ ンシエーシ ョ ンで実行されます。

合成 japan.xilinx.com 247UG901 (v2015.3) 2015 年 9 月 30 日

Page 248: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 8 章 : 混合言語サポー ト

バイ ン ドVivado 合成では、 バイ ン ド はエラ ボレーシ ョ ン段階で実行されます。 バイ ン ド中は、 次が実行されます。

1. 次にあ る イ ン ス タ ンシエー ト されたモジュール と同じ名前の Verilog モジュールが検索されます。

a. 統一された論理ラ イブラ リ のユーザー指定 リ ス ト

b. ユーザー指定順

2. モジュール イ ン ス タ ンシエーシ ョ ンで指定されたアーキテ クチャ名は無視されます。

3. Verilog モジュールが見つかった場合は、 その名前がバイ ン ド されます。

4. Verilog モジュールが見つから ない場合は、 次が実行されます。

° Verilog モジュールは VHDL エンテ ィ テ ィ と し て処理されます。

° 統一された論理ラ イブラ リ のユーザー指定 リ ス ト またはユーザー指定順の VHDL エンテ ィ テ ィ と同じ名前 の VHDL エンテ ィ テ ィ を大文字と小文字を区別し て検索し ます。

注記 : これには、 VHDL デザイ ン ユニ ッ ト は拡張指示子付きで格納されている と想定されます。

制限 (VHDL から Verilog)Verilog モジ ュールか ら VHDL デザイ ン ユニ ッ ト を イ ン ス タ ンシエー ト する場合、 Vivado 合成には次の制限があ り ます。

• ポー ト は明示的に関連付ける必要があ り ます。 ポー ト マ ッ プでは、 正式で有効なポー ト 名を指定し て く ださ い。

• パラ メ ーターは、 値を変更し ていない場合でも、 イ ン ス タ ンシエー ト 時にすべて渡されます。

• パラ メ ーター値の変更は、 名前で指定され、 順序は指定されません。 defparams を使用するのではな く 、 イ ン ス タ ンシエーシ ョ ンで実行されます。

使用可能な例

ff #(.init(2'b01)) u1 (.sel(sel), .din(din), .dout(dout));

使用不可能な例

ff u1 (.sel(sel), .din(din), .dout(dout));defparam u1.init = 2'b01;

合成 japan.xilinx.com 248UG901 (v2015.3) 2015 年 9 月 30 日

Page 249: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 8 章 : 混合言語サポー ト

VHDL への Verilog のイ ンス タ ンシエー ト

VHDL デザイ ンに Verilog モジュールを イ ン ス タ ンシエー ト するには、 次の手順に従います。

1. イ ン ス タ ンシエー ト する Verilog モジュール と同じ名前の VHDL コ ンポーネン ト を宣言し ます。

2. 大文字/小文字の別を確認し ます。

3. VDHL コ ンポーネン ト を イ ン ス タ ンシエー ト するの と 同様に、 Verilog コ ンポーネン ト を イ ン ス タ ンシエー ト し ます。

° VHDL コ ンフ ィ ギュ レーシ ョ ン宣言を使用し て、 こ のコ ンポーネン ト を特定のラ イブラ リ からの特定のデザ イ ン ユニ ッ ト にバイ ン ド する方法はサポー ト されていません。 サポー ト されるのは、 デフ ォル ト の Verilog モジュール バイ ン ド のみです。

° VHDL デザイ ンにイ ン ス タ ンシエー ト でき る Verilog コ ン ス ト ラ ク ト は Verilog モジュールのみです。 その他 の Verilog コ ン ス ト ラ ク ト は VHDL コード で認識されません。

° エラ ボレーシ ョ ンの段階で、 デフ ォル ト のバイ ン ド処理が実行されるすべてのコ ンポーネン ト は、 対応するコ ンポーネン ト の名前 と同じ名前のデザイ ン ユニ ッ ト と し て処理されます。

° バイ ン ド段階では、 コ ンポーネン ト 名は VHDL デザイ ン ユニ ッ ト 名 と し て処理され、 work と い う 論理ラ イ ブラ リ 内で検索されます。

- VHDL デザイ ン ユニ ッ ト が見つかった場合は、 それがバイ ン ド されます。

- VHDL デザイ ン ユニ ッ ト が見つから ない場合は、 次が実行されます。

コ ンポーネン ト 名は Verilog モジュール名 と し て処理され、 大文字/小文字を区別し て検索されます。 初に名前が一致し た Verilog モジュールが選択されてバイ ン ド されます。

ラ イブラ リ は統一されているため、 VHDL デザイ ン ユニ ッ ト と同じ名前の Verilog セルを同じ論理ラ イブラ リ に共存 させる こ と はでき ません。

同じ名前のセルまたはユニ ッ ト が新し く コ ンパイルされる と、以前にコ ンパイルされたセルまたはユニ ッ ト が上書きされます。

ジ ェ ネ リ ッ クのサポー ト

Vivado 合成では、混合言語デザイ ンで次の VHDL ジェネ リ ッ ク データ型と対応する Verilog のデータ型がサポー ト さ れます。

• integer

• real

• string

• boolean

ポー ト マ ッ プ Vivado 合成では、 Verilog にイ ン ス タ ンシエー ト された VHDL および VHDL にイ ン ス タ ンシエー ト された Verilog の ポー ト マ ッ プがサポー ト されます。

合成 japan.xilinx.com 249UG901 (v2015.3) 2015 年 9 月 30 日

Page 250: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

第 8 章 : 混合言語サポー ト

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 エンテ ィ テ ィ にイ ン ス タ ンシエー ト される場合、 フ ォーマル ポー ト には次の特性を使用 でき ます。

• サポー ト される方向 : input、 output、 inout

• 使用可能なデータ型 : wire および reg

• Vivado 合成では、 次はサポー ト されません。

° Verilog の双方向パス オプシ ョ ンへの接続

° 混合デザイ ン境界での名前の付いていない Verilog ポー ト の使用

大文字 と 小文字が混合し ている Verilog モジ ュールのポー ト 名を接続する場合は、 同等のコ ンポーネン ト 宣言を使用 し て く ださい。 Verilog ポー ト 名はすべて小文字であ る と判断されます。

合成 japan.xilinx.com 250UG901 (v2015.3) 2015 年 9 月 30 日

Page 251: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

付録 A

その他のリ ソースおよび法的通知

ザイ リ ン クス リ ソースアンサー、 資料、 ダウ ン ロード、 フ ォーラ ムなどのサポー ト リ ソースは、 ザイ リ ン ク ス サポー ト サイ ト を参照し て く ださい。

ソ リ ューシ ョ ン セン ターデバイ ス、 ツール、 IP のサポー ト については、 ザイ リ ン ク ス ソ リ ューシ ョ ン セン ターを参照し て く ださい。 デザイ ン アシス タ ン ト 、 ア ド バイザ リ 、 ト ラブルシューテ ィ ングの ヒ ン ト などが含まれます。

参考資料

Vivado 資料

注記 : 日本語版のバージ ョ ンは、 英語版よ り 古い場合があ り ます。

1. 『Vivado Design Suite ユーザー ガイ ド : リ リ ース ノー ト 、 イ ン ス ト ールおよびラ イセン ス』 (UG973)

2. 『Vivado Design Suite ユーザー ガイ ド : Vivado IDE の使用』 (UG893)

3. 『Vivado Design Suite Tcl コマン ド リ フ ァ レン ス ガイ ド』 (UG835)

4. 『Vivado Design Suite ユーザー ガイ ド : Tcl ス ク リ プ ト 機能の使用』 (UG894)

5. 『Vivado Design Suite ユーザー ガイ ド : イ ンプ リ メ ンテーシ ョ ン』 (UG904)

6. 『Vivado Design Suite ユーザー ガイ ド : 階層デザイ ン』 (UG905)

7. 『ISE から Vivado Design Suite への移行ガイ ド』 (UG911)

8. 『Vivado Design Suite ユーザー ガイ ド : デザイ ン フ ローの概要』 (UG892)

9. 『Vivado Design Suite ユーザー ガイ ド : 制約の使用』 (UG903)

10. 『Vivado Design Suite ユーザー ガイ ド : デザイ ン解析およびク ロージ ャ テ ク ニ ッ ク』 (UG906)

11. 『Vivado Design Suite チュー ト リ アル : 制約の使用』 (UG945)

12. 『Vivado Design Suite プロパテ ィ リ フ ァ レ ン ス ガ イ ド』 (UG912)

13. 『7 シ リ ーズ FPGA DSP48E1 ス ラ イ ス ユーザーガイ ド』 (UG479 : 英語版、 日本語版)

14. 『Vivado Design Suite ユーザー ガイ ド : I/O およびク ロ ッ ク プラ ンニング』 (UG899)

15. 『Vivado Design Suite ユーザー ガイ ド : システム レベル デザイ ン入力』 (UG895)

合成 japan.xilinx.com 251UG901 (v2015.3) 2015 年 9 月 30 日

Page 252: Vivado Design Suite - Xilinx · Vivado Design Suite ユーザー ガイド 合成 UG901 (v2015.3) 2015 年 9 月 30 日 本資料は表記のバージョンの英語版を翻訳したもので、内容に相違が生じる場合には原文を優先します。

付録 A : その他のリ ソースおよび法的通知

16. 『Vivado Design Suite ユーザー ガイ ド : プロ グ ラ ムおよびデバッ グ』 (UG908)

17. 『Vivado Design Suite ユーザー ガイ ド : 消費電力の解析および 適化』 (UG907)

18. 『Vivado Design Suite ユーザー ガイ ド : カス タ ム IP の作成と パッ ケージ』 (UG1118)

19. 『Vivado Design Suite ユーザー ガイ ド : IP を使用し た設計』 (UG896)

20. 『Vivado Design Suite チュー ト リ アル : カ ス タ ム IP の作成 と パッ ケージ』 (UG1119)

リ フ ァ レン ス デザイ ン フ ァ イル

Vivado Design Suite ビデオ チュー ト リ アル

Vivado Design Suite の資料

ト レーニング リ ソースザイ リ ン ク スでは、本書に含まれる コ ンセプ ト を説明する さ まざまな ト レーニング コースおよびオン ラ イ ン ビデオを 提供し ています。 次の リ ン ク から関連する ト レーニング リ ソース を参照し て く ださい。

1. Vivado での FPGA 設計導入

2. Vivado Design Suite での FPGA 設計実践

お読み く だ さい : 重要な法的通知本通知に基づいて貴殿または貴社 (本通知の被通知者が個人の場合には 「貴殿」 、 法人その他の団体の場合には 「貴社」 。 以下同じ ) に開示される情報 (以下 「本情報」 と いいます) は、 ザイ リ ン ク スの製品を選択および使用する こ と のためにのみ提供されます。 適

用される法律が許容する 大限の範囲で、 (1) 本情報は 「現状有姿」、 およびすべて受領者の責任で (with all faults) と い う 状態で提供

され、 ザイ リ ン ク スは、 本通知を も って、 明示、 黙示、 法定を問わず (商品性、 非侵害、 特定目的適合性の保証を含みますが これら

に限られません)、 すべての保証および条件を負わない (否認する ) もの と し ます。 また、 (2) ザイ リ ン ク スは、 本情報 (貴殿または貴

社によ る本情報の使用を含む) に関係し、 起因し、 関連する、 いかな る種類 ・ 性質の損失または損害について も、 責任を負わない ( 契約上、 不法行為上 (過失の場合を含む)、 その他のいかな る責任の法理によ るかを問わない) も の と し、 当該損失ま たは損害には、

直接、 間接、 特別、 付随的、 結果的な損失または損害 (第三者が起こ し た行為の結果被った、 データ、 利益、 業務上の信用の損失、

その他あ ら ゆる種類の損失や損害を含みます) が含まれる も の と し、 それは、 た と え当該損害や損失が合理的に予見可能であった

り 、 ザイ リ ン ク スがそれらの可能性について助言を受けていた場合であった と し て も同様です。 ザイ リ ン ク スは、 本情報に含まれる

いかな る誤 り も訂正する義務を負わず、本情報または製品仕様のア ッ プデー ト を貴殿または貴社に知らせる義務も負いません。事前

の書面によ る同意のない限 り 、 貴殿または貴社は本情報を再生産、 変更、 頒布、 または公に展示し てはな り ません。 一定の製品は、

ザイ リ ン ク スの限定的保証の諸条件に従 う こ と と な るので、 http://japan.xilinx.com/legal.htm#tos で見られるザイ リ ン ク スの販売条件

を参照し て く だ さい。 IP コ アは、 ザイ リ ン ク スが貴殿または貴社に付与し た ラ イ セン スに含まれる保証 と 補助的条件に従 う こ と に

な り ます。 ザイ リ ン ク スの製品は、 フ ェ イルセーフ と し て、 または、 フ ェ イルセーフの動作を要求する アプ リ ケーシ ョ ンに使用する

ために、設計された り 意図された り し ていません。そのよ う な重大なアプ リ ケーシ ョ ンにザイ リ ン ク スの製品を使用する場合の リ ス

ク と 責任は、 貴殿または貴社が単独で負 う も のです。 http://japan.xilinx.com/legal.htm#tos で見られるザイ リ ン ク スの販売条件を参照

し て く だ さい。

© Copyright 2012-2015 Xilinx, Inc. Xilinx、 Xilinx のロ ゴ、 Artix、 ISE、 Kintex、 Spartan、 Virtex、 Vivado、 Zynq、 およびこ の文書に含ま

れるその他の指定されたブラ ン ド は、 米国およびその他各国のザイ リ ン ク ス社の商標です。 すべてのその他の商標は、 それぞれの保

有者に帰属し ます。

こ の資料に関する フ ィ ード バッ クおよび リ ン ク などの問題につき ま し ては、 [email protected] まで、 または各ページの

右下にあ る [フ ィ ー ド バッ ク送信] ボ タ ンを ク リ ッ クする と 表示される フ ォームからお知らせ く だ さ い。 フ ィ ー ド バッ ク は日本語で

入力可能です。 いただき ま し たご意見を参考に早急に対応させていただき ます。 なお、 こ の メ ール ア ド レ スへのお問い合わせは受

け付けてお り ません。 あ らかじめご了承 く ださい。

合成 japan.xilinx.com 252UG901 (v2015.3) 2015 年 9 月 30 日