컴퓨터공학과 21411861 신수형
Sequence 1
•
레지스터간 상호 종속성이 없어서 Stall이 발생하지 않는 경우
1) 입력
Index | Input stream | MIPS code |
1 | 100011 00001 00010 0000000000000100 | lw $2, 4($1) |
2 | 000000 00011 00100 00101 00000 100000 | add $5, $3, $4 |
3 | 000000 00110 00111 01000 00000 100010 | sub $8, $6, $7 |
4 | 100011 00000 00010 0000000000001000 | lw $2, 8($0) |
5 | 101011 00100 01001 00000000000001100 | sw $9, 12($4) |
2) 결과
3) 분석
•
CC1
IF/ID | PC가 0일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | lw $2, 4($1) |
ID/EX | ||
EX/MEM | ||
MEM/WB |
•
CC2
IF/ID | PC가 4일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | add $5, $3, $4 |
ID/EX | $1과 $2으로부터 얻어진 값 9, 8과 9의 부호 확장된 값을 ID/EX에 저장
control signal 상위 4자리 : 0 / 00 / 1
→ rd는 write register / I-type / 부호확장된 하위 16비트가 ALU의 두번째 피연산자 | lw $2, 4($1) |
EX/MEM | ||
MEM/WB |
•
CC3
IF/ID | PC가 8일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | sub $8, $6, $7 |
ID/EX | $3과 $4으로부터 얻어진 값 7, 1을 ID/EX에 저장
control signal 상위 4자리 : 1 / 10 / 0
→ rt가 write register/ R-type / ReadData 2가 ALU의 두번째 피연산자 | add $5, $3, $4 |
EX/MEM | ALU의 계산 결과로 9가 EX/MEM에 저장
control signal[4:6] : 0 / 1 / 0
→ 데이터 메모리를 읽어야함 | lw $2, 4($1) |
MEM/WB |
•
CC4
IF/ID | PC가 12일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | lw $2, 8($0) |
ID/EX | $6과 $7으로부터 얻어진 값 3, 4를 ID/EX에 저장
control signal 상위 4자리 : 1 / 10 / 0
→ rt가 write register/ R-type / ReadData 2가 ALU의 두번째 피연산자 | sub $8, $6, $7 |
EX/MEM | ALU의 계산 결과로 8이 EX/MEM에 저장
control signal[4:6] : 0 / 0 / 0
→ 메모리에서 수행할 작업이 없음 | add $5, $3, $4 |
MEM/WB | EX/MEM 파이프라인 레지스터로에서 주소 9를 받아 데이터 메모리를 읽고 그 값인 4를 MEM/WB에 저장
control singal[7:8] : 1 / 1
→ $2에 값이 쓰여야함 / 데이터 메모리의 출력이 write data의 입력이 됨 | lw $2, 4($1) |
•
CC5
IF/ID | PC가 16일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | sw $9, 12($4) |
ID/EX | $0과 $2으로부터 얻어진 값 0, 4과 9의 부호 확장된 값을 ID/EX에 저장
control signal 상위 4자리 : 0 / 00 / 1
→ rd가 write register / I-type / 부호확장된 하위 16비트가 ALU의 두번째 피연산자 | lw $2, 8($0) |
EX/MEM | ALU의 계산 결과로 -1이 EX/MEM에 저장
control signal[4:6] : 0 / 0 / 0
→ 메모리에서 수행할 작업이 없음 | sub $8, $6, $7 |
MEM/WB | write register가 $5이고 계산 결과인 8을 WB 단계에 제공한다.
control singal[7:8] : 1 / 0
→ $5에 값이 쓰여야함/ ALU의 출력이 write data의 입력이 됨 | add $5, $3, $4 |
•
CC6
IF/ID | ||
ID/EX | $4과 $9으로부터 얻어진 값 1, 6과 1의 부호 확장된 값을 ID/EX에 저장
control signal 상위 4자리 : 1 / 00 / 1
→ dont’care / I-type / 부호확장된 하위 16비트가 ALU의 두번째 피연산자 | sw $9, 12($4) |
EX/MEM | ALU의 계산 결과로 8이 EX/MEM에 저장
control signal[4:6] : 0 / 1 / 0
→ 데이터 메모리를 읽어야함 | lw $2, 8($0) |
MEM/WB | write register가 $8이고 계산 결과인 -1을 WB 단계에 제공한다.
control singal[7:8] : 1 / 0
→ $8에 값이 쓰여야함/ ALU의 출력이 write data의 입력이 됨 | sub $8, $6, $7 |
•
CC7
IF/ID | ||
ID/EX | ||
EX/MEM | ALU의 계산 결과로 13이 EX/MEM에 저장
control signal[4:6] : 0 / 0 / 1
→ 데이터 메모리에 써야함 | sw $9, 12($4) |
MEM/WB | EX/MEM 파이프라인 레지스터로에서 주소 8를 받아 데이터 메모리를 읽고 그 값인 4를 MEM/WB에 저장
control singal[7:8] : 1 / 1
→ $2에 값이 쓰여야함 / 데이터 메모리의 출력이 write data의 입력이 됨 | lw $2, 8($0) |
•
CC8
IF/ID | ||
ID/EX | ||
EX/MEM | ||
MEM/WB | EX/MEM 파이프라인 레지스터로에서 주소 13를 받아 데이터 메모리를 읽고 그 값인 0를 MEM/WB에 저장
control singal[7:8] : 0 / 1
→ $2에 값이 쓰여야함 / don’t care | sw $9, 12($4) |
•
CC9
sw는 write-back하지 않음
Shell
복사
Sequence 2
•
레지스터간 종속성으로 인해 Stall이 발생하지만, Data Forwarding으로 Stall이 해소되는 경우
1) 입력
Index | Input stream | MIPS code |
1 | 000000 00001 00011 00010 00000 100000 | add $2, $1, $3 |
2 | 000000 00010 00101 00100 00000 100010 | sub $4, $2, $5 |
3 | 000000 00010 00101 00110 00000 100100 | and $6, $2, $5 |
4 | 100011 01000 00011 00000 00000 001000 | lw $3 8($8) |
5 | 101011 00100 00001 00000 00000 000111 | sw $1 7($4) |
2) 결과
3) 분석
•
CC1
IF/ID | PC가 0일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | add $2, $1, $3 |
ID/EX | ||
EX/MEM | ||
MEM/WB |
•
CC2
IF/ID | PC가 4일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | sub $4, $2, $5 |
ID/EX | $1과 $3으로부터 얻어진 값 9, 7과 9의 부호 확장된 값을 ID/EX에 저장
control signal 상위 4자리 : 1 / 10 / 0
→ rt가 write register/ R-type / ReadData 2가 ALU의 두번째 피연산자 | add $2, $1, $3 |
EX/MEM | ||
MEM/WB |
•
CC3
IF/ID | PC가 8일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | and $6, $2, $5 |
ID/EX | $2과 $5으로부터 얻어진 값 8, 2와 8의 부호 확장된 값을 ID/EX에 저장
control signal 상위 4자리 : 1 / 10 / 0
→ rt가 write register/ R-type / ReadData 2가 ALU의 두번째 피연산자 | sub $4, $2, $5 |
EX/MEM | ALU의 계산 결과로 16이 EX/MEM에 저장
control signal[4:6] : 0 / 0 / 0
→ 메모리에서 수행할 작업이 없음 | add $2, $1, $3 |
MEM/WB |
•
CC4
IF/ID | PC가 12일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | lw $3 8($8) |
ID/EX | $2과 $5으로부터 얻어진 값 8, 2를 ID/EX에 저장
control signal 상위 4자리 : 1 / 10 / 0
→ rt가 write register/ R-type / ReadData 2가 ALU의 두번째 피연산자 | and $6, $2, $5 |
EX/MEM | forwardB = 10을 통해 $2의 결과값 16이 ALU의 두번째 연산자로 전방전달되어
ALU의 계산 결과로 14가 EX/MEM에 저장
control signal[4:6] : 0 / 0 / 0
→ 메모리에서 수행할 작업이 없음 | sub $4, $2, $5 |
MEM/WB | write register가 $2이고 계산 결과인 16을 WB 단계에 제공한다.
control singal[7:8] : 1 / 0
→ $2에 값이 쓰여야함/ ALU의 출력이 write data의 입력이 됨 | add $2, $1, $3 |
•
CC5
IF/ID | PC가 16일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | sw $1 7($4) |
ID/EX | $8과 $3으로부터 얻어진 값 5, 7과 5의 부호 확장된 값을 ID/EX에 저장
control signal 상위 4자리 : 0 / 00 / 1
→ rd는 write register / I-type / 부호확장된 하위 16비트가 ALU의 두번째 피연산자 | lw $3 8($8) |
EX/MEM | forwarA = 01을 통해 $2의 결과값 16이 ALU의 두번째 연산자로 전방전달되어
ALU의 계산 결과로 0이 EX/MEM에 저장
control signal[4:6] : 0 / 0 / 0
→ 메모리에서 수행할 작업이 없음 | and $6, $2, $5 |
MEM/WB | write register이 $4이고 계산 결과인 14를 WB 단계에 제공한다.
control singal[7:8] : 1 / 0
→ 52에 값이 쓰여야함/ ALU의 출력이 write data의 입력이 됨 | sub $4, $2, $5 |
•
CC6
IF/ID | ||
ID/EX | $4과 $1으로부터 얻어진 값 9, 14과 9의 부호 확장된 값을 ID/EX에 저장
control signal 상위 4자리 : 1 / 00 / 1
→ dont’care / I-type / 부호확장된 하위 16비트가 ALU의 두번째 피연산자 | sw $1 7($4) |
EX/MEM | ALU의 계산 결과로 13이 EX/MEM에 저장
control signal[4:6] : 0 / 1 / 0
→ 데이터 메모리를 읽어야함 | lw $3 8($8) |
MEM/WB | write register가 $6이고 계산 결과인 0을 WB 단계에 제공한다.
control singal[7:8] : 1 / 0
→ $6에 값이 쓰여야함/ ALU의 출력이 write data의 입력이 됨 | and $6, $2, $5 |
•
CC7
IF/ID | ||
ID/EX | ||
EX/MEM | ALU의 계산 결과로 21이 EX/MEM에 저장
control signal[4:6] : 0 / 0 / 1
→ 데이터 메모리에 써야함 | sw $1 7($4) |
MEM/WB | EX/MEM 파이프라인 레지스터로에서 주소 13를 받아 데이터 메모리를 읽고 그 값인 8를 MEM/WB에 저장
control singal[7:8] : 1 / 1
→ $3에 값이 쓰여야함 / 데이터 메모리의 출력이 write data의 입력이 됨 | lw $3 8($8) |
•
CC8
IF/ID | ||
ID/EX | ||
EX/MEM | ||
MEM/WB | EX/MEM 파이프라인 레지스터로에서 주소 21를 받아 데이터 메모리를 읽고 그 값인 0를 MEM/WB에 저장
control singal[7:8] : 0 / 1
→ $1에 값이 쓰여야함 / don’t care | sw $1 7($4) |
•
CC9
sw는 write-back하지 않음
Shell
복사
1 : add $2, $1, $3
2 : sub $4, $2, $5
add는 EX/MEM단계에서 Forwarding이 가능하다.
sub는 $2를 EX단계에서 사용하려고 한다.
따라서 add 명령어와 sub 명령어 사이의 종속성은 Forward이다.
EX Forwarding이 활용된다.
Sequence 3
•
레지스터간 종속성으로 인해 Stall이 발생하고, Data Forwarding을 통해서도 Stall이 일부 잔류하는 경우
1) 입력
Index | Input stream | MIPS code |
1 | 100011 00010 00001 00000 00000 000010 | lw $1, 4($2) |
2 | 000000 00010 00001 00110 00000 100010 | sub $6, $2, $1 |
3 | 000000 00001 00011 00111 00000 100000 | add $7, $1, $3 |
4 | 001000 00010 01000 00000 00000 000100 | addi $8, $2, 4 |
5 | 000000 00011 01001 00101 00000 100101 | or $5, $3, $9 |
2) 결과
3) 분석
•
CC1
IF/ID | PC가 0일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | lw $1, 4($2) |
ID/EX | ||
EX/MEM | ||
MEM/WB |
•
CC2
IF/ID | PC가 4일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | sub $6, $2, $1 |
ID/EX | $2과 $1으로부터 얻어진 값 8, 9과 8의 부호 확장된 값을 ID/EX에 저장
control signal 상위 4자리 : 0 / 00 / 1
→ rd는 write register / I-type / 부호확장된 하위 16비트가 ALU의 두번째 피연산자 | lw $1, 4($2) |
EX/MEM | ||
MEM/WB |
•
CC3
IF/ID | Noop | |
ID/EX | 사이클 지연 | sub $6, $2, $1 |
EX/MEM | ALU의 계산 결과로 10이 EX/MEM에 저장
control signal[4:6] : 0 / 1 / 0
→ 데이터 메모리를 읽어야함 | lw $1, 4($2) |
MEM/WB |
•
CC4
IF/ID | PC가 8일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | add $7, $1, $3 |
ID/EX | forwarA = 01을 통해 $1의 결과값 4이 ALU의 두번째 연산자로 전방전달되어
$2과 $1으로부터 얻어진 값 8, 4를 ID/EX에 저장
control signal 상위 4자리 : 1 / 10 / 0
→ rt가 write register/ R-type / ReadData 2가 ALU의 두번째 피연산자 | sub $6, $2, $1 |
EX/MEM | ||
MEM/WB | EX/MEM 파이프라인 레지스터로에서 주소 10를 받아 데이터 메모리를 읽고 그 값인 4를 MEM/WB에 저장
control singal[7:8] : 1 / 1
→ $3에 값이 쓰여야함 / 데이터 메모리의 출력이 write data의 입력이 됨 | lw $1, 4($2) |
•
CC5
IF/ID | PC가 12일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | addi $8, $2, 4 |
ID/EX | $1과 $3으로부터 얻어진 값 4, 7를 ID/EX에 저장
control signal 상위 4자리 : 1 / 10 / 0
→ rt가 write register/ R-type / ReadData 2가 ALU의 두번째 피연산자 | add $7, $1, $3 |
EX/MEM | forwarB = 10을 통해 $1의 결과값 4가 ALU의 두번째 연산자로 전방전달되어
ALU의 계산 결과로 4가 EX/MEM에 저장
control signal[4:6] : 0 / 0 / 0
→ 메모리에서 수행할 작업이 없음 | sub $6, $2, $1 |
MEM/WB |
•
CC6
IF/ID | PC가 16일때 메모리에서 명령어를 읽어오고 PC 주소를 4만큼 증가하여 다시 PC에 저장하고 두 값을 IF/ID 파이프라인 레지스터에 저장 | or $5, $3, $9 |
ID/EX | $2과 $8으로부터 얻어진 값 8, 5과 8의 부호 확장된 값을 ID/EX에 저장
control signal 상위 4자리 : 0 / 00 / 1
→ rd는 write register / I-type / 부호확장된 하위 16비트가 ALU의 두번째 피연산자 | addi $8, $2, 4 |
EX/MEM | ALU의 계산 결과로 11이 EX/MEM에 저장
control signal[4:6] : 0 / 0 / 0
→ 메모리에서 수행할 작업이 없음 | add $7, $1, $3 |
MEM/WB | write register가 $6이고 계산 결과인 4을 WB 단계에 제공한다.
control singal[7:8] : 1 / 0
→ $6에 값이 쓰여야함/ ALU의 출력이 write data의 입력이 됨 | sub $6, $2, $1 |
•
CC7
IF/ID | ||
ID/EX | $3과 $9으로부터 얻어진 값 7, 6를 ID/EX에 저장
control signal 상위 4자리 : 1 / 10 / 0
→ rt가 write register/ R-type / ReadData 2가 ALU의 두번째 피연산자 | or $5, $3, $9 |
EX/MEM | ALU의 계산 결과로 12가 EX/MEM에 저장
control signal[4:6] : 0 / 0 / 0
→ 메모리에서 수행할 작업이 없음 | addi $8, $2, 4 |
MEM/WB | write register가 $7이고 계산 결과인 11을 WB 단계에 제공한다.
control singal[7:8] : 1 / 0
→ $7에 값이 쓰여야함/ ALU의 출력이 write data의 입력이 됨 | add $7, $1, $3 |
•
CC8
IF/ID | ||
ID/EX | ||
EX/MEM | ALU의 계산 결과로 7이 EX/MEM에 저장
control signal[4:6] : 0 / 0 / 0
→ 메모리에서 수행할 작업이 없음 | or $5, $3, $9 |
MEM/WB | write register가 $8이고 계산 결과인 12를 WB 단계에 제공한다.
control singal[7:8] : 1 / 0
→ $8에 값이 쓰여야함/ ALU의 출력이 write data의 입력이 됨 | addi $8, $2, 4 |
•
CC9
IF/ID | ||
ID/EX | ||
EX/MEM | ||
MEM/WB | write register가 $5이고 계산 결과인 7을 WB 단계에 제공한다.
control singal[7:8] : 1 / 0
→ $5에 값이 쓰여야함/ ALU의 출력이 write data의 입력이 됨 | or $5, $3, $9 |
•
CC10
$5에 7저장
Plain Text
복사
1 : lw $1, 4($2)
2 : sub $6, $2, $1
lw는 mem/wb단계 이후에 forwading이 가능하다.
sub는 $1레지스터를 ex단계에서 사용하고있다
따라서 lw 명령어와 sub 명령어 사이의 종속성은 backward이다.
그러므로 CC4에서 and 명령어를 noop으로 바꾸어 한 사이클을 stall해야한다.
이후 lw가 mem/wb를 진행하고 나서 MEM Forwarding을 통해 전달한다.