검색
회원가입로그인
AI와 함께 공부하기 : 컴퓨터 구조

CPU: 파이프라인 명령어 type별 동작 원리

MIPS 메모리 표현 방식(Addressing Mode)에 따른 파이프라인 동작 과정

MIPS의 명령어 형식과 주소 지정 기법은 파이프라인의 각 단계에 명확하고 예측 가능한 영향을 미치도록 설계되었습니다. 각 주소 지정 모드가 파이프라인의 어느 단계에서 활성화되고 어떤 작업을 유발하는지 자세히 살펴보겠습니다.

1. 레지스터 주소 지정 (Register Addressing) - R-Type 명령어

  • 관련 명령어 예시: add $t0, $s1, $s2, sub $t0, $s1, $s2, and $t0, $s1, $s2, jr $ra

  • 특징: 피연산자가 모두 레지스터에 있습니다. 메모리 접근이 일체 없습니다.

파이프라인 동작 과정:

  1. IF (Instruction Fetch):

    • PC가 가리키는 주소에서 32비트 R-Type 명령어를 명령어 메모리(IM)에서 인출하여 IF/ID 레지스터에 저장합니다.

    • PC는 PC + 4로 업데이트됩니다.

  2. ID (Instruction Decode / Register Fetch):

    • IF/ID 레지스터의 R-Type 명령어를 해독합니다.

    • op 필드(000000)와 funct 필드를 통해 명령의 종류(add, sub 등)를 식별합니다. --> Control Unit 으로 이동

    • rsrt 필드(5비트)를 사용(각각 Read register 1, Read register 2로 이동)하여 Register File에서 해당 레지스터 값들을 읽어와 ID/EX 레지스터로 전달합니다. (두 개의 Read Port 활용)

    • rd 필드(5비트)를 write register에 전달해 저장되기 위한 레지스터의 주소값을 지정합니다.(MIPS는 총 32개의 register를 가지고 있어, 5비트로 레지스터 주소값을 표현 가능)

    • Control Unit은 R-Type 연산에 필요한 제어 신호들을 생성하여 ID/EX 레지스터로 보냅니다.

  3. EX (Execute):

    • ID/EX 레지스터에서 읽어온 두 레지스터 값(rs, rt)을 ALU의 입력으로 사용합니다.

    • ALU Control 신호에 따라 ALU는 add, sub, and 등 해당 R-Type 연산을 수행합니다.

    • ALU 결과와 쓰기 레지스터 주소(rd 또는 rt 필드), RegWrite 제어 신호 등을 EX/MEM 레지스터로 전달합니다. (메모리 접근 없음)

  4. MEM (Memory Access):

    • 데이터 메모리에 접근하지 않습니다. EX/MEM 레지스터의 내용(ALU 결과, 쓰기 레지스터 주소 등)을 그대로 MEM/WB 레지스터로 전달합니다. (MemRead/MemWrite 제어 신호는 비활성화됨)

  5. WB (Write Back):

    • MEM/WB 레지스터에 있는 ALU 결과 값을 Register Filerd 레지스터(또는 rt 레지스터, 명령어에 따라 다름)에 씁니다. (RegWrite 신호 활성화)

    • jr (Jump Register) 명령어의 경우, ALU 결과가 레지스터에 쓰이는 것이 아니라, rs 레지스터의 값이 PC로 업데이트되어 제어 흐름이 변경됩니다. 이 업데이트는 EX 단계 후 ID 단계의 PC 업데이트 로직에 영향을 줍니다.

2. 즉시 주소 지정 (Immediate Addressing) - I-Type 명령어 중 상수 연산

  • 관련 명령어 예시: addi $t0, $s1, 100, andi $t0, $s1, 0xFF, slti $t0, $s1, 5

  • 특징: 피연산자 중 하나가 명령어 자체 내에 포함된 상수(즉시값)입니다. 메모리 접근이 일체 없습니다.

