만쥬의 개발일기
article thumbnail

지난 포스팅을 보지 않았다면 먼저 읽고 오자.

 

[CA] - MIPS의 Datapath 이해하기

오늘 배워볼 것은 MIPS의 Datapath이다. CPU의 핵심 구성 요소인 Datapath는 Computer Architecture의 꽃이고, 이후 CA내용을 이해하는데 있어 굉장히 중요한 요소라고 생각해서 포스팅을 작성하게 되었다. ❓D

kangmanjoo.tistory.com

📚MIPS의 instruction들

MIPS의 명령어들은 다음 세가지 + jump 중 하나의 구조를 가지고 있다. 

jump 구조는 이후 포스팅에서 다루겠다.

 

각 명령어의 필드와 일부 예시를 먼저 설명해보겠다.

R-type

필드

  • opcode : 명령어의 종류를 나타내는 필드
  • rs,rt,rd : 각각 source, source, destination 레지스터를 가리키는 필드
  • sham : 시프트 연산 시 사용되는 시프트 횟수를 나타내는 필드
  • funct : 명령어의 기능을 추가적으로 구체화해주는 필드

명령어 예시

  • add
  • subtract
  • and
  • or
  • sll (shift left logical)

R-type의 모든 명령어는 연산 수행 결과를 rd 레지스터에 저장한다.

 

I-type (load/store)

필드

  • opcode : Load의 경우 100011 (35) , Store의 경우 101011 (43) 이다. 
  • rs : 베이스 레지스터로, 타겟 메모리 주소는 rs의 값과 offset(address) 값을 조합하여 계산한다.
  • rt :
    • Load의 경우 타겟 메모리에서 데이터를 읽어와 rt 레지스터에 저장
    • Store의 경우  rt 레지스터의 값을 타겟 메모리에 저장한다.
  • address : 타겟 메모리 주소를 계산하기 위한 offset을 나타내는 필드. immediate 필드라고도 한다.

 

I-type (Branch)

필드

  • opcode : 브랜치 명령어를 구분하는 역할
  • rs : 조건을 평가할 source 레지스터
  • rt : 조건에 따라 분기할지를 결정하는 타겟 레지스터 
  • address : 현재 명령어의 주소에 이 주소를 더해 분기 주소를 계산한다. 즉 offset

브랜치 명령어에 따라 rs, rt의 값이 조건에 맞는지 (크거나 같거나 작은지)를 판단하고, 

조건에 맞을 경우 PC(현재 주소)에 offset을 더해 분기하고, 조건에 맞지 않을 경우 PC+4로 이동한다.

 

 

🛣️각 명령어 별 Datapath

R-type instruction

빨간 동그라미 = 실행되는 control signal

주어진 instruction : add t3 s1 s2

STEP

  1. 명령어를 PC에서 읽어오고 PC의 값을 4 증가시킨다.
  2. 두 레지스터 s1, s2를 레지스터 파일로부터 읽고, t3를 write address에 저장한다.
  3. ALU에서 Read Data1과 Read Data2를 통해 읽어들인 값에 대한 덧셈을 하여 t3에 저장할 값을 계산한다.
  4. ALU의 연산에서는 funct 코드를 사용하여 ALU 제어신호를 생성한다.
  5. ALU의 덧셈 결과는 메모리에 저장하지않고 바로 write data에 저장하고, write address에 기록한다.
  6. PC를 4 증가시킨다.

Load Word

 

주어진 instruction : lw t1 offset(s2)

STEP

  1. 명령어를 PC에서 읽어오고 PC의 값을 4 증가시킨다.
  2. 레지스터값 s2을 레지스터 파일로부터 읽는다.
  3. 레지스터값 t1을 write address에 저장한다.
  4.  ALU는 Read Data 1을 통해 읽은 s2 값과 offset을 32비트로 확장한 값을 더해 메모리 주소를 구한다.
  5. 메모리에서 해당 주소에 존재하는 값을 write data에 저장한다.
  6. write address인 t1에 해당 값을 기록한다.
  7. PC를 4 증가시킨다.

주의할 점은, 목적지인 t1이 rt이고 메모리 주소 연산에 사용하는 s2가 rs이다.

Store Word

주어진 instruction : sw t1 offset(s2)

STEP

  1. 명령어를 PC에서 읽어오고 PC의 값을 4 증가시킨다.
  2. 레지스터값 t1,s2을 레지스터 파일로부터 읽는다.
  3.  ALU는 Read Data 1을 통해 읽은 s2 값과 offset 값을 더해 메모리 주소를 계산한다.
  4. Read Data2에서 읽은 t1의 값을 3에서 계산한 메모리 주소에 기록한다.
  5. PC를 4 증가시킨다.

주의할 점은, 목적지 메모리 연산에 사용하는 s2가 rs이고, 값을 나타내는 t1이 rt 이다.

Branch instruction

주어진 instruction - beq t1, t2, offset

STEP

  1. 명령어를 PC에서 읽어오고 PC의 값을 4 증가시킨다.
  2. 두 레지스터 t1, t2를 레지스터 파일로부터 읽는다.
  3. ALU에서 Read Data1과 Read Data2를 통해 읽어들인 값에 대한 뺄셈을 하여 분기 여부를 결정한다.
  4. 이후 offset을 32비트로 확장한 뒤 shift left 2 연산을 수행하고, PC+4와 더해서 분기할 주소를 계산한다.                           (shift left 2를 하는 이유는 메모리 주소는 4의 배수로 계산되는데, 하위 2비트는 주소연산에서 필요가 없으므로 0으로 채워준다. 이렇게 함으로서 jump연산으로 나타낼 수 있는 범위가 더 커지게 된다.)
  5. ALU의 연산 결과를 zero로 출력하여 PC+4와 새로 구한 분기주소중 어느 것을 PC에 저장할 지 결정한다.

'🖥️CS > 📗컴퓨터구조' 카테고리의 다른 글

[CA] - 시스템 버스(Bus)란?  (0) 2024.06.14
[CA] - MIPS의 Datapath 이해하기  (0) 2023.06.16
profile

만쥬의 개발일기

@KangManJoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!