디지털 회로 설계(Digital Design)에서 로직(Logic)만큼이나 중요한 것이 바로 데이터를 저장하는 메모리(Memory)입니다. FPGA나 ASIC 설계를 하다 보면 단순히 reg나 D-FlipFlop을 사용하는 것을 넘어, 대용량 데이터를 효율적으로 관리하기 위해 SRAM(Static Random Access Memory)을 반드시 사용하게 됩니다.
하지만 막상 메모리를 인스턴스(Instantiation) 하려고 IP Catalog를 열거나 Memory Compiler 스펙을 보면, Single Port, Simple Dual Port, True Dual Port 등 다양한 옵션 앞에서 혼란을 겪기 쉽습니다.
이번 글에서는 엔지니어의 관점에서 SRAM이 레지스터와 어떻게 다른지, 그리고 포트(Port) 구성에 따라 어떤 종류가 있으며 언제 사용해야 하는지 명확하게 정리해 보겠습니다.
1. D-FlipFlop(Register) vs SRAM: 왜 SRAM을 쓰는가?
디지털 논리회로 수업 시간에 가장 먼저 배우는 저장 소자는 래치(Latch)와 플립플롭(Flip-Flop)입니다. 그런데 칩 내부에서 왜 굳이 복잡한 SRAM 블록을 따로 사용할까요? 핵심은 면적 효율(Density)에 있습니다.
- D-FlipFlop (Register): 1비트를 저장하기 위해 보통 20~30개 이상의 트랜지스터가 필요하며, 클럭 라우팅과 리셋 로직 등으로 인해 면적을 많이 차지합니다. 대신 속도가 매우 빠르고 값을 바로 꺼내 쓸 수 있습니다.
- SRAM (Static RAM): 1비트를 저장하는 데 표준적으로 6개의 트랜지스터(6T Cell)만 사용합니다. 래치 구조를 서로 맞물려 놓은 형태이며, Refresh가 필요한 DRAM과 달리 전원만 공급되면 데이터가 유지됩니다.
만약 1MB(약 8백만 비트) 용량의 데이터를 Flip-Flop으로만 구현한다면, 칩 면적의 대부분을 차지하여 비효율적일 것입니다. 따라서 적은 용량과 빠른 제어는 Register로, 대용량 데이터 저장은 SRAM으로 나누어 설계하는 것이 기본 원칙입니다.
2. SRAM의 동작 원리와 Port의 개념
SRAM은 데이터를 저장하는 ‘Cell Array’와 외부와 소통하는 ‘Interface’로 구성됩니다. 이 인터페이스를 우리는 포트(Port)라고 부릅니다.
포트는 기본적으로 다음 신호들의 묶음입니다.
- Address: 데이터가 저장된 위치 주소
- Data In/Out: 쓰고 읽을 데이터
- Control: Enable(활성화), Write Enable(쓰기 제어), Clock
포트가 많을수록 동시에 여러 작업을 수행할 수 있어 대역폭(Bandwidth)이 늘어나지만, SRAM Cell 내부의 배선이 복잡해져 면적이 커지는 단점이 있습니다. 따라서 설계 목적에 딱 맞는 최소한의 포트 구성을 선택하는 것이 중요합니다.
3. 기능에 따른 SRAM의 3가지 분류
설계 툴(Vivado, Quartus, Memory Compiler 등)에서 가장 흔하게 접하는 세 가지 유형을 상세히 알아보겠습니다.
① Single Port (1RW)
가장 기본적이고 면적이 작은 형태입니다. 하나의 포트만 존재하므로, 한 클럭 사이클에 ‘읽기(Read)’ 또는 ‘쓰기(Write)’ 중 딱 하나만 수행할 수 있습니다.
- 특징:
- Address 버스가 하나입니다.
- Data In과 Data Out 포트가 분리되어 있을 수도, 하나로 합쳐져 있을 수도(Bi-directional) 있습니다.
- 면적(Area)이 가장 작습니다 (High Density).
- 언제 쓰는가?
- 동시 접근이 필요 없는 경우.
- CPU의 Instruction Memory처럼 주로 읽기만 하는 경우.
- Look-up Table (LUT) 용도.
- 면적을 최소화해야 하는 대용량 버퍼.
② Simple Dual Port (Pseudo Dual Port / 1R1W)
‘Simple’이라는 단어 때문에 기능이 적어 보이지만, 실제로는 FIFO(First-In First-Out) 설계의 핵심이 되는 매우 중요한 구조입니다. FPGA에서는 종종 Pseudo Dual Port라고도 불립니다.
- 구조: 두 개의 포트(Port A, Port B)를 가집니다.
- Port A: 쓰기 전용 (Write Only)
- Port B: 읽기 전용 (Read Only)
- 특징:
- 서로 다른 주소에 대해 동시에 읽고 쓰기가 가능합니다.
- Single Port보다는 크지만 True Dual Port보다는 작습니다.
- 언제 쓰는가?
- FIFO: 한쪽에서는 데이터를 계속 쌓고(Write), 다른 쪽에서는 계속 꺼내가는(Read) 구조에 최적화되어 있습니다.
- 데이터 로깅 시스템.
③ True Dual Port (2RW)
가장 유연하지만, 가장 비싼(면적과 전력 측면에서) 구조입니다. 두 개의 포트가 완전히 독립적으로 동작합니다.
- 구조: Port A와 Port B가 완벽하게 대칭입니다.
- Port A: Read / Write 모두 가능
- Port B: Read / Write 모두 가능
- 특징:
- 두 포트가 서로 다른 주소에 대해 동시에 Write/Write, Read/Read, Read/Write가 가능합니다.
- 주의점(Collision): 만약 두 포트가 ‘동일한 주소’에 동시에 쓰기를 시도하거나, 한쪽은 쓰고 한쪽은 읽으려 하면 데이터가 깨지거나 알 수 없는 값(Unknown)이 될 수 있습니다. 이를 방지하기 위한 충돌 방지 로직(Collision Avoidance Logic)이 필요할 수 있습니다.
- 언제 쓰는가?
- Shared Memory: 두 개의 서로 다른 마스터(예: CPU와 하드웨어 가속기)가 하나의 메모리를 공유하며 데이터를 주고받을 때.
- 복잡한 캐시(Cache) 구조나 스크래치패드 메모리.
4. 요약 및 비교
| 구분 | 포트 구성 | 동시 동작 | 주요 용도 | 면적(상대적) |
| Single Port | 1개 (RW 공용) | 불가 (R or W) | LUT, 단순 버퍼 | Small |
| Simple Dual Port | 2개 (1 Write, 1 Read) | 가능 (Write & Read) | FIFO, 버퍼링 | Medium |
| True Dual Port | 2개 (2 RW) | 가능 (Any Mix) | 멀티 프로세서 공유 메모리 | Large |
5. 마무리
SRAM을 선택할 때는 무조건 기능이 많은 True Dual Port를 고르는 것이 능사가 아닙니다. True Dual Port는 Single Port 대비 면적이 약 2배 가까이 커질 수 있으며, 전력 소모도 큽니다. 따라서 설계하려는 모듈의 데이터 흐름(Data Flow)을 정확히 파악하여 꼭 필요한 포트 구성을 선택하는 것이 최적화의 첫걸음입니다.
참고: AMD