Escolar Documentos
Profissional Documentos
Cultura Documentos
IorD
MemWrite
IRWrite
RegDst
MemtoReg
RegWrite
ALUSrcA
ALUSrcB1:0
ALUControl2:0
PCSrc
SignImm
15:0
Sign Extend
• O CPU multicycle foi concebido por forma a que cada ciclo só envolvesse uma operação
na ALU ou um acesso à memória ou um acesso ao Banco de Registos.
• Admitamos que o acesso ao Banco de Registos é mais rápido do que à Memória e que a
escrita nesta é mais rápida do que a leitura.
• Analisando o datapath podemos identificar dois caminhos críticos que limitam o período
mínimo de clock (TC,Min): a leitura da Memória ou o cálculo na ALU (tipo-R, BTA, etc).
© A. Nunes da Cruz IAC - MIPS - Exercícios Datapath - MC 1/28
1
23/06/2021
2
23/06/2021
3
23/06/2021
4
23/06/2021
5
23/06/2021
ALUSrcA = 1
ALUSrcA = 1 ALUSrcA = 1 ALUSrcB = 00
ALUSrcB = 10 ALUSrcB = 00 ALUOp = 01
ALUOp = 00 ALUOp = 10 PCSrc = 1
Branch
Op = SW
S7: ALU
Op = LW S5: MemWrite
S3: Writeback
MemRead
RegDst = 1
IorD = 1
IorD = 1 MemToReg = 0
MemWrite
RegWrite
S4: Mem
Writeback
RegDst = 0
MemToReg = 1
RegWrite
Figura 7.39 Controlador FSM multicycle completo
( sem jump nem addi )
© A. Nunes da Cruz IAC - MIPS - Exercícios Datapath - MC 10/28
6
23/06/2021
CLK
(rt):= (rs)|imm32 PCWrite
Branch PCEn
IorD Control PCSrc
MemWrite Unit ALUControl2:0
IRWrite ALUSrcB2:0
31:26 ALUSrcA
Op
5:0 RegWrite
Funct
MemToReg
001
RegDst
CLK CLK CLK (or)
CLK CLK
0 SrcA
WE 25:21 WE3 A Zero CLK
PC' PC Instr A1 RD1 1 0
0 RD
ALU
Adr 20:16 B 000 ALUResult ALUOut
EN A EN A2 RD2 1
1 4 001
Instr / Data 20:16
Register 010 SrcB
0
Memory 15:11 A3 File 011
CLK 1
WD 100
0
Data WD3
1
<<2
SignImm
15:0
Sign Extend
15:0
Zero Extend Datapath MC modificado para ori
1. Adiciona-se uma unidade de zero extension O ALU decoder e o controlador FSM tam-
2. O mux ALUSrcB passa de 4 para 5 entradas bém precisam de ser modificados ->...
© A. Nunes da Cruz IAC - MIPS - Exercícios Datapath - MC 12/28
ori é uma instrução do tipo-I, por isso precisamos de criar um novo código ALUOp = 11.
(Recorde-se que para addi não foi necessário porque o código ALUOp = 00 já existia).
No caso das instruções do tipo-R não é necessário dado que para todas ALUOp = 10.
© A. Nunes da Cruz IAC - MIPS - Exercícios Datapath - MC 13/28
7
23/06/2021
Op = LW S5: MemWrite
S7: ALU
S3: Writeback S10: ORI
MemRead Writeback
RegDst = 1 RegDst = 0
IorD = 1
IorD = 1 MemToReg = 0 MemToReg = 0
MemWrite
RegWrite RegWrite
S4: Mem
Writeback
RegDst = 0
MemToReg = 1
RegWrite
FSM modificada para ori
0 rs 0 0 0 8 jr rs
8
23/06/2021
MemToReg
010
RegDst
CLK CLK CLK 1 (add)
CLK CLK
0 SrcA 1
WE 25:21 WE3 A Zero CLK
PC' PC Instr A1 RD1 1
0 RD B=0 00 0
ALU
Adr 20:16
ALUResult
EN A EN A2 RD2 00 1
1
Instr / Data 20:16 4 01 SrcB
0 Register
Memory 15:11 A3 File 10 ALUOut
CLK 1
WD 11
0
Data WD3
1
<<2
SignImm
15:0
Sign Extend
S6 (Exec): S6:
Execute
S9 (JR): S9: JumpReg
Op = LW
Op = BEQ S6: (Instruções do tipo-R)
S2: MemAdr
or
Op = SW
Op = R-type
S8: Branch Deteta-se o código de Fun-
S6:
Execute ção de jr e transita-se para o
ALUSrcA = 1
ALUSrcA = 1 ALUSrcA = 1 ALUSrcB = 00 estado S9.
ALUSrcB = 10 ALUSrcB = 00 ALUOp = 01
ALUOp = 00 ALUOp = 10 PCSrc = 1 S9: Realiza-se a operação
Branch
Op = SW Funct = JR PC': = ALUOut = A, a qual
S9: JumpReg
Op = LW S5: MemWrite
S7: ALU
Funct =
others
precisa dos sinais PCSrc = 1
S3: Writeback
MemRead e PCWrite.
RegDst = 1
IorD = 1 PCSrc = 1
IorD = 1 MemToReg = 0
MemWrite PCWrite
RegWrite
S4: Mem
Writeback
RegDst = 0
MemToReg = 1
RegWrite
9
23/06/2021
10
23/06/2021
ALU
Adr 20:16 B ALUResult ALUOut
EN A EN A2 RD2 00 01
1 20:16
Instr / Data 00 4 01 SrcB 10
1 Memory 15:11
01 A3 10
CLK Register PCJump
WD 31 10 11
00 File
Data WD3
01
10 <<2 27:0
<<2
SignImm
15:0
Sign Extend
$ra (31) := PC + 4 25:0 (jump)
ALUSrcA = 1 ALUSrcA = 1
ALUSrcB = 10 ALUSrcB = 00 S8: Branch
ALUOp = 00 ALUOp = 10 S9: ADDI
Execute
ALUSrcA = 1
Op = SW ALUSrcB = 00 ALUSrcA = 1
ALUOp = 01 ALUSrcB = 10
Op = LW S7: ALU
S5: MemWrite PCSrc = 01 ALUOp = 00
S3: Writeback Branch
MemRead
RegDst = 1
IorD = 1
IorD = 1 MemtoReg = 0 S10: ADDI
MemWrite
RegWrite Writeback
RegDst = 0
MemtoReg = 0
S4: Mem RegWrite
Writeback
RegDst = 0
MemtoReg = 1
RegWrite
11
23/06/2021
CLK
PCWrite
Bne Branch
PCEn
IorD Control PCSrc
MemWrite Unit ALUControl2:0
Bne
IRWrite ALUSrcB1:0
31:26 ALUSrcA
Op
5:0 RegWrite
Funct
MemToReg
RegDst
CLK CLK CLK
CLK CLK
0 SrcA
WE 25:21 WE3 A Zero CLK
PC' PC Instr A1 RD1 1 0
0 RD
ALU
Adr 20:16 B ALUResult ALUOut
EN A EN A2 RD2 00 1
1
Instr / Data 20:16 4 01 SrcB
0 Register
Memory 15:11 A3 File 10
CLK 1
WD 11
0
Data WD3
1
<<2
SignImm
15:0
Sign Extend
BTA = (PC + 4) + ( SignImm<<2 )
1. Adiciona-se uma gate and extra com entradas Bne e not-Zero . 3. Adiciona-se um estado
2. Modifica-se a gate or (PCEn) para ter 3 entradas. extra (S9) à FSM para bne.
© A. Nunes da Cruz IAC - MIPS - Exercícios Datapath - MC 22/28
PCEn
ALUControl2:0
IorD MemWrite IRWrite RegDst MemtoReg RegWrite ALUSrcA ALUSrcB1:0 Branch Bne PCWrite PCSrc1:0
SignImm
15:0
Sign Extend
25:0 (jump)
12
23/06/2021
ALUSrcA = 1
ALUSrcA = 1 ALUSrcA = 1 ALUSrcB = 00
ALUSrcB = 10 ALUSrcB = 00 ALUOp = 01
ALUOp = 00 ALUOp = 10 PCSrc = 01
Branch
Op = SW
Op = LW S5: MemWrite
S7: ALU
S3: Writeback
MemRead
RegDst = 1
IorD = 1
IorD = 1 MemToReg = 0
MemWrite
RegWrite
S4: Mem
Writeback
RegDst = 0
MemToReg = 1
RegWrite
FSM modificada para bne
bne rs,rt,label
© A. Nunes da Cruz IAC - MIPS - Exercícios Datapath - MC 24/28
.text
addi $s0, $0, 5 # result = 5
while: beq $s0, $0, done # while (result > 0) {
addi $s0, $s0, -1 # result = result - 1;
j while # }
done:
13
23/06/2021
.text
addi $s0, $0, 5 # addi = 4 cycles
# beq = 3, addi = 4, j = 3;
# num_cycles: 5 x( 3 + 4 + 3) + 3 = 53
# 5 times through the loop + last 'beq'
while: beq $s0, $0, done # while (result > 0){
addi $s0, $s0, -1 # result = result-1;
j while # }
done:
14
23/06/2021
15