컴파일 우선순위 패키지¶
v002 RTL은 패키지와 헤더를 컴파일 우선순위 계층(Constants/compilePriority_Order/)으로
분리 관리한다. 각 계층은 이전 계층에만 의존하므로 xvlog 또는 Vivado 컴파일러가
전방 참조 없이 순서대로 처리할 수 있다. hw/vivado/filelist.f가 이 순서를 정식으로
기록한다.
컴파일 우선순위¶
컴파일 단계는 A → B → C → D 순으로 진행된다.
A — 순수 `define 헤더 (A_const_svh/): xvlog -i 플래그로 인클루드 경로에
추가될 뿐 직접 컴파일되지 않는다.
NUMBERS.svh— 기본 비트 폭 정의.`N_SIZEOF_INT4 = 4,`N_BF16_SIZE = 16,`N_FP32_SIZE = 32.npu_arch.svh— NPU 아키텍처 매크로. 포트 선언과generate범위에서localparam대신`define이 필요한 값들을 보유한다. 주요 상수:`ARRAY_SIZE_H = 32,`ARRAY_SIZE_V = 32,`ISA_WIDTH = 64,`ISA_BODY_WIDTH = 60,`SYSTOLIC_TOTAL_LATENCY = 64,`FMAP_CACHE_DEPTH = 2048,`FIXED_MANT_WIDTH = 27.kv260_device.svh— Kria KV260 물리 하드웨어 상수. HP 포트 수 4, HP 단일 폭 128비트, DSP48E2 A/B/P 포트 폭 30/18/48비트, XPM FIFO 깊이 512/16.GLOBAL_CONST.svh— 폐기 예정 shim.NUMBERS.svh+kv260_device.svh+npu_arch.svh를 순서대로 re-include하고 레거시 별칭(HP_PORT_MAX_WIDTH,DSP48E2_POUT_SIZE등)을 추가한다. 신규 코드는 이 파일 대신 각 출처 헤더를 직접 include해야 한다.DEVICE_INFO.svh— 폐기 예정 shim.kv260_device.svh를 re-include하고 레거시 별칭(DEVICE_HP_SINGLE_LANE_MAX_IN_BIT,DEVICE_HP_CNT)을 제공한다. 신규 코드에서 사용 금지.
B — device_pkg.sv (B_device_pkg/): A 헤더에 의존. 알고리즘 수준의 타입 선택을
담는 첫 번째 SystemVerilog 패키지.
C — dtype_pkg.sv, mem_pkg.sv (C_type_pkg/): B에 의존. 수치 타입 상수와
메모리 아키텍처 파라미터를 각각 분리한다.
D — vec_core_pkg.sv (D_pipeline_pkg/): A + B + C에 의존. Vector Core 설정
구조체와 기본값을 정의한다.
핵심 패키지¶
device_pkg (B_device_pkg/device_pkg.sv)
피처맵(activation) 포트 정밀도를 BF16(16비트), 내부 누산 정밀도를 FP32(32비트)로
고정하고, 파이프라인 인스턴스 수를 VecPipelineCnt = 4, MatPipelineCnt = 1로
선언한다. 모든 하위 패키지는 이 값을 참조하므로, 아키텍처 변경 시 이 파일이 첫 번째
수정 지점이 된다.
package device_pkg;
// ===| Feature Map (Activation) Type |========================================
// FmapType : port-level precision — BF16 (16-bit)
// FmapTypeMixedPrecision: internal accumulation — FP32 (32-bit)
localparam int FmapType = `N_BF16_SIZE;
localparam int FmapTypeMixedPrecision = `N_FP32_SIZE;
// ===| Weight Type |===========================================================
// INT4: 4-bit quantized weight, streamed from HP ports
localparam int WeightType = `N_SIZEOF_INT4;
// ===| Pipeline Instance Counts |==============================================
localparam int VecPipelineCnt = 4; // 4 x muV-Core (Vector Core)
localparam int MatPipelineCnt = 1; // 1 x Matrix Core (32x32 systolic)
// ===| Legacy aliases (snake_case) — keep until all RTL refs updated |=========
localparam int GemvPipelineCnt = VecPipelineCnt;
localparam int GemmPipelineCnt = MatPipelineCnt;
dtype_pkg (C_type_pkg/dtype_pkg.sv)
BF16(Bf16Width = 16, Bf16ExpWidth = 8, Bf16MantWidth = 7), 고정소수점 가수 폭
FixedMantWidth = 27, INT4(Int4Width = 4), INT8(Int8Width = 8), FP32(Fp32Width = 32), DSP48E2 P-레지스터 폭 DspPWidth = 48을 localparam으로 노출한다. 의미론적
단위 없이 순수 수치만 보유하므로 합성 타겟이 바뀌어도 이 파일만 수정하면 된다.
mem_pkg (C_type_pkg/mem_pkg.sv)
device_pkg와 kv260_device.svh에서 유도되는 메모리 파라미터를 집약한다.
HpPortCnt = 4, HpSingleWidthBit = 128, HpTotalWidthBit = 512,
HpSingleWeightCnt = 32, FmapL2CacheOutCnt = 32(= ARRAY_SIZE_H),
FmapCacheDepth = 2048, XpmFifoDepth = 512. 매직 넘버 없이 모든 값이 상위
헤더에서 파생된다.
vec_core_pkg (D_pipeline_pkg/vec_core_pkg.sv)
Vector Core 토폴로지를 서술하는 vec_cfg_t 구조체(packed struct)와 KV260 타겟 기본값
VecCoreDefaultCfg를 정의한다. GemvBatch = 512, GemvCycle = 512,
GemvLineCnt = 32. 레거시 타입 별칭 gemv_cfg_t는 마이그레이션 기간 동안 유지된다.
인터페이스 헤더¶
npu_interfaces.svh (NPU_Controller/npu_interfaces.svh)
GLOBAL_CONST.svh를 include한 뒤 두 개의 SystemVerilog 인터페이스를 정의한다.
axis_if #(DATA_WIDTH = 128) — AXI4-Stream 버스. slave modport는 tdata,
tvalid, tlast, tkeep를 입력으로, tready를 출력으로 받는다. master modport는
방향이 반전된다.
axil_if #(ADDR_W = 12, DATA_W = 64) — AXI4-Lite 제어 버스. 클록/리셋(clk,
rst_n)을 인터페이스 포트로 받는다. slave modport는 AW/W/AR 채널을 입력으로,
B/R 채널을 출력으로 구분한다.
interface axis_if #(
parameter DATA_WIDTH = 128
) ();
logic [ DATA_WIDTH-1:0] tdata;
logic tvalid;
logic tready;
logic tlast;
logic [(DATA_WIDTH/8)-1:0] tkeep;
// Slave Side (NPU Perspective: Input)
modport slave(input tdata, tvalid, tlast, tkeep, output tready);
// Master Side (NPU Perspective: Output)
modport master(output tdata, tvalid, tlast, tkeep, input tready);
endinterface
// axil_if.sv
interface axil_if #(
parameter int ADDR_W = 12,
parameter int DATA_W = 64
) (
input logic clk,
input logic rst_n
);
// AW Channel
logic [ADDR_W-1:0] awaddr;
logic [ 2:0] awprot;
logic awvalid, awready;
// W Channel
logic [ DATA_W-1:0] wdata;
logic [(DATA_W/8)-1:0] wstrb;
logic wvalid, wready;
// B Channel
logic [1:0] bresp;
logic bvalid, bready;
// AR Channel
logic [ADDR_W-1:0] araddr;
logic [ 2:0] arprot;
logic arvalid, arready;
// R Channel
logic [DATA_W-1:0] rdata;
logic [ 1:0] rresp;
logic rvalid, rready;
modport slave(
input awaddr, awprot, awvalid, wdata, wstrb, wvalid, bready,
input araddr, arprot, arvalid, rready,
output awready, wready, bresp, bvalid, arready, rdata, rresp, rvalid
);
modport master(
output awaddr, awprot, awvalid, wdata, wstrb, wvalid, bready,
output araddr, arprot, arvalid, rready,
input awready, wready, bresp, bvalid, arready, rdata, rresp, rvalid
);
endinterface
GEMM_Array.svh (MAT_CORE/GEMM_Array.svh)
npu_arch.svh를 re-include하는 호환성 shim이다. ARRAY_SIZE_H, ARRAY_SIZE_V를
npu_arch.svh에서 단일 원천화하여 재정의 경고를 막는다. MINIMUM_DELAY_LINE_LENGTH = 1, gemm_instruction_dispatcher_CLOCK_CONSUMPTION = 1은 MAT_CORE에만 적용되는
추가 상수다. 신규 MAT_CORE 모듈은 npu_arch.svh를 직접 include해야 한다.
사용 위치¶
아래 표는 소스에서 직접 확인된 import 구문과 `include 를 기준으로
각 RTL 모듈이 의존하는 패키지/헤더를 정리한다.
모듈 (코어) |
|
|
|
|
|
헤더 (include) |
|---|---|---|---|---|---|---|
|
— |
— |
— |
— |
— |
|
|
— |
o |
— |
o |
— |
|
|
— |
— |
— |
— |
o |
|
|
— |
— |
— |
— |
— |
|
|
— |
— |
— |
— |
— |
|
o = 소스에서 직접 확인된 import. — = 해당 파일에 import 없음.
GEMM_systolic_top은 패키지를 직접 import하지 않고 `define 헤더 매크로만 사용한다.
GEMV_top은 import vec_core_pkg::*;를 선언하며, 포트 폭에 dtype_pkg::Bf16ExpWidth를
참조한다. CVO_top은 import isa_pkg::*;와 import bf16_math_pkg::*;를 선언한다
(bf16_math_pkg는 라이브러리 패키지로 공유 라이브러리 페이지에서 다룬다).
ctrl_npu_dispatcher는 현재 전체가 주석 처리된 상태이므로 표에서 제외한다.
마지막 검증 대상
커밋 8c09e5e @ pccxai/pccx-FPGA-NPU-LLM-kv260 (2026-04-29).