티스토리 뷰

Study/Architecture

[Computer Architecture] Memory Technology

생각많은 소심남 2013. 11. 16. 15:46

CA 강의 보다가 Cache에 대한 내용들이 많이 나와서 몇 포스트를 통해서 정리를 해보고자 한다. 

흔히 Memory는 I/O작업에 대해서 Disk보다 엄청 빠르다고 알고 있지만 CPU 입장에서는 Memory에 직접적으로 Access해서 가져오는 Data에 대해서도 Overhead를 느낀다. 그래서  register라는 것을 Memory보다는 가깝게 CPU에 놓고 쓴다. 물론 DRAM 으로 구성된 Memory에 비하면 집적하는데 비용이 많이 들기 때문에 실질적으로 큰 양이 들어가지 않는다. 잠깐 구조를 보자.



자 이게 가장 원시적인 Register 집합, 즉 Register File이다. 논리회로를 들은 사람들은 아마 구성 소자들이 눈에 익을 것이다. 잘 보면 AND 게이트와 MUX DeMUX 등으로 구성되어 있는데 가장 중요한 것이 가운데 병렬로 놓여있는 Flip-Flop이라는 것들이다. FlipFlop은 말 그대로 뜀뛰기 하는 소자다. 그래서 보통 Clock의 Rising Edge일때 데이터를 넘겨준다던지 하는 역할을 한다. 그런데 이게 중요한 이유는 바로 기억 소자라는 특성때문이다. 소위 이전에 Data를 특정 환경에서 가지고 있다가 앞에서 말한대로 clock이 어떤 조건을 만족하면 넘겨주는 역할을 하게 되는 것이다. 자 그럼 만약 이 Register File에서 원하는 주소에 데이터를 쓰려면 어떻게 할까? 그럼 필요한 데이터가 아마 Memory상에서 불러올 주소와 그 데이터를 쓸 주소가 필요하게 된다. 그림에서는 Address라고 표현되어 있는 부분이다. 그런데 Read Address는 MUX의 write enable Signal로 들어가고 Write Address는 Decoder의 입력으로 들어간다. 그리고 잘 보면 Clock이 각각 AND에 물려있는데 다들 알다시피 입력이 둘다 True일때만 값이 넘어간다. 즉 Clock이 High level일때만 Write Address가 Decoding되서 FF에 들어갈 것이다.

 그런데 이 신호도 결국은 FF의 Enable신호로 들어간다. 다시 말해서 어떤 FF에 저장되었는 데이터를 결정해주는게 Write Address의 역할이고 Read Address에 따라 선별된 Read Data들이 Write Data로 빠져 나가게 되는 것이다. 어떻게 보면 논리 소자의 기본적인 성질을 이용해서 저장장치를 만들었다. 이걸 ASIC 차원으로 내려가면 다음과 같이 나온다. 


자 그런데 재미있는 건 어차피 Read Data나 Write Data가 앞의 그림처럼 한개의 bus로만 구현되어 있는데 우리가 원하는 건 당연히 한번에 많이 Data를 전달하는게 될 것이다. 그런데 그렇게 하기 위해서는 당연히 FlipFlop을 쭉 나열해야 되고, 그렇게 되면 전체적으로 Register File의 Size가 커질 것이다. 다르게 말하면 저런 FlipFlop이 Stack형태로 누적되면서 논리 소자내의 Aspect Ratio가 커지게 되는 것을 의미한다. 궁극적으로 설계하는 목적인, 싸고 작게 에서 크게 벗어나게 되고 저렇게 누적된 상태에선 속도도 그다지 좋지 않게 된다. 그래서 초창기에 나왔던 걸 개선한 Array형태의 Register File이 나오게 된다. 그래서 기존에 하나의 Decoder로 처리하던 역할을 Row Decoder와 Column Decoder로 나눠서 처리한다. 이때 그림을 잘 보면 알겠지만 Row Decoder로부터 나온 선이 flip Flop에 하나로 쭉 연결된 것을 볼 수 있다. 이걸 Word Line이라고 하며 이 Regiser File의 역할이 Read가 될 건지 Write가 될 건지에 따라서 신호를 다르게 주게 된다. 그게 오른쪽 그림에 나와있는 Read Word Line과 Write Word Line이다. 물론 전자회로를 더 안다면 이걸 전압차에 따라서 Read Bit Line 혹은 Write Bit Line으로부터 데이터가 전달하는 원리를 설명할 수 있겠지만 그러면 배꼽이 더 커지니까 넘어가려고 한다. 간단하게 말하면 Flip Flop 하나가 1 bit을 의미하며 다시말해서 위의 Register File은 8bit을 8개 가지는 Register File이 되는 것이다. 이렇게 만들고 이제 CPU 내의 General Purpose Register를 구성하는 것이다. 

 이건 CPU내에 들어있는 Register에 대한 이야기고 이제 이거랑 비슷한 형태의 SRAM인 Cache에 대해서 좀 보고자 한다. 옆의 그림은 똑같은데 1bit을 구성하는 memory cell들이 다르게 되어 있다.



