RISC-V란 무엇인가
CPU가 이해하는 말은 결국 숫자다. 어떤 숫자가 어떤 동작을 뜻하는지 정한 약속표를 명령어 집합 구조(ISA)라 한다. x86과 Arm의 약속표는 특정 회사의 소유다. RISC-V는 그 약속표를 누구나 공짜로 쓰고, 구현하고, 확장할 수 있게 공개한 ISA다. 이 장에서는 RISC-V가 왜 생겨났는지, 어떤 생각으로 설계되었는지, 그리고 이 책이 따라갈 공식 규격 문서가 어떻게 짜여 있는지를 큰 그림으로 살펴본다.
- ISA가 하드웨어와 소프트웨어 사이의 계약이라는 뜻을 그림으로 설명한다.
- RISC-V가 버클리에서 시작해 국제 표준이 되기까지의 흐름을 안다.
- “열린 ISA”와 “오픈 소스 CPU”의 차이를 구별한다.
- 단순함·모듈성·확장성이라는 설계 원칙이 구체적으로 어디에 드러나는지 안다.
- 비특권 규격, 특권 규격, 프로파일, 플랫폼 규격의 역할을 구별하고 원문을 찾아간다.
- 하트(hart), 실행 환경(EEI), 예외·인터럽트·트랩 같은 규격의 기본 용어를 익힌다.
ISA: 하드웨어와 소프트웨어 사이의 계약
C로 a = b + c;라고 쓰면 컴파일러가 이것을 CPU가 아는 명령으로 바꾼다. RISC-V라면 add a0, a1, a2라는 한 줄이 되고, 이 한 줄은 다시 0x00c58533이라는 32비트 숫자가 된다. 이 숫자를 받아 “a1과 a2를 더해 a0에 넣어라”로 해석하기로 한 약속, 그것이 ISA(Instruction Set Architecture)다.
ISA가 중요한 이유는 위아래를 갈라놓는 경계선이기 때문이다. 위쪽의 컴파일러·운영체제·응용 프로그램은 ISA만 믿고 만들어진다. 아래쪽의 칩 설계자는 ISA가 약속한 동작만 지키면 그 안을 어떻게 만들든 자유다. 손톱만 한 마이크로컨트롤러와 수십 코어짜리 서버 칩이 같은 바이너리를 실행할 수 있는 것은 이 경계선 덕분이다.
0x00c58533이 세 구현으로 흘러가는 모습이다.ISA가 정하는 것과 정하지 않는 것을 나눠 보면 경계가 더 분명해진다.
| ISA가 정하는 것 (계약) | ISA가 정하지 않는 것 (구현의 자유) |
|---|---|
| 명령어의 비트 배치와 의미 | 파이프라인 단계 수, 한 클럭에 몇 개를 실행하는지 |
| 레지스터의 개수와 폭 (x0–x31, XLEN) | 레지스터 이름 바꾸기(renaming)용 물리 레지스터 수 |
| 메모리에서 값을 읽고 쓰는 규칙(메모리 모델) | 캐시의 크기·단계·교체 정책 |
| 예외·인터럽트가 생겼을 때의 상태 변화 | 분기 예측기의 구조, 클럭 속도, 공정 |
| 특권 모드와 CSR, 가상 메모리 페이지 테이블 형식 | TLB 크기, 페이지 워커를 몇 개 두는지 |
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 교수도 프로젝트에 합류했다.
RISC-V가 연구실 밖으로 나간 결정적인 계기는 표준화 기구였다. 2015년 RISC-V 재단이 만들어지면서 ISA는 특정 대학이나 회사가 아니라 회원사들의 합의로 관리되기 시작했다. 2020년에는 특정 국가의 수출 규제에 휘둘리지 않도록 본부를 스위스로 옮기고 이름을 RISC-V International로 바꿨다. 지금은 수천 개 회원사가 기술 위원회(Technical Steering Committee)와 수많은 작업 그룹(Task Group)에서 새 확장을 설계하고, 공개 검토를 거쳐 비준(ratification)한다.
비준된 확장의 명령어 인코딩과 의미는 이후에도 그대로 유지된다. 규격 문서의 날짜형 버전이 올라가도 기존 확장의 뜻은 바뀌지 않고, 새 확장 장이 추가되거나 설명이 다듬어질 뿐이다. 소프트웨어 생태계가 안심하고 RISC-V 위에 쌓일 수 있는 바탕이다.
비준까지의 길
새 확장은 아이디어부터 비준까지 여러 관문을 지난다. 작업 그룹이 초안을 쓰고, 기술 위원회의 검토를 받고, 누구나 의견을 낼 수 있는 공개 검토 기간(보통 30일 이상)을 거친 뒤 비준 투표를 한다. 그 사이에 시뮬레이터(Spike 등)와 컴파일러 지원, 아키텍처 테스트가 함께 준비되어야 한다는 점이 특징이다. 문서만이 아니라 “실제로 돌아가는” 증거가 있어야 비준된다.
“열린 ISA”는 무엇이 열려 있나
RISC-V를 처음 접하면 흔히 “오픈 소스 CPU”라고 부르지만, 정확히 말하면 열려 있는 것은 규격(약속표)이다. 규격 문서는 크리에이티브 커먼즈 라이선스로 공개되어 있고, RISC-V를 구현하는 데 로열티나 라이선스 계약이 필요 없다. 그 규격을 따르는 CPU 설계(RTL)를 공개할지 말지는 만드는 사람 마음이다.
| x86-64 | Arm (A64) | RISC-V | |
|---|---|---|---|
| ISA 소유 | 인텔·AMD | Arm Holdings | RISC-V International (비영리, 회원 합의) |
| 새로 구현하려면 | 사실상 불가능 | 아키텍처 라이선스 계약과 로열티 | 누구나, 계약 없이, 무료 |
| 규격 문서 | 공개(구현 권리는 별개) | 공개(구현 권리는 별개) | 공개, CC-BY 4.0 |
| 자기만의 명령 추가 | 불가 | 제한적 | 예약된 인코딩 공간에서 자유(X 확장) |
| 구현 공개 여부 | 비공개 | 대부분 비공개 | 공개(Rocket, BOOM, XiangShan, CVA6 …)와 비공개 모두 존재 |
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개 가까운 비준 규격이 있다. 크게 네 무리로 나뉜다.
- ISA 매뉴얼 1권: 비특권 규격 — 사용자 프로그램이 보는 명령어 전부. 베이스 ISA와 M·A·F·D·C·B·V 등의 확장, 메모리 모델.
- ISA 매뉴얼 2권: 특권 규격 — 운영체제와 펌웨어가 보는 것. 특권 모드, CSR, 트랩, 가상 메모리, PMP, 하이퍼바이저.
- 프로파일 — 소프트웨어 생태계가 기대할 수 있는 확장의 조합. RVA23 같은 이름 하나로 수십 개 확장을 묶는다.
- ISA 밖의 규격 — 인터럽트 컨트롤러(AIA, PLIC), IOMMU, 디버그·트레이스, SBI(펌웨어 호출 규약), ABI(호출 규약), 부팅 서비스 등.
규격 탐색기
규격 문서의 본문은 규범적(normative) 내용이고, 회색 상자의 “Commentary” 또는 비고는 설계 이유를 설명하는 비규범적 내용이다. 구현자는 본문만 지키면 되지만, “왜 이렇게 만들었는지”는 비고에 다 들어 있다. 이 책은 그 비고를 적극적으로 풀어 쓴다.
규격의 기본 용어: 하트, 실행 환경, 트랩
규격을 펴면 처음부터 낯선 단어가 나온다. 이 책 전체에서 계속 쓰이니 여기서 정리해 두자.
코어와 하트
하트(hart, hardware thread)는 명령어를 스스로 가져와 실행하는 하나의 흐름이다. 자기만의 pc와 레지스터를 가진다. 한 코어가 동시 멀티스레딩(SMT)으로 여러 하트를 품을 수도 있다. 규격은 “코어”나 “CPU”보다 하트라는 말을 쓴다. 규격이 정하는 것은 하트가 보는 세계이고, 그 하트가 물리적으로 어떻게 만들어졌는지는 관심 밖이기 때문이다.
실행 환경 인터페이스(EEI)
하트 혼자서는 프로그램을 끝까지 돌릴 수 없다. 처음에 pc가 어디서 시작하는지, ecall을 하면 누가 받아 주는지, 메모리 어디가 쓸 수 있는 곳인지 정해 주는 바깥 세계가 필요하다. 규격은 이것을 실행 환경 인터페이스(EEI)라 부르고, 같은 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 / WPRI | CSR 필드에 무엇을 써도 되는지에 대한 규칙(17장). 예: WARL은 “아무 값이나 써도 되지만 읽으면 합법적인 값만 나온다”. |
| implementation-defined | 구현마다 달라도 되지만 문서에 밝혀야 하는 동작. |
| UNSPECIFIED | 규격이 정하지 않은 동작. 소프트웨어는 의존하면 안 된다. |
첫 RISC-V 프로그램 돌려 보기
백문이 불여일견이다. 아래는 1부터 10까지 더하는 RV32I 프로그램이다. 아직 명령어를 몰라도 괜찮다. 한 명령 버튼을 누르며 pc가 한 칸씩 내려가다 ble에서 위로 되돌아가는 모습, 그리고 레지스터 값이 바뀌는 모습(금색)만 눈으로 따라가 보자. 5장에서 같은 에뮬레이터로 직접 프로그램을 작성하게 된다.
작은 RV32I 에뮬레이터
li와 ble는 진짜 명령이 아니라 의사 명령이어서 왼쪽 목록에는 addi와 bge로 바뀌어 있다는 점도 확인하자.이 책의 구성
이 책은 규격 문서의 순서를 따르되, 처음 읽는 사람이 막히지 않도록 순서를 조금 바꿨다.
핵심 정리
- ISA는 기계어 숫자의 뜻을 정한 하드웨어·소프트웨어 사이의 계약이다. 그 아래 구현(마이크로아키텍처)은 자유다.
- RISC-V는 2010년 UC 버클리에서 시작한 다섯 번째 버클리 RISC이며, 지금은 비영리 기구 RISC-V International이 관리한다.
- 열려 있는 것은 규격이다. 누구나 계약·로열티 없이 구현하고 확장할 수 있다. 구현의 공개 여부는 별개다.
- 작은 베이스 + 선택적 확장, 고정된 레지스터 필드, 플래그·지연 슬롯 없음, 넉넉한 확장 공간이 핵심 설계 원칙이다.
- 규격은 비특권(1권), 특권(2권), 프로파일, ISA 밖 규격(SBI, AIA, 디버그 등)으로 나뉜다.
- 하트는 독립적인 명령 실행 흐름, EEI는 하트가 기대하는 바깥 환경, 트랩은 예외·인터럽트로 제어가 처리기로 넘어가는 일이다.
확인 퀴즈
RISC-V가 “열려 있다”는 말의 가장 정확한 뜻은?
다음 중 ISA가 정하는 것은?
규격에서 “하트(hart)”가 뜻하는 것은?
사용자 프로그램이 ecall로 운영체제에 서비스를 요청해 생긴 트랩은 규격의 네 분류 중 무엇인가?
RISC-V에 분기 지연 슬롯이 없는 가장 큰 이유는?
RVA23 같은 “프로파일”의 역할은?
더 읽을거리
- The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture — Introduction (v20260120)
- Volume II: Privileged Architecture — Introduction (v20260120)
- RISC-V Ratified Specifications 라이브러리
- Andrew Waterman, “Design of the RISC-V Instruction Set Architecture”, UC Berkeley 박사 논문 (2016) — 설계 결정의 이유가 가장 자세히 정리된 문헌
- David Patterson, Andrew Waterman, The RISC-V Reader: An Open Architecture Atlas (2017)