파이프라인 동작 과정:

  1. IF (Instruction Fetch):

    • PC가 가리키는 주소에서 32비트 I-Type 명령어를 인출하여 IF/ID 레지스터에 저장합니다.

    • PC는 PC + 4로 업데이트됩니다.

  2. ID (Instruction Decode / Register Fetch):

    • IF/ID 레지스터의 I-Type 명령어를 해독합니다.

    • op 필드를 통해 addi, andi 등의 명령 종류를 식별합니다.

    • rs 필드를 사용하여 Register File에서 해당 레지스터 값을 읽어와 ID/EX 레지스터로 전달합니다.

    • 16비트 immediate 필드를 Sign Extender(또는 Zero Extender for andi, ori, xori)를 통해 32비트로 확장하여 ID/EX 레지스터로 전달합니다.

    • Control Unit은 I-Type 연산에 필요한 제어 신호들을 생성하여 ID/EX 레지스터로 보냅니다.

  3. EX (Execute):

    • ID/EX 레지스터에서 읽어온 rs 레지스터 값과 확장된 16비트 즉시값을 ALU의 입력으로 사용합니다. (ALU Source Mux가 즉시값 선택)

    • ALU Control 신호에 따라 ALU는 addi, andi 등 해당 연산을 수행합니다.

    • ALU 결과와 쓰기 레지스터 주소(rt 필드), RegWrite 제어 신호 등을 EX/MEM 레지스터로 전달합니다.

  4. MEM (Memory Access):

    • 데이터 메모리에 접근하지 않습니다. EX/MEM 레지스터의 내용을 그대로 MEM/WB 레지스터로 전달합니다.

  5. WB (Write Back):

    • MEM/WB 레지스터에 있는 ALU 결과 값을 Register Filert 레지스터에 씁니다. (RegWrite 신호 활성화)

값을 계산하는 R-format 명령어(예: add, sub, and)와 I-format의 immediate 연산 명령어(예: addi, andi, slti)의 경우, 메모리에 관련된 모든 컨트롤 유닛 신호는 꺼져 있습니다.

이 명령어들은 데이터를 메모리에서 읽거나(load) 쓰지(store) 않고, 오직 CPU 내부의 레지스터들 간 또는 레지스터와 즉시값 간의 연산만 수행하기 때문입니다. --> MemtoReg 값 또한 0으로 꺼져 있어야 ALU 연산만 진행한 값이 write data에 전달되어 write register(rt필드 레지스터)에 저장됩니다.

구체적으로 꺼져 있는 메모리 관련 제어 신호들은 다음과 같습니다:

  1. MemRead (Memory Read): 0 (데이터 메모리에서 읽기 비활성화)

  2. MemWrite (Memory Write): 0 (데이터 메모리에 쓰기 비활성화)

  3. MemToReg (Memory to Register): 0 (레지스터에 쓸 데이터 소스를 ALU 결과로 선택)

3. 기본/변위 주소 지정 (Base/Displacement Addressing) - I-Type 명령어 중 메모리 접근

  • 관련 명령어 예시: lw $t0, 100($s1), sw $t0, 100($s1), lb $t0, 0($s1)

  • 특징: 메모리에 저장된 데이터에 접근하며, 주소는 베이스 레지스터 값과 명령어 내 오프셋의 합으로 계산됩니다.

