MIPS processor 2번 설계할 것. 간단한 버전 , 실제 버전
A Basic MIPS Implementation
선택된 명령어 세 종류
- Memory-reference instructions
- lw, sw
- Arithmetic-logical instructions
- add , sub , and , or , slt
- Branch instructions
- beq, j
Thre first 2 steps of every instruction
- the first step
- Instruction fetch(인스트럭션을 메모리에서 CPU로 가져오는, 읽어오는)
- Send PC to memory
- send READ signal to memory
- PC = PC + 4
- Instruction fetch(인스트럭션을 메모리에서 CPU로 가져오는, 읽어오는)
- The second step
- Opcode decoding
- Register prefetch
간단히 그림으로 보면 저런 룩을 도는 거다.메모리에서 CPU로 가져오는 걸 load라고 했고 그 때 fetch라는 용어도 쓴다고 했다. instruction의 경우 load는 안쓰고 fetch라는 용어를 쓴다. 프로그램이 메모리에 있으니까 하나하나씩 가져오면서 실행해야 한다. 다음번에 실행할 명령어의 주소는 프로그램 카운터가 가지고 있다 그래서 프로그램 카운터를 메모리로 보낸다. (주소를) 그리고 메모리한테 리드하라고 한다. 명령어를 읽어서 보내주겠지. 그 시간동안 씨피유 안에서는 프로그램 카운터를 증가시킨다. 다음에 할 때는 그 다음 명령어를 가져와야 하니까. 즉 메모리 리드하고, 프로그램 카운터 증가시키는 그 스텝을 인스트럭션 fetch라고 한다.
읽어오는게 패치고 증가시키고. 그게 첫 단계다.
두 번째 단계는 명령어를 읽어왔으니까, 이 명령어가 뭐냐 그걸 알아내야함 그게 옵코드 디코딩이다. 그리고 그 다음 단계는 옵코드가 더하기다, 옵코드를 보고 무슨 명령어라는 걸 알아내야 한다 옵코드가 더하기다. 로드워드다 그거 같으면, 로드 워드를 실행하는 거다. 메모리에서 등등 이건 명령어 마다 달라진다.
MIPS에서는 두번째 스텝에서 레지스터를 읽어온다.
R타입 명령어는 옵 코드 rs, rt, rd ,shift amount ,function code
I타입 명령어는 옵 코드 / rs/ rt/ 그리고 나머지 합쳐서 (constant or address)
J타입 명령어는 옵 코드 / 어드레스
레지스터 값을 읽어야 한다. 점프는 레지스터 읽을 필요가 없고 로드워드는 레지스터 하나만 읽으면 되고 나머지는 레지스터 2개를 읽어야 한다.
명령어가 뭔지 모르지만 , 만약에 레지스터를 읽어야 한다면 어떤 명령어든지 간에 rt(5비트)안에 있다.
옵코드 디코딩이 끝난 다음에 필요 없다 그러면 사용 안하면 된다. 만약 즉 옵코드 디코딩 하면서 레지스터를 미리 읽어내수 있으면 더 빨리 실행되겠다. 이게 레지스터 프리패치이다.
세 번째 단계는 명령어가 무엇이다라는 판단이 되었으니까. 명령어의 종류에 따라서 다른 일을 할 것이다.
ALU를 이용해서 최종 메모리주소를 계산한다.
effective address는 base 레지스터 + offset 미리 읽어온 값에 offset을 더한다. alu에서
마지막 단계 - alu에서 나온 데이터를 레지스터에 다시 적는다.
ALU말고 별도의 adder가 있다. 범용 ALU연산하고 주소 계산하는게 있지만 PC + 4, branch target address도 계싼하는, 그 용도의 에더도 있다. 조건이 트루라 그러면 프로그램 카운터로, 폴스라면 피시+4로 들어가고. 브랜치 명령어가 아닌 다른 명령어의 경우에는 피시 +4로 들어가고 그렇게 된다. 명령어 실행과정
우리가 나열 했던 단계를 회로로 구성한다. 그게 프로세서다 .
이렇게 구분되어있는 종류의 아키텍쳐를 (메모리) 하버드 아키텍쳐라고 한다. 인스트럭션 메모리와 데이터 메모리가 따로 있는 것. 우리 책의 모델이 그렇다.
그런데 실제로는 그런 컴퓨터가 없다. (하버드 아이비엠이 같이 개발하던 모델이라서 그렇게 부름)
인스트럭션 캐쉬, 데이터 캐쉬 그렇게 따로 둔다. 요새 말하는 하버드 아키텍쳐는 다 이것. 슬라이드 그림. 인스트럭션 메모리, 데이터 메모리는 인스트럭션 캐쉬, 데이터 캐쉬라고 하며, 실제 메모리는 밑에 있다. 아직 캐시를 안배워서 그런거다 . 실제로는 메모리 위에 캐시가 있다.
Princeton architecture - 폰 노이만 아키텍쳐라고 하는게 다 이거다. 여기서는 인스트럭션 메모리, 데이터 메모리 구분이 없었다.
메인메모리로 오면 다 프린스턴 아키텍쳔데, 캐쉬가 분리되어 있기에 다 하버드아키텍쳐라고도 부른다.
레지스터 번호 세개를 보내줄 필요 왜냐하면 최대 두개를 읽고 하나를 써야하니. 읽을 때는 결과가 나오겠지.
rs, rt 즉 명령어를 읽어온다. 그러면 32비트의 명령어, 주소도 32비트의 명령어. 밉스는 주소도 32비트, 명령어도 32비트. 알 타입 명령어라면 저렇게 알타입대로 나오겠지.
보고있는 추상적인 사진은 제어문은 빠진거다.
데이터들이 만나는 부분이 있다. R타입의 경우 연산한 결과를 레지스터에 쓴다. 로드의 경우 읽어온 값을 넣어야 한다. 어떨 때는 PC+4, 어떨 때는 계산한 브랜치 타겟이 들어가고, 어떨 때는 I타입인 경우 주소 계산하기 위해서 상수가 들어가고 그런 식을 된다. 그래서 데이터들이 서로 만나는데, 다른 and 게이트에서 나온 출력을 같이 꽂으면 합선되기에, 멀티 플렉서를 둔다. 선택할 수 있게.
4.2 Register File - output
Datapath Design
첫 단계 instruction fetch 두 번째 opcode decoding 을 하기 위해서 어떠한 구성요소가 필요하고 어떻게 연결되어야 하는가
- 프로그램이 들어있는 instrution memory가 필요하고
- 명령어 주소가 들어있는 Program Counter(PC)가 필요하고
- 다음 명령어를 가리키게 Adder가 필요 (32비트 에더)
instrcution 메모리라고 되어있지만 사실은 캐시. 메모리는 저 밑에 있고, 캐시에도 write,read 신호 필요하다.
처음 실행할 때, 디스크에 있는 실행가능한 코드를 써야하니까. 예를 들어서 엑셀을 실행한다고 가정해보자. 엑셀을 더블클릭했다. 그러면 엑셀은 디스크에 들어가 있으니, excutable 프로그램이 메인메모리로 들어오고, 그 순간에는 메모리에 write해야하므로 코드가 필요. 그 이후로 명령어 읽어내면서 실행하는 것이다. 우리 책에서의 가정은 프로그램이 들어가 있다고 가정한 것이다. (임베디드 시스템처럼 rom에 들어있는 것처럼)
실행하는 부분 - 명령어 종류마다 달라진다.
두 번째 단계 opcode decoding, register prefetch
opcode decoding은 컨트롤 부분 register prefetch -> 다음 번 실행단계에서 다룰 예정
세 번째 단계 계산을 한다 .(ALU 제어신호 어떻게?)
- Memory-reference instructions
- Use ALU for an effective address calculation
- Arithmetic-logical instructions
- Use ALU for the operation excution
- Branch instructions
- Use ALU for comparison
4번쨰 ALU에서 나온 결과를 목적지 레지스터(rd)에 쓴다.
store word, branch on equal 은 안 쓴다. 따라서 컨트롤 시그널이 필요하다.
load store 명령을 하기 위해서는
세 번째 단계 base register하고 명령어의 16비트를 더해서 주소를 계산하는 것(유효주소)
읽어온 명령어에서 밑의 16비트가 들어오는데 32비트로 만들어줘야 한다. 확장. 이 때 두 가지 방법이 있다. 길이가 짧은 데이터를 더 긴 데이터로 만드는 방법.
- zero extension (unsigned integer라면) 값은 같고 길이만 늘릴려면 앞에다가 0을 붙여주면 된다.
- sign extension 부호가 있는 정수라면 부호가 있는 2의 보수. 두 가지 케이스 16비트 데이터가 +일 때, 16비트 데이터가 마이너스 일 떄 +일 때는 앞에다가 0 붙여주면 된다. unsigned integer와 똑같음. -일때는 계속 마이너스면서 앞에다가 1을 붙여줘야 한다.(최상위 비트)
로드워드나 스토어워드를 사용하는 opset은 부호가 있는 놈이니까. sign extension 해줘야 한다.
데이터메모리 /사인익스텐드 유닛 추가필요
다음은 브랜치 이퀄
그래서 세개 합치면
(12차시)
Main control ?!
어떻게 만들고 어떻게 동작시키냐. 4.4절 중반 이후부터 내용
참고자료
컴퓨터 구조 및 설계 지음 DAVID A.PATTERSON, JOHN L>HENNESSY