Search
Duplicate

MIPS-Pipeline-Simulation

컴퓨터공학과 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을 통해 전달한다.