Vivado 빌드¶
pccx v002 NPU 코어의 Vivado 빌드 흐름을 설명한다. 빌드 스크립트는
hw/vivado/ 아래에 위치하며, build.sh 가 단일 진입점이다.
구현 파일은 pccxai/pccx-FPGA-NPU-LLM-kv260 저장소에서 관리한다.
빌드 흐름¶
build.sh 는 Vivado 배치(batch) 모드 실행의 얇은 래퍼다. 인자에 따라
네 가지 단계를 선택적으로 실행한다.
./hw/vivado/build.sh project # 프로젝트 생성만
./hw/vivado/build.sh synth # 프로젝트 생성 + OOC 합성
./hw/vivado/build.sh impl # 전체 구현 + 비트스트림 생성
./hw/vivado/build.sh clean # build/ 디렉터리 삭제
스크립트는 PATH 에서 vivado 를 먼저 탐색하고, 없으면
/tools/Xilinx/2025.2, 2024.1, 2023.2 순으로 폴백한다.
Vivado 2023.2 이상이 필요하다.
단계별 흐름:
create_project.tcl— 파트xck26-sfvc784-2LV-c(KV260 ZU5EV) 를 타겟으로 Vivado 프로젝트를build/pccx_v002_kv260/에 생성한다.filelist.f를 파싱하여 소스를sources_1필셋에 추가하고,hw/constraints/*.xdc를constrs_1에 등록한다.synth.tcl—synth_design -mode out_of_context -flatten_hierarchy rebuilt로 OOC 합성을 수행한다. 합성 후build/reports/에utilization_post_synth.rpt,clocks_post_synth.rpt,timing_summary_post_synth.rpt,drc_post_synth.rpt를 생성한다.impl.tcl을 실행하기 전 이 리포트에서 WNS 를 확인할 것을 권장한다.impl.tcl—synth_1진행률이100%임을 확인한 후impl_1 -to_step write_bitstream -jobs 4를 실행한다. 완료 시 비트스트림을build/pccx_v002_kv260.bit로 복사한다. 구현은 시간 단위 작업이므로 OOC 합성이 클린한 상태에서만 실행한다.
OOC 모드를 사용하는 이유는 NPU_top 이 SystemVerilog 인터페이스 포트
(axil_if / axis_if) 를 사용하기 때문이다. OOC 합성에서는 포트를
미결합 상태로 두므로 블록 디자인 래퍼 없이 코어를 단독으로 합성·검증할
수 있다.
SV 인터페이스 래퍼¶
보드 측 SystemVerilog 래퍼 (npu_core_wrapper.sv) 는 NPU_top 의
SystemVerilog 인터페이스 포트를 평문 AXI4-Lite / AXI4-Stream 신호
묶음으로 변환하는 얇은 래퍼다. 레지스터와 CDC 는 포함하지 않으며
신호 배선만 수행한다.
이 래퍼 파일은 KV260 보드 통합 저장소
(pccxai/pccx-FPGA-NPU-LLM-kv260)
에 남아있다. 보드 측 패키징 관심사를 담고 있으므로 v002 추출 이후에도
재사용 IP-core 패키지(pccx-v002) 가 아닌 보드 통합 레이어에 유지된다.
권위 있는 위치는 보드 통합 저장소의 hw/vivado/npu_core_wrapper.sv 다.
래퍼가 노출하는 외부 인터페이스는 다음과 같다.
포트 그룹 |
방향 |
폭 |
설명 |
|---|---|---|---|
|
입력 |
1-bit |
코어 도메인 클럭 및 액티브-로우 리셋 |
|
입력 |
1-bit |
AXI 도메인 클럭 및 액티브-로우 리셋 |
|
슬레이브 |
32-bit |
AXI4-Lite 제어 채널 (CMD_IN / STAT_OUT) |
|
슬레이브 |
128-bit |
AXI4-Stream HP 포트 × 4 (가중치 스트리밍) |
|
슬레이브 |
128-bit |
AXI4-Stream ACP FMap 입력 |
|
마스터 |
128-bit |
AXI4-Stream ACP 결과 출력 |
Vivado IP 패키저는 평문 신호 포트를 AXI 인터페이스로 자동 추론하므로,
이 래퍼를 거치면 NPU_top 을 Zynq PS 와 함께 블록 디자인에 직접 배치할
수 있다.
제약¶
hw/constraints/pccx_timing.xdc 는 타이밍 전용 제약 파일이다.
핀·IO 제약은 포함하지 않으며, 이는 해당 코어를 감싸는 블록 디자인에
위임된다.
두 개의 클럭 도메인이 정의된다.
클럭 이름 |
주기 |
주파수 |
대상 |
|---|---|---|---|
|
4.000 ns |
250 MHz |
AXI-Lite MMIO, CDC FIFO drain 측, DMA 경로 |
|
2.500 ns |
400 MHz |
DSP48E2 어레이, GEMV 레인, CVO SFU |
두 도메인은 완전히 비동기적이다. set_clock_groups -asynchronous 로
처리되며, 모든 경계 교차는 CDC FIFO 또는 리셋 동기화기를 통해 이루어진다.
추가로 다음 경로 예외가 설정되어 있다.
False path — 리셋 브릿지 첫 플롭으로의 경로 및
XPM_FIFO_ASYNC그레이 코드 포인터 크로싱.Multicycle path (setup 2, hold 1) — GEMM systolic array 의 DSP48E2 P-레지스터에서
mat_result_normalizer까지. 컨트롤러가 누산 flush 중 새 MAC 를 스톨시키므로 drain 경로에 2 사이클을 허용한다.
파일 매니페스트¶
hw/vivado/filelist.f 는 OOC 합성 및 xvlog 린트 모두의
소스 목록이다. create_project.tcl 이 이 파일을 파싱하여 소스를
Vivado 프로젝트에 추가한다.
컴파일 순서는 파일 내 선언 순서를 따른다. 패키지·인터페이스가 그것을 임포트하는 모듈보다 앞에 위치해야 한다.
전체 파일은 다음 섹션으로 구성된다.
섹션 |
내용 |
|---|---|
A (주석 전용) |
|
B |
|
C |
|
D |
|
Library |
BF16 수학 라이브러리, 알고리즘, QUEUE 인터페이스 |
ISA |
|
MAT_CORE |
GEMM systolic array 및 결과 패커 |
VEC_CORE |
GEMV 코어 (누산, LUT 생성, reduction, 탑) |
CVO_CORE |
CORDIC 유닛, SFU, CVO 탑 |
PREPROCESS |
BF16↔fixed-point 파이프라인, fmap cache |
MEM_control |
L2 캐시, HP 버퍼, CVO 브릿지, 디스패처 |
NPU_Controller |
AXI-Lite 디코더, 디스패처, 프론트엔드, Global Scheduler, 탑 |
최상위 |
|
새 .sv 파일을 추가할 때는 의존성 순서를 지켜 filelist.f 에 등록한다.
관련 페이지¶
Last verified against
Commit 8c09e5e @ pccxai/pccx-FPGA-NPU-LLM-kv260 (2026-04-29)