ARM 프로세서 내부 구조: 3단 파이프라인과 명령어 실행 과정
2장 Organization & Implementation 개요
ARM 프로세서의 Organization (구성) 과 Implementation (구현) 을 학습한다. 3-stage pipeline ARM부터 5-stage ARM9까지의 진화, Principal Components, Data Forwarding, Branch, Memory Bottleneck을 다룬다.
ARM의 Principal Components
- Register file: 32-bit 16개의 범용 레지스터. 일부는 PC(R15), LR(R14) 등으로 용도 고정
- Barrel shifter: 레지스터 값을 cycle 내에서 shift/rotate (ARM의 특징)
- ALU: Arithmetic & Logic Unit
- Address register/incrementer: 다음 fetch를 위해 PC 증가
- Data register: 메모리와 주고받을 데이터 보관
- Instruction register: 현재 실행 중인 instruction
3-Stage Pipeline ARM (ARM7 이전)
Fetch → Decode → Execute
각 stage가 한 cycle씩 걸리고 CPI는 1에 가깝다. Program counter는 항상 현재 실행 중인 instruction + 8 (pipelining 때문).
3 Stages 설명
- Fetch: Instruction을 instruction register로 로드 → fetch 완료
- Decode: Instruction을 해석, register 읽기, control signal 생성
- Execute: ALU 연산, register에 결과 저장

