![](https://velog.velcdn.com/images/s_sub/post/f41f3157-0f58-48c2-8bb5-2076cf8731be/image.png)
Review
- IF (Instruction fetch)
- ID (Instruction decode / register file read)
- EX (Execute / address calculation)
- MEM ( Memory access)
- WB (Write back)
- 예외
- WB (쓰기 단계)
: 결과를 datapath의 중앙에 있는 register file에 쓴다
-> Data Hazard로 이어질 수 있다
- MEM (PC의 다음 값 선정)
: 증가된 PC값과 MEM 단계의 branch 주소 중에서 고른다
-> Control Hazard로 이어질 수 있다
Pipeline register
- stage 사이에 register가 필요하다
- 이전 cycle에서 생산된 정보를 hold한다
![](https://velog.velcdn.com/images/s_sub/post/d6577524-b3ef-4c66-ad46-fc9542b1ad2e/image.png)
Pipeline Operation
- Pipeline datapath를 통해 instruction의 cycle-by-cycle flow
- load와 store의 "single-clock-cycle" diagram을 보자
LOAD
IF
![](https://velog.velcdn.com/images/s_sub/post/372c2369-5183-4a52-9344-572987a90baa/image.png)
- instruction memory에서 읽어서 pipeline register에 저장한다
- (교재)
- PC에 있는 주소를 사용하여 메모리에서 명령어를 읽어오고 p-register에 저장한다
- PC 주소는 4만큼 증가되어 다시 PC에 저장된다 -> 다음 cycle에 이용 가능하다
- 이 증가한 주소는 후에 beq처럼 뒤에 필요한 경우를 위해 p-register에 저장된다
ID
![](https://velog.velcdn.com/images/s_sub/post/9caac31b-b7d8-4023-b6bc-4b01f3b52bdb/image.png)
- 이전 pipeline register가 input 역할을 한다
- 주의 : pipeline register is NOT 32-bit register
- register number, offset 등 다음 cycle에서 실행하기 위해 필요한 추가적인 정보들을 가지고 있다
- (교재)
- register 번호 두개와, 16-bit immediate field를 전달한다.
- 세 값 모두 증가한 PC값과 함께 p-register에 저장된다.
EX
![](https://velog.velcdn.com/images/s_sub/post/2efbeb66-7e5c-4b12-b003-38f333328f4c/image.png)
- offset + base register address를 통해 메모리 주소를 계산하고 이를 pipeline register에 저장한다
MEM
![](https://velog.velcdn.com/images/s_sub/post/36379716-5c26-40d9-9935-e03652e7107e/image.png)
- (교재)
- 주소를 받아서 데이터 메모리를 읽고, 이 데이터를 p-registerdp wjwkdgksek
WB
![](https://velog.velcdn.com/images/s_sub/post/98c62af6-7186-449e-b901-f37d247be8c1/image.png)
- data를 register file에 쓴다
- We need Data and Register Number
- register number는 ID에서부터 pipeline을 통해 계속 가져와야 한다
Corrected Datapath for Load
![](https://velog.velcdn.com/images/s_sub/post/c0dd83b6-dbbf-4aa9-add3-c25de9885fa0/image.png)
STORE
IF, ID, EX는 LOAD와 동일
EX
![](https://velog.velcdn.com/images/s_sub/post/6ca39f57-5a68-4cab-a4e1-54f475f156fe/image.png)
- (교재)
- Load에서와 다르게 두 번째 register값이 다음 p-register에 저장된다.
-> 다음 단계에서 사용된다
MEM
![](https://velog.velcdn.com/images/s_sub/post/291651eb-7b93-49f7-8848-9200a9b1c946/image.png)
WB
![](https://velog.velcdn.com/images/s_sub/post/18e2b7b0-dfed-4c11-b4b1-5f182d2cb25b/image.png)
- store에서는 데이터를 메모리에 쓰고 난 후 할 게 없기 때문에
아무 일도 일어나지 않는다
Multi Cycle Pipeline Diagram
![](https://velog.velcdn.com/images/s_sub/post/bedac727-61f3-4b5e-b201-58c795733daa/image.png)
Single Cycle Pipeline Diagram
![](https://velog.velcdn.com/images/s_sub/post/d2c6094f-9b61-48e0-8cf1-e16726d464b2/image.png)
Pipelined Control
![](https://velog.velcdn.com/images/s_sub/post/b28305f0-231c-4abd-b3e9-43f1e701ce8c/image.png)
- 필요한 control signal들을 pipeline register를 통해 이동한다.
- 소비된 signal은 더이상 다음 stage로 이동하지 않는다
![업로드중..]()
단계별 control signal
IF
- instruction memory를 읽고 PC값을 쓰기 위한 제어신호들은 항상 인가되므로 여기서는 따로 제어할 것이 없다
ID
- 매 clock cycle마다 같은 일이 일어나기 때문에 설정할 제어선이 없다
EX
- RegDst, ALUOp, ALUSrc
- 목적지 register와 ALU 연산을 선택하고,
Read data2와 sign-extension된 수치 중 하나를 ALU의 입력으로 선택한다
MEM
- Branch, MemRead, MemWrite
WB
- MemtoReg, RegWrite
- register file에 ALU 결과를 보낼 것인지 메모리 값을 보낼 것인지 결정하고,
선택된 값을 register에 쓰게 한다