𝗙𝗣𝗚𝗔 𝗕𝗥𝗔𝗠 │ FIFO 리셋에서 메모리 전체를 0으로 지워야 할까?
Reset scope in inferred FPGA FIFO RAM: clear logical validity/control, not every data word

FIFO를 넣은 뒤 합성 결과를 보니 BRAM 대신 레지스터가 크게 늘었습니다. 원인을 따라가면 reset 때 for 루프로 모든 mem[i]를 0으로 만드는 코드가 있을 때가 있습니다.
1,024개 × 16비트 FIFO라면 저장 공간만 16,384비트입니다. reset의 목적이 “FIFO를 비운다”인데, 이 비트 전부를 같은 edge에 0으로 만들도록 요구하면 메모리 primitive가 제공하는 동작과 맞지 않을 수 있습니다. AMD UG949는 array에 잘못 놓인 reset 하나가 block RAM 한 개로 추론될 설계를 수천 개의 레지스터로 바꿀 수 있다고 경고합니다.
여기서 구분할 것은 물리적 내용과 논리적 유효성입니다. 한 clock의 FIFO를 reset한 뒤 rd_ptr=0, wr_ptr=0, count=0이면 FIFO는 비어 있습니다. 메모리 셀에 reset 이전 값이 남아 있어도, empty=1인 동안 읽기를 허용하지 않으면 그 값은 유효한 데이터가 아닙니다. 첫 write가 들어온 뒤에야 해당 위치를 읽을 수 있게 됩니다.
출력 포트의 0이 꼭 필요한 경우도 있습니다. 그 요구는 array 전체의 0 초기화와 분리해서 다뤄야 합니다. AMD UG901에는 RAM 내용은 reset하지 않고, 동기식 clock edge에서 data output만 0으로 reset하는 BRAM 추론 예제가 있습니다. UG949에 따르면 출력 레지스터를 RAM primitive 안에 넣으려면 그 reset은 동기식이어야 합니다. 비동기 reset을 붙이면 해당 출력 레지스터는 primitive 밖에 남을 수 있습니다.
실무에서는 먼저 reset 직후의 계약을 적어 보세요. “empty인 동안 read 금지”면 pointer·count 같은 유효성 상태만 reset하는 쪽을 검토합니다. “출력이 반드시 0”이면 출력단의 reset 또는 마스킹을 따로 설계하고, latency와 timing을 확인합니다. 합성 후에는 BRAM/FF 사용량과 실제 추론된 RAM 구조를 확인해야 합니다. 메모리를 안 지우는 설계에서는 빈 FIFO를 읽지 않는다는 검증도 함께 필요합니다.
이 설명은 AMD Vivado에서 추론하는 FPGA RAM과 한 clock의 FIFO를 기준으로 합니다. ASIC SRAM macro의 reset 기능과 FPGA 제품군별 primitive 제약은 별도로 확인해야 합니다.
근거: AMD UG949 (2026.1), Resets / Checking for Reset Signals on the Address/Read Data Registers; AMD UG901 (2026.1), Single-Port Block RAM with Resettable Data Output (Verilog)
https://docs.amd.com/r/en-US/ug949-vivado-design-methodology/Resets
https://docs.amd.com/r/en-US/ug949-vivado-design-methodology/Checking-for-Reset-Signals-on-the-Address/Read-Data-Registers
https://docs.amd.com/r/en-US/ug901-vivado-synthesis/Single-Port-Block-RAM-with-Resettable-Data-Output-Verilog