CPU는 명령어를 실행시키기 위해 데이터를 하드웨어 장치로 보내야한다.
이렇게 데이터가 여러 하드웨어 장치로 이동하는 경로를 데이터 경로라고 한다.
지금까지 MIPS 명령어 사용법을 공부했는데 이제 16비트 picoMIPS 명령어 집합을 기준으로 데이터 경로를 공부해보려 한다.
데이터 경로는 크게 단일 사이클 방식과 다중 사이클 방식으로 나뉜다.
단일 사이클 방식
초기에는 단일 사이클 방식이 사용되었는데
이는 하나의 명령어가 하나의 사이클 내에서 수행되는 방식이다.
이러한 방식은 하나의 명령어가 한 사이클 동안 전체 데이터 경로를 사용하므로 하나의 명령어가 실행되는 동안은 하드웨어 장치에 두 번 이상 접근할 수 없다.
이러한 이유 때문에 단일 사이클 방식은 PC 갱신 장치를 필요로 한다.
다음 명령어의 주소를 저장하기 위해 PC 갱신이 필요한데 PC 갱신은 ALU(산술 논리 장치) 아니면 PC 갱신 장치에서 이루어진다.
그러나 명령어가 산술 논리 연산을 해야할 경우 ALU가 쓰이기 때문에 하나의 명령어 내에서 ALU가 산술 논리 연산과 PC 갱신을 함께 실행할 수 없기 때문에 PC 갱신 장치를 따로 두는 것이다
다중 사이클 방식
단일 사이클 방식을 개선한 것이 다중 사이클 방식이다.
단일 사이클 방식과 달리 하나의 명령어는 여러 개의 사이클로 나뉘어서 수행된다.
그래서 하나의 명령어가 실행되는 동안 하드웨어 장치에 여러 번 접근할 수 있기 때문에 PC 갱신 장치를 필요로 하지 않는다.
이번 포스팅은 단일 사이클 방식을 기준으로 설명해보려한다.
단일 사이클 방식 명령어 실행 과정
add $t0, $t1, $t2와 같은 명령어의 경우 $t0 = $t1 + $t2이고 이는 $rd = $rs + rt이다.
rs 레지스터 값과 rt 레지스터 값을 더한 값을 rd 레지스터에 저장한다는 뜻이다.
명령어마다 rd, rs, rt 레지스터가 의미하는 바는 다른데 명령어 집합 구조에 정의된 내용을 보고 rd, rs, rt 레지스터가 무엇인지 알 수 있다.
단일 사이클 방식의 하드웨어 구조는 보통 아래와 같다.
picoMIPS 명령어 집합을 사용하여 단일 사이클 방식의 명령어 실행 과정을 보겠다.
명령어 실행 과정은 명령어 형식에 따라 달라진다.
ex) add $t0, $t1, $t2 bne $t0, $t1, loop j loop
위의 명령어만 봐도 피연산자의 개수라던가 레지스터, 메모리 접근 여부도 다르기 때문이다.
그렇지만 명령어 형식에 관계없이 똑같이 실행하는 부분이 존재한다.
이러한 부분들은 보통 모든 경우의 수를 고려한다.
보통 복잡한 R 형식 명령어를 기준으로 모든 값을 보내놓고 명령어 종류에 따라 사용할 값은 사용하고 그렇지 않은 값은 사용하지 않는다.
명령어 실행 과정을 보면 이해가 쉬울 것이다.
먼저 명령어 실행 과정은 다음과 같다.
- 명령어 인출
- 명령어 해독/레지스터 읽기
- 명령어 실행
명령어 인출
현재 PC에는 실행할 명령어의 주소가 저장되어있다.
명령어 메모리에서 이 명령어의 주소를 찾아가서 명령어로 가져온다.
명령어 해독 / 레지스터 읽기
PC 갱신 장치는 PC 갱신을 위해 제어 신호에 맞춰서 본인이 사용해야하는 데이터를 선택하여 사용한다.
제어 장치가 제어 신호를 보내기 전까지는 PC 갱신을 위해 어떤 데이터를 사용해야하는지 알지 못하므로 일단 모든 경우의 수를 고려하여 데이터를 미리 보내놓는 것이다.
레지스터를 읽는 과정은 명령어 해독과 동시에 일어난다.
명령어 메모리에서 rs, rt의 주소 값을 레지스터 파일에 가지고 와서 해당 주소의 데이터를 저장한다.
역시 명령어의 종류에 따라서 사용하지 않는 값이 존재할 수 있지만 모든 경우의 수를 고려하여 일단 넣어두는 것이다.
명령어 실행
명령어 실행 과정은 명령어의 종류마다 다르다. 명령어의 종류에 따른 실행 과정을 공부해보려 한다.
add $rd, $rs, $rt
위 명령어는 rs 레지스터 값과 rt 레지스터 값을 더하여 rd 레지스터에 저장하는 명령어이다.
먼저 레지스터 파일에 보관하고 있던 rs 레지스터 값과 rt 레지스터 값을 ALU로 보낸다.
ALU에서는 그 연산의 결과를 다시 레지스터 파일에 보내고 명령어 메모리에서는 rd 레지스터의 주소 값을 가지고 온다.
이제 rd 레지스터의 주소에 연산의 결과를 저장하면 된다.
마지막으로 PC를 갱신한다.
lw $rt, imm ($rs)
위 명령어는 rs 레지스터에 존재하는 메모리 주소와 imm을 연산하여 rt 레지스터에 저장한다.
먼저 rd가 존재하지 않고 값을 저장하는 레지스터는 rt이다.
여기서 명령어 해독/레지스터 읽기 과정에서도 rt값을 이미 레지스터 파일에 저장했었는데 그 rt와는 다른 rt이다.
이미 존재하던 rt는 ALU가 연산과정에 사용하지 않고 새로 받은 rt는 연산의 결과가 저장될 레지스터의 주소이다.
ALU에서는 rs 데이터와 imm을 연산하여 그 결과를 데이터 메모리에 보낸다.
이 연산의 결과는 메모리의 주소이다.
데이터 메모리에서는 이 메모리의 주소에 존재하는 데이터를 레지스터 파일에 보낸다.
rt 레지스터 주소에 이 데이터를 저장한다.
마지막으로 PC를 갱신한다.
다중 사이클 방식 명령어 실행 과정
다중 사이클 방식은 하나의 명령어가 여러 개의 사이클로 나누어지기 때문에 별도의 저장소가 필요하다.
한 사이클에서 저장소에 저장을 해두면 다른 사이클에서 이 저장소의 값을 사용할 수 있다.
명령어 실행 과정은 다음과 같다.
명령어 인출
먼저 PC에 존재하는 명령어의 주소를 바탕으로 명령어 메모리에서 명령어를 꺼내와서 IR에 저장을 한다.
다음 사이클에서 IR의 명령어를 해독하기 위함이다.
단일 사이클 방식과는 달리 다중 사이클 방식에서는 동일한 하드웨어 장치에 두 번 이상 접근할 수 있으므로 PC 갱신 장치를 두지 않고 ALU에서 PC를 갱신한다.
이 명령어 인출 과정에서 PC와 2 값을 더해서 PC를 갱신한다.
아직까지는 명령어의 종류를 모르는데 만약 분기 명령이었다면 해당 주소로 PC 값을 한 번 더 갱신하게 된다.
이렇게 다중 사이클에서는 일단 실행을 하고 이렇게 하는게 아니었다면 그냥 그 위에 덮어 씌워버린다.
일단 여러 경우의 수를 고려하는 것이다.
명령어 해독 단계
IR에 저장되어있는 명령어 안의 opcode, fn은 제어장치로 보낸다.
IR 안의 rs,rt 주소값을 레지스터 파일로 보내면 레지스터 파일에서는 해당 주소의 데이터를 A, B 저장소에 저장한다.
IR 안의 imm값과 PC 값을 계산하여 C 저장소에 저장한다.
경우의 수를 고려하여 일단 얻을 수 있는 정보를 저장해두는 것이다.
여기서 사용하지 않는 값이 존재할 수 있다.
명령어 실행 단계
add $rd, $rs, $rt
add 명령어였다면 분기 명령이 아니기 때문에 이전 단계에서 C에 저장해두었던 값은 사용하지 않는다.
그래서 rs데이터와 rt데이터를 ALU에서 더해서 C에 덮어씌워버린다.
rd 주소는 연산의 결과를 기록할 레지스터의 주소이므로 rd 주소에 ALU 연산의 결과를 저장한다.
'공부 > 컴퓨터 구조론' 카테고리의 다른 글
[컴퓨터구조론] 캐시 메모리 블록 사상 방식 (0) | 2022.12.16 |
---|---|
[컴퓨터구조론] 파이프라이닝과 해저드 (0) | 2022.12.15 |
[MIPS] MIPS 스택을 활용한 반복문 (0) | 2022.12.12 |
[MIPS] MIPS 함수 및 반복문 사용법 (0) | 2022.12.11 |
[MIPS] MIPS 입력 및 연산 명령어 (정수, 문자열 입출력) (0) | 2022.12.10 |
댓글