컴퓨터 구조_4

김현우·2025년 1월 20일

05. MIPS single-cycle microacrchitecture

Single-Cycle MIPS (32-bit) 시뮬레이터 설명 및 구성

초기화 (Initialization)

  1. 메모리와 레지스터 초기화:
    • PC (Program Counter): 명령어 실행 시작 주소를 나타내는 변수.
    • 레지스터: MIPS는 32개의 32비트 레지스터를 사용
    • 스택 포인터 (R[29]):
    • 초기값: 0x80000 (스택의 최상단 주소).
    • 리턴 주소 (R[31]):
    • 초기값: 0xFFFFFFFF (초기 리턴 주소, -1로 설정).
  2. 메모리 초기화:
    • MIPS 프로그램은 메모리에 로드되며, 메모리는 unsigned int memory[MEM_SIZE/4] 배열로 표현.

프로그램 로딩 (Loading)

  1. 바이너리 파일 읽기:
    • 프로그램 바이너리 파일을 읽어 메모리에 배치.
    • fread() 함수로 바이너리 파일의 내용을 읽어 메모리 배열에 저장.
  2. 메모리 레이아웃:
    • 프로그램 데이터는 메모리의 특정 영역에 배치.
    • 프로그램이 실행될 메모리 주소는 PC가 초기화되어 시작.

명령어 실행 단계 (Instruction Execution Stages)

  • MIPS는 하드웨어에서 수행되는 명령어 실행 단계를 소프트웨어로 시뮬레이션.
  1. Fetch (명령어 가져오기)

    • 기능: 메모리에서 명령어를 읽어 CPU로 가져옴.
    • 동작:
      • pc 값에 해당하는 메모리 주소에서 명령어를 읽음.
      • 명령어는 4바이트 크기 단위로 저장되므로, pc/4로 배열 접근
    • 초기값:
      • pc = 0 (프로그램 시작 주소).
  2. Decode (명령어 디코딩)

    • 기능: 명령어를 해석하여 작업의 종류와 필요한 레지스터를 결정.

    • 동작:

      • MIPS 명령어는 32비트로 구성되며, 명령어의 각 필드는 MIPS 명령어 형식표에 따라 해석.
      • 필드 분해 예시:
      • opcode (명령어 종류), rs (소스 레지스터), rt (타겟 레지스터), rd (결과 레지스터), immediate (즉시 값).

    • MIPS 명령어는 Green Sheet(명령어 구조표)를 참고하여 해석.

  3. Execution (실행)

    • 기능: ALU(산술 논리 장치)를 사용해 연산을 수행.
      • 동작:
      • 명령어에 따라 연산 수행.
  4. Memory Access (메모리 접근)

    • 기능: 메모리에서 데이터 읽기(load) 또는 데이터 쓰기(store).
    • 동작:
      • 명령어가 lw(load word) 또는 sw(store word)인 경우 메모리 접근.
        • lw → 메모리에서 값을 읽어 레지스터에 저장.
        • sw → 레지스터 값을 메모리에 저장.
  5. Writeback (결과 저장)

  • 기능: 연산 결과를 레지스터에 기록.
  • 동작:
    • 실행 또는 메모리 접근에서 나온 결과를 타겟 레지스터(rt 또는 rd)에 저장.

결과 처리 (Post-Execution)

  • 최종 결과:
    • 실행이 종료된 후, 결과는 특정 레지스터 (R[2] 등)에 저장.
  • 통계 정보 출력:
    • 명령어 실행 횟수, 메모리 접근 횟수 등 통계를 제공.

Single Cycle MIPS An Example Program Execution EX-MEM-WB

1. 명령어: 27bd ffe8

  • 2진수 변환: 0010 0111 1011 1101 1111 1111 1110 1000
  • 명령어 구조 (I-Type):
    • opcode (6 bits): 001001 → addiu (Add Immediate Unsigned)
    • rs (5 bits): 11101 → R29 (sp)
    • rt (5 bits): 11101 → R29 (sp)
    • immediate (16 bits): ffe8 → -24 (16진수)
  • 어셈블리어: addiu sp, sp, -24

2. 명령어: afbe 0014

  • 2진수 변환: 1010 1111 1011 1110 0000 0000 0001 0100
  • 명령어 구조 (I-Type):
    • pcode (6 bits): 101011 → sw (Store Word)
    • base (5 bits): 11101 → R29 (sp)
    • rt (5 bits): 11110 → R30 (s8)
    • offset (16 bits): 0014 → 20 (10진수)
  • 어셈블리어: sw s8, 20(sp)

3. 명령어: 03a0 f021

  • 2진수 변환: 0000 0011 1010 0000 1111 0000 0010 0001
  • 명령어 구조 (R-Type):
    • opcode (6 bits): 000000 → R-Type
    • rs (5 bits): 11101 → R29 (sp)
    • rt (5 bits): 00000 → R0
    • rd (5 bits): 11110 → R30 (s8)
    • shamt (5 bits): 00000
    • funct (6 bits): 100001 → addu
  • 어셈블리어: addu s8, sp, r0