파이프라인 동작 과정:

  1. IF (Instruction Fetch):

    • PC가 가리키는 주소에서 32비트 Load/Store 명령어를 인출하여 IF/ID 레지스터에 저장합니다.

    • PC는 PC + 4로 업데이트됩니다.

  2. ID (Instruction Decode / Register Fetch):

    • IF/ID 레지스터의 Load/Store 명령어를 해독합니다.

    • op 필드를 통해 lw, sw 등의 명령 종류를 식별합니다.

    • rs 필드(베이스 레지스터)를 사용하여 Register File에서 해당 레지스터 값을 읽어와 ID/EX 레지스터로 전달합니다.

    • 16비트 offset 필드를 Sign Extender를 통해 32비트로 부호 확장하여 ID/EX 레지스터로 전달합니다.

    • Control Unit은 메모리 접근에 필요한 제어 신호들(MemRead, MemWrite, MemToReg, RegWrite 등)을 생성하여 ID/EX 레지스터로 보냅니다.

  3. EX (Execute):

    • ID/EX 레지스터에서 읽어온 rs 레지스터 값과 확장된 offset 값을 ALU의 입력으로 사용합니다. (ALU Source Mux가 즉시값 선택)

    • ALU는 이 두 값을 더하여 데이터 메모리의 유효 주소(Effective Address)를 계산합니다.

    • sw 명령의 경우, rt 레지스터의 값(메모리에 저장할 데이터)도 EX/MEM 레지스터로 전달됩니다.

    • 계산된 주소, rt 레지스터 값, 제어 신호(MemRead, MemWrite, MemToReg, RegWrite 등)를 EX/MEM 레지스터로 전달합니다.

  4. MEM (Memory Access):

    • EX/MEM 레지스터에서 계산된 메모리 주소와 제어 신호(MemRead, MemWrite)를 가져옵니다.

    • 데이터 메모리(DM)에 실제로 접근합니다.

      • lw, lb, lh 등 Load 명령인 경우: MemRead가 활성화되어 해당 주소에서 데이터를 읽어옵니다. 읽어온 데이터는 MEM/WB 레지스터로 전달됩니다.

      • sw, sb, sh 등 Store 명령인 경우: MemWrite가 활성화되어 EX/MEM 레지스터에 있던 rt 레지스터의 값을 해당 주소에 씁니다. (Store 명령은 WB 단계에서 레지스터에 쓰지 않으므로 RegWrite가 비활성화됨)

    • 정렬 검사: 이 단계에서 주소의 정렬 상태가 검사되며, 조건이 충족되지 않으면 예외가 발생할 수 있습니다.

  5. WB (Write Back):

    • Load 명령인 경우만 레지스터에 씁니다. MEM/WB 레지스터에 있는 메모리에서 읽어온 데이터를 Register Filert 레지스터에 씁니다. (MemToReg Mux가 메모리 데이터 선택, RegWrite 활성화)

    • Store 명령은 WB 단계에서 아무것도 하지 않습니다.

4. PC-상대 주소 지정 (PC-Relative Addressing) - I-Type 명령어 중 조건부 분기

  • 관련 명령어 예시: beq $t0, $t1, Label, bne $t0, $t1, Label

  • 특징: 점프할 목적지 주소가 현재 PC 값과 명령어 내 오프셋의 합으로 계산됩니다.

파이프라인 동작 과정:

  1. IF (Instruction Fetch):

    • PC가 가리키는 주소에서 32비트 분기 명령어를 인출하여 IF/ID 레지스터에 저장합니다.

    • PC는 PC + 4로 미리 업데이트됩니다. (분기 발생 여부를 아직 모르기 때문에)

  2. ID (Instruction Decode / Register Fetch):

    • IF/ID 레지스터의 분기 명령어를 해독합니다.

    • op 필드를 통해 beq, bne 명령 종류를 식별합니다.

    • rsrt 필드를 사용하여 Register File에서 해당 레지스터 값들을 읽어와 ID/EX 레지스터로 전달합니다. (비교 연산에 사용)

    • 16비트 offset 필드를 Sign Extender를 통해 32비트로 부호 확장한 후, Shift Left 2(워드 오프셋을 바이트 오프셋으로 변환)를 수행하여 ID/EX 레지스터로 전달합니다.

    • 이 단계에서 잠재적인 분기 목적지 주소 (PC_from_IF/ID + 4) + (SignExt(offset) << 2)를 계산해 둡니다.

    • Control Unit은 분기에 필요한 제어 신호(Branch 등)를 생성합니다.

  3. EX (Execute):

    • ID/EX 레지스터에서 읽어온 rsrt 레지스터 값을 ALU의 입력으로 사용합니다.

    • ALU는 이 두 값을 비교하여 분기 조건(rs == rt 또는 rs != rt)을 평가합니다. (예: rs - rt 연산 후 결과가 0인지 검사, ALU의 Zero는 비교 연산 확인을 위해 사용됩니다.)

    • 분기 조건이 참인 경우: PC_Source Mux가 ID 단계에서 계산해 둔 분기 목적지 주소를 선택하도록 제어 신호(Branch와 ALU의 Zero flag 조합)가 발생합니다. 다음 클럭 사이클 시작 시 이 주소로 PC가 업데이트됩니다. (이때, IF/ID, ID/EX 래치에 있는 파이프라인의 명령어가 잘못 인출된 것이므로 플러시(Flush) 됩니다 - 제어 해저드 처리, 추후 다룸.).

    • 분기 조건이 거짓인 경우: PC는 PC + 4 경로를 그대로 유지합니다.

  4. MEM (Memory Access):

    • 데이터 메모리 접근 없음. 이 단계에 도달한 분기 명령은 이미 EX 단계에서 PC 업데이트 여부를 결정했습니다.

  5. WB (Write Back):

    • 레지스터 쓰기 없음. 분기 명령어는 레지스터에 값을 쓰지 않습니다.

