- 프로세서 시리즈 모아보기 -
https://microelectronics.tistory.com/112
기본적인 ISA 동작 방식을 모르면 이해하기 어렵습니다.
프로세서의 세가지 구성 요소
첫째, 프로세서의 주요 구성 요소는 무엇인가?
둘째, 이 구성 요소들을 어떻게 연결하고 제어할 것인가?
1. 프로세서의 구성 요소
먼저, 프로세서가 어떻게 동작하는지 정말 짧게 정리하면 아래와 같다.
1. 명령어를 메모리로 부터 fetch해(불러) 오고
2. 이를 decode(해석) 해서
3. execution(실행) 한다. 그런데 이때, 명령어를 실행하기 위해 메모리에 접근이 필요할 수 있고, 연산이 필요할 수 있으며, 레지스터에서 값을 읽거나 쓸 수도 있다.
우리는, 위 동작 과정을 수행하기 위한 중요한 구성 요소들을 알아야 한다.
명령어 대부분의 작업이 아래 세가지로 귀결된다.
명령어 접근 (Instruction Fetch)
- 프로세서는 메모리에서 명령어를 가져와야 실행할 수 있다. 이를 위해 프로그램 카운터(PC)가 현재 실행할 명령어의 주소를 유지하고, 프로그램 메모리에서 명령어를 불러온다.
ALU 연산 (Arithmetic Logic Unit)
- ALU는 덧셈, 뺄셈 같은 산술 연산과 AND, OR 같은 논리 연산을 처리한다. 입력값은 레지스터 파일에서 가져오며, 어떤 연산을 수행할지는 디코드 로직이 결정한다.
메모리 접근 (Memory Access)
- 데이터 메모리에 접근해 데이터를 읽거나 저장하는 과정이다. 주소를 계산하는 조합 논리와 데이터 메모리가 이 역할을 맡는다.
2. 제어 신호와 명령어 디코딩
위에서 언급한 프로세서의 동작을 성공적으로 진행하려면, 각 동작 과정에서 내부 하드웨어 구성요소가 명령어의 의도에 맞게 동작하도록 적절한 제어신호를 가해줘야 한다. 즉, 프로세서가 잘 동작하기 위해 각 부분이 정확히 어떤 동작을 할지 알려주는 신호가 제어 신호이다.
그리고, 명령어를 해석해 이 제어 신호를 결정하고 설정하는 것이 명령어 디코딩이다.
3. Single Cycle Design 구성 요소
Single Cycle Design은 프로세서 설계의 가장 기본적인 형태로, 모든 명령어를 한 클록 사이클 내에 실행한다. 이 설계는 단순하고 구조를 이해하기 쉽다.
챕터 1 에서 다룬 내용을 하나로 정리해 보자.
프로세서의 구성 요소는 Instruction Fetch, ALU 연산, 메모리 접근(로드 및 저장)이다. 분기명령 또한 이 세가지 요소로 완료된다.
3.1 세가지 구성요소
사실 각 과정은 서로 첨예하게 얽혀있기 때문에 순차적으로 정리하기가 매우 힘들다. 그럼에도 데이터의 흐름대로 정리를 해보면 아래와 같다.
모든 과정은 명령어 메모리에서 명령어를 불러오는 것으로 시작한다.
프로세서는 프로그램 카운터(PC)를 사용해 현재 명령어의 주소를 확인하고, 그 주소를 기반으로 명령어를 메모리에서 불러온다. PC는 이후에 Adder를 통해 PC + 4로 갱신되어 다음 명령어 주소를 설정한다.
- 레지스터 파일 읽기
세가지 구성요소는 보통 이후에 레지스터 파일을 읽게 된다.
ALU 연산은 계산을 위해 레지스터 파일을 읽고,
메모리 접근은 주소를 찾기 위해 레지스터 파일을 읽으며,
분기 명령어(instruction fetch)는 두 레지스터가 같은지 여부를 확인하기 위해 레지스터 파일을 읽는다.
즉, 대부분의 명령어는 레지스터 파일을 읽지만, 이후에 각기 다른 작업을 시작한다.
- ALU 사용하기
세가지 구성요소는 ALU를 사용한다.
ALU 연산은 덧셈, 뺄셈, OR 등의 작업을 수행한다.
메모리 접근은 주소를 계산하는데, 이 계산은 ALU를 사용하여 이루어진다.
(e.g. 특정 주소에서 특정 offset 만큼 떨어진 주소로 접근해야 할 경우, ALU 로 더하기 연산을 해야한다.)
Instruction Fetch는 분기 비교를 수행하는데, 두 레지스터 파일의 값을 비교하여 같으면 분기를 실행하는 방식이다.
(e.g. 다음 명령어를 fetch 하는데 branch 가 존재할 경우, 주어진 두 값을 비교해서 점프해야한다. 이때 비교에 ALU 로 빼기와 같은 연산을 해야한다. 또한, 분기할 '명령어 주소' 또한 계산을 해야하는데, 분기 계산과 분기 주소 계산을 동시에 하기위해 별도의 ALU 가 필요할 수도 있다. )
따라서 이 세 가지 모두 ALU를 사용하지만, 각각 다른 방식으로 사용된다.
- 레지스터 파일 쓰기
다음으로, ALU 연산은 결과를 레지스터 파일에 다시 기록하고, 메모리 접근도 load 명령인 경우 결과를 레지스터 파일에 기록한다.
일부 명령어는 레지스터 파일에 기록하지만,메모리에 다이렉트로 저장하는 명령어도 있다.
- 메모리를 읽거나 쓰기
메모리 접근은 데이터를 읽거나 쓰기 위해 데이터 메모리를 필요로 한다. 데이터를 기록하기 전에 실제 데이터 메모리에 접근해야 한다.
4. 구성요소간 연결
4.1 Register File 과 ALU
레지스터 파일과 ALU는 이미 연결되어 있다. 레지스터 포트의 출력을 ALU로 보내고, ALU의 출력을 다시 레지스터에 넣는다.
4.2 ALU 와 메모리
메모리에는 데이터를 저장할 때는 레지스터 파일에서 데이터를 가져온다.
저장 명령어의 경우 레지스터 파일의 값을 저장하며, 주소는 ALU에서 직접 가져온다.
마지막으로, 메모리에서 읽은 데이터를 레지스터 파일에 넣는 경우도 존재한다.
4.3 Immediate value 와 ALU (주소 계산)
즉시값(immediate)을 처리하기 위해서는 부호 확장(sign extension) 로직이 필요하다. 이 즉시값은 명령어의 필드에서 가져와 부호 확장 후 ALU에 입력된다.
ALU의 출력 중 '0'은 r0 설정이나 즉시값의 부호 확장을 위한 것이 아니라, 분기 명령어의 비교에 사용된다.
두 입력값을 뺀 결과가 0이면 두 입력이 동일하다는 뜻이다.
예를들어, risc-v 의 beq 명령어를 생각해보자.
beq r0, r1, label
r0 과 r1 의 값이 똑같으면 'label' 로 점프하라는 뜻이다.
4.4 Mux 추가
다이어그램을 보면 빨간색과 파란색 선이 합쳐지는 두 위치가 있다.
신호를 그냥 합칠 수는 없기 때문에, 멀티플렉서(MUX)를 사용해 신호를 선택한다.
- 첫 번째 MUX는 ALU 입력을 레지스터 파일에서 가져올지, sign-extended 즉시값에서 가져올지를 선택한다. R 형식 명령어의 경우 항상 레지스터 파일을 선택하고, I 형식 명령어의 경우 즉시값을 선택한다.
- 두 번째 MUX는 데이터 메모리 이후에 위치하며, ALU 결과와 메모리에서 읽은 데이터 중 무엇을 레지스터 파일에 기록할지를 선택한다. 로드 명령어의 경우 메모리에서 데이터를 가져오고, 그 외의 경우 ALU 결과를 사용한다.
결론
프로세서의 제어와 데이터 경로 설계는 명령어 접근, ALU 연산, 메모리 접근이 주요 요소이다. 각 구성 요소는 레지스터 파일과 ALU를 중심으로 상호작용하며, 명령어는 ALU를 다양한 방식으로 사용하여 처리된다. 제어 신호와 MUX는 입력 및 출력 경로를 선택해 주며, 분기 명령어는 조건을 평가하여 PC를 업데이트한다. Single Cycle Design이 아무리 단순해도 다양한 연결과 제어가 필요하다. 다음 게시글에는 Mux 를 제어하는 Control Signals (제어 신호) 에 대해 다룬다.
Reference
'Computer Architecture > Processor' 카테고리의 다른 글
Processor의 구조 - 6. Pipeline(파이프라인) 설계 (0) | 2024.11.13 |
---|---|
Processor의 구조 - 5. Pipeline(파이프라인) (0) | 2024.11.12 |
Processor의 구조 - 4. Decoder(디코더) (0) | 2024.11.11 |
Processor의 구조 - 3. Clock 과 Critical Path(임계경로) (0) | 2024.11.10 |
Processor의 구조 - 2. Control Signal 과 Data path (0) | 2024.11.09 |
댓글