시리즈 로드맵
이 시리즈는 CPU가 명령어를 실행하는 방식을 RISC-V를 기준으로 밑바닥부터 쌓아 올린다.
| # | 주제 | 상태 |
|---|---|---|
| 1 | RISC-V란 무엇인가 | ✅ |
| 2 | Instruction이란: 명령어 인코딩과 포맷 | 🔲 |
| 3 | 거시적 파이프라인과 각 유닛의 하드웨어 구조 | 🔲 |
| 4 | 파이프라인 심화: 해저드 처리와 분기 예측 | 🔲 |
| 5 | 요약, 심화 아키텍처, 다른 CPU 아키텍처 | 🔲 |
ISA: 하드웨어와 소프트웨어의 계약
CPU를 이해하려면 먼저 ISA(Instruction Set Architecture, 명령어 집합 구조) 를 이해해야 한다. ISA는 하드웨어와 소프트웨어 사이의 계약이다.

소프트웨어는 ISA가 정의한 명령어만 사용한다. 하드웨어는 그 명령어를 어떤 방식으로든 실행하기만 하면 된다. 이 계약이 안정적으로 유지되므로, 소프트웨어를 바꾸지 않고 하드웨어 구현을 바꿀 수 있다.
ISA가 정하는 것과 정하지 않는 것을 구분해야 한다.
| ISA가 정하는 것 (아키텍처) | ISA가 정하지 않는 것 (마이크로아키텍처) |
|---|---|
| 명령어 종류와 인코딩 | 파이프라인 단계 수 |
| 레지스터 개수와 크기 | 캐시 크기와 구조 |
| 메모리 주소 지정 방식 | 분기 예측 방식 |
| 예외/인터럽트 동작 | 클럭 속도, 실행 유닛 개수 |
add, ld, beq 같은 명령어가 무엇을 하는지는 ISA가 정한다. 그 명령어를 5단계 파이프라인으로 처리할지, 비순차 실행으로 처리할지는 하드웨어 설계자의 자유다. 이 시리즈의 3편과 4편에서 다룰 파이프라인은 후자, 즉 마이크로아키텍처의 영역이다.
RISC와 CISC: 두 가지 설계 철학
ISA 설계에는 두 가지 상반된 철학이 있다. CISC(Complex Instruction Set Computer) 와 RISC(Reduced Instruction Set Computer) 다.
CISC는 하나의 명령어가 복잡한 작업을 수행한다. x86이 대표적이다. 메모리에서 값을 읽어 연산하고 다시 메모리에 쓰는 작업을 한 명령어로 처리할 수 있다. 명령어 길이도 가변적이다(1바이트에서 15바이트까지).
RISC는 반대다. 명령어를 단순하게 유지하고, 복잡한 작업은 단순 명령어의 조합으로 처리한다.
| 항목 | CISC (x86) | RISC (RISC-V) |
|---|---|---|
| 명령어 복잡도 | 복잡 (다단계 작업) | 단순 (한 작업) |
| 명령어 길이 | 가변 (1~15바이트) | 고정 (4바이트, 압축 시 2) |
| 메모리 접근 | 대부분의 명령어가 가능 | load/store만 가능 |
| 레지스터 수 | 적음 (x86-64: 16개) | 많음 (32개) |
| 디코딩 | 복잡 | 단순 |
RISC의 핵심 원칙은 load/store 아키텍처다. 메모리에 접근하는 명령어는 load(읽기)와 store(쓰기)뿐이다. 나머지 연산 명령어는 레지스터끼리만 계산한다. 메모리 값을 더하려면 먼저 load로 레지스터에 올리고, 더한 뒤, store로 되돌린다.
이 제약이 왜 이득인가. 명령어가 단순하고 길이가 고정되면 디코딩이 쉬워진다. 디코딩이 쉬우면 파이프라인으로 명령어를 겹쳐 실행하기 유리하다. RISC의 단순함은 그 자체가 목적이 아니라, 고속 파이프라인 실행을 위한 토대다. 이 연결은 3편에서 구체화한다.
RISC-V의 등장: 오픈 ISA
RISC-V는 2010년 UC 버클리에서 시작된 오픈 ISA다. 기존 ISA와 근본적으로 다른 점은 소유권이다.
x86은 Intel과 AMD가, Arm은 Arm社가 소유한다. 이들 ISA로 칩을 만들려면 라이선스가 필요하다. RISC-V는 개방형 표준이다. 누구나 라이선스 비용 없이 RISC-V 기반 프로세서를 설계하고 제조할 수 있다.
RISC-V가 해결한 문제는 파편화였다. 그전까지 교육과 연구에서 쓰이던 오픈 ISA(MIPS 등)는 상업적 제약이나 설계상의 낡은 부분이 있었다. RISC-V는 40년간의 ISA 설계 교훈을 반영해 처음부터 깨끗하게 설계됐다. 과거 호환성 부담이 없다.
RISC-V의 설계 목표는 세 가지로 요약된다.
- 개방성: 라이선스 없이 자유롭게 사용
- 단순성: 교육에서 서버까지 하나의 ISA로 확장
- 모듈성: 필요한 기능만 골라 구현
RISC-V의 구조: 모듈러 ISA
RISC-V의 가장 큰 특징은 모듈러 구조다. 하나의 거대한 명령어 집합이 아니라, 작은 기본(base)에 확장(extension)을 선택적으로 붙이는 방식이다.

