Book/COMPUTER ORGANIZATION AND DESIGN RISC-V

4. The Processor (4.10 Exceptions)

S0LL 2024. 11. 17. 14:51

예외와 인터럽트의 차이

 

예외 (Exception)

프로그램 내에서 발생하는 예기치 않은 사건이다.

예를 들어, 정의되지 않은 명령어가 실행되거나 하드웨어 고장이 발생하는 경우가 예외이다.

 

인터럽트 (Interrupt)

외부 장치나 하드웨어가 발생시키는 이벤트이다.

예를 들어, I/O 장치가 데이터를 준비했다고 알리거나 시스템의 타이머가 주기적인 작업을 요청하는 경우가 이에 해당한다.

 

RISC-V에서는 예외라는 용어를 사용하여 프로그램 내에서 발생하는 모든 예기치 않은 이벤트를 의미하며, 인터럽트는 외부에서 발생하는 예외를 지칭한다.

 

 

예외 처리 방법

 

RISC-V 시스템에서 예외가 발생하면, 두 가지 주요 작업이 수행된다.

 

1. 예외가 발생한 명령어의 주소를 저장

예외가 발생한 시점에서 현재 실행 중인 명령어의 주소를 SEPC(Supervisor Exception Program Counter) 레지스터에 저장한다.

이를 통해 예외가 발생한 위치를 추적할 수 있다.

 

2. 제어를 예외 처리 루틴으로 전환

 예외가 발생한 원인에 따라 예외 처리 루틴으로 제어를 전달한다.

예를 들어, 하드웨어 고장에 대한 처리 루틴이나, 정의되지 않은 명령어에 대한 처리 루틴으로 점프한다.

 

 

RISC-V 예외 처리 시스템

 

RISC-V에서는 예외가 발생하면 두 가지 방법을 사용하여 이를 처리한다.

 

1. Supervisor Exception Cause Register (SCAUSE)

예외의 원인(예: 정의되지 않은 명령어 실행, 하드웨어 고장 등)을 기록하는 레지스터이다.

 

2. Supervisor Exception Program Counter Register (SEPC)

예외가 발생한 명령어의 주소를 저장하는 레지스터이다.

이 레지스터는 예외 처리 후 실행을 재개할 위치를 나타낸다.

 

RISC-V 시스템은 예외 처리 루틴을 시작할 때, 예외 벡터 주소를 사용하여 처리할 예외에 맞는 주소를 지정한다.

 

 

예외 발생 처리

 

명령어 플러시 (Flush)

 예외가 발생한 명령어는 IF, ID, EX 단계에서 플러시된다.

이렇게 플러시된 명령어들은 더 이상 파이프라인에 존재하지 않으며, 예외 처리 루틴으로 전환되기 전에 불필요한 명령어들을 제거한다.

 

SEPC 레지스터 저장

예외가 발생한 명령어의 주소는 SEPC 레지스터에 저장되며, 이후 예외 처리 루틴을 호출할 때 이 주소를 참조하여 명령어가 실행된 위치로 돌아갈 수 있게 한다.

 

EX. Flush

 EX 단계에서 예외가 발생하면, EX 플러시 신호를 사용하여 EX 단계에서 명령어를 플러시한다.

이때 EX 단계에서 발생한 예외는 플러시를 통해 제거되고, 이후 예외 처리 루틴으로 흐름이 전환된다.

 

 

 

예외 발생 예시 (하드웨어 고장)

 

예를 들어, add 명령어 실행 중 하드웨어 고장이 발생했다고 가정해보자.

이 경우, EX 단계에서 예외가 감지되면 해당 명령어는 SEPC 레지스터에 저장되고, 이후 예외 처리 루틴으로 흐름이 전환된다.

이 과정에서 파이프라인에 있는 잘못된 명령어는 모두 플러시된다.

 

이 그림에서는 예외가 발생했을 때 SEPC 레지스터에 예외가 발생한 명령어의 주소를 저장하고, 이후 예외 처리 루틴으로 점프하는 과정을 보여준다. 

EX. Flush ID. Flush 신호를 통해, 예외 발생 시 잘못된 명령어들이 파이프라인에서 제거된다.

예외 처리 루틴은 새로운 주소에서 시작되며, SEPC에서 예외가 발생한 주소로 점프하여 예외를 처리한다.

 

예외가 발생했을 때의 파이프라인 동작 

 

EX 단계에서 예외가 발생하면

예외가 발생한 명령어는 SEPC 레지스터에 저장된다.

그 후, EX 단계에서 명령어가 플러시되고, 예외 처리 루틴이 시작된다.

 

예외 처리 루틴

 예외 처리 루틴은 1C090000 주소에서 시작되며, 예외 처리 루틴으로의 점프가 수행된다.

이후, 예외 처리 루틴에서 하드웨어 고장을 처리한다.

 

 

핵심 내용:

 

1. SEPC 레지스터

 예외가 발생한 명령어의 주소를 저장하여 나중에 예외를 처리한 후 해당 위치에서 실행을 재개할 수 있게 한다.

 

2. EX. Flush, ID. Flush

예외가 발생하면 EX 및 ID 단계를 플러시하여 잘못된 명령어들이 더 이상 파이프라인에 존재하지 않도록 한다.

 

3. 하드웨어 고장 처리

하드웨어 고장이 발생한 경우 예외 처리 루틴에서 해당 고장을 처리하고, 필요한 경우 프로그램을 종료하거나 재시작한다.

 

 

 

예외 처리 관련 개념

 

Precise Exception (정확한 예외)

예외가 발생한 시점과 정확히 일치하는 명령어가 예외를 발생시킨 경우.

Imprecise Exception (부정확한 예외)

예외가 발생한 명령어와 정확히 일치하지 않는 예외 처리.

예를 들어, EX 단계에서 예외가 발생했지만, 정확한 명령어 추적이 되지 않은 경우.

 

 

 

Check Yourself:

문제: 주어진 명령어 시퀀스에서 어떤 예외가 가장 먼저 인식될 것인가?

 

1. xxx x11, x12, x11 // 정의되지 않은 명령어

2. sub x11, x12, x11 // 하드웨어 오류

 

답변:

1. 정의되지 않은 명령어

 해당 명령어는 파이프라인에서 가장 먼저 인식되어 예외가 발생한다.

이는 하드웨어가 해당 명령어를 알지 못하기 때문이다.

 

2. 하드웨어 오류

 하드웨어 오류는 예외가 발생할 수 있지만, 위의 정의되지 않은 명령어에 비해 더 늦게 인식될 수 있다.

 

예시:

예시에서는 하드웨어 고장이 발생할 경우, 예외 처리 과정을 보여준다.

하드웨어 고장은 add 명령어의 실행 중에 발생하며, 예외가 감지되면 해당 명령어를 플러시하고 예외 처리 루틴을 시작한다.

 

답변:

1. EX 단계에서 예외가 발생하면: 예외 발생 후 EX 단계에서 해당 명령어는 플러시되며, 예외 처리 루틴이 시작된다.