전공/컴퓨터구조

[컴퓨터구조] #7 단일 사이클 구현 2

Campus Coder 2023. 4. 23. 16:06
728x90
반응형

 

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)

  1. 명령어 인출 및 PC증가
  2. $t2, $t3를 읽음 + 제어선 값 설정
  3. ALU에서 연산, ALU제어값은 funct값(5:0)을 사용
  4. ALU의 결과값을 레지스터에 저장(명령어의 15:11 값을 사용해서 $t1을 설정)

 

Load Instruction

  1. 명령어 인출 및 PC증가
  2. 레지스터 $t2의 값 읽음
  3. ALU는 레지스터에서 읽은 값과 명령어의 하위 16비트(offset)에 부호확장된 값을 더함
  4. 결괏값을 데이터메모리의 주소로 사용
  5. 메모리에서 가지고 온 값을 $t1(대상은 명령어의 20:16)에 사용

 

Branch on equal instruction(beq $t1, $t2, offset)

  1. 명령어 인출 및 PC증가
  2. 레지스터 $t1, $t2 값 읽음
  3. ALU는 빼기 계산, offset(명령어의 하위 16비트)를 부호확장해 2비트 왼쪽 쉬프트한 값에 PC+4 값 더함, 이 값이 목적지 주소
  4. 더한 값을 PC에 저장할 것인지 ALU Zero 출력을 이용해서 결정

 

최종 제어유닛

 

Jump 명령어 추가

- Jump는 word 주소기반

- PC(Program Counter)를 이전 PC의 4비트 26비트 jump 주소 + 00로 세팅

- Opcode에서 추가 제어 신호(control signal)가 필요함

Jump 명령 추가된 데이터패스

단일 사이클 구현의 문제

모든 평령어에서 클럭사이클이 같은 길이를 가져야 함

- 전체적인 성능 감소

- 크리티컬 패스는 적제(Load) 명령어 - 명령어메모리, 레지스터 파일, ALU, 데이터메모리, 레지스터 파일 사용

- 클럭사이클은 적재 명령어에 맞춰야 함

 

멀티 사이클 구현

- 각 단계를 한 사이클씩 사용

- 명령어마다 필요한 클럭 수가 달라질 수 있음

- 한 명령어 안에서 기능유닛 여러 번 사용 가능

- 한 명령어 실행 네에서 기능 유닛을 공유 가능

- 하드웨어 비용감소

 

- 추가 Mux/임시 레지스터/제어신호 필요

 

728x90
반응형