동기 부여
ISE의 synthesizer (xst)에 의해 생성된 보고서 하단 어딘가에 가장 느린 path의 윤곽과 함께 최대 주파수가 무엇인지 나와 있습니다. 이것은 특히 특정 module을 최적화하려고 할 때 상당히 좋은 기능입니다. Vivado가 있는 synthesis 이후에는 그러한 수치가 주어지지 않습니다. 아마도 Xilinx 의 사람들이 이 "최대 주파수"가 오해의 소지가 있다고 생각했기 때문일 것입니다. 그렇다면 두 가지 타당한 이유가 있습니다.
- "최대 주파수"와 같은 것은 없습니다. 도구는 timing constraints 에 주의를 기울이고 그에 따라 최선을 다합니다. 간단히 말해서, 요청하지 않는 한 특정 주파수를 얻지 못할 수도 있습니다.
- 일반적인 design에는 주파수가 다른 많은 clocks가 있습니다. 가장 느린 path는 어쨌든 느린 clock 에 속할 수 있습니다.
그리고 여전히 완전한 implementation의 Via Dolorosa 이전에 상황이 어디에 있는지에 대한 아이디어를 얻는 것이 유용할 때가 있습니다.
Vivado에서 수행하는 방법
맨 먼저: 기대에 따라 timing constraints를 설정하십시오. 또는 적어도 어떤 clock이 중요하고 어떤 것이 느릴 수 있는지 명확히 하는 방식으로. 그런 다음 design에서 synthesis를 수행합니다.
synthesis가 성공적으로 완료된 후 synthesized design을 엽니다(왼쪽 bar 에서 "Open Synthesized Design" 클릭 또는 Tcl 명령 "open_run synth_1" 사용).
Tcl window에서 명령을 작성하십시오.
report_timing_summary -file mytiming.rpt
전체 post-synthesis timing report를 mytiming.rpt에 씁니다. "report_timing_summary"는 console로 출력합니다.
왼쪽 bar의 "Synthesized Design" 아래에 "Report Timing Summary" 옵션도 있지만 GUI 인터페이스를 사용하여 보고서에서 정보를 얻기가 어렵습니다.
보고서 읽기
규칙 #1 : synthesis report는 대략적인 추정치에 불과합니다. routing delays는 추측입니다. implementation이 상관없이 성공할 timing failures를 보고할 수 있으며, implementation이 엄청나게 실패할 경우(특히 FPGA의 logic usage가 100%에 근접할 때) 모든 것이 정상이라고 말할 수 있습니다.
이제 실행: 가장 먼저 살펴볼 것은 clock summary 와 Intra Clock Table이 며, Vivado가 어떤 clock에 이름을 붙였는지 알아보세요. 예를 들어,
------------------------------------------------------------------------------------------------ | Clock Summary | ------------- ------------------------------------------------------------------------------------------------ Clock Waveform(ns) Period(ns) Frequency(MHz) ----- ------------ ---------- -------------- clk_fpga_1 {0.000 5.000} 10.000 100.000 gclk {0.000 4.000} 8.000 125.000 audio_mclk_OBUF {0.000 41.667} 83.333 12.000 clk_fb {0.000 20.000} 40.000 25.000 vga_clk_ins/clk_fb {0.000 20.000} 40.000 25.000 vga_clk_ins/clkout0 {0.000 1.538} 3.077 325.000 vga_clk_ins/clkout1 {0.000 7.692} 15.385 65.000 vga_clk_ins/clkout2 {0.000 7.692} 15.385 65.000 ------------------------------------------------------------------------------------------------ | Intra Clock Table | ----------------- ------------------------------------------------------------------------------------------------ Clock WNS(ns) TNS(ns) TNS Failing Endpoints TNS Total Endpoints WHS(ns) THS(ns) THS Failing Endpoints THS Total Endpoints WPWS(ns) TPWS(ns) TPWS Failing Endpoints TPWS Total Endpoints ----- ------- ------- --------------------- ------------------- ------- ------- --------------------- ------------------- -------- -------- ---------------------- -------------------- clk_fpga_1 3.791 0.000 0 12474 0.135 0.000 0 12474 3.750 0.000 0 5021 gclk 6.751 0.000 0 2 audio_mclk_OBUF 76.667 0.000 0 1 clk_fb 12.633 0.000 0 2 vga_clk_ins/clk_fb 38.751 0.000 0 2 vga_clk_ins/clkout0 1.410 0.000 0 10 vga_clk_ins/clkout1 10.747 0.000 0 215 -0.029 -0.229 8 215 6.712 0.000 0 195 vga_clk_ins/clkout2 3.990 0.000 0 415 0.135 0.000 0 415 7.192 0.000 0 211
Clock Summary 에 나열된 clock frequencies ( timing constraints에서 파생됨)가 clock 와 이름을 일치시키는 데 도움이 되지 않으면 Intra Clock Table 에 있는 각 clock 의 TNS Total Endpoints가 어떤 clock이 어떤 것인지 알려주는 데 도움이 됩니다. 따라서 관심 있는 clock 의 이름을 찾으면 파일에서 이 이름을 검색하고 다음과 같이 찾습니다.
Max Delay Paths -------------------------------------------------------------------------------------- Slack (MET) : 3.791ns (required time - arrival time) Source: xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_offset_limit_1/C (rising edge-triggered cell FDRE clocked by clk_fpga_1 {rise@0.000ns fall@5.000ns period=10.000ns}) Destination: xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_end_offset_0/D (rising edge-triggered cell FDRE clocked by clk_fpga_1 {rise@0.000ns fall@5.000ns period=10.000ns}) Path Group: clk_fpga_1 Path Type: Setup (Max at Slow Process Corner) Requirement: 10.000ns (clk_fpga_1 rise@10.000ns - clk_fpga_1 rise@0.000ns) Data Path Delay: 6.077ns (logic 2.346ns (38.605%) route 3.731ns (61.395%)) Logic Levels: 8 (CARRY4=3 LUT3=1 LUT4=1 LUT6=3) Clock Path Skew: -0.040ns (DCD - SCD + CPR) Destination Clock Delay (DCD): 0.851ns = ( 10.851 - 10.000 ) Source Clock Delay (SCD): 0.901ns Clock Pessimism Removal (CPR): 0.010ns Clock Uncertainty: 0.154ns ((TSJ^2 + TIJ^2)^1/2 + DJ) / 2 + PE Total System Jitter (TSJ): 0.071ns Total Input Jitter (TIJ): 0.300ns Discrete Jitter (DJ): 0.000ns Phase Error (PE): 0.000ns Location Delay type Incr(ns) Path(ns) Netlist Resource(s) ------------------------------------------------------------------- ------------------- (clock clk_fpga_1 rise edge) 0.000 0.000 r PS7 0.000 0.000 r xillybus_ins/system_i/vivado_system_i/processing_system7_0/inst/PS7_i/FCLKCLK[1] net (fo=1, unplaced) 0.000 0.000 xillybus_ins/system_i/vivado_system_i/processing_system7_0/inst/n_707_PS7_i BUFG (Prop_bufg_I_O) 0.101 0.101 r xillybus_ins/system_i/vivado_system_i/processing_system7_0/inst/buffer_fclk_clk_1.FCLK_CLK_1_BUFG/O net (fo=5023, unplaced) 0.800 0.901 xillybus_ins/xillybus_core_ins/bus_clk_w r xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_offset_limit_1/C ------------------------------------------------------------------- ------------------- FDRE (Prop_fdre_C_Q) 0.496 1.397 f xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_offset_limit_1/Q net (fo=5, unplaced) 0.834 2.231 xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_offset_limit[1] LUT4 (Prop_lut4_I0_O) 0.289 2.520 r xillybus_ins/xillybus_core_ins/unitw_1_ins/Mcompar_n0037_lutdi/O net (fo=1, unplaced) 0.000 2.520 xillybus_ins/xillybus_core_ins/unitw_1_ins/Mcompar_n0037_lutdi CARRY4 (Prop_carry4_DI[0]_CO[3]) 0.553 3.073 r xillybus_ins/xillybus_core_ins/unitw_1_ins/Mcompar_n0037_cy[0]_CARRY4/CO[3] net (fo=1, unplaced) 0.000 3.073 xillybus_ins/xillybus_core_ins/unitw_1_ins/Mcompar_n0037_cy[3] CARRY4 (Prop_carry4_CI_CO[3]) 0.114 3.187 r xillybus_ins/xillybus_core_ins/unitw_1_ins/Mcompar_n0037_cy[4]_CARRY4/CO[3] net (fo=3, unplaced) 0.936 4.123 xillybus_ins/xillybus_core_ins/unitw_1_ins/Mcompar_n0037_cy[7] LUT6 (Prop_lut6_I4_O) 0.124 4.247 f xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_wr_request_condition/O net (fo=7, unplaced) 0.480 4.727 xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_wr_request_condition LUT3 (Prop_lut3_I2_O) 0.124 4.851 r xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_flush_condition_unitw_1_wr_request_condition_AND_179_o3_lut/O net (fo=1, unplaced) 0.000 4.851 xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_flush_condition_unitw_1_wr_request_condition_AND_179_o3_lut CARRY4 (Prop_carry4_S[2]_CO[3]) 0.398 5.249 f xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_flush_condition_unitw_1_wr_request_condition_AND_179_o2_cy_CARRY4/CO[3] net (fo=21, unplaced) 0.979 6.228 xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_flush_condition_unitw_1_wr_request_condition_AND_179_o LUT6 (Prop_lut6_I5_O) 0.124 6.352 r xillybus_ins/xillybus_core_ins/unitw_1_ins/_n03401/O net (fo=15, unplaced) 0.502 6.854 xillybus_ins/xillybus_core_ins/unitw_1_ins/_n0340 LUT6 (Prop_lut6_I5_O) 0.124 6.978 r xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_end_offset_0_rstpot/O net (fo=1, unplaced) 0.000 6.978 xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_end_offset_0_rstpot FDRE r xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_end_offset_0/D ------------------------------------------------------------------- ------------------- (clock clk_fpga_1 rise edge) 10.000 10.000 r PS7 0.000 10.000 r xillybus_ins/system_i/vivado_system_i/processing_system7_0/inst/PS7_i/FCLKCLK[1] net (fo=1, unplaced) 0.000 10.000 xillybus_ins/system_i/vivado_system_i/processing_system7_0/inst/n_707_PS7_i BUFG (Prop_bufg_I_O) 0.091 10.091 r xillybus_ins/system_i/vivado_system_i/processing_system7_0/inst/buffer_fclk_clk_1.FCLK_CLK_1_BUFG/O net (fo=5023, unplaced) 0.760 10.851 xillybus_ins/xillybus_core_ins/bus_clk_w r xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_end_offset_0/C clock pessimism 0.010 10.861 clock uncertainty -0.154 10.707 FDRE (Setup_fdre_C_D) 0.062 10.769 xillybus_ins/xillybus_core_ins/unitw_1_ins/unitw_1_end_offset_0 ------------------------------------------------------------------- required time 10.769 arrival time -6.978 ------------------------------------------------------------------- slack 3.791
다소 지저분한 텍스트이지만 핵심 요소는 빨간색으로 표시되어 있습니다.
결론을 내리기 전에 보고 있는 부분이 올바른지 확인하세요.
- Max Delay Paths 섹션입니다. mimimal paths 섹션은 hold time 위반을 발견하는 데 유용하며 최대 주파수에는 영향을 미치지 않습니다.
- 바로 clock입니다. 위의 예에서는 clk_fpga_1입니다. Requirement 행에는 이 clock (10 ns = 100 MHz)에 대해 제공된 constraint 뿐만 아니라 clk_fpga_1 의 한 rising edge 에서 다음 rising edge로 이동한다고 명시되어 있습니다.
완료되면 다음을 살펴보겠습니다. 요구 사항은 10 ns가 고 slack은 3.791 ns 입니다(양수입니다). 이것은 우리가 3.791 ns보다 짧은 clock period를 요청할 수 있었고 여전히 괜찮을 것임을 의미합니다. 따라서 요청된 clock period는 10 – 3.791 = 6.2090 ns일 수 있으며 이는 약 161 MHz입니다.
따라서 clk_fpga_1 에 대한 "maximal clock" 질문에 대한 짧은 대답은 161 MHz입니다. 그러나 constraints가 변경되면 이 수치가 변경될 수 있음을 기억하십시오.
그리고 마지막 메모: Data Path Delay은 무엇이 이 최악의 path를 느리거나 빠르게 만들었는지 알려줍니다. delay이 logic에 얼마나 들어갔는지, 그리고 (추정) route delays에 얼마나 들어갔는지. 이어지는 상세한 delay report 도 마찬가지입니다. 더 자세한 보고서를 보려면 timing report를 요청할 때 "-noworst" 플래그를 사용하는 것을 고려하십시오. 그러면 몇 가지 최악의 paths가 나열됩니다. 이것은 timing의 문제를 해결하는 데 도움이 될 수 있습니다.