오래 못 할 짓 하지 않기

[ 컴퓨터 구조 ] 17. Datapath - Pipeline with Control signals 본문

2학년 2학기/컴퓨터 구조

[ 컴퓨터 구조 ] 17. Datapath - Pipeline with Control signals

쫑알bot 2023. 11. 6. 11:34
728x90

Single CLK cycle - Datapath

 

 

한 stage에서 나온 결과값을 다음 stage에 전달해주기 위해서는 사이에 Register가 필요하다

 

 

주로 이런 그림으로 표현할 때 왼쪽을 색칠하면 Reg Write / 오른쪽을 색칠하면 Reg Read로 이해하면 된다.

 


 

 Pipeline에서 LW를 실행했을 때 Datapath를 분석

 

 

1. Inst fetch

 

- PC값을 읽고, ADDER와 MUX를 통해서 PC+4값을 새로 write한다.

- Inst 메모리에서 명령어를 읽고, 해당 명령어를 다음 단에 넘겨주기 위해 Stage 사이에 있는 Register에 write한다.

 

 

2. Inst decode

 

- IF에서 넘어온 2개의 Register 값을 읽고,  Extension한 비트를 계산하여 target address를 미리 계산하여

 EX 단으로 넘어갈 수 있도록 Stage Register에 write

 

- Branch 할 경우를 생각하여 위에서 PC값도 계속 가져간다.

 

 

3. Execution

 

- Sign Extent한 값과 Read data1 한 값을 더하여 그 주소를 MEM stage로 넘겨준다.

 

- Branch할까봐 위에서 아직도 PC+4값을 갖고있지만 사용하지 않는다.

 

 

 

4. Mem access

 

- 앞에서 받은 주소값으로 Data Memory에서 원하는 값을 Read한다.

 

 

5. Write back

 

- Write 할 register 주소에 Data Mem에서 가져온 값을 적는다.

 

 

 

하지만!

LW 진행되고 있는 경우엔 문제가 없었지만 그 뒤에 따라오는 Inst가 있었다면 어떨까?

 

 

우리가 Write back하려고 Reg File로 돌아갔을 때, 해당 stage에서 ADD 명령어같이 실행되고 있다면 

우리가 설정한 LW에서의 Write Register와 ADD의 rd를 어떻게 처리해야할까?

 

 

수정본 ( 주황색 줄을 추가한다 )

 

Write reg주소를 끝날 때까지 같이 넘겨주고, 마지막에 얘가 필요할 때만 연결한다. 

그럼 따라오는 명령어들도 이 부분을 차지하지 않기 때문에 겹칠 일이 없다. 

 

sub은 DM이 필요 없음.

 

나올 수 있는 질문

 

 


Pipeline Control

 

 

 

각 Stages ( steps ) 에서 Control 되어야 하는 것

  • IF     :  딱히 control 할 거 없음
  • ID     :  딱히 control 할 거 없음
  • EX    :  명령어에 따라 RegDst , ALUOp , ALUSrc  
  • MEM :  명령어에 따라 Branch, MemRead, MemWrite
  • WB   : 명령어에 따라 MemtoReg , RegWrite

 

그렇다면 어떻게 Control sign을 만들어내서 제어를 할까?

 

→ 택배물류를 생각해보자. 중앙에서 한 사람이 " 그 택배 어디로 보내, 저 택배 어디로 보내. " 가 아니라

그냥 물건에 송장이 붙어있고 그거대로 물류 센터에서 송장번호에 따라 통제가 된다.

 

Pipeline 도 마찬가지다. Instruction을 보고 어떤 걸 보낼지 정한다.

ID stage에서 모든 Control 신호들을 Pipeline register에 생성한다.

 

 

 설명 :

 

  1. ID stage에서 그 뒤에 쓰일 제어 신호들을 한 번에 모두 생성한다.
  2. 그다음 EX단에서 사용되는 신호들을 거기에서 쓰이고 종료.
  3. 또 그 다음 Memory단에서 사용되는 신호들도...
  4. WB...

++ 제어신호들은 파이프라인 register에 같이 붙음.

 

 

 

Control 신호까지 있는 Pipeline은 아래와 같다.

 

더보기

예)

이 명령어를 Pipeline에서 실행해보자

 

 

● CLK 1

- 해당 PC값에 해당하는 Inst를 읽고 그걸 ID단에 넘겨주기 위해 Register에 넣는다.

- PC+4

 

 

● CLK 2

- ID 단에서 Inst가 LW인 것을 읽고, Control signal을 만들어냈다.

  ID 단에서 Register file에서 값을 읽고, sign extend 도 한 값을 EX단으로 넘겨준다.

 

- IF 단에서 다음 명령어가 읽히고 ID단으로 넘겨줬다.

 

 

 

● CLK 3

 

- EX 단에서 LW명령어가 진행되기 때문에 Reg 1값과 Sign Extend값을 더하고 있고

  그에 맞게 생성된 Control signal 값 덕분에 정상적으로 돌아가는 중이다.

 

- ID 단에서는 Sub 명령어에 맞는 Control signal 생성 및 sub 명령어를 위한 Reg값 read

 

- IF 단에서는 그 다음 명령어를 읽고있음.

 

 

● CLK 4

 

- MEM 단에서 LW가 Data Mem에 있는 값을 읽음.

- EXE 단에서 Sub가 읽은 값들을 빼는 연산을 하는 중

- ID 단에서 Register에서 연산에 필요한 값들을 읽는 중 + Control signal 생성

- IF 단에서 그 다음 명령어 fetch 중

 

 

 

● CLK 5

- WB 단에서 LW가 Data Mem에 있는 값을 Write Register에 적어주기 위해 넘기고 거기에서 씀.

Control signal에 맞춰서 작성.

 

- Mem 단에서 Sub가 할 건 없음. WB으로 넘겨주기 위해 기다림

...

 

● CLK 6

 

- EXE에서 연산한 결과를 Write Register로 넘어가서 작성한다.

 

 


 

Summary

 

[ 성능 비교 ]

Throughput : 시간을 정해놓고 그 안에 명령어를 얼마나 실행하느냐

Latency       : 하나의 명령어를 할 때 시간이 얼마나 걸리느냐

 

 

Instruction throughput: 그냥 하나의 CLK cycle에 명령어 몇 개가 실행되느냐 생각하면 될 것 같다.

직관적으로 이해하기 쉬우려면  [  1/CPI  ] 로 생각하셈 

 

CLK을 여러 개로 쪼개느냐 크게 한 덩이로 하느냐 또 나눔

 

 

 

1개 명령어 실행하는데 여러 CLK이 필요한지  1개면 되는지로 나누고,

 

Hardware ( Adder / Mem )을 공유하는지 , 구체적으로 역할에 따른 Hardware를 나누어 놨는지로 또 나눌 수 있다.

 

 

(출처)

한동대학교 용환기교수님 - 컴퓨터구조