#fpga/asic 수정: 2026-10-19

Vivado FPGA 내부 RAM 구성과 COE 초기화 방법

Vivado에서 추론형 RAM, XPM_MEMORY_SPRAM, Block Memory Generator의 역할을 구분하고 COE 초기값을 적용하는 방법입니다.

Vivado 내부 RAM은 RTL에서 메모리를 추론시키거나 XPM macro 또는 Block Memory Generator IP로 구성할 수 있다. COE 파일은 Block Memory Generator 같은 IP 초기화에 쓰며, RAM 구현 방식과 초기화 형식은 별도로 선택해야 한다.

어떤 방식으로 RAM을 만들까

방식 선택 기준
RTL memory inference 일반적인 메모리 동작을 RTL로 표현하고 합성기가 대상 FPGA에 맞게 자원을 선택하게 할 때
XPM memory macro AMD FPGA용 메모리의 포트, latency, write mode 같은 동작을 명시적으로 설정할 때
Block Memory Generator Vivado IP 설정 화면에서 메모리 구조와 포트를 지정하거나 COE 초기화 파일을 연결할 때

합성 결과에서 LUT RAM 또는 block RAM 중 무엇을 사용했는지 확인한다. 추론 결과는 RTL 형태, 설정, 대상 FPGA와 합성 결과에 따라 달라질 수 있으므로 코드만 보고 자원 종류를 단정하지 않는다.

xpm_memory_spram은 XPM의 single-port RAM macro 이름이다. 여기서 MEMORY_SIZE는 byte가 아니라 bit 단위이며, 데이터 폭이 8bit이고 depth가 2048이면 MEMORY_SIZE는 16384bit다. 원문 코드의 ADDR_WIDTH_A(11)은 2048개 주소를 나타내지만 MEMORY_SIZE(2048)은 전체 크기를 2048bit로 지정하므로 둘이 맞지 않는다. 원문 코드를 그대로 복사하지 말고 폭, 주소 폭, 전체 bit 수를 함께 계산한다.

COE 파일로 Block Memory 초기화

Block Memory Generator에서 초기값을 넣을 때 사용하는 COE 형식은 memory_initialization_radix와 memory_initialization_vector다. 아래 예는 주소 0부터 다섯 개의 8-bit 값을 넣는다.

memory_initialization_radix=16;
memory_initialization_vector=
00,
11,
22,
33,
ff;

memory_initialization_radix에는 2, 10, 16을 사용할 수 있다. 첫 번째 값이 주소 0에 들어가고 마지막 값 뒤에는 세미콜론을 붙인다.

파일 확장자는 .coe로 저장한다. 값의 폭과 개수는 설정한 memory width와 depth에 맞춘다. COE는 일반적인 HDL memory initialization syntax가 아니라 Vivado IP에서 읽는 파일 형식이다.

IP에 초기화 파일 연결하기

Block Memory Generator의 Other Options에서 Load Init File을 선택한다. Browse로 COE 파일을 지정한다.

Vivado Block Memory Generator에서 COE 초기값 파일을 편집하는 화면

Edit을 누르면 radix와 vector를 확인하거나 수정할 수 있다. 화면의 Validate로 형식을 확인한 뒤 IP output products를 다시 생성한다. XPM이나 inferred RAM을 선택했다면 해당 방식의 HDL 초기화 방법과 합성 지원 조건을 따르고, COE를 그대로 적용할 수 있다고 가정하지 않는다.

다른 COE 예제를 복사할 때 주의

COE 문법은 IP 종류에 따라 다르다. 원문에 함께 적었던 아래 형식은 Bit Correlator용이다.

radix=16;
pattern=...;

Block Memory 초기화에는 이 형식을 사용하지 않는다. AMD 문서에서 현재 사용하는 IP에 해당하는 예제를 골라야 한다.

확인

behavioral simulation에서 주소 0부터 기대한 값이 나오는지 먼저 본다. 메모리 전체 크기는 data width × depth로 bit 수를 계산한 뒤 byte로 환산한다. bitstream까지 다시 만들었다면 FPGA에서도 read address와 output timing을 확인한다.

스크린샷에는 COE Editor에서 00 01 02 ... 0A를 입력한 기록이 있다. 실제 합성 후 메모리 출력은 이번에 다시 확인하지 않았다.

공식 자료

원문 기록

한 줄 요약

RAM 구현은 추론형 RTL, XPM, Block Memory Generator 중 필요한 제어 수준으로 고르고, COE를 쓸 때는 설정한 width와 depth에 맞춰 초기값을 검증한다.

광고