Semiconductor/0. Digital, Analog, 회로 이론

CPU 구조 및 동작 원리 (RISC, Pipeline, Hazard) (2)

잇(IT) 2024. 8. 15. 21:05

https://insoobaik.tistory.com/671

CPU 구조 및 동작 원리 (1)에 이어 조금 더 자세히 CPU 구조 및 동작 원리에 대해 알아볼 것이다.


 

 

16비트의 컴퓨터에서는 명령어가 16비트로 구성된다.

Opcode와 Operand 부분으로 나누어진다.

- Opcode : CPU가 수행할 특정 작업(연산)을 지정하는 코드다.

- Operand : Opcode에 의해 정의된 작업에 사용될 데이터나 주소를 나타낸다.

위 그림의 경우 상위 4bit가 Opcode에 해당하여 CPU가 수행할 작업을 지정하고 하위 12bit가 작업에 사용될 데이터나 주소를 담게 된다.

 

위 표는 Opcode에 대한 정의를 보여주고 있다. 각 Opcode에 대한 Instruction 명령어가 지정되어 있고, 해당 명령어들이 어떻게 동작하는 뒤에 설명되어 있다.

예를 들어 Opcode 0000일 경우 LDA S 명령이 실행되고 이 명령은 M[S] 메모리 주소 S에 있는 데이터를 ACC(누산기)에 전달하게 된다.

위 명령어를 통해 CPU가(https://insoobaik.tistory.com/671) 동작하게 된다.


■ CPU 명령 실행 단계

 

- CPU 전체 구성도

CPU의 전체 구성은 위와 같이 구성되어 있다.

Fetch -> Decode -> Execute -> Memory Access -> Write Back 단계를 거치게 된다.

자세한 내용은 아래 설명하겠다.

 

[Intruction Fetch (명령어 가져오기)]

Intruction Fetch는 명령어를 가져오는 단계에 해당한다.

PC가 현재 실행할 명령어의 주소를 가지고 있다. 이 주소는 Instruction memory에 전달된다.

Instruction memory에 저장된 명령어는 Decode 단계에서 해석된다.

 

[Decode 해석]

(위에서 16bit를 기준으로 설명하고 있지만 아래는 32bit Decode를 설명하고 있다.)

Decode 단계에서는ISA(Instruction Set Architecture)의 기본 명령어를 따른다.

세 가지 기본 명령어 형식이 있다. 

R(Register), I(Immediate), J(Jump)가 있으며 지금은 R에 대해서만 알아보겠다.

 

- R - Foamat

op : 명령어의 종류를 지정하는 코드 이 코드를 통해 CPU가 어떤 연산을 수행해야 하는지 결정한다.

rs : 첫 번째 소스 레지스터의 주소 - 연산에서 사용할 첫 번째 피연산자를 뜻한다.

rt : 두 번째 소스 레지스터의 주소 - 연산에서 사용할 두 번째 피 연산자를 뜻한다.

rd : 결과가 저장될 목적 레지스터의 주소

shamt : 쉬프트 연산에서 사용되는 쉬프트 양을 나타낸다.

funct : 연산의 구체적인 기능을 나타낸다. Opcode와 결합되어 어떤 연산을 수행할지 결정된다.

 

[Execution 실행]

 

(R-Format을 사용하여 Decode 과정을 진행했다고 가정한다.)

 

- 레지스터에서 데이터 읽기

Read Register 1, 2 - rs, rt 필드에 지정된 값은 각각 첫 번째와 두 번째 소스 레지스터의 번호를 나타낸다. 이 레지스터 번호는 레지스터 파일에서 두 개의 레지스터를 선택하는 데 사용된다.

Read Data 1, 2 - 레지스터 파일은 rs와 rt 값에 따라 각각 두 개의 데이터를 읽고 Read data 1, 2로 표시된다.

- ALU에서 연산 수행

레지스터 파일에서 읽어온 Read data 1, 2는 ALU로 전달된다.

ALU는 명령어의 funct 필드에 따라 특정 연산을 수행한다. (ex) ADD는 더하기, SUB은 빼기)

ALU operation은 funct 필드에 따라 어떤 연산이 수행될지를 결정한다.

- 결과 저장

ALU에서 연산이 완료되면, 그 결과는 rd 필드에 지정된 레지스터에 저장된다.

레지스터 파일의 쓰기 포트를 통해 결과가 해당 레지스터로 기록된다. (Write Data)

 

[Memory Access & Write Back (메모리 접근 & 결과 기록)]

 

[Memory Access]

- Address : ALU에서 연산한 결과나 특정 메모리 주소가 입력된다.

- Write data : 메모리에 데이터를 저장할 때 사용되는 data

- MemRead : 메모리에서 데이터를 읽는 신호, 이 신호가 활성화되면 지정된 주소에서 데이터를 읽는다.

- MemWrite : 메모리에 데이터를 쓰는 신호, 이 신호가 활성화되면 지정된 주소에 데이터를 쓴다.

