책/NandToTetris

3. 메모리 - 개념

jylee3 2024. 10. 29. 17:29

이제부턴 반말로 말할 예정!!

이번 장에선 논리 게이트를 이용해 일정 시간 동안 값을 저장하는 방법과 다른 값들을 설정할 때까지 그 값들을 유지하는 방법을 배울거야.

이전 까진 조합 칩(combinational chip)을 만들었어.

이번 장에서는 메모리 칩 중 하나인 순차 칩(sequential chip) 을 만들거야

  • 순차 칩
    • 현재 시점의 입력 뿐 아닌 이전 입력, 출력에도 영향을 받는다.

How??

클록 을 통해 모델링 하자! 틱의 시작과 다음 톡의 종료 사이의 시간을 주기라 하는데 이 주기가 컴퓨터의 모든 메모리 칩의 작동을 조정하는 역할을 해


3.1 메모리 장치

데이터 플립 플롭(data flip-flop, DFF)

컴퓨터 프로그램은 시간이 지나도 데이터를 유지하는 변수, 배열, 객체와 같은 추상적인 개념들을 활용해. 그리고 이 데이터 상태를 유지하기 위해 하드웨어 플랫폼에 상태 유지를 위한 메모리 장치들을 만들지.

우리는 무언가를 기억하는 능력을 당연하게 여기지만 현실에서 이를 구현하기는 매우 어려워. 따라서 우리는 이를 구현하기 위해 시간의 진행을 모델링하는 방법과 시간이 변함에 따라 응답하도록 하는 방법 을 찾아야만 해.

우리는 위에 2가지 방법을 구현하기 위해서 데이터 플립플롭장치를 만들었어.

<aside> 💡

DFF

클록과 함께, 0과 1의 두 안정 상태를 왔다 갔다(flip and flop) 할 수 있는 시간 의존적 논리게이트

</aside>

이제 우리가 만들 RAM의 메모리 계층을 보여줄게

  1. 데이터 플립플롭 구현
  2. DFF를 이용해 1비트 레지스터 구현
  3. 레지스트 n개를 결합해 n비트 레지스터 구현
  4. n비트 레지스터가 여러 개 들어가는 RAM 장치 구축

정리

  • 클록과 함께, 0과 1의 두 안정 상태를 왔다 갔다(flip and flop) 할 수 있는 시간 의존적 논리게이트
  • 모든 메모리의 기본 구성 블록
    • 다만 눈에 띄는 역할을 하는 RAM, 레지스터, 카운터와 달리 조용히 제 역할만 하는 저수준 부품

3.2 순차 논리

3.2.1 시간의 문제

시간 지연

우리는 지금까지 칩들이 입력에 즉시 답변한다고 가정해 왔지. 하지만 실제로는 적어도 2가지 이유로 항상 시간지연이 발생해.

  1. 입력 신호가 즉각적으로 목적지에 도달하지 않는다. 입력이 들어온 후에도 입력 신호는 다른 칩의 출력에서 이동해온 것이며 이동에는 그만큼 시간이 걸린다.
  2. 칩이 계산을 수행하는데 시간이 걸린다. 칩에 부품이 많을 수록(논리가 정교할수록),칩 회로에서 출력이 다 만들어 질 때까지 시간이 더 오래 걸린다.

시간 관점

시간에 대한 일반적 관점

  • 시간은 연속적

컴퓨터 과학자로서의 관점

  • 시간이 연속적으로 진행 되지 않는다 가정하고, 주기라는 고정된 길이의 간격으로 쪼개자.

⇒ 주기가 전환될 때만 변화를 발생시키고, 주기 도중에는 변화x!!

이와 같은 이산적인 시간 개념을 통해 컴퓨터 설계에 있어 두가지 주요 특성이 존재하게 돼.

첫번째, 통신이나 계산 중에 발생하는 시간 지연과 관련된 무작위성을 줄일 수 있어.

