📕RISC-V는 5단계의 pipeline으로 진행합니다.( IF, ID , EX , MEM , WB)
📕Pipeline Registers
- 파이프 라이닝을 수행하려면 이전 사이클에서 생성된 이전 정보에서 단계 사이의 레지스터가 필요함.
- 모든 명령은 각 시계 주기 동안 레지스터 간에 진행됩니다.
- 레지스터는 통과하는 라인에 해당하는 모든 데이터를 저장할 수 있을 만큼 충분히 넓어야 합니다.
- 예) IF/ID 레지스터는 64비트 너비여야 합니다(32비트 instruction + 32비트 PC address).
📕Load
📗IF (Instruction Fetch)
- PC의 주소를 사용하여 메모리에서 명령을 읽은 다음 IF/ID 파이프라인 레지스터에 배치함.
- PC의 값은 4씩 증가함.
📗ID
- IF/ID register의 instructions은 immediate field와 register numbers를 제공한다.
- immediate field is sign extended to 32 bits, 두 개의 레지스터 넘버
- 총 3개의 값이 ID/EX registers에 저장됨.
📗EX
- ALU는 ID/EX register로부터 전달받은 register의 값과 immediate 값을 더한다.
- ALU의 결과는 EX/MEM register에 저장된다.
📗MEM
- load instruction은 EX/MEM register로부터 읽어온 address를 사용해서 data memory를 읽는다.
- 데이터는 MEM/WB register에 저장된다.
📗WB
- data는 MEM/WB register로 부터 읽어지고, WB 단계에서 register file에 쓰인다.
- IF/ID 단계에서 register number를 제공받고 , 그 number에 다시 write 함.
Load 단계에서 destination register number가 보전되어야 함.
- write register number는 ID/EX register-> EX/MEM register -> MEM/WB register에 전달된다.
- 위 과정에서 전달된 register number는 WB 단계에서 wrtie 할 register를 정하는 데 사용된다.
📕Store
📗IF / ID / EX
- IF와 ID 단계에서는 로드 단계와 거의 동일하게 진행된다.
- 두 번째 레지스터 값이 EX/MEM register에 로드되어 다음 단계에서 사용됩니다.
📗MEM
- data는 data memory에 write 된다.
- 저장된 데이터를 포함하는 레지스터는 이전 단계에서 read 되고, ID/EX register에 저장된다.
- 데이터는 EX/MEM register에 위치하게 된다.
📗Write Back
- store instruction에서는 WB 단계에서 아무 일도 발생하지 않는다.
📕Control Lines
- IF : Nothing special
- ID : Nothing special
- EX : ALUOP, ALUSrc
- MEM : MemRead, MemWrtie, Branch
- WB : MemtoReg, RegWrite
ID 단계에서 control information을 생성합니다.
초기에는 7가지의 control line이 있지만, 각 단계에 마다 필요한 control line을 가져간다(?)라는 느낌.
EX 단계에서 ALUOP, ALUSrc를 사용하기에 2개가 빠져나가고,
MEM 단계에서 Mem read, MemWrite , Branch를 사용하기에 3개가 빠져나가고,
WB 단계에서 2개가 사용된다.
📕Data Hazards in ALU instructions
모든 instruction이 x2의 실행 결과에 의존하는 것을 알 수 있다.
두 번째 instruction과 세 번째 instruction은 x2 값이 결정되기도 전에 x2를 사용하기에 data hazard가 발생한다.
📕Forward detection
- ID/EX.RegisterRs1 : register number for Rs1 sitting in ID/EX register
- 아래와 같은 경우에 data hazard가 발생했다고 판단한다.
- EX/MEM.RegisterRd= ID/EX.RegisterRs1
- EX/MEM.RegisterRd= ID/EX.RegisterRs2
- MEM/WB.RegisterRd= ID/EX.RegisterRs1
- MEM/WB.RegisterRd= ID/EX.RegisterRs2
- 즉 이번 instruction의 operand와 저번 instruction에 destination을 비교한다.
- 위 조건에 해당된다고 모두 Hazard라고 판단해서는 안됨.
- store 또는 branch처럼 rd에 어떤 값을 write 하는 것이 아니므로 forwarding은 불필요합니다.
- forwarding은 오로지 rd에 어떤 값을 write 할 때만 hazard 여부를 검사해야 한다. (R-type, addi,lw)
- 이러한 정보는 EX/MEM.RegWrite, MEM/WB.ReWrite의 여부를 검사해야 한다.
- --> 위 사실은 Control signal을 확인하면 된다.
📕Forwarding Unit
- Forwarding Unit은 4가지의 입력을 받는다.
- RS1
- RS2
- EX/MEM.RegisterRd
- MEM/WB.RegisterRd
- 위 4가지의 입력을 통해서 Data Hazard를 판단한다.
- output으로 ForwardA와 ForwardB가 있는데, 이 두 값은 각 Mux의 control bit로 들어가게 된다.
- ForwardA와 ForwardB는 2-bit 신호.
- 00이면 ID/EX의 출력 값(register 파일)을 선택.
- 10이면 이전 Cycle의 EX/MEM 출력 값(이전 instruction ALU 결과)을 선택
- 01이면 이전 Cycle의 MEM/WB 출력 값(data memory or 이번 instruction의 ALU결과)
- [사실 두 ALU 결과의 차이를 잘 모르겠음] ㅠ
- MUX X와 Y를 이제 뜯어보자.
- 3갈래의 화살표가 상당히 어지럽게 만들 것이다.
- 하나는 ID/EX로부터 나오는 Read data (00)
- MUX가 이 신호를 선택한다면 ALU는 일반적인 연산을 할 것이다.
- 즉 Forwarding이 불필요하다!
- 두 번째는 이전 Clock의 EX/MEM 출력 값(10)
- Mux가 이 신호를 선택한다면 이전 clock에서 ALU결과가 들어가게 됨.
- Forwarding이 필요하다.
- 세 번째는 이전 Clock의 MEM/WB 출력 값(01)
- Mux가 이 신호를 선택한다면 Forwarding이 발생
📕Load-Use Hazard
- load 명령어를 사용할 때 발생하는 data hazard를 의미한다.
- load 명령어도 register에 write 하는 명령어이기에 data hazard가 발생할 가능성이 있다.
- load와 다음 instruction 사이에서 의존성이 존재한다면 의도적으로 1-cycle을 오른쪽으로 밀어야 한다.
- ALU를 사용하는 R-format instruction은 EX단계에서 필요로 함.
- load 명령어는 memory에서 값을 가져와야만 함으로 MEM stage에서 작업이 끝남.
- 이때의 의존성을 발견하는 역할을 Hazard Dection unit이 맡는다.
Hazard Detection Unit
- ID/EX.MemRead signal과 IF/ID.RegisterRs1, IF/ID.RegisterRs2를 input으로 받아서 의존성 여부를 판단한다.
- ID/EX.MemRead signal이 1 이여야 함.
- IF/ID.RegisterRs1 == ID/EX.RegisterRd
- IF/ID.RegissterRs2 == ID/EX.RegisterRd
- 위 2,3 중 하나라도 만족하면 Hazard가 발생했다는 뜻이다.
- 쉬어주기 위해서 instruction을 NOP로 바꿔준다.
- NOP로 바꿔주기 위해서 필요한 2가지 동작.
- ID/EX에 있는 모든 control signal을 0으로 초기화한다.
- PC값을 업데이트하지 않도록 막아서 의도적으로 stall 시킨다.
📕Control Hazard
- Branch 계열의 명령은 EX stage를 지나야 만 branch의 여부와 target address가 결정된다.
- 계산 결과를 PC에 update 하는 과정까지 총 3-cycle이 소요된다.
- 이 3-cycle 동안 pipeline에 들어온 instruction은 무용지물이다.
- 왜냐하면 branch로 jump 하게 된다면 instruction들이 전혀 필요 없기 때문이다.
- 이러한 사태를 방지하기 위해서 branch를 발견한다면 최대한 빠르게 branch 여부와 address를 계산해야 한다.
- IF/ID와 ID/EX 사이에 target address 계산을 위한 adder와 branch 여부를 판단하기 위한 compartor를 배치했다.
- decoding stage에서 branch에 대한 판단이 되므로, control hazard를 피할 수 있다.
'Computer Science > Computer Architecture' 카테고리의 다른 글
[Computer Architecture]- Cache(1) (2) | 2022.11.26 |
---|---|
[Computer Architecture] - Exploiting Memory Hiearchy(1) (0) | 2022.11.25 |
[Computer Architecture] - processor (2) (0) | 2022.11.12 |
[Computer Architecture] - processor (1) (0) | 2022.10.23 |
[Computer Architecutre] - floating point (0) | 2022.10.20 |