---
title: "FPGA packing에서 LUT와 FF 개수만 같아도 필요한 블록 수가 달라진다"
author: "브레이브브라우저쓰자"
published_at: "2026-11-03T03:22:04.639Z"
updated_at: "2026-10-06T03:38:12.001Z"
tags: ["fpga packing"]
canonical_url: "https://ariser.io/@writer_a9817d5a8de0/fpga-packing%EC%97%90%EC%84%9C-lut%EC%99%80-ff-%EA%B0%9C%EC%88%98%EB%A7%8C-%EA%B0%99%EC%95%84%EB%8F%84-%ED%95%84%EC%9A%94%ED%95%9C-%EB%B8%94%EB%A1%9D-%EC%88%98%EA%B0%80-%EB%8B%AC%EB%9D%BC%EC%A7%84%EB%8B%A4"
ai_assisted: true
---

# FPGA packing에서 LUT와 FF 개수만 같아도 필요한 블록 수가 달라진다

이 글은 AI가 활용됐습니다.

[원문](https://ariser.io/@writer_a9817d5a8de0/fpga-packing%EC%97%90%EC%84%9C-lut%EC%99%80-ff-%EA%B0%9C%EC%88%98%EB%A7%8C-%EA%B0%99%EC%95%84%EB%8F%84-%ED%95%84%EC%9A%94%ED%95%9C-%EB%B8%94%EB%A1%9D-%EC%88%98%EA%B0%80-%EB%8B%AC%EB%9D%BC%EC%A7%84%EB%8B%A4)

LUT 네 개와 FF 네 개를 가진 두 회로라면 같은 수의 FPGA 블록을 쓸까? 블록당 LUT·FF가 두 쌍씩 들어간다는 설명만 읽으면 두 블록이면 충분해 보인다. FPGA packing에서는 각 쌍의 기능과 함께 shared clock, enable, 내부 연결의 조건이 맞아야 한다.

## 자원 목록보다 연결 가능한 조합을 본다

LUT가 FF의 D 입력을 직접 만드는 구조를 생각하자. 두 atom을 같은 작은 logic element에 넣을 수 있으면 내부 연결을 활용할 수 있다. 그러나 가까이 있다는 이유로 서로 아무 LUT와 FF를 짝지어도 되는 것은 아니다. 원래 netlist의 기능과 control을 보존해야 한다.

VTR의 pack pattern은 구조에 맞는 atom 그룹을 molecule로 다룬다. 문서는 LUT→FF를 예로 들며, 같은 LUT에 FF 여러 개가 연결돼도 모두 하나의 짝으로 합쳐지는 것은 아님을 설명한다. [VTR Pack Patterns](https://docs.verilogtorouting.org/en/latest/arch/reference/)

이 설명은 이미 존재하는 연결을 유지하며 맞는 그룹을 찾는 과정이다. pattern 이름을 선언했다고 물리 블록에 없던 배선이나 clock 자원이 새로 생기지는 않는다.

## 두 쌍을 담는 가상 블록의 제약

계산용 블록을 정의하자. 한 블록에는 logic element 두 개가 있고, 각 element는 LUT 하나와 FF 하나를 담는다. 블록 안의 FF들은 하나의 clock net과 하나의 enable net을 공유한다. net이 같아야 한다는 조건이며, 파형이 가끔 같아 보이는 다른 net을 합친다는 뜻은 아니다.

FF에는 각자 앞의 LUT가 연결돼 있고, reset은 모두 같은 비활성 조건이라고 정한다. FF나 LUT를 제거하거나 retiming하지 않고 네 쌍을 배치한다. 실제 FPGA의 모든 control-set 규칙을 이 단순 모형으로 나타낸 것은 아니다.

첫 회로는 두 쌍이 (clock A, enable E0), 다른 두 쌍이 (clock B, enable E0)을 사용한다. 같은 control의 두 쌍을 묶으면 두 블록이면 충분하다. LUT 네 개와 FF 네 개를 모두 채운다. 서로 다른 clock의 쌍을 먼저 한 블록에 넣으려 하면 공유 clock 조건을 만족하지 못한다.

## 같은 개수에서 세 블록이 필요한 경우

두 번째 회로는 두 쌍이 (A,E0), 한 쌍이 (A,E1), 한 쌍이 (B,E0)을 사용한다. 세 control 그룹 사이에는 같은 블록에 들어갈 수 없는 조합이 있다. 각 그룹을 최대 두 쌍씩 담으면 필요한 블록 수는 ceil(2/2)+ceil(1/2)+ceil(1/2)=3이다.

그룹마다 한 블록씩 사용하면 실제로 들어가므로, 이 가상 조건에서는 세 개가 필요하며 충분하다. 단순한 atom 수의 하한 ceil(4/2)=2는 control 제약을 빠뜨렸다. 사용한 세 블록에는 element가 여섯 개 있는데 쌍 네 개만 채우므로 쌍 기준 이용률은 4/6, 약 66.7%다.

빈 element가 있다고 무관한 control의 FF를 넣을 수는 없다. LUT를 다른 곳으로 보내거나 enable을 D 입력 logic으로 바꾸는 방법을 고려할 수는 있지만, 그 변환은 기능·timing·전력 조건을 다시 확인해야 하는 별도 설계 선택이다. 원래 계약을 유지한 packing의 자원 계산에서 먼저 가정하지 않는다.

## 함께 넣는 것의 시간 이득도 조건부다

자체 비교에서 한 LUT→FF 연결의 내부 delay를 0.10ns, 분리된 블록 간 경로를 0.60ns로 지정하면 같은 경로에서 0.50ns를 줄일 여지가 있다. 하지만 이것은 연결 한 개의 계산이다. 다른 consumer까지의 fanout, 입력 경로와 clock 관계를 포함한 전체 critical path가 같은 만큼 개선된다는 뜻은 아니다.

두 atom을 묶으면서 다른 연결을 길게 만들 수도 있다. 반대로 요소 이용률을 조금 낮추더라도 관심 timing 경로를 가깝게 놓는 배치가 유용할 수 있다. 밀도와 timing은 실제 내부 연결과 외부 routing을 같이 본 뒤 평가한다.

디버깅할 때는 총 LUT·FF 수보다 먼저 어떤 그룹이 들어가지 못했는지 찾는다. control net, 입력 핀 수, 내부 경로, 선택한 모드를 적으면 ‘아직 빈칸이 있는데 왜 블록이 늘었나’라는 질문에 구체적인 답이 생긴다.

FPGA packing의 결과는 atom 개수와 조합 가능 조건의 교집합이다. 각 atom이 어느 자원을 쓰는지 센 다음, 함께 놓을 수 있는 연결과 control 그룹을 확인한다. 빈칸의 수와 사용할 수 있는 빈칸의 수를 구분해야 실제 블록 수와 timing을 설명할 수 있다.

