📌 𝐑𝐀𝐌 𝐑𝐞𝐚𝐝-During-Write: same-address collision is part of the interface
Synchronous RAM same-port read-during-write collision semantics and portability

Synchronous RAM에서 같은 rising edge에 address A를 write하면서 같은 address를 read할 때, Q가 무엇을 내보내는지는 구현 세부사항이 아니라 interface contract입니다. 기존 MEM[A]를 OLD, 입력 DIN을 NEW, 직전 출력 Q를 HELD라고 두면 세 모드는 이렇게 나뉩니다.
WRITE_FIRST: 메모리는NEW로 갱신되고Q도NEW를 냅니다.READ_FIRST: 메모리는NEW로 갱신되지만Q는 기존 값OLD를 냅니다.NO_CHANGE: 메모리는NEW로 갱신되고Q는 이전 출력HELD를 유지합니다.
간단한 single-port WRITE_FIRST RTL은 write cycle에 출력 register에 DIN을 직접 전달합니다.
always_ff @(posedge clk) begin
if (we) begin
mem[addr] <= din;
q <= din; // WRITE_FIRST
end else begin
q <= mem[addr];
end
end
READ_FIRST는 write와 동시에 q <= mem[addr]를 실행해 old word를 출력하고, NO_CHANGE는 write cycle에 q를 갱신하지 않습니다. 메모리 array와 output register의 nonblocking assignment를 함께 읽는 RTL에서는 이 차이가 합성 후 primitive 설정으로도 이어지는지 확인해야 합니다.
주의할 점은 세 모드 이름이 모든 RAM에 동일한 collision 보장을 주지 않는다는 겁니다. FPGA에서도 block RAM과 UltraRAM의 지원 모드가 다를 수 있고, dual-port의 same-port와 mixed-port collision은 별도 규칙입니다. ASIC SRAM macro는 해당 compiler의 data sheet가 기준입니다.
예를 들어 AMD UG901은 UltraRAM true dual-port에서 NO_CHANGE만 지원한다고 명시하고, 같은 주소를 동시에 읽고 쓰면 RTL과 post-synthesis simulation이 다를 수 있다고 경고합니다. Intel Agilex 3 문서는 mixed-port collision에 New Data, Old Data, Don't Care 동작을 구분합니다. 같은 이름만 보고 이식하면 안 되는 이유입니다.
실무 체크는 세 가지입니다. (1) wrapper/API에 same-address collision 결과를 명시하고, (2) 가능하면 dual-port 충돌을 막거나 forwarding/arbitration으로 정의하고, (3) synthesis report와 실제 macro/primitive 설정을 확인하세요. 시뮬레이션 model이 정한 값을 silicon이 보장한다고 가정하지 마세요.
한 줄 요약: memory collision policy는 주석이 아니라 검증해야 할 기능입니다.
출처:
• AMD Vivado UG901 (2026.1), Block RAM Read/Write Synchronization Modes: https://docs.amd.com/r/en-US/ug901-vivado-synthesis/Block-RAM-Read/Write-Synchronization-Modes
• AMD Vivado UG901 (2026.1), Inference Capabilities: https://docs.amd.com/r/en-US/ug901-vivado-synthesis/Inference-Capabilities
• AMD Vivado UG974 (2026.1), RAMB36E2 WRITE_MODE behavior: https://docs.amd.com/r/en-US/ug974-vivado-ultrascale-libraries/RAMB36E2
• Intel Agilex 3 Embedded Memory User Guide (25.1), Mixed-Port Read-During-Write Mode: https://www.intel.com/content/www/us/en/docs/programmable/849316/25-1/mixed-port-read-during-write-mode.html