☑️기본적인 MIPS 구현
- 메모리 참조 명렁어 (lw, sw)
- 산술-논리 명렁어 (add, sub, AND, OR, slt)
- 분기 명령어 (beq, j)
모든 명령어의 처음 두 단계는 다 같다.
1️⃣STEP1
명령어 인출 (instruction fetch)
- 프로그램 카운터(PC)를 프로그램이 저장되어 있는 메모리로 보낸다.
- 메모리에서 명령어를 가져온다.
2️⃣STEP2
- 명령어 해독 (instruction decoding)
- 레지스터 읽기 (register prefetch)
3️⃣STEP3 (명령어 종류에 따라 달라짐)
- 메모리 참조 명령어 ⇒ 주소 계산을 위해 ALU 사용
- 산술-논리 명령어 ⇒ 연산 수행을 위해 ALU 사용
- 분기 명령어 ⇒ 비교하기 위해 ALU 사용
- j 명령어를 제외한 모든 명령어가 ALU를 사용한다.
4️⃣STEP4 (명령어 종류에 따라 달라짐)
- 메모리 참조 명령어
- sw: 데이터를 기록하기 위해 메모리 접근
- lw: 데이터를 읽기 위해 메모리 접근 ⇒ 메모리에서 읽은 데이터를 레지스터에 저장
- 산술-논리 명령어 ⇒ ALU의 연산 결과를 레지스터에 저장
- 분기 명령어 ⇒ 비교 결과에 따라 PC 값 결정
- 같으면 PC에 새로운 값(분기 주소) 저장
- 다르면 PC 값을 4만큼 증가 (다음 명령어 주소)
- Multiplexor: 서로 다른 근원지에서 나온 데이터가 같은 유닛으로 갈 때 사용
✅R 형식 명령어 (R-format Instructions)
레지스터 피연산자 3개를 가지고 있기 때문에, 매 명령어마다 레지스터 파일에서 데이터 워드 2개를 읽고(read register) 데이터 워드 하나를 써야(write register) 한다.
Read Register 입력에 실리는 번호에 해당하는 레지스터의 내용을 항상 출력한다.
그러나 Write Register는 쓰기 제어 신호에 의해 제어되므로 클럭 에지에서 쓰기가 일어나려면 이 제이 신호가 인가되어야 한다.
= 출력 제어 신호는 필요 없으나 입력 제어 신호는 필요하다.
💡 즉, 4개의 입력(레지스터 번호 3개, 데이터 1개)과 2개의 출력(모두 데이터)이 필요하다
ALU는 32비트 입력 2개를 받아서 32비트 결과가 0인지 아닌지를 나타내는 1비트 신호를 만든다.
✅메모리 참조 명령어
⇒ 레지스터 파일와 ALU가 둘 다 필요하다
1. 저장 명령어 (sw)
저장 명령어이면 저장할 값을 레지스터 파일에서 읽어와야 한다.
2. 적재 명령어 (lw)
적재 명령어이면 메모리로부터 읽어 들인 값을 지정된 레지스터에 써야 한다.
✅분기 명령어
beq는 write data를 안 쓰기 떄문에 그 경우를 구분해주기 위해서 RegWrite의 1과 0을 이용해 신호를 줌
3️⃣STEP3
- ALU를 이용해서 두 레지스터 비교
- (PC + 4) + 부호 확장한 명령어의 16비트 변위 * 4 ⇒ 분기 목적지 주소
- 변위*4를 구하기 위해 2비트 왼쪽 자리 이동
4️⃣STEP4
- 비교 결과에 따라 PC 값 결정
- branch taken 또는 branch not taken
필요한 구성요소
- 왼쪽 자리 이동 유닛 ⇒ 분기 명령어가 true일 때 지정한 주소로 이동하는데 이때, 동시에 offset(4칸)의 표현영역을 생략해주기 위한 유닛
- 별도의 덧셈기 ⇒ 이동해줘야 하는 주소의 PC 값으로 지정해줘야 하기 때문에 필요 (입력은 PC+4와 shift한 상대주소값)
☑️자리 이동 유닛과 부호확장 유닛의 구현
16비트의 입력을 32비트의 부호 있는 값으로 확장시켜주는 유닛이다.
(16비트의 값 중 제일 왼쪽에 있는 값을 복제해 16개를 추가시켜 32비트로 만든다.)
☑️단일 data path 만들기
위에서 만들어본 데이터패스들을 합쳐 모든 명령어를 한 클럭 사이클에 실행하려고 하는 것이다.
즉, 어느 데이터패스 자원도 명령어당 두 번 이상 사용될 수 없다.
그래서 두 번 이상 사용해야 하는 컴포넌트들은 필요한 만큼 복제를 해야 한다!
- Mux는 분기일 때 분기 중 하나 선택해주는 역할이다
ex) 메모리 참조 명령어 데이터패스와 R-type 명령어의 합병
레지스터 파일 하나와 ALU 하나만을 사용하는 데이터패스를 만들기 위해서는 두 번째 ALU 입력에 두 종류의 다른 근원지를, 그리고 레지스터에 저장할 데이터 입력에도 2개의 다른 근원지를 연결할 수 있어야 한다.
따라서 멀티플랙서 하나, 레지스터 파일의 데이터 입력에 멀티플렉서 하나를 설치해야 한다.
MIPS 구조를 위한 단순한 데이터패스
분기 명령어는 주 ALU를 레지스터 피연산자 비교에 사용하므로 분기 목적지 주소 계산을 위해서는 위에 있는 덧셈기가 있어야 한다.
또한 PC에 들어갈 값으로 순차적인 다음 명령어 주소 (PC+4)와 분기 목적지 주소 중 하나를 선택하기 위하여 또 다른 멀티플렉서가 필요하다.
☑️단순한 구현
위에서 언급한 MIPS 부분집합을 가장 간단히 구현하면 어떤 형태가 될지 알아보자!
ALU 제어
ALU 제어신호를 위한 진리표
ALUOp는 수행할 연산이 덧셈(00)인지(lw, sw), 뺄셈(01)인지(beq), 아니면 funct 필드에 따라 달라지는지(10)를 표시한다.
R-type은 ALUOp1이 모두 1이다. 따라서 뒤에 값은 don’t care. 즉, Function field의 뒤에 4비트가 중요하다. 하위 비트의 funct 필드 값에 따라서 다섯 가지 연산 (AND, OR, subtract, add, set on less than) 중 하나를 수행하게 된다.
'2-2 학기 > Computer Organization' 카테고리의 다른 글
[컴퓨터구조] Lec16 Pipelined Datapath and Control (1) | 2023.12.19 |
---|---|
[컴퓨터구조] Lec15 Pipelining (1) | 2023.11.01 |
[컴퓨터구조] Lec10 Floating Point (1) | 2023.10.30 |
[컴퓨터구조] Lec8 Multiplication (0) | 2023.10.30 |
[컴퓨터구조] Lecture 4 Machine Instructions (1) | 2023.09.30 |