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 인터페이스 래퍼¶
hw/vivado/npu_core_wrapper.sv 는 NPU_top 의 SystemVerilog 인터페이스
포트를 평문 AXI4-Lite / AXI4-Stream 신호 묶음으로 변환하는 얇은 래퍼다.
레지스터와 CDC 는 포함하지 않으며 신호 배선만 수행한다.
module npu_core_wrapper #(
parameter int AXIL_ADDR_W = 32,
parameter int AXIL_DATA_W = 32,
parameter int HP_DATA_W = 128,
parameter int ACP_DATA_W = 128
) (
// ===| Clocks and resets |==================================================
input logic clk_core,
input logic rst_n_core,
input logic clk_axi,
input logic rst_axi_n,
input logic i_clear,
// ===| S_AXIL_CTRL (AXI4-Lite slave) |======================================
input logic [AXIL_ADDR_W-1:0] s_axil_awaddr,
input logic s_axil_awvalid,
output logic s_axil_awready,
input logic [AXIL_DATA_W-1:0] s_axil_wdata,
input logic [AXIL_DATA_W/8-1:0] s_axil_wstrb,
input logic s_axil_wvalid,
output logic s_axil_wready,
output logic [1:0] s_axil_bresp,
output logic s_axil_bvalid,
input logic s_axil_bready,
input logic [AXIL_ADDR_W-1:0] s_axil_araddr,
input logic s_axil_arvalid,
output logic s_axil_arready,
output logic [AXIL_DATA_W-1:0] s_axil_rdata,
output logic [1:0] s_axil_rresp,
output logic s_axil_rvalid,
input logic s_axil_rready,
// ===| S_AXI_HP0..3_WEIGHT (AXIS slave, 128-bit each) |====================
input logic [HP_DATA_W-1:0] s_axis_hp0_tdata,
input logic s_axis_hp0_tvalid,
output logic s_axis_hp0_tready,
input logic [HP_DATA_W-1:0] s_axis_hp1_tdata,
input logic s_axis_hp1_tvalid,
output logic s_axis_hp1_tready,
input logic [HP_DATA_W-1:0] s_axis_hp2_tdata,
input logic s_axis_hp2_tvalid,
output logic s_axis_hp2_tready,
input logic [HP_DATA_W-1:0] s_axis_hp3_tdata,
input logic s_axis_hp3_tvalid,
output logic s_axis_hp3_tready,
// ===| ACP FMap (AXIS slave) + Result (AXIS master) |======================
input logic [ACP_DATA_W-1:0] s_axis_acp_fmap_tdata,
input logic s_axis_acp_fmap_tvalid,
output logic s_axis_acp_fmap_tready,
output logic [ACP_DATA_W-1:0] m_axis_acp_result_tdata,
output logic m_axis_acp_result_tvalid,
input logic m_axis_acp_result_tready
);
래퍼가 노출하는 외부 인터페이스는 다음과 같다.
포트 그룹 |
방향 |
폭 |
설명 |
|---|---|---|---|
|
입력 |
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 프로젝트에 추가한다.
컴파일 순서는 파일 내 선언 순서를 따른다. 패키지·인터페이스가 그것을 임포트하는 모듈보다 앞에 위치해야 한다.
rtl/Constants/compilePriority_Order/B_device_pkg/device_pkg.sv
# ===| C: dtype / mem packages (depend on B) |=================================
rtl/Constants/compilePriority_Order/C_type_pkg/dtype_pkg.sv
rtl/Constants/compilePriority_Order/C_type_pkg/mem_pkg.sv
# ===| D: vector-core configuration package (depends on B+C) |=================
rtl/Constants/compilePriority_Order/D_pipeline_pkg/vec_core_pkg.sv
# ===| Library packages and interfaces |=======================================
전체 파일은 다음 섹션으로 구성된다.
섹션 |
내용 |
|---|---|
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)