Vivado Design Suite ユーザー ガイド : 合成 (UG901)

Vivado Design Suite
ユーザー ガ イ ド
合成
UG901 (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)
に関す る 内容を追加
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
2
目次
改訂履歴 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
第 1 章 : Vivado 合成
概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
合成手法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
合成の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
レ ポー ト の表示 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
ロ ジ ッ ク の解析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Tcl での合成の実行 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
RTL 合成のマルチ ス レ ッ ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Vivado であ ら か じ め定義 さ れてい る 合成ス ト ラ テジ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
第 2 章 : 合成属性
概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
サポー ト さ れ る 属性 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Vivado でのカ ス タ ム属性のサポー ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
XDC フ ァ イ ルでの合成属性の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
35
50
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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
3
サポー ト さ れ る VHDL デー タ 型 と サポー ト さ れない VHDL デー タ 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL オブジ ェ ク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL のエン テ ィ テ ィ と アーキ テ ク チ ャ の記述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL の組み合わせ回路 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL の順序 ロ ジ ッ ク . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL の関数 と プ ロ シージ ャ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL のアサー ト 文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL の定義済みパ ッ ケージ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL 構文のサポー ト ス テー タ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL の予約語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
147
151
152
160
167
171
174
174
177
180
第 5 章 : VHDL-2008 言語サポー ト
概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
VHDL-2008 を使用す る ための Vivado の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
サポー ト さ れ る VHDL-2008 の機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
第 6 章 : Verilog サポー ト
概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Verilog デザ イ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Verilog の機能 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Verilog コ ン ス ト ラ ク ト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Verilog のシ ス テ ム タ ス ク お よ び関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
変換関数の使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Verilog プ リ ミ テ ィ ブ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Verilog の予約キー ワー ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Verilog ビヘ イ ビ アー記述 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
モジ ュ ール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
手続 き 代入文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
タ ス ク お よ び関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
191
191
192
202
204
205
206
207
208
215
217
223
第 7 章 : SystemVerilog サポー ト
概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
特定の フ ァ イ ルで SystemVerilog を使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
デー タ 型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
プロセス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
手続 き プ ロ グ ラ ム代入文 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
タ ス ク お よ び関数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
モジ ュ ールお よ び階層 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
イ ン タ ーフ ェ イ ス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
232
232
233
237
239
240
241
243
第 8 章 : 混合言語サポー ト
概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL と Verilog の混合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
イ ン ス タ ン シエーシ ョ ン . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL お よ び Verilog ラ イ ブ ラ リ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
VHDL お よ び Verilog の境界規則 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
バイ ン ド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
246
246
246
247
247
248
付録 A : その他の リ ソ ースおよび法的通知
ザ イ リ ン ク ス リ ソ ース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
4
ソ リ ュ ーシ ョ ン セ ン タ ー . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
参考資料 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ト レーニ ン グ リ ソ ース . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
お読み く だ さ い : 重要な法的通知 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
251
251
252
252
5
第 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] を参照 し て く
だ さ い。 こ の章では、 両方のモー ド を使用 し た合成を個別のセ ク シ ョ ンで説明 し ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
6
第 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)。
X-Ref Target - Figure 1-1
図 1-1 : Flow Navigator : [Synthesis] セ ク シ ョ ン
次の図に示す [Project Settings] ダ イ ア ロ グ ボ ッ ク ス が開 き ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
7
第 1 章 : Vivado 合成
X-Ref Target - Figure 1-2
図 1-2 : [Project Settings] ダ イ ア ログ ボ ッ ク ス
2.
[Project Settings] ダ イ ア ロ グ ボ ッ ク ス で、 次の よ う に設定 し ます。
a.
[Synthesis] ページの [Constraints] で、 [Default constraint set] にア ク テ ィ ブな制約セ ッ ト と す る 制約セ ッ ト を選
択 し ます。 制約セ ッ ト は、 ザ イ リ ン ク ス デザ イ ン制約 (XDC) で記述 さ れたデザ イ ン制約を含む複数の制約
フ ァ イ ルのセ ッ ト です。 デザ イ ン制約には、 次の 2 種類があ り ます。
-
物理制約 : ピ ン配置、 ブ ロ ッ ク RAM、 LUT、 フ リ ッ プ フ ロ ッ プな ど のセルの絶対配置ま たは相対配置、
お よ びデバ イ ス の コ ン フ ィ ギ ュ レーシ ョ ン設定を定義 し ます。
-
タ イ ミ ン グ制約 : デザ イ ンの周波数要件を定義 し ます。 タ イ ミ ン グ制約を設定 し ない場合、 デザ イ ンが
ワ イ ヤの長 さ お よ び配線の密集度にのみ基づいて最適化 さ れます。
制約の整理の詳細は、 『Vivado Design Suite ユーザー ガ イ ド : 制約の使用』 (UG903) [参照 9] の 「制約の整理」
を参照 し て く だ さ い。
選択 し た制約セ ッ ト は新 し い run に使用 さ れ、 デザ イ ンの変更 も こ の制約セ ッ ト に保存 さ れます。
タ ーゲ ッ ト 制約セ ッ ト を設定する Tcl コ マ ン ド
-constrset <arg>
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
8
第 1 章 : Vivado 合成
b.
[Options] エ リ アで、 [Strategy] ド ロ ッ プダ ウ ン リ ス ト か ら 合成 run に使用す る 合成ス ト ラ テジ を選択 し ます。
次の図に示す定義済みス ト ラ テジがあ り ます。
X-Ref Target - Figure 1-3
図 1-3 : 定義済みス ト ラ テ ジ
あ ら か じ め定義 さ れた ス ト ラ テジか ら 選択す る か、 ま たは独自の ス ト ラ テジ を定義で き ます。 合成ス ト ラ テ
ジ を選択す る と 、 使用可能な 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」
を参照 し て く だ さ い。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
9
第 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] です。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
10
第 1 章 : Vivado 合成
run ス ト ラ テ ジの作成
ス ト ラ テ ジは、 合成ツールお よ び イ ン プ リ メ ン テーシ ョ ン で実行 さ れ る さ ま ざ ま なユーテ ィ リ テ ィ やプ ロ グ ラ ム の
オプシ ョ ン のあ ら か じ め定義 さ れたセ ッ ト です。 各 メ ジ ャ ー リ リ ー ス には、 そのバージ ョ ン専用の ス ト ラ テ ジがあ
り ます。
1.
既存の ス ト ラ テジ を使用す る には、 [Project Settings] ダ イ ア ロ グ ボ ッ ク ス の [Synthesis] ページで [Strategy] か ら ス
ト ラ テジ を選択 し て [OK] を ク リ ッ ク し ます。
2.
既存の ス ト ラ テジ を変更す る には、 [Project Settings] ダ イ ア ロ グ ボ ッ ク ス の [Synthesis] ページで定義済みの ス ト
ラ テジ を選択 し て変更 し た後、 [Save Strategy As] ボ タ ン
を ク リ ッ ク し ます。
次の図に示す [Save Strategy As] ダ イ ア ロ グ ボ ッ ク ス が表示 さ れます。
X-Ref Target - Figure 1-4
図 1-4 : [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] を選択 し 、 既存の ス ト ラ テジのいずれかを選択 し ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
11
第 1 章 : Vivado 合成
X-Ref Target - Figure 1-5
図 1-5 : Vivado ス ト ラ テ ジ
3.
次のいずれか を実行 し ます。
°
ツールバーの [Create New Strategy of this Strategy] ボ タ ン
を ク リ ッ ク し 、 既存の ス ト ラ テジの コ ピーを
作成 し ます。 必要に応 じ て コ ピーに変更を加え、 [Apply] を ク リ ッ ク し ます。
°
ツールバーの [Create New Strategy] ボ タ ン
を開 き ます。
を ク リ ッ ク し 、[New Strategy] ダ イ ア ロ グ ボ ッ ク ス (図 1-6)
X-Ref Target - Figure 1-6
図 1-6 : [New Strategy] ダ イ ア ログ ボ ッ ク ス
[New Strategy] ダ イ ア ロ グ ボ ッ ク ス で ス ト ラ テジの名前 ([Name])、 ス ト ラ テジの タ イ プ ([Type])、 ツール バー
ジ ョ ン ([Tool version]) を指定 し ま す。 説明 ([Description]) も 入力で き ます。 [OK] を ク リ ッ ク し ます。
作成 し た ス ト ラ テジは、 [User Defined Strategies] の下に表示 さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
12
第 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] ページ
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
13
第 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] ビ ュ ーで フ ァ イ ルを選択
し て移動す る と 、 手動 コ ンパ イ ル順を オ ン にす る か ど う か を尋ね る 次の図に示すダ イ ア ロ グ ボ ッ ク ス が表示 さ
れ ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
14
第 1 章 : Vivado 合成
X-Ref Target - Figure 1-9
図 1-9 : Move Sources Option
2.
[Sources] ウ ィ ン ド ウ の [Compile Order] ビ ュ ーで、 フ ァ イ ルを ド ラ ッ グす る か、 ポ ッ プア ッ プ メ ニ ュ ーの [Move
Up] ま たは [Move Down] コ マ ン ド を使用 し て、 コ ンパ イ ル順を変更 し ます。
[Hierarchy Update] メ ニ ュ ーには、 次の図に示す よ う にほかのオプシ ョ ン も あ り ます。
X-Ref Target - Figure 1-10
図 1-10 : [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] チ ェ ッ ク ボ ッ ク ス をオンに し ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
15
第 1 章 : Vivado 合成
X-Ref Target - Figure 1-11
図 1-11 : [Source File Properties] ウ ィ ン ド ウ
ヒ ン ト : Verilog では、 1 つの Verilog ソ ース のみに適用す る ヘ ッ ダー フ ァ イ ル (特定の `define マ ク ロ な ど) は、 グ
ロ ーバル イ ン ク ルー ド フ ァ イ ル と し て指定す る のではな く `include 文を使用 し て参照す る 必要があ り ます。
[Sources] ウ ィ ン ド ウ の詳細は、『Vivado Design Suite ユーザー ガ イ ド : Vivado IDE の使用』 (UG893) [参照 2] の「[Sources]
ウ ィ ン ド ウ」 を参照 し て く だ さ い。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
16
第 1 章 : Vivado 合成
合成の実行
合成 run では、 合成中に使用 さ れ る デザ イ ンの詳細を定義お よ び設定で き ます。 合成 run は次を定義 し ます。
•
合成中に タ ーゲ ッ ト と す る ザ イ リ ン ク ス デバ イ ス
•
適用す る 制約セ ッ ト
•
1 つま たは複数の合成 run を実行す る オプシ ョ ン
•
合成エン ジ ンの結果を制御す る オプシ ョ ン
RTL ソ ース フ ァ イ ルの run お よ び制約を定義する には、 次の手順に従い ます。
1.
メ イ ン メ ニ ュ ーか ら [Flow] → [Create Runs] を ク リ ッ ク す る か、[Create Runs] ボ タ ン
を ク リ ッ ク し ます。
Create New Runs ウ ィ ザー ド が開 き ます。
X-Ref Target - Figure 1-12
図 1-12 : Create New Runs ウ ィ ザー ド
2.
[Synthesis] をオンに し 、 [Next] を ク リ ッ ク し ます。
次の図に示す [Configure Synthesis Runs] ページが表示 さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
17
第 1 章 : Vivado 合成
X-Ref Target - Figure 1-13
図 1-13 : Create New Runs ウ ィ ザー ド : [Configure Synthesis Runs] ページ
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-14
図 1-14 : [Launch Options] ページ
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
18
第 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] を ク リ ッ ク す る と 、 ホ ス ト を設定する ダ イ ア ロ グ ボ ッ ク ス が開 き ます。
4.
-
[Generate scripts only] : 後で実行す る ス ク リ プ ト を生成 し ます。runme.bat (Windows) ま たは runme.sh
(Linux) を使用 し て run を開始 し ます。
-
[Do not launch now] : 前のページの設定を保存 し 、 run を後で実行で き る よ う に し ます。
[Finish] を ク リ ッ ク し て run を作成 し ます。 作成 し た run を実行す る と 、 図 1-15 に示す [Design Runs] ウ ィ ン ド ウ
に結果が表示 さ れます。
X-Ref Target - Figure 1-15
図 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] を ク リ ッ ク し ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
19
第 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] コ マ ン ド
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
20
第 1 章 : Vivado 合成
次の図に示す [Set as Out-of Context for Synthesis] ダ イ ア ロ グ ボ ッ ク ス が開き ます。
X-Ref Target - Figure 1-17
図 1-17 : [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-18
図 1-18 : [Sources] ウ ィ ン ド ウの [Compile Order] ビ ュ ー
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
21
第 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 は合成 さ れ る ので、 制約が合成結果に影響 し ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
22
第 1 章 : Vivado 合成
下位ネ ッ ト リ ス ト の作成
下位ネ ッ ト リ ス ト を作成す る には、 ネ ッ ト リ ス ト を最上位モジ ュ ール と し て指定 し てプ ロ ジ ェ ク ト を設定 し ます。 合
成を実行す る 前に、 次の図に示す よ う に OOC モー ド を設定 し ます。
X-Ref Target - Figure 1-19
図 1-19 : [Project Settings] ダ イ ア ログ ボ ッ ク スの [Synthesis] ページの [More Options] フ ィ ール ド
こ の設定に よ り 、 合成で こ の レベルに 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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
23
第 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 でほかの機能を実行で き る よ う にな り ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
24
第 1 章 : Vivado 合成
合成実行の監視
合成 run の ス テー タ ス は、 次の図に示す [Log] ウ ィ ン ド ウ で確認 し ます。 合成中に こ の ウ ィ ン ド ウ に表示 さ れ る メ ッ
セージは、 合成 ロ グ フ ァ イ ルに も 含まれます。
X-Ref Target - Figure 1-20
図 1-20 : [Log] ウ ィ ン ド ウ
合成終了後のフ ロー
run が完了す る と 、 次の図に示す [Synthesis Completed] ダ イ ア ロ グ ボ ッ ク ス が表示 さ れます。
X-Ref Target - Figure 1-21
図 1-21 : [Synthesis Completed] ダ イ ア ログ ボ ッ ク ス
次のいずれか を オンに し ます。
°
[Run Implementation] : イ ンプ リ メ ン テーシ ョ ン を現在の イ ンプ リ メ ン テーシ ョ ン プ ロ ジ ェ ク ト 設定を使用
し て実行 し ます。
°
[Open Synthesized Design] : 合成済みネ ッ ト リ ス ト 、 ア ク テ ィ ブな制約セ ッ ト 、 タ ーゲ ッ ト デバ イ ス を合成済
みデザ イ ン環境で開 き 、 I/O ピ ン配置、 デザ イ ン解析、 フ ロ アプ ラ ン を実行で き る よ う に し ます。
°
[View Reports] : [Reports] ウ ィ ン ド ウ を開き 、 レ ポー ト を表示で き る よ う に し ます。
°
[Don't show this dialog again] を オンにす る と 、 次回か ら こ のダ イ ア ロ グ ボ ッ ク スは表示 さ れな く な り ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
25
第 1 章 : Vivado 合成
ヒ ン ト : こ のダ イ ア ロ グ ボ ッ ク ス が再び表示 さ れ る よ う にす る には、 [Tools] → [Options] を ク リ ッ ク し 、 左側のペ イ
ンで [Window Behavior] を ク リ ッ ク し ます。
合成結果の解析
合成が終了 し た ら 、 合成レ ポー ト を表示 し 、 合成済みデザ イ ン を開いて解析で き ます。 [Reports] ウ ィ ン ド ウ には、 合
成お よ び イ ンプ リ メ ン テーシ ョ ンで生成 さ れた レ ポー ト の リ ス ト が表示 さ れます。
[Reports] ウ ィ ン ド ウ を開 き 、 レ ポー ト を開いて特定の run の詳細を確認 し ます。
X-Ref Target - Figure 1-22
図 1-22 : [Reports] ウ ィ ン ド ウ
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
26
第 1 章 : Vivado 合成
合成済みデザイ ン環境の使用
Vivado IDE には、 デザ イ ン を さ ま ざ ま な面か ら 解析する 環境が含まれてい ます。 合成済みデザ イ ン を開 く と 、 合成済
みネ ッ ト リ ス ト 、 ア ク テ ィ ブな制約セ ッ ト 、 お よ び タ ーゲ ッ ト デバ イ ス が読み込まれます。
合成済みデザ イ ン を開 く には、 Flow Navigator で [Synthesis] → [Open Synthesized Design] を ク リ ッ ク し ます。
ま たは、 メ イ ン メ ニ ュ ーか ら [Flow] → [Open Synthesized Design] を ク リ ッ ク し て も 同 じ 動作を実行で き ます。
合成済みデザ イ ン を開 く と 、 次の図に示す [Device] ウ ィ ン ド ウ が表示 さ れます。
X-Ref Target - Figure 1-23
図 1-23 : [Device] ウ ィ ン ド ウ
こ の環境か ら 、 デザ イ ン ロ ジ ッ ク と 階層の確認、 リ ソ ー ス 使用率お よ び タ イ ミ ン グ予測の表示、 デザ イ ン ルール
チ ェ ッ ク (DRC) を実行で き ます。
詳細は、 『Vivado Design Suite ユーザー ガ イ ド : デザ イ ン解析お よ び ク ロ ージ ャ テ ク ニ ッ ク 』 (UG906) [参照 10] を参照
し て く だ さ い。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
27
第 1 章 : Vivado 合成
レポー ト の表示
Vivado 合成を実行す る と 、 [Reports] ウ ィ ン ド ウ か ら Vivado 合成レ ポー ト お よ び使用率レ ポー ト を表示で き ます。
X-Ref Target - Figure 1-24
図 1-24 : 合成後の [Reports] ウ ィ ン ド ウ
ロ ジ ッ クの解析
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] ビ ュ ーを開 く こ と がで き ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
28
第 1 章 : Vivado 合成
X-Ref Target - Figure 1-25
図 1-25 : [Show Hierarchy] コ マ ン ド
ロ ジ ッ ク 回路図の解析
[Schematic] ウ ィ ン ド ウ では、 選択 し た ロ ジ ッ ク を展開 し て表示で き ます。 [Schematic] ウ ィ ン ド ウ を表示する には、 少
な く と も 1 つの ロ ジ ッ ク オブジ ェ ク ト を選択する 必要があ り ます。
[Schematic] ウ ィ ン ド ウ で、 任意の ロ ジ ッ ク を選択お よ び表示 し ます。 タ イ ミ ン グ パ ス のグループ を表示 し て、 その
パ ス上のすべての イ ン ス タ ン ス を表示で き ます。 こ れに よ り 、 タ イ ミ ン グ ク リ テ ィ カルなモジ ュ ールが含まれ る 箇所
を視覚的に表示で き る ので、 フ ロ アプ ラ ン し やす く な り ます。
[Schematic] ウ ィ ン ド ウ を開 く には、 次の手順に従い ます。
1.
1 つま たは複数の イ ン ス タ ン ス、 ネ ッ ト 、 タ イ ミ ン グ パ ス を選択 し ます。
2.
ツールバーま たは右 ク リ ッ ク メ ニ ュ ーで [Schematic] を ク リ ッ ク す る か、 F4 キーを押 し ます。
[Schematic] ウ ィ ン ド ウ が開 き 、 選択 し たモジ ュ ールが表示 さ れます。
X-Ref Target - Figure 1-26
図 1-26 : [Schematic] ウ ィ ン ド ウ
こ の後、 ピ ン、 イ ン ス タ ン ス、 階層モジ ュ ールを選択 し て、 ロ ジ ッ ク を展開で き ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
29
第 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 design
Syntax:
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 object
Usage:
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:
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
30
第 1 章 : Vivado 合成
[-flatten_hierarchy]
[-gated_clock_conversion]
[-directive]
[-rtl]
[-bufg]
[-no_lc]
[-fanout_limit]
[-shreg_min_size]
[-mode]
[-fsm_extraction]
[-keep_equivalent_registers]
[-resource_sharing]
[-control_set_opt_threshold]
[-max_bram]
合成
UG901 (v2015.3) 2015 年 9 月 30 日
-verilog_define <macro_name>[=<macro_text>]
-verilog_define <macro_name>[=<macro_text>]
Flatten hierarchy during LUT mapping.
Values:
full, none, rebuilt
Default: rebuilt
Convert clock gating logic to flop enable.
Values: off, on, auto
Default: off
Synthesis directive. Values:
default,
AreaOptimized_high,
AreaMutlThresholdDSP
AlternateRoutability
FewerCarryChains
RunTimeOptimized
Default: default
Elaborate and open an rtl design
Max number of global clock buffers used by
synthesis
Default: 12
Disable LUT combining.
Do not allow combining
LUT pairs into single dual output LUTs.
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
Minimum length for chain of registers to be
mapped onto SRL.
Default: 3
The design mode. Values: default,
out_of_context
Default: default
FSM Extraction Encoding. Values: off,
one_hot, sequential, johnson, gray, auto
Default: auto
Prevents registers sourced by the same logic
from being merged.
(Note that the merging can
otherwise be prevented using the synthesis
KEEP attribute)
Sharing arithmetic operators. Value: auto,
on, off
Default: auto
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
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
31
第 1 章 : Vivado 合成
[-max_dsp]
[-cascade_dsp]
[-quiet]
[-verbose]
part in question
Default: -1
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
Controls how adders in sum DSP block outputs
are implemented.
The values are: auto, tree, and force.
Ignore command errors
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 です。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
32
第 1 章 : Vivado 合成
Tcl ス ク リ プ ト 例
次に、 synth_design の Tcl ス ク リ プ ト 例を示 し ます。
# Setup design sources and constraints
read_vhdl -library bftLib [ glob ./Sources/hdl/bftLib/*.vhdl ]
read_vhdl ./Sources/hdl/bft.vhdl
read_verilog [ glob ./Sources/hdl/*.v ]
read_xdc ./Sources/bft_full.xdc
# Run synthesis
synth_design -top bft -part xc7k70tfbg484-2 -flatten_hierarchy rebuilt
# Write design checkpoint
write_checkpoint -force $outputDir/post_synth
# Write report utilization and timing estimates
report_utilization -file utilization.txt
report_timing > timing.txt
制約の設定
表 1-1 に、Vivado タ イ ミ ン グ制約にサポー ト さ れ る Tcl コ マ ン ド を示 し ます。 各 コ マ ン ド の リ ン ク を ク リ ッ ク す る と 、
『Vivado Design Suite Tcl コ マ ン ド リ フ ァ レ ン ス ガ イ ド 』 (UG835) [参照 3] の コ マ ン ド を説明す る ページが開 き ます。
表 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
こ れ ら の コ マ ン ド の詳細は、 次の資料を参照 し て く だ さ い。
•
『Vivado Design Suite Tcl コ マ ン ド リ フ ァ レ ン ス ガ イ ド 』 (UG835) [参照 3]
•
『Vivado Design Suite ユーザー ガ イ ド : 制約の使用』 (UG903) [参照 9]
•
『Vivado Design Suite ユーザー ガ イ ド : デザ イ ン解析お よ び ク ロ ージ ャ テ ク ニ ッ ク 』 (UG906) [参照 10]
•
『Vivado Design Suite チ ュ ー ト リ アル : 制約の使用』 (UG945) [参照 11]
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
33
第 1 章 : Vivado 合成
Vivado であ らか じ め定義 さ れている合成ス ト ラ テ ジ
34 ページの表 1-2 に、 各ス ト ラ テジ と その設定を示 し ます。
表 1-2 : Vivado であ らか じ め定義 さ れている合成ス ト ラ テ ジ
Flow_Area_
オプ シ ョ ン/ス ト ラ テ ジ デ フ ォル ト Optimized_High
-flatten_hierarchy
Flow_
AreaOptimized_
medium
Multi
ThresholdDSP
AltRoutability
Perf
Optimized_
High
Perf
ThreshholdCarry
RuntimeOptimized
rebuilt
rebuilt
rebuilt
rebuilt
rebuilt
rebuilt
rebuilt
none
-gated_clock_conversion
off
off
off
off
off
off
off
off
-bufg
12
12
12
12
12
12
12
12
-fanout_limit
10,000
10,000
400
10,000
10,000
400
10,000
10,000
-directive
Default
AreaOptimized
_high
Default
AreaMutl
ThresholdDSP
AlternateRoutability
Default
FewerCarryChains
RunTimeOptimized
-fsm_extraction
auto
auto
auto
auto
auto
one_hot
auto
off
-keep_equivalent_registers
オフ
オフ
オン
オフ
オフ
オン
オン
オフ
-resource_sharing
auto
auto
off
auto
auto
off
off
auto
-control_set_opt_threshold
auto
1
auto
auto
auto
auto
auto
auto
-no_lc
オフ
オフ
オン
オフ
オン
オン
オン
オフ
-shreg_min_size
3
3
5
3
10
5
3
3
-max_bram
-1
-1
-1
-1
-1
-1
-1
-1
-max_dsp
-1
-1
-1
-1
-1
-1
-1
-1
auto
auto
auto
auto
auto
auto
auto
auto
-cascade_dsp
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
34
第 2章
合成属性
概要
Vivado® 合成では、 さ ま ざ ま な タ イ プの合成属性を使用で き ます。 ほ と ん ど の場合、 こ れ ら の属性は同 じ 構文で、 同
じ 動作にな り ます。
•
Vivado 合成で属性がサポー ト さ れ る 場合、 その属性が使用 さ れ、 その属性を反映 し た ロ ジ ッ ク が作成 さ れます。
•
指定 し た属性が ツールで認識 さ れない場合、 その属性 と 値は生成 さ れたネ ッ ト リ ス ト に渡 さ れます。
認識 さ れない属性は、 フ ロ ーの後の方で使用 さ れ る と 想定 さ れます。 た と えば、 LOC 制約は合成では使用 さ れません
が、 配置ツールで使用 さ れ る ので、 合成ツールか ら 転送 さ れます。
サポー ト さ れる属性
ASYNC_REG
ASYNC_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";
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
35
第 2 章 : 合成属性
BLACK_BOX
BLACK_BOX 属性は、 すべての階層レベルを オ フ に し 、 合成でそのモジ ュ ールま たはエ ン テ ィ テ ィ に対 し てブ ラ ッ ク
ボ ッ ク ス を作成で き る よ う にす る デバ ッ グ用の属性です。 こ の属性を指定する と 、 モジ ュ ールま たはエン テ ィ テ ィ に
対 し て有効な ロ ジ ッ ク があ っ た と し て も 、 合成ツールでその レベルに対 し てブ ラ ッ ク ボ ッ ク ス が作成 さ れます。 こ の
属性はモジ ュ ール、 エン テ ィ テ ィ 、 コ ン ポーネ ン ト に設定で き ます。 こ の属性は合成 コ ンパ イ ラ に影響する ので、RTL
でのみ設定可能です。
BLACK_BOX の Verilog コ ー ド 例
(* black_box *) module test(in1, in2, clk, out1);
重要 : Verilog では、 値は必要あ り ません。 こ の属性があれば、 ブ ラ ッ ク ボ ッ ク ス が作成 さ れます。
BLACK_BOX の VHDL コ ー ド 例
attribute black_box
attribute black_box
: string;
of beh : architecture is "yes";
ブ ラ ッ ク ボ ッ ク ス の コ ーデ ィ ン グ ス タ イ ルの よ り 詳細な情報は、 138 ページの 「ブ ラ ッ ク ボ ッ ク ス」 を参照 し て く
だ さ い。
CASCADE_HEIGHT
CASCADE_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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
36
第 2 章 : 合成属性
CLOCK_BUFFER_TYPE
CLOCK_BUFFER_TYPE 属性は入力 ク ロ ッ ク に設定 し 、 使用する ク ロ ッ ク バ ッ フ ァ ーの タ イ プ を指定 し ます。
デフ ォ ル ト では、 ク ロ ッ ク バ ッ フ ァ ー と し て BUFG が使用 さ れます。
有効な値は、 BUFG、 BUFH、 BUFIO、 BUFMR、 BUFR、 お よ び none です。
CLOCK_BUFFER_TYPE 属性は、 最上位 ク ロ ッ ク ポー ト に設定で き ます。 RTL でのみ設定可能で、 XDC ではサポー ト
さ れてい ません。
CLOCK_BUFFER_TYPE の Verilog 例
(* clock_buffer_type = “none” *) input clk1;
CLOCK_BUFFER_TYPE の VHDL 例
entity test is port(
in1 : std_logic_vector (8 downto 0);
clk : std_logic;
out1 : std_logic_vector(8 downto 0));
attribute clock_buffer_type : string;
attribute clock_buffer_type of clk: signal is "BUFR";
end test;
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_logic
out1 : std_logic_vector(8 downto 0));
attribute direct_enable : string;
attribute direct_enable of ena3: signal is "yes";
end test;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
37
第 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_logic
out1 : std_logic_vector(8 downto 0));
attribute direct_reset : string;
attribute direct_reset of rst3: signal is "yes";
end test;
DONT_TOUCH
KEEP ま たは KEEP_HIERARCHY の代わ り に DONT_TOUCH 属性を使用 し て く だ さ い。DONT_TOUCH 属性は KEEP ま た
は KEEP_HIERARCHY 属性 と 同 じ よ う に機能 し ますが、 KEEP お よ び KEEP_HIERARCHY と は異な り 配置配線に フ ォ
ワー ド ア ノ テー ト さ れ る ので、 ロ ジ ッ ク 最適化で削除 さ れ る こ と はあ り ません。
\
注意 : KEEP お よ び KEEP_HIERARCHY 属性 と 同様に、 DONT_TOUCH を使用す る 際には注意が必要です。 ほかの属性
が DONT_TOUCH 属性 と 競合す る 場合、 DONT_TOUCH 属性が優先 さ れます。
DONT_TOUCH 属性に有効な値は、 TRUE/FALSE ま たは yes/no です。 こ の属性は信号、 モジ ュ ール、 エン テ ィ テ ィ 、
コ ン ポーネ ン ト に設定で き ます。
注記 : モ ジ ュ ール ま た はエ ン テ ィ テ ィ のポー ト には設定で き ま せん。 特定のポー ト を 保持す る 必要が あ る 場合は、
-flatten_hierarchy none を使用する か、 モジ ュールま たはエン テ ィ テ ィ 自体に DONT_TOUCH を設定 し ます。
推奨 : こ の属性は RTL のみで設定 し て く だ さ い。 XDC フ ァ イ ルが読み込ま れ る 前に、 保持す る 必要のあ る 信号が最
適化で削除 さ れて し ま う こ と があ り ます。 こ の属性を RTL で設定 し ておけば、 必ず適用 さ れます。
DONT_TOUCH の Verilog 例
Verilog ワ イヤの例
(* dont_touch = "yes" *) wire sig1;
assign sig1 = in1 & in2;
assign out1 = sig1 & in2;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
38
第 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_logic
attribute dont_touch : string;
attribute dont_touch of sig1 : signal is "true";
....
....
sig1 <= in1 and in2;
out1 <= sig1 and in3;
VHDL エ ン テ ィ テ ィ の例
entity example_dt_vhd is
port (
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 is
attribute dont_touch : string;
attribute dont_touch of rtl : architecture is "yes";
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
39
第 2 章 : 合成属性
FSM_ENCODING
FSM_ENCODING 属性は、 ス テー ト マシ ンのエン コ ー ド 方法を指定 し ます。 通常は、 Vivado ツールに よ り ス テー ト マ
シ ンに対 し てほ と ん ど のデザ イ ンで最適な結果が生成 さ れ る エン コ ー ド プ ロ ト コ ルが選択 さ れます。デザ イ ンの タ イ
プに よ っ ては、 特定のエン コ ー ド プ ロ ト コ ルが適 し てい る も の も あ り ます。
FSM_ENCODING 属性は、 ス テ ー ト マ シ ン レ ジ ス タ に設定で き ま す。 有効 な 値は "one_hot"、 "sequential"、
"johnson"、 "gray"、 "auto"、 お よ び "none" です。 デフ ォ ル ト は "auto" で、 ツールに よ り 最適なエン コ ー ド
が選択 さ れます。 RTL ま たは XDC で設定で き ます。
FSM_ENCODING の Verilog 例
(* fsm_encoding = "one_hot" *) reg [7:0] my_state;
FSM_ENCODING の VHDL 例
type count_state is (zero, one, two, three, four, five, six, seven);
signal my_state : count_state;
attribute fsm_encoding : string;
attribute fsm_encoding of my_state : signal is "sequential";
FSM_SAFE_STATE
FSM_SAFE_STATE 属性は、ス テー ト マシ ンが不正な ス テー ト にな っ た と き に次の ク ロ ッ ク サ イ ク ルで既知の ス テー
ト にす る ロ ジ ッ ク を、 ス テー ト マシ ンに挿入 し ます。
た と えば、 " o n e_h o t " エ ン コ ー ド に設定 さ れた ス テー ト マシ ン が不正な 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";
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
40
第 2 章 : 合成属性
FULL_CASE (Verilog のみ)
FULL_CASE は、 case、 casex ま たは casez 文で可能性のあ る すべての case 値が指定 さ れ る こ と を示 し ます。 case
値が指定 さ れてい る 場合、 Vivado 合成で case 値に対 し て余分な ロ ジ ッ ク は作成 さ れません。 こ の属性は、 case 文に
設定で き ます。
重要 : こ の属性は合成 コ ンパ イ ラ に影響 し 、 デザ イ ンの論理動作を変更する 可能性があ る ので、 RTL でのみ設定可能
です。
FULL_CASE の例 (Verilog)
(* full_case *)
case select
3’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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
41
第 2 章 : 合成属性
IOB
IOB は合成属性ではな く 、 Vivado イ ンプ リ メ ン テーシ ョ ンで使用 さ れ、 レ ジ ス タ を I/O バ ッ フ ァ ーに配置す る 必要が
あ る か ど う か を指定 し ます。 有効な値は true ま たは false です。 こ の属性は、 I/O バ ッ フ ァ ーに配置す る レ ジ ス タ
に設定 し ます。 RTL ま たは XDC で設定で き ます。
IOB の Verilog 例
(* IOB = "true" *) reg sig1;
IOB の VHDL 例
signal sig1: std_logic;
attribute IOB: string;
attribute IOB of sig1 : signal is "true";
IO_BUFFER_TYPE
IO_BUFFER_TYPE 属性は最上位ポー ト に設定 し 、 バ ッ フ ァ ーを使用す る よ う に指定 し ます。 デフ ォ ル ト では、 入力
ま たは出力ポー ト にバ ッ フ ァ ーが自動推論 さ れます。 こ のバ ッ フ ァ ーの自動推論をデ ィ ス エーブルにする には、 こ の
属性を値を "none" に設定 し て追加 し ます。 RTL ま たは XDC で設定で き ます。
IO_BUFFER_TYPE の Verilog 例
(* io_buffer_type = "none" *) input in1;
IO_BUFFER_TYPE の VHDL 例
entity test is port(
in1 : std_logic_vector (8 downto 0);
clk : std_logic;
out1 : std_logic_vector(8 downto 0));
attribute io_buffer_type : string;
attribute io_buffer_type of out1: signal is "none";
end test;
KEEP
KEEP 属性は、 信号が削除 さ れた り ロ ジ ッ ク ブ ロ ッ ク に吸収 さ れ る よ う な最適化が実行 さ れない よ う に指定 し ます。
こ の属性が設定 さ れた信号は保持 さ れ、 ネ ッ ト リ ス ト に含まれます。
た と えば、 2 ビ ッ ト の AND ゲー ト の出力で別の AND ゲー ト を駆動す る 信号に KEEP 制約を設定する と 、 信号は両方
の AND ゲー ト を含む よ り 大 き い LUT には統合 さ れません。
KEEP は、 タ イ ミ ン グ制約 と も よ く 併用 さ れます。 通常は最適化 さ れ る 信号に タ イ ミ ン グ制約が設定 さ れてい る 場合、
KEEP を設定す る と 最適化 さ れな く な り 、 正 し い タ イ ミ ン グ規則が使用 さ れます。
注記 : KEEP 属性はモジ ュ ール ま たはエン テ ィ テ ィ のポー ト には設定で き ません。 特定のポー ト を保持す る 必要があ
る 場合は、-flatten_hierarchy none を使用す る か、モジ ュ ールま たはエン テ ィ テ ィ 自体に KEEP を設定 し ます。
注意 : RTL で後の方で使用 さ れない信号に KEEP 属性を設定す る 場合は、 注意が必要です。 合成では こ れ ら の信号は
保持 さ れますが、 何 も 駆動 し ません。 こ れに よ り 、 フ ロ ーの後の方で問題が発生す る 可能性があ り ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
42
第 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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
43
第 2 章 : 合成属性
KEEP_HIERARCHY
KEEP_HIERARCHY は、 階層レベルが変更 さ れない よ う に し ます。 Vivado 合成では、 RTL で指定 さ れたの と 同 じ 階層が
保持 さ れ る よ う 試み ら れますが、 QoR (結果の品質) のために階層がフ ラ ッ ト に さ れた り 、 変更 さ れ る こ と も あ り ます。
イ ン ス タ ン ス に KEEP_HIERARCHY を指定する と 、 合成でその階層レベルは変更 さ れません。
こ れが QoR に影響を与え る 場合があ り ます。 ま た、 ト ラ イ ス テー ト 出力お よ び I/O バ ッ フ ァ ーの制御 ロ ジ ッ ク を記述
す る モジ ュ ールには使用 し ないで く だ さ い。 KEEP_HIERARCHY は、 モジ ュ ール、 アーキ テ ク チ ャ レベル、 ま たは イ
ン ス タ ン ス に指定で き ます。 RTL でのみ設定可能です。
KEEP_HIERARCHY の例 (Verilog)
モ ジ ュ ールの場合
(* keep_hierarchy = "yes" *) module bottom (in1, in2, in3, in4, out1, out2);
イ ン ス タ ン スの場合
(* keep_hierarchy = "yes" *)bottom u0 (.in1(in1), .in2(in2), .out1(temp1));
KEEP_HIERARCHY の例 (VHDL)
モ ジ ュ ールの場合
attribute keep_hierarchy : string;
attribute keep_hierarchy of beh : architecture is "yes";
イ ン ス タ ン スの場合
attribute keep_hierarchy : string;
attribute keep_hierarchy of u0 : label is "yes";
MARK_DEBUG
MARK_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,
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
44
第 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 debug
attribute 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 debug
set_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_FANOUT
MAX_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 を使用 し て く だ さ い。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
45
第 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
3’b100 : sig =
3’b010 : sig =
3’b001 : sig =
endcase
*) case select
val1;
val2;
val3;
重要 : こ の制約は、 Verilog RTL でのみ制御で き ます。
RAM_STYLE
RAM_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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
46
第 2 章 : 合成属性
attribute ram_style of myram : signal is "distributed";
RAM の コーデ ィ ン グ ス タ イ ルの詳細は、 90 ページの 「RAM の HDL コーデ ィ ン グ手法」 を参照 し て く だ さ い。
ROM_STYLE
ROM_STYLE は、 合成での ROM メ モ リ の推論方法を指定 し ます。 有効な値は次の と お り です。
•
block : RAMB タ イ プの コ ン ポーネ ン ト が推論 さ れ る よ う 指定 し ます。
•
distributed : LUT ROM が推論 さ れ る よ う 指定 し ます。 デフ ォ ル ト では、 ほ と ん ど のデザ イ ン で最適な結果が
生成 さ れ る ROM が推論 さ れます。
こ の属性は RTL ま たは XDC で設定で き ます。
ROM_STYLE の例 (Verilog)
(* rom_style = "distributed" *) reg [data_size-1:0] myrom [2**addr_size-1:0];
ROM_STYLE の例 (VHDL)
attribute rom_style : string;
attribute rom_style of myrom : signal is "distributed";
ROM の コーデ ィ ン グ ス タ イ ルの詳細は、 144 ページの 「ROM の HDL コーデ ィ ン グ手法」 を参照し て く だ さ い。
SHREG_EXTRACT
SHREG_EXTRACT は、 SRL 構造を推論す る か ど う か を指定 し ます。 有効な値は次の と お り です。
•
yes : SRL 構造が推論 さ れます。
•
no : SRL 構造は推論 さ れず、 レ ジ ス タ が作成 さ れます。
SHREG_EXTRACT 属性は、 SRL に宣言す る 信号ま たは SRL を含むモジ ュ ール/エン テ ィ テ ィ に設定 し ます。 RTL ま た
は XDC で設定で き ます。
SHREG_EXTRACT の例 (Verilog)
(* shreg_extract = "no" *) reg [16:0] my_srl;
SHREG_EXTRACT の例 (VHDL)
attribute shreg_extract : string;
attribute shreg_extract of my_srl : signal is "no";
SRL_STYLE
SRL_STYLE 属性は、 SRL メ モ リ の推論方法を指定 し ます。 有効な値は次の と お り です。
•
register : SRL は推論 さ れず、 レ ジ ス タ のみが使用 さ れます。
•
srl : 前後の レ ジ ス タ な し で SRL が推論 さ れます。
•
srl_reg : SRL が推論 さ れ、 SRL の後に レ ジ ス タ が 1 つ残 さ れます。
•
reg_srl : SRL が推論 さ れ、 SRL の前に レ ジ ス タ が 1 つ残 さ れます。
•
reg_srl_reg : SRL が推論 さ れ、 SRL の前後に レ ジ ス タ が 1 つずつ残 さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
47
第 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_ON
TRANSLATE_OFF お よ び TRANSLATE_ON は、 合成で コ ー ド のブ ロ ッ ク を無視する よ う 指定 し ます。 こ れ ら の属性は、
RTL の コ メ ン ト 内で指定 し ます。 コ メ ン ト は、 次のいずれかのキーワ ー ド で開始 し ます。
•
synthesis
•
synopsys
•
pragma
translate_off で無視が開始 さ れ、 translate_on で終了 し ます。 こ れ ら の コ マ ン ド はネ ス ト 化で き ません。
こ の属性は RTL でのみ設定可能です。
TRANSLATE_OFF/TRANSLATE_ON の Verilog 例
// synthesis translate_off
Code....
// synthesis translate_on
TRANSLATE_OFF/TRANSLATE_ON の VHDL 例
-- synthesis translate_off
Code...
-- synthesis translate_on
注意 : translate 文の間に含め る コ ー ド の種類には、 注意が必要です。 デザ イ ンの動作に影響す る コ ー ド の場合、 シ
ミ ュ レー タ で使用 さ れ、 シ ミ ュ レーシ ョ ンで不一致が発生す る こ と があ り ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
48
第 2 章 : 合成属性
USE_DSP48
USE_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"
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
49
第 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
attribute
attribute
attribute
my_att : string;
my_att of beh : architecture is “my_value”
DONT_TOUCH : string;
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
attribute
attribute
attribute
my_att : string;
my_att of my_signal : signal is “my_value”;
DONT_TOUCH : string;
DONT_TOUCH of my_signal : signal is “yes”;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
50
第 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] ウ ィ ン ド ウ でア イ テ ム を選択 し ます。
X-Ref Target - Figure 2-1
図 2-1 : エ ラ ボレー ト 済みデザイ ン での XDC プ ロパテ ィ の追加
2.
3.
[Cell Properties] ウ ィ ン ド ウ で [Properties] ビ ュ ーを ク リ ッ ク し 、 次のいずれか を実行 し ます。
°
プ ロ パテ ィ を変更 し ます。
°
プ ロ パテ ィ が表示 さ れていない場合は、 右 ク リ ッ ク し て [Add Properties] を ク リ ッ ク す る か ツールバーの
[Add properties] ボ タ ン を ク リ ッ ク し て、 [Add Properties] ダ イ ア ロ グ ボ ッ ク ス でプ ロ パテ ィ を選択 し ます。
プ ロ パテ ィ を設定 し た ら 、 [File] → [Save Constraints] を ク リ ッ ク し ます。
こ れに よ り 属性が現在の制約フ ァ イ ルに保存 さ れ る か、 制約フ ァ イ ルが存在 し ない場合は新 し い制約フ ァ イ ルに
保存 さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
51
第 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 の よ う に コ ン ポーネ ン ト イ ン ス タ ン シエーシ ョ ンが多 く ない
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
52
第 3 章 : HDL コ ーデ ィ ン グ手法
SystemVerilog の利点
•
コ ー ド が Verilog よ り も コ ンパ ク ト
•
構造体、 共同体、 列挙型に よ り ス ケー ラ ビ リ テ ィ に優れてい る
•
高抽象度の イ ン タ ーフ ェ イ ス
•
Vivado 合成でサポー ト
フ リ ッ プ フ ロ ッ プ、 レ ジス タ 、 および ラ ッ チ
Vivado 合成では、 次の制御信号付 き のフ リ ッ プ フ ロ ッ プ、 レ ジ ス タ が認識 さ れます。
•
立ち上が り エ ッ ジ ま たは立ち下が り エ ッ ジの ク ロ ッ ク
•
非同期セ ッ ト / リ セ ッ ト
•
同期セ ッ ト / リ セ ッ ト
•
ク ロ ッ ク イ ネーブル
フ リ ッ プ フ ロ ッ プ、 レ ジ ス タ 、 お よ び ラ ッ チは、 次を使用 し て記述 さ れます。
•
順次処理文 (VHDL)
•
always ブ ロ ッ ク (Verilog)
•
フ リ ッ プ フ ロ ッ プには always_ff、 ラ ッ チには always_latch (SystemVerilog)
process ま たは always ブ ロ ッ ク のセ ン シテ ィ ビ テ ィ リ ス ト には、 次を含め る 必要があ り ます。
•
ク ロ ッ ク 信号
•
すべての非同期制御信号
フ リ ッ プ フ ロ ッ プおよびレ ジ ス タ の制御信号
フ リ ッ プ フ ロ ッ プお よ びレ ジ ス タ の制御信号には、 次の も のがあ り ます。
•
クロック
•
非同期お よ び同期のセ ッ ト / リ セ ッ ト 信号
•
ク ロ ッ ク イ ネーブル
コ ー ド 記述のガ イ ド ラ イ ン
•
レ ジ ス タ を非同期にセ ッ ト / リ セ ッ ト し ないで く だ さ い。
°
制御セ ッ ト を マ ッ プ し 直す こ と がで き な く な り ます。
°
ブ ロ ッ ク RAM コ ン ポーネ ン ト お よ び DSP ブ ロ ッ ク な ど のデバ イ ス リ ソ ース の順次機能は、 同期的に し か
セ ッ ト ま たは リ セ ッ ト で き ません。
°
レ ジ ス タ を非同期にセ ッ ト ま たは リ セ ッ ト す る と 、 デバ イ ス
フ ィ ギ ュ レーシ ョ ン さ れな く な り ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
リ ソ ース が使用で き な く な る か、 最適に コ ン
53
第 3 章 : HDL コ ーデ ィ ン グ手法
•
セ ッ ト と リ セ ッ ト の両方を持つフ リ ッ プ フ ロ ッ プを記述 し ないで く だ さ い。
°
同期ま たは非同期の ど ち ら であ っ て も 、セ ッ ト と リ セ ッ ト の両方を持つフ リ ッ プ フ ロ ッ プ プ リ ミ テ ィ ブはあ
り ません。
°
セ ッ ト と リ セ ッ ト の両方を持つフ リ ッ プ フ ロ ッ プは、 エ リ アお よ びパフ ォーマ ン ス に悪影響を与え る 可能性
があ り ます。
•
で き る 限 り 、 セ ッ ト / リ セ ッ ト ロ ジ ッ ク を使用 し ないで く だ さ い。 初期内容を定義 し て回路のグ ロ ーバル リ セ ッ
ト を使用す る な ど、 必要な機能を達成で き る コ ス ト が低いその他の方法があ る 可能性があ り ます。
•
フ リ ッ プ フ ロ ッ プ プ リ ミ テ ィ ブの ク ロ ッ ク イ ネーブル、セ ッ ト / リ セ ッ ト 制御入力は常にア ク テ ィ ブ High に し ま
す。 ア ク テ ィ ブ Low にす る と 、 反転 ロ ジ ッ ク に よ り 回路パフ ォーマ ン ス が悪化する こ と があ り ます。
フ リ ッ プ フ ロ ッ プおよびレ ジ ス タ の推論
Vivado 合成では、 HDL コ ー ド の記述方法に よ っ て、 4 種類の レ ジ ス タ プ リ ミ テ ィ ブが推論 さ れます。
•
FDCE : ク ロ ッ ク イ ネーブルお よ び非同期 ク リ ア付 き D フ リ ッ プ フ ロ ッ プ
•
FDPE : ク ロ ッ ク イ ネーブルお よ び非同期プ リ セ ッ ト 付き D フ リ ッ プ フ ロ ッ プ
•
FDSE : ク ロ ッ ク イ ネーブルお よ び同期セ ッ ト 付き D フ リ ッ プ フ ロ ッ プ
•
FDRE : ク ロ ッ ク イ ネーブルお よ び同期 リ セ ッ ト 付 き D フ リ ッ プ フ ロ ッ プ
フ リ ッ プ フ ロ ッ プおよびレ ジ ス タ の初期化
回路に電源が投入 さ れた と き に レ ジ ス タ の内容を初期化す る には、 信号宣言でデフ ォ ル ト 値を指定 し ます。
フ リ ッ プ フ ロ ッ プおよびレ ジ ス タ のレポー ト
•
HDL 合成中に レ ジ ス タ が推論 さ れ る と 、 レ ポー ト に記述 さ れます。
•
HDL 合成中に推論 さ れた レ ジ ス タ の数は、 Design Summary セ ク シ ョ ンの フ リ ッ プ フ ロ ッ プ プ リ ミ テ ィ ブの数 と
完全に一致 し ない こ と があ り ます。
•
フ リ ッ プ フ ロ ッ プ プ リ ミ テ ィ ブの数は、 次の処理に よ り 異な り ます。
°
DSP ブ ロ ッ ク ま たはブ ロ ッ ク RAM コ ン ポーネ ン ト への レ ジ ス タ の吸収
°
レ ジ ス タ の複製
°
定数ま たは等価フ リ ッ プ フ ロ ッ プの削除
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
54
第 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)
begin
if(clr)
d_reg <= 8'b0;
else if(ce)
d_reg <= d_in;
end
assigndout = d_reg;
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
55
第 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 is
port(
clr, ce, clk : in std_logic;
d_in
: in std_logic_vector(7 downto 0);
dout
: out std_logic_vector(7 downto 0)
);
end entity registers_1;
architecture rtl of registers_1 is
begin
process(clk) is
begin
if rising_edge(clk) then
if clr = '1' then
dout <= "00000000";
elsif ce = '1' then
dout <= d_in;
end if;
end if;
end process;
end architecture rtl;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
56
第 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.vhd
library ieee;
use ieee.std_logic_1164.all;
entity latches is
port(
G, D, CLR : in std_logic;
Q
: out std_logic
);
end latches;
architecture archi of latches is
begin
process(CLR, D, G)
begin
if (CLR = '1') then
Q <= '0';
elsif (G = '1') then
Q <= D;
end if;
end process;
end archi;
\
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
57
第 3 章 : HDL コ ーデ ィ ン グ手法
ト ラ イ ス テー ト
•
ト ラ イ ス テー ト は通常、 信号ま たは i f- e l s e 構文でモデ リ ン グ さ れます。
•
こ れは、 バ ッ フ ァ ーが内部バ ス を駆動する 場合で も 、 デバ イ ス が搭載 さ れてい る ボー ド 上の外部バ ス を駆動す る
場合で も 適用 さ れます。
•
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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
58
第 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 is
generic(
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 is
signal S : std_logic_vector(WIDTH - 1 downto 0);
begin
process(I, T)
begin
if (T = '1') then
S <= I;
else
S <= (others => 'Z');
end if;
end process;
O <= not (S);
end archi;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
59
第 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 is
port(
T : in std_logic;
I : in std_logic;
O : out std_logic
);
end tristates_1;
architecture archi of tristates_1 is
begin
process(I, T)
begin
if (T = '0') then
O <= I;
else
O <= '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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
60
第 3 章 : HDL コ ーデ ィ ン グ手法
シ フ ト レジス タ
シ フ ト レ ジ ス タ は フ リ ッ プ フ ロ ッ プのチ ェ ーン で、 固定数 (ス タ テ ィ ッ ク ) の レ イ テ ン シ段を介 し てデー タ を伝搬で
き ます。 65 ページの 「ダ イ ナ ミ ッ ク シ フ ト レ ジ ス タ 」 では、 伝搬チ ェーンの長 さ を回路の操作中にダ イ ナ ミ ッ ク に
変更で き ます。
コ ー ド 例の フ ァ イ ルは、 次のサ イ ト か ら ダ ウ ン ロ ー ド で き ます。
https://secure.xilinx.com/webreg/clickthrough.do?cid=396394
ス タ テ ィ ッ ク シ フ ト レ ジ ス タ の要素
ス タ テ ィ ッ ク シ フ ト レ ジ ス タ には、 通常次の も のが含ま れます。
•
クロック
•
ク ロ ッ ク イ ネーブル (オプシ ョ ン)
•
シ リ アル デー タ 入力
•
シ リ アル デー タ 出力
シ フ ト レ ジ ス タ の SRL ベースのイ ン プ リ メ ン テーシ ョ ン
Vivado 合成では、 シ フ ト レ ジ ス タ が推論 さ れ る と 、 通常次の よ う な SRL 型の リ ソ ース に イ ンプ リ メ ン ト さ れます。
•
SRL16E
•
SRLC32E
シ フ ト レ ジ ス タ の長 さ に よ っ て、 Vivado 合成で次の よ う に処理 さ れます。
•
SRL タ イ プのプ リ ミ テ ィ ブに イ ンプ リ メ ン ト
•
SRLC タ イ プのプ リ ミ テ ィ ブのカ ス ケー ド 機能を利用
•
デザ イ ンの残 り の部分でシ フ ト レ ジ ス タ の中間地点の ど こ かが使用 さ れ る 場合 も 、こ のカ ス ケー ド 機能が利用 さ
れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
61
第 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 is
generic(
DEPTH : integer := 32
);
port(
clk
: in std_logic;
clken : in std_logic;
SI
: in std_logic;
SO
: out std_logic
);
end shift_registers_0;
architecture archi of shift_registers_0 is
signal shreg : std_logic_vector(DEPTH - 1 downto 0);
begin
process(clk)
begin
if rising_edge(clk) then
if clken = '1' then
shreg <= shreg(DEPTH - 2 downto 0) & SI;
end if;
end if;
end process;
SO <= shreg(DEPTH - 1);
end archi;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
62
第 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 is
generic(
DEPTH : integer := 32
);
port(
clk
: in std_logic;
clken : in std_logic;
SI
: in std_logic;
SO
: out std_logic
);
end shift_registers_1;
architecture archi of shift_registers_1 is
signal shreg : std_logic_vector(DEPTH - 1 downto 0);
begin
process(clk)
begin
if rising_edge(clk) then
if clken = '1' then
for i in 0 to DEPTH - 2 loop
shreg(i + 1) <= shreg(i);
end loop;
shreg(0) <= SI;
end if;
end if;
end process;
SO <= shreg(DEPTH - 1);
end archi;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
63
第 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;
end
end
assign SO = shreg[WIDTH-1];
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
64
第 3 章 : HDL コ ーデ ィ ン グ手法
SRL ベース シ フ ト レ ジス タ のレポー ト
X-Ref Target - Figure 3-1
Report Cell Usage:
-----+-------+----|Cell
|Count
-----+-------+----1
|SRLC32E|
1
ダイナ ミ ッ ク シ フ ト レジス タ
ダ イ ナ ミ ッ ク シ フ ト レ ジ ス タ は、 回路の動作中にダ イ ナ ミ ッ ク に長 さ を変え る こ と がで き る シ フ ト レ ジ ス タ です。
ダ イ ナ ミ ッ ク シ フ ト レ ジ ス タ は、 次の よ う に考え る こ と がで き ます。
•
回路の動作中に指定可能な最大長の フ リ ッ プ フ ロ ッ プのチ ェーン
•
指定 さ れた ク ロ ッ ク サ イ ク ルで伝搬チ ェ ーンか ら デー タ を抽出する 段階を選択する マルチプ レ ク サー
Vivado 合成では、 任意の最大長のダ イ ナ ミ ッ ク シ フ ト レ ジ ス タ を推論で き ます。
Vivado ツールでは、 ダ イ ナ ミ ッ ク レ ジ ス タ はデバ イ ス フ ァ ミ リ で使用可能な SRL タ イ プのプ リ ミ テ ィ ブ を使用 し て
最適に イ ンプ リ メ ン ト で き ます。
X-Ref Target - Figure 3-2
図 3-1:
合成
UG901 (v2015.3) 2015 年 9 月 30 日
ダ イ ナ ミ ッ ク シ フ ト レ ジ ス タ の図
japan.xilinx.com
65
第 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 is
generic(
DEPTH
: integer := 32;
SEL_WIDTH : integer := 5
);
port(
CLK : in std_logic;
SI : in std_logic;
CE : in std_logic;
A
: in std_logic_vector(SEL_WIDTH - 1 downto 0);
DO : out std_logic
);
end dynamic_shift_register_1;
architecture rtl of dynamic_shift_register_1 is
type SRL_ARRAY is array (DEPTH - 1 downto 0) of std_logic;
signal SRL_SIG : SRL_ARRAY;
begin
process(CLK)
begin
if rising_edge(CLK) then
if CE = '1' then
SRL_SIG <= SRL_SIG(DEPTH - 2 downto 0) & SI;
end if;
end if;
end process;
DO <= SRL_SIG(conv_integer(A));
end rtl;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
66
第 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 ブ ロ ッ ク に イ ンプ リ メ ン ト )
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
67
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
68
第 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 is
generic(
WIDTHA : integer := 16;
WIDTHB : integer := 16
);
port(
A
: in std_logic_vector(WIDTHA - 1 downto 0);
B
: in std_logic_vector(WIDTHB - 1 downto 0);
RES : out std_logic_vector(WIDTHA + WIDTHB - 1 downto 0)
);
end mult_unsigned;
architecture beh of mult_unsigned is
begin
RES <= A * B;
end beh;
乗加算お よび乗累算
次のマ ク ロ が推論 さ れます。
•
乗加算
•
乗減算
•
乗加減算
•
乗累算
こ れ ら のマ ク ロ は、 次の も のを集約す る こ と に よ り 推論 さ れます。
•
乗算器
•
加減算器
•
レジス タ
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
69
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
70
第 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 is
generic(AWIDTH : natural := 16;
BWIDTH : natural := 16);
port(clk
: in std_logic;
ar, ai : in std_logic_vector(AWIDTH - 1 downto 0);
br, bi : in std_logic_vector(BWIDTH - 1 downto 0);
pr, pi : out std_logic_vector(AWIDTH + BWIDTH downto 0));
end cmult;
architecture rtl of cmult is
signal ai_d, ai_dd, ai_ddd, ai_dddd
: signed(AWIDTH - 1 downto 0);
signal ar_d, ar_dd, ar_ddd, ar_dddd
: signed(AWIDTH - 1 downto 0);
signal bi_d, bi_dd, bi_ddd, br_d, br_dd, br_ddd : signed(BWIDTH - 1 downto 0);
signal addcommon
: signed(AWIDTH downto 0);
signal addr, addi
: signed(BWIDTH downto 0);
signal mult0, multr, multi, pr_int, pi_int
: signed(AWIDTH + BWIDTH downto 0);
signal common, commonr1, commonr2
: signed(AWIDTH + BWIDTH downto 0);
begin
process(clk)
begin
if rising_edge(clk) then
ar_d
<= signed(ar);
ar_dd <= signed(ar_d);
ai_d
<= signed(ai);
ai_dd <= signed(ai_d);
br_d
<= signed(br);
br_dd <= signed(br_d);
br_ddd <= signed(br_dd);
bi_d
<= signed(bi);
bi_dd <= signed(bi_d);
bi_ddd <= signed(bi_dd);
end if;
end process;
-- Common factor (ar - ai) x bi, shared for the calculations
-- of the real and imaginary final products.
-process(clk)
begin
if rising_edge(clk) then
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
71
第 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)
begin
if rising_edge(clk) then
ar_ddd
<= ar_dd;
ar_dddd <= ar_ddd;
addr
<= resize(br_ddd, BWIDTH + 1) - resize(bi_ddd, BWIDTH + 1);
multr
<= addr * ar_dddd;
commonr1 <= common;
pr_int
<= multr + commonr1;
end if;
end process;
-- Imaginary product
-process(clk)
begin
if rising_edge(clk) then
ai_ddd
<= ai_dd;
ai_dddd <= ai_ddd;
addi
<= resize(br_ddd, BWIDTH + 1) + resize(bi_ddd, BWIDTH + 1);
multi
<= addi * ai_dddd;
commonr2 <= common;
pi_int
<= multi + commonr2;
end if;
end process;
--- VHDL type conversion for output
-pr <= std_logic_vector(pr_int);
pi <= std_logic_vector(pi_int);
end rtl;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
72
第 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
reg
reg
reg
reg
reg
reg
signed
signed
signed
signed
signed
signed
signed
[AWIDTH-1:0]ai_d, ai_dd, ai_ddd, ai_dddd ;
[AWIDTH-1:0]ar_d, ar_dd, ar_ddd, ar_dddd ;
[BWIDTH-1:0]bi_d, bi_dd, bi_ddd, br_d, br_dd, br_ddd ;
[AWIDTH:0]addcommon ;
[BWIDTH:0]addr, addi ;
[AWIDTH+BWIDTH:0]mult0, multr, multi, pr_int, pi_int ;
[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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
73
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
74
第 3 章 : HDL コ ーデ ィ ン グ手法
DSP ブ ロ ッ クの前置加算器
DSP ブ ロ ッ ク を タ ーゲ ッ ト と し て推論 コ ー ド を記述す る 際は、 符号付 き 演算を使用す る こ と が推奨 さ れます。 ま た、
前置加算器が DSP ブ ロ ッ ク に挿入 さ れ る よ う に、 前置加算器用に 1 ビ ッ ト 幅を追加する 必要があ り ます。
乗算器および後置加算器の前に動的に コ ン フ ィ ギ ュ レーシ ョ ン さ
れた前置加算器 (Verilog)
// Pre-add/subtract select with Dynamic control
// dynpreaddmultadd.v
module 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
reg signed
reg signed
reg signed
registers for intermediate values
[SIZEIN-1:0] a_reg, b_reg, c_reg;
[SIZEIN:0]
add_reg;
[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;
end
end
// Output accumulation result
assign dynpreaddmultadd_out = p_reg;
endmodule // dynpreaddmultadd
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
75
第 3 章 : HDL コ ーデ ィ ン グ手法
乗算器および後置加算器の前に動的に コ ン フ ィ ギ ュ レーシ ョ ン さ
れた前置加算器 (VHDL)
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity dynpreaddmultadd is
generic(
AWIDTH : natural := 12;
BWIDTH : natural := 16;
CWIDTH : natural := 17
);
port(
clk
: in std_logic;
subadd : in std_logic;
ain
: in std_logic_vector(AWIDTH
bin
: in std_logic_vector(BWIDTH
cin
: in std_logic_vector(CWIDTH
din
: in std_logic_vector(BWIDTH
pout
: out std_logic_vector(BWIDTH
);
end dynpreaddmultadd;
architecture rtl of
signal a
signal b
signal c
signal add
signal d, mult, p
+
+
1 downto 0);
1 downto 0);
1 downto 0);
CWIDTH downto 0);
CWIDTH downto 0)
dynpreaddmultadd is
: signed(AWIDTH - 1 downto 0);
: signed(BWIDTH - 1 downto 0);
: signed(CWIDTH - 1 downto 0);
: signed(BWIDTH downto 0);
: signed(BWIDTH + CWIDTH downto 0);
begin
process(clk)
begin
if rising_edge(clk) then
a <= signed(ain);
b <= signed(bin);
c <= signed(cin);
d <= signed(din);
if subadd = '1' then
add <= resize(a, BWIDTH + 1) - resize(b, BWIDTH + 1);
else
add <= resize(a, BWIDTH + 1) + resize(b, BWIDTH + 1);
end if;
mult <= add * c;
p
<= mult + d;
end if;
end process;
--- Type conversion for output
-pout <= std_logic_vector(p);
end rtl;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
76
第 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 values
reg 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 result
assign square_out = p_reg;
endmodule // squarediffmult
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
77
第 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 is
generic(
SIZEIN : natural := 16
);
port(
clk, ce, rst : in std_logic;
ain, bin
: in std_logic_vector(SIZEIN - 1 downto 0);
square_out
: out std_logic_vector(2 * SIZEIN + 1 downto 0)
);
end squarediffmult;
architecture rtl of squarediffmult is
-- Declare intermediate values
signal a_reg, b_reg : signed(SIZEIN - 1 downto 0);
signal diff_reg
: signed(SIZEIN downto 0);
signal m_reg, p_reg : signed(2 * SIZEIN + 1 downto 0);
begin
process(clk)
begin
if rising_edge(clk) then
if rst = '1' then
a_reg
<= (others => '0');
b_reg
<= (others => '0');
diff_reg <= (others => '0');
m_reg
<= (others => '0');
p_reg
<= (others => '0');
else
a_reg
<= signed(ain);
b_reg
<= signed(bin);
diff_reg <= resize(a_reg, SIZEIN + 1) - resize(b_reg, SIZEIN + 1);
m_reg
<= diff_reg * diff_reg;
p_reg
<= m_reg;
end if;
end if;
end process;
--- Type conversion for output
-square_out <= std_logic_vector(p_reg);
end rtl;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
78
第 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 top
module 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
reg
reg
reg
reg
reg
signed
signed
signed
signed
signed
signed
[dsize-1:0]
[dsize-1:0]
[dsize-1:0]
[dsize-1:0]
[dsize:0]
[2*dsize-1:0]
coeff;
data;
dataz;
datatwo;
preadd;
product;
assign cascdata = datatwo;
always @(posedge clk)
begin
coeff
<= coeffin;
data
<= datain;
datatwo <= data;
dataz
<= datazin;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
79
第 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
assign
assign
assign
h[0]
h[1]
h[2]
h[3]
=
7;
=
14;
= -138;
= 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
80
第 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 is
generic(
DSIZE : natural := 16;
NBTAP : natural := 4
);
port(
clk
: in std_logic;
datain : in std_logic_vector(DSIZE - 1 downto 0);
dataout : out std_logic_vector(DSIZE - 1 downto 0)
);
end sfir_shifter;
architecture rtl of sfir_shifter is
-- Declare signals
-type CHAIN is array (0 to 2 * NBTAP - 1) of std_logic_vector(DSIZE - 1 downto 0);
signal tmp : CHAIN;
begin
process(clk)
begin
if rising_edge(clk) then
tmp(0) <= datain;
looptmp : for i in 0 to 2 * NBTAP - 2 loop
tmp(i + 1) <= tmp(i);
end loop;
end if;
end process;
dataout <= tmp(2 * NBTAP - 1);
end rtl;
--- FIR filter engine (multiply with pre-add and post-add)
-- submodule used in top (sfir_even_symmetric_systolic_top)
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity sfir_even_symmetric_systolic_element is
generic(DSIZE : natural := 16);
port(clk
: in std_logic;
coeffin, datain, datazin : in std_logic_vector(DSIZE - 1 downto 0);
cascin
: in std_logic_vector(2 * DSIZE downto 0);
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
81
第 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);
begin
process(clk)
begin
if rising_edge(clk) then
coeff
<= signed(coeffin);
data
<= signed(datain);
datatwo
<= data;
dataz
<= signed(datazin);
preadd
<= resize(datatwo, DSIZE + 1) + resize(dataz, DSIZE + 1);
product
<= preadd * coeff;
cascouttmp <= product + signed(cascin);
end if;
end process;
-- Type conversion for output
-cascout <= std_logic_vector(cascouttmp);
cascdata <= std_logic_vector(datatwo);
end rtl;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity sfir_even_symmetric_systolic_top is
generic(NBTAP : natural := 4;
DSIZE : natural := 16;
PSIZE : natural := 33);
port(clk
: in std_logic;
datain : in std_logic_vector(DSIZE - 1 downto 0);
firout : out std_logic_vector(PSIZE - 1 downto 0));
end sfir_even_symmetric_systolic_top;
architecture rtl of sfir_even_symmetric_systolic_top is
-- Declare signals
-type DTAB is array (0 to NBTAP - 1) of std_logic_vector(DSIZE - 1 downto 0);
type HTAB is array (0 to NBTAP - 1) of std_logic_vector(0 to DSIZE - 1);
type PTAB is array (0 to NBTAP - 1) of std_logic_vector(PSIZE - 1 downto 0);
signal arraydata, dataz : DTAB;
signal arrayprod
: PTAB;
signal shifterout
: std_logic_vector(DSIZE - 1 downto 0);
-- Initialize coefficients and a "zero" for the first filter element
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
82
第 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_shifter
generic map(DSIZE, NBTAP)
port map(clk, datain, shifterout);
-- Connect the arithmetic building blocks of the FIR
-gen : for I in 0 to NBTAP - 1 generate
begin
g0 : if I = 0 generate
element_u0 : entity work.sfir_even_symmetric_systolic_element
generic map(DSIZE)
port map(clk, h(I), datain, shifterout, zero_psize, arraydata(I),
arrayprod(I));
end generate g0;
gi : if I /= 0 generate
element_ui : entity work.sfir_even_symmetric_systolic_element
generic map(DSIZE)
port map(clk, h(I), arraydata(I - 1), shifterout, arrayprod(I - 1),
arraydata(I), arrayprod(I));
end generate gi;
end generate gen;
end rtl;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
83
第 3 章 : HDL コ ーデ ィ ン グ手法
偶数丸め (LSB 訂正手法)
DSP ブ ロ ッ ク プ リ ミ テ ィ ブは、 パ タ ーン検出回路を利用 し て、 偶数ま たは奇数への偶数丸めを算出 し ます。
次に、 偶数丸め推論の例を示 し ます。 ブ ロ ッ ク の フル パフ ォ ーマ ン ス で動作 し ます。 LSB 訂正を イ ン プ リ メ ン ト す
る ため、 2 入力 AND ゲー ト (1 LUT) も 推論 さ れます。
偶数への丸め (Verilog)
// Convergent rounding(Even) Example which makes use of pattern detect
// File: convergentRoundingEven.v
module convergentRoundingEven (
input clk,
input [23:0] a,
input [15:0] b,
output reg signed [23:0] zlast
);
reg signed [23:0] areg;
reg signed [15:0] breg;
reg signed [39:0] z1;
reg pattern_detect;
wire [15:0] pattern = 16'b0000000000000000;
wire [39:0] c = 40'b0000000000000000000000000111111111111111; // 15 ones
wire signed [39:0] multadd;
wire signed [15:0] zero;
reg signed [39:0] multadd_reg;
//
//
//
//
//
//
//
//
Convergent Rounding: LSB Correction Technique
--------------------------------------------For static convergent rounding, the pattern detector can be used
to detect the midpoint case. For example, in an 8-bit round, if
the decimal place is set at 4, the C input should be set to
0000.0111. Round to even rounding should use CARRYIN = "1" and
check for PATTERN "XXXX.0000" and replace the units place with 0
if the pattern is matched. See UG193 for more details.
assign multadd = z1 + c + 1'b1;
always @(posedge clk)
begin
areg <= a;
breg <= b;
z1
<= areg * breg;
pattern_detect <= multadd[15:0] == pattern ? 1'b1 : 1'b0;
multadd_reg <= multadd;
end
// Unit bit replaced with 0 if pattern is detected
always @(posedge clk)
zlast <= pattern_detect ? {multadd_reg[39:17],1'b0} : multadd_reg[39:16];
endmodule // convergentRoundingEven
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
84
第 3 章 : HDL コ ーデ ィ ン グ手法
偶数への丸め (VHDL)
-- Convergent rounding(Even) Example which makes use of pattern detect
-- File: convergentRoundingEven.vhd
library 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)
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
85
第 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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
86
第 3 章 : HDL コ ーデ ィ ン グ手法
奇数への丸め (Verilog)
// Convergent rounding(Odd) Example which makes use of pattern detect
// File: convergentRoundingOdd.v
module 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
87
第 3 章 : HDL コ ーデ ィ ン グ手法
奇数への丸め (VHDL)
-- Convergent rounding(Odd) Example which makes use of pattern detect
-- File: convergentRoundingOdd.vhd
library 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
88
第 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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
89
第 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 か ら の
デー タ の読み出 し 方法にあ り ます。 次の表を参照 し て く だ さ い。
表 3-1 : 分散 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 合成では、 記述 さ れてい る デー タ 幅に対応す る ため、 パ リ テ ィ ビ ッ ト を通常のデー タ ビ ッ ト と し て使用
で き ます。
注記 : パ リ テ ィ ビ ッ ト の詳細は、 タ ーゲ ッ ト デバ イ ス のユーザー ガ イ ド を参照 し て く だ さ い。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
90
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
91
第 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 is
port(
clk : in std_logic;
we : in std_logic;
a
: in std_logic_vector(5 downto 0);
di : in std_logic_vector(15 downto 0);
do : out std_logic_vector(15 downto 0)
);
end rams_dist;
architecture syn of rams_dist is
type ram_type is array (63 downto 0) of std_logic_vector(15 downto 0);
signal RAM : ram_type;
begin
process(clk)
begin
if (clk'event and clk = '1') then
if (we = '1') then
RAM(conv_integer(a)) <= di;
end if;
end if;
end process;
do <= RAM(conv_integer(a));
end syn;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
92
第 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 is
port(
clk : in std_logic;
we
: in std_logic;
en
: in std_logic;
addr : in std_logic_vector(9 downto 0);
di
: in std_logic_vector(15 downto 0);
do
: out std_logic_vector(15 downto 0)
);
end rams_sp_rf;
architecture syn of rams_sp_rf is
type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);
signal RAM : ram_type;
begin
process(clk)
begin
if clk'event and clk = '1' then
if en = '1' then
if we = '1' then
RAM(conv_integer(addr)) <= di;
end if;
do <= RAM(conv_integer(addr));
end if;
end if;
end process;
end syn;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
93
第 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 is
port(
clk : in std_logic;
we
: in std_logic;
en
: in std_logic;
addr : in std_logic_vector(9 downto 0);
di
: in std_logic_vector(15 downto 0);
do
: out std_logic_vector(15 downto 0)
);
end rams_sp_wf;
architecture syn of rams_sp_wf is
type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);
signal RAM : ram_type;
begin
process(clk)
begin
if clk'event and clk = '1' then
if en = '1' then
if we = '1' then
RAM(conv_integer(addr)) <= di;
do
<= di;
else
do <= RAM(conv_integer(addr));
end if;
end if;
end if;
end process;
end syn;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
94
第 3 章 : HDL コ ーデ ィ ン グ手法
Write-First モー ド のシ ン グル ポー ト ブ ロ ッ ク RAM の コ ー ド 例 (Verilog)
// Single-Port Block RAM Write-First Mode (recommended template)
// File: rams_sp_wf.v
module 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];
end
end
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
95
第 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];
end
end
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
96
第 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 is
port(
clk : in std_logic;
en
: in std_logic;
we
: in std_logic;
rst : in std_logic;
addr : in std_logic_vector(9 downto 0);
di
: in std_logic_vector(15 downto 0);
do
: out std_logic_vector(15 downto 0)
);
end rams_sp_rf_rst;
architecture syn of rams_sp_rf_rst is
type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);
signal ram : ram_type;
begin
process(clk)
begin
if clk'event and clk = '1' then
if en = '1' then
-- optional enable
if we = '1' then
-- write enable
ram(conv_integer(addr)) <= di;
end if;
if rst = '1' then
-- optional reset
do <= (others => '0');
else
do <= ram(conv_integer(addr));
end if;
end if;
end if;
end process;
end syn;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
97
第 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];
end
end
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
98
第 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 is
port(
clk
: in std_logic;
ena
: in std_logic;
enb
: in std_logic;
wea
: in std_logic;
addra : in std_logic_vector(9 downto 0);
addrb : in std_logic_vector(9 downto 0);
dia
: in std_logic_vector(15 downto 0);
dob
: out std_logic_vector(15 downto 0)
);
end simple_dual_one_clock;
architecture syn of simple_dual_one_clock is
type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);
shared variable RAM : ram_type;
begin
process(clk)
begin
if clk'event and clk = '1' then
if ena = '1' then
if wea = '1' then
RAM(conv_integer(addra)) := dia;
end if;
end if;
end if;
end process;
process(clk)
begin
if clk'event and clk = '1' then
if enb = '1' then
dob <= RAM(conv_integer(addrb));
end if;
end if;
end process;
end syn;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
99
第 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;
end
end
always @(posedge clk) begin
if (enb)
dob <= ram[addrb];
end
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
100
第 3 章 : HDL コ ーデ ィ ン グ手法
2 つのク ロ ッ ク を使用する シ ン プル デ ュ アル ポー ト ブ ロ ッ ク RAM の コ ー ド 例
(VHDL)
-- Simple Dual-Port Block RAM with Two Clocks
-- Correct Modelization with a Shared Variable
-- File: simple_dual_two_clocks.vhd
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
entity simple_dual_two_clocks is
port(
clka : in std_logic;
clkb : in std_logic;
ena
: in std_logic;
enb
: in std_logic;
wea
: in std_logic;
addra : in std_logic_vector(9 downto 0);
addrb : in std_logic_vector(9 downto 0);
dia
: in std_logic_vector(15 downto 0);
dob
: out std_logic_vector(15 downto 0)
);
end simple_dual_two_clocks;
architecture syn of simple_dual_two_clocks is
type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);
shared variable RAM : ram_type;
begin
process(clka)
begin
if clka'event and clka = '1' then
if ena = '1' then
if wea = '1' then
RAM(conv_integer(addra)) := dia;
end if;
end if;
end if;
end process;
process(clkb)
begin
if clkb'event and clkb = '1' then
if enb = '1' then
dob <= RAM(conv_integer(addrb));
end if;
end if;
end process;
end syn;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
101
第 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;
end
end
always @(posedge clkb)
begin
if (enb)
begin
dob <= ram[addrb];
end
end
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
102
第 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 is
port(
clka : in std_logic;
clkb : in std_logic;
ena
: in std_logic;
enb
: in std_logic;
wea
: in std_logic;
web
: in std_logic;
addra : in std_logic_vector(9 downto 0);
addrb : in std_logic_vector(9 downto 0);
dia
: in std_logic_vector(15 downto 0);
dib
: in std_logic_vector(15 downto 0);
doa
: out std_logic_vector(15 downto 0);
dob
: out std_logic_vector(15 downto 0)
);
end rams_tdp_rf_rf;
architecture syn of rams_tdp_rf_rf is
type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);
shared variable RAM : ram_type;
begin
process(CLKA)
begin
if CLKA’event and CLKA = ‘1’ then
if ENA = ‘1’ then
DOA <= RAM(conv_integer(ADDRA));
if WEA = ‘1’ then
RAM(conv_integer(ADDRA)) := DIA;
end if;
end if;
end if;
end process;
process(CLKB)
begin
if CLKB’event and CLKB = ‘1’ then
if ENB = ‘1’ then
DOB <= RAM(conv_integer(ADDRB));
if WEB = ‘1’ then
RAM(conv_integer(ADDRB)) := DIB;
end if;
end if;
end if;
end process;
end syn;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
103
第 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];
end
end
always @(posedge clkb)
begin
if (enb)
begin
if (web)
ram[addrb] <= dib;
dob <= ram[addrb];
end
end
endmodule
オプ シ ョ ンの出力レ ジ ス タ 付き ブ ロ ッ ク RAM の コ ー ド 例 (VHDL)
-- Block RAM with Optional Output Registers
-- File: rams_pipeline.vhd
library IEEE;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity rams_pipeline is
port(
clk1, clk2
: in std_logic;
we, en1, en2 : in std_logic;
addr1
: in std_logic_vector(9 downto 0);
addr2
: in std_logic_vector(9 downto 0);
di
: in std_logic_vector(15 downto 0);
res1
: out std_logic_vector(15 downto 0);
res2
: out std_logic_vector(15 downto 0)
);
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
104
第 3 章 : HDL コ ーデ ィ ン グ手法
end rams_pipeline;
architecture beh of rams_pipeline is
type ram_type is array (1023 downto 0) of std_logic_vector(15 downto 0);
signal ram : ram_type;
signal do1 : std_logic_vector(15 downto 0);
signal do2 : std_logic_vector(15 downto 0);
begin
process(clk1)
begin
if rising_edge(clk1) then
if we = '1' then
ram(conv_integer(addr1)) <= di;
end if;
do1 <= ram(conv_integer(addr1));
end if;
end process;
process(clk2)
begin
if rising_edge(clk2) then
do2 <= ram(conv_integer(addr2));
end if;
end process;
process(clk1)
begin
if rising_edge(clk1) then
if en1 = '1' then
res1 <= do1;
end if;
end if;
end process;
process(clk2)
begin
if rising_edge(clk2) then
if en2 = '1' then
res2 <= do2;
end if;
end if;
end process;
end beh;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
105
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
106
第 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 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
input
input
input
clkB,
enaB,
[NUM_COL-1:0] weB,
[ADDR_WIDTH-1:0] addrB,
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
107
第 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 is
generic(
SIZE
: integer := 1024;
ADDR_WIDTH : integer := 10;
COL_WIDTH : integer := 9;
NB_COL
: integer := 4
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
108
第 3 章 : HDL コ ーデ ィ ン グ手法
);
port(
clka
ena
wea
addra
dia
doa
clkb
enb
web
addrb
dib
dob
);
:
:
:
:
:
:
:
:
:
:
:
:
in
in
in
in
in
out
in
in
in
in
in
out
std_logic;
std_logic;
std_logic_vector(NB_COL - 1 downto 0);
std_logic_vector(ADDR_WIDTH - 1 downto 0);
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
std_logic;
std_logic;
std_logic_vector(NB_COL - 1 downto 0);
std_logic_vector(ADDR_WIDTH - 1 downto 0);
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
0);
0);
0);
0)
end bytewrite_tdp_ram_rf;
architecture byte_wr_ram_rf of bytewrite_tdp_ram_rf is
type ram_type is array (0 to SIZE - 1) of std_logic_vector(NB_COL * COL_WIDTH - 1
downto 0);
shared variable RAM : ram_type := (others => (others => '0'));
begin
------- Port A------process(clka)
begin
if rising_edge(clka) then
if ena = '1' then
doa <= RAM(conv_integer(addra));
for i in 0 to NB_COL - 1 loop
if wea(i) = '1' then
RAM(conv_integer(addra))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) :=
dia((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH);
end if;
end loop;
end if;
end if;
end process;
------- Port B------process(clkb)
begin
if rising_edge(clkb) then
if enb = '1' then
dob <= RAM(conv_integer(addrb));
for i in 0 to NB_COL - 1 loop
if web(i) = '1' then
RAM(conv_integer(addrb))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) :=
dib((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH);
end if;
end loop;
end if;
end if;
end process;
end byte_wr_ram_rf;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
109
第 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 is
generic(
SIZE
: integer := 1024;
ADDR_WIDTH : integer := 10;
COL_WIDTH : integer := 9;
NB_COL
: integer := 4
);
port(
clka
ena
wea
addra
dia
doa
clkb
enb
web
addrb
dib
dob
);
:
:
:
:
:
:
:
:
:
:
:
:
in
in
in
in
in
out
in
in
in
in
in
out
std_logic;
std_logic;
std_logic_vector(NB_COL - 1 downto 0);
std_logic_vector(ADDR_WIDTH - 1 downto 0);
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
std_logic;
std_logic;
std_logic_vector(NB_COL - 1 downto 0);
std_logic_vector(ADDR_WIDTH - 1 downto 0);
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
0);
0);
0);
0)
end bytewrite_tdp_ram_wf;
architecture byte_wr_ram_wf of bytewrite_tdp_ram_wf is
type ram_type is array (0 to SIZE - 1) of std_logic_vector(NB_COL * COL_WIDTH - 1
downto 0);
shared variable RAM : ram_type := (others => (others => '0'));
begin
------- Port A------process(clka)
begin
if rising_edge(clka) then
if ena = '1' then
for i in 0 to NB_COL - 1 loop
if wea(i) = '1' then
RAM(conv_integer(addra))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) :=
dia((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH);
end if;
end loop;
doa <= RAM(conv_integer(addra));
end if;
end if;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
110
第 3 章 : HDL コ ーデ ィ ン グ手法
end process;
------- Port B------process(clkb)
begin
if rising_edge(clkb) then
if enb = '1' then
for i in 0 to NB_COL - 1 loop
if web(i) = '1' then
RAM(conv_integer(addrb))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) :=
dib((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH);
end if;
end loop;
dob <= RAM(conv_integer(addrb));
end if;
end if;
end process;
end byte_wr_ram_wf;
バイ ト 幅 ラ イ ト イ ネーブル (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 is
generic(
SIZE
: integer := 1024;
ADDR_WIDTH : integer := 10;
COL_WIDTH : integer := 9;
NB_COL
: integer := 4
);
port(
clka
ena
wea
addra
dia
doa
clkb
enb
web
addrb
dib
dob
);
:
:
:
:
:
:
:
:
:
:
:
:
in
in
in
in
in
out
in
in
in
in
in
out
合成
UG901 (v2015.3) 2015 年 9 月 30 日
std_logic;
std_logic;
std_logic_vector(NB_COL - 1 downto 0);
std_logic_vector(ADDR_WIDTH - 1 downto 0);
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
std_logic;
std_logic;
std_logic_vector(NB_COL - 1 downto 0);
std_logic_vector(ADDR_WIDTH - 1 downto 0);
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
std_logic_vector(NB_COL * COL_WIDTH - 1 downto
japan.xilinx.com
0);
0);
0);
0)
111
第 3 章 : HDL コ ーデ ィ ン グ手法
end bytewrite_tdp_ram_nc;
architecture byte_wr_ram_nc of bytewrite_tdp_ram_nc is
type ram_type is array (0 to SIZE - 1) of std_logic_vector(NB_COL * COL_WIDTH - 1
downto 0);
shared variable RAM : ram_type := (others => (others => '0'));
begin
------- Port A------process(clka)
begin
if rising_edge(clka) then
if ena = '1' then
if (wea = (wea'range => '0')) then
doa <= RAM(conv_integer(addra));
end if;
for i in 0 to NB_COL - 1 loop
if wea(i) = '1' then
RAM(conv_integer(addra))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) :=
dia((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH);
end if;
end loop;
end if;
end if;
end process;
------- Port B------process(clkb)
begin
if rising_edge(clkb) then
if enb = '1' then
if (web = (web'range => '0')) then
dob <= RAM(conv_integer(addrb));
end if;
for i in 0 to NB_COL - 1 loop
if web(i) = '1' then
RAM(conv_integer(addrb))((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH) :=
dib((i + 1) * COL_WIDTH - 1 downto i * COL_WIDTH);
end if;
end loop;
end if;
end if;
end process;
end byte_wr_ram_nc;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
112
第 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 recomended
module 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
113
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
114
第 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 is
generic(
WIDTHA
: integer := 4;
SIZEA
: integer := 1024;
ADDRWIDTHA : integer := 10;
WIDTHB
: integer := 16;
SIZEB
: integer := 256;
ADDRWIDTHB : integer := 8
);
port(
clkA
clkB
enA
enB
weA
addrA
addrB
diA
doB
);
:
:
:
:
:
:
:
:
:
in
in
in
in
in
in
in
in
out
std_logic;
std_logic;
std_logic;
std_logic;
std_logic;
std_logic_vector(ADDRWIDTHA
std_logic_vector(ADDRWIDTHB
std_logic_vector(WIDTHA - 1
std_logic_vector(WIDTHB - 1
- 1 downto 0);
- 1 downto 0);
downto 0);
downto 0)
end asym_ram_sdp_read_wider;
architecture behavioral of asym_ram_sdp_read_wider is
function max(L, R : INTEGER) return INTEGER is
begin
if L > R then
return L;
else
return R;
end if;
end;
function min(L, R : INTEGER) return INTEGER is
begin
if L < R then
return L;
else
return R;
end if;
end;
function log2(val : INTEGER) return natural is
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
115
第 3 章 : HDL コ ーデ ィ ン グ手法
variable res : natural;
begin
for i in 0 to 31 loop
if (val <= (2 ** i)) then
res := i;
exit;
end if;
end loop;
return res;
end function Log2;
constant
constant
constant
constant
minWIDTH
maxWIDTH
maxSIZE
RATIO
:
:
:
:
integer
integer
integer
integer
:=
:=
:=
:=
min(WIDTHA, WIDTHB);
max(WIDTHA, WIDTHB);
max(SIZEA, SIZEB);
maxWIDTH / minWIDTH;
-- An asymmetric RAM is modeled in a similar way as a symmetric RAM, with an
-- array of array object. Its aspect ratio corresponds to the port with the
-- lower data width (larger depth)
type ramType is array (0 to maxSIZE - 1) of std_logic_vector(minWIDTH - 1 downto 0);
signal my_ram : ramType := (others => (others => '0'));
signal readB : std_logic_vector(WIDTHB - 1 downto 0) := (others => '0');
signal regA : std_logic_vector(WIDTHA - 1 downto 0) := (others => '0');
signal regB : std_logic_vector(WIDTHB - 1 downto 0) := (others => '0');
begin
-- Write process
process(clkA)
begin
if rising_edge(clkA) then
if enA = '1' then
if weA = '1' then
my_ram(conv_integer(addrA)) <= diA;
end if;
end if;
end if;
end process;
-- Read process
process(clkB)
begin
if rising_edge(clkB) then
for i in 0 to RATIO - 1 loop
if enB = '1' then
readB((i + 1) * minWIDTH - 1 downto i * minWIDTH) <=
my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO))));
end if;
end loop;
regB <= readB;
end if;
end process;
doB <= regB;
end behavioral;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
116
第 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;
begin
if (value < 2)
log2 = value;
else
begin
shifted = value-1;
for (res=0; shifted>0; res=res+1)
shifted = shifted>>1;
log2 = res;
end
end
endfunction
localparam maxSIZE = `max(SIZEA, SIZEB);
localparam maxWIDTH = `max(WIDTHA, WIDTHB);
localparam minWIDTH = `min(WIDTHA, WIDTHB);
localparam RATIO = maxWIDTH / minWIDTH;
localparam log2RATIO = log2(RATIO);
reg [minWIDTH-1:0] RAM [0:maxSIZE-1];
reg [WIDTHB-1:0] readB;
always @(posedge clkA)
begin
if (enaA) begin
if (weA)
RAM[addrA] <= diA;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
117
第 3 章 : HDL コ ーデ ィ ン グ手法
end
end
always @(posedge clkB)
begin : ramread
integer i;
reg [log2RATIO-1:0] lsbaddr;
if (enaB) begin
for (i = 0; i < RATIO; i = i+1) begin
lsbaddr = i;
readB[(i+1)*minWIDTH-1 -: minWIDTH] <= RAM[{addrB, lsbaddr}];
end
end
end
assigndoB = readB;
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
118
第 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 is
generic(
WIDTHA
: integer := 4;
SIZEA
: integer := 1024;
ADDRWIDTHA : integer := 10;
WIDTHB
: integer := 16;
SIZEB
: integer := 256;
ADDRWIDTHB : integer := 8
);
port(
clkA
clkB
enA
enB
weB
addrA
addrB
diB
doA
);
:
:
:
:
:
:
:
:
:
in
in
in
in
in
in
in
in
out
std_logic;
std_logic;
std_logic;
std_logic;
std_logic;
std_logic_vector(ADDRWIDTHA
std_logic_vector(ADDRWIDTHB
std_logic_vector(WIDTHB - 1
std_logic_vector(WIDTHA - 1
- 1 downto 0);
- 1 downto 0);
downto 0);
downto 0)
end asym_ram_sdp_write_wider;
architecture behavioral of asym_ram_sdp_write_wider is
function max(L, R : INTEGER) return INTEGER is
begin
if L > R then
return L;
else
return R;
end if;
end;
function min(L, R : INTEGER) return INTEGER is
begin
if L < R then
return L;
else
return R;
end if;
end;
function log2(val : INTEGER) return natural is
variable res : natural;
begin
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
119
第 3 章 : HDL コ ーデ ィ ン グ手法
for i in 0 to 31 loop
if (val <= (2 ** i)) then
res := i;
exit;
end if;
end loop;
return res;
end function Log2;
constant
constant
constant
constant
minWIDTH
maxWIDTH
maxSIZE
RATIO
:
:
:
:
integer
integer
integer
integer
:=
:=
:=
:=
min(WIDTHA, WIDTHB);
max(WIDTHA, WIDTHB);
max(SIZEA, SIZEB);
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
signal
signal
signal
readA
readB
regA
regB
:
:
:
:
std_logic_vector(WIDTHA
std_logic_vector(WIDTHB
std_logic_vector(WIDTHA
std_logic_vector(WIDTHB
-
1
1
1
1
downto
downto
downto
downto
0)
0)
0)
0)
:=
:=
:=
:=
(others
(others
(others
(others
=>
=>
=>
=>
'0');
'0');
'0');
'0');
begin
-- read process
process(clkA)
begin
if rising_edge(clkA) then
if enA = '1' then
readA <= my_ram(conv_integer(addrA));
end if;
regA <= readA;
end if;
end process;
-- Write process
process(clkB)
begin
if rising_edge(clkB) then
for i in 0 to RATIO - 1 loop
if enB = '1' then
if weB = '1' then
my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO)))) <=
diB((i + 1) * minWIDTH - 1 downto i * minWIDTH);
end if;
end if;
end loop;
regB <= readB;
end if;
end process;
doA <= regA;
end behavioral;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
120
第 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;
begin
if (value < 2)
log2 = value;
else
begin
shifted = value-1;
for (res=0; shifted>0; res=res+1)
shifted = shifted>>1;
log2 = res;
end
end
endfunction
localparam maxSIZE = `max(SIZEA, SIZEB);
localparam maxWIDTH = `max(WIDTHA, WIDTHB);
localparam minWIDTH = `min(WIDTHA, WIDTHB);
localparam RATIO = maxWIDTH / minWIDTH;
localparam log2RATIO = log2(RATIO);
reg [minWIDTH-1:0] RAM [0:maxSIZE-1];
reg [WIDTHB-1:0] readB;
always @(posedge clkB) begin
if (enaB) begin
readB <= RAM[addrB];
end
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
121
第 3 章 : HDL コ ーデ ィ ン グ手法
end
assign doB = readB;
always @(posedge clkA)
begin : ramwrite
integer i;
reg [log2RATIO-1:0] lsbaddr;
for (i=0; i< RATIO; i= i+ 1) begin : write1
lsbaddr = i;
if (enaA) begin
if (weA)
RAM[{addrA, lsbaddr}] <= diA[(i+1)*minWIDTH-1 -: minWIDTH];
end
end
end
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
122
第 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 is
generic(
WIDTHA
: integer := 4;
SIZEA
: integer := 1024;
ADDRWIDTHA : integer := 10;
WIDTHB
: integer := 16;
SIZEB
: integer := 256;
ADDRWIDTHB : integer := 8
);
port(
clkA
clkB
enA
enB
weA
weB
addrA
addrB
diA
diB
doA
doB
);
:
:
:
:
:
:
:
:
:
:
:
:
in
in
in
in
in
in
in
in
in
in
out
out
std_logic;
std_logic;
std_logic;
std_logic;
std_logic;
std_logic;
std_logic_vector(ADDRWIDTHA
std_logic_vector(ADDRWIDTHB
std_logic_vector(WIDTHA - 1
std_logic_vector(WIDTHB - 1
std_logic_vector(WIDTHA - 1
std_logic_vector(WIDTHB - 1
- 1 downto 0);
- 1 downto 0);
downto 0);
downto 0);
downto 0);
downto 0)
end asym_ram_tdp_read;
architecture behavioral of asym_ram_tdp_read is
function max(L, R : INTEGER) return INTEGER is
begin
if L > R then
return L;
else
return R;
end if;
end;
function min(L, R : INTEGER) return INTEGER is
begin
if L < R then
return L;
else
return R;
end if;
end;
function log2(val : INTEGER) return natural is
variable res : natural;
begin
for i in 0 to 31 loop
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
123
第 3 章 : HDL コ ーデ ィ ン グ手法
if (val <= (2 ** i)) then
res := i;
exit;
end if;
end loop;
return res;
end function Log2;
constant
constant
constant
constant
minWIDTH
maxWIDTH
maxSIZE
RATIO
:
:
:
:
integer
integer
integer
integer
:=
:=
:=
:=
min(WIDTHA, WIDTHB);
max(WIDTHA, WIDTHB);
max(SIZEA, SIZEB);
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
signal
signal
signal
readA
readB
regA
regB
:
:
:
:
std_logic_vector(WIDTHA
std_logic_vector(WIDTHB
std_logic_vector(WIDTHA
std_logic_vector(WIDTHB
-
1
1
1
1
downto
downto
downto
downto
0)
0)
0)
0)
:=
:=
:=
:=
(others
(others
(others
(others
=>
=>
=>
=>
'0');
'0');
'0');
'0');
begin
process(clkA)
begin
if rising_edge(clkA) then
if enA = '1' then
readA <= my_ram(conv_integer(addrA));
if weA = '1' then
my_ram(conv_integer(addrA)) <= diA;
end if;
end if;
regA <= readA;
end if;
end process;
process(clkB)
begin
if rising_edge(clkB) then
for i in 0 to RATIO - 1 loop
if enB = '1' then
readB((i + 1) * minWIDTH - 1 downto i * minWIDTH) <=
my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO))));
if weB = '1' then
my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO)))) <=
diB((i + 1) * minWIDTH - 1 downto i * minWIDTH);
end if;
end if;
end loop;
regB <= readB;
end if;
end process;
doA <= regA;
doB <= regB;
end behavioral;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
124
第 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
input
input
input
[ADDRWIDTHA-1:0] addrA;
[ADDRWIDTHB-1:0] addrB;
[WIDTHA-1:0] diA;
[WIDTHB-1:0] diB;
output [WIDTHA-1:0] doA;
output [WIDTHB-1:0] doB;
`define max(a,b) {(a) > (b) ? (a) : (b)}
`define min(a,b) {(a) < (b) ? (a) : (b)}
function integer log2;
input integer value;
reg [31:0] shifted;
integer res;
begin
if (value < 2)
log2 = value;
else
begin
shifted = value-1;
for (res=0; shifted>0; res=res+1)
shifted = shifted>>1;
log2 = res;
end
end
endfunction
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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
125
第 3 章 : HDL コ ーデ ィ ン グ手法
always @(posedge clkB)
begin
if (enaB) begin
readB <= RAM[addrB] ;
if (weB)
RAM[addrB] <= diB;
end
end
always @(posedge clkA)
begin : portA
integer i;
reg [log2RATIO-1:0] lsbaddr ;
for (i=0; i< RATIO; i= i+ 1) begin
lsbaddr = i;
if (enaA) begin
readA[(i+1)*minWIDTH -1 -: minWIDTH] <= RAM[{addrA, lsbaddr}];
if (weA)
RAM[{addrA, lsbaddr}] <= diA[(i+1)*minWIDTH-1 -: minWIDTH];
end
end
end
assign doA = readA;
assign doB = readB;
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
126
第 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 is
generic(
WIDTHA
: integer := 4;
SIZEA
: integer := 1024;
ADDRWIDTHA : integer := 10;
WIDTHB
: integer := 16;
SIZEB
: integer := 256;
ADDRWIDTHB : integer := 8
);
port(
clkA
clkB
enA
enB
weA
weB
addrA
addrB
diA
diB
doA
doB
);
:
:
:
:
:
:
:
:
:
:
:
:
in
in
in
in
in
in
in
in
in
in
out
out
std_logic;
std_logic;
std_logic;
std_logic;
std_logic;
std_logic;
std_logic_vector(ADDRWIDTHA
std_logic_vector(ADDRWIDTHB
std_logic_vector(WIDTHA - 1
std_logic_vector(WIDTHB - 1
std_logic_vector(WIDTHA - 1
std_logic_vector(WIDTHB - 1
- 1 downto 0);
- 1 downto 0);
downto 0);
downto 0);
downto 0);
downto 0)
end asym_ram_tdp_write_first;
architecture behavioral of asym_ram_tdp_write_first is
function max(L, R : INTEGER) return INTEGER is
begin
if L > R then
return L;
else
return R;
end if;
end;
function min(L, R : INTEGER) return INTEGER is
begin
if L < R then
return L;
else
return R;
end if;
end;
function log2(val : INTEGER) return natural is
variable res : natural;
begin
for i in 0 to 31 loop
if (val <= (2 ** i)) then
res := i;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
127
第 3 章 : HDL コ ーデ ィ ン グ手法
exit;
end if;
end loop;
return res;
end function Log2;
constant
constant
constant
constant
minWIDTH
maxWIDTH
maxSIZE
RATIO
:
:
:
:
integer
integer
integer
integer
:=
:=
:=
:=
min(WIDTHA, WIDTHB);
max(WIDTHA, WIDTHB);
max(SIZEA, SIZEB);
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
signal
signal
signal
readA
readB
regA
regB
:
:
:
:
std_logic_vector(WIDTHA
std_logic_vector(WIDTHB
std_logic_vector(WIDTHA
std_logic_vector(WIDTHB
-
1
1
1
1
downto
downto
downto
downto
0)
0)
0)
0)
:=
:=
:=
:=
(others
(others
(others
(others
=>
=>
=>
=>
'0');
'0');
'0');
'0');
begin
process(clkA)
begin
if rising_edge(clkA) then
if enA = '1' then
if weA = '1' then
my_ram(conv_integer(addrA)) <= diA;
readA
<= diA;
else
readA <= my_ram(conv_integer(addrA));
end if;
end if;
regA <= readA;
end if;
end process;
process(clkB)
begin
if rising_edge(clkB) then
for i in 0 to RATIO - 1 loop
if enB = '1' then
if weB = '1' then
my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO)))) <=
diB((i + 1) * minWIDTH - 1 downto i * minWIDTH);
end if;
-- The read statement below is placed after the write statement -- on purpose
-- to ensure write-first synchronization through the variable
-- mechanism
readB((i + 1) * minWIDTH - 1 downto i * minWIDTH) <=
my_ram(conv_integer(addrB & conv_std_logic_vector(i, log2(RATIO))));
end if;
end loop;
regB <= readB;
end if;
end process;
doA <= regA;
doB <= regB;
end behavioral;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
128
第 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
input
input
input
[ADDRWIDTHA-1:0] addrA;
[ADDRWIDTHB-1:0] addrB;
[WIDTHA-1:0] diA;
[WIDTHB-1:0] diB;
output [WIDTHA-1:0] doA;
output [WIDTHB-1:0] doB;
`define max(a,b) {(a) > (b) ? (a) : (b)}
`define min(a,b) {(a) < (b) ? (a) : (b)}
function integer log2;
input integer value;
reg [31:0] shifted;
integer res;
begin
if (value < 2)
log2 = value;
else
begin
shifted = value-1;
for (res=0; shifted>0; res=res+1)
shifted = shifted>>1;
log2 = res;
end
end
endfunction
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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
129
第 3 章 : HDL コ ーデ ィ ン グ手法
always @(posedge clkB)
begin
if (enaB) begin
if (weB)
RAM[addrB] = diB;
readB = RAM[addrB] ;
end
end
always @(posedge clkA)
begin : portA
integer i;
reg [log2RATIO-1:0] lsbaddr ;
for (i=0; i< RATIO; i= i+ 1) begin
lsbaddr = i;
if (enaA) begin
if (weA)
RAM[{addrA, lsbaddr}] = diA[(i+1)*minWIDTH-1 -: minWIDTH];
readA[(i+1)*minWIDTH -1 -: minWIDTH] = RAM[{addrA, lsbaddr}];
end
end
end
assign doA = readA;
assign doB = readB;
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
130
第 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 進数値で初期化 し てい ます。
00001110110000011001111011000110
00101011001011010101001000100011
01110100010100011000011100001111
01000001010000100101001110010100
00001001101001111111101000101011
00101101001011111110101010100111
11101111000100111000111101101101
10001111010010011001000011101111
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
131
第 3 章 : HDL コ ーデ ィ ン グ手法
00000001100011100011110010011111
11011111001110101011111001001010
11100111010100111110110011001010
11000100001001101100111100101001
10001011100101011111111111100001
11110101110110010000010110111010
01001011000000111001010110101110
11100001111111001010111010011110
01101111011010010100001101110001
01010100011011111000011000100100
11110000111101101111001100001011
10101101001111010100100100011100
01011100001010111111101110101110
01011101000100100111010010110101
11110111000100000101011101101101
11100111110001111010101100001101
01110100000011101111111000011111
00010011110101111000111001011101
01101110001111100011010101101111
10111100000000010011101011011011
11000001001101001101111100010000
00011111110010110110011111010101
01100100100000011100100101110000
10001000000100111011001010001111
11001000100011101001010001100001
10000000100111010011100111100011
11011111010010100010101010000111
10000000110111101000111110111011
10110011010111101111000110011001
00010111100001001010110111011100
10011100101110101111011010110011
01010011101101010001110110011010
01111011011100010101000101000001
10001000000110010110111001101010
11101000001101010000111001010110
11100011111100000111110101110101
01001010000000001111111101101111
00100011000011001000000010001111
10011000111010110001001011100100
11111111111011110101000101000111
11000011000101000011100110100000
01101101001011111010100011101001
10000111101100101001110011010111
11010110100100101110110010100100
01001111111001101101011111001011
11011001001101110110000100110111
10110110110111100101110011100110
10011100111001000010111111010110
00000000001011011111001010110010
10100110011010000010001000011011
11001010111111001001110001110101
00100001100010000111000101001000
00111100101111110001101101111010
11000010001010000000010100100001
11000001000110001101000101001110
10010011010100010001100100100111
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
132
第 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 is
FILE RamFile : text is in RamFileName;
variable RamFileLine : line;
variable RAM : RamType;
begin
for I in RamType'range loop
readline (RamFile, RamFileLine);
read (RamFileLine, RAM(I));
end loop;
return RAM;
end function;
signal RAM : RamType := InitRamFromFile("rams_20c.data");
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
133
第 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]
ram[60]
ram[57]
ram[54]
ram[51]
ram[48]
ram[45]
ram[42]
ram[39]
ram[36]
ram[33]
ram[30]
ram[27]
ram[24]
ram[21]
ram[18]
ram[15]
ram[12]
ram[9]
ram[6]
ram[3]
ram[0]
end
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
20'h0200A;
20'h04000;
20'h00300;
20'h0203B;
20'h08201;
20'h02500;
20'h04002;
20'h00500;
20'h04003;
20'h00102;
20'h00301;
20'h04001;
20'h00900;
20'h04002;
20'h02023;
20'h00301;
20'h00102;
20'h00301;
20'h04004;
20'h02500;
20'h0030D;
20'h0400D;
ram[62]
ram[59]
ram[56]
ram[53]
ram[50]
ram[47]
ram[44]
ram[41]
ram[38]
ram[35]
ram[32]
ram[29]
ram[26]
ram[23]
ram[20]
ram[17]
ram[14]
ram[11]
ram[8]
ram[5]
ram[2]
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
20'h00300;
20'h08601;
20'h08602;
20'h08300;
20'h00500;
20'h00340;
20'h08300;
20'h08101;
20'h0241E;
20'h02122;
20'h00102;
20'h00342;
20'h00302;
20'h00900;
20'h00303;
20'h04004;
20'h02137;
20'h00102;
20'h00304;
20'h02500;
20'h02341;
ram[61] = 20'h08101;
ram[58] = 20'h0233A;
ram[55] = 20'h02310;
ram[52] = 20'h04002;
ram[49] = 20'h04001;
ram[46] = 20'h00241;
ram[43] = 20'h08201;
ram[40] = 20'h00602;
ram[37] = 20'h00301;
ram[34] = 20'h02021;
ram[31] = 20'h02222;
ram[28] = 20'h0232B;
ram[25] = 20'h00102;
ram[22] = 20'h08201;
ram[19] = 20'h02433;
ram[16] = 20'h00301;
ram[13] = 20'h02036;
ram[10] = 20'h02237;
ram[7] = 20'h04040;
ram[4] = 20'h02500;
ram[1] = 20'h08201;
always @(posedge clk)
begin
if (we)
ram[addr] <= di;
dout <= ram[addr];
end
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
134
第 3 章 : HDL コ ーデ ィ ン グ手法
ブ ロ ッ ク RAM の初期化の コ ー ド 例 (VHDL)
-- Initializing Block RAM (Single-Port Block RAM)
-- File: rams_sp_rom.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity rams_sp_rom is
port(
clk : in std_logic;
we
: in std_logic;
addr : in std_logic_vector(5 downto 0);
di
: in std_logic_vector(19 downto 0);
do
: out std_logic_vector(19 downto 0)
);
end rams_sp_rom;
architecture syn of rams_sp_rom is
type ram_type is array (63 downto 0) of std_logic_vector(19 downto 0);
signal RAM : ram_type := (X"0200A", X"00300", X"08101", X"04000", X"08601",
X"0233A",
X"00300", X"08602", X"02310", X"0203B", X"08300", X"04002",
X"08201", X"00500", X"04001", X"02500", X"00340", X"00241",
X"04002", X"08300", X"08201", X"00500", X"08101", X"00602",
X"04003", X"0241E", X"00301", X"00102", X"02122", X"02021",
X"00301", X"00102", X"02222", X"04001", X"00342", X"0232B",
X"00900", X"00302", X"00102", X"04002", X"00900", X"08201",
X"02023", X"00303", X"02433", X"00301", X"04004", X"00301",
X"00102", X"02137", X"02036", X"00301", X"00102", X"02237",
X"04004", X"00304", X"04040", X"02500", X"02500", X"02500",
X"0030D", X"02341", X"08201", X"0400D");
begin
process(clk)
begin
if rising_edge(clk) then
if we = '1' then
RAM(conv_integer(addr)) <= di;
end if;
do <= RAM(conv_integer(addr));
end if;
end process;
end syn;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
135
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
136
第 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 is
port(
clk : in std_logic;
we
: in std_logic;
addr : in std_logic_vector(5 downto 0);
din : in std_logic_vector(31 downto 0);
dout : out std_logic_vector(31 downto 0)
);
end rams_init_file;
architecture syn of rams_init_file is
type RamType is array (0 to 63) of bit_vector(31 downto 0);
impure function InitRamFromFile(RamFileName : in string) return RamType is
FILE RamFile : text is in RamFileName;
variable RamFileLine : line;
variable RAM
: RamType;
begin
for I in RamType'range loop
readline(RamFile, RamFileLine);
read(RamFileLine, RAM(I));
end loop;
return RAM;
end function;
signal RAM : RamType := InitRamFromFile("rams_init_file.data");
begin
process(clk)
begin
if clk'event and clk = '1' then
if we = '1' then
RAM(conv_integer(addr)) <= to_bitvector(din);
end if;
dout <= to_stdlogicvector(RAM(conv_integer(addr)));
end if;
end process;
end syn;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
137
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
138
第 3 章 : HDL コ ーデ ィ ン グ手法
ブ ラ ッ ク ボ ッ ク スの例 (VHDL)
-- Black Box
-- black_box_1.vhd
library ieee;
use ieee.std_logic_1164.all;
entity black_box_1 is
port(DI_1, DI_2 : in std_logic;
DOUT
: out std_logic);
end black_box_1;
architecture rtl of black_box_1 is
component black_box1
port(I1 : in std_logic;
I2 : in std_logic;
O : out std_logic);
end component;
attribute black_box : string;
attribute black_box of black_box1 : component is "yes";
begin
U1 : black_box1 port map(I1 => DI_1, I2 => DI_2, O => DOUT);
end rtl;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
139
第 3 章 : HDL コ ーデ ィ ン グ手法
FSM コ ンポーネ ン ト
Vivado 合成の機能
•
同期有限ス テー ト マシ ン (FSM) コ ン ポーネ ン ト に特定の推論機能
•
最適化の目標に対応 し た ビル ト イ ン FSM エン コー ド ス ト ラ テジ
•
FSM 抽出はデフ ォ ル ト で イ ネーブル
•
FSM 抽出をデ ィ ス エーブルにす る には -fsm_extraction off を使用
FSM 記述
Vivado 合成では、 ムーア型 と ミ ー リ ー型の両方の有限ス テー ト マシ ン (FSM) がサポー ト さ れます。 FSM には、 次が
含まれます。
•
ス テー ト レ ジ ス タ
•
次ス テー ト 関数
•
出力関数
FSM の図
次に、 ミ ー リ ー型マシ ン と ムーア型マシ ン を組み込んだ FSM の図を示 し ます。
X-Ref Target - Figure 3-2
図 3-2 : ミ ー リ ー型マシ ン と ムーア型マシ ン を組み込んだ FSM
次に、 3 つのプ ロ セ ス を使用 し た FSM の図を示 し ます。
X-Ref Target - Figure 3-3
図 3-3 : 3 つのプ ロ セス を使用 し た FSM
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
140
第 3 章 : HDL コ ーデ ィ ン グ手法
FSM レ ジ ス タ
•
リ セ ッ ト ま たは電源投入ス テー ト を指定 し て有限ス テー ト マシ ン (FSM) を認識 さ せ る か、 FSM_ENCODING を
"none" に設定 し ます。
•
ス テー ト レ ジ ス タ は、 特定の ス テー ト に対 し て非同期ま たは同期に リ セ ッ ト で き ます。
推奨 : FSM には、 非同期 リ セ ッ ト ロ ジ ッ ク よ り も 同期 リ セ ッ ト ロ ジ ッ ク を使用する こ と をお勧め し ます。
自動ス テー ト エ ン コ ー ド
FSM_ENCODING を "auto" に設定す る と 、 Vivado 合成で各 FSM に最適なエン コ ー ド 方法が自動的に選択 さ れます。
ワ ン ホ ッ ト ス テー ト エ ン コ ー ド
ワ ン ホ ッ ト ス テー ト エン コ ー ド には、 次の よ う な特徴があ り ます。
•
32 ス テー ト ま での ス テー ト マシ ンのデフ ォ ル ト エン コ ー ド 方法です。
•
速度を最適化 し た り 、 消費電力を削減す る 場合に適 し てい ます。
•
各 FSM ス テー ト に コ ー ド の各ビ ッ ト が割 り 当て ら れます。
•
各ス テー ト に 1 つの フ リ ッ プ フ ロ ッ プ を使用 し た ス テー ト レ ジ ス タ を イ ンプ リ メ ン ト し ます。
•
1 つの ク ロ ッ ク サ イ ク ルで 1 つの ス テー ト レ ジ ス タ のみがアサー ト さ れます。
•
2 つの ス テー ト 間を遷移す る 際、 2 つのビ ッ ト のみが ト グル し ます。
グ レ イ ス テー ト エ ン コ ー ド
グ レ イ ス テー ト エン コ ー ド には、 次の よ う な特徴があ り ます。
•
連続 し た 2 つの ス テー ト 間では、 1 ビ ッ ト し か切 り 替わ り ません。
•
分岐のない長いパ ス を持つ コ ン ト ロ ー ラ に適 し てい ます。
•
ハザー ド やグ リ ッ チを最小限に抑え ます。
•
消費電力を最小限に抑え る ために使用で き ます。
ジ ョ ン ソ ン ス テー ト エ ン コ ー ド
ジ ョ ン ソ ン ス テー ト エン コ ー ド は、 グ レ イ ス テー ト エン コ ー ド と 同様、 分岐のない長いパ ス を含むス テー ト マシ ン
に適 し てい ます。
シーケ ン シ ャル ス テー ト エ ン コ ー ド
シーケ ン シ ャ ル ス テー ト エン コ ー ド には、 次の よ う な特徴があ り ます。
•
長いパ ス を識別 し ます。
•
こ れ ら のパ ス の ス テー ト に連続す る 基数 コ ー ド を 2 つ適用 し ます。
•
次ス テー ト の論理式を最小限に抑え ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
141
第 3 章 : HDL コ ーデ ィ ン グ手法
FSM の例 (Verilog)
// State Machine with single sequential block
//fsm_1.v
module fsm_1(clk,reset,flag,sm_out);
input clk,reset,flag;
output reg sm_out;
parameter
parameter
parameter
parameter
parameter
s1
s2
s3
s4
s5
=
=
=
=
=
3'b000;
3'b001;
3'b010;
3'b011;
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;
s3: begin state <= s4;
s4: begin state <= s5;
s5: begin state <= s1;
endcase
end
end
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
sm_out
sm_out
sm_out
sm_out
<=
<=
<=
<=
1'b0;
1'b0;
1'b1;
1'b1;
japan.xilinx.com
end
end
end
end
142
第 3 章 : HDL コ ーデ ィ ン グ手法
1 つのシーケ ン シ ャル ブ ロ ッ ク を使用する FSM の コ ー ド 例 (VHDL)
-- State Machine with single sequential block
-- File: fsm_1.vhd
library IEEE;
use IEEE.std_logic_1164.all;
entity fsm_1 is
port(
clk, reset, flag : IN std_logic;
sm_out
: OUT std_logic
);
end entity;
architecture behavioral of fsm_1 is
type state_type is (s1, s2, s3, s4, s5);
signal state : state_type;
begin
process(clk)
begin
if rising_edge(clk) then
if (reset = '1') then
state <= s1;
sm_out <= '1';
else
case state is
when s1 => if flag = '1' then
state <= s2;
sm_out <= '1';
else
state <= s3;
sm_out <= '0';
end if;
when s2 =>
sm_out
when s3 =>
sm_out
when s4 =>
sm_out
when s5 =>
sm_out
end case;
end if;
end if;
end process;
state <= s4;
<= '0';
state <= s4;
<= '0';
state <= s5;
<= '1';
state <= s1;
<= '1';
end behavioral;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
143
第 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
begin
if (en)
case(addr)
6'b000000:
6'b000001:
6'b000010:
6'b000011:
6'b000100:
6'b000101:
6'b000110:
6'b000111:
6'b001000:
6'b001001:
6'b001010:
6'b001011:
6'b001100:
6'b001101:
6'b001110:
6'b001111:
6'b010000:
6'b010001:
6'b010010:
6'b010011:
6'b010100:
6'b010101:
合成
UG901 (v2015.3) 2015 年 9 月 30 日
clk)
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
20'h0200A;6'b100000:
20'h00300;6'b100001:
20'h08101;6'b100010:
20'h04000;6'b100011:
20'h08601;6'b100100:
20'h0233A;6'b100101:
20'h00300;6'b100110:
20'h08602;6'b100111:
20'h02310;6'b101000:
20'h0203B;6'b101001:
20'h08300;6'b101010:
20'h04002;6'b101011:
20'h08201;6'b101100:
20'h00500;6'b101101:
20'h04001;6'b101110:
20'h02500;6'b101111:
20'h00340;6'b110000:
20'h00241;6'b110001:
20'h04002;6'b110010:
20'h08300;6'b110011:
20'h08201;6'b110100:
20'h00500;6'b110101:
japan.xilinx.com
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
data
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
20'h02222;
20'h04001;
20'h00342;
20'h0232B;
20'h00900;
20'h00302;
20'h00102;
20'h04002;
20'h00900;
20'h08201;
20'h02023;
20'h00303;
20'h02433;
20'h00301;
20'h04004;
20'h00301;
20'h00102;
20'h02137;
20'h02036;
20'h00301;
20'h00102;
20'h02237;
144
第 3 章 : HDL コ ーデ ィ ン グ手法
6'b010110:
6'b010111:
6'b011000:
6'b011001:
6'b011010:
6'b011011:
6'b011100:
6'b011101:
6'b011110:
6'b011111:
endcase
data
data
data
data
data
data
data
data
data
data
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
20'h08101;6'b110110:
20'h00602;6'b110111:
20'h04003;6'b111000:
20'h0241E;6'b111001:
20'h00301;6'b111010:
20'h00102;6'b111011:
20'h02122;6'b111100:
20'h02021;6'b111101:
20'h00301;6'b111110:
20'h00102;6'b111111:
data
data
data
data
data
data
data
data
data
data
<=
<=
<=
<=
<=
<=
<=
<=
<=
<=
20'h04004;
20'h00304;
20'h04040;
20'h02500;
20'h02500;
20'h02500;
20'h0030D;
20'h02341;
20'h08201;
20'h0400D;
end
assign dout = data;
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
145
第 3 章 : HDL コ ーデ ィ ン グ手法
配列に対する ROM の推論の例 (VHDL)
-- ROM Inference on array
-- File: roms_1.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity roms_1
port(
clk : in
en
: in
addr : in
data : out
);
end roms_1;
is
std_logic;
std_logic;
std_logic_vector(5 downto 0);
std_logic_vector(19 downto 0)
architecture behavioral of roms_1 is
type rom_type is array (63 downto 0) of std_logic_vector(19 downto 0);
signal ROM : rom_type := (X"0200A", X"00300", X"08101", X"04000", X"08601",
X"0233A",
X"00300", X"08602", X"02310", X"0203B", X"08300", X"04002",
X"08201", X"00500", X"04001", X"02500", X"00340", X"00241",
X"04002", X"08300", X"08201", X"00500", X"08101", X"00602",
X"04003", X"0241E", X"00301", X"00102", X"02122", X"02021",
X"00301", X"00102", X"02222", X"04001", X"00342", X"0232B",
X"00900", X"00302", X"00102", X"04002", X"00900", X"08201",
X"02023", X"00303", X"02433", X"00301", X"04004", X"00301",
X"00102", X"02137", X"02036", X"00301", X"00102", X"02237",
X"04004", X"00304", X"04040", X"02500", X"02500", X"02500",
X"0030D", X"02341", X"08201", X"0400D");
attribute rom_style : string;
attribute rom_style of ROM : signal is "block";
begin
process(clk)
begin
if rising_edge(clk) then
if (en = '1') then
data <= ROM(conv_integer(addr));
end if;
end if;
end process;
end behavioral;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
146
第 4章
VHDL サポー ト
概要
こ の章では、 Vivado 合成でサポー ト さ れ る VHDL の構文 と 例外を示 し ます。
VHDL では、 複雑な ロ ジ ッ ク を簡潔に記述で き 、 次が可能です。
•
シ ス テ ム をサブシ ス テ ムに分割す る 方法や、 分割 さ れたサブシ ス テ ム を相互接続する 方法な ど、 シ ス テ ムの構造
を記述で き ます。
•
使い慣れたプ ロ グ ラ ミ ン グ言語形式でシ ス テ ムの機能を指定で き ます。
•
イ ンプ リ メ ンテーシ ョ ンおよびハー ド ウ ェ アへのプ ロ グ ラ ム前にシ ス テム デザ イ ン をシ ミ ュ レーシ ョ ンで き ます。
•
抽象的な記述か ら 、 合成 し てデバ イ ス特定の詳細なデザ イ ン バージ ョ ン を生成で き ます。
詳細は、 『IEEE Standard VHDL Language Reference Manual』 (LRM) を参照 し て く だ さ い。
サポー ト さ れる VHDL デー タ 型 と サポー ト さ れない
VHDL デー タ 型
一部の VHDL デー タ 型は、定義済みパ ッ ケージの一部です。それ ら の コ ンパ イ ル場所お よ び読み込み方法は、174 ペー
ジの 「VHDL の定義済みパ ッ ケージ」 を参照 し て く だ さ い。
IEEE std_logic_1164 パ ッ ケージで定義 さ れ る デー タ 型
サポー ト さ れないデー タ 型
VHDL では、標準パ ッ ケージの real 型は、ジ ェ ネ リ ッ ク 値の計算な ど、計算を実行す る 目的でのみサポー ト さ れます。
重要 : real 型の合成可能オブジ ェ ク ト を定義する こ と はで き ません。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
147
第 4 章 : VHDL サポー ト
VHDL デー タ 型
VHDL の定義済み列挙型
Vivado 合成では、 ハー ド ウ ェ ア記述で次の定義済み VHDL 列挙型がサポー ト さ れます。
表 4-1 : VHDL 列挙型のサマ リ
列挙型
定義 さ れているパ ッ ケージ
有効な値
bit
標準パ ッ ケージ
0 (論理 0)
1 (論理 1)
boolean
標準パ ッ ケージ
false
true
std_logic
IEEE std_logic_1164 パ ッ ケージ
「std_logic に使用可能な値」 を参照
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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
148
第 4 章 : VHDL サポー ト
VHDL のユーザー定義の列挙型
ユーザー独自の列挙型を作成で き ます。 ユーザー定義の列挙型は通常、 有限ス テー ト マシ ン (FSM) の ス テー ト を記
述す る のに使用 さ れます。
VHDL ユーザー定義の列挙型の コ ー ド 例
type STATES is (START, IDLE, STATE1, STATE2, STATE3) ;
サポー ト さ れる VHDL のビ ッ ト ベ ク タ ー型
表 4-4 : サポー ト さ れる VHDL のビ ッ ト ベ ク タ ー型
デー タ 型
定義 さ れているパ ッ ケージ
モデル
bit_vector
標準
ビ ッ ト 要素のベ ク タ ー
std_logic_vector
IEEE std_logic_1164
std_logic 要素のベ ク タ ー
サポー ト さ れる VHDL のオーバーロー ド 型
表 4-5 : サポー ト さ れる VHDL のオーバーロー ド 型
デー タ 型
定義 さ れている IEEE パ ッ ケージ
std_ulogic_vector
std_logic_1164
unsigned
std_logic_arith
signed
std_logic_arith
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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
149
第 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’;
注記 : イ ンデ ッ ク ス は、 変数にで き ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
150
第 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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
151
第 4 章 : VHDL サポー ト
演算子
Vivado 合成では、 VHDL の演算子がサポー ト さ れます。
シ フ ト 演算子の例
表 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);
VHDL のエ ン テ ィ テ ィ と アーキテ ク チ ャの記述
VHDL の回路記述
VHDL の回路記述 (デザ イ ン ユニ ッ ト ) は、 次の部分で構成 さ れてい ます。
•
エン テ ィ テ ィ 宣言 : 回路の外部表示を提供 し ます。 I/O ポー ト お よ びジ ェ ネ リ ッ ク な ど の回路の イ ン タ ーフ ェ イ
ス を含む、 外側か ら 見え る オブジ ェ ク ト を記述 し ます。
•
アーキ テ ク チ ャ : 回路の内部表示を提供 し 、 回路の動作ま たは構造を記述 し ます。
VHDL のエ ン テ ィ テ ィ 宣言
回路の I/O ポー ト はエン テ ィ テ ィ で宣言 し ます。 各ポー ト に次を指定 し ます。
•
名前
•
モー ド (in、 out、 inout、 buffer)
•
デー タ 型
制約 さ れたポー ト と 制約 さ れていないポー ト
ポー ト を定義す る 際、 ポー ト は次の よ う にな り ます。
•
制約を設定す る こ と も し ない こ と も で き ます。
•
通常は制約 さ れます。
•
エン テ ィ テ ィ 宣言部分では制約を設定 し ない ま ま にで き ます。
°
ポー ト に制約を設定 し ない場合は、 フ ォーマル ポー ト と 実際の信号を接続す る と き に、 イ ン ス タ ン シエー
シ ョ ンでポー ト の幅を定義 し ます。
°
ポー ト に制約を設定 し ない場合、 同 じ エン テ ィ テ ィ の イ ン ス タ ン シエーシ ョ ン を複数作成 し 、 異な る ポー ト
幅を定義で き ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
152
第 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
begin
process begin
if rising_edge(CLK) then
C <= UNSIGNED(A) + UNSIGNED(B) UNSIGNED(C);
end if;
end process;
end behavioral;
バ ッ フ ァ ー ポー ト モー ド を使用 し ないよ う 変更
推奨 : バ ッ フ ァ ー ポー ト モー ド を使用 し てい る 場合は、 変更 し て使用 し ない よ う に し て く だ さ い。
上記の コ ー ド 例では、 信号 C がバ ッ フ ァ ー モー ド で記述 さ れ、 内部お よ び出力ポー ト の両方 と し て使用 さ れてお り 、
C に接続可能なすべての階層レベルをバ ッ フ ァ ー と し て宣言する 必要があ り ます。
バ ッ フ ァ ー モー ド を使用 し ない よ う に変更する には、 次の手順に従い ます。
1.
ダ ミ ー信号を挿入 し ます。
2.
ポー ト C を出力 と し て宣言 し ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
153
第 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 signal
signal C_INT : STD_LOGIC_VECTOR(3 downto 0);
begin
C <= C_INT;
process begin
if rising_edge(CLK) then
C_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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
154
第 4 章 : VHDL サポー ト
VHDL の コ ンポーネ ン ト イ ン ス タ ン シ エーシ ョ ン
コ ン ポーネ ン ト イ ン ス タ ン シエーシ ョ ン を使用す る と 、 1 つのデザ イ ン ユニ ッ ト ( コ ン ポーネ ン ト ) を別のデザ イ ン
ユニ ッ ト 内に イ ン ス タ ン シエー ト し て、 階層構造デザ イ ン を記述で き ます。
コ ン ポーネ ン ト イ ン ス タ ン シエーシ ョ ン を実行する には、 次の手順に従い ます。
1.
イ ン ス タ ン シエー ト す る 機能を記述 し たデザ イ ン ユニ ッ ト (エン テ ィ テ ィ と アーキ テ ク チ ャ ) を作成 し ます。
2.
親デザ イ ン ユニ ッ ト のアーキ テ ク チ ャ の宣言部分に イ ン ス タ ン シエー ト する コ ン ポーネ ン ト を宣言 し ます。
3.
親デザ イ ン ユニ ッ ト のアーキ テ ク チ ャ の本体で こ の コ ン ポーネ ン ト を イ ン ス タ ン シエー ト し て接続 し ます。
4.
コ ン ポーネ ン ト の フ ォーマル ポー ト を親デザ イ ン ユニ ッ ト の実際の信号お よ びポー ト にマ ッ プ (接続) し ます。
コ ンポーネ ン ト イ ン ス タ ン シ エーシ ョ ン文の要素
Vivado 合成では、 コ ン ポーネ ン ト 宣言で制約 さ れていないベ ク タ ーがサポー ト さ れます。
コ ン ポーネ ン ト イ ン ス タ ン シエーシ ョ ン文の主な要素は、 次の と お り です。
•
ラ ベル : イ ン ス タ ン ス を識別 し ます。
•
関連付け リ ス ト : 予約語の port map キーワー ド で開始 し 、 コ ン ポーネ ン ト の フ ォーマル ポー ト を親デザ イ ン
ユニ ッ ト の実際の信号ま たはポー ト に接続 し ます。オプシ ョ ンの関連付け リ ス ト は予約語の generic map キー
ワー ド で開始 し 、 実際の値を コ ン ポーネ ン ト で定義 さ れ る フ ォーマル ジ ェ ネ リ ッ ク に供給 し ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
155
第 4 章 : VHDL サポー ト
VHDL の コ ンポーネ ン ト イ ン ス タ ン シ エーシ ョ ンの コ ー ド 例
次に、 4 つの nand2 コ ン ポーネ ン ト か ら 構成 さ れ る 半加算器の構造記述例を示 し ます。
--- A simple component instantiation example
-Involves a component declaration and the component instantiation itself
--- instantiation_simple.vhd
-entity sub is
generic(
WIDTH : integer := 4
);
port(
A, B : in BIT_VECTOR(WIDTH - 1 downto 0);
O
: out BIT_VECTOR(2 * WIDTH - 1 downto 0)
);
end sub;
architecture archi of sub is
begin
O <= A & B;
end ARCHI;
entity instantiation_simple is
generic(
WIDTH : integer := 2);
port(
X, Y : in BIT_VECTOR(WIDTH - 1 downto 0);
Z
: out BIT_VECTOR(2 * WIDTH - 1 downto 0));
end instantiation_simple;
architecture ARCHI of instantiation_simple is
component sub
-- component declaration
generic(
WIDTH : integer := 2);
port(
A, B : in BIT_VECTOR(WIDTH - 1 downto 0);
O
: out BIT_VECTOR(2 * WIDTH - 1 downto 0));
end component;
begin
inst_sub : sub
generic map(
WIDTH => WIDTH
)
port map(
A => X,
B => Y,
O => Z
);
-- component instantiation
end ARCHI;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
156
第 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 is
generic(
sh_st : integer := 4
);
port(
CLK : in std_logic;
DI : in std_logic;
DO : out std_logic
);
end entity instantiation_recursive;
architecture recursive of instantiation_recursive is
component instantiation_recursive
generic(
sh_st : integer);
port(
CLK : in std_logic;
DI : in std_logic;
DO : out std_logic);
end component;
signal tmp : std_logic;
begin
GEN_FD_LAST : if sh_st = 1 generate
inst_fd : FD port map(D => DI, C => CLK, Q => DO);
end generate;
GEN_FD_INTERM : if sh_st /= 1 generate
inst_fd : FD port map(D => DI, C => CLK, Q => tmp);
inst_sstage : instantiation_recursive
generic map(sh_st => sh_st - 1)
port map(DI => tmp, CLK => CLK, DO => DO);
end generate;
end recursive;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
157
第 4 章 : VHDL サポー ト
VHDL の コ ンポーネ ン ト コ ン フ ィ ギ ュ レーシ ョ ン
コ ン ポーネ ン ト コ ン フ ィ ギ ュ レーシ ョ ン を使用する と 、 コ ン ポーネ ン ト を適切なモデルに リ ン ク で き ます。
•
モデルはエン テ ィ テ ィ /アーキ テ ク チ ャ のペアです。
•
Vivado 合成では、アーキ テ ク チ ャ の宣言部分で コ ン ポーネ ン ト コ ン フ ィ ギ ュ レーシ ョ ンがサポー ト さ れます。次
に例を示 し ます。
for instantiation_list : component_name use
LibName.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 です。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
158
第 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 is
generic(
width : integer := 8
);
port(
A, B : in std_logic_vector(width - 1 downto 0);
Y
: out std_logic_vector(width - 1 downto 0)
);
end addern;
architecture bhv of addern is
begin
Y <= A + B;
end bhv;
Library IEEE;
use IEEE.std_logic_1164.all;
entity generics_1 is
port(
X, Y, Z : in std_logic_vector(12 downto 0);
A, B
: in std_logic_vector(4 downto 0);
S
: out std_logic_vector(17 downto 0));
end generics_1;
architecture bhv of generics_1 is
component addern
generic(width : integer := 8);
port(
A, B : in std_logic_vector(width - 1 downto 0);
Y
: out std_logic_vector(width - 1 downto 0));
end component;
for all : addern use entity work.addern(bhv);
signal C1
: std_logic_vector(12 downto 0);
signal C2, C3 : std_logic_vector(17 downto 0);
begin
U1 : addern generic map(width => 13) port map(X, Y, C1);
C2 <= C1 & A;
C3 <= Z & B;
U2 : addern generic map(width => 18) port map(C2, C3, S);
end bhv;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
159
第 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 is
generic(
width : integer := 8);
port(
a, b, c, d : in std_logic_vector(width - 1 downto 0);
sel
: in std_logic_vector(1 downto 0);
T
: out std_logic_vector(width - 1 downto 0));
end concurrent_selected_assignment;
architecture bhv of concurrent_selected_assignment is
begin
with sel select T <=
a when "00",
b when "01",
c when "10",
d when others;
end bhv;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
160
第 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 is
port(
A, B : in BIT_VECTOR(0 to 7);
CIN : in BIT;
SUM : out BIT_VECTOR(0 to 7);
COUT : out BIT
);
end for_generate;
architecture archi of for_generate is
signal C : BIT_VECTOR(0 to 8);
begin
C(0) <= CIN;
COUT <= C(8);
LOOP_ADD : for I in 0 to 7 generate
SUM(I)
<= A(I) xor B(I) xor C(I);
C(I + 1) <= (A(I) and B(I)) or (A(I) and C(I)) or (B(I) and C(I));
end generate;
end archi;
if-generate 文
if-generate 文は、 テ ス ト 結果に基づいて HDL ソ ース コ ー ド の特定の部分を ア ク テ ィ ブに し ます。 ス タ テ ィ ッ ク
条件でサポー ト さ れます。
た と えば、 ジ ェ ネ リ ッ ク が ど のデバ イ ス フ ァ ミ リ を タ ーゲ ッ ト にす る か示す場合、 if-generate 文に よ り 特定のデ
バ イ ス フ ァ ミ リ に対 し てジ ェ ネ リ ッ ク の値がテ ス ト さ れ、 HDL ソ ース コ ー ド のそのデバ イ ス フ ァ ミ リ 用に記述 さ れ
たセ ク シ ョ ンがア ク テ ィ ブにな り ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
161
第 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 is
generic(
N : INTEGER := 8
);
port(
A, B : in BIT_VECTOR(N downto 0);
CIN : in BIT;
SUM : out BIT_VECTOR(N downto 0);
COUT : out BIT
);
end if_for_generate;
architecture archi of if_for_generate is
signal C : BIT_VECTOR(N + 1 downto 0);
begin
IF_N : if (N >= 4 and N <= 32) generate
C(0) <= CIN;
COUT <= C(N + 1);
LOOP_ADD : for I in 0 to N generate
SUM(I)
<= A(I) xor B(I) xor C(I);
C(I + 1) <= (A(I) and B(I)) or (A(I) and C(I)) or (B(I) and C(I));
end generate;
end generate;
end archi;
組み合わせプ ロ セス
VHDL の組み合わせ ロ ジ ッ ク は、 プ ロ セ ス で記述で き ます。 プ ロ セ ス は、 プ ロ セ ス が実行 さ れ る たびに信号に新 し い
値を代入 し ます。
重要 : 信号に現在の値は保持 さ れません。 プ ロ セ ス には、 ロ ーカル変数を含め る こ と がで き ます。
メ モ リ エレ メ ン ト
組み合わせプ ロ セ ス か ら 推論 さ れたハー ド ウ ェ アには、 メ モ リ エ レ メ ン ト は含まれません。
プ ロ セ ス で代入 さ れ る すべての信号が、 常にプ ロ セ ス ブ ロ ッ ク 内のすべての可能なパス で明示的に代入 さ れ る 場合、
メ モ リ エ レ メ ン ト プ ロ セ ス は組み合わせプ ロ セ ス と な り ます。
if 文ま たは case 文のすべての分岐で信号が明示的に代入 さ れていない場合は、 通常 ラ ッ チが推論 さ れます。
重要 : Vivado 合成で予測 さ れない ラ ッ チが推論 さ れた場合は、HDL コ ー ド に明示的に代入 さ れていない信号がないか
ど う か を確認 し ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
162
第 4 章 : VHDL サポー ト
センシテ ィ ビテ ィ リ ス ト
組み合わせプ ロ セ ス には、 セ ン シテ ィ ビ テ ィ リ ス ト が含まれます。 セ ン シテ ィ ビ テ ィ リ ス ト は、 PROCESS キーワー
ド の後にか っ こ で囲ま れます。 セ ン シテ ィ ビ テ ィ リ ス ト にあ る 信号のいずれかに イ ベン ト (値の変化) が発生す る と 、
プ ロ セ ス が実行 さ れます。
組み合わせプ ロ セ ス の場合、 セ ン シテ ィ ビ テ ィ リ ス ト には次を含め る 必要があ り ます。
•
if お よ び case な ど の条件で使用する 信号
•
代入文の右辺の信号
不足 し ている信号
セ ン シテ ィ ビ テ ィ リ ス ト に不足 し てい る 信号があ る 場合があ り ます。 セ ン シテ ィ ビ テ ィ リ ス ト に 1 つま たは複数の
不足 し てい る 信号があ る 場合、 次の よ う にな り ます。
•
合成結果が初期のデザ イ ン仕様 と 異な る も のにな る 可能性があ り ます。
•
Vivado 合成で警告 メ ッ セージが表示 さ れます。
•
不足 し てい る 信号がセ ン シテ ィ ビ テ ィ リ ス ト に追加 さ れます。
重要 : シ ミ ュ レーシ ョ ン中の問題を回避す る には、 HDL ソ ース コ ー ド に不足 し てい る 信号を追加 し て合成を再実行
し ます。
変数および信号の代入
Vivado 合成では、 VHDL の変数お よ び信号代入がサポー ト さ れます。 プ ロ セ ス には、 ロ ーカル変数を含め る こ と がで
き ます。 ロ ーカル変数は、 プ ロ セ ス内で宣言 し て使用 さ れ、 通常プ ロ セ ス の外部か ら は見え ません。
プ ロ セス内での信号代入の例
-- Signal assignment in a process
-- signal_in_process.vhd
entity signal_in_process is
port(
A, B : in BIT;
S
: out BIT
);
end signal_in_process;
architecture archi of signal_in_process is
begin
process(A, B)
begin
S <= '0';
if ((A and B) = '1') then
S <= '1';
end if;
end process;
end archi;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
163
第 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 is
port(
A, B
: in std_logic_vector(3 downto 0);
ADD_SUB : in std_logic;
S
: out std_logic_vector(3 downto 0)
);
end variable_in_process;
architecture archi of variable_in_process is
begin
process(A, B, ADD_SUB)
variable AUX : std_logic_vector(3 downto 0);
begin
if ADD_SUB = '1' then
AUX := A + B;
else
AUX := A - B;
end if;
S <= AUX;
end process;
end archi;
if-else 文
if-else 文お よ び if-elsif-else 文では、 真偽条件 (TRUE/FALSE) に よ っ て実行 さ れ る 文が決ま り ます。
•
条件が真 と 判断 さ れた場合は if 文が実行 さ れます。
•
条件が偽、 x、 ま たは z と 判断 さ れた場合は else 文が実行 さ れます。
°
複数の文を含むブ ロ ッ ク を if ま たは else 分岐文内で実行で き ます。
°
begin お よ び end キーワ ー ド が必要です。
°
if-else 文はネ ス ト さ せ る こ と がで き ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
164
第 4 章 : VHDL サポー ト
if-else 文の例
library IEEE;
use IEEE.std_logic_1164.all;
entity mux4 is
a, b, c, d :
sel1, sel2 :
outmux : out
end mux4;
port (
in std_logic_vector (7 downto 0);
in std_logic;
std_logic_vector (7 downto 0));
architecture behavior of mux4 is begin
process (a, b, c, d, sel1, sel2)
begin
if (sel1 = '1') then
if (sel2 = '1') then
outmux <= 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 begin
process (a, b, c, d, sel)
begin
case sel is
when "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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
165
第 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 is
port(
a
: in std_logic_vector(7 downto 0);
Count : out std_logic_vector(2 downto 0)
);
end for_loop;
architecture behavior of for_loop is
begin
process(a)
variable Count_Aux : std_logic_vector(2 downto 0);
begin
Count_Aux := "000";
for i in a'range loop
if (a(i) = '0') then
Count_Aux := Count_Aux + 1;
end if;
end loop;
Count <= Count_Aux;
end process;
end behavior;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
166
第 4 章 : VHDL サポー ト
VHDL の順序ロ ジ ッ ク
プ ロ セ ス内のすべてのパ ス で明示的に代入 さ れていない信号があ る 場合、VHDL プ ロ セ スは組み合わせプ ロ セ ス では
な く 、 順次プ ロ セ ス にな り ます。 生成 さ れたハー ド ウ ェ アには、 内部ス テー ト ま たは メ モ リ (フ リ ッ プ フ ロ ッ プ ま た
は ラ ッ チ) が含まれます。
推奨 : 順次 ロ ジ ッ ク は、 セ ン シテ ィ ビ テ ィ リ ス ト ベース で記述する こ と をお勧め し ます。
プ ロ セ ス を使用 し たセ ン シテ ィ ビ テ ィ リ ス ト 付き 順次プ ロ セ ス には、 次を記述 し ます。
•
ク ロ ッ ク 信号
•
順次エ レ メ ン ト を非同期に制御す る オプシ ョ ンの信号 (非同期セ ッ ト / リ セ ッ ト )
•
ク ロ ッ ク イ ベン ト を記述 し た if 文
セ ン シ テ ィ ビ テ ィ リ ス ト 付き順次プ ロ セス文の構文
process (<sensitivity list>)
begin
<asynchronous part>
<clock event>
<synchronous part>
end;
非同期制御ロ ジ ッ クの記述
非同期制御 ロ ジ ッ ク (非同期セ ッ ト / リ セ ッ ト ) は、 ク ロ ッ ク イ ベン ト 文 よ り も 前に記述 し ます。
同期制御 ロ ジ ッ ク (デー タ 、 オプシ ョ ンの同期セ ッ ト / リ セ ッ ト 、 オプシ ョ ンの ク ロ ッ ク イ ネーブル) は、 ク ロ ッ ク イ
ベン ト の if 分岐内で記述 し ます。
表 4-7 : 非同期制御ロ ジ ッ ク 記述のサマ リ
記述する ロ ジ ッ ク
内容
記述する位置
非同期制御 ロ ジ ッ ク
非同期セ ッ ト / リ セ ッ ト
ク ロ ッ ク イ ベン ト 文の前
同期 ロ ジ ッ ク
デー タ
同期セ ッ ト / リ セ ッ ト (オプシ ョ ン)
ク ロ ッ ク イ ネーブル (オプシ ョ ン)
ク ロ ッ ク イ ベン ト の if 分岐内
ク ロ ッ ク イ ベン ト 文
ク ロ ッ ク イ ベン ト 文は、 次の よ う に記述 し ます。
•
立ち上が り エ ッ ジ ク ロ ッ ク :
if rising_edge(clk) then
•
立ち下が り エ ッ ジ ク ロ ッ ク :
If falling_edge(clk) then
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
167
第 4 章 : VHDL サポー ト
不足 し ている信号
セ ン シテ ィ ビ テ ィ リ ス ト に不足 し てい る 信号があ る 場合、合成結果が初期のデザ イ ン仕様 と 異な る も のにな る 可能性
があ り ます。 こ の場合、 Vivado 合成で警告 メ ッ セージが表示 さ れ、 セ ン シ テ ィ ビ テ ィ リ ス ト に不足 し てい る 信号が
追加 さ れます。
重要 : シ ミ ュ レーシ ョ ン中の問題を回避す る には、 HDL ソ ース コ ー ド に不足 し てい る 信号を追加 し て合成を再実行
し ます。
VHDL のセ ン シ テ ィ ビ テ ィ リ ス ト のない順次プ ロ セス文
Vivado 合成では、 wait 文を使用 し た順次プ ロ セ ス の記述がサポー ト さ れます。 順次プ ロ セ ス はセ ン シテ ィ ビ テ ィ リ
ス ト な し で記述 し ます。
wait 文を最初の文に し 、 wait 文の条件で順序 ロ ジ ッ ク ク ロ ッ ク を記述 し ます。
重要 : 同 じ 順次プ ロ セ ス にセ ン シテ ィ ビ テ ィ リ ス ト と wait 文の両方を含め る こ と はで き ません。 ま た、 使用可能な
wait 文は 1 つのみです。
wait 文を使用 し た順次プ ロ セスの例
process begin
wait until rising_edge(clk);
q <= d;
end process;
wait 文で ク ロ ッ ク イ ネーブルを記述 し た コ ー ド 例
wait 文で、 ク ロ ッ ク と 共に ク ロ ッ ク イ ネーブル (clken) を記述で き ます。
process begin
wait until rising_edge(clk) and clken = '1';
q <= d;
end process;
wait 文の後に ク ロ ッ ク イ ネーブルを記述 し た例
ク ロ ッ ク イ ネーブルは、 次の よ う に別に記述する こ と も で き ます。
process begin
wait until rising_edge(clk);
if clken = '1' then
q <= d;
end if;
end process;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
168
第 4 章 : VHDL サポー ト
同期制御ロ ジ ッ ク の記述
ク ロ ッ ク イ ネーブルを記述す る 同 じ コ ー ド 記述方法を使用 し て、同期 リ セ ッ ト ま たはセ ッ ト な ど の同期制御 ロ ジ ッ ク
を記述で き ます。
重要 : セ ン シ テ ィ ビ テ ィ リ ス ト のないプ ロ セ ス を使用 し て非同期制御 ロ ジ ッ ク を持つ順次エ レ メ ン ト を記述す る こ
と はで き ません。 こ の よ う な機能を記述で き る のは、 セ ン シテ ィ ビ テ ィ リ ス ト 付き のプ ロ セ ス文のみです。 Vivado 合
成では、 wait 文に基づ く ラ ッ チの記述は使用で き ません。 同期 ロ ジ ッ ク は、 セ ン シテ ィ ビ テ ィ リ ス ト 付 き プ ロ セ ス
を使用 し た方が柔軟に記述で き ます。
VHDL の初期値 と セ ッ ト / リ セ ッ ト
レ ジ ス タ は、 宣言す る と き に初期化で き ます。 初期値は定数値で、 関数呼び出 し か ら 生成で き ます (外部デー タ フ ァ
イ ルか ら 初期値の読み込みな ど)。 初期値は次の よ う にな り ます。
•
以前の初期値に依存 さ せ る こ と はで き ません。
•
レ ジ ス タ に伝搬す る パ ラ メ ー タ ー値にで き ます。
レ ジ ス タ を初期化する例 1
次の コ ー ド 例は、 回路に電源が投入 さ れた と き 、 お よ びグ ロ ーバル リ セ ッ ト が適用 さ れた と き の順次エ レ メ ン ト の初
期値を指定 し てい ます。
signal arb_onebit
:std_logic := '0';
signal arb_priority : std_logic_vector(3 downto 0) := "1011";
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
169
第 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 is
Port(
clk, rst : in std_logic;
din
: in std_logic;
dout
: out std_logic
);
end initial_1;
architecture behavioral of initial_1 is
signal arb_onebit : std_logic := '1'; -- power-up to vcc
begin
process(clk)
begin
if (rising_edge(clk)) then
if rst = '1' then
-- local synchronous reset
arb_onebit <= '0';
else
arb_onebit <= din;
end if;
end if;
end process;
dout <= arb_onebit;
end behavioral;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
170
第 4 章 : VHDL サポー ト
VHDL の関数 と プ ロ シージ ャ
デザ イ ンでブ ロ ッ ク を複数回使用す る 場合は、 VHDL の関数お よ びプ ロ シージ ャ を使用 し ます。 内容は組み合わせプ
ロ セ ス と 類似 し てい ます。
関数お よ びプ ロ シージ ャ は、 次で宣言 し ます。
•
エン テ ィ テ ィ の宣言部
•
アーキ テ ク チ ャ
•
パ ッ ケージ
関数ま たはプ ロ シージ ャ は、 宣言部 と 本体で構成 さ れます。
宣言部では、 次を指定 し ます。
•
input パ ラ メ ー タ ー (範囲を制約す る 必要な し )
•
出力お よ び入出力パ ラ メ ー タ ー (プ ロ シージ ャ のみ)
重要 : 解決関数は、 IEEE std_logic_1164 パ ッ ケージで定義 さ れ る も の以外はサポー ト さ れません。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
171
第 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 is
function ADD(A, B, CIN : BIT) return BIT_VECTOR;
end PKG;
package body PKG is
function ADD(A, B, CIN : BIT) return BIT_VECTOR is
variable S, COUT : BIT;
variable RESULT : BIT_VECTOR(1 downto 0);
begin
S
:= A xor B xor CIN;
COUT
:= (A and B) or (A and CIN) or (B and CIN);
RESULT := COUT & S;
return RESULT;
end ADD;
end PKG;
use work.PKG.all;
entity function_package_1 is
port(
A, B : in BIT_VECTOR(3 downto 0);
CIN : in BIT;
S
: out BIT_VECTOR(3 downto 0);
COUT : out BIT
);
end function_package_1;
architecture ARCHI of function_package_1 is
signal S0, S1, S2, S3 : BIT_VECTOR(1 downto 0);
begin
S0
<= ADD(A(0), B(0), CIN);
S1
<= ADD(A(1), B(1), S0(1));
S2
<= ADD(A(2), B(2), S1(1));
S3
<= ADD(A(3), B(3), S2(1));
S
<= S3(0) & S2(0) & S1(0) & S0(0);
COUT <= S3(1);
end ARCHI;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
172
第 4 章 : VHDL サポー ト
パ ッ ケージ内で宣言 さ れた プ ロ シージ ャの例
次の例では、 パ ッ ケージ内でプ ロ シージ ャ を使用 し てい ます。
-- Declaration of a procedure in a package
--- Download: procedure_package_1.vhd
-package PKG is
procedure ADD(
A, B, CIN : in BIT;
C
: out BIT_VECTOR(1 downto 0));
end PKG;
package body PKG is
procedure ADD(
A, B, CIN : in BIT;
C
: out BIT_VECTOR(1 downto 0)) is
variable S, COUT : BIT;
begin
S
:= A xor B xor CIN;
COUT := (A and B) or (A and CIN) or (B and CIN);
C
:= COUT & S;
end ADD;
end PKG;
use work.PKG.all;
entity procedure_package_1 is
port(
A, B : in BIT_VECTOR(3 downto 0);
CIN : in BIT;
S
: out BIT_VECTOR(3 downto 0);
COUT : out BIT
);
end procedure_package_1;
architecture ARCHI of procedure_package_1 is
begin
process(A, B, CIN)
variable S0, S1, S2, S3 : BIT_VECTOR(1 downto 0);
begin
ADD(A(0), B(0), CIN, S0);
ADD(A(1), B(1), S0(1), S1);
ADD(A(2), B(2), S1(1), S2);
ADD(A(3), B(3), S2(1), S3);
S
<= S3(0) & S2(0) & S1(0) & S0(0);
COUT <= S3(1);
end process;
end ARCHI;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
173
第 4 章 : VHDL サポー ト
再帰関数の例
Vivado 合成では、 再帰関数がサポー ト さ れます。 次の コ ー ド 例では、 n! 関数を使用 し てい ます。
function my_func(x : integer) return integer is begin
if 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 に基づ く 符号な し お よ び符号付き のベ ク タ ー型
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
174
第 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
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π
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
1/√2
√π
175
第 4 章 : VHDL サポー ト
VHDL の実数関数
次の表に、 VHDL の実数関数を示 し ます。
表 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)
独自の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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
176
第 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 オブ ジ ェ ク ト
定数宣言
サポー ト あ り (デ ィ フ ァ ー ド 定数を除 く )
信号宣言
サポー ト あ り (レ ジ ス タ ま たはバス タ イ プの信号を除 く )
属性宣言
一部の属性のみサポー ト 、 その他は ス キ ッ プ
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
177
第 4 章 : VHDL サポー ト
表 4-10 : VHDL 構文のサポー ト ス テー タ ス (続き)
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 のオペ ラ ン ド
抽象 リ テ ラ ル
整数 リ テ ラ ルのみサポー ト
物理 リ テ ラ ル
無視
列挙 リ テ ラ ル
サポー ト あ り
文字列 リ テ ラ ル
サポー ト あ り
ビ ッ ト 文字列 リ テ ラ ル
サポー ト あ り
レ コ ー ド 集合
サポー ト あ り
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
178
第 4 章 : VHDL サポー ト
表 4-10 : VHDL 構文のサポー ト ス テー タ ス (続き)
VHDL 構文
サポー ト ス テー タ ス
配列集合
サポー ト あ り
関数呼び出 し
サポー ト あ り
条件付 き 論理式
定義済み属性でサポー ト
型変換
サポー ト あ り
ア ロ ケー タ ー
サポー ト な し
ス タ テ ィ ッ ク 論理式
サポー ト あ り
wait 文
boolean_expression ま で sensitivity_list で セ ン シ テ ィ ビ テ ィ リ ス ト お よ びブール式内の 1 つの信
待機
号でサポー ト
詳細は、「VHDL の組み合わせ回路」 を参照 し て く だ さ い。 • 複数の wait 文はサポー ト な し
• ラ ッ チの記述の wait 文はサポー ト な し
time_expression 待機
サポー ト な し
詳細は、「VHDL の組み合わせ回路」 を参照 し て く だ さ い。
アサー ト 文
ス タ テ ィ ッ ク 条件のみサポー ト
信号代入文
サポー ト あ り
遅延は無視
変数代入文
サポー ト あ り
プ ロ シージ ャ 呼び出 し 文
サポー ト あ り
if 文
サポー ト あ り
case 文
サポー ト あ り
ループ文
next 文
サポー ト あ り
exit 文
サポー ト あ り
return 文
サポー ト あ り
null 文
サポー ト あ り
同時処理文
プ ロ セ ス文
サポー ト あ り
同時処理プ ロ シージ ャ 呼び出 し
サポー ト あ り
同時処理アサー ト 文
無視
同時処理信号代入文
サポー ト あ り
• after 節のサポー ト はな し
• transport ま たは guarded オプシ ョ ンのサポー ト はな し
• 波形のサポー ト はな し
• UNAFFECTED をサポー ト
コ ン ポーネ ン ト イ ン ス タ ン シエーシ ョ ン文
サポー ト あ り
for-generate
定数範囲のみサポー ト
if-generate
ス タ テ ィ ッ ク 条件のみサポー ト
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
179
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
180
第 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 に設定で き ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
181
第 5 章 : VHDL-2008 言語サポー ト
プ ロ ジ ェ ク ト ベース フ ロー
[Project Settings] ダ イ ア ロ グ ボ ッ ク ス の [General] ページで [Target language] を [VHDL] に設定 し 、 [Use VHDL 2008] を
オンに し ます。
X-Ref Target - Figure 5-1
図 5-1 : [Project Settings] ダ イ ア ログ ボ ッ ク ス : [General] ページ
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
182
第 5 章 : VHDL-2008 言語サポー ト
[Use VHDL 2008] オプシ ョ ン をオンにする と 、 次の図に示す よ う に、 フ ァ イ ルを選択 し て [Source File Properties] ウ ィ
ン ド ウ で [Type] に [VHDL 2008] を選択す る こ と に よ り 、 フ ァ イ ルを個別に VHDL-2008 に設定で き ます。
X-Ref Target - Figure 5-2
図 5-2 : [Source File Properties] ウ ィ ン ド ウ
ま たは、 [Tcl Console] ウ ィ ン ド ウ に次の コ マ ン ド を入力 し て も フ ァ イ ルを VHDL-2008 に設定で き ます。
•
Tcl コ マ ン ド :
set_property FILE_TYPE {VHDL 2008} [get_files <file>.vhd]
注記 : VHDL-2008 の一部の ラ イ ブ ラ リ (std_logic_1164、 std_logic_signed な ど) がア ッ プデー ト さ れてい ま す。 Vivado
IDE で [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}
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
183
第 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 でサポー ト さ れ る 比較演算子を示 し ます。
表 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 以上
最大値および最小値演算子
VHDL-2008 の新 し い最大値演算子 と 最小値演算子は、 2 つの入力値の う ち、 それぞれ大 き い方の値ま たは小 さ い方の
値を返 し ます。 次に例を示 し ます。
out1 <= maximum(const1, const2);
シ フ ト 演算子 (rol、 ror、 sll、 srl、 sla、 および sra)
sla お よ び sra 演算子は、 以前はビ ッ ト 要素お よ びブール要素のみを定義 し てい ま し た。 VHDL-2008 標準では、 こ
れ ら は符号付 き お よ び符号な し ラ イ ブ ラ リ で定義 さ れてい ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
184
第 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)
out1(2)
out1(1)
out1(0)
<=
<=
<=
<=
in1(3)
in1(2)
in1(1)
in1(0)
and
and
and
and
in2;
in2;
in2;
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
---statements
else if condition2 generate
---statements
else generate
---statements
end generate;
ま た、 VHDL-2008 では case-generate 文 も サポー ト さ れます。
case expressions generate
when condition ->
statements
when condition2 ->
statements
end generate;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
185
第 5 章 : VHDL-2008 言語サポー ト
順次代入文
VHDL-2008 では、 条件信号に順次信号お よ び変数代入を使用で き ます。 た と えば、 イ ネーブル付 き の レ ジ ス タ は次
の よ う に記述 さ れてい ま し た。
process(clk) begin
if clk’event and clk=’1’ then
if enable then
my_reg <= my_input;
end if;
end if
end process;
VHDL-2008 では、 こ れを次の よ う に記述で き ます。
process(clk) begin
if clk’event and clk=’1’ then
my_reg <= my_input when enable else my_reg;
end if;
end process;
case? 文
VHDL-2008 では、 case 文で明示的な ド ン ト ケ ア代入を処理する 方法があ り ます。 case? 文を使用する と 、 明示的な
ド ン ト ケ アは次の例の よ う に評価 さ れます。
process(clk) begin
if clk’event and clk=’1’ then
case? my_reg is
when "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) begin
if clk’event and clk=’1’ then
with my_reg select?
out1 <= in1 when "11--",
in2 when "000-",
in3 when "1111-",
in4 when others;
end if;
end process;
注記 : こ の文を機能 さ せ る ためには、 信号に明示的に ド ン ト ケ ア を代入す る 必要があ り ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
186
第 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_vector
VHDL-2008 では、 新 し い定義済みの配列型がサポー ト さ れます。 Vivado では、 boolean_vector お よ び
integer_vector がサポー ト さ れます。 こ れ ら のデー タ 型は、 次の よ う に定義 さ れます。
type boolean_vector is array (natural range <>) of boolean
type integer_vector is array (natural range <>) of integer
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
187
第 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) begin
if clk’event an clk=’1’ then
out1 <= 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 では こ れを イ ン ス
タ ン シエーシ ョ ンのポー ト マ ッ プで達成で き ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
188
第 5 章 : VHDL-2008 言語サポー ト
process (all)
VHDL では、 process 文のセ ン シテ ィ ビ テ ィ リ ス ト に要素を リ ス ト す る 際、 process 文で読み込まれ る すべての要
素を リ ス ト す る こ と は設計者の責任で し た。 不足 し てい る も のが あ る と 、 警告 メ ッ セージが表示 さ れ、 デザ イ ン に
ラ ッ チが推論 さ れ る 可能性があ り ま し た。
VHDL-2008 では、 process(all) 文を使用 し てプ ロ セ スへのすべての入力が検索 さ れ る よ う に し 、 ロ ジ ッ ク を作成
で き ます。
process(all) begin
enable <= 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 is
begin
return (a&b);
end function;
連結は ス タ テ ィ ッ ク ではないので、 こ れは VHDL ではエ ラ ーま たは警告 と な り ます、 VHDL-2008 では許容 さ れます。
グ ローバルおよびロー カルで ス タ テ ィ ッ ク な論理式への拡張
VHDL では、 多 く の タ イ プの場所で論理式が ス タ テ ィ ッ ク であ る 必要があ り ます。 た と えば、 連結を使用す る と ス タ
テ ィ ッ ク 値は返 さ れず、 ス タ テ ィ ッ ク 値が必要な演算子ま たは関数で使用す る と エ ラ ー と な り ます。 VHDL-2008 で
は、 連結な ど の よ り 多 く の論理式で ス タ テ ィ ッ ク 値を返す こ と が可能 と な っ てお り 、 柔軟性が高 く な っ てい ます。
ス タ テ ィ ッ ク範囲および範囲内での整数式
VHDL では、 あ る オブジ ェ ク ト の範囲を使用 し て別のオブジ ェ ク ト の範囲を宣言する こ と が可能で し た。 次に例を示
し ます。
for I in my_signal’range…
こ の場合、 my_signal’range が固定 さ れてい る 必要があ り 、 my_signal が制約な し のデー タ 型 と し て宣言 さ れて
い る と エ ラ ーにな り ます。 VHDL-2008 では、 エ ラ ボ レーシ ョ ン時に範囲を取得す る ので こ れが許容 さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
189
第 5 章 : VHDL-2008 言語サポー ト
ブロ ッ ク コ メ ン ト
VHDL では、 コ メ ン ト の各行に 「--」 が必要で し た。 VHDL-2008 では、 /* と */ 行を使用 し た コ メ ン ト のブ ロ ッ ク が
サポー ト さ れます。
process(clk) begin
if clk’event and clk=’1’ then
/* this
is
a block
comment */
out1 <= in1;
end if;
end process;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
190
第 6章
Verilog サポー ト
概要
こ の章では、 Vivado® 合成での Verilog ハー ド ウ ェ ア記述言語のサポー ト について説明 し ます。
Verilog デザイ ン
複雑な回路は通常、 ト ッ プダ ウ ン手法を使用 し て設計 さ れます。
•
設計プ ロ セ ス の各段階で、 さ ま ざ ま な仕様レベルが必要 と な り ます。 た と えば、 アーキ テ ク チ ャ レベルでは、 仕
様はブ ロ ッ ク 図ま たは ASM (Algorithmic State Machine) チ ャ ー ト に対応 し ます。
•
ブ ロ ッ ク ま たは ASM 段階は、 次の よ う な N ビ ッ ト ワ イ ヤで接続 さ れ る レ ジ ス タ ト ラ ン ス フ ァ ー ブ ロ ッ ク に対
応 し ます。
•
°
レジス タ
°
加算器
°
カ ウ ン ター
°
マルチプ レ ク サー
°
イ ン ターコ ネ ク ト ロ ジ ッ ク
°
有限ス テー ト マシ ン (FSM)
Verilog では、 ASM チ ャ ー ト お よ び回路図な ど を コ ン ピ ュ ー タ ー言語で記述で き ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
191
第 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 形式の タ ス ク /関数宣言
•
カ ン マで区切っ たセ ン シテ ィ ビ テ ィ リ ス ト
•
組み合わせ ロ ジ ッ ク セ ン シテ ィ ビ テ ィ
•
継続代入文のデフ ォ ル ト ネ ッ ト
•
デフ ォ ル ト ネ ッ ト 宣言のデ ィ ス エーブル
•
イ ンデ ッ ク ス付 き ベ ク タ ー部分選択
•
多次元配列
•
ネ ッ ト お よ び実数デー タ 型の配列
•
配列ビ ッ ト 選択お よ び部分選択
•
符号付 き レ ジ ス タ 、 ネ ッ ト 、 お よ びポー ト 宣言
•
符号付 き 整数
•
符号付 き 論理式
•
算術シ フ ト 演算子
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
192
第 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 つの明示的な値で範囲を指定する のではな く 、 範囲の開始点 と ベ ク タ ーの幅を指定 し て定
義 し ます。 部分選択の開始点は さ ま ざ ま です。 部分選択の幅は定数の ま ま です。
表 6-1 : 変数によ る部分選択
シ ンボル
説明
+ (プ ラ ス)
部分選択は開始点か ら 増分
- (マ イ ナ ス)
部分選択は開始点か ら 減分
変数に よ る部分選択の Verilog コ ー ド 例
reg [3:0] data;
reg [3:0] select; // a value from 0 to 7
wire [7:0] byte = data[select +: 8];
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
193
第 6 章 : Verilog サポー ト
構造 Verilog
構造 Verilog 記述を使用す る と 、 複数の コ ー ド ブ ロ ッ ク を統合 し 、 デザ イ ン を階層構造にする こ と がで き ます。
表 6-2 : ハー ド ウ ェ ア構造の基本概念
概念
説明
コ ン ポーネ ン ト
構築ま たは基本ブ ロ ッ ク
ポー ト
コ ン ポーネ ン ト の I/O コ ネ ク タ
信号
コ ン ポーネ ン ト 間の ワ イ ヤに対応
表 6-3 : Verilog のコ ンポーネ ン ト
項目
表示
内容
宣言
外部
コ ン ポーネ ン ト ポー ト を含む外観
本体
内部
コ ン ポーネ ン ト のビヘ イ ビ アーま たは構造
•
コ ン ポーネ ン ト はデザ イ ン モジ ュ ールで表 さ れます。
•
コ ン ポーネ ン ト 間の接続は、 コ ン ポーネ ン ト イ ン ス タ ン シエーシ ョ ン文で指定 さ れます。
•
コ ン ポーネ ン ト イ ン ス タ ン シエーシ ョ ン文には、 次の特徴があ り ます。
°
コ ン ポーネ ン ト を別の コ ン ポーネ ン ト ま たは回路で使用す る 場合に、 コ ン ポーネ ン ト の イ ン ス タ ン ス を指定
し ます。
°
識別子で区別 さ れます。
°
ロ ーカル コ ン ポーネ ン ト 宣言部分で宣言 さ れた コ ン ポーネ ン ト の名前が指定 さ れます。
°
関連付け リ ス ト (か っ こ で囲まれた リ ス ト ) が含まれます。 こ の リ ス ト では、 該当する ロ ーカル ポー ト に関
連付け ら れてい る 信号お よ びポー ト が指定 さ れます。
ビル ト イ ン ロ ジ ッ ク ゲー ト
Verilog では、 多数のビル ト イ ン ロ ジ ッ ク ゲー ト が提供 さ れてい ます。
•
ロ ジ ッ ク ゲー ト を イ ン ス タ ン シエー ト し て、 大型の ロ ジ ッ ク 回路を構築 し ます。
•
ビル ト イ ン ロ ジ ッ ク ゲー ト で記述 さ れ る 論理関数は、 次の と お り です。
°
AND
°
OR
°
XOR
°
NAND
°
NOR
°
NOT
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
194
第 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,
not b_inv (b_not,
and a1 (x, a_not,
and a2 (y, b_not,
or out (c, x, y);
endmodule
a);
b);
b);
a);
半加算器の例
次に、 4 つの 2 入力 NAND モジ ュ ールか ら 構成 さ れ る 半加算器の構造記述例を示 し ます。
module halfadd (X, Y, C, S);
input X, Y;
output C, S;
wire S1, S2, S3;
nand NANDA
nand NANDB
nand NANDC
nand NANDD
assign C =
endmodule
(S3, X, Y);
(S1, X, S3);
(S2, S3, Y);
(S, S1, S2);
S3;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
195
第 6 章 : Verilog サポー ト
定義済みプ リ ミ テ ィ ブのイ ン ス タ ン シ エーシ ョ ン
Verilog の構造記述では、 ゲー ト 、 レ ジ ス タ な ど の定義済みプ リ ミ テ ィ ブや、 CLKDLL お よ び BUFG の よ う なザ イ リ ン
ク ス特有のプ リ ミ テ ィ ブ を イ ン ス タ ン シエー ト し て回路を記述で き ます。
こ れ ら のプ リ ミ テ ィ ブは、 Verilog のプ リ ミ テ ィ ブに追加 さ れ、 XST Verilog ラ イ ブ ラ リ (unisim_comp.v) で提供 さ
れます。
FDC および BUFG プ リ ミ テ ィ ブ を イ ン ス タ ン シ エー ト する例
FDC お よ び B UF G の定義は、 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 referencing
BUFG clk (.O(sysclk_out),.I(sysclk)); //name based referencing
Verilog のパラ メ ー タ ー
Verilog のパ ラ メ ー タ ーには、 次の特徴があ り ます。
•
簡単に再利用お よ び拡張可能なパ ラ メ ー タ ー指定 コ ー ド を作成で き ます。
•
コ ー ド を読みやす く し 、 コ ンパ ク ト で管理 し やすい も のに し ます。
•
こ れ ら の機能は、 次の よ う に記述 し ます。
°
バス サイ ズ
°
デザ イ ン ユニ ッ ト の特定の反復エ レ メ ン ト の量
•
Verilog パ ラ メ ー タ ーは定数です。 パ ラ メ ー タ ー モジ ュ ールの各 イ ン ス タ ン シエーシ ョ ン で、 デフ ォ ル ト のパ ラ
メ ー タ ー値を変更可能です。
•
VHDL のジ ェ ネ リ ッ ク と 同等です。 null 文字列パ ラ メ ー タ ーはサポー ト さ れてい ません。
ジ ェ ネ リ ッ ク コ マ ン ド ラ イ ン オプシ ョ ン を使用する と 、最上位デザ イ ン ブ ロ ッ ク で定義 さ れ る Verilog パ ラ メ ー
タ ーを再定義で き ます。 こ れに よ り 、 ソ ース コ ー ド を変更 し な く て も デザ イ ン を簡単に変更で き ます。 こ れは、
IP コ アの生成お よ びフ ロ ー テ ス ト で便利な機能です。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
196
第 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
input
[SIZE-1:0]
output reg [SIZE-1:0]
clk, clken;
d;
q;
always @(posedge clk)
begin
if (clken)
q <= d;
end
endmodule
module parameter_1 (clk, clken, di, do);
parameter SIZE = 8;
input
input
output
[SIZE-1:0]
[SIZE-1:0]
clk, clken;
di;
do;
myreg #8 inst_reg (clk, clken, di, do);
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
197
第 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
input
output
clk;
si;
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 コ ー ド の イ ン ス タ ン ス と モジ ュ ールの両方にパ ラ メ ー タ ーお よ び属性を適用で き る 。
•
属性を制約フ ァ イ ルで も 指定で き る 。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
198
第 6 章 : Verilog サポー ト
Verilog の使用制限
Vivado 合成で Verilog を使用す る 場合、 次の よ う な制限があ り ます。
•
大文字/小文字の区別
•
ブ ロ ッ キ ン グお よ び ノ ンブ ロ ッ キ ン グ代入文
•
整数の処理
大文字/小文字の区別
Vivado 合成では、 大文字 と 小文字が区別 さ れます。
•
•
Verilog では大文字 と 小文字が区別 さ れ る ので、 モジ ュ ール名、 イ ン ス タ ン ス名、 お よ び信号名は、 大文字 と 小文
字が異なれば別の名前 と し て識別 さ れます。
°
Vivado 合成では、 大文字/小文字だけが異な る イ ン ス タ ン ス名お よ び信号名を含むデザ イ ンは合成可能です。
°
大文字/小文字だけが異な る モジ ュ ール名が含まれ る 場合は、 エ ラ ーが発生 し ます。
オブジ ェ ク ト 名を大文字/小文字の違いだけで区別する こ と はお勧め し ません。 大文字/小文字だけで名前を区別
す る と 、 混合言語プ ロ ジ ェ ク ト で問題が発生 し ます。
ブ ロ ッ キングおよび ノ ン ブ ロ ッ キング代入文
Vivado 合成では、 ブ ロ ッ キ ン グお よ び ノ ンブ ロ ッ キ ン グ代入文がサポー ト さ れます。
•
ブ ロ ッ キ ン グ代入文 と ノ ンブ ロ ッ キ ン グ代入文を混合 し ないで く だ さ い。
•
ブ ロ ッ キ ン グ代入文 と ノ ン ブ ロ ッ キ ン グ代入文を混合 し て も デザ イ ンはエ ラ ーな し で合成 さ れ ま すが、 シ ミ ュ
レーシ ョ ンでエ ラ ーが発生す る こ と があ り ます。
使用不可能な例 1
同 じ 信号にブ ロ ッ キ ン グ代入文 と ノ ンブ ロ ッ キ ン グ代入文を混合 し ないで く だ さ い。
always @(in1)
begin
if (in2)
out1 = in1;
end else
out1 <= in2;
使用不可能な例 2
同 じ 信号の異な る ビ ッ ト にブ ロ ッ キ ン グ代入文 と ノ ンブ ロ ッ キ ン グ代入文を混合 し ないで く だ さ い。
if (in2)
begin
out1[0] = 1'b0;
out1[1] <= in1;
end else begin
out1[0] = in2;
out1[1] <= 1'b1;
end
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
199
第 6 章 : Verilog サポー ト
整数の処理
Vivado 合成では、 整数がほかの合成ツール と 異な る 方法で処理 さ れ る 場合があ り ます。 その場合、 整数を特定の方法
で コ ー ド 記述す る 必要があ り ます。
Verilog case 文での整数処理
case 項目式にサ イ ズが指定 さ れていない整数があ る と 、 結果が予測不可能にな る こ と があ り ます。
Verilog case 文での整数処理の例
次の コ ー ド 例では、 case 項目式 4 のサ イ ズが指定 さ れていないので、 結果が予測不可能にな り ます。 こ の問題を解決
す る には、 こ の case 項目式 4 のサ イ ズ を 3 ビ ッ ト に し ます。
reg [2:0] condition1; always @(condition1) begin
case(condition1)
4 : data_out = 2; // Generates faulty logic
3'd4 : data_out = 2; // Does work
endcase
end
連結文での整数処理
Verilog 連結文にサ イ ズが指定 さ れていない整数があ る と 、 結果が予測不可能にな る こ と があ り ます。 整数のサ イ ズが
指定 さ れない式を使用す る と 、 次の よ う にな り ます。
•
その式が一時的な信号に代入 さ れます。
•
連結文に一時的な信号が使用 さ れます。
reg [31:0] temp;
assign temp = 4'b1111 % 2;
assign dout = {12/3,temp,din};
Verilog-2001 の属性 と メ タ コ メ ン ト
Verilog-2001 属性
•
合成ツールな ど のプ ロ グ ラ ムに特定の情報を渡すために使用 し ます。
•
広 く 使用 さ れてい ます。
•
モジ ュ ール宣言お よ び イ ン ス タ ン シエーシ ョ ン内で、 演算子ま たは信号に指定で き ます。
•
コ ンパ イ ラ でほかの属性宣言がサポー ト さ れていて も 、 Vivado 合成では無視 さ れます。
•
次の よ う に使用 し ます。
°
°
次の よ う な個々のオブジ ェ ク ト に制約を設定 し ます。
-
モジ ュ ール
-
インスタンス
-
ネッ ト
次の合成制約を設定 し ます。
-
フル ケース
-
パ ラ レル ケース
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
200
第 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
•
個々のオブジ ェ ク ト に対す る 制約
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
201
第 6 章 : Verilog サポー ト
Verilog メ タ コ メ ン ト の構文
// synthesis attribute [of] ObjectName [is] AttributeValue
Verilog メ タ コ メ ン ト の構文例
//
//
//
//
synthesis
synthesis
synthesis
synthesis
attribute
attribute
attribute
attribute
RLOC of u123 is R11C1.S0
HUSET u1 MY_SET
fsm_extract of State2 is “yes”
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 (@)
サポー ト な し
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
202
第 6 章 : Verilog サポー ト
表 6-4 : Verilog コ ン ス ト ラ ク ト (続き)
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
サポー ト あ り
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
203
第 6 章 : Verilog サポー ト
Verilog のシ ス テム タ ス ク および関数
Vivado 合成では、 次の表に示すシ ス テ ム タ ス ク ま たは関数がサポー ト さ れます。 サポー ト さ れないシ ス テ ム タ ス ク
は無視 さ れます。
表 6-5 : シ ス テム タ ス ク と そのサポー ト ス テー タ ス
シ ス テム タ ス ク お よび関数
ス テー タ ス
$display
サポー ト あ り
$fclose
サポー ト あ り
$fdisplay
無視
$fgets
サポー ト あ り
$finish
サポー ト あ り
$fopen
サポー ト あ り
$fscanf
サポー ト あ り
$fwrite
無視
$monitor
無視
$random
無視
$readmemb
サポー ト あ り
$readmemh
サポー ト あ り
$signed
サポー ト あ り
$stop
無視
$strobe
無視
$time
無視
$unsigned
サポー ト あ り
$write
サポー ト あ り
その他すべて
無視
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
コメント
エ ス ケ ー プ シ ー ケ ン ス は %d、 %b、 %h、 %o、
%c、 お よ び %s に制限 さ れます。
ア ク テ ィ ブにな る こ と のない条件分岐文でのみ
サポー ト さ れます。
エ ス ケープ シーケ ン ス は %b お よ び %d に制限
さ れます。
エ ス ケ ー プ シ ー ケ ン ス は %d、 %b、 %h、 %o、
%c、 お よ び %s に制限 さ れます。
204
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
205
第 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 ゲー ト レ ベル プ リ ミ テ ィ ブ
プリ ミティブ
ス テー タ ス
プルダ ウ ンお よ びプルア ッ プ
サポー ト な し
駆動電流お よ び遅延
無視
プ リ ミ テ ィ ブの配列
サポー ト な し
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
206
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
207
第 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 フ ァ イ ルに渡 さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
208
第 6 章 : Verilog サポー ト
初期値の例 1
reg arb_onebit = 1'b0;
reg [3:0] arb_priority = 4'b1011;
初期値の例 2
always @(posedge clk)
begin
if (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];
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
209
第 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 register
tri [7:0] bus1; // 8 bit tristate bus
reg [15:0] bus1; // 15 bit register
reg [7:0] mem[0:127]; // 8x128 memory register
parameter state1 = 3'b001; // 3 bit constant
parameter component = “TMS380C16”; // string
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
210
第 6 章 : Verilog サポー ト
使用可能な文
Vivado 合成では、 Verilog ビヘ イ ビ アー記述で有効な文がサポー ト さ れます。
•
有効な文 (変数お よ び信号代入) は次の と お り です。
°
<変数> = <論理式>
°
if (<条件>) 文
°
else 文
°
case (<論理式>) 文
expression: statement
...
default: statement
endcase
°
for (<変数> = <論理式>; <条件>; <変数> = <変数> + <論理式>) 文
°
while (<条件>) 文
°
forever 文
°
function お よ び task
•
すべての変数は、 integer (整数) ま たは reg (レ ジ ス タ ) と し て宣言 さ れます。
•
変数は wire と し て宣言す る こ と はで き ません。
論理式
Verilog ビヘ イ ビ アー記述の論理式には、 次の も のがあ り ます。
•
定数
•
次の演算子を含む変数
°
数値演算子
°
論理演算子
-
ビッ ト
-
論理
°
比較演算子
°
条件演算子
論理演算子
論理演算子がビ ッ ト ま たは論理の ど ち ら のカ テ ゴ リ に属す る かは、 演算子が適用 さ れ る 論理式に 1 ビ ッ ト が含まれ る
か複数のビ ッ ト が含ま れ る かに よ り ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
211
第 6 章 : Verilog サポー ト
サポー ト さ れる演算子
表 6-8 : サポー ト さ れる演算子
数値演算子
論理演算子
比較演算子
条件演算子
+
&
<
?
-
&&
==
*
|
===
**
||
<=
/
^
>=
%
~
>=
~^
!=
^~
!==
<<
>
>>
<<<
>>>
サポー ト さ れる論理式
表 6-9 : サポー ト さ れる論理式
論理式
シ ンボル
ス テー タ ス
連結
{}
サポー ト あ り
複製
{{}}
サポー ト あ り
数値演算
+、 -、 *、 **
サポー ト あ り
除算
/
2 番目のオペ ラ ン ド が 2 のべ き 乗の定数の場合、
ま たは両方のオペ ラ ン ド が定数の場合にサポー ト
剰余
%
2 番目のオペ ラ ン ド が 2 のべ き 乗の定数の場合に
サポー ト
加算
+
サポー ト あ り
減算
-
サポー ト あ り
乗算
*
サポー ト あ り
べき乗
**
サポー ト あ り
• 両方のオペ ラ ン ド が定数で、 2 番目のオペ ラ ン ド が
負でない場合
• 最初のオペ ラ ン ド が 2 の場合、 2 番目のオペ ラ ン ド
は変数にする こ と が可能
• Vivado 合成では実数デー タ 型はサポー ト さ れず、 結
果が実数 と な る オペ ラ ン ド の組み合わせ を 使用す
る と エ ラ ーが発生
• X (不明) お よ びZ (ハ イ イ ン ピーダ ン ス) は使用不可
比較演算
>、 <、 >=、 <=
サポー ト あ り
論理否定
!
サポー ト あ り
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
212
第 6 章 : Verilog サポー ト
表 6-9 : サポー ト さ れる論理式 (続き)
論理式
シ ンボル
ス テー タ ス
論理 AND
&&
サポー ト あ り
論理 OR
||
サポー ト あ り
論理等号
==
サポー ト あ り
論理不等号
!=
サポー ト あ り
ケース等号
===
サポー ト あ り
ケース不等号
!==
サポー ト あ り
ビ ッ ト 単位の否定
~
サポー ト あ り
ビ ッ ト 単位の AND
&
サポー ト あ り
ビ ッ ト 単位の OR
|
サポー ト あ り
ビ ッ ト 単位の排他的 OR
^
サポー ト あ り
ビ ッ ト 単位の等価
~^、 ^~
サポー ト あ り
リ ダ ク シ ョ ン AND
&
サポー ト あ り
リ ダ ク シ ョ ン NAND
~&
サポー ト あ り
リ ダ ク シ ョ ン OR
|
サポー ト あ り
リ ダ ク シ ョ ン NOR
~|
サポー ト あ り
リ ダ ク シ ョ ン XOR
^
サポー ト あ り
リ ダ ク シ ョ ン XNOR
~^、 ^~
サポー ト あ り
左シ フ ト
<<
サポー ト あ り
符号付 き 右シ フ ト
>>>
サポー ト あ り
符号付 き 左シ フ ト
<<<
サポー ト あ り
右シ フ ト
>>
サポー ト あ り
条件演算子
?:
サポー ト あ り
イ ベン ト OR
or、 ','
サポー ト あ り
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
213
第 6 章 : Verilog サポー ト
論理式の評価
次の表の === と !== には、 次の よ う な特徴があ り ます。
•
特殊な比較演算子です。
•
シ ミ ュ レーシ ョ ンで使用 さ れ、 変数に値 x ま たは z が代入 さ れてい る か を確認 し ます。
•
合成では、 こ れ ら の演算子は == お よ び != と し て処理 さ れます。
最 も よ く 使用 さ れる演算子での論理式の評価結果
表 6-10 : 最も よ く 使用 さ れる演算子での論理式の評価結果
ab
00
a==b
a===b
a!=b
a!==b
a&b
a&&b
a|b
a||b
a^b
1
1
0
0
0
0
0
0
0
0
0
1
1
0
0
1
1
1
0
x
1
0
0
x
x
x
x
0
x
1
0
0
x
x
x
10
0
0
1
1
0
0
1
1
1
11
1
1
0
0
1
1
1
1
0
1x
x
0
x
1
x
x
1
1
x
1z
x
0
x
1
x
x
1
1
x
x0
x
0
x
1
0
0
x
x
x
x1
x
0
x
1
x
x
1
1
x
xx
x
1
x
0
x
x
x
x
x
xz
x
0
x
1
x
x
x
x
x
z0
x
0
x
1
0
0
x
x
x
z1
x
0
x
1
x
x
1
1
x
zx
x
0
x
1
x
x
x
x
x
zz
x
1
x
0
x
x
x
x
x
01
0x
x
0z
ブロ ッ ク
Vivado 合成では、 一部のブ ロ ッ ク 文がサポー ト さ れてい ます。
•
ブ ロ ッ ク 文には、 次の よ う な特徴があ り ます。
°
複数の文を グループ化
°
begin キー ワー ド で開始 し 、 end キーワー ド で終了
°
ブ ロ ッ ク 内では、 記述 さ れた順に文が実行 さ れ る
•
Vivado 合成では、 順次ブ ロ ッ ク のみがサポー ト さ れます。
•
Vivado 合成では、 パ ラ レル ブ ロ ッ ク はサポー ト さ れません。
•
ブ ロ ッ ク 内の手続 き 文は、 すべてモジ ュ ール内で定義 し ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
214
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
215
第 6 章 : Verilog サポー ト
モ ジ ュ ール イ ン ス タ ン シ エーシ ョ ン
Verilog ビヘ イ ビ アー記述のモジ ュ ール イ ン ス タ ン シエーシ ョ ン文には、 次の特徴があ り ます。
•
イ ン ス タ ン ス名を定義 し ます。
•
ポー ト 関連 リ ス ト が含まれます。 ポー ト 関連 リ ス ト では、 イ ン ス タ ン ス が親モジ ュ ールで ど の よ う に接続 さ れ る
かが指定 さ れます。 ポー ト 関連 リ ス ト の各エ レ メ ン ト は、 モジ ュ ール宣言の フ ォーマル ポー ト と 親モジ ュ ールの
実際のネ ッ ト を関連付け ます。
•
別のモジ ュ ールに イ ン ス タ ン シエー ト さ れます。 次の コ ー ド 例を参照 し て く だ さ い。
Verilog ビヘ イ ビ アー記述のモ ジ ュ ール イ ン ス タ ン シ エーシ ョ ンの例
module top (A, B, C, O); input
wire tmp;
A, B, C; output O;
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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
216
第 6 章 : Verilog サポー ト
手続き代入文
•
•
Verilog ビヘ イ ビ アー記述の手続 き 代入文には、 次の よ う な特徴があ り ます。
°
reg と し て宣言 さ れた変数に値を代入 し ます。
°
always ブ ロ ッ ク 、 タ ス ク 、 関数で最初に使用 さ れます。
°
レ ジ ス タ お よ び有限ス テー ト マシ ン (FSM) コ ン ポーネ ン ト を記述 し ます。
Vivado 合成では、 次がサポー ト さ れます。
°
組み合わせ関数
°
組み合わせお よ び順次 タ ス ク
°
組み合わせお よ び順次 always ブ ロ ッ ク
組み合わせ always ブ ロ ッ ク
組み合わせ ロ ジ ッ ク は、 Verilog の タ イ ミ ン グ制御文を使用する と 効率的に記述で き ます。
•
遅延 タ イ ミ ン グ制御文 [#]
•
イ ベン ト 制御 タ イ ミ ン グ制御文 [@]
遅延 タ イ ミ ング制御文
遅延 タ イ ミ ン グ制御文 [#] には、 次の よ う な特徴があ り ます。
•
シ ミ ュ レーシ ョ ンにのみ関係 し ます。
•
合成では無視 さ れます。
イ ベン ト 制御 タ イ ミ ング制御文
イ ベン ト 制御 タ イ ミ ン グ制御文 [@] を使用 し た組み合わせ ロ ジ ッ ク の記述は、 次の よ う な も のです。
•
組み合わせ always ブ ロ ッ ク には、 always@ の後にか っ こ で囲まれたセ ン シテ ィ ビ テ ィ リ ス ト があ り ます。 .
•
セ ン シテ ィ ビ テ ィ リ ス ト にあ る 信号のいずれかに イ ベン ト (値の変化ま たはエ ッ ジ) が発生す る と 、 always ブ
ロ ッ ク が実行 さ れます。
•
セ ン シテ ィ ビ テ ィ リ ス ト には、 次を含め る こ と がで き ます。
°
if や case な ど の条件で使用する 信号
°
代入文の右辺の信号
•
信号の リ ス ト の代わ り に ( ) のな し で @ を使用する と 、 説明 し た よ う に、 always ブ ロ ッ ク の信号のいずれかに
イ ベン ト が発生 し た場合に、 always ブ ロ ッ ク が実行 さ れます。
•
組み合わせプ ロ セ ス では、 if 文ま たは case 文のすべての分岐で信号が明示的に代入 さ れていない場合、 最後
の値を保持す る ラ ッ チが生成 さ れます。
•
プ ロ セ ス には、 次の文が使用 さ れます。
°
変数代入文お よ び信号代入文
°
if-else 文
°
case 文
°
for-while ループ文
°
関数お よ び タ ス ク 呼び出 し
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
217
第 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)
begin
if (sel[1])
if (sel[0])
outmux = d;
else
else
outmux = c;
if (sel[0])
outmux = b;
end endmodule
else
outmux = a;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
218
第 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)
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
219
第 6 章 : Verilog サポー ト
for および repeat 文
Vivado 合成では、 for お よ び repeat 文がサポー ト さ れてい ます。 always ブ ロ ッ ク では、 繰 り 返 し ま たはビ ッ ト ス
ラ イ ス構造を記述す る のに も for 文ま たは repeat 文を使用で き ます。
for 文
for 文では、 定数の範囲、 お よ び <、 <=、 >、 >= 演算子を使用 し た テ ス ト 条件の停止がサポー ト さ れます。
for 文では、 次のいずれかに適合す る 次ス テ ッ プの計算 も サポー ト さ れます。
•
var = var + step
•
var = var - step
説明 :
°
ver : ループ変数
°
s t e p : 定数値
repeat 文
repeat 文では定数値のみがサポー ト さ れます。
while ループ文
always ブ ロ ッ ク では、 while ループ文を使用 し て繰 り 返 し 処理を実行で き ます。
•
while ループ文には、 次の特徴があ り ます。
°
テ ス ト 式が始めか ら 偽の場合は実行 さ れません。
°
テ ス ト 式が偽にな る ま で、 ほかの文を実行 し ます。
•
有効な Verilog 論理式であれば、 どれで も テ ス ト 式 と し て使用で き ます。
•
ループが恒久的に実行 さ れ る のを防 ぐ には、 -loop_iteration_limit オプシ ョ ン を使用 し ます。
•
while ループ文には、 disable 文を含め る こ と がで き ます。 disable 文は、 ラ ベルが付いてい る ブ ロ ッ ク 内で
次の よ う に使用 し ます。
disable <blockname>
while ループ文の例
parameter P = 4; always @(ID_complete) begin :UNIDENTIFIED
integer i; reg found; unidentified = 0; i = 0;
found = 0;
while (!found && (i < P))
begin
found = !ID_complete[i];
unidentified[i] = !ID_complete[i];
i = i + 1;
end
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
220
第 6 章 : Verilog サポー ト
順次 always ブ ロ ッ ク
Vivado 合成では、 順次 always ブ ロ ッ ク がサポー ト さ れてい ます。
•
•
always ブ ロ ッ ク と 次のエ ッ ジ ト リ ガ イ ベン ト (posedge ま たは negedge) を含むセ ン シテ ィ ビ テ ィ リ ス ト を
使用 し て順序回路を記述 し ます。
°
ク ロ ッ ク イ ベン ト (必須)
°
オプシ ョ ンのセ ッ ト / リ セ ッ ト イ ベン ト (非同期セ ッ ト / リ セ ッ ト 制御 ロ ジ ッ ク の記述)
オプシ ョ ンの非同期信号を記述 し ない場合、 always ブ ロ ッ ク は次の よ う な構文にな り ます。
always @(posedge CLK)
begin
<synchronous_part>
end
•
オプシ ョ ンの非同期信号を記述す る 場合、 always ブ ロ ッ ク は次の よ う な構文にな り ます。
always @(posedge CLK or posedge ACTRL1 or à )
begin
if (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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
221
第 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) がパデ ィ ン グ と し て追加 さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
222
第 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
S1
S2
S3
S
COUT
=
=
=
=
=
=
ADD (A[0], B[0], CIN),
ADD (A[1], B[1], S0[1]),
ADD (A[2], B[2], S1[1]),
ADD (A[3], B[3], S2[1]),
{S3[0], S2[0], S1[0], S0[0]},
S3[1];
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
223
第 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};
end
endtask
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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
224
第 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 call
endfunction
定数関数および定数式
Vivado 合成では、 定数値を算出す る 関数呼び出 し がサポー ト さ れます。
定数は 10 進数の整数であ る と 想定 さ れます。
•
定数は、 2 進、 8 進、 10 進、 16 進で指定で き ます。
•
定数を指定す る には、 適切な構文で適切な接頭辞を使用 し ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
225
第 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
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
226
第 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 文は、 次を実行 し ます。
°
マ ク ロ が定義 さ れてい る か ど う か を判断 し ます。
°
条件付 き コ ンパ イ ルを定義 し ます。
'ifd e f で呼び出 さ れたマ ク ロ が定義 さ れてい る 場合、 その コ ー ド は コ ンパ イ ル さ れます。
°
マ ク ロ が定義 さ れていない場合は、 'else コ マ ン ド に続 く コ ー ド が コ ンパ イ ル さ れます。
°
'else は必須ではあ り ませんが、 条件文の最後に 'endif が必要です。
Verilog マ ク ロ は、 Verilog マ ク ロ コ マ ン ド ラ イ ン オプシ ョ ン を使用 し て定義ま たは再定義 し ます。
°
Verilog マ ク ロ を使用す る と 、 HDL ソ ース コ ー ド を変更せずにデザ イ ン を変更で き ます。
°
Verilog マ ク ロ は、 IP コ アの生成お よ びフ ロ ー テ ス ト に有益です。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
227
第 6 章 : Verilog サポー ト
マ ク ロの例 1
'define myzero 0
assign mysig = 'myzero;
マ ク ロの例 2
'ifdef MYVAR
module if_MYVAR_is_declared;
...
endmodule
'else
module 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.
*/
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
228
第 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 つ以上の イ ン ス タ ン ス を作成で き ます。
generat e - f o r ループ文は通常の Verilog for ループ文 と 同様に使用で き ますが、 次の よ う な制限があ り ます。
•
generate-for ループ文の イ ンデ ッ ク ス には、 genvar 変数を使用す る 必要があ り ます。
•
for ループ制御の代入文では、 genvar 変数を参照す る 必要があ り ます。
•
for ループ文の内容は begin 文 と end 文で囲みます。
•
begin 文には、 固有の名前を付け ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
229
第 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 つの異な る イ ンプ リ メ ン テーシ ョ ン を イ ン ス タ ン シエー ト し
てい ます。
generate
if (IF_WIDTH < 10)
begin : if_name
multiplier_imp1 # (IF_WIDTH) u1 (a, b, sum_if);
end
else
begin : else_name
multiplier_imp2 # (IF_WIDTH) u2 (a, b, sum_if);
end
endgenerate
generate case 文
generate-case 文は、 ど の条件で ど のオブジ ェ ク ト を生成す る か を制御 し ます。
•
generate-case 文の各分岐は、 begin 文 と end 文で囲みます。
•
begin 文には、 固有の名前を付け ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
230
第 6 章 : Verilog サポー ト
Verilog ビヘ イ ビ アー記述の generate-case 文の コ ー ド 例
次の例では、 デー タ ワー ド の幅に基づいて、 加算器の 2 つ以上の異な る イ ンプ リ メ ン テーシ ョ ン を イ ン ス タ ン シエー
ト し てい ます。
generate
case (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_name
adder x3 (a, b, ci, sum_case, c0_case);
endcase endgenerate
end
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
231
第 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 のデー タ 型を説明 し ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
232
第 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 は符号な し の値にな り ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
233
第 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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
234
第 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
•
符号な し の定数値
•
ユーザーが作成 し た符号付 き 値型
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
235
第 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 format
sig2.j = 8’b00001111; //sig2 get the 8bit logic format.
パ ッ ク配列 と ア ンパ ッ ク 配列
Vivado 合成では、 パ ッ ク 配列 と ア ンパ ッ ク 配列の ど ち ら も サポー ト さ れます。
logic [5:0] sig1; //packed array
logic sig2 [5:0]; //unpacked array
幅が決ま っ てい る デー タ 型では、 パ ッ ク さ れ る 次元を宣言す る 必要はあ り ません。
integer sig3;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
//equivalent to logic signed [31:0] sig3
japan.xilinx.com
236
第 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_block
logic temp;
temp = in1 & in2;
out1 = temp;
end : my_block
上記の例では、 ブ ロ ッ ク 名が end の後に も 指定 さ れてい ますが、 こ れは コ ー ド を読みやす く す る ためで、 必須では
あ り ません。
注記 : パ ラ レル ブ ロ ッ ク (fork-join ブ ロ ッ ク ) は Vivado 合成ではサポー ト さ れません。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
237
第 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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
238
第 7 章 : SystemVerilog サポー ト
手続き プ ロ グ ラ ム代入文
if-else 条件文
if-else 条件文の構文は、 次の よ う にな り ます。
if (expression)
command1;
else
command2;
else 文はオプシ ョ ンで、 ク ロ ッ ク 文の有無に よ っ て ラ ッ チ ま たはフ リ ッ プ フ ロ ッ プが想定 さ れます。 次の よ う な複
数の if お よ び else 文 も サポー ト さ れます。
If (expression1)
Command1;
else if (expression2)
command2;
else if (expression3)
command3;
else
command4;
こ の コ ー ド は、 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 と し て処理 さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
239
第 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 ...
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
240
第 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);
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
241
第 7 章 : SystemVerilog サポー ト
ワ イル ド カ ー ド ポー ト を使用 し たモ ジ ュ ールの接続
ワ イ ル ド カー ド を使用 し てモジ ュ ールを接続す る こ と も で き ます。 た と えば、 上記の例は次の よ う にな り ます。
// in the instantiating module
lower my_inst (.*);
上位モジ ュ ールの名前 と タ イ プが正 し ければ、 イ ン ス タ ン ス全体が接続 さ れます。
ま た、 こ れ ら を混合 し て使用で き ます。 次に例を示 し ます。
lower my_inst (.myout(my_sig), .my_in(din), .*);
こ の例では、 myout ポー ト が my_sig 信号に、 my_in ポー ト が din 信号に、 clk お よ び my_in2 が clk お よ び
my_in2 信号に接続 さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
242
第 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 つの下位モジ ュ ールが イ ン ス タ ン シエー ト さ れてい ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
243
第 7 章 : SystemVerilog サポー ト
こ れ ら の共通信号はすべて イ ン タ ーフ ェ イ ス を使用 し て指定で き ます。
interface my_int
logic 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(); //instantiation
bottom1 u0 (int2, clk, d1, d2, s1, equal);
bottom2 u1 (int2, clk);
endmodule
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
244
第 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 コ マ ン ド では、 イ ン ポー ト す る パ ッ ケージか ら のア イ テ ム を指定す る か、 パ ッ ケージ全体を指定す る 必要が
あ り ます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
245
第 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 合成では次はサポー ト さ れてい ません。
°
コ ン フ ィ ギ ュ レーシ ョ ン仕様
°
直接 イ ン ス タ ン シエーシ ョ ン
°
コ ン ポーネ ン ト コ ン フ ィ ギ ュ レーシ ョ ン
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
246
第 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 を使用す る のではな く 、 イ ン
ス タ ン シエーシ ョ ンで実行 さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
247
第 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;
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
248
第 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 の
ポー ト マ ッ プがサポー ト さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
249
第 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 ポー ト 名はすべて小文字であ る と 判断 さ れます。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
250
付録 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)
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
251
付録 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] ま で、 ま たは各ページの
右下にあ る [フ ィ ー ド バ ッ ク 送信] ボ タ ン を ク リ ッ ク す る と 表示 さ れ る フ ォ ーム か ら お知 ら せ く だ さ い。 フ ィ ー ド バ ッ ク は日本語で
入力可能です。 いただ き ま し た ご意見を参考に早急に対応 さ せていただ き ます。 なお、 こ の メ ール ア ド レ スへのお問い合わせは受
け付けてお り ません。 あ ら か じ めご了承 く だ さ い。
合成
UG901 (v2015.3) 2015 年 9 月 30 日
japan.xilinx.com
252