전체적으로는 똑같은데 위와 다르게 bit line들이 중간에 있는 coupled Inverter로 연결되어 있는 것을 볼 수 있다. 이건 일종의 decoder로도 동작할 수 있는데 매우 민감한 차이까지도 감지할 수 있어서 다른 말로 Sense Amplifer라고도 표현한다. 그래서 SRAM에는 이 Sense Amplifer를 Column Decoder로 사용한다. 그냥 여담 정도이고, 구글 통해서 찾아보면 관련 정보들이 많이 있다. 

 사실 앞에서 소개한 Register File과 SRAM의 차이는 bit 의 reusable이다. register File의 cell의 입력은 Write BitLine이나 read BitLine을 통해서 들어간다. 그래서 Multi port로 구성되는데 비해서 SRAM은 그냥 단순히 Read나 Write로 나눠진게 아닌 단순히 bit Line으로만 데이터가 전달된다. 다시말해서 Write나 Read나 같은 Path를 거치게 된다는 것이다. 즉, single port로 구성할 수 있다는 것이다. 결국 Single-ported SRAM은 아주 고밀도로 뭉치면서 Cache를 구성하게 된다.

자 그럼 마지막으로 Memory를 구성하는 DRAM이다. 이것도 역시 Array형태를 띄면서 cell구성만 다르다.


엄청 단순하다. 그냥 Bit Line하나에 WordLine에 의해서 값이 Capacitor에 저장되냐 마냐가 결정되는 것이다. 앞에서 나온 소자들에 비해서 구성도 매우 간단하고 이때문에 싸다. 당연한 이야기이겠지만 Capacitor는 두개의 metal plate와 중간의 dielectric element로 구성된다. 그런데 위와 같은 형태는 앞에서 말한 CMOS형태가 아니기 때문에 만드는 공정도 다를거다 아마..

아무튼 앞에서 언급한 것들에 비해서 많은 양의 Data를 가지고 있을 것이고, 그 이유는  Capacitor자체의 Charge Storing 특성이 Register File나 Cache에 들어있는 FlipFlop보다 훨씬 크기 때문이다. 그래서 한 bit을 저장하는데 space도 적게 들 것이고, 고밀도로 집적해서 비교하면 어마어마하게 가지고 있게 된다. 그런데 당연히 단점도 있다. Capacitor를 통해서 Data를 저장하게 되면 특성에 의해서 데이터가 자연적으로 없어진다. 그래서 원래 저장한 데이터와 달라지는 경우가 발생하게 된다. 이 때문에 DRAM의 경우엔 데이터를 계속 유지하기 위해서 Refresh라는 과정을 거치게 된다. 이게 옛날에는 큰 문제로 작용했는데 요즘에는 기술이 발전해서 이 단점이 보완되었다. 

그래서 위에 언급한 내용들을 요약하면 다음과 같게 된다. 결국 우리가 사용할 정보가 이것이다.


사실 지금까지 다루고 있는 내용들을 쭉 보면 왜 Cache에 대한 이야기를 하다가 이런 보기 힘든 논리소자를 보고 있는건지 의문일 수도 있다. 그런데 사실 이런 연유에서 Cache가 Memory에 비해서 빠른 성능을 보이고, 왜 크기를 무작정 늘릴 수 없는 것인지에 대해 이유를 찾아볼 수 있기 때문에 다루는 게 필요한거 같다. 아무튼 당분간 Cache에 대해서 조금더 정리해보고 올려보고자 한다. 

reference:

   - Coursera Computer Architecture Class : https://www.coursera.org/course/comparch

댓글