Chapter 01

RISC-V란 무엇인가

CPU가 이해하는 말은 결국 숫자다. 어떤 숫자가 어떤 동작을 뜻하는지 정한 약속표를 명령어 집합 구조(ISA)라 한다. x86과 Arm의 약속표는 특정 회사의 소유다. RISC-V는 그 약속표를 누구나 공짜로 쓰고, 구현하고, 확장할 수 있게 공개한 ISA다. 이 장에서는 RISC-V가 왜 생겨났는지, 어떤 생각으로 설계되었는지, 그리고 이 책이 따라갈 공식 규격 문서가 어떻게 짜여 있는지를 큰 그림으로 살펴본다.

ISA: 하드웨어와 소프트웨어 사이의 계약

C로 a = b + c;라고 쓰면 컴파일러가 이것을 CPU가 아는 명령으로 바꾼다. RISC-V라면 add a0, a1, a2라는 한 줄이 되고, 이 한 줄은 다시 0x00c58533이라는 32비트 숫자가 된다. 이 숫자를 받아 “a1과 a2를 더해 a0에 넣어라”로 해석하기로 한 약속, 그것이 ISA(Instruction Set Architecture)다.

ISA가 중요한 이유는 위아래를 갈라놓는 경계선이기 때문이다. 위쪽의 컴파일러·운영체제·응용 프로그램은 ISA만 믿고 만들어진다. 아래쪽의 칩 설계자는 ISA가 약속한 동작만 지키면 그 안을 어떻게 만들든 자유다. 손톱만 한 마이크로컨트롤러와 수십 코어짜리 서버 칩이 같은 바이너리를 실행할 수 있는 것은 이 경계선 덕분이다.

소프트웨어: C 소스 a = b + c; 컴파일러 · 운영체제 · 응용 프로그램 add a0, a1, a2 → 0x00c58533 RISC-V ISA — 계약서 “0x00c58533 은 x10 ← x11 + x12 를 뜻한다”는 약속만 지키면 된다 마이크로컨트롤러 RV32IMC · 2단 파이프라인 수만 게이트 · 수 mW 응용 프로세서 RV64GC · 순차 5–8단 리눅스 · 스마트 기기 서버·고성능 코어 RVA23 · 비순차 슈퍼스칼라 수십억 트랜지스터
그림 1-1. ISA는 계약서다. 위의 소프트웨어는 계약서만 보고 기계어를 만들고, 아래의 세 칩은 내부 구조가 전혀 달라도 같은 기계어를 같은 뜻으로 실행한다. 금색 점은 같은 명령어 0x00c58533이 세 구현으로 흘러가는 모습이다.

ISA가 정하는 것과 정하지 않는 것을 나눠 보면 경계가 더 분명해진다.

ISA가 정하는 것 (계약)ISA가 정하지 않는 것 (구현의 자유)
명령어의 비트 배치와 의미파이프라인 단계 수, 한 클럭에 몇 개를 실행하는지
레지스터의 개수와 폭 (x0–x31, XLEN)레지스터 이름 바꾸기(renaming)용 물리 레지스터 수
메모리에서 값을 읽고 쓰는 규칙(메모리 모델)캐시의 크기·단계·교체 정책
예외·인터럽트가 생겼을 때의 상태 변화분기 예측기의 구조, 클럭 속도, 공정
특권 모드와 CSR, 가상 메모리 페이지 테이블 형식TLB 크기, 페이지 워커를 몇 개 두는지
ISA와 마이크로아키텍처

ISA를 구현한 내부 설계를 마이크로아키텍처라 한다. 같은 RISC-V ISA라도 SiFive, 알리바바 T-Head, 중국과학원의 XiangShan, 웨스턴디지털 SweRV처럼 수많은 마이크로아키텍처가 존재한다. 이 책은 ISA를 다루며, 8장에서만 “ISA가 구현을 어떻게 쉽게 만드는가”를 보기 위해 파이프라인을 잠시 들여다본다.

버클리에서 태어난 다섯 번째 RISC

RISC-V는 2010년 여름 UC 버클리의 Krste Asanović 교수 연구실에서 Yunsup Lee, Andrew Waterman과 함께 시작한 “방학 동안의 작은 프로젝트”였다. 연구와 수업에 쓸 깨끗한 ISA가 필요했는데, 기존 상용 ISA는 라이선스가 까다롭고 수십 년 묵은 호환성 짐이 무거웠다. 그래서 새로 만들기로 했다. 버클리가 1980년대부터 만든 RISC 계열(RISC-I, RISC-II, SOAR, SPUR)의 다섯 번째라서 이름에 로마 숫자 V가 붙었다. RISC라는 말을 처음 만든 David Patterson 교수도 프로젝트에 합류했다.

