본문 바로가기

RISC-V/RISC-V 개념

[RISC-V] 3편 RISC-V 명령어의 실제 실행 과정: 파이프라인·예외·트랩·CSR

RISC-V ISA는 단순한 명령어 집합을 넘어, 명령어가 실제 하드웨어에서 어떻게 처리되는가에 대해 명확한 규칙과 메커니즘을 제공한다. 이번 글에서는 다음을 하나씩 깊이까지 파고든다.

 

이번 글의 목표

  • RISC-V 명령어의 수행 단계(IF~WB)를 파이프라인 레벨에서 이해
  • 분기·예외·트랩·인터럽트 처리 과정 분석
  • RISC-V의 트랩 벡터 구조와 privilege 모드 구조
  • CSR(Control & Status Register)의 역할
  • 예시 코드 기반으로 실제 하드웨어 동작 추적

 

1. RISC-V 파이프라인 기본 구조

대표적인 RISC 아키텍처와 마찬가지로, RISC-V의 실행 구조도 다음의 5-stage 파이프라인을 기반으로 설명할 수 있다.

 

1.1 5단계 파이프라인

단계 이름 역할
IF Instruction Fetch 명령어 메모리에서 인출
ID Instruction Decode opcode 해석, 레지스터 읽기
EX Execute ALU 연산, 분기 판단
MEM Memory Access 로드/스토어 수행
WB Write Back 레지스터 파일에 결과 기록

 


1.2  파이프라인의 핵심 목표

1) 1클럭당 한 명령어(IPC 1) 를 최대한 유지하는 것이다.

 

2) 명령어 생명 주기: 실제 흐름 따라가기

예시 명령어:

addi x5, x5, 4

lw   x6, 0(x5)

add  x7, x6, x5

이 세 명령이 파이프라인에서 어떻게 진행되는지 살펴보자.

 

🔍 예시: 파이프라인 흐름표

 

Cycle  addi  lw add
1 IF    
2 ID IF  
3 EX ID IF
4 MEM EX ID
5 WB MEM EX
6   WB MEM
7     WB

 

파이프라인 설계 덕분에 실제 클럭은 7회만 사용했다. 만약 순차 처리였다면 15클럭 정도가 필요했을 것이다.

 

3. 파이프라인 Hazard (데이터/제어/구조)

RISC-V 아키텍처는 단순하지만, 파이프라인 충돌(hazard)은 반드시 해결해야 한다.

 

(1) 데이터 Hazard (Data Hazard)

예시:

lw   x6, 0(x5)

add  x7, x6, x5

 

lw x6 레지스터를 WB에서 기록하기도 전에 add x6을 필요로 한다.

 

해결 방법

  • Forwarding(데이터 우회 경로)
  • stall(버블 삽입)

 

(2) 제어 Hazard (Control Hazard)

분기 명령어:

beq x1, x2, LABEL

EX 단계가 끝나기 전까지 실제 분기 여부를 알 수 없기 때문에 파이프라인은 잠시 멈추거나, 분기 예측기를 사용해야 한다.

 

(3) 구조 Hazard (Structural Hazard)

두 개의 파이프라인 단계가 동일한 하드웨어 자원을 동시에 필요로 할 때 발생한다. 단순 RISC-V 코어에서는 instruction memory data memory를 분리하여 문제를 회피하는 구조(Harvard architecture)를 많이 사용한다.

 

 

4. 예외(Exception) & 트랩(Trap)

RISC-VException(동기적), Interrupt(비동기적) 을 모두 Trap Handler로 전달한다.

 

Exception의 예

Exception 종류 예시
Illegal instruction 정의되지 않은 opcode
Load/store fault 메모리 접근 오류
Environment call ecall 명령 수행

 

Trap 발생 과정

  1. 명령어 실행 중 오류 발생
  2. 현재 privilege level에 따라 trap vector 주소 결정
  3. PC 값을 CSR 레지스터에 저장
  4. Handler 루틴으로 점프
  5. 처리 후 mret/sret 등으로 복귀

 

