시작하기 전
이 글은 필자가 수업시간에 들은 내용과 강의록을 토대로 정리한 글입니다.
수업 필기이다 보니, 오류가 있거나 설명이 부족한 부분이 있을 수 있습니다.
궁금하신 점이나 지적하실 점이 있다면 댓글로 달아주세요! 확인 후 내용을 추가하거나 답변해드리도록 하겠습니다 :)
자세히 살펴보기 전에…
- CPU 성능에 영향을 미치는 요인들
- 명령 수(Instruction Count)
- CPI와 사이클 타임(Cycle time)
- 우리는 두 가지의 MIPS 적용에 대해서 알아볼 것이다.
- 간단한 버전으로 먼저 알아본다.
- 그 후, 파이프라인을 적용한 버전도 알아본다.
- 아래의 명령들을 구현해보면, 대부분의 측면을 보일 수 있다.
- 메모리 참조 :
lw
, sw
- 수식 / 논리 :
add
, sub
, and
, or
, slt
- 제어 전달 :
beq
, j
간단한 버전
중간 고사에 이를 ‘정확히’ 그리는 문제가 시험 문제에 나온다. 여기서 정확히라는 것은 회로를 정확히 그리는 것을 의미한다. 요소들 중 하나도 빠지는 것이 없게만 그리면 된다. 그림 자체가 일치할 필요는 없다. 무조건 암기하자.
명령 실행(Instruction Execution)
- PC → 명령 메모리(Instruction memory)를 가리키고, 명령을 가져온다(fetch).
- 레지스터 번호 → 레지스터를 읽어오는 것에 사용된다.
- 명령의 종류(Class)에 영향을 받는다.
- ALU를 계산을 위해 사용한다거나...
- 수학 / 수리적인 결과(Arithmetic Result)를 얻고 싶을 때!
- 불러오기 / 저장하기 (load, store)를 위해서 메모리 주소를 알아야 할 때!
- 분기 목적 주소(Branch target address)를 알아야 할 때!
- 불러오기 / 저장하기 (load, store)를 위해 데이터 메모리(Data memory)에 접근한다거나...
- PC를 PC + 4나 목적 주소로 설정한다거나...
- 아, 참고로 지금 우리는
{lw, sw, add, sub, and, or, slt, beq}
의 경우에 대해서'만' 생각하는 중이란걸 잊지 말자!
CPU 개요
그러면, 위의 개요들만을 가지고 간단하게, CPU가 어떻게 생겼을지 그려보자.
멀티플렉서(Multiplexer)
논리회로 수업을 기억하는가? 그 수업시간에, 멀티플렉서(줄여서 '먹스') 라고 하는 것을 배운 적이 있다! 기억이 나지 않는다고 하더라도, 분명히 배웠다. (필자도 기억이 안나서 저번 학기 강의록을 뒤져보았다...)
멀티플렉서는 간단하게, 여러 입력신호를 받았을 때, 하나의 입력신호만을 선택할 수 있게 해주는 도구 정도로 생각하면 된다.
그렇다면, 위의 개요 그림에서 멀티플렉서가 필요한 자리는 어디일까? 바로, 아래와 같이 신호들이 합쳐지는 자리들이 될 것이다.
제어(Control)
그렇다면, 이 회로들을 어떻게 제어할 수 있을까? 우리는 수행해야 할 특정명령들을 수행하기 위해서 때로는 ALU의 입력값을 선택해야하고, 때로는 데이터 메모리에 값을 쓸지, 혹은 거기서 값을 읽어올지 선택하는 등 활성화할 회로들을 잘 선택해야한다. 우리는 이를 제어하기 위해 아래 그림과 같이 제어 신호를 쏴주는 제어 회로(Control)를 이용한다.
논리 디자인 기초(Logic Design Basic)
이 내용은 논리회로 수업시간에 어느정도 배운 그대로입니다. 혹시나 모르신다면, Google에 해당 내용(버스, ALU, State 등등..)을 검색해보시면 쉽게 이해하실 수 있으리라 생각합니다.
연달아 일어나는 요소(Sequential Elements)
- 레지스터
- 우리가 컴퓨터 구조론 시간에 배운 '그' 레지스터와 거의 비슷한 개념이다.
- 다만 이는, 논리회로에서의 레지스터이다. 즉, 프로세서의 레지스터가 아니다!
- 레지스터는 논리회로에서 잠깐동안 데이터(bit)를 저장하는 장소이다.
- 보통, 클락을 통해서 작동하고 클락이 0에서 1로 튈 때 정보가 업데이트 된다.
- 논리회로 시간에 배운 플립플랍을 이용해 구현할 수 있다.
- 읽기 제어가 포함된 레지스터
- 말그대로, Write 신호가 1일 때만 정보를 업데이트 할 수 있다.
- 정보를 저장한 상태로 두었다가, 나중에 써야할 때 쓰인다.
클러킹 방법론(Clocking Methodology)
- 여러가지의 논리회로들은, 클럭 사이클 동안 데이터를 바꿔놓는다. 다른 말로, 상태(State)를 바꿔 놓는다.
- 각각의 클럭 엣지(Clock edge)들 사이에 논리(logic)들이 들어간다.
- 이전 상태의 요소들을 입력으로써 받고, 다음 상태의 요소들로써 출력으로 내보낸다.
- 가장 긴 지연 시간(가장 긴 실행 시간)이 클럭 주기를 결정한다.
데이터패스 만들기(Building a Datapath)
- Datapath
- 데이터와 주소를 처리하는 CPU의 요소들
- 레지스터, ALU, 멀티플렉서, 메모리 등등 ...
- 회로를 점점 덧붙여가며 MIPS 데이터패스를 만들어보자!
- 일단은, 간단한 명령들에 한해서만...
lw
, sw
add
, sub
, and
, or
, slt
beq
, j
- 위의 개요에서 그려보았던 디자인을 수정하는 방식으로 그려보도록 하자!
명령 가져오기(Instruction Fetch)
- 아래 그림과 같이, PC를 4씩 더해주면서, 다음 명령으로 넘어간다.
- 왜냐하면, 워드(Word)는 4 Byte 단위이기 때문이다.
- 또한, PC를 이용하여 실행해야 할 명령(Instruction)의 주소를 읽고, 명령 메모리(Instruction Memory)에서 명령을 끄집어낸다. 다른 말로, 가져온다.
- 두 피연산자 레지스터를 읽어야 한다.
- 산술 / 논리 연산을 수행해야 한다.
- 그리고 그 결과를 레지스터에 써야만 한다.
- 예시 :
add
, sub
, and
, or
, slt
- 참고로, R-포맷의 경우 "opcode"가 000000이다. 즉, funct 코드가 어떤 작업을 할지 결정한다.
- 결론적으로, 아래 그림의 회로들이 필요하게 된다.
불러오기 / 저장하기 명령(Load / Store)
- 피연산자 레지스터를 읽어와야 한다. (
lw
명령을 생각해보자)
- 16비트 오프셋(offset)을 활용하여 주소를 계산해서 정확한 목적지를 알아내야 한다.
- ALU를 사용한다. 그렇지만, ALU에 들어가는 것은 32비트로 확장된 오프셋이다.
- 불러오기 : 메모리를 읽어와서 레지스터를 업데이트한다.
- 저장하기 : 레지스터 값을 메모리에 쓴다.
분기 명령(Branch Instructions)
- 피연산자 레지스터를 읽어와야 한다.
- 피연산자를 비교해야 한다.
- 이 때, ALU로 값을 빼서, 'Zero'의 값을 결정한다. 이 값에 따라서 분기를 할 지 말지 결정하게 된다.
- 목적지 주소를 계산해야 한다.
- 얼마나 움직일지(변위, DIsplacement)를 부호 확장(Sign-extend)한다.
- 왼쪽으로 2번 시프팅한다. (워드는 4바이트이기 때문)
- 그리고 PC + 4를 더해준다.
- 하지만 이것은 이미 명령을 가져오면서(Instruction fetch) 계산되어 있다.
요소들 합치기(Composing the Elements)
- 외워야 한다고 나와있던 그림의 데이터패스는 명령을 한 클럭 사이클만에 수행한다.
- 각각의 데이터패스 요소들은 한 번에 하나의 함수(Function)만을 수행할 수 있다.
- 앞 부분을 보면 명령 가져오기에서 사용하는 메모리와 불러오기 / 저장하기에서 사용하는 메모리가 각각 다르다. 그래서 우리는 분리된 명령 메모리와 데이터 메모리가 필요하다.
- 각각 다른 명령마다 다른 입력 데이터(data sources)를 받는 경우엔 멀티플렉서를 쓴다. 하나의 입력 데이터만을 사용하기 위해서이다.
- ALU의 입력이 '레지스터'이거나 '명령 자체의 즉시값(immediate field)'이거나
- 레지스터에 값을 쓸 때 'ALU 출력값'을 쓰거나, '데이터 메모리'에서 가져오거나
- 다음 PC를 'PC + 4'로 하거나, '분기 목적 주소'로 하거나
- 쓸 레지스터의 번호(Register number)를 'Rt'에서 가져오거나, 'Rd'에서 가져오거나
제어가 포함된 전체 데이터패스(Full Datapath (with control))
즉, 아래와 같은 그림이 만들어질 것이다.
출처
- 컴퓨터 구조론 수업시간 내용 및 강의록
- Computer Organization and Design 5th (David Patterson 저)