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
등특징: 피연산자가 모두 레지스터에 있습니다. 메모리 접근이 일체 없습니다.
파이프라인 동작 과정:
IF (Instruction Fetch):
PC가 가리키는 주소에서 32비트 R-Type 명령어를 명령어 메모리(IM)에서 인출하여
IF/ID
레지스터에 저장합니다.PC는
PC + 4
로 업데이트됩니다.
ID (Instruction Decode / Register Fetch):
IF/ID
레지스터의 R-Type 명령어를 해독합니다.op
필드(000000)와funct
필드를 통해 명령의 종류(add
,sub
등)를 식별합니다. --> Control Unit 으로 이동rs
및rt
필드(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
레지스터로 보냅니다.
EX (Execute):
ID/EX
레지스터에서 읽어온 두 레지스터 값(rs
,rt
)을 ALU의 입력으로 사용합니다.ALU Control
신호에 따라 ALU는add
,sub
,and
등 해당 R-Type 연산을 수행합니다.ALU 결과와 쓰기 레지스터 주소(
rd
또는rt
필드),RegWrite
제어 신호 등을EX/MEM
레지스터로 전달합니다. (메모리 접근 없음)
MEM (Memory Access):
데이터 메모리에 접근하지 않습니다.
EX/MEM
레지스터의 내용(ALU 결과, 쓰기 레지스터 주소 등)을 그대로MEM/WB
레지스터로 전달합니다. (MemRead/MemWrite 제어 신호는 비활성화됨)
WB (Write Back):
MEM/WB
레지스터에 있는 ALU 결과 값을Register File
의rd
레지스터(또는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
등특징: 피연산자 중 하나가 명령어 자체 내에 포함된 상수(즉시값)입니다. 메모리 접근이 일체 없습니다.
파이프라인 동작 과정:
IF (Instruction Fetch):
PC가 가리키는 주소에서 32비트 I-Type 명령어를 인출하여
IF/ID
레지스터에 저장합니다.PC는
PC + 4
로 업데이트됩니다.
ID (Instruction Decode / Register Fetch):
IF/ID
레지스터의 I-Type 명령어를 해독합니다.op
필드를 통해addi
,andi
등의 명령 종류를 식별합니다.rs
필드를 사용하여Register File
에서 해당 레지스터 값을 읽어와ID/EX
레지스터로 전달합니다.16비트
immediate
필드를Sign Extender
(또는Zero Extender
forandi
,ori
,xori
)를 통해 32비트로 확장하여ID/EX
레지스터로 전달합니다.Control Unit
은 I-Type 연산에 필요한 제어 신호들을 생성하여ID/EX
레지스터로 보냅니다.
EX (Execute):
ID/EX
레지스터에서 읽어온rs
레지스터 값과 확장된 16비트 즉시값을 ALU의 입력으로 사용합니다. (ALU Source Mux가 즉시값 선택)ALU Control
신호에 따라 ALU는addi
,andi
등 해당 연산을 수행합니다.ALU 결과와 쓰기 레지스터 주소(
rt
필드),RegWrite
제어 신호 등을EX/MEM
레지스터로 전달합니다.
MEM (Memory Access):
데이터 메모리에 접근하지 않습니다.
EX/MEM
레지스터의 내용을 그대로MEM/WB
레지스터로 전달합니다.
WB (Write Back):
MEM/WB
레지스터에 있는 ALU 결과 값을Register File
의rt
레지스터에 씁니다. (RegWrite
신호 활성화)
값을 계산하는 R-format 명령어(예: add
, sub
, and
)와 I-format의 immediate 연산 명령어(예: addi
, andi
, slti
)의 경우, 메모리에 관련된 모든 컨트롤 유닛 신호는 꺼져 있습니다.
이 명령어들은 데이터를 메모리에서 읽거나(load) 쓰지(store) 않고, 오직 CPU 내부의 레지스터들 간 또는 레지스터와 즉시값 간의 연산만 수행하기 때문입니다. --> MemtoReg 값 또한 0으로 꺼져 있어야 ALU 연산만 진행한 값이 write data에 전달되어 write register(rt
필드 레지스터)에 저장됩니다.
구체적으로 꺼져 있는 메모리 관련 제어 신호들은 다음과 같습니다:
MemRead
(Memory Read): 0 (데이터 메모리에서 읽기 비활성화)MemWrite
(Memory Write): 0 (데이터 메모리에 쓰기 비활성화)MemToReg
(Memory to Register): 0 (레지스터에 쓸 데이터 소스를 ALU 결과로 선택)
3. 기본/변위 주소 지정 (Base/Displacement Addressing) - I-Type 명령어 중 메모리 접근
관련 명령어 예시:
lw $t0, 100($s1)
,sw $t0, 100($s1)
,lb $t0, 0($s1)
등특징: 메모리에 저장된 데이터에 접근하며, 주소는 베이스 레지스터 값과 명령어 내 오프셋의 합으로 계산됩니다.
파이프라인 동작 과정:
IF (Instruction Fetch):
PC가 가리키는 주소에서 32비트 Load/Store 명령어를 인출하여
IF/ID
레지스터에 저장합니다.PC는
PC + 4
로 업데이트됩니다.
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
레지스터로 보냅니다.
EX (Execute):
ID/EX
레지스터에서 읽어온rs
레지스터 값과 확장된offset
값을 ALU의 입력으로 사용합니다. (ALU Source Mux가 즉시값 선택)ALU는 이 두 값을 더하여 데이터 메모리의 유효 주소(Effective Address)를 계산합니다.
sw
명령의 경우,rt
레지스터의 값(메모리에 저장할 데이터)도EX/MEM
레지스터로 전달됩니다.계산된 주소,
rt
레지스터 값, 제어 신호(MemRead
,MemWrite
,MemToReg
,RegWrite
등)를EX/MEM
레지스터로 전달합니다.
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
가 비활성화됨)
정렬 검사: 이 단계에서 주소의 정렬 상태가 검사되며, 조건이 충족되지 않으면 예외가 발생할 수 있습니다.
WB (Write Back):
Load 명령인 경우만 레지스터에 씁니다.
MEM/WB
레지스터에 있는 메모리에서 읽어온 데이터를Register File
의rt
레지스터에 씁니다. (MemToReg
Mux가 메모리 데이터 선택,RegWrite
활성화)Store 명령은 WB 단계에서 아무것도 하지 않습니다.
4. PC-상대 주소 지정 (PC-Relative Addressing) - I-Type 명령어 중 조건부 분기
관련 명령어 예시:
beq $t0, $t1, Label
,bne $t0, $t1, Label
특징: 점프할 목적지 주소가 현재 PC 값과 명령어 내 오프셋의 합으로 계산됩니다.
파이프라인 동작 과정:
IF (Instruction Fetch):
PC가 가리키는 주소에서 32비트 분기 명령어를 인출하여
IF/ID
레지스터에 저장합니다.PC는
PC + 4
로 미리 업데이트됩니다. (분기 발생 여부를 아직 모르기 때문에)
ID (Instruction Decode / Register Fetch):
IF/ID
레지스터의 분기 명령어를 해독합니다.op
필드를 통해beq
,bne
명령 종류를 식별합니다.rs
및rt
필드를 사용하여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
등)를 생성합니다.
EX (Execute):
ID/EX
레지스터에서 읽어온rs
및rt
레지스터 값을 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
경로를 그대로 유지합니다.
MEM (Memory Access):
데이터 메모리 접근 없음. 이 단계에 도달한 분기 명령은 이미 EX 단계에서 PC 업데이트 여부를 결정했습니다.
WB (Write Back):
레지스터 쓰기 없음. 분기 명령어는 레지스터에 값을 쓰지 않습니다.
5. 가상 직접 주소 지정 (Pseudodirect Addressing) - J-Type 명령어
관련 명령어 예시:
j Label
,jal Label
특징: 절대 주소로 무조건 점프하며, 주소는 명령어 내 26비트 주소 필드와 현재 PC의 상위 비트를 조합하여 생성됩니다.
파이프라인 동작 과정:
IF (Instruction Fetch):
PC가 가리키는 주소에서 32비트 J-Type 명령어를 인출하여
IF/ID
레지스터에 저장합니다.PC는
PC + 4
로 미리 업데이트됩니다.
ID (Instruction Decode / Register Fetch):
IF/ID
레지스터의 J-Type 명령어를 해독합니다.op
필드를 통해j
,jal
명령 종류를 식별합니다.명령어의 26비트
target address
필드를 가져옵니다.Control Unit
은 점프에 필요한 제어 신호(Jump
등)를 생성합니다.
EX (Execute):
ID 단계에서 가져온 26비트
target address
를Shift Left 2
(워드 주소를 바이트 주소로 변환) 한 후, 현재 PC의 상위 4비트와 결합하여 최종 32비트 절대 점프 주소를 생성합니다.이 절대 점프 주소는
PC_Source Mux
가 선택하도록 제어 신호(Jump
)가 발생합니다. 다음 클럭 사이클 시작 시 이 주소로 PC가 업데이트됩니다. (이때도Branch
와 유사하게 파이프라인 플러시 발생 - 제어 해저드 처리).jal
명령의 경우,PC + 4
(즉, 복귀 주소)를$ra
레지스터에 저장할 준비를 합니다. (이 저장은 WB 단계에서 이루어집니다.)
MEM (Memory Access):
데이터 메모리 접근 없음.
WB (Write Back):
jal
명령인 경우:EX
단계에서 준비된PC + 4
값을Register File
의$ra
레지스터에 씁니다.j
명령은 WB 단계에서 아무것도 하지 않습니다.
6. 점프 레지스터 주소 지정 (Jump Register Addressing) - R-Type 명령어 중 제어 흐름 변경
관련 명령어 예시:
jr $ra
,jalr $s0
특징: 점프할 목적지 주소가 레지스터에 저장되어 있습니다.
파이프라인 동작 과정:
IF (Instruction Fetch):
PC가 가리키는 주소에서 32비트
jr
명령어를 인출하여IF/ID
레지스터에 저장합니다.PC는
PC + 4
로 미리 업데이트됩니다.
ID (Instruction Decode / Register Fetch):
IF/ID
레지스터의jr
명령어를 해독합니다.op
필드(000000)와funct
필드(jr
의 funct 코드)를 통해 명령 종류를 식별합니다.rs
필드(점프할 주소가 담긴 레지스터)를 사용하여Register File
에서 해당 레지스터 값을 읽어와ID/EX
레지스터로 전달합니다.Control Unit
은jr
에 필요한 제어 신호를 생성합니다.
EX (Execute):
ID/EX
레지스터에서 읽어온rs
레지스터 값(점프할 목적지 주소)을 가져옵니다.이
rs
값은PC_Source Mux
가 선택하도록 제어 신호가 발생합니다. 다음 클럭 사이클 시작 시 이 주소로 PC가 업데이트됩니다. (jr
도 제어 해저드 처리 필요)jalr
명령의 경우,PC + 4
(복귀 주소)를$rd
레지스터에 저장할 준비를 합니다.
MEM (Memory Access):
데이터 메모리 접근 없음.
WB (Write Back):
jalr
명령인 경우:EX
단계에서 준비된PC + 4
값을Register File
의$rd
레지스터에 씁니다.jr
명령은 WB 단계에서 아무것도 하지 않습니다.