5. RISC-V Privilege Levels (권한 레벨)

RISC-V는 매우 단순한 권한 계층을 제공한다.

 

🔐 Privilege Level 구조

Level 이름 설명
M Machine Mode 최상위 권한, 모든 자원 접근
S Supervisor Mode OS 커널 수준 권한
U User Mode 일반 유저 프로그램

많은 임베디드 시스템은 M 모드만 사용한다.
리눅스 기반 시스템은 M + S + U 구조를 사용한다.

 

6. CSR(Register) 구조 완전 해부

CSR CPU의 제어·상태 정보를 저장하는 중앙 관리 레지스터 집합이다.

 

📌 CSR 영역은 크게 네 가지 용도로 사용된다.

 

 - Trap 처리 정보 저장

  • mepc (trap PC 저장)
  • mcause (발생 원인)
  • mtvec (trap handler 주소)

- Privilege 관리

  • mstatus
  • sstatus

- 인터럽트 관리

  • mie (interrupt enable)
  • mip (interrupt pending)

- 성능 카운터

  • mcycle (CPU 사이클 수)
  • minstret (실행된 명령어 수)

 

 대표 CSR 테이블

CSR 역할
mstatus Machine mode 상태
mepc trap 발생 시 PC
mcause trap 원인
mtvec trap vector base
misa 지원하는 ISA 정보
mie 인터럽트 활성화
mip 인터럽트 대기 상태
mcycle 사이클 카운터

 

7. 실제 Trap 예시로 전체 동작 이해하기

예시:
잘못된 메모리 주소 접근 코드

int* p = (int*)0xFFFFFFFF;

int x = *p;  // load fault 발생

 

🔍 RISC-V Trap 처리 흐름

  1. lw 명령이 MEM 단계에서 fault 발생
  2. CPU가 예외 코드 설정
    → mcause = Load Access Fault
  3. fault 발생 시점의 PC 저장
    → mepc = <lw
    명령의 주소>
  4. trap handler 주소로 점프
    → mtvec
    에 저장된 주소로 이동
  5. OS 또는 펌웨어가 예외 처리
  6. mret로 복귀
    → mepc
    에 저장된 주소 다음 명령으로 복귀

 

8. 파이프라인에서 Trap이 발생한 경우

파이프라인은 현재 진행 중인 명령어를 모두 플러시하고, trap handler로 넘어간다.

플러시 시 사라지는 요소:

  • 디코드 중이던 명령어
  • EX, MEM 단계에 있던 명령어
  • 다음 사이클에 수행될 명령어

 

9. 실제 하드웨어 수준 코드 예시: CSR 접근

RISC-V CSR을 읽고 쓰는 명령어를 제공한다.

 

: CSR 읽기 (csrr)

csrr x5, mcycle

→ mcycle CSR 값을 x5 레지스터에 읽어옴

 

: CSR 쓰기 (csrw)

csrw mtvec, x10

→ trap handler 주소를 mtvec에 설정

 

: CSR 비트 단위 set/clear

csrs mie, (1 << 7)   # Timer interrupt enable

csrc mie, (1 << 7)   # Disable timer interrupt

 

 

10. 정리 — RISC-V의 실행 메커니즘은단순하지만 강력

이번 글을 통해 다음 개념을 확실하게 확보했을 것이다.

  단순한 5단계 파이프라인

쉬운 하드웨어 구현에 최적화.

 

데이터·제어 Hazard 구조

Forwarding·stall·branch prediction 개념 적용 가능.

 

 예외/트랩 처리 구조의 일관성

Exception/Interrupt 모두 동일한 trap 메커니즘으로 처리.

 

 CSR 기반의 강력한 제어력

트랩, 인터럽트, privilege level, 성능 분석까지 모두 CSR에서 제어.

 

 전체 실행 흐름이 매우 깨끗하다

복잡한 x86과 달리, RISC-V의 실행 모델은 단순성 = 강력함 을 잘 보여준다.