MIPS Decode 회로
지난 글에 이어 MIPS의 Decode 회로를 설계해보자.
Decode 과정은 명령어를 해석하는 과정이다.
명령어를 실행하려면 크게 2가지 정보를 알아야 한다.
1. 무슨 명령어인가? ( = 연산자 정보)
2. 무엇을 가지고 실행하는가? ( = 피연산자 정보)
MIPS 명령어는 포맷별로 아래와 같은 형태를 갖추고 있다.
3가지 포맷은 모두 공통적으로 6bit 크기의 opcode 필드를 갖고 있다.
이 opcode를 통해서 지금 주어진 명령어가 어떤 명령어인지 식별한다.
R 포맷은 opcode 에 더해 function 필드 정보를 조합하여 실행할 명령어를 식별한다.
그리고 opcode 와 funct 를 제외한 나머지 필드가 모두 피연산자로서 활용하는 필드가 된다.
우선 J 포맷은 PC값을 임의로 바꾸는 동작을 하기 때문에 나중에 살펴보기로 하고, R 포맷과 I 포맷을 먼저 보려고 한다.
R - Format Decoding
R 포맷은 피연산자로 모두 레지스터를 활용하는 명령어이다.
(물론 shift 명령어는 shift amount 필드가 따로 있긴 하지만)
따라서 기존 CPU 내부에 레지스터 파일을 추가해주겠다.
또 opcode 와 funct 필드를 이용해 현재 실행하려는 명령어를 식별하고 동작을 제어한다.
이를 위해 control unit 이라는 부품을 추가로 둔다.
기존에 작성했던 Fetch 회로는 우측 하단에 따로 두었다.
메모리에서 가져온 명령어는 CPU로 가져온 뒤, opcode, funct, rs, rt, rd, shift amount 가 나눠져서 각각의 위치로 들어온다.
여기에서 레지스터 파일이라는 모듈 하나 입장에서 보면 전에 레지스터 파일의 베릴로그를 기술했던 것과 같이
ra1, ra2, wa, rd, we 신호가 들어오고, rd1, rd2 를 내보내는 형식으로 그릴 수 있다.
그래서 이렇게 그림을 바꿔 그려보았다.
rs, rt, rd 를 쓰지 않은 이유는 rs, rt, rd 의 데이터가 ra1, ra2, wa 어디에 들어갈 지 아직 결정되지 않았기 때문이다.
(예시로 I 포맷은 rt가 목적지 레지스터로 쓰이고, R포맷은 rd가 목적지 레지스터로 쓰이므로 wa값을 아직 모른다.)
지금은 R포맷을 보고 있으니 ra1 = rs, ra2 = rt, wa = rd 가 일반적으로 적용된다고 이해해도 괜찮다.
(하지만 shift 명령어로 가면 또 달라진다..)
이때 여기에서 레지스터 파일에 값을 쓸 때는 we 라는 컨트롤 신호가 필요하다고 했었다.
이 컨트롤 신호가 마이크로아키텍쳐에서 데이터패스와 컨트롤로 나눠지는 그 '컨트롤' 이 주는 신호다.
지금 그리고있는 회로도에서는 Control Unit이 we 신호를 준다.
we 는 write enable 의 줄임말인데, 레지스터에 대한 쓰기 신호를 의미하므로 RegWrite 이라고 하자.
이렇게 그려진다.
rs, rt, rd 필드에 있는 레지스터 번호로부터 값을 가져와서 연산하는 부분은 Execute 단계에서 할 일이므로,
R - Format의 디코딩은 여기까지 할 수 있다.
I - Format Decoding
I 포맷은 지금까지 작성한 R 포맷 회로에 Immediate 필드를 처리하는 부분만 추가로 기술하면 된다.
Immediate 필드는 16bit 필드이기 때문에, 나중에 ALU로 들어가서 연산되기 위해서는 32bit로 확장해야 한다.
Decode 단계에서 immediate 필드를 32bit로 확장하는 역할을 수행한다.
그리고 이를 실질적으로 수행하는 회로가 별도로 존재한다.
이 회로를 아래와 같이 추가하였다.
immediate 필드는 명령어 종류에 따라 zero-extension 과 sign-extension 방식이 다르다.
이 정보는 명령어 종류에 따라 달라지기 때문에 이 값은 control unit 이 결정해주어야 한다.
따라서 sign_ext 라는 이름의 정보를 control unit으로부터 아래와 같이 전달받는다.
만약 sign_ext 가 1 이면 sign-extend 하고, 0이면 zero-extend 한다.
J - Format Decoding
J 포맷도 I 포맷과 동일하게 immediate 필드를 갖는다.
다만 사이즈가 26비트이고, 그 필드를 해석하는 방식이 I 포맷과 다르다.
I 포맷은 단순히 extend 시켜서 ALU에 전달만 하면 되었지만, J 포맷은 이 값에 right shift 를 2번 취한 뒤 PC+4 값을 기반으로 더해서 점프하는 조금 더 복잡한 과저을 거친다.
따라서 J 포맷에 대한 회로도는 j 명령어를 execution 하는 과정을 정리할 때 추가하도록 하겠다.
최종 회로도
'CS > 컴퓨터 구조' 카테고리의 다른 글
[컴퓨터 구조] 14. Single Cycle MIPS - 회로 정리 & ALU (0) | 2024.04.21 |
---|---|
[컴퓨터 구조] 13. Single Cycle MIPS - Execute (0) | 2024.04.19 |
[컴퓨터 구조] 11. Single Cycle MIPS - Fetch (0) | 2024.04.19 |
[컴퓨터 구조] 10. Single Cycle MIPS - 개요 (0) | 2024.04.18 |
[컴퓨터 구조] 9. 곱셈, 부동 소수점 (1) | 2024.04.17 |