해결된 질문
작성
·
15
0
tpsram 내부를 보면 오른쪽 처럼 되어있는데, always 구문을 구분해서 사용하는 이유가 있을까요? 왼쪽 구문처럼 하나의 always 문으로 구성해도 동일한 tpsram인지 궁금합니다 !
답변 2
0
안녕하세요, 답변 남겨드립니다.
질문 주신 TPSRAM 내부 코드에서 always 구문을 나누는 이유는 단순히 가독성 때문만은 아니고, 합성기(synthesizer)와 시뮬레이터의 동작 일관성을 보장하기 위함입니다.
SRAM이나 TPSRAM 같은 메모리 모델은 보통 read와 write가 동시에 발생할 수 있고, clock edge에 따라 메모리 셀의 상태가 달라집니다. 이때 하나의 always 블록에 read와 write 동작을 모두 넣을 수는 있지만, 실제 합성된 하드웨어 구조는 다르게 표현될 수 있습니다. 예를 들어 다음과 같은 차이가 있습니다.
하나의 always 블록에서 write와 read를 모두 처리하면, 같은 clock edge에서 write가 발생하는 경우 read 데이터가 old data인지 new data인지 정의가 애매해질 수 있습니다. 실제 silicon SRAM의 경우에는 보통 "write-first" 또는 "read-first" 모드로 동작이 명확히 정의되어 있습니다. 따라서 RTL에서도 이를 분리하여 표현해야 시뮬레이션과 합성 결과가 일치합니다.
두 개의 always 블록으로 나누는 방식은 하나는 메모리 쓰기 동작을, 다른 하나는 출력 레지스터 업데이트를 담당하게 함으로써 timing semantics를 명확히 합니다. 이렇게 하면 "write collision" 상황에서 어떤 데이터가 read되는지 명확하게 기술할 수 있고, 합성기에서도 해당 구조를 RAM inference 규칙에 맞게 인식합니다. 실제로 Xilinx나 Synopsys Design Compiler 같은 툴의 RAM inference 가이드라인을 보면, read와 write를 분리한 coding style을 권장하고 있습니다.
예를 들어 TPSRAM 모델을 작성할 때 보통 다음 두 가지 경우를 구분합니다.
write 전용 always 블록:
always @(posedge clk) if (we) mem[addr] <= din;
read 전용 always 블록:
always @(posedge clk) dout <= mem[addr];
이런 구조로 나누면 합성 툴이 이를 단일 포트 동기식 SRAM으로 잘 매핑합니다. 만약 이를 하나의 always 블록에 합치면, 합성 결과가 단순한 레지스터 뭉치로 구현될 수 있고, 실제 silicon SRAM과는 다른 동작을 보일 수 있습니다.
즉, 질문 주신 "왼쪽 코드처럼 하나의 always 문으로 구성해도 동작은 비슷해 보일 수 있지만, 실제 합성된 결과물이 TPSRAM이 아닐 가능성이 높습니다". 실무에서는 반드시 read와 write 동작을 분리하여 always 블록을 작성하는 것을 권장합니다.
0
안녕하세요, 인프런 AI 인턴입니다. rnjstns0721님.
TPSRAM 설계에 대한 궁금증을 풀어드리겠습니다. 말씀하신대로, TPSRAM의 동작을 구현할 때 always
구문을 하나로 묶어 사용하거나, 여러 개로 나누어 사용할 수 있습니다. 각각의 방법에 따라 구조와 동작에서 차이가 있을 수 있는데요:
we
(write enable)과 re
(read enable)를 각각 조건문으로 처리하여 동시에 동작하지 않게 설정할 수 있습니다.각 방법은 설계자에게 편리함을 제공하며, 의도한 TPSRAM의 특성과 요구사항에 따라서 적절하게 선택할 수 있습니다. 항상 의존해야 할 점은 동시 동작의 방지와 신뢰성 있는 데이터 처리가 가능하도록 하는 것입니다.
더 자세한 정보나 유사한 예제를 알고 싶으시다면 이 게시물을 확인해 보세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.