소개
FPGA 설계가 타이밍 제약 조건(timing constraints)을 달성하지 못하면, 자연스럽게 임계 경로(critical path)를 자세히 살펴보게 됩니다. 이 검토는 각 경로(path)를 따라 다양한 논리 소자가 일으키는 지연을 보여 주는 타이밍 리포트를 통해서 이루어집니다.
인텔 FPGA를 자주 사용하지 않는 사용자라면, 이 리포트를 어떻게 얻는지 알아내는 것이 그리 간단하지 않을 수 있습니다. 더 심각한 것은, 자신도 모르게 엉뚱한 리포트를 보고 있을 수도 있다는 점입니다.
먼저 정리해야 할 개념은 멀티-코너 타이밍 분석(multi-corner timing analysis)입니다. 일반적인 방법은 FPGA 타이밍의 유효성을 네 가지 경우에 대해 검증하는 것입니다. 즉 최소·최대 온도와 '느린(slow)' 타이밍 모델 및 '빠른(fast)' 타이밍 모델을 조합하여 타이밍 제약 조건(timing constraints)이 충족되는지 확인합니다. 따라서 분석은 네 가지 조합, 즉 네 개의 코너(corner)에 대해 수행됩니다.
그러므로 임계 경로를 검토할 때는 네 코너 모두에 대한 타이밍 리포트를 살펴보는 것이 중요합니다. 하지만 이러한 사실은 자주 간과됩니다. 예를 들어 TimeQuest 는 보통 단일 코너에 대한 타이밍 리포트만 생성합니다.
그래서 이 글에서는 실제로 의미 있는 리포트를 얻는 방법을 설명합니다. 예제는 Quartus Prime 17.1 Lite 를 기준으로 합니다.
관련이 있는 다른 두 글도 언급해 두겠습니다. 하나는 입력/출력 제약 조건과 타이밍 리포트의 관계를 살펴보는 글이고, 다른 하나는 TimeQuest 에서 Tcl 스크립트(script)를 약간 실험해 보는 글입니다.
중요: 이 페이지는 셋업(setup) 요건에 대한 타이밍 리포트를 얻는 방법을 설명합니다. 그런데 홀드(hold), 리커버리(recovery), 리무벌(removal)에 대한 타이밍 리포트도 따로 생성됩니다. 이 리포트들 역시 타이밍 제약 조건(timing constraints)을 달성하지 못한 경우를 드러낼 수 있습니다.
멀티-코너 리포트 생성: 스크립트로 빠르게
먼저 다음 Tcl 스크립트를 timing.tcl 같은 이름의 파일로 저장합니다.
create_timing_netlist
read_sdc
update_timing_netlist
foreach_in_collection op [get_available_operating_conditions] {
set_operating_conditions $op
report_timing -setup -npaths 20 -detail full_path -multi_corner \
-panel_name "Critical paths"
}
타이밍 리포트가 셋업(setup)만 대상으로 한다는 점에 유의하세요.
'multi_corner' 플래그 때문에 혼동하지 마세요. report_timing 을 호출할 때마다 하나의 코너만 처리합니다. 이 플래그가 실제로 무언가를 하는지는 분명하지 않습니다.
그래서 이 스크립트는 foreach_in_collection 으로 네 가지 조건을 모두 반복하면서, 각 코너마다 별도의 리포트를 생성합니다.
이제 실제로 실행해 보겠습니다.
- Quartus 에서 Task 창의 TimeQuest 그룹을 펼친 다음, TimeQuest Timing Analyzer 를 엽니다.
- TimeQuest Timing Analyzer 에서 메뉴 모음의 Script > Run Tcl Script… 를 선택하고 해당 Tcl 스크립트(예: timing.tcl)를 고릅니다.
- TimeQuest Timing Analyzer 의 Report 창에 "Critical paths" 항목이 추가됩니다. Multi-Corner Summary 를 클릭하면 경로(path) 목록과 세부 정보가 기본 창에 표시됩니다.
- 경로에 대한 모든 정보를 텍스트 파일로 내보내려면 Multi-Corner Summary 를 오른쪽 클릭하고 "Export…"를 선택합니다. 결과 파일 이름은 .rpt 확장자로 지정하세요. HTML 리포트는 지원되지 않습니다(빈 파일이 됩니다).
같은 항목 아래에 코너별로 네 개의 개별 리포트도 함께 나타납니다. 이전 버전의 Quartus 에서는 이 리포트들만 표시됩니다(즉, Multi-Corner Summary 는 나타나지 않습니다).
HTML / 텍스트 리포트만 생성하기
이 도구들은 깔끔한 HTML 리포트를 생성할 수 있는데, TimeQuest 자체 GUI 보다 읽기가 훨씬 편합니다. 하지만 안타깝게도 이 리포트들은 각각 하나의 코너만 다룹니다. 아래 스크립트는 코너마다 별도의 HTML 리포트 네 개를 생성합니다(파일이 아주 많습니다. JQuery 스크립트 파일, CSS 등 별것이 다 포함되죠. 화려하기는 하지만 멀티-코너 리포트는 아닙니다).
다음과 같은 스크립트를 timing-html.tcl 로 생각해 보겠습니다.
#project_open myproj
create_timing_netlist
read_sdc
update_timing_netlist
foreach_in_collection op [get_available_operating_conditions] {
set_operating_conditions $op
report_timing -setup -npaths 20 -detail full_path -multi_corner \
-file "timing_paths_$op.html" \
-panel_name "Critical paths for $op"
}
일반 텍스트 리포트가 필요하면 -file 플래그의 인자를 바꿔 확장자를 .html 대신 .rpt 또는 .txt 로 지정하면 됩니다.
스크립트 맨 위에 주석 처리된 'project_open' 명령에 유의하세요. 주석을 해제하고 'myproj'를 실제 프로젝트 이름으로 바꾸면, 다음과 같이 일반 셸 명령줄로 HTML 리포트를 생성할 수 있습니다.
$ /path/to/quartus/bin/quartus_sta -t timing-html.tcl
하지만 이렇게 해서 멀티-코너 리포트를 생성하는 방법은 찾지 못했습니다.
각 구현(implementation) 단계마다 이 리포트들이 생성되도록 하려면(권장합니다), QSF 파일에 다음과 같은 줄을 추가하세요.
set_global_assignment -name TIMEQUEST_REPORT_SCRIPT relative/path/to/timing-html.tcl
Tcl 스크립트를 이렇게 QSF 파일에 포함할 때는, 스크립트에서 project_open 을 사용하면 안 됩니다.
GUI 만 사용하는 방법
마우스 클릭만으로도 멀티-코너 리포트를 얻을 수 있습니다.
- Quartus 에서 Task 창의 TimeQuest 그룹을 펼친 다음, TimeQuest Timing Analyzer 를 엽니다.
- Timing Analyzer 의 Tasks 창에서 "Update Timing Netlist"를 더블 클릭합니다.
- 같은 창에서 아래로 스크롤하여 "Custom Reports"의 "Report Timing…"을 더블 클릭합니다.
- 대화 상자가 열립니다. setup, hold, recovery 또는 removal 을 선택합니다. 그 외에는 기본값을 그대로 두고 아래의 "Report Timing"을 클릭합니다.
- Report 창에 "Report Timing" 항목이 추가됩니다. 이 항목을 펼치고 오른쪽 클릭한 다음, 열린 메뉴에서 "Generate in All Corners"를 클릭합니다.
- "Multi Corner Summary" 그룹을 클릭합니다. 앞에서 설명한 대로 리포트를 내보낼 수도 있습니다.