5. 가상 직접 주소 지정 (Pseudodirect Addressing) - J-Type 명령어

  • 관련 명령어 예시: j Label, jal Label

  • 특징: 절대 주소로 무조건 점프하며, 주소는 명령어 내 26비트 주소 필드와 현재 PC의 상위 비트를 조합하여 생성됩니다.

파이프라인 동작 과정:

  1. IF (Instruction Fetch):

    • PC가 가리키는 주소에서 32비트 J-Type 명령어를 인출하여 IF/ID 레지스터에 저장합니다.

    • PC는 PC + 4로 미리 업데이트됩니다.

  2. ID (Instruction Decode / Register Fetch):

    • IF/ID 레지스터의 J-Type 명령어를 해독합니다.

    • op 필드를 통해 j, jal 명령 종류를 식별합니다.

    • 명령어의 26비트 target address 필드를 가져옵니다.

    • Control Unit은 점프에 필요한 제어 신호(Jump 등)를 생성합니다.

  3. EX (Execute):

    • ID 단계에서 가져온 26비트 target addressShift Left 2 (워드 주소를 바이트 주소로 변환) 한 후, 현재 PC의 상위 4비트와 결합하여 최종 32비트 절대 점프 주소를 생성합니다.

    • 이 절대 점프 주소는 PC_Source Mux가 선택하도록 제어 신호(Jump)가 발생합니다. 다음 클럭 사이클 시작 시 이 주소로 PC가 업데이트됩니다. (이때도 Branch와 유사하게 파이프라인 플러시 발생 - 제어 해저드 처리).

    • jal 명령의 경우, PC + 4 (즉, 복귀 주소)를 $ra 레지스터에 저장할 준비를 합니다. (이 저장은 WB 단계에서 이루어집니다.)

  4. MEM (Memory Access):

    • 데이터 메모리 접근 없음.

  5. WB (Write Back):

    • jal 명령인 경우: EX 단계에서 준비된 PC + 4 값을 Register File$ra 레지스터에 씁니다.

    • j 명령은 WB 단계에서 아무것도 하지 않습니다.

6. 점프 레지스터 주소 지정 (Jump Register Addressing) - R-Type 명령어 중 제어 흐름 변경

  • 관련 명령어 예시: jr $ra, jalr $s0

  • 특징: 점프할 목적지 주소가 레지스터에 저장되어 있습니다.

파이프라인 동작 과정:

  1. IF (Instruction Fetch):

    • PC가 가리키는 주소에서 32비트 jr 명령어를 인출하여 IF/ID 레지스터에 저장합니다.

    • PC는 PC + 4로 미리 업데이트됩니다.

  2. ID (Instruction Decode / Register Fetch):

    • IF/ID 레지스터의 jr 명령어를 해독합니다.

    • op 필드(000000)와 funct 필드(jr의 funct 코드)를 통해 명령 종류를 식별합니다.

    • rs 필드(점프할 주소가 담긴 레지스터)를 사용하여 Register File에서 해당 레지스터 값을 읽어와 ID/EX 레지스터로 전달합니다.

    • Control Unitjr에 필요한 제어 신호를 생성합니다.

  3. EX (Execute):

    • ID/EX 레지스터에서 읽어온 rs 레지스터 값(점프할 목적지 주소)을 가져옵니다.

    • rs 값은 PC_Source Mux가 선택하도록 제어 신호가 발생합니다. 다음 클럭 사이클 시작 시 이 주소로 PC가 업데이트됩니다. (jr도 제어 해저드 처리 필요)

    • jalr 명령의 경우, PC + 4 (복귀 주소)를 $rd 레지스터에 저장할 준비를 합니다.

  4. MEM (Memory Access):

    • 데이터 메모리 접근 없음.

  5. WB (Write Back):

    • jalr 명령인 경우: EX 단계에서 준비된 PC + 4 값을 Register File$rd 레지스터에 씁니다.

    • jr 명령은 WB 단계에서 아무것도 하지 않습니다.


공유하기
카카오로 공유하기
페이스북 공유하기
트위터로 공유하기
url 복사하기