- Read data : 메모리에서 읽어온 데이터로, 이후의 단계에서 사용되거나 레지스터에 기록된다.

 

Sign extension unit은 16비트의 데이터를 32비트로 확장할 때 사용된다.

 

[Write Back]

Data memory 블록에서 나오는 Read data 신호와 ALU에서 나오는 ALU result 신호가 Mux로 전달된다.

MemtoReg 신호에 따라 메모리에서 읽어온 데이터 (Read data) 또는 ALU 결과 (ALU result) 중 하나를 선택하게 된다.

MemtoReg 신호에 따라 선택된 데이터는 Registers 블록으로 전달되어, Write data 신호로 사용된다. Write register 신호는 어느 레지스터에 데이터를 쓸지 결정한다. (위에 Reigsters Block 확인)


■ Pipelining

 

Pipelining은 CPU에서 명령어 처리 효율을 높이기 위한 기술이다.

CPU가 여러 명령어를 동시에 처리할 수 있도록 도와준다.

위는 대표적인 Laundry machine에 해당하며 위처럼 1. 빨래하고, 2. 건조하고, 3. 옷을 개고, 4. 옷장에 넣는 단계를 마쳐야  세탁을 마쳤다고 할 수 있다. 하지만 매번 옷장에 넣는 단계가 끝난 뒤에 새롭게 빨래를 시작해야 한다면 4번의 세탁을 위해선 한 사이클 x 4의 시간이 필요하다.

하지만 아래와 같이 한 사이클이 끝날때까지 기다리는 것이 아닌 A에서 빨래가 끝나면 B에서 건조를 시작하고 A는 그 다음 빨래를 바로 다시 시작하는 것이다.

이렇게 동작시키게 되면 작업 시간을 단축시킬 수 있다.

 

위에서 CPU는 Fetch, Decode, Execute, Memory Access, Write Back 총 5단계를 거치는 것을 확인했다.

Pipelining을 적용하지 않으면 작업 하나를 실행하기 위해서 5단계를 기다려야 하기 때문에 작업 시간이 매우 오래 걸릴 것이다.

 

CPU는 위 5 단계를 Pipelining 하는 5-stage Pipelining을 사용한다.

위 그림을 보게되면 예시 그림과 같이 각 단계가 동작하는 것을 확인할 수 있다.

* 여기서 주의할 점은 Reg의 작업 시간이 짧아도 가장 긴 작업 시간의 동기화 시간에 맞춰 동작해야 한다. (작업 시간이 짧다고해서 바로 다음 단계로 넘어갈 수 없다.)

 

https://hi-guten-tag.tistory.com/270

 

[컴퓨터 구조] Pipelined Datapath

앞의 글을 읽으시면 이해에 도움이 됩니다. 2022.11.01 - [Computer Science/컴퓨터 구조] - [컴퓨터 구조] Basic Implementation of the RISC-V (RISC-V의 기본적인 구현) [컴퓨터 구조] Basic Implementation of the RISC-V (RISC-V

hi-guten-tag.tistory.com

 

CPU의 자세한 pipeline 동작 구조는 위 글을 참고하면 자세하게 알 수 있다. (참고해서 추가로 공부해야겠다.)


■ Hazard

 

Pipeline에서 가장 큰 문제점 중 하나는 Hazard다.

 

Hazard는 크게 3가지로 나눌 수 있다.

1. Data Hazard

2. Control Hazard

3. Structural Hazard

 

1. Data Hazard

한 명령어가 사용할 데이터를 이전 명령어가 아직 완전히 처리하지 못한 경우 발생한다.

예를 들어, 첫 번째 명령어가 특정 레지스터에 값을 기록하지 전에 두 번째 명령어가 같은 레지스터에서 값을 읽으려고 할 때 문제가 발생할 수 있다.

2. Control Hazard

분기(branch) 명령어로 인해 발생한다. CPU가 어떤 명령어를 다음에 실행해야 할지 확실하지 않은 경우 Pipeline이 중단될 수 있다. 분기 예측이 잘못된 경우, pipeline에 있던 명령어들이 무효화되고 다시 시작해야 하는 상황이 발생한다.

3. Structural Hazard

두 개 이상의 명령어가 동시에 같은 하드웨어 자원을 사용하려고 할 때 발생한다. 예를 들어, 메모리 접근이 필요한 두 개의 명령어가 동시에 실행될 때, 메모리 접근 경로가 하나라면 문제가 발생할 수 있다.

 

https://blog.naver.com/mayooyos/220878015447

 

28. Pipeline Hazard (1)Structural/Data Hazard

$ Structural Hazard1. Structural hazard란? (1) 정의  : Hardware resource의 부족으로 인해 in...

blog.naver.com

 

Hazard에 대한 자세한 내용은 위 글을 참고하면 자세하게 알 수 있다. (참고해서 추가로 공부해야겠다.)

728x90