본문 바로가기

2-2/컴퓨터 구조

[컴퓨터 구조] Building datapath(1)

Chapter 4로 넘어오면서 디지털 설계 및 실험에서 배운 요소들을 써먹는 부분들이 많았다.

그런부분은 넘어가고 새로 배우는 내용들에 대해서 초점을 둬보자.

datapath를 구성해보는데 흐름을 따라서 가보자.

 

 

 

💻 Datapath

Datapath란 CPU에서 데이터와 주소를 처리하는 모든 요소들을 말한다.

레지스터, ALU,Multiplexer,메모리 등이 이에 해당한다. 이 Datapath들이 하나로 통합되어 우리가 명령어를 실행할 수 있게 되는 프로세서의 Datapath를 점점 완성해 나갈 것이다.

 

 

💻Feteching the instruction

제일 첫단계인 Instruction Fetch를 살펴보자.

Instruction Fetch를 하는 요소들에 대해서 알아보자.

  1. PC : 이전에 배웠지만 실행할 명령어의 현재 주소를 저장하고 있는 레지스터이다. 
  2. Instruction Memory : 명령어의 주소를 받아서, 그 주소에 맞는 Instruction을 내보낸다.
  3. Adder : ALU랑 똑같은 형태로 되어있는데 그중에서 덧셈을 하기 위해 만들어진 요소이다. 위 이미지에서는 다음 주소를 가리키는 PC+4를 만들기 위해서 4를 더해준다.

 

💻 R-Format Instructions 

이번에 소개할 것들은 R-type ( add,sub,and,or) instruction을 구성하는데 필요한 요소들이다.

먼저, R-type에 대해서 복기해보자.

두개의 레지스터를 읽어서, 산술/논리 연산을 진행한 다음에 결과값을 레지스터에 적어준다.

 

먼저, a는 레지스터 파일을 보여준다.

레지스터 파일이란 레지스터들이 레지스터 넘버로 구분되어져 있는 레지스터의 집합이다.

b는 ALU로 instruction의 종류에 맞는 연산을 수행하게 하는 Datapath이다.

 

레지스터 파일은 3개의 5bit짜리 Register Number를 입력으로 받는다. 그리고 출력으로 Read register에 해당하는 data를 출력해준다. 그리고 그에 해당하는 data 값 두개를 ALU의 입력으로 받는다. 그리고 ALU result를 출력해준다. 그 출력해주는 값은 Write Data 포트로 들어가서 Write register에 저장된다.

 

 

💻 Load / Store Instruction

ld,sd는 메모리에 접근하고, 레지스터 2개를 입력받는다. 위에 R-type에서 썼던 레지스터 파일이랑 ALU를 그대로 쓰지만 조금 다르다. Register file에서 ld는 read register2, sd는 write register address를 사용하지 않는다.

두 부분 모두, Data memory unit과 Sign extension unit을 사용해준다.

Data memory는  memWrite, MemRead 컨트롤 신호를 입력 받는다. 이 신호에따라 메모리를 읽거나, Write data 입력으로 들어온 데이터를 메모리에 쓴다. 이때, 메모리의 주소는 레지스터 주소 + offset이다. (음 .. 사진에서는 16->32 이지만, 32-> 64로 정정해야 함.) offset은 처음 주소에서 12bit로 나타내져 있는데 ,데이터가 64bit 이므로 알맞게 64bit로 sign extension을 해준다. 그래서 b가 필요한 것이다.

 

 

💻 Branch Instruction

beq, bne같은 Branch Instruction을 위해 존재하는 Datapath들을 확인해보자.

먼저, Branch Instruction들을 복기해보자.

두개의 레지스터 값을 읽고, 두 레지스터의 데이터 값이 일치한다면 원하는 offset의 위치로 branch 해주는 것이다.

 

일단, Branch instruction의 offset은 12비트이지만 13비트이다. 맨 뒤가 0으로 고정되어있다고 치고 12비트를 적어줬었다. 그래서 Shift left 1을 통해서 맨뒤에 0을 붙여줘야한다.

 

위 그림을 보자. Register file은 Read register 1, 2 총 2개를 읽어준다. 그리고 그 두개의 데이터 값은 ALU로 들어가서 sub연산을 해줄것이다. 그 값이 0이라면 Zero ouput에서 1이 출력된다. 이것은 control 신호로 사용된다.

 

offset은 64비트로 13비트가 되어서 PC 와 더해진다.

Branch 되지 않는다면 PC+4가 return 되어진다.

 

다음 포스팅에서는