FC2カウンター FPGAの部屋 Vivado 2015.4による組み合わせ回路の場合の消費電力解析

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Vivado 2015.4による組み合わせ回路の場合の消費電力解析

組み合わせ回路をVivado 2015.4でインプリメントすると消費電力解析でとんでもない値が出てしまう。それを解消する方法を探っていく。

まずは、”Vivado hls勉強会1(基礎編)”で使用しているVivado HLS 2015.4 の掛け算IPの multi_apuint プロジェクトをVivado 2015.4 の multi_ex1 プロジェクトにインポートして実機で確認するのだが、インプリメントした時にPower が 6.6W も消費する計算になって赤くなってしまう。これを解消したいと思った。実際は、スライドスイッチで入力を入れて、掛け算出力をLEDに表示するので、消費電力は多くなるわけがないはずだ。

2016/02/28 追記: 、”Vivado hls勉強会1(基礎編)”を書き換えてしまったので、以前の multi_bd_wrapper.xdc を貼っておきます)

# multi_bd_wrapper.xdc
# 2015/07/02 by marsee
#

##Switches
##IO_L19N_T3_VREF_35 sw0
set_property PACKAGE_PIN G15 [get_ports {In0_1[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {In0_1[0]}]

##IO_L24P_T3_34 sw1
set_property PACKAGE_PIN P15 [get_ports {In0_1[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {In0_1[1]}]

##IO_L4N_T0_34 sw2
set_property PACKAGE_PIN W13 [get_ports {In0[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {In0[0]}]

##IO_L9P_T1_DQS_34 sw3
set_property PACKAGE_PIN T16 [get_ports {In0[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {In0[1]}]

##LEDs
##IO_L23P_T3_35 Dout[0]
set_property PACKAGE_PIN M14 [get_ports {Dout[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {Dout[0]}]

##IO_L23N_T3_35 Dout[1]
set_property PACKAGE_PIN M15 [get_ports {Dout[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {Dout[1]}]

##IO_0_35 Dout[2]
set_property PACKAGE_PIN G14 [get_ports {Dout[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {Dout[2]}]

##IO_L3N_T0_DQS_AD1N_35 Dout[3]
set_property PACKAGE_PIN D18 [get_ports {Dout[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {Dout[3]}]


まずは、multi_apuint (ここでは、multi_apuint2 になっている)のVivado HLS 2015.4 プロジェクトを見ていこう。
Power_Analysis_1_160228.png

multi_apuint.cpp を示す。

// multi_apuint.cpp

#include <ap_int.h>

void multi_apuint(ap_uint<8> multi_in0, ap_uint<8> multi_in1,
        ap_uint<16> *multi_out){
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE ap_none port=multi_out
#pragma HLS INTERFACE ap_none port=multi_in1
#pragma HLS INTERFACE ap_none port=multi_in0
    *multi_out = multi_in0 * multi_in1;
}


HDLへ合成した時の multi_apuint.v を示す。

// ==============================================================
// RTL generated by Vivado(TM) HLS - High-Level Synthesis from C, C++ and SystemC
// Version: 2015.4
// Copyright (C) 2015 Xilinx Inc. All rights reserved.
// 
// ===========================================================

`timescale 1 ns / 1 ps 

(* CORE_GENERATION_INFO="multi_apuint,hls_ip_2015_4,{HLS_INPUT_TYPE=cxx,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=1,HLS_INPUT_PART=xc7z010clg400-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=6.380000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=1,HLS_SYN_FF=0,HLS_SYN_LUT=0}" *)

module multi_apuint (
        multi_in0_V,
        multi_in1_V,
        multi_out_V
);

parameter    ap_true = 1'b1;
parameter    ap_const_logic_1 = 1'b1;
parameter    ap_const_logic_0 = 1'b0;

input  [7:0] multi_in0_V;
input  [7:0] multi_in1_V;
output  [15:0] multi_out_V;

wire   [7:0] r_V_fu_53_p0;
wire   [7:0] r_V_fu_53_p1;
wire   [15:0] r_V_fu_53_p00;
wire   [15:0] r_V_fu_53_p10;


assign multi_out_V = (r_V_fu_53_p0 * r_V_fu_53_p1);

assign r_V_fu_53_p0 = r_V_fu_53_p00;

assign r_V_fu_53_p00 = multi_in1_V;

assign r_V_fu_53_p1 = r_V_fu_53_p10;

assign r_V_fu_53_p10 = multi_in0_V;

endmodule //multi_apuint


これを掛け算IPとして追加した Vivado 2015.4 の multi_ex1 プロジェクトを示す。
Power_Analysis_2_160228.png

インプリメントした時のProject Summary を示す。
Power_Analysis_3_160228.png

Power が 6.616W になっていてむちゃくちゃな値になっている。

Implementation -> Open Implemented Design -> Report Power をクリックして消費電力解析を行った。
Power_Analysis_4_160228.png

その結果、Dout の消費電力が凄いことになっている。また、Signal Rate が大変高くなっている。人間が手で入力するので、限りなく静的だと思うのだが。。。([Signal Rate] (信号レート)参照

参考URL
AR# 62437 2014.3 Vivado 消費電力 - 「set_switching_activity -signal_rate」はグリッチ消費電力解析に影響するか
Vivado Design Suite ユーザー ガイド 消費電力解析および最適化 UG907 (v2015.3) 2015 年 9 月 30 日


それを解消するために制約ファイル(XDC)に制約を追加することにした。
制約は、set_switching_activity で、これについての情報は、”Vivado Design Suite Tcl コマンド リファレンス ガイド UG835 (v2015.4) 2015 年 11 月 18 日”の第3章 : Tcl コマンド リスト (アルファベット順 )、1,320ページの”set_switching_activity”に詳しく書いてある。
検討して以下の制約を追加することにした。

set_switching_activity -signal_rate 1 -static_probability .99 [get_ports]


すべてのポートの signal_rate を 1 に、スタティック確率値を 0.99 にした。
これで、もう一度インプリメントしてみると、消費電力解析は正常と思える値になった。
Power_Analysis_5_160228.png

もう一度、Implementation -> Open Implemented Design -> Report Power をクリックして消費電力解析を行った。
Power_Analysis_6_160228.png

問題が無くなった。
最初からこういう結果を出してくれれば問題なかったと思うのだが。。。クロックが無いと -signal_rate のデフォルト値は 0.0 と書いてあるのだが、このデフォルト値が効かなくなって、最大値になるような感じだね?なぜだろうか?バグなのかな?
  1. 2016年02月28日 07:24 |
  2. Vivado
  3. | トラックバック:0
  4. | コメント:2

コメント

うろ覚えの記憶ですみませんが、昔の消費電力解析(Xpower?)でも非同期回路の入力は結果がとんでもないことになっていました。
また、2本のクロックの解析でもメタステーブルが収束しないとの前提で計算されるため結果がでなかったので、解析時のみクロックをまとめたりする必要がありました。
(あのころも、パラメータで設定できたのかもしれませんが)

今も昔も解析できないのは人間がかかわる部分なんですかね?何をするか予想もつかないw
お願いだから一番安い抵抗膜のタッチパネルに3Dタッチなんか求めないで下さい 〇rz
  1. 2016/03/01(火) 08:53:54 |
  2. URL |
  3. おる #-
  4. [ 編集 ]

承認待ちコメント

このコメントは管理者の承認待ちです
  1. 2016/03/01(火) 09:06:45 |
  2. |
  3. #
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3407-f15de3f1
この記事にトラックバックする(FC2ブログユーザー)