Lec 3 · Instruction set architecture(명령어 집합 아키텍처) II: RISC-V
정밀 정리 · 검증 2026-09-24 13:48
1개요
1.1ISA 복습 후 RISC-V(RV64)의 architectural state: PC, 64-bit GPR 32개(x0=0), 2^64 byte memory.
1.2설계 원칙 smaller is faster, simplicity favors regularity, good design demands good compromises 를 명령 형식으로 설명.
1.3R/I/S/B/U/J 6형식: R-type ALU, I-type immediate·shift·load, LUI 로 큰 상수, S-type store.
1.4load-store architecture, endianness, data alignment.
1.5basic block·control flow graph 와 conditional branch(B-type, PC-relative), branch 로는 함수 반환 불가 → jump 는 다음 강의.
2섹션별 정리 상황·문제 → 원인 → 해결
2.10:13–1:45강의 시작·출석 안내
상황·문제화면·음성 확인. 출석은 live 강의만 해당, 녹화 영상은 복습용.
2.21:45–5:45Review: programmer visible state 와 ISA 가 정의하는 것
상황·문제지난 시간 ISA 개요 복습. programmer 가 바꿀 수 있는 값(memory·register·PC)과 명령 class 는 무엇이었나?
원인EDSAC 은 accumulator 하나에 주소를 명령에 hard-code 해 한계가 있었다. ISA 는 컴퓨터의 언어라 명령·data type·register·memory·interrupt·privilege·I/O 등 전부를 규정한다.
해결ISA 는 10~20년 가는 stable platform. 확장으로 새 application 을 지원하면서 backward compatibility 를 지켜 문서가 매우 커진다. 이 수업은 RISC-V 를 쓴다.
- programmer visible state = architectural state (memory, register, PC)
- 명령 class: arithmetic/logical, data movement, control flow
- 강사는 '10 to 20 years', 슬라이드는 'typically 15~20 years'
2.2.r.1RISC-V Ratified Specifications (RISC-V International) ↗ · unprivileged·privileged ISA manual 공식 배포 페이지
2.35:45–9:00RISC-V 개요
상황·문제수업에서 쓸 ISA 인 RISC-V 는 무엇이고 어디에 쓰이나?
원인RISC-I 연구(2010, UC Berkeley)에서 시작한 5세대 ISA. RISC-V 는 특정 ISA 이름, RISC 는 작은 명령 집합이라는 일반 원칙.
해결open-source·royalty-free. SSD controller, GPU 내부 microcontroller 등 상용 제품에도 쓰인다. 2015년 foundation 설립, 150+ 회원(NVIDIA, Google, Samsung, Semifive, Furiosa AI 등).
- 아직 가장 널리 쓰이는 ISA 는 아니다
- 수업은 64-bit 변형(RV64)을 사용
2.3.r.1RISC-V (Wikipedia) ↗ · 2010 UC Berkeley 5세대 RISC, royalty-free, x0 zero register, 32-bit 명령 형식표
2.3.r.2RISC-V Ratified Specifications (RISC-V International) ↗ · unprivileged·privileged ISA manual 공식 배포 페이지
2.49:00–18:00RV64 programmer visible state, x0 = 0, data format
상황·문제RV64 의 architectural state 는 무엇이고, 왜 register 가 32개뿐이며 x0 는 왜 항상 0인가?
원인PC(64-bit), 64-bit GPR 32개, byte addressable memory 2^64 byte(16 exabytes). register 가 많으면 접근이 느려진다(smaller is faster).
해결32개는 편의성과 속도의 compromise, 나머지 값은 memory 에 두고 필요 시 이동. x0 는 값이 항상 0이라 음수화(0 - x1) 같은 자주 쓰는 동작이 단순해진다.
- x0 는 register 번호가 아니라 값이 0 이라는 뜻 (강사 강조)
- data: doubleword 64, word 32, halfword 16, byte 8-bit, signed/unsigned/bit
- floating-point 는 별도 register set, 이 강의는 정수 연산만
2.4.r.1RISC-V (Wikipedia) ↗ · 2010 UC Berkeley 5세대 RISC, royalty-free, x0 zero register, 32-bit 명령 형식표
2.518:00–22:54명령어 표현 설계: simplicity favors regularity
상황·문제0과 1만으로 OP rd, rs1, rs2 를 어떻게 표현하나? immediate·load/store 는?
원인연산 종류를 구분할 bit 와 register 32개를 지정할 5-bit specifier 3개가 필요. immediate 는 register operand 자리를 쓰거나 bit 를 더 써야 한다.
해결형식을 최대한 단순·규칙적으로 만든다. 불규칙하면 decode logic 이 복잡해져 느려지고 transistor(chip 면적)도 는다.
- design principle 2: simplicity favors regularity
- 필드 순서를 정해 선형 배치하면 instruction representation 이 된다
2.622:54–30:08RISC-V 명령어 형식 6종
상황·문제RISC-V 는 어떤 형식을 쓰고, store 는 왜 load(I-type)와 다른 S-type 인가?
원인load 는 목적지 register 가 있지만 store 는 목적지가 memory 라 rd 가 없다. 같은 I-type 을 쓰면 rs2 가 다른 위치에 와야 해 decode 가 복잡해진다.
해결R/I/S/B/U/J 6형식에서 rs1·rs2·rd·opcode(하위 7-bit) 위치를 고정. 명령은 4 byte, 항상 4-byte aligned.
- Q&A: CPU 는 32-bit 를 한 번에 보고 decode 한다 (한 bit 씩 순차 해석 아님)
- 교재·옛 manual 은 형식 이름이 다를 수 있다
2.6.r.1RISC-V (Wikipedia) ↗ · 2010 UC Berkeley 5세대 RISC, royalty-free, x0 zero register, 32-bit 명령 형식표
2.730:08–36:00R-type register-register ALU 명령과 예제 1
상황·문제ADD rd, rs1, rs2 같은 R-type 은 어떻게 encode·동작하나?
원인opcode 는 R-type 고정값, funct7·funct3 조합으로 연산을 구분. 명령이 4 byte 이므로 PC 는 4 증가.
해결GPR[rd] ← GPR[rs1] □ GPR[rs2]; PC ← PC+4. ADD/SUB, SLT/SLTU, AND/OR/XOR, SLL/SRL/SRA. 예: f=(g+h)-(i+j) → add x5,x20,x21; add x6,x22,x23; sub x19,x5,x6.
- SRL 은 MSB 를 0으로, SRA 는 sign-extend 로 채운다
- R-type 은 exception 없음, overflow 는 결과·source 비교로 판단
2.836:00–41:28I-type register-immediate ALU 명령
상황·문제상수(immediate)를 operand 로 쓰려면? subtract immediate 는 왜 없나?
원인rs2 자리를 12-bit immediate 로 쓰고 sign-extend 해 64-bit 로 만든다.
해결ADDI, ANDI/ORI/XORI, SLTI/SLTIU. SUBI 는 음수 immediate 의 ADDI 로 대신한다.
- Q&A: 12-bit 범위는 -2048 ~ 2047
- 큰 상수는 여러 명령으로 register 에 만들고 R-type 으로 계산
2.941:28–49:16Shift(I-type)·12-bit immediate 의 타협·LUI
상황·문제shamt 가 6-bit 뿐인데 충분한가? immediate 를 12-bit 로 제한한 것은 좋은 설계인가?
원인register 가 64-bit 라 shift 양은 6-bit 면 충분. 대부분의 상수는 작고, 긴 immediate 를 허용하면 불규칙·가변 길이 형식이 되어 decoder 가 복잡해진다.
해결common case 를 최적화하는 compromise (design principle 3: good design demands good compromises). 큰 상수는 LUI(U-type, 상위 20-bit) + ADDI, 64-bit 는 shift·add 조합. compiler 가 처리한다.
- shift 는 R-type 처럼 logical/arithmetic right 구분
- 강사가 LUI 형식 확인을 위해 형식 표(p8)로 되돌아감
2.1049:16–52:15Load-store architecture 와 load 명령
상황·문제register 와 memory 사이 data 이동은 어떻게 하나?
원인RISC-V ALU 명령은 operand 가 항상 register·immediate, memory 를 직접 접근하지 않는다. x86 같은 CISC 는 ALU 가 memory operand 를 써 ISA 가 복잡하다.
해결LD rd, offset12(base): 주소 = sign-extend(offset)+GPR[base], GPR[rd] ← MEM, PC+4. LD/LW/LH/LB(sign-extend)와 zero-extend 변형.
- 명령 class: load/store, ALU, control flow
- load 는 ADDI 와 같은 I-type 형식이지만 bit 해석이 다르다
2.1152:15–1:00:30Endianness 와 data alignment
상황·문제multi-byte data 를 byte addressable memory 에 어떤 순서로, 어떤 주소에 놓나?
원인big endian 은 MSB 를 낮은 주소, little endian 은 LSB 를 낮은 주소에. 정렬되지 않은 접근은 DRAM·cache 에서 여러 번의 access 가 필요하다.
해결little endian 은 작은 값을 큰 형식으로 늘릴 때 상위 byte 만 덧붙이면 된다. network 는 big endian 이라 little endian 기계는 변환 필요. RISC-V 는 data 의 unaligned access 는 허용(느림), instruction 은 불허.
- aligned = 시작 주소가 접근 크기로 나누어떨어짐
- MIPS 등은 data unaligned 도 불허, 여러 명령으로 처리
2.11.r.1Endianness (Wikipedia) ↗ · big/little endian 정의, Gulliver's Travels 유래, network order = big endian
2.11.r.2Data structure alignment (Wikipedia) ↗ · aligned access 가 효율적, misaligned 는 여러 번의 memory access 로 분할
2.121:00:30–1:03:46Store 명령(S-type)과 예제 2
상황·문제store 의 immediate 는 왜 두 조각으로 나뉘어 있나?
원인immediate 를 한 곳에 두면 rs2 가 형식마다 다른 위치에 와야 한다.
해결S-type 은 immediate 하위 5-bit 를 rd 자리에 두어 rs2 위치를 유지. 예: A[30]=h+A[30]+1 → ld x9,240(x10); add x9,x21,x9; addi x9,x9,1; sd x9,240(x10).
- SD/SW/SH/SB 로 granularity 선택
- 같은 base·offset 으로 원래 위치에 다시 store
2.131:03:46–1:11:45Control flow, basic block, conditional branch(B-type)
상황·문제if-then-else 를 1차원 memory 의 명령열로 어떻게 표현하나?
원인코드는 basic block(중간에 branch·branch target 없음)으로 나뉘고 control flow graph 를 이룬다. B-type 도 bit 위치 유지를 위해 immediate 가 섞여 있다.
해결BEQ rs1,rs2,imm13: target = PC + sign-extend(imm), 조건 성립 시 이동(PC-relative), 아니면 PC+4. BNE/BLT/BGE 와 unsigned 변형, BGT 는 register 순서를 바꿔 BLT 로.
- imm[0]=0 이라 짝수 주소만, 범위 ±4 KB
- bit1 을 둔 것은 2-byte 명령 확장 가능성 때문, 정상 실행에서 misaligned target 은 exception
2.141:11:45–1:15:04예제 3: if-else 와 branch 의 한계
상황·문제if (i==j) f=g+h; else f=g-h; 를 branch 로 구현하면?
원인bne 로 else 로 가고, then 뒤에는 beq x0,x0,Exit 로 항상 참인 unconditional branch.
해결branch 는 target 이 명령에 hard-code 되어 함수 호출·반환(매번 다른 복귀 위치)에는 쓸 수 없다. EDSAC 과 같은 문제.
- label(Else, Exit)은 programmer 용 이름, 개수 제한은 assembler 에 달림
2.151:15:04–1:16:00마무리·lab 안내
상황·문제jump 명령(p23~)은 다음 강의에서. lab session 도 live, Zoom 링크는 공지 예정.
3핵심 개념
3.1architectural state(아키텍처 상태)
programmer 가 보는 state: PC, GPR 32개, memory.
3.2zero register x0
값이 항상 0. 음수화(0 - x) 등 자주 쓰는 동작을 단순화.
3.2.r.1RISC-V (Wikipedia) ↗ · 2010 UC Berkeley 5세대 RISC, royalty-free, x0 zero register, 32-bit 명령 형식표
3.4simplicity favors regularity(단순성은 규칙성을 선호)
규칙적인 형식이 decode 를 단순·빠르게 한다.
3.5sign extension(부호 확장)
12-bit immediate 를 sign bit 복제로 64-bit 로 확장.
3.6good design demands good compromises
12-bit immediate 로 common case 최적화, 큰 상수는 LUI 등 추가 명령.
3.7load-store architecture(로드-스토어 아키텍처)
ALU 는 register·immediate 만, memory 는 load/store 로.
3.8endianness(엔디안)
big: MSB 가 낮은 주소, little: LSB 가 낮은 주소. network 는 big.
3.8.r.1Endianness (Wikipedia) ↗ · big/little endian 정의, Gulliver's Travels 유래, network order = big endian
3.9data alignment(데이터 정렬)
주소가 접근 크기의 배수. RISC-V 는 data 만 unaligned 허용(느림).
3.9.r.1Data structure alignment (Wikipedia) ↗ · aligned access 가 효율적, misaligned 는 여러 번의 memory access 로 분할
3.10basic block(기본 블록)
중간에 branch·branch target 이 없는 명령열.
3.11PC-relative addressing(PC 상대 주소 지정)
target = PC + sign-extend(imm). branch 범위 ±4 KB.
4스스로 확인
4.1x0 가 항상 0이면 무엇이 편해지나?
답
x1 을 음수로 만들 때 0 - x1(sub) 처럼 자주 쓰는 동작을 추가 명령 없이 할 수 있다.
4.2register 를 1000개로 늘리지 않는 이유는?
답
smaller is faster: register 가 많으면 접근이 느려져 전체 속도가 떨어진다.
4.3store 가 I-type 이 아니라 S-type 인 이유는?
답
rd 가 필요 없고, I-type 이면 rs2 위치가 형식마다 달라져 decode 가 복잡해진다.
4.4SUBI 가 없는데 상수 뺄셈은?
답
ADDI 에 음수 immediate 를 넣는다.
4.5RV64 shift 의 shamt 가 6-bit 인 이유는?
답
register 가 64-bit 라 0~63 이면 충분하다.
4.632-bit 상수를 register 에 만드는 방법은?
답
LUI 로 상위 20-bit 를 넣고 ADDI 로 하위 12-bit 를 채운다.
4.7little endian 이 유리한 경우는?
답
작은 값을 큰 형식으로 늘릴 때 상위 byte 만 다음 주소에 덧붙이면 된다.
4.8branch 로 함수 반환을 할 수 없는 이유는?
답
target 이 immediate 로 명령에 고정돼 호출 위치마다 다른 복귀 주소로 갈 수 없다.
5참고 자료
5.2RISC-V Ratified Specifications (RISC-V International) ↗ · unprivileged·privileged ISA manual 공식 배포 페이지
5.4Computer Organization and Design RISC-V Edition 2e companion (Elsevier) ↗ · P&H 교재 자료 (Ch 2 RISC-V 명령어)
5.5Endianness (Wikipedia) ↗ · big/little endian 정의, Gulliver's Travels 유래, network order = big endian






