두번째, 시스템 전체에서 여러 칩들의 연산을 동기화 하는데 이 개념을 활용할 수 있지.

  • 시스템 전체에서 여러 칩들의 연산을 동기화이산적인 시간은 클럭 신호와 같이 정해진 주기적인 시간 간격을 가지고 있잖아? 그렇기에 이산적인 시간을 이용하면 각 칩들은 이 클럭 신호를 기준으로 작동할 거야. 그럴 경우 이 클럭 신호를 기준으로 각 칩들이 데이터를 처리하거나 연산을 수행하는 순간이 명확하게 정의될 수 있기 때문에 여러 칩들 사이에 동기화가 가능해져.
  • 즉 , 각 칩들아 동일한 클럭 신호에 따라 동작하기에, 모든 연산이 클럭의 상승 또는 하강 엣지에서 동시에 일어날 수 있도록 동기화 되는거지. 그렇기에 칩들이 각각 따로 움직이지 않고, 일정한 주기에 맞춰 함께 동작하게 되는 거지.
  • 이산적인 시간을 통해 여러 칩들의 연산을 동기화 한다는 개념을 살펴보자.

이 그림은 임의의 입력에 대해 NOT게이트가 어떻게 반응하는 지 추적해본거야.

이 그림을 한번 살펴보자.

**궁금증!! 1번째 주기에선 동시에 시간 지연이 발생하는데 3,4번째 주기에선 왜 별도로 발생할까?