4. 명령어: 2402 0064

  • 2진수 변환: 0010 0100 0000 0010 0000 0000 0110 0100
  • 명령어 구조 (I-Type):
    • opcode (6 bits): 001001 → addiu
    • rs (5 bits): 00000 → R0
    • rt (5 bits): 00010 → R2 (v0)
    • immediate (16 bits): 0064 → 100 (10진수)
  • 어셈블리어: addiu v0, r0, 100

5. 명령어: afc2 0008

  • 2진수 변환: 1010 1111 1100 0010 0000 0000 0000 1000
  • 명령어 구조 (I-Type):
    • opcode (6 bits): 101011 → sw
    • base (5 bits): 11110 → R30 (s8)
    • rt (5 bits): 00010 → R2 (v0)
    • offset (16 bits): 0008 → 8 (10진수)
  • 어셈블리어: sw v0, 8(s8)

6. 명령어: 8fc2 0008

  • 2진수 변환: 1000 1111 1100 0010 0000 0000 0000 1000
  • 명령어 구조 (I-Type):
    • opcode (6 bits): 100011 → lw
    • base (5 bits): 11110 → R30 (s8)
    • rt (5 bits): 00010 → R2 (v0)
    • offset (16 bits): 0008 → 8 (10진수)
  • 어셈블리어: lw v0, 8(s8)

7. 명령어: 03c0 e821

  • 2진수 변환: 0000 0011 1100 0000 1110 1000 0010 0001
  • 명령어 구조 (R-Type):
    • opcode (6 bits): 000000 → R-Type
    • rs (5 bits): 11110 → R30 (s8)
    • rt (5 bits): 00000 → R0
    • rd (5 bits): 11101 → R29 (sp)
    • shamt (5 bits): 00000
    • funct (6 bits): 100001 → addu
  • 어셈블리어: addu sp, s8, r0

8. 명령어: 8fbe 0014

  • 2진수 변환: 1000 1111 1011 1110 0000 0000 0001 0100
  • 명령어 구조 (I-Type):
    • opcode (6 bits): 100011 → lw
    • base (5 bits): 11101 → R29 (sp)
    • rt (5 bits): 11110 → R30 (s8)
    • offset (16 bits): 0014 → 20 (10진수)
  • 어셈블리어: lw s8, 20(sp)

9. 명령어: 27bd 0018

  • 2진수 변환: 0010 0111 1011 1101 0000 0000 0001 1000
  • 명령어 구조 (I-Type):
    • opcode (6 bits): 001001 → addiu
    • rs (5 bits): 11101 → R29 (sp)
    • rt (5 bits): 11101 → R29 (sp)
    • immediate (16 bits): 0018 → 24 (10진수)
  • 어셈블리어: addiu sp, sp, 24

10. 명령어: 03e0 0008

  • 2진수 변환: 0000 0011 1110 0000 0000 0000 0000 1000
  • 명령어 구조 (R-Type):
    • opcode (6 bits): 000000 → R-Type
    • rs (5 bits): 11110 → R30 (ra)
    • rt (5 bits): 00000 → R0
    • rd (5 bits): 00000 → R0
    • shamt (5 bits): 00000
    • funct (6 bits): 001000 → jr
  • 어셈블리어: jr ra

Single-Cycle MIPS 프로그램 실행 요령 및 주요 개념

MIPS 시뮬레이터 개요

  • MIPS 시뮬레이터:
    • CPU 및 메모리 동작을 모사하며, MIPS CPU 구조가 단순하기 때문에 학습 및 시뮬레이션에 적합.
    • 단일 사이클에서 모든 명령어를 처리하며, 기본적으로 CPU 데이터 경로를 재현.

MIPS 명령어 유형

  1. I-Type 명령어 (ALU 연산):
    • 예: addi, andi
    • ALU를 사용하여 즉시 값(immediate)을 처리.
  2. R-Type 명령어 (ALU 연산):
    • 예: add, sub, and, or
    • 두 레지스터 값을 ALU에서 연산 후 결과를 저장.
  3. 메모리 접근 (Load/Store):
    • 예: lw(Load Word), sw(Store Word)
    • 메모리에서 데이터를 읽거나 메모리에 데이터를 저장.
  4. 분기 (Branch):
    • 예: beq(Branch if Equal), bne(Branch if Not Equal)
    • 두 레지스터 값을 비교하여 특정 조건에서 분기.
  5. 점프 (Jump):
    • 예: j, jal
    • 프로그램 흐름을 특정 주소로 이동.

ALU 동작

  1. 숫자 연산:

    • 덧셈, 뺄셈 등을 수행.
      • 예: add, sub
  2. 논리 연산:

    • Boolean 연산 수행.
      • 예: and, or
  3. 조건 분기:

    • 두 레지스터 값을 비교하여 분기.
      • beq(두 값이 같으면 분기), bne(두 값이 다르면 분기)
    • 비교 연산은 ALU에서 뺄셈 연산으로 구현 가능.

Fetch vs Loading

profile
학생

2개의 댓글

comment-user-thumbnail
2025년 1월 21일

맛있네요

1개의 답글