Datapath개요이제 pipeline을 적용한 MIPS의 회로도를 그려보자. 이 회로도는 j 명령어 (무조건 분기) 를 고려하지 않은 CPU 회로도이다.먼저 단순하게 기존 single cycle 회로도에서 단계를 나눈 뒤, 단계 사이사이에 flip-flop(파이프라인 레지스터)을 넣어두었다. 하나의 스테이지 동작을 마친 뒤, 다음 스테이지에서 이어서 하기 위해 그때까지 수행한 값을 레지스터에 보관해두는 것이다.각각의 파이프라인 레지스터 이름을 구분하기 위해, 어떤 단계 사이에 끼어있는 레지스터인지로 이름을 명시하였다. 이제 이 CPU는 동시에 최대 5개의 명령어를 처리할 수 있게 되었다. 예를 들면 위와 같이 특정 시점에서 5개의 명령어를 동시에 실행하고 있을 수 있다.이 그림에서는 분홍색으로 색칠한 ..
Pipeline 의 표현 IF, ID, EX, MEM, WB 다섯개 stage를 위 그림과 같이 표현해보자.이제 모든 명령어는 5개 단계를 거쳐야 실행되며, 만약 각 단계를 처리하는데 1cycle이 소모된다면, 총 5사이클을 필요로 한다.얼핏보면 안좋은 것 같지만, 이렇게 하면 1 cycle의 주기를 짧게 가져갈 수 있고, 2번째 명령어부터는 1 cycle만에 명령어를 실행할 수 있기 때문에 전체적인 throughput은 매우 크게 향상된다. 이때 왼쪽 반을 색칠한 것은 '그 단계에서 전반부에 데이터를 쓰는 행위를 한다' 라는 것을 의미한다.반면 오른쪽 반을 색칠한 것은 '그 단계에서 후반부에 데이터를 읽는 행위를 한다' 라는 것을 의미한다.다 색칠한 경우에는 색칠한 자원을 사용하고 있다는 의미이다. 위..
지금까지 이전 글에서 설계했던 Single Cycle MIPS는 상대적으로 디자인하기는 쉽지만, 성능을 원하는만큼 끌어올리는데 한계가 있다.구체적으로는 Critical Path가 만들어내는 딜레이보다 주기를 짧게 가져갈 수는 없다.그렇다면 어떻게 해야 CPU의 성능을 더 끌어올릴 수 있을까? 제일 직관적인 방법 중 하나는 마이크로 아키텍쳐는 그대로 두고, 아키텍처를 구성하는 트랜지스터의 공정을 개선해서 성능을 끌어올리는 방법이 있다.하지만 이 방법도 결국에는 한계가 있다.트랜지스터가 작아지면 작아질수록 전자의 지름에 가까워지는데, 반도체의 크기를 전자의 지름보다 작게할 순 없기 때문이다. (반도체도 결국 전류의 흐름 == 전자의 이동에 의한 소자이기 때문이다.)따라서 한번 공정이 아닌 아키텍처 개선을 통..
Critical Path (임계 경로)Single Cycle MIPS 는 말 그대로 하나의 사이클에 모든 명령어를 처리하는 CPU이다.add 명령어도, branch 명령어도, lw, sw 명령어도 모두 1Cycle에 처리한다. 이때 이 CPU의 성능을 빠르게 하려면 어떻게 할 수 있을까?간단하게 생각할 수 있는 것은 1 Cycle의 주기를 짧게 가져가는 것이다. (주파수를 높이기)그렇다면 단순히 주파수를 높이기만하면 성능도 그에 따라서 높아지기만 할까? 사실은 그렇지않다.왜냐하면 Clock Cycle Time은 Critical Path에 의해 제약을 받기 때문이다.(Critical Path == 명령어를 실행하는데 가장 긴 시간이 걸리는 경로) 현재 설계한 MIPS 회로에서 Critical Path 를 ..
Control Unit Single Cycle MIPS 에서 Control Unit은 위와 같은 구조로 되어있다.fetch한 명령어에서 Opcode를 가져와서 해석하는 Main Decoder, Funct 를 가져와서 해석하는 ALU Decoder로 구성된다.(사실 구분하지 않고 한번에 만들도록 구현할 수도 있지만, 이렇게 분리해서 구현할 수도 있다.) Opcode 를 가져오면 이를 통해 가져온 명령어의 타입이 R, I, J 중에 어떤 타입인지 알 수 있다.만약 가져온 명령어의 타입이 R 타입이 아니라면 Funct 필드로서 가져온 데이터는 무시한다. 먼저 Main Decoder가 내보내는 컨트롤 신호의 종류를 복습해보자. 1. MemToReg연산한 결과를 메모리에 쓸 지, 레지스터에 쓸 지 결정하는 플래그..
앞에서 Fetch - Decode - Execute 순으로 회로를 점차 개선하는 과정을 보였었다.이번에는 이를 한번에 정리해서 명령어별로 어떤 데이터 패스를 통해 실행되는지 정리하려고 한다.그리고 ALU 가 연산자별로 연산을 택하는 그 구체적인 과정도 함께 정리한다. lw 명령어 실행하기fetchlw 명령어를 실행하는 과정을 하나씩 그려보자.먼저 명령어를 가져올 메모리와, PC 레지스터가 필요하다. 다음과 같이 그렸다.이제 메모리에서 읽어온 명령어를 decode 해야한다. decode 읽어온 명령어의 31:26 비트를 보고 opcode를 파악해서 lw 명령어임을 파악한다.25:21 비트를 reg file 의 ra에 전달해서 base address 주소를 가져온다. 다음으로는 15:0 비트를 상수필드로 보..
MIPS CPU의 Execute 단계가 어떻게 실행되는지 명령어의 기능에 따라 구분하여 정리하였다. 산술/논리 연산자 실행 add, sub, addi, or, and 와 같은 명령어를 실행하는 과정을 먼저 생각해보자. 우선 위 연산을 실질적으로 실행하는 유닛은 ALU 라는 유닛이 수행한다. 산술 연산과 직접적으로 관련된 명령어 포맷은 R 포맷과 I 포맷 밖에 없다. R 포맷은 모든 피연산자가 레지스터고, 연산 결과가 레지스터로 들어간다. I 포맷은 피연산자가 하나는 레지스터, 하나는 상수고, 연산 결과가 레지스터로 들어간다. 우선 피연산자 하나는 반드시 레지스터에서 오고, 연산 결과는 레지스터로 들어가는 것이 동일하므로 아래와 같이 그릴 수 있다. 이제 결정해야 하는 것은 R 포맷이면 레지스터로부터 AL..
MIPS Decode 회로 지난 글에 이어 MIPS의 Decode 회로를 설계해보자. Decode 과정은 명령어를 해석하는 과정이다. 명령어를 실행하려면 크게 2가지 정보를 알아야 한다. 1. 무슨 명령어인가? ( = 연산자 정보) 2. 무엇을 가지고 실행하는가? ( = 피연산자 정보) MIPS 명령어는 포맷별로 아래와 같은 형태를 갖추고 있다. 3가지 포맷은 모두 공통적으로 6bit 크기의 opcode 필드를 갖고 있다. 이 opcode를 통해서 지금 주어진 명령어가 어떤 명령어인지 식별한다. R 포맷은 opcode 에 더해 function 필드 정보를 조합하여 실행할 명령어를 식별한다. 그리고 opcode 와 funct 를 제외한 나머지 필드가 모두 피연산자로서 활용하는 필드가 된다. 우선 J 포맷은..
Fetch 회로도fetch는 명령어를 가져오는 과정이다.명령어를 가져올 때, 컴퓨터는 PC (Program Counter) 라는 특별한 레지스터를 이용한다.이 레지스터에는 현재 실행할 명령어가 메모리 어디에 담겨있는지, 그 주소값이 담겨있다.컴퓨터가 처음 실행되면, PC는 0으로 초기화되고, 메모리 0번지에 있는 명령어를 가져와 실행할 것이다.하나의 명령어를 실행한 이후에는, 다음 명령어를 실행하기 위해 PC 값을 4 증가시킨다. (32bit 시스템 기준) 이 과정이 점프나 분기가 없는, 순차적으로 실행되는 프로그램 기준 Fetch 의 과정이다.이를 회로도로 그려보자. 먼저 CPU 공간과 명령어를 가져오는 메모리 공간을 따로 그려보자. CPU 안에는 PC 라는 특별한 레지스터가 있다. 32bit-re..
Microarchitecture 컴퓨터 시스템은 위와 같은 계층으로 구성된다. 지금까지는 MIPS 명령어 체계를 정리하면서 3번째에 있는 Architecture 계층에 대해 고민했었다. 이제는 그보다 한단계 아래로 내려가서 마이크로 아키텍쳐를 보려고한다. 마이크로 아키텍쳐라는 말은 기계어로 된 명령어를 이해하고, 실행할 수 있는 CPU의 내부 하드웨어 구조를 의미한다. MIPS의 ISA를 구현하는 마이크로아키텍쳐는 다양하게 있다. 같은 ISA여도 구현은 얼마든지 바뀔 수 있다. (마치 x86을 구현한 AMD 와 Intel 의 CPU가 다른 것처럼) 대표적인 구현 방법으로 한 사이클에 하나의 명령어를 처리하는 Single Cycle 방식이 있다. 하나의 명령어를 실행하고, 그 명령어의 실행이 끝나면 그 다..