================================================================ == Vivado HLS Report for 'convolution' ================================================================ * Date: Fri May 25 13:57:07 2018 * Version: 2017.4 (Build 2086221 on Fri Dec 15 21:13:33 MST 2017) * Project: edge_detection * Solution: solution1 * Product family: zynq * Target device: xc7z020clg484-1 ================================================================ == Performance Estimates ================================================================ + Timing (ns): * Summary: +--------+-------+----------+------------+ | Clock | Target| Estimated| Uncertainty| +--------+-------+----------+------------+ |ap_clk | 10.00| 8.51| 1.25| +--------+-------+----------+------------+ + Latency (clock cycles): * Summary: +---------+---------+---------+---------+---------+ | Latency | Interval | Pipeline| | min | max | min | max | Type | +---------+---------+---------+---------+---------+ | 3494765| 3494765| 3494765| 3494765| none | +---------+---------+---------+---------+---------+ + Detail: * Instance: N/A * Loop: +---------------------+---------+---------+----------+-----------+-----------+------+----------+ | | Latency | Iteration| Initiation Interval | Trip | | | Loop Name | min | max | Latency | achieved | target | Count| Pipelined| +---------------------+---------+---------+----------+-----------+-----------+------+----------+ |- Loop 1 | 3494764| 3494764| 38404| -| -| 91| no | | + Loop 1.1 | 38402| 38402| 422| -| -| 91| no | | ++ Loop 1.1.1 | 420| 420| 42| -| -| 10| no | | +++ Loop 1.1.1.1 | 40| 40| 4| -| -| 10| no | +---------------------+---------+---------+----------+-----------+-----------+------+----------+ ============================================================ + Verbose Summary: Synthesis Manager ============================================================ InlineROM: 1 ExposeGlobal: 0 ============================================================ + Verbose Summary: CDFG Model ============================================================ IsTopModel: 1 ResetActiveHigh: 1 IsCombinational: 0 IsDatapathOnly: 0 HasWiredReturn: 1 HasMFsm: 0 HasVarLatency: 1 IsPipeline: 0 IsRtlPipelined: 0 IsInstanceOverlapped: 0 IsDontTouch: 0 HasImplIP: 0 IsGatedGlobalClock: 0 ============================================================ + Verbose Summary: Schedule ============================================================ * Number of FSM states : 8 * Pipeline : 0 * Dataflow Pipeline: 0 * FSM state transitions: 1 --> 2 / true 2 --> 3 / (!exitcond3) 3 --> 4 / (!exitcond2) 2 / (exitcond2) 4 --> 5 / (!exitcond1) 3 / (exitcond1) 5 --> 6 / (!exitcond) 4 / (exitcond) 6 --> 7 / true 7 --> 8 / true 8 --> 5 / true * FSM state operations: : 1.77ns ST_1 : Operation 9 [1/1] (0.00ns) ---> "call void (...)* @_ssdm_op_SpecBitsMap([10000 x i32]* %A) nounwind, !map !7" ST_1 : Operation 10 [1/1] (0.00ns) ---> "call void (...)* @_ssdm_op_SpecBitsMap([100 x i32]* %B) nounwind, !map !13" ST_1 : Operation 11 [1/1] (0.00ns) ---> "call void (...)* @_ssdm_op_SpecBitsMap([8281 x i32]* %C) nounwind, !map !19" ST_1 : Operation 12 [1/1] (0.00ns) ---> "call void (...)* @_ssdm_op_SpecTopModule([12 x i8]* @convolution_str) nounwind" ST_1 : Operation 13 [1/1] (1.76ns) ---> "br label %.loopexit1" [edge_detection/edge_detection.cpp:10] : 2.04ns ST_2 : Operation 14 [1/1] (0.00ns) ---> "%i = phi i7 [ 0, %0 ], [ %i_1, %.loopexit1.loopexit ]" ST_2 : Operation 15 [1/1] (0.00ns) ---> "%phi_mul = phi i14 [ 0, %0 ], [ %next_mul, %.loopexit1.loopexit ]" ST_2 : Operation 16 [1/1] (2.03ns) ---> "%next_mul = add i14 %phi_mul, 91" ---> Core 14 'AddSub' ST_2 : Operation 17 [1/1] (1.48ns) ---> "%exitcond3 = icmp eq i7 %i, -37" [edge_detection/edge_detection.cpp:10] ---> Core 25 'Cmp' ST_2 : Operation 18 [1/1] (0.00ns) ---> "%empty = call i32 (...)* @_ssdm_op_SpecLoopTripCount(i64 91, i64 91, i64 91) nounwind" ST_2 : Operation 19 [1/1] (1.87ns) ---> "%i_1 = add i7 %i, 1" [edge_detection/edge_detection.cpp:10] ---> Core 14 'AddSub' ST_2 : Operation 20 [1/1] (0.00ns) ---> "br i1 %exitcond3, label %3, label %.preheader4.preheader" [edge_detection/edge_detection.cpp:10] ST_2 : Operation 21 [1/1] (1.76ns) ---> "br label %.preheader4" [edge_detection/edge_detection.cpp:11] ST_2 : Operation 22 [1/1] (0.00ns) ---> "ret void" [edge_detection/edge_detection.cpp:20] : 5.29ns ST_3 : Operation 23 [1/1] (0.00ns) ---> "%j = phi i7 [ %j_1, %.preheader4.loopexit ], [ 0, %.preheader4.preheader ]" ST_3 : Operation 24 [1/1] (0.00ns) ---> "%j_cast5 = zext i7 %j to i14" [edge_detection/edge_detection.cpp:11] ST_3 : Operation 25 [1/1] (1.48ns) ---> "%exitcond2 = icmp eq i7 %j, -37" [edge_detection/edge_detection.cpp:11] ---> Core 25 'Cmp' ST_3 : Operation 26 [1/1] (0.00ns) ---> "%empty_2 = call i32 (...)* @_ssdm_op_SpecLoopTripCount(i64 91, i64 91, i64 91) nounwind" ST_3 : Operation 27 [1/1] (1.87ns) ---> "%j_1 = add i7 %j, 1" [edge_detection/edge_detection.cpp:11] ---> Core 14 'AddSub' ST_3 : Operation 28 [1/1] (0.00ns) ---> "br i1 %exitcond2, label %.loopexit1.loopexit, label %1" [edge_detection/edge_detection.cpp:11] ST_3 : Operation 29 [1/1] (2.03ns) ---> "%tmp_2 = add i14 %phi_mul, %j_cast5" [edge_detection/edge_detection.cpp:12] ---> Core 14 'AddSub' ST_3 : Operation 30 [1/1] (0.00ns) ---> "%tmp_3 = zext i14 %tmp_2 to i64" [edge_detection/edge_detection.cpp:12] ST_3 : Operation 31 [1/1] (0.00ns) ---> "%C_addr = getelementptr [8281 x i32]* %C, i64 0, i64 %tmp_3" [edge_detection/edge_detection.cpp:12] ST_3 : Operation 32 [1/1] (3.25ns) ---> "store i32 0, i32* %C_addr, align 4" [edge_detection/edge_detection.cpp:12] ---> Core 37 'RAM' ST_3 : Operation 33 [1/1] (1.76ns) ---> "br label %.loopexit" [edge_detection/edge_detection.cpp:13] ST_3 : Operation 34 [1/1] (0.00ns) ---> "br label %.loopexit1" : 6.04ns ST_4 : Operation 35 [1/1] (0.00ns) ---> "%k = phi i4 [ 0, %1 ], [ %k_1, %.loopexit.loopexit ]" ST_4 : Operation 36 [1/1] (0.00ns) ---> "%k_cast4 = zext i4 %k to i7" [edge_detection/edge_detection.cpp:13] ST_4 : Operation 37 [1/1] (1.30ns) ---> "%exitcond1 = icmp eq i4 %k, -6" [edge_detection/edge_detection.cpp:13] ---> Core 25 'Cmp' ST_4 : Operation 38 [1/1] (0.00ns) ---> "%empty_3 = call i32 (...)* @_ssdm_op_SpecLoopTripCount(i64 10, i64 10, i64 10) nounwind" ST_4 : Operation 39 [1/1] (1.73ns) ---> "%k_1 = add i4 %k, 1" [edge_detection/edge_detection.cpp:13] ---> Core 14 'AddSub' ST_4 : Operation 40 [1/1] (0.00ns) ---> "br i1 %exitcond1, label %.preheader4.loopexit, label %.preheader.preheader" [edge_detection/edge_detection.cpp:13] ST_4 : Operation 41 [1/1] (1.87ns) ---> "%tmp_5 = add i7 %k_cast4, %i" [edge_detection/edge_detection.cpp:15] ---> Core 14 'AddSub' ST_4 : Operation 42 [1/1] (0.00ns) ---> "%tmp_5_cast_cast = zext i7 %tmp_5 to i14" [edge_detection/edge_detection.cpp:15] ST_4 : Operation 43 [1/1] (4.17ns) ---> "%tmp_6 = mul i14 %tmp_5_cast_cast, 100" [edge_detection/edge_detection.cpp:15] ---> Core 16 'Mul' ST_4 : Operation 44 [1/1] (0.00ns) ---> "%p_shl = call i7 @_ssdm_op_BitConcatenate.i7.i4.i3(i4 %k, i3 0)" [edge_detection/edge_detection.cpp:15] ST_4 : Operation 45 [1/1] (0.00ns) ---> "%p_shl8 = call i5 @_ssdm_op_BitConcatenate.i5.i4.i1(i4 %k, i1 false)" [edge_detection/edge_detection.cpp:15] ST_4 : Operation 46 [1/1] (1.76ns) ---> "br label %.preheader" [edge_detection/edge_detection.cpp:14] ST_4 : Operation 47 [1/1] (0.00ns) ---> "br label %.preheader4" : 7.10ns ST_5 : Operation 48 [1/1] (0.00ns) ---> "%l = phi i4 [ %l_1, %2 ], [ 0, %.preheader.preheader ]" ST_5 : Operation 49 [1/1] (0.00ns) ---> "%l_cast3 = zext i4 %l to i14" [edge_detection/edge_detection.cpp:14] ST_5 : Operation 50 [1/1] (0.00ns) ---> "%l_cast = zext i4 %l to i5" [edge_detection/edge_detection.cpp:14] ST_5 : Operation 51 [1/1] (1.30ns) ---> "%exitcond = icmp eq i4 %l, -6" [edge_detection/edge_detection.cpp:14] ---> Core 25 'Cmp' ST_5 : Operation 52 [1/1] (0.00ns) ---> "%empty_4 = call i32 (...)* @_ssdm_op_SpecLoopTripCount(i64 10, i64 10, i64 10) nounwind" ST_5 : Operation 53 [1/1] (1.73ns) ---> "%l_1 = add i4 %l, 1" [edge_detection/edge_detection.cpp:14] ---> Core 14 'AddSub' ST_5 : Operation 54 [1/1] (0.00ns) ---> "br i1 %exitcond, label %.loopexit.loopexit, label %2" [edge_detection/edge_detection.cpp:14] ST_5 : Operation 55 [1/1] (0.00ns) (grouped into TernaryAdder) ---> "%tmp1 = add i14 %tmp_6, %l_cast3" [edge_detection/edge_detection.cpp:15] ---> Core 80 'TAddSub' ST_5 : Operation 56 [1/1] (3.84ns) (root node of TernaryAdder) ---> "%tmp_s = add i14 %tmp1, %j_cast5" [edge_detection/edge_detection.cpp:15] ---> Core 80 'TAddSub' ST_5 : Operation 57 [1/1] (0.00ns) ---> "%tmp_1 = zext i14 %tmp_s to i64" [edge_detection/edge_detection.cpp:15] ST_5 : Operation 58 [1/1] (0.00ns) ---> "%A_addr = getelementptr [10000 x i32]* %A, i64 0, i64 %tmp_1" [edge_detection/edge_detection.cpp:15] ST_5 : Operation 59 [2/2] (3.25ns) ---> "%A_load = load i32* %A_addr, align 4" [edge_detection/edge_detection.cpp:15] ---> Core 37 'RAM' ST_5 : Operation 60 [1/1] (1.78ns) ---> "%tmp2 = add i5 %p_shl8, %l_cast" [edge_detection/edge_detection.cpp:15] ---> Core 14 'AddSub' ST_5 : Operation 61 [1/1] (0.00ns) ---> "%tmp2_cast = zext i5 %tmp2 to i7" [edge_detection/edge_detection.cpp:15] ST_5 : Operation 62 [1/1] (1.87ns) ---> "%tmp_4 = add i7 %tmp2_cast, %p_shl" [edge_detection/edge_detection.cpp:15] ---> Core 14 'AddSub' ST_5 : Operation 63 [1/1] (0.00ns) ---> "%tmp_8 = zext i7 %tmp_4 to i64" [edge_detection/edge_detection.cpp:15] ST_5 : Operation 64 [1/1] (0.00ns) ---> "%B_addr = getelementptr [100 x i32]* %B, i64 0, i64 %tmp_8" [edge_detection/edge_detection.cpp:15] ST_5 : Operation 65 [2/2] (3.25ns) ---> "%B_load = load i32* %B_addr, align 4" [edge_detection/edge_detection.cpp:15] ---> Core 37 'RAM' ST_5 : Operation 66 [1/1] (0.00ns) ---> "br label %.loopexit" : 3.25ns ST_6 : Operation 67 [1/2] (3.25ns) ---> "%A_load = load i32* %A_addr, align 4" [edge_detection/edge_detection.cpp:15] ---> Core 37 'RAM' ST_6 : Operation 68 [1/2] (3.25ns) ---> "%B_load = load i32* %B_addr, align 4" [edge_detection/edge_detection.cpp:15] ---> Core 37 'RAM' ST_6 : Operation 69 [2/2] (3.25ns) ---> "%C_load = load i32* %C_addr, align 4" [edge_detection/edge_detection.cpp:15] ---> Core 37 'RAM' : 8.51ns ST_7 : Operation 70 [1/1] (8.51ns) ---> "%tmp_7 = mul nsw i32 %A_load, %B_load" [edge_detection/edge_detection.cpp:15] ---> Core 16 'Mul' ST_7 : Operation 71 [1/2] (3.25ns) ---> "%C_load = load i32* %C_addr, align 4" [edge_detection/edge_detection.cpp:15] ---> Core 37 'RAM' : 5.81ns ST_8 : Operation 72 [1/1] (2.55ns) ---> "%tmp_9 = add nsw i32 %C_load, %tmp_7" [edge_detection/edge_detection.cpp:15] ---> Core 14 'AddSub' ST_8 : Operation 73 [1/1] (3.25ns) ---> "store i32 %tmp_9, i32* %C_addr, align 4" [edge_detection/edge_detection.cpp:15] ---> Core 37 'RAM' ST_8 : Operation 74 [1/1] (0.00ns) ---> "br label %.preheader" [edge_detection/edge_detection.cpp:14] ============================================================ + Verbose Summary: Binding ============================================================ STG Binding: ---------------- STG Properties BEGIN ---------------- - Is combinational: 0 - Is one-state seq: 0 - Is datapath-only: 0 - Is pipelined: 0 - Is top level: 1 Port [ Return ] is wired: 1; IO mode=ap_ctrl_hs:ce=0 Port [ A]: wired=1; compound=1; hidden=0; nouse=0; global=0; static=0; extern=0; dir=0; type=1; pingpong=0; private_global=0; MemPort=[13]; IO mode=ap_memory:ce=0 Port [ B]: wired=1; compound=1; hidden=0; nouse=0; global=0; static=0; extern=0; dir=0; type=1; pingpong=0; private_global=0; MemPort=[13]; IO mode=ap_memory:ce=0 Port [ C]: wired=1; compound=1; hidden=0; nouse=0; global=0; static=0; extern=0; dir=2; type=1; pingpong=0; private_global=0; MemPort=[23]; IO mode=ap_memory:ce=0 ---------------- STG Properties END ------------------ ---------------- Datapath Model BEGIN ---------------- StgValue_9 (specbitsmap ) [ 000000000] StgValue_10 (specbitsmap ) [ 000000000] StgValue_11 (specbitsmap ) [ 000000000] StgValue_12 (spectopmodule ) [ 000000000] StgValue_13 (br ) [ 011111111] i (phi ) [ 001011111] phi_mul (phi ) [ 001111111] next_mul (add ) [ 011111111] exitcond3 (icmp ) [ 001111111] empty (speclooptripcount) [ 000000000] i_1 (add ) [ 011111111] StgValue_20 (br ) [ 000000000] StgValue_21 (br ) [ 001111111] StgValue_22 (ret ) [ 000000000] j (phi ) [ 000100000] j_cast5 (zext ) [ 000011111] exitcond2 (icmp ) [ 001111111] empty_2 (speclooptripcount) [ 000000000] j_1 (add ) [ 001111111] StgValue_28 (br ) [ 000000000] tmp_2 (add ) [ 000000000] tmp_3 (zext ) [ 000000000] C_addr (getelementptr ) [ 000011111] StgValue_32 (store ) [ 000000000] StgValue_33 (br ) [ 001111111] StgValue_34 (br ) [ 011111111] k (phi ) [ 000010000] k_cast4 (zext ) [ 000000000] exitcond1 (icmp ) [ 001111111] empty_3 (speclooptripcount) [ 000000000] k_1 (add ) [ 001111111] StgValue_40 (br ) [ 000000000] tmp_5 (add ) [ 000000000] tmp_5_cast_cast (zext ) [ 000000000] tmp_6 (mul ) [ 000001111] p_shl (bitconcatenate ) [ 000001111] p_shl8 (bitconcatenate ) [ 000001111] StgValue_46 (br ) [ 001111111] StgValue_47 (br ) [ 001111111] l (phi ) [ 000001000] l_cast3 (zext ) [ 000000000] l_cast (zext ) [ 000000000] exitcond (icmp ) [ 001111111] empty_4 (speclooptripcount) [ 000000000] l_1 (add ) [ 001111111] StgValue_54 (br ) [ 000000000] tmp1 (add ) [ 000000000] tmp_s (add ) [ 000000000] tmp_1 (zext ) [ 000000000] A_addr (getelementptr ) [ 000000100] tmp2 (add ) [ 000000000] tmp2_cast (zext ) [ 000000000] tmp_4 (add ) [ 000000000] tmp_8 (zext ) [ 000000000] B_addr (getelementptr ) [ 000000100] StgValue_66 (br ) [ 001111111] A_load (load ) [ 000000010] B_load (load ) [ 000000010] tmp_7 (mul ) [ 000000001] C_load (load ) [ 000000001] tmp_9 (add ) [ 000000000] StgValue_73 (store ) [ 000000000] StgValue_74 (br ) [ 001111111] 1 3 1 3 2 3 ---------------- Datapath Model END ------------------ * FSMD analyzer results: - Output states: Port: C | {3 8 } - Input state : Port: convolution : A | {5 6 } Port: convolution : B | {5 6 } Port: convolution : C | {6 7 } - Chain level: State 1 State 2 next_mul : 1 exitcond3 : 1 i_1 : 1 StgValue_20 : 2 State 3 j_cast5 : 1 exitcond2 : 1 j_1 : 1 StgValue_28 : 2 tmp_2 : 2 tmp_3 : 3 C_addr : 4 StgValue_32 : 5 State 4 k_cast4 : 1 exitcond1 : 1 k_1 : 1 StgValue_40 : 2 tmp_5 : 2 tmp_5_cast_cast : 3 tmp_6 : 4 p_shl : 1 p_shl8 : 1 State 5 l_cast3 : 1 l_cast : 1 exitcond : 1 l_1 : 1 StgValue_54 : 2 tmp1 : 2 tmp_s : 3 tmp_1 : 4 A_addr : 5 A_load : 6 tmp2 : 2 tmp2_cast : 3 tmp_4 : 4 tmp_8 : 5 B_addr : 6 B_load : 7 State 6 State 7 State 8 StgValue_73 : 1 ============================================================ + Verbose Summary: Datapath Resource usage ============================================================ * Functional unit list: |----------|------------------------|---------|---------|---------| | Operation| Functional Unit | DSP48E | FF | LUT | |----------|------------------------|---------|---------|---------| | | next_mul_fu_142 | 0 | 0 | 21 | | | i_1_fu_154 | 0 | 0 | 15 | | | j_1_fu_170 | 0 | 0 | 15 | | | tmp_2_fu_176 | 0 | 0 | 21 | | | k_1_fu_197 | 0 | 0 | 13 | | add | tmp_5_fu_203 | 0 | 0 | 15 | | | l_1_fu_249 | 0 | 0 | 13 | | | tmp1_fu_255 | 0 | 0 | 14 | | | tmp_s_fu_260 | 0 | 0 | 14 | | | tmp2_fu_270 | 0 | 0 | 15 | | | tmp_4_fu_279 | 0 | 0 | 15 | | | tmp_9_fu_293 | 0 | 0 | 39 | |----------|------------------------|---------|---------|---------| | mul | tmp_6_fu_213 | 0 | 0 | 41 | | | tmp_7_fu_289 | 3 | 0 | 20 | |----------|------------------------|---------|---------|---------| | | exitcond3_fu_148 | 0 | 0 | 11 | | icmp | exitcond2_fu_164 | 0 | 0 | 11 | | | exitcond1_fu_191 | 0 | 0 | 9 | | | exitcond_fu_243 | 0 | 0 | 9 | |----------|------------------------|---------|---------|---------| | | j_cast5_fu_160 | 0 | 0 | 0 | | | tmp_3_fu_182 | 0 | 0 | 0 | | | k_cast4_fu_187 | 0 | 0 | 0 | | | tmp_5_cast_cast_fu_209 | 0 | 0 | 0 | | zext | l_cast3_fu_235 | 0 | 0 | 0 | | | l_cast_fu_239 | 0 | 0 | 0 | | | tmp_1_fu_265 | 0 | 0 | 0 | | | tmp2_cast_fu_275 | 0 | 0 | 0 | | | tmp_8_fu_284 | 0 | 0 | 0 | |----------|------------------------|---------|---------|---------| |bitconcatenate| p_shl_fu_219 | 0 | 0 | 0 | | | p_shl8_fu_227 | 0 | 0 | 0 | |----------|------------------------|---------|---------|---------| | Total | | 3 | 0 | 311 | |----------|------------------------|---------|---------|---------| Memories: N/A * Register list: +----------------+--------+ | | FF | +----------------+--------+ | A_addr_reg_360 | 14 | | A_load_reg_370 | 32 | | B_addr_reg_365 | 7 | | B_load_reg_375 | 32 | | C_addr_reg_324 | 14 | | C_load_reg_385 | 32 | | i_1_reg_306 | 7 | | i_reg_85 | 7 | | j_1_reg_319 | 7 | | j_cast5_reg_311| 14 | | j_reg_109 | 7 | | k_1_reg_332 | 4 | | k_reg_120 | 4 | | l_1_reg_355 | 4 | | l_reg_131 | 4 | |next_mul_reg_298| 14 | | p_shl8_reg_347 | 5 | | p_shl_reg_342 | 7 | | phi_mul_reg_97 | 14 | | tmp_6_reg_337 | 14 | | tmp_7_reg_380 | 32 | +----------------+--------+ | Total | 275 | +----------------+--------+ * Multiplexer (MUX) list: |------------------|------|------|------|--------||---------||---------| | Comp | Pin | Size | BW | S x BW || Delay || LUT | |------------------|------|------|------|--------||---------||---------| | grp_access_fu_55 | p0 | 2 | 14 | 28 || 9 | | grp_access_fu_55 | p1 | 2 | 32 | 64 || 9 | | grp_access_fu_68 | p0 | 2 | 14 | 28 || 9 | | grp_access_fu_80 | p0 | 2 | 7 | 14 || 9 | | i_reg_85 | p0 | 2 | 7 | 14 || 9 | | phi_mul_reg_97 | p0 | 2 | 14 | 28 || 9 | |------------------|------|------|------|--------||---------||---------| | Total | | | | 176 || 10.614 || 54 | |------------------|------|------|------|--------||---------||---------| * Summary: +-----------+--------+--------+--------+--------+ | | DSP48E | Delay | FF | LUT | +-----------+--------+--------+--------+--------+ | Function | 3 | - | 0 | 311 | | Memory | - | - | - | - | |Multiplexer| - | 10 | - | 54 | | Register | - | - | 275 | - | +-----------+--------+--------+--------+--------+ | Total | 3 | 10 | 275 | 365 | +-----------+--------+--------+--------+--------+