まずは、”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 プロジェクトを見ていこう。
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 プロジェクトを示す。
インプリメントした時のProject Summary を示す。
Power が 6.616W になっていてむちゃくちゃな値になっている。
Implementation -> Open Implemented Design -> Report Power をクリックして消費電力解析を行った。
その結果、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 にした。
これで、もう一度インプリメントしてみると、消費電力解析は正常と思える値になった。
もう一度、Implementation -> Open Implemented Design -> Report Power をクリックして消費電力解析を行った。
問題が無くなった。
最初からこういう結果を出してくれれば問題なかったと思うのだが。。。クロックが無いと -signal_rate のデフォルト値は 0.0 と書いてあるのだが、このデフォルト値が効かなくなって、最大値になるような感じだね?なぜだろうか?バグなのかな?