해결된 질문
작성
·
34
0
SRAM에 대한 내용에서 SRAM의 write 동작은 다음 cycle에 메모리에 값이 저장되고, read 동작은 다음 cycle이 아닌 해당 cycle에서 바로 읽어온다고 배웠던 것 같은데,
SRAM 기본 모델링 코드로 시뮬레이션을 돌렸을 때 read 동작에서 다음 cycle에 dout에 값이 읽히는 걸 볼 수 있었습니다.
cs==1 이면 dout에 '다음 cycle'에 값이 뜨는데, 이 동작은 SRAM 이론시간에 배웠던 "read 동작은 해당 사이클에 바로 읽을 수 있다"라는 내용과 다른 점이 무엇인지 궁금합니다.
(물론 코드 상으로는 dout<= mem[ad] 로 작성했기때문에 당연히 그 다음 posedge clk에 값이 업데이트되는게 맞지만,
SRAM 이론을 배울 때 들은 내용과 헷갈려서 질문 드립니다.)
답변 1
0
안녕하세요, 답변 남겨드립니다.
SRAM을 이론적으로 배울 때 흔히 말하는 “읽기(read)는 해당 사이클에서 바로 가능하다”라는 설명은 비동기(asynchronous) SRAM 혹은 순수 이론적 타이밍 관점에서의 이야기일 때가 많습니다. 반면, 실제 설계나 HDL 모델링에서 주로 쓰는 동기(synchronous) SRAM 모델에서는 클록 엣지에 맞춰 내부 동작이 진행되기 때문에, 읽기(read) 결과가 다음 사이클에서야 dout
에 반영되는 것이 일반적입니다.
1. 이론 시간의 “동일 사이클에 읽기 가능” 의미
- 비동기 SRAM이나 순수 이론 타이밍 설명에서는, 주소(ad)가 안정되고 칩이 활성화되면(Chip Select 등) 일정 접근 시간(access time) 후 바로 출력 노드에 읽을 데이터가 나타난다고 설명합니다.
- 즉, 클록과는 상관없이 주소가 바뀐 직후(또는 충분한 접근 시간 후)에 데이터가 바로 나온다는 뜻입니다.
2. 실제 동기식 SRAM 모델의 동작
- 동기식 SRAM(Synchronous SRAM) 은 클록(보통 posedge clk
)을 기준으로 내부 데이터 래치(latch)나 레지스터가 업데이트됩니다.
- 예를 들어 Verilog/Python 등의 모델에서 dout <= mem[ad]
를 클록 이벤트마다 동작하도록 작성하면, 현재 클록 엣지에서 주소가 주어지고, 다음 클록 엣지에 데이터가 출력되도록 구현됩니다.
- 즉, 이론적으로는 주소가 주어지면 그 즉시 또는 같은 사이클 내에 내부에서 “읽기 액션”을 수행하지만, 출력 레지스터(dout)가 업데이트되는 시점은 다음 클록이 됩니다.
3. 차이가 발생하는 이유
1. 모델 차이(비동기 vs 동기)
- 이론 교과서에서 나오는 “해당 사이클에 바로 읽는다”는 설명은 대개 비동기 SRAM의 접근 시간(access time) 관점입니다.
- 실제 디지털 설계 혹은 실습용 코드에서 많이 쓰는 동기식 SRAM은 클록을 기준으로 읽기/쓰기를 동작시키므로, 읽은 값을 버퍼나 레지스터를 통해 다음 클록에 출력하는 방식입니다.
2. 출력에 레지스터를 두어 타이밍·안정성 확보
- 실제 칩 설계에서는 타이밍 제약을 만족하고 파이프라이닝(pipelining) 효율을 높이기 위해, 내부 데이터를 바로 패드나 신호선에 내보내기보다 출력 레지스터로 한 사이클 늦춰서 배출하기도 합니다.
- 이는 전체적인 동작 속도와 신뢰성을 높이기 위한 합리적인 설계 기법입니다.
정리하자면,
- 교재에서 간단히 설명되는 “SRAM 읽기는 즉시 가능”이라는 말은 주로 비동기적 SRAM 모델에서의 이론적 접근 시간 개념입니다.
- 실제 설계나 동기 모델로 구현한 코드에서는 클록 엣지마다 내부 동작이 수행되고, 그 결과를 다음 사이클에 확인할 수 있게 만듭니다.
- 따라서 시뮬레이션에서 *dout
에 값이 뜨는 시점**이 다음 사이클로 지연되는 것은 지극히 정상적인 동기 SRAM 동작이라 보시면 됩니다.