R-type/Load/Store Datapath
단일 사이클 데이터패스
별도의 명령어 메모리, 데이터메모리를 가짐
- 별도의 형식(명령어, 데이터)을 가짐
- 메모리를 별도로 가지면 저렴함(듀얼포트 메모리에 비해)
- 한 사이클에 명령어메모리와 데이터메모리 동시 접근가능
단순구현
- lw(load word)
- sw(store word)
- deq(branch if equal)
- add, sub, or, set on less then
ALU 동작(연산)
- Load/Store는 add(메모리주소 계산)
- Branch는 substract(같은지 비교를 위해)
- R-type은 funct 필드(하위 6비트)의 값에 따라 동작
- funct 필드 + ALUOp(op코드의 2비트) -> ALU 제어입력
00(add -> lw, sw), 01(sub -> beq), 10(funct에 따름)
ALU control | Function |
0000 | AND |
0001 | OR |
0010 | add |
0110 | subtract |
0111 | set-on-less-then |
1100 | NOR |
2비트 ALUOp는 opcode에서 가져옴
opcode | ALUOp | Operation | funct | ALU function | ALU control |
lw | 00 | load word | XXXXXX | add | 0010 |
sw | 00 | store word | XXXXXX | add | 0010 |
beq | 01 | branch equal | XXXXXX | substract | 0110 |
R-type | 10 | add | 100000 | add | 0010 |
substract | 100010 | substract | 0110 | ||
AND | 100100 | AND | 0000 | ||
OR | 100101 | OR | 0001 | ||
set-on-ledd-than | 101010 | set-on-ledd-than | 0111 |
ALU 제어신호를 위한 진리값
명령어 디코딩
주제어유닛
Datapath with Control
각 제어신호의 의미
RegDest
- 0 -> 명령어 rd필드가 Write Register 번호가 됨
- 1 -> 명령어 rt필드가 Write Register 번호가 됨
RegWrite
- 1 -> Write data값을 Write Register 번호에 씀
ALUSrc
- 0 -> Read Data 2가 ALU의 두 번째 오퍼랜드가 됨
- 1 -> 부호확장된 명령어의 하위 16 비트값이 ALU의 두 번째 오퍼랜드로
PCSrc
- 0 -> PC에 4를 더함
- 1 -> 분기 목적지 주소값을 새로운 PC값으로
MemRead
- 1 -> 데이터메모리의 Address 주소의 값의 Read Data의 출력으로 나옴
MemWrite
- 1 -> Write Data의 값을 데이터메모리의 Address 값에 기록
MemtoReg
- 0 -> ALU 출력이 레지스터 Write Data 입력값으로
- 1 -> 데이터메모리 출력이 레지스터 Write Data 입력으로
명령어별 신호값
R-type Instruction(add $t1, $t2, $t3)
- 명령어 인출 및 PC증가
- $t2, $t3를 읽음 + 제어선 값 설정
- ALU에서 연산, ALU제어값은 funct값(5:0)을 사용
- ALU의 결과값을 레지스터에 저장(명령어의 15:11 값을 사용해서 $t1을 설정)
Load Instruction
- 명령어 인출 및 PC증가
- 레지스터 $t2의 값 읽음
- ALU는 레지스터에서 읽은 값과 명령어의 하위 16비트(offset)에 부호확장된 값을 더함
- 결괏값을 데이터메모리의 주소로 사용
- 메모리에서 가지고 온 값을 $t1(대상은 명령어의 20:16)에 사용
Branch on equal instruction(beq $t1, $t2, offset)
- 명령어 인출 및 PC증가
- 레지스터 $t1, $t2 값 읽음
- ALU는 빼기 계산, offset(명령어의 하위 16비트)를 부호확장해 2비트 왼쪽 쉬프트한 값에 PC+4 값 더함, 이 값이 목적지 주소
- 더한 값을 PC에 저장할 것인지 ALU Zero 출력을 이용해서 결정
최종 제어유닛
Jump 명령어 추가
- Jump는 word 주소기반
- PC(Program Counter)를 이전 PC의 4비트 26비트 jump 주소 + 00로 세팅
- Opcode에서 추가 제어 신호(control signal)가 필요함
단일 사이클 구현의 문제
모든 평령어에서 클럭사이클이 같은 길이를 가져야 함
- 전체적인 성능 감소
- 크리티컬 패스는 적제(Load) 명령어 - 명령어메모리, 레지스터 파일, ALU, 데이터메모리, 레지스터 파일 사용
- 클럭사이클은 적재 명령어에 맞춰야 함
멀티 사이클 구현
- 각 단계를 한 사이클씩 사용
- 명령어마다 필요한 클럭 수가 달라질 수 있음
- 한 명령어 안에서 기능유닛 여러 번 사용 가능
- 한 명령어 실행 네에서 기능 유닛을 공유 가능
- 하드웨어 비용감소
- 추가 Mux/임시 레지스터/제어신호 필요
'전공 > 컴퓨터구조' 카테고리의 다른 글
[컴퓨터구조] #1 컴퓨터구조 - 추가 사설 문제 (0) | 2023.04.25 |
---|---|
[컴퓨터구조] #8 파이프라이닝 (0) | 2023.04.23 |
[컴퓨터구조] #6 단일 사이클 구현 1 (0) | 2023.04.23 |
[컴퓨터구조] #5 프로세서 (0) | 2023.04.15 |
[컴퓨터구조] #4 컴퓨터 연산 (0) | 2023.04.15 |