ARM Single-Cycle Instruction Operations
ARM의 single-cycle instruction 종류:
- Data operation: ADD, SUB, MUL 등 ALU 연산 → register에 저장
- Addressing register R shifter: barrel shifter를 통해 연산 (ARM 특징)
- Store instruction: register 값을 메모리로 (1 cycle)
STR (Store Instruction) — Address Mode 4, 상대 주소로 쓰기
예: STR r0, [r1, #4] → r1 + 4 주소에 r0 저장
How to Improve the Performance
성능 향상의 기본 공식:
$$T_{prog} = N_{inst} \times CPI \times T_{clk}$$
- $N_{inst}$: instruction 수 (컴파일러, 알고리즘에 의존)
- $CPI$: cycles per instruction (pipeline 설계)
- $T_{clk}$: clock 주기
→ Pipeline stage 수를 늘려 $T_{clk}$을 줄이면, pipeline 효율에 따라 성능 향상 가능. 그러나 hazard 증가.
ARM은 3-stage → 5-stage pipeline으로 확장. 더 빠른 clock과 더 많은 pipeline 단계로 최종적으로 RISC 기반의 효율적 pipeline을 구성.

Memory Bottleneck (Von Neumann Bottleneck)
- Memory bottleneck에 의한 Structural Hazard 빈번히 발생
- Instruction을 읽는 것과 Data를 읽는 것이 동시에 수행될 수 없기에 하나가 멈춰서 수행 → Hazard 유발
Solution
Memory bandwidth를 증가시킴: - 일반적인 방법: Instruction과 Data Memory를 분리 (Harvard Architecture) - 1 cycle 당 access가 32-bit 이상을 전달해 주면 됨
5-Stage ARM Organization (ARM9)
Fetch → Decode → Execute → Buffer/Data → Write-Back
- Stage 수의 증가 → $f_{clk}$ 증가
- Instruction과 data memory 분리 → Memory bandwidth 2배
- CPI 증가 (Stage의 수가 증가하기에 중첩해 수행할 수 있는 Instruction 증가)
- Hazard 발생 확률의 증가이지만 나머지 이점이 더 크기에 상쇄 → $f_{clk}$ 증가, Memory bandwidth 증가
5 Stages 설명
- Fetch: I를 읽어와서 pipeline에 넣음
- Decode: I의 종류를 알고 준비 (register, Control Signal 준비)
- Execute: Operand shift, ALU 연산, 주소 연산
- Buffer/Data: Memory Access 혹은 by-pass됨
- Write-Back: 결과가 register에 저장
Multiple Load/Store
여러 개의 I를 하나로 대체할 수 있는 I 사용 가능 → MUX 부분이 있는 이유
LDR r1, 0(r0) 연속적인 증가
LDR r1, 4(r0) → 하나로 대체 가능
LDR r1, 8(r0)
LDR r1, 12(r0)

Data Forwarding
5-stage pipeline에서는 throughput ↑, I가 동시에 수행.
- Stall이 없다면 data dependency 관계가 있음 (data Hazard)
- Data Forwarding으로 해결
reg bank → Mux → ALU → D-cache
↑ │
└─────┘ internal forwarding
Mux를 통해 바로 나온 데이터를 사용할 수 있음.
Load I의 경우
그러나 Load I은 internal forwarding을 이용해도 1 stall이 필요. → Instruction reordering으로 해결 가능.
예:
LDR r0, 0(r1) LDR r0, 0(r1)
ADD r3, r0, r2 → ADD r4, r5, r1
ADD r4, r5, r1 ADD r3, r0, r2
(1 stall 필요) (stall 필요 X)
Data Processing Instruction
덧셈, 뺄셈, 곱셈과 같은 I의 처리 과정.
- 2개의 operand 필요
- 하나는 항상 register, 다른 하나는 register나 immediate value 가능 (8-bit로 표현 가능)
- barrel shifter를 통과함 (ARM 특징)
ADD [reg] [reg/imm] (shift 옵션 포함)
- 2개의 operand는 ALU에서 연산해서 register에 저장 (ARM 특징)
- Hazard가 없다면 1 cycle 동안 수행
예시
ADD r0, r1, r2 << 1 ← r2 LSL 1 (shift 이용)
- Data 연산:
data out으로 나옴 - Decoder 생략

Data Transfer Instruction
메모리와 Register 사이 데이터 이동 (Load/Store).
- Level 1 (Load I) = Single mem cycle: Stage 1 (1 cycle register access)
- 데이터 읽는 경우: register ← memory[address]
- 데이터 쓰는 경우: memory[address] ← register
Auto-Index (Pre/Post Index)
- Pre-index:
LDR r1, [r2, #4]→ address = r2 + 4, 메모리에서 읽음 (r2는 그대로) - Pre-index with writeback:
LDR r1, [r2, #4]!→ address r2 + 4, r2 r2 + 4 (갱신) - Post-index:
LDR r1, [r2], #4→ address r2, 읽은 후 r2 r2 + 4
이는 ARM의 특징인 load/store with auto-indexing을 지원.
Single I → Auto-index Calculation
ARM은 load/store 시 auto-indexing으로 주소 계산을 효율적으로 처리. 다른 ISA에서는 load + add가 필요하지만 ARM은 하나의 instruction에서 처리.
Branch Instruction
PC relative addressing, target address 계산.
- PC를 기준으로 offset (signed) 계산 → target address
- Target address = PC + offset
단순 Branch (B label): - 1st cycle: target 계산 및 PC 갱신
Branch with Link (BL label): - 1st cycle: branch target 계산 - 2nd cycle: return address를 R14 (LR) 에 저장 - 3rd cycle: LR 수정 (현재 PC의 다음번으로 돌아와야 하기에) → R14 = R14 + 4

정리
- Principal Components: Register file, Barrel shifter, ALU, Address/Data register, Instruction register
- 3-stage (ARM7) → 5-stage (ARM9) 로 진화, $f_{clk}$ 증가 + Harvard architecture로 memory bandwidth 2배
- Data Forwarding: Mux를 통한 internal forwarding으로 대부분 data hazard 해결, Load-use는 1 stall 또는 reordering
- Data Processing I: Barrel shifter 통과, 2 operand(하나는 immediate 가능), ALU 연산 후 register 저장
- Data Transfer I: Auto-indexing (pre/post)으로 주소 계산 효율화
- Branch: PC-relative, BL은 3 cycle 필요 (target + LR 저장 + LR 수정)
Pipelining의 기본 원칙과 ARM 특유의 최적화 (barrel shifter, auto-indexing, multiple load/store)를 결합해 RISC의 정수를 구현한다.
Comments (0)
No comments yet. Be the first to comment!
Please to write a comment.