아래 Not 게이트 과정을 보고 해결하자!! (Point!! in, out이 하나에 칩에 같이 존재하는 것을 절대 있지마!!**

NOT 게이트 (질문)

<aside> 💡

칩의 상태 변화 특징

  1. 칩 내부의 연산은 클럭 주기와 관계없이 작동한다.
  2. 입력신호는 클럭 신호의 상승 또는 하강 엣지에서 칩 내부로 전달된다.
  3. 외부에서 출력 신호가 나가는 것은 모두 클럭 주기가 끝날 때 발생한다. </aside>
  4. in : 입력 신호 전달 시간지연 발생 ( 1 ) out : 칩 내부 연산이 끝나고 변환된 값을 가지고 클럭 주기가 끝날 때까지 대기 후 출력 ( 1 → 0 )
  5. in : 입력 신호 전달 시간 지연 발생 ( 1 → 0 ) out : 입력 신호를 받은 칩이 내부 연산이 끝나고 변환된 값을 대기했다가 클럭 주기가 끝날 때 출력( 0 → 1)
  6. in : 3번째 주기의 상승 엣지에서 입력 신호가 칩 내부로 전달 (0 → 1) 단, 칩 내부 연산이 작동 또는 연산이 끝나기 전에 클럭 주기가 변화.
  7. out : 칩의 연산을 마치고 4번째 주기가 끝날 때까지 대기 후 출력 (1 → 0)
  8. 2번째 주기와 동일한방식으로 작동

<aside> 💡

위 그림은 교육용 그림이라 시간지연을 매우 단순화 해서 표현 했어!! 그렇기에 위에서 설명한 내용과 그림은 약간 다르게 느껴질 수 있어. 하지만 위에 설명이 맞는 말이고 그림은 직관적 설명을 위해 매우 단순화한 것이니 참고해줘

</aside>

PLUS

위 그림을 보면 클럭신호의 상승 또는 하강 엣지에 따라 신호가 전달돼.

하지만 난 이런 궁금증이 들었어.

외부에서 신호 전달이 되면 물리적 거리가 다를 텐데 어떻게 저렇게 동일한 시간 간격으로 엣지 변화 간격에 맞춰 신호가 전달 될 수 있는거지??

그렇기에 한번 추측해봤어. 칩 외부 아주 가까운 거리에 입력 신호를 대기시켜 놓는 장치가 있구나!!

GPT에게 물어본 봐로는 입력 신호를 클럭의 상승 또는 하강 엣지에 맞춰 처리하기 위해 대기시키는 장치가 있는게 맞는 것 같아. 이러한 장치들은 **플립플롭(flip-flop)이나 래치(latch)**라는 이름으로 불린다고 하더라고??

이 플립플롭은 우리가 방금 전에 배운 내용이네!! 앞으로 배워갈 내용에서 이 말이 정말 맞는건지 한번 확인해 보자!!

최대 지연 시간 (maximum propagation delay)

정의

최대 지연 시간은 디지털 회로에서 신호가 입력에서 출력으로 전파되는데 걸리는 최대 시간이야.

이 시간은 회로의 각 게이트나 소자가 신호를 처리하는데 걸리는 지연을 모두 합친 값과 동일해.

주기와 최대 지연 시간

위와 같은 방식이 동작하기 위해선 주기가 최대 지연 시간 보다 길어야해.

만약 최대 지연 시간이 15ms이고 주기가 10ms라고 가정해보자.

이와 같은 경우 신호가 아직 처리되지 않았는데 주기가 끝나버려 새로운 입력이 들어오는 상황이 발생할 수 있어. 그럴 경우 기존 연산을 처리하지 않고 바로 다음 연산이 들어오는 경우가 발생할 수 있어.

이럴 경우 연산이 완료되지 못한 상태로 출력이 바뀔 수 있기에 회로의 동작이 불안정해지지.

그렇기에 우리는 입력 신호가 처리될 때까지 충분한 시간을 주어야해.

즉, 최대 지연 시간보다 주기의 길이를 늘려 입력 신호가 회로에서 처리될 수 있는 충분한 시간을 보장해 주어야 하지.

결론으론, 주기 길이는 시스템 내 모든 칩에서 발생하는 최대 지연 시간보다는 살짝 더 길게 잡는게 좋아.

정리

클록 주기는 하나의 이산적 시간 단위를 모델링 한거야. 현재 클록 상태는 0과 1 의 2진 신호로 표현되지.

이 마스터 클록 신호는 하드웨어 회로망을 통해 컴퓨터 내에 있는 모든 메모리 칩에 동시에 전달돼.

이러한 모든 칩 내에서 클록 입력은 저수준의 DFF 게이트로 보내지고, DFF게이트는 칩의 입력 신호 주기를 조절하는 역할을 하게되지.

3.2.2 flip-flop

메모리 칩은 시간이 지나도 정보를 기억하고 저장하도록 설계된 칩이야.

이렇제 저장에 대한 추상화 개념을 실현해 주는 저수준 장치가 바로 플립플롭 개이트(flip-flop gate) 이지.

이 책에서는 입력 및 출력이 1비트 데이터로 된 데이터 플립 플롭(data flip-flop, DFF)이라는 게이트를 사용해.

DFF는 데이터 입력과 클록 입력을 종합해 out(t) = in(t - 1) 라는 시간에 따른 간단한 동작을 구현해.

따라서 DFF가 이전 시간 단위의 입력 값을 출력한다는 사실을 알 수 있어.

모든 메모리 칩 기반에는 DFF 게이트가 존재해. 또한 이 DFF들은 모두 마스터 클록에 연결되어 거대한 합창단 같이 행동하지.

  • 마스터 클록(master clock)
    • 시스템 내 모든 구성 요소를 동기화 하는 주요 타이밍 신호를 의미해. 회로의 각 부분이 일관된 타이밍에 작동하도록 해주지.
    • 이를 통해 데이터 흐름과 처리가 정확하게 맞춰지며, 타이밍 오류로 인한 데이터 불일치나 작동문제를 방지할 수 있어.

각 클럭 주기가 끝나면, 컴퓨터 내 모든 DFF 출력들은 이전 클럭 주기의 입력에 따라 맞춰져.

그 외에 시간에는 DFF가 ‘잠금(latch)’ 상태가 되는데, 이 말은 입력이 변해도 출력이 곧바로 영향을 받지 않는다는 뜻이야.

잠금 상태에서는 입력이 DFF에 들어올 수 없어. 한 주기동안 입력신호가 여러번 변해도 영향을 주지 않다가 상승, 하강 에지 순간에 맞춘 입력만이 들어오고 출력에 영향을 주지.

이러한 연산이 매 초당 대략 십억 번씩 시스템 내의 모든 DFF 에서 수행돼.

하드웨어적으로는 시스템 내의 모든 DFF 게이트에 마스터 클록의 신호를 동시에 전달하는 전용 클록 버스를 통해 이런 시간 의존성을 구현해줘.

3.2.3 조합 및 순차 논리

기초 논리 게이트부터 ALU까지, 1장과 2장에서 개발한 칩들은 모두 현재 클록 주기에 발생한 변화에만 응답하도록 설계되어 있어.

이와 같은 칩들을 시간 비의존성 칩(Time-independent chip) 또는 조합 칩(combinational chip)이라고 불러. 

이 칩들은 현재 입력 값만 의존해서 출력을 생성하지. 주기와 상관없이 입력이 변하면 출력도 즉시 변해.

 

따라서 시간에 대한 의존성이 없고, 클럭 신호와는 상관없이 작동하지.

 

반면에 이번 장에서 공부한 이전 시간 단위에서 발생한 변화에 응답하도록 설계된 칩들은 순차 칩(sequential chip) 또는 클록 칩(clocked chip)이라고 불러.

이 칩의 가장 기본적인 순차 게이트는 DFF로, 이 칩을 포함하는 모든 칩들은 직접적이든 간접적이든 모두 순차칩으로 불리지.

[그림 3.4] 순차 논리 설계에는 일반적으로 조합 칩에서 이력을 받거나 조합 칩에 연결되는 DFF 게이트가 들어간다. 순차칩은 이런 연결을 통해 현재 및 이전 입출력에 응답할 수 있게 된다.

위 그림은 전형적인 순차 논리 구성이야. 이 그림을 보면 순차 칩들이 조합 칩과 상호작용 하고 있는 것을 볼 수 있어. 

그리고 이 순차 칩은 피드벡 루프를 통해 이전 시간 단위의 입력 및 출력이 다음 입력과 출력에 직간접적으로 영향을 미칠 수 있어.

조합 칩은 시간을 인지하지 못하기에, 피드백 루프를 넣으면 입력이 출력에, 출력이 입력에 의존하게 되어. 동일한 입력값에도 출력이 계속 변경되어 안정된 값을 가지지 못하고 무한루프에 빠질 수 있어.

 

그렇기에 DFF게이트가 필요한데, DFF 게이트를 거치게 되면 출력을 다시 입력으로 넣어도 안정적으로 값을 유지할 수 있게 되지.

시간의존성 부과효과

순차 칩에 시간 의존성이 있어서 얻게 되는 중요한 부가 효과는, 전체 컴퓨터 아키텍처를 동기화 하는데 이 특성을 활용할 수 있다는 거야.

예시)
x + y를 계산하는 ALU가 있다고 가정
x : 근처 레지스터의 출력값
y : 멀리 위치한 RAM 레지스터의 출력값

위와 같은 경우, x가 y보다 ALU에 먼저 도착하게 될 것이다. 그러나 ALU는 시간 비의존성이기에 어떤 데이터 값이 도착하는 계속 값을 더할 것이고 y가 도착한 이후에야 올바른 x + y의 결과가 출력될 수 있다. 그러나 이때 올바른 출력이 언제 나올지는 예측할 수 없다.
이 문제를 어떻게 극복할 수 있을까?
  • 정답
    : 컴퓨터 아키텍처 내에서 (비트 하나가 가장 긴 경로를 따라 전송되는 시간) + (칩 내에서 가장 오래 걸리는 계산 시간) 보다 클럭주기를 더 길게 만들자.
  • 정답과 같이 만들면 클럭 주기가 끝날때의 ALU의 출력이 우리가 원하는 값이 나오는 것을 보장할 수 있겠지?

참고 : 위 글은 저자의 개인적인 사견이 들어가있으므로 내용의 정확성을 보장할 수는 없습니다.