기본 정수 명령어 집합이 토대다.
RV32I: 32비트 정수 기본. 레지스터 32개, 각 32비트.RV64I: 64비트 정수 기본. 레지스터 32개, 각 64비트.
기본 집합은 명령어가 47개 정도로 매우 작다. 정수 연산, load/store, 분기, 점프가 전부다. 이것만으로 완전한 프로그램을 실행할 수 있다.
여기에 확장을 붙인다.
| 확장 | 기능 |
|---|---|
M |
곱셈, 나눗셈 |
A |
원자적(atomic) 연산 (동기화) |
F |
단정밀도 부동소수점 |
D |
배정밀도 부동소수점 |
C |
압축 명령어 (16비트, 코드 크기 절감) |
V |
벡터 (SIMD) |
확장을 조합하면 이름이 된다. RV64GC는 RV64I + M + A + F + D + C를 뜻한다(G는 IMAFD 묶음의 약칭). 임베디드 마이크로컨트롤러는 RV32IMC처럼 작게, 서버 프로세서는 RV64GC에 벡터까지 붙여 크게 구성한다. 같은 ISA 계열에서 규모를 자유롭게 조절한다.
RV32I 기본: 레지스터와 PC
이 시리즈는 RV32I(32비트 정수 기본)를 기준으로 진행한다. 파이프라인을 설명하기에 가장 단순하면서 완전한 집합이기 때문이다.
RV32I의 상태는 레지스터 파일과 프로그램 카운터로 구성된다.
RV32I 레지스터 파일 (32개, 각 32비트):
┌──────┬─────────┬────────────────────────────────┐
│ x0 │ zero │ 항상 0 (쓰기 무시) │
│ x1 │ ra │ 반환 주소 (return address) │
│ x2 │ sp │ 스택 포인터 (stack pointer) │
│ x3 │ gp │ 전역 포인터 │
│ x4 │ tp │ 스레드 포인터 │
│ x5-7 │ t0-t2 │ 임시 레지스터 │
│ x8-9 │ s0-s1 │ 보존 레지스터 │
│x10-17│ a0-a7 │ 함수 인자 / 반환값 │
│x18-27│ s2-s11 │ 보존 레지스터 │
│x28-31│ t3-t6 │ 임시 레지스터 │
└──────┴─────────┴────────────────────────────────┘
+ PC (Program Counter): 다음에 실행할 명령어 주소
주목할 점은 x0이 항상 0이라는 것이다. x0에 무엇을 써도 값은 0으로 유지된다. 이 설계는 명령어를 절약한다. 예를 들어 값을 복사하는 별도의 mov 명령어가 필요 없다. add x5, x6, x0(x6 + 0)이 곧 복사다. 0과의 비교, 무연산(nop) 등도 x0으로 표현한다.
레지스터 이름 x0~x31은 하드웨어 번호다. zero, ra, sp 같은 이름은 소프트웨어 호출 규약(calling convention)이 정한 용도별 별칭이다. 하드웨어는 번호만 알고, 용도 구분은 컴파일러와 규약이 담당한다.
프로그램 카운터 PC는 다음에 실행할 명령어의 메모리 주소를 담는다. 명령어를 하나 실행할 때마다 PC는 다음 명령어로 이동한다. 분기와 점프는 이 PC를 바꾸는 명령어다.
왜 RISC-V가 표준이 되었는가
RISC-V는 교육, 연구, 산업 세 영역에서 빠르게 표준으로 자리 잡았다.
- 교육: 깨끗하고 단순한 ISA는 컴퓨터 구조 교육에 이상적이다. 과거 MIPS가 맡던 교육용 표준 자리를 대체했다.
- 연구: 오픈 ISA이므로 새로운 하드웨어 아이디어를 자유롭게 구현하고 검증할 수 있다. 커스텀 확장도 정의 가능하다.
- 산업: 라이선스 비용이 없고, 필요한 규모로 조절 가능하다. 임베디드 마이크로컨트롤러부터 데이터센터 가속기의 제어 코어까지 채택이 확산되고 있다.
이 시리즈가 RISC-V를 택한 이유도 같다. 명령어가 단순하고 규칙적이므로, CPU가 명령어를 실제로 어떻게 실행하는지를 군더더기 없이 보여줄 수 있다.
요약
| 항목 | 내용 |
|---|---|
| ISA | 하드웨어와 소프트웨어의 계약. 무엇을 실행하는지 정의 |
| 마이크로아키텍처 | ISA를 어떻게 실행하는지의 구현 (파이프라인 등) |
| RISC 철학 | 단순 고정길이 명령어, load/store, 많은 레지스터 |
| RISC-V | 오픈 ISA, 모듈러 (기본 + 확장) |
| 기본 집합 | RV32I / RV64I (정수, 레지스터 32개) |
| x0 | 항상 0인 특수 레지스터 |
RISC-V는 하드웨어와 소프트웨어의 계약인 ISA를, 단순한 기본 위에 확장을 얹는 모듈러 방식으로 정의한다. RISC 철학의 단순함은 고속 파이프라인 실행을 위한 토대다. 다음 편에서는 이 계약의 최소 단위인 명령어(instruction) 자체를 들여다본다. 명령어가 어떤 비트 패턴으로 인코딩되고, RISC-V가 왜 소수의 고정 포맷으로 이를 정리했는지 살펴본다.
다음 글: RISC-V CPU #2 - Instruction이란: 명령어 인코딩과 포맷 (예정)