1981–88RISC-I · II · SOAR · SPUR버클리 RISC 계보 2010버클리에서 시작Par Lab 2011첫 사용자 ISA 문서기술 보고서로 공개 2014사용자 ISA 2.0베이스 동결 2015RISC-V 재단 설립비영리 표준화 기구 2019베이스·IMAFDQC 비준특권 1.11 비준 2020RISC-V International스위스로 이전 2021V·H·K·비트조작 등15개 규격 한꺼번에 비준 2024RVA23 프로파일벡터·하이퍼바이저 필수화 2026ISA 매뉴얼v20260120 · 이 책 기준
그림 1-2. RISC-V 연표. 2014년에 베이스 ISA를 동결한 뒤로는 기존 명령의 뜻을 바꾸지 않고 확장만 더해 왔다. 규격 문서는 날짜형 버전(예: 20260120)으로 묶어 발행한다.

RISC-V가 연구실 밖으로 나간 결정적인 계기는 표준화 기구였다. 2015년 RISC-V 재단이 만들어지면서 ISA는 특정 대학이나 회사가 아니라 회원사들의 합의로 관리되기 시작했다. 2020년에는 특정 국가의 수출 규제에 휘둘리지 않도록 본부를 스위스로 옮기고 이름을 RISC-V International로 바꿨다. 지금은 수천 개 회원사가 기술 위원회(Technical Steering Committee)와 수많은 작업 그룹(Task Group)에서 새 확장을 설계하고, 공개 검토를 거쳐 비준(ratification)한다.

비준된 규격은 바뀌지 않는다

비준된 확장의 명령어 인코딩과 의미는 이후에도 그대로 유지된다. 규격 문서의 날짜형 버전이 올라가도 기존 확장의 뜻은 바뀌지 않고, 새 확장 장이 추가되거나 설명이 다듬어질 뿐이다. 소프트웨어 생태계가 안심하고 RISC-V 위에 쌓일 수 있는 바탕이다.

비준까지의 길

새 확장은 아이디어부터 비준까지 여러 관문을 지난다. 작업 그룹이 초안을 쓰고, 기술 위원회의 검토를 받고, 누구나 의견을 낼 수 있는 공개 검토 기간(보통 30일 이상)을 거친 뒤 비준 투표를 한다. 그 사이에 시뮬레이터(Spike 등)와 컴파일러 지원, 아키텍처 테스트가 함께 준비되어야 한다는 점이 특징이다. 문서만이 아니라 “실제로 돌아가는” 증거가 있어야 비준된다.

구상작업 그룹 결성 개발초안 · 시뮬레이터 동결큰 변경 금지 공개 검토누구나 의견 제출 비준이후 뜻 불변 문서 + 시뮬레이터 + 컴파일러 + 아키텍처 테스트가 함께 자란다
그림 1-3. 확장 규격이 비준되기까지. “동결(Frozen)” 이후에는 큰 변경이 허용되지 않으므로, 소프트웨어 도구는 이 시점부터 지원을 시작하는 경우가 많다.

“열린 ISA”는 무엇이 열려 있나

RISC-V를 처음 접하면 흔히 “오픈 소스 CPU”라고 부르지만, 정확히 말하면 열려 있는 것은 규격(약속표)이다. 규격 문서는 크리에이티브 커먼즈 라이선스로 공개되어 있고, RISC-V를 구현하는 데 로열티나 라이선스 계약이 필요 없다. 그 규격을 따르는 CPU 설계(RTL)를 공개할지 말지는 만드는 사람 마음이다.

x86-64Arm (A64)RISC-V
ISA 소유인텔·AMDArm HoldingsRISC-V International (비영리, 회원 합의)
새로 구현하려면사실상 불가능아키텍처 라이선스 계약과 로열티누구나, 계약 없이, 무료
규격 문서공개(구현 권리는 별개)공개(구현 권리는 별개)공개, CC-BY 4.0
자기만의 명령 추가불가제한적예약된 인코딩 공간에서 자유(X 확장)
구현 공개 여부비공개대부분 비공개공개(Rocket, BOOM, XiangShan, CVA6 …)와 비공개 모두 존재
오해 주의: 열린 ISA ≠ 공짜 칩

ISA가 무료라고 칩이 무료인 것은 아니다. 설계·검증·제조에는 여전히 큰 비용이 든다. RISC-V가 바꾼 것은 “ISA를 쓰기 위해 허락을 받아야 한다”는 진입 장벽이다. 그 덕분에 대학, 스타트업, 대기업이 같은 출발선에서 각자 필요한 만큼의 CPU를 만들 수 있게 되었다.

설계 원칙: 작게, 깔끔하게, 늘릴 수 있게

규격의 서문은 RISC-V의 목표를 여러 가지로 적고 있다. 그중 이 책 전체에 걸쳐 반복해서 보게 될 원칙을 여섯 가지로 추리면 다음과 같다.

🧱작은 베이스 + 선택적 확장

필수인 정수 베이스는 40개 남짓한 명령뿐이다. 곱셈, 부동소수점, 벡터 등은 모두 확장으로 분리했다. (2장)

📏고정된 레지스터 칸 위치

rs1·rs2·rd 필드가 모든 형식에서 같은 비트에 있다. 해독 전에 레지스터 파일부터 읽을 수 있다. (4장)

🚫조건 코드 플래그 없음

비교와 분기를 한 명령으로 묶었다. 숨은 상태가 없으니 비순차 실행이 쉬워진다. (5장)

⏱️지연 슬롯 없음

MIPS의 분기 지연 슬롯처럼 특정 파이프라인 구조에 묶인 규칙을 두지 않았다. (8장)

🧩넉넉한 확장 공간

명령어 길이 인코딩과 예약된 opcode 공간으로 표준·사용자 확장이 들어갈 자리를 처음부터 남겼다. (2·13장)

🏛️특권 구조의 분리

사용자 수준 ISA와 특권 ISA를 별도 문서로 나눠, 운영체제 없이도·가상화 위에서도 같은 사용자 코드를 쓴다. (17장)

규격 원문에서
“Our goals in defining RISC-V include: A completely open ISA that is freely available to academia and industry. A real ISA suitable for direct native hardware implementation, not just simulation or binary translation. An ISA that avoids “over-architecting” for a particular microarchitecture style …”

Volume I, Introduction — 특정 구현 방식에 ISA를 맞추지 않겠다는 목표가 “지연 슬롯 없음” 같은 결정으로 이어졌다.

규격 문서 지도

RISC-V의 “규격”은 한 권의 책이 아니라 여러 문서의 묶음이다. 공식 규격 라이브러리(docs.riscv.org)에는 30개 가까운 비준 규격이 있다. 크게 네 무리로 나뉜다.

  1. ISA 매뉴얼 1권: 비특권 규격 — 사용자 프로그램이 보는 명령어 전부. 베이스 ISA와 M·A·F·D·C·B·V 등의 확장, 메모리 모델.
  2. ISA 매뉴얼 2권: 특권 규격 — 운영체제와 펌웨어가 보는 것. 특권 모드, CSR, 트랩, 가상 메모리, PMP, 하이퍼바이저.
  3. 프로파일 — 소프트웨어 생태계가 기대할 수 있는 확장의 조합. RVA23 같은 이름 하나로 수십 개 확장을 묶는다.
  4. ISA 밖의 규격 — 인터럽트 컨트롤러(AIA, PLIC), IOMMU, 디버그·트레이스, SBI(펌웨어 호출 규약), ABI(호출 규약), 부팅 서비스 등.
EXPLORER

규격 탐색기

왼쪽 지도의 상자를 눌러 보자. 각 문서가 무엇을 다루는지, 현재 비준 버전과 원문 링크, 그리고 이 책의 몇 장에서 다루는지가 나타난다. 맨 아래의 비특권 규격이 나머지 모든 것의 바탕이다.
규격을 읽을 때의 요령

규격 문서의 본문은 규범적(normative) 내용이고, 회색 상자의 “Commentary” 또는 비고는 설계 이유를 설명하는 비규범적 내용이다. 구현자는 본문만 지키면 되지만, “왜 이렇게 만들었는지”는 비고에 다 들어 있다. 이 책은 그 비고를 적극적으로 풀어 쓴다.

규격의 기본 용어: 하트, 실행 환경, 트랩

규격을 펴면 처음부터 낯선 단어가 나온다. 이 책 전체에서 계속 쓰이니 여기서 정리해 두자.

코어와 하트

하트(hart, hardware thread)는 명령어를 스스로 가져와 실행하는 하나의 흐름이다. 자기만의 pc와 레지스터를 가진다. 한 코어가 동시 멀티스레딩(SMT)으로 여러 하트를 품을 수도 있다. 규격은 “코어”나 “CPU”보다 하트라는 말을 쓴다. 규격이 정하는 것은 하트가 보는 세계이고, 그 하트가 물리적으로 어떻게 만들어졌는지는 관심 밖이기 때문이다.

칩 (SoC) 코어 0 (SMT 2-way) 하트 0pcx0–x31CSR 일부 하트 1pcx0–x31CSR 일부 코어 1 하트 2pcx0–x31CSR 일부 공유 자원 메모리 · 캐시 인터럽트 컨트롤러 타이머 (mtime) 하트마다 mhartid 로 서로를 구별한다
그림 1-4. 칩·코어·하트. 하트마다 pc와 레지스터를 따로 가지며, 메모리와 인터럽트 컨트롤러는 함께 쓴다. 금색 점은 각 하트가 독립적으로 명령을 실행하고 있음을 나타낸다.

실행 환경 인터페이스(EEI)

하트 혼자서는 프로그램을 끝까지 돌릴 수 없다. 처음에 pc가 어디서 시작하는지, ecall을 하면 누가 받아 주는지, 메모리 어디가 쓸 수 있는 곳인지 정해 주는 바깥 세계가 필요하다. 규격은 이것을 실행 환경 인터페이스(EEI)라 부르고, 같은 RISC-V 프로그램이 전혀 다른 환경 위에서 돌 수 있다고 설명한다.

① 베어메탈 펌웨어·프로그램 하트 (하드웨어) ISA 직접 ② 운영체제 위 앱 A 앱 B ABI · 리눅스 커널 SBI · 펌웨어 (M 모드) 하트 ③ 하이퍼바이저 위 앱 앱 게스트 OS 게스트 OS 하이퍼바이저 (HS) 펌웨어 (M) 하트 ④ 에뮬레이터 위 RISC-V 프로그램 Spike · QEMU하트를 소프트웨어로흉내 낸다 x86 · Arm 컴퓨터
그림 1-5. 같은 RISC-V 사용자 프로그램이 돌 수 있는 실행 환경의 예. 규격 서론이 드는 예시와 같은 구성이다. 프로그램 입장에서는 아래가 진짜 하드웨어인지, 하이퍼바이저인지, 에뮬레이터인지 구별할 필요가 없다. 이 장 끝의 시뮬레이터 역시 ④번, 브라우저 안의 작은 실행 환경이다.

예외, 인터럽트, 트랩

세 단어는 헷갈리기 쉽지만 규격은 엄밀하게 구별한다. 18장에서 자세히 다루기 전에 정의만 짚어 두자.

용어규격의 정의예
예외
exception
지금 실행 중인 명령어 때문에 생긴 비정상 상황잘못된 명령, 페이지 폴트, ecall
인터럽트
interrupt
지금 명령과 상관없이 바깥에서 비동기적으로 들어온 사건타이머, 키보드, 다른 하트의 신호
트랩
trap
예외나 인터럽트 때문에 트랩 처리기로 제어가 넘어가는 일 자체pc가 mtvec로 바뀌고 mcause가 기록됨

규격은 트랩을 바깥에서 보이는 효과에 따라 네 종류로도 나눈다. Contained(같은 환경 안에서 처리됨, 예: 사용자 모드의 페이지 폴트를 OS가 처리), Requested(프로그램이 일부러 요청, 예: 시스템 호출), Invisible(처리된 줄도 모르게 투명하게 처리, 예: 지원 안 되는 명령을 에뮬레이션), Fatal(실행 환경이 프로그램을 끝냄)이다.

규격 특유의 표현

표현뜻
XLEN정수 레지스터의 비트 폭. RV32는 32, RV64는 64.
IALIGN명령어 주소 정렬 단위. 기본 32비트, C 확장이 있으면 16비트.
ILEN구현이 지원하는 가장 긴 명령어의 길이.
reserved미래 표준 확장을 위해 비워 둔 인코딩. 쓰면 안 된다.
HINT아키텍처 상태를 바꾸지 않는(예: rd=x0 인) 인코딩 중 성능 힌트용으로 지정한 것.
WARL / WLRL / WPRICSR 필드에 무엇을 써도 되는지에 대한 규칙(17장). 예: WARL은 “아무 값이나 써도 되지만 읽으면 합법적인 값만 나온다”.
implementation-defined구현마다 달라도 되지만 문서에 밝혀야 하는 동작.
UNSPECIFIED규격이 정하지 않은 동작. 소프트웨어는 의존하면 안 된다.

첫 RISC-V 프로그램 돌려 보기

백문이 불여일견이다. 아래는 1부터 10까지 더하는 RV32I 프로그램이다. 아직 명령어를 몰라도 괜찮다. 한 명령 버튼을 누르며 pc가 한 칸씩 내려가다 ble에서 위로 되돌아가는 모습, 그리고 레지스터 값이 바뀌는 모습(금색)만 눈으로 따라가 보자. 5장에서 같은 에뮬레이터로 직접 프로그램을 작성하게 된다.

SIMULATOR

작은 RV32I 에뮬레이터

한 명령을 눌러 시작하자. pc는 0번지에서 출발한다.
실행
pc0x00000000
실행한 명령 수0
a0 (합계)0
출력—
루프가 10번 도는 동안 실행된 명령 수를 세어 보자. 명령 7줄짜리 프로그램이 실제로는 30개 넘는 명령을 실행한다. 또 li와 ble는 진짜 명령이 아니라 의사 명령이어서 왼쪽 목록에는 addi와 bge로 바뀌어 있다는 점도 확인하자.

이 책의 구성

이 책은 규격 문서의 순서를 따르되, 처음 읽는 사람이 막히지 않도록 순서를 조금 바꿨다.

Part I시작하기1–2장큰 그림 · 이름 규칙 Part II기본 정수 ISA3–8장레지스터 · 인코딩ABI · 파이프라인 Part III표준 확장9–16장M A F D C B V메모리 모델 Part IV특권 아키텍처17–21장CSR · 트랩 · MMUPMP · 하이퍼바이저 Part V생태계22–24장플랫폼 · 프로파일레퍼런스 카드 규격 1권(비특권) ─────────────────────▶ 규격 2권(특권) ───────▶ 비ISA 규격
그림 1-6. 이 책의 다섯 부분과 규격 문서의 대응.

핵심 정리

  1. ISA는 기계어 숫자의 뜻을 정한 하드웨어·소프트웨어 사이의 계약이다. 그 아래 구현(마이크로아키텍처)은 자유다.
  2. RISC-V는 2010년 UC 버클리에서 시작한 다섯 번째 버클리 RISC이며, 지금은 비영리 기구 RISC-V International이 관리한다.
  3. 열려 있는 것은 규격이다. 누구나 계약·로열티 없이 구현하고 확장할 수 있다. 구현의 공개 여부는 별개다.
  4. 작은 베이스 + 선택적 확장, 고정된 레지스터 필드, 플래그·지연 슬롯 없음, 넉넉한 확장 공간이 핵심 설계 원칙이다.
  5. 규격은 비특권(1권), 특권(2권), 프로파일, ISA 밖 규격(SBI, AIA, 디버그 등)으로 나뉜다.
  6. 하트는 독립적인 명령 실행 흐름, EEI는 하트가 기대하는 바깥 환경, 트랩은 예외·인터럽트로 제어가 처리기로 넘어가는 일이다.

확인 퀴즈

RISC-V가 “열려 있다”는 말의 가장 정확한 뜻은?

열려 있는 것은 규격이다. 구현(RTL)은 공개해도, 비공개여도 된다.

다음 중 ISA가 정하는 것은?

나머지는 모두 마이크로아키텍처, 즉 구현자가 정할 몫이다.

규격에서 “하트(hart)”가 뜻하는 것은?

hardware thread의 줄임말이다. SMT 코어 하나에 하트가 여럿 있을 수 있다.

사용자 프로그램이 ecall로 운영체제에 서비스를 요청해 생긴 트랩은 규격의 네 분류 중 무엇인가?

프로그램이 일부러 요청한 트랩이므로 Requested 트랩이다.

RISC-V에 분기 지연 슬롯이 없는 가장 큰 이유는?

지연 슬롯은 5단 파이프라인 시절의 구현 세부가 ISA로 새어 나온 사례다. 깊은 파이프라인이나 비순차 코어에서는 오히려 짐이 된다.

RVA23 같은 “프로파일”의 역할은?

프로파일은 새 명령을 만들지 않는다. 이미 비준된 확장 중 무엇이 반드시 있어야 하는지를 정한다(23장).

더 읽을거리