Vivado 트러블슈팅 – Pruning 방지와 Tool Crash 해결법

저전력 AI 반도체용 NPU를 설계하다 보면 RTL 코딩보다 툴(Tool)과 싸우는 데 더 많은 시간을 쏟게 됩니다. 코드를 완벽하게 짰다고 확신하며 합성(Synthesis) 버튼을 눌렀는데, 결과 창에 LUT와 BRAM 사용량이 ‘0’으로 찍히는 마법 같은(?) 현상을 겪어보신 적 있나요? 혹은 Implementation 도중 알 수 없는 에러 로그를 뿜으며 Vivado가 그대로 뻗어버리는(Crash) 상황도 빈번합니다.

이번 글에서는 실무에서 수없이 밤을 새우며 찾아낸 Vivado 로직 증발(Pruning) 방어법과 악명 높은 Tool Crash 해결책을 완벽하게 정리해 보겠습니다.

1. 내 로직이 사라졌다: Dangling Logic과 Pruning

BRAM을 정성껏 인스턴스화하고, MAC 연산기를 열심히 붙여서 합성을 돌렸습니다. 그런데 Project Summary를 보니 ‘RAMB36E2 : 0’으로 나옵니다. 내가 짠 로직을 툴이 마음대로 지워버린 것입니다.

왜 이런 일이 발생할까요?

Vivado의 합성 엔진은 매우 똑똑하면서도 무자비합니다. 칩의 면적(Area)과 전력(Power)을 최적화하기 위해, “최종 출력 핀(Output Port)으로 연결되지 않아 실제 결과에 영향을 주지 않는 로직” (Dead Code / Dangling Logic)은 모조리 날려버립니다. 이를 Logic Pruning이라고 합니다.

테스트를 위해 Top 모듈에서 핀을 임시로 끊어두었거나, 내부 신호만 관찰하려고 할 때 이런 현상이 집중적으로 발생합니다.

해결 방법 (방어 스킬):

  1. 가장 정석적인 방법: 모든 중요 내부 신호를 Top 모듈의 Output Port로 빼서 어떻게든 밖으로 연결되게 만듭니다. (하지만 핀 개수 제한 때문에 항상 가능한 것은 아닙니다.)
  2. dont_touch 속성 부여: Vivado에게 “이 모듈과 신호는 최적화하지 말고 무조건 남겨둬!”라고 강제하는 명령어입니다. 선언부 바로 앞에 아래와 같이 추가합니다.
(* dont_touch = "true" *) logic [31:0] my_important_signal;
(* dont_touch = "true" *) SRAM_bram u_sram_low (...);

주의: (mark_debug = “true”)를 쓰면 로직이 남긴 하지만, ILA(로직 분석기) 코어가 강제로 삽입되면서 합성 시간이 기하급수적으로 늘어나거나 툴이 꼬일 수 있으니 단순 보존 목적이라면 dont_touch를 써야 합니다.

2. XDC 제약(Constraint) 누락

150MHz로 동작하는 AI 코어를 설계 중이라고 가정해 봅시다. 귀찮아서 클럭 타이밍 제약 파일(timing_constraints.xdc)을 넣지 않고 합성을 돌리면 어떻게 될까요?

XDC가 없으면 Vivado는 “타이밍 제약이 없다 = 무한대의 속도로 동작해야 한다”라고 오판하거나, 아예 최적화 방향을 잃어버립니다. 이 과정에서 툴이 메모리를 과도하게 잡아먹다가 뻗어버리거나(Crash), 불필요한 버퍼를 마구잡이로 삽입해 로직이 완전히 꼬여버립니다.

해결 방법: 귀찮더라도 프로젝트 생성 직후 반드시 메인 클럭에 대한 제약을 걸어주어야 합니다.

# Clock Constraint for 150 MHz (1 / 150,000,000 = 6.666... ns)
create_clock -period 6.667 -name sys_clk -waveform {0.000 3.333} [get_ports clk]

단 한 줄의 .xdc 파일이 Vivado에게 “목표는 6.6ns야. 이 안에만 신호가 도착하면 무리해서 최적화하지 마”라는 가이드라인을 주어 툴의 안정성을 극적으로 높여줍니다.

3. Could not create slave interpreter / ps_wizard 에러 해결법

Implementation 또는 Simulation을 돌리는데 갑자기 다음과 같은 에러가 발생하며 진행이 막히는 경우가 있습니다.

ERROR: [Common 17-232] Could not create slave interpreter 'rodin:slave19'

ERROR: [IP_Flow 19-3505] IP Generation error: Failed to generate IP 'ps_wizard'

ERROR: [Common 17-3645] Failed to remove file D:/.../.Xil/...

이 에러는 RTL 코드 문제가 절대 아닙니다. Vivado 내부의 Tcl 엔진이 꼬였거나, 윈도우 OS의 File Lock(파일 잠금) 현상 때문에 이전 프로세스가 임시 파일을 놔주지 않아 발생하는 좀비 프로세스 문제입니다. 주로 디버그 코어(ILA)를 자동 삽입하려다 실패했을 때 자주 나타납니다.

3단계 해결방법 (캐시 초기화): GUI에서 Reset Runs를 누르는 것만으로는 절대 해결되지 않습니다. 무조건 탐색기를 열어 수동으로 지워야 합니다.

  1. Vivado 강제 종료: 작업 관리자에서 vivado.exe와 tclsh.exe가 남아있다면 모두 종료합니다.
  2. .Xil 폴더 삭제 (핵심): 프로젝트 폴더로 들어가서 숨김 파일 보기를 켭니다. .Xil이라는 폴더가 보일 텐데, 이 폴더를 통째로 영구 삭제(Shift+Delete) 하세요. 이 폴더 안에 걸린 File Lock이 모든 에러의 원인입니다.
  3. 잔재 청소: .cache, .hw, .runs, .sim 폴더도 과감하게 지워줍니다. (소스 코드는 .srcs에 있으니 안전합니다.)

이 3단계 조치 후 PC를 재부팅하고 다시 Vivado를 켜면, 언제 에러를 뿜었냐는 듯이 평온하게 Implementation이 완료되는 것을 보실 수 있습니다.

참고: AMD

유사한 게시물