Processor 를 어떻게 만들고, 각 부분은 어떻게 작동하는 지 알아보자.
프로그램은 크게 3가지 부분으로 나뉜다. 먼저, 어떤 instruction을 사용해야 하는지 load 하는 Instruction Fetch. 실제 Operation (계산)을 담당하는 ALU Operation. 마지막으로, 계산된 결과값을 가지고 주소에 접근하는 Memory Access.

Instruction Fetch 에는 현재 상태의 주소를 알려주는 Program Counter 가 있다. 이 값은 두 곳에 input으로 쓰인다. 먼저, adder 를 통해 4씩 더해가면서 다음 instruction을 찾아간다. 또한, Instruction memory에도 쓰인다. Instruction Memory 는 모든 instructions 이 저장되어 있는 곳이다. input으로 현재 주소값을 넣으면, output으로 메모리에서 instruction을 load 한다.

ALU operation 은 레지스터 파일 (rs, rt) 에서 데이터를 읽는다. 읽어온 데이터를 가지고 ALU 에서 계산을 한다. 이때, 더하기를 할지, 빼기를 할지, and 연산을 할지.. 등을 정하는 역할을 ALU operation이 한다. 계산을 한 후 나온 결과는 다시 레지스터 (rt) 에 적는다. 다만, 모든 연산에서 레지스터에 write를 하는 것은 아니다. 가령, jump instruction 같은 경우엔 따로 레지스터에 뭘 적지 않아도 된다. 따라서 RegWrite가 1로 활성화 될 때만 레지스터에 값을 적어준다.
주의할 점은, 레지스터는 총 32개이기 때문에 레지스터를 구분하기 위해선 5bit가 필요하다. 그래서 input으로 5bit의 레지스터 주소를 받는다. 하나의 레지스터 파일의 크기는 32bit이기 때문에 output으로 나오는 결과 값은 32bit이다.

Memory Access 는 주소를 계산하고, lw 와 sw를 가능하게 한다. 메모리에 input으로 주소를 보낸다. 만약 write를 할 거면, 데이터도 같이 보내야 한다. read의 경우 데이터를 output으로 반환해준다.
immdiate 값을 계산할 때는 기존에 16bit 였던 값을 sign extend 하여 32bit로 만들어준다. 그 후에 ALU 계산을 한다.
| Instruction Fetch | ALU operation | Memory Access |
| - instruction 불러오기 - 다음 PC 계산하기 - 레지스터 파일 읽기 |
||
| - 레지스터 파일에 쓰기 | ||
| - branch 주소 계산하기 - branch 비교하기 - PC 업데이트하기 |
- ALU에서 계산하기 | - 주소 계산하기 - 메모리의 데이터 읽고 쓰기 |
이렇게 Instruction Fetch, ALU operation, Memory Access 3가지 부분에 대해서 알아보았다. 하지만 가만 보면, 각 부분이 실행하는 역할이 많이 겹치는 것을 알 수 있다. 또한, Instruction Fetch 를 보면 branch 주소 계산도 해야 하고 branch 연산을 위한 비교도 해야 하는데, 이는 별개의 ALU에서 이루어져야 한다. 위의 사항들을 고려하여 프로세서 디자인을 해보자.

숫자는 그림에서 위치를 표현하기 위해 사용했을 뿐 다른 의미는 없다.
1. 레지스터 파일의 값을 읽어 ALU의 input으로 집어 넣는다. 그 결과를 레지스터에 적는다. ALU의 output 부분에 있는 Zero는 bne나 beq 연산에 쓰인다. input 값의 차를 구해 결과가 0이면 branch를 하는 식이다.
2. immediate 값이 필요한 instruction도 있다. instruction을 해석하여 필요한 경우에 sign extend하여 ALU에 넣어주면 된다.
가운데 있는 MUX는 ALU의 input으로 레지스터 파일에서 가져온 값을 쓸 것인지, sign extend 한 immediate 값을 쓸 것인지 선택한다. 예를 들어, add의 ALUSrc는 0이고, addi 는 immediate value를 써야 하므로 ALUSrc는 1이다. 즉, 어떤 instruction이냐에 따라 어떤 control signal을 쓸지가 결정된다. 위의 예시에서는 ALUSrc가 control signal 이다.
3. sw 처럼 메모리에 값을 적고자 하면, 레지스터의 값을 읽어와야 한다. 또한, 어디에 적을 것인지 메모리 위치를 위한 주소도 필요하다. 이는 ALU의 output에서 받을 수 있다. 반대로, lw 처럼 메모리에서 값을 읽어서 레지스터 파일에 적을 수도 있다.
오른쪽에 있는 MUX 는 레지스터 파일에 ALU 의 결과를 적을 것인지, 메모리에서 가져온 값을 적을 것인지 (load 연산) 선택한다.
Branch

원래는 PC에 4씩 더해서 다음 instruction을 실행하는 것이 기본이다. 하지만 branch 를 해야 하는 경우에는 어떻게 해야 할까? 먼저, branch instruction에서 immediate 값을 추출하여 sign extend 한다. 그리고, Shift left 2를 해준다. word의 크기인 4byte 로 나뉘어 떨어지게 만들기 위함이다. 이 값을 기존의 PC+4와 더해준다.
정리하면, 기본은 PC=PC +4 이고, branch 의 경우 PC=PC + 4 + (sign extended 한 immediate 값 >>2 ) 이다. 이 값은 branch 를 하는 경우에만 사용된다. 따라서 MUX에서 기본 형식을 취할지, branch의 형식을 취할지 PCSrc를 통해 결정한다.
정리

각각 살펴본 부분들을 이제 합쳐보자. 하늘색으로 색칠된 부분은 모두 프로세서의 상태 (state)를 담고 있는 Memory이다. RegWrite, ALUSrc 와 같이 파란 색으로 쓰여져 있는 글자들은 Control Signal이다. Instruction을 해석하여 이 값들을 모두 알 수 있다.
Data Source


데이터는 어디서 오는가?
1) 레지스터 파일에서 데이터를 읽는다.
2) instruction에서 immediate 값을 추출하여 sign extend한다.
3) 메모리에서 데이터 읽어와서 레지스터 파일에 적는다.
그렇다면 데이터는 어디로 가는가?
1) ALU 결과값을 레지스터 파일에 적는다.
2) 레지스터 파일에서 읽어와 메모리에 적는다.
3) 데이터 address를 메모리에 적는다.
'전공기초 > Computer Architecture' 카테고리의 다른 글
| [컴퓨터 구조] 디지털 논리 설계 (1) | 2023.11.21 |
|---|---|
| [컴퓨터 구조] 숫자 모음 (2) | 2023.11.20 |
| 컴퓨터 구조 Prologue (1) | 2023.11.20 |