Você está na página 1de 15

18/06/2021

μArquitetura MIPS Multicycle: II


Unidade de Controlo MC
Controlador Principal (FSM)
▪ Entradas e Saídas
▪ Máquina de Estados
❑ Fetch e Decode
❑ Execução de Instruções do tipo lw e sw
Cálculo do endereço de memória
❑ Execução de Instruções do tipo-R
❑ Execução da Instrução beq
Mais Instruções
addi e j
A. Nunes da Cruz / DETI - UA Junho / 2021

Datapath MultiCycle - Unidade de Controlo MC


A Unidade de Controlo MC é constituída por um Controlador Principal e por um
ALU Decoder.
CLK
PCWrite
Branch
PCEn
IorD Control PCSrc
Unit
MemWrite (FSM) ALUControl2:0
IRWrite ALUSrcB1:0
31:26 ALUSrcA
OpCd
5:0 RegWrite
Funct
RegDst

MemToReg

CLK CLK CLK


CLK CLK 0
WE WE3 A 1 Zero CLK
PC' PC Instr 25:21
A1 RD1 SrcA
0 RD 0
ALU

Adr 20:16 B ALUResult


EN A EN A2 RD2 00 1
1
Instr / Data 20:16 4 01 SrcB
0
Memory 15:11 A3 10 ALUOut
CLK 1 Register
WD 11
0 File
Data WD3
1
<<2

SignImm
15:0
Sign Extend

O Controlador Principal é uma máquina síncrona (FSM) do tipo Moore respon-


sável pela geração dos sinais de controlo do datapath multicyle.
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 1/29

1
18/06/2021

Unidade de Controlo MC - Principal + ALU Decoder


1. O Controlador Principal 2. O ALU Decoder
É uma máquina síncrona. É igual ao do Single-cycle.
Control MemToReg ALUOp1:0 Funct5:0 ALUControl2:0
Unit
RegDst
00 X 010 (Add)
IorD Multiplexer
PCSrc Selects 01 X 110 (Subtract)
Main ALUSrcB1:0
Opcode5:0 Controller
10 100000 (add) 010 (Add)
ALUSrcA
(FSM) 10 100010 (sub) 110 (Subtract)
PCWrite
MemWrite 10 100100 (and) 000 (And)
IRWrite Enables
10 100101 (or) 001 (Or)
RegWrite
Branch 10 100110 (xor) 100 (Xor)
ALUOp1:0 10 100111 (nor) 101 (Nor)
10 101010 (slt) 111 (Slt)
Funct5:0 ALU ALUControl2:0
Decoder

© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 2/29

Controlador FSM (1) - Tipos de Sinais


• O Controlador Principal gera 3 tipos de sinais:
Control MemToReg
Unit
RegDst
IorD Multiplexer

• Seleção de Muxes
PCSrc Selects
Main ALUSrcB1:0
Opcode5:0 Controller ALUSrcA
• Enable
(FSM)
PCWrite
MemWrite
IRWrite
RegWrite
Enables
• ALUOp1:0
Branch
ALUOp1:0

Funct5:0 ALU ALUControl2:0


Decoder

• O ALU Decoder gera: ALUControl2:0 .


© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 3/29

2
18/06/2021

Controlador FSM (2) - Estado e Sinais de Controlo


Control
Unit
MemToReg Tipos de sinais dentro de cada estado:
RegDst
IorD Multiplexer 1. Seleção de multiplexers: exibem o respec-
Selects
Main
PCSrc
ALUSrcB1:0
tivo valor binário.
Opcode5:0 Controller
(FSM)
ALUSrcA
2. Enable: só estão indicados quando activos.
PCWrite
MemWrite 3. ALUOp: o valor não aparece explicitado no
IRWrite Enables
RegWrite
datapath, sendo substituído pelo ALUControl
Branch (gerado pelo ALU Decoder).
ALUOp1:0
IorD = 0
Funct5:0 ALU AluSrcA = 0
ALUControl2:0
Decoder ALUSrcB = 01
Exemplo: PCSrc = 0
IRWrite
PCWrite
ALUOp = 00

Sobre os diagramas temporais seguintes:


1. Podem ser ignorados numa primeira leitura.
2. Complementam a explicação sobre o funcionamento da FSM da Unidade de Controlo.
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 4/29

Controlador FSM (3) - Reset e Fetch: S0


Reset
O primeiro passo da execução consiste na leitura da instrução
S0: Fetch cujo endereço está contido no registo PC.
A FSM entra no estado de Fetch após o sinal de Reset.
(O sinal de Reset tb pode estar ligado a alguns registos, e.g., o PC)
CLK
PCWrite 1
Reset 0 PCEn
Branch
IorD Control PCSrc
MemWrite Unit ALUControl2:0
IRWrite ALUSrcB1:0
31:26 ALUSrcA
Op
5:0 RegWrite
Funct
MemtoReg
RegDst

CLK CLK CLK 0


CLK 0 CLK 0
0 SrcA 010
0 WE 25:21 WE3 A Zero CLK 0
PC' PC Instr A1 RD1 1 0
0 RD 01
ALU

Adr 20:16 B ALUResult ALUOut


EN A EN A2 RD2 00 1
1 X
Instr / Data 1 20:16 4 01 SrcB
1 0
Memory 15:11 A3 10
CLK 1 X Register
WD 11
0 File
Data WD3
1
<<2

SignImm
15:0
Sign Extend

© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 5/29

3
18/06/2021

Controlador FSM (4) - Fetch e IncPC (1): S0


S0-1: Fetch: Lê a instrução da Memória com Adr = PC (IorD = 0). S0-1
IorD = 0
IRWrite
➢ A instrução (RD) é escrita no Registo de Instrução activando IRWrite.
IorD MemWrite IRWrite RegDst MemToReg RegWrite ALUSrcA ALUControl2:0 Branch PCWrite

ALUSrcB1:0
PCEn PCSrc
1
010
CLK CLK CLK 0 (add)
CLK CLK 0
0 SrcA 0
0 WE 25:21 WE3 A Zero CLK
PC' PC RD Instr A1 RD1 1 0
0 Adr A 01

ALU
20:16 B ALUResult ALUOut
EN EN A2 RD2 00 1
1 X
Instr / Data 1 20:16 4 01 SrcB
1 0
Memory 15:11 A3 10
CLK 1 X Register
WD 11
0 File
Data WD3
1
<<2

SignImm
15:0
Sign Extend

S0-2: IncPC: Em paralelo com o Fetch, é calculado PC' = PC + 4: S0: Fetch + IncPC
ALUSrcA = 0 => SrcA = PC; ALUSrcB = 01 => SrcB = 4; IorD = 0
IRWrite
ALUOp = 00 => ALUControl = 010 (soma). AluSrcA = 0
ALUSrcB = 01
➢ PC será atualizado com PC', fazendo: ALUOp = 00
PCSrc = 0 => PC' = ALUResult; PCSrc = 0
PCWrite
PCWrite activo => PCEn = 1.
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 6/29

Controlador FSM (5) - Fetch e IncPC (2) - Timing


CLK S0 S1

fetch
PC current=PC PC = PC+4

Mem
data

IR prev. instruction cur. instruction next inst.

decode
RF
outputs

A,B

execute
ALU
result
PC + 4 Write back
ALUout

IRWrite,
PCWrite

O fetch da instrução atual e o cálculo do PC-seguinte são feitos em paralelo.


© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 7/29

4
18/06/2021

Controlador FSM (6) - Decode: S1


S0: Fetch
IorD = 0
S1:
Decode S1-1: O Banco de Registos lê sempre os dois operan-
Reset IRWrite
AluSrcA = 0 dos, especificados pelos campos rs e rt da instrução,
ALUSrcB = 01
ALUOp = 00 e coloca-os nos registos A e B, respetivamente.
PCSrc = 0
PCWrite
S1-2: Em paralelo, o valor imediato é sign-extended.
IorD MemWrite IRWrite RegDst MemToReg RegWrite ALUSrcA ALUControl2:0 PCSrc

ALUSrcB1:0
PCEn

CLK CLK CLK X


CLK CLK
0 SrcA XXX
X WE 25:21 WE3 RD1 A Zero CLK X
PC' PC Adr Instr A1 1 0
0 RD XX

ALU
20:16 B ALUResult ALUOut
EN A EN A2 00 1
1 X RD2
Instr / Data 0 20:16 4 01 SrcB
0 0
Memory 15:11 A3 10
CLK 1 X Register
WD 11
0 File
Data WD3
1
<<2

SignImm
15:0
Sign Extend

A fase de descodificação (UC) usa o opcode da instrução para decidir o que fazer a seguir.
Não são necessários sinais de controlo nesta fase. Todavia, a FSM deve aguardar um ciclo
de clock para que as operações de leitura (RF) e descodificação se completem.
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 8/29

Controlador FSM (7) - Decode (2) - Timing


CLK S0 S1

fetch
PC current=PC PC = PC+4

Mem
data

IR prev. instruction cur. instruction next inst.

decode
RF
outputs

A,B A= (rs); B = (rt)

execute
ALU
result
PC + 4 Write back
ALUout

IRWrite,
PCWrite

A FSM aguarda um ciclo de clock para que as operações de leitura (RF) e descodificação se completem.
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 9/29

5
18/06/2021

Control. FSM (8) - lw/sw - Cálculo do Endereço: S2


S0: Fetch
IorD = 0
S1: Decode
S2: Se a instrução for lw ou sw, é calculado o endereço
Reset AluSrcA = 0 efetivo, adicionando ao Endereço Base (A) o valor
ALUSrcB = 01
ALUOp = 00 imediato depois de sign-extended (SignImm).
PCSrc = 0
IRWrite
PCWrite
Isto requere:
S2: MemAdr
Op = LW
or
ALUSrcA = 1 para selecionar o registo A
Op = SW ALUSrcB = 10 para selecionar SignImm
ALUSrcA = 1 ALUOp = 00 para a ALU somar (ALUControl = 010 ).
ALUSrcB = 10
ALUOp = 00 O endereço é armazenado no registo ALUOut.

ALUSrcB1:0
PCEn IorD MemWrite IRWrite RegDst MemToReg RegWrite ALUSrcA ALUControl2:0 PCSrc

010
CLK CLK CLK 1 (add)
CLK CLK
0 SrcA
X WE 25:21 WE3 A Zero CLK X
PC' PC Adr Instr A1 RD1 1 0
0 RD 10

ALU
20:16 B ALUResult ALUOut
EN A EN A2 RD2 00 1
1 X
Instr / Data 0 20:16 4 01 SrcB
0 0
Memory 15:11 A3 10
CLK 1 X Register
WD 11
0 File
Data WD3
1
<<2

SignImm
15:0
Sign Extend lw rt, imm(rs)

*Após S1 os estados seguintes dependem da instrução. Comecemos com lw/sw.


© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 10/29

Controlador FSM (9) - lw (1): S3 + S4


S0: Fetch
S1: Leitura do valor da memória e escrita no
IorD = 0 Decode
Reset AluSrcA = 0 Banco de Registos:
ALUSrcB = 01
ALUOp = 00
PCSrc = 0
IRWrite
S3: IorD = 1, seleciona o endereço que se
S2:
PCWrite
Op = LW
encontra em ALUOut. O valor lido da
MemAdr or
Op = SW
memória é armazenado no registo Data .
ALUSrcA = 1
ALUSrcB = 10 S4: O valor em Data é escrito no Banco
ALUOp = 00
de Registos.
S3: Op = LW RegDst = 0, seleciona o registo rt;
MemRead
MemToReg = 1, seleciona Data;
IorD = 1 RegWrite: é ativado para escrever no
RF, completando a execução de lw.
S4: Mem
Writeback S0: Regresso ao estado inicial, para o
fetch da instrução seguinte.
RegDst = 0
MemToReg = 1
RegWrite

lw rt,imm(rs)
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 11/29

6
18/06/2021

Controlador FSM (10) - lw (2): S3 + S4


Leitura do valor da memória e escrita no Banco de Registos (rt): S3

S3: IorD = 1, seleciona o endereço (Adr) que se encontra em ALUOut. IorD = 1

O valor lido (RD) é guardado no registo Data .

PCEn IorD MemWrite IRWrite RegDst MemToReg RegWrite ALUSrcA ALUSrcB1:0 ALUControl2:0 PCSrc

CLK CLK CLK X


CLK CLK 1
0 SrcA XXX
1 WE 25:21 WE3 A Zero CLK X
PC' PC RD Instr A1 RD1 1 0
0 Adr B XX

ALU
20:16
EN A EN A2 RD2 00 ALUResult
1 1
0
Instr / Data 0 20:16 4 01 SrcB
0 0
Memory 15:11 A3 10 ALUOut
CLK 1 1 Register
WD 11
0 File
Data WD3
1
<<2

SignImm
15:0
Sign Extend
lw rt,imm(rs)

S4: O valor em Data é escrito no Banco de Registos. S4


RegDst = 0
RegDst = 0 seleciona o registo rt, e MemToReg = 1 seleciona Data. MemToReg = 1
RegWrite
RegWrite é ativado para escrever, completando a execução de lw.

© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 12/29

Controlador FSM (11) - lw (3): Timing - 5 ciclos


CLK S0 S1 S2 S3 S4
fetch
PC PC PC + 4

Mem IR = M( PC )
data PC = PC+4

IR prev. instruction cur. instruction

decode
RF
outputs A = R(Rs), B = R(Rt)

A, B

execute
ALU
Data address
result ALUout =
A + SExt(imm)
ALUout Data address

memory
Mem
data Data = M( ALUout )
MemWriteback
Data Data to Rt
At the rising
PCWrite, IorD edge of CLK:
RegWrite
IRWrite R(Rt) = Data

© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 13/29

7
18/06/2021

Controlador FSM (12) - sw (1): S5 - 4 ciclos


S0: Fetch
S1: O valor do registo B é escrito na memória.
IorD = 0 Decode
Reset AluSrcA = 0
ALUSrcB = 01 S5: IorD = 1 seleciona o endereço guar-
ALUOp = 00
PCSrc = 0 dado em ALUOut (calculado em S2)
IRWrite
PCWrite
Op = LW
MemWrite é ativado para escrever na
S2:
MemAdr or
Op = SW
memória o valor B, completando a
ALUSrcA = 1
execução de sw.
ALUSrcB = 10
ALUOp = 00 (Menos um ciclo que lw!)
Op = SW
Op = LW S5:
S3: MemWrite
MemRead

IorD = 1
IorD = 1
MemWrite

S4: Mem
Writeback

RegDst = 0
MemToReg = 1
RegWrite

sw rt,imm(rs)
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 14/29

Controlador FSM (13) - sw (2): S5


O valor lido do segundo porto do RF (B) é escrito na memória: S5
IorD = 1
S5: IorD = 1 seleciona o endereço guardado em ALUOut (calc. em S2). MemWrite

MemWrite é ativado para escrever na memória o valor B.

PCEn IorD MemWrite IRWrite RegDst MemToReg RegWrite ALUSrcA ALUSrcB1:0 ALUControl2:0 PCSrc

CLK CLK CLK X


CLK 1 CLK
0 SrcA XXX
1 WE 25:21 WE3 A Zero CLK X
PC' PC Instr A1 RD1 1 0
0 RD XX
ALU

Adr 20:16 B ALUResult


EN A EN A2 RD2 00 1
1 X
Instr / Data 0 20:16 4 01 SrcB
0 0 ALUOut
Memory 15:11 A3 10
CLK 1 X Register
WD 11
0 File
Data WD3
1
<<2

SignImm
15:0
Sign Extend
sw rt, imm(rs)

© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 15/29

8
18/06/2021

Controlador FSM (14) - sw (3): Timing - 4 ciclos


CLK S0 S1 S2 S5
fetch
PC PC+4

Mem IR = M(PC)
data PC = PC+4

IR prev. instruction cur. instruction

decode
RF
outputs A = R(Rs), B = R(Rt)

A, B

execute
ALU
Data address
output ALUOut =
A + SExt(imm)
ALUout Data address

memory
Mem
B to M
data
M(ALUout) = R(Rt)
Mem Write
PCWrite,
IRWrite At the rising edge of CLK:
IorD MemWrite M(ALUout) = R(Rt)

© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 16/29

Controlador FSM (15) - tipo-R (1): S6 + S7


S0: Fetch
S1: Calcula o resultado da operação na ALU
IorD = 0 Decode
Reset AluSrcA = 0 e escreve-o no Banco de Registos:
ALUSrcB = 01
ALUOp = 00
PCSrc = 0 S6: São selecionados os registos A e B
IRWrite
PCWrite Op = R-type
(ALUSrcA = 1, ALUSrcB = 00) e calcula-
S2: Op = LW
MemAdr or S6: da a operação indicada pelo campo
Op = SW Execute
Funct da instrução.
ALUSrcA = 1 ALUSrcA = 1
ALUSrcB = 10
ALUOp = 00
ALUSrcB = 00
ALUOp = 10
O valor de ALUOp é igual a 10 para
Op = SW todas instruções do tipo-R.
S3:
MemRead
Op = LW S5:
MemWrite S7: ALU O ALUResult é guardado em ALUOut.
Writeback

IorD = 1
IorD = 1
RegDst = 1
MemToReg = 0
S7: O valor em ALUOut é escrito no
MemWrite
RegWrite Banco de Registos:
RegDst = 1, seleciona o registo rd.
S4: Mem
Writeback MemToReg = 0, o valor WD3 vem do
registo ALUOut.
RegDst = 0
MemToReg = 1 RegWrite é activado para escrever,
RegWrite
completando a execução.
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 17/29

9
18/06/2021

Controlador FSM (16) - tipo-R (2): S6 + S7


Calcula o resultado da operação na ALU e escreve-o no RF: S6
ALUSrcA = 1
S6: Seleciona os registos A e B (ALUSrcA = 1, ALUSrcB = 00); ALUSrcB = 00
ALUOp = 10
O valor de ALUOp é igual a 10 para todas instruções do tipo-R;
Guarda o resultado da operação em ALUOut.
PCEn IorD MemWrite IRWrite RegDst MemToReg RegWrite ALUSrcA ALUSrcB1:0 ALUControl2:0 PCSrc

001
CLK CLK CLK 1
CLK CLK 1 (or)
0 SrcA
X WE 25:21 WE3 A Zero CLK X
PC' PC Adr Instr A1 RD1 1 0
0 RD B 00

ALU
20:16 ALUResult
EN A EN A2 RD2 00 1
1 1
Instr / Data 0 20:16 4 01 SrcB
0 0
Memory 15:11 A3 10 ALUOut
CLK 1 0 Register
WD 11
0 File
Data WD3
1
<<2

SignImm
15:0
Sign Extend
or rd,rs,rt

S7: O valor em ALUOut é escrito no Banco de Registos: S7


RegDst = 1 seleciona o registo destino rd; RegDst = 1
MemToReg = 0
MemToReg = 0 o valor a escrever (WD3) vem do registo ALUOut; RegWrite

RegWrite é activado para escrever no RF.


© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 18/29

Controlador FSM (17) - tipo-R (3): Timing - 4 ciclos


CLK S0 S1 S6 S7

fetch
PC current=PC PC = PC+4
IR = M( PC )
Mem PC = PC+4
data

IR prev. instruction cur. instruction

decode
RF
outputs A = R(Rs), B = R(Rt)

A,B

execute
ALU
result
PC + 4 ALUOut = ( A Op B )
ALUWriteback
ALUout A op B

IRWrite,
PCWrite At the rising edge of CLK:
R(Rd) = ALUout
RegWrite

© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 19/29

10
18/06/2021

Controlador FSM (18) - beq (1): S1 + S8


S0: Fetch S1: O CPU calcula o BTA e com-
IorD = 0 Decode
Reset AluSrcA = 0
para (rs) com (rt); ambas as
ALUSrcB = 01
ALUOp = 00
ALUSrcA = 0
ALUSrcB = 11 Op = Beq S8: Branch
operações requerem a ALU
PCSrc = 0 ALUOp = 00
IRWrite
PCWrite
ALUSrcA = 1 Precisa da ALU duas vezes:
Op = R-type ALUSrcB = 00
S2: Op = LW
S6:
ALUOp = 01 • Uma para calcular o BTA
MemAdr or PCSrc = 1
Op = SW Execute Branch • Outra para decidir se os
ALUSrcA = 1 ALUSrcA = 1 valores de rs e rt são iguais
ALUSrcB = 10 ALUSrcB = 00
ALUOp = 00 ALUOp = 10
Tira partido do facto da ALU
Op = SW
Op = LW S5: estar livre durante o estado
S3: S7: ALU
MemRead
MemWrite
Writeback S1 e usa-a para calcular o BTA
(não há problema se o BTA
RegDst = 1
IorD = 1
IorD = 1
MemWrite
MemToReg = 0 não chegar a ser usado).
RegWrite

S1: Calcula (sempre) BTA


S4: Mem
Writeback S8: Compara o conteúdo dos
registos rs e rt. Caso sejam
RegDst = 0
MemToReg = 1 iguais -> PC' = BTA.
RegWrite
BTA = (PC+4) + (SignImm<<2) beq rs,rt,imm
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 20/29

Controlador FSM (19) - beq (2): S1 + S8


Após S0, a instrução beq usa a ALU mais duas vezes: S1
ALUSrcA = 0
S1: Calcula o endereço-alvo (BTA) e guarda-o em ALUOut (linha azul). ALUSrcB = 11
ALUOp = 00
Este será, eventualmente, usado em S8. BTA = (PC+4) + (SignIm<<2)
ALUSrcB1:0

PCEn IorD MemWrite IRWrite RegDst MemToReg RegWrite ALUSrcA ALUControl2:0 Branch PCWrite PCSrc
1
010(add)
CLK CLK CLK 0 1
CLK CLK SrcA 110(sub)
0
X WE 25:21 WE3 A Zero CLK 1
PC' PC Adr Instr A1 RD1 1
0 RD B 11 00 0
ALU

A
20:16
A2 RD2 00 ALUResult
EN EN 1
1 X SrcB
1 Instr / Data 0 20:16 4 01
0
Memory 15:11 A3 10 ALUOut
CLK 1 X Register
WD 11
0 File
Data WD3
1
<<2

SignImm
15:0
Sign Extend
beq rs,rt,imm

S8: 1. Compara os valores de rs (A) e rt (B). Caso sejam iguais Zero=1. S8


ALUSrcA = 1
Com Branch=1 temos PCEn=1. ALUSrcB = 00
ALUOp = 01
2. Fazendo PCSrc=1, o valor de PC' = BTA (armazenado em ALUOut ). PCSrc = 1
Branch

© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 21/29

11
18/06/2021

Controlador FSM (20) - beq (3): Timing - 3 ciclos


CLK S0 S1 S8

fetch
PC current=PC PC = PC+4 PC' = BTA PC = BTA

Mem IR = M(PC)
data PC = PC+4

IR prev. instruction cur. instruction

decode
RF
outputs
A = R(Rs), B = R(Rt)
A,B

execute
ALU
result
ALUOut = BTA =
PC + 4 PC+4+Simm<<2 A == B? PC+4 + SExt(imm)<<2
ALUout BTA
A ALU é usada nos 3 IRWrite,
ciclos: PCWrite

S0: Calcula PC+4 Branch


At the rising edge of CLK:
S1: Calcula o BTA Zero, PC = BTA
S8: Compara A com B PCEn

© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 22/29

Controlador FSM (21) - Completo


S0: Fetch S1:
IorD = 0 Decode
Reset AluSrcA = 0
ALUSrcB = 01 ALUSrcA = 0
ALUOp = 00 ALUSrcB = 11
PCSrc = 0 ALUOp = 00 Op = Beq S8:
IRWrite Branch
PCWrite
Op = R-type
S2: Op = LW ALUSrcA = 1
MemAdr or S6:
Execute ALUSrcB = 00
Op = SW
ALUOp = 01
ALUSrcA = 1 PCSrc = 1
ALUSrcA = 1
ALUSrcB = 10 ALUSrcB = 00 Branch
ALUOp = 00 ALUOp = 10
Op = SW
Op = LW S5:
S3: MemWrite S7: ALU
MemRead Writeback

RegDst = 1
IorD = 1 IorD = 1
MemToReg = 0
MemWrite
RegWrite

S4: Mem
Writeback

RegDst = 0
MemToReg = 1
RegWrite
O número de ciclos depende da instrução!
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 23/29

12
18/06/2021

Extensão (1) - addi: FSM (1)


P: Como modificar o CPU para suportar addi?
S0: Fetch S1:
IorD = 0 Decode R: O datapath já é capaz de
Reset AluSrcA = 0
ALUSrcB = 01
ALUOp = 00
ALUSrcA = 0
ALUSrcB = 11
adicionar o conteúdo dum
PCSrc = 0
IRWrite
ALUOp = 00 registo com o valor imediato!
PCWrite Op = ADDI
Op = BEQ ➢ Só precisamos de adicionar
Op = LW S9: ADDI
S2: MemAdr or
Op = SW
Op = R-type
S6:
Execute novos estados à FSM do
Execute S8: Branch
ALUSrcA = 1
controlador para addi.
ALUSrcA = 1 ALUSrcA = 1 ALUSrcB = 00 ALUSrcA = 1
ALUSrcB = 10 ALUSrcB = 00 ALUOp = 01 ALUSrcB = 10
ALUOp = 00 ALUOp = 10 PCSrc = 1
Branch
ALUOp = 00 Os estados são semelhantes
Op = SW aos usados pelas instruções
Op = LW S7: ALU S10: ADDI
S3:
S5: MemWrite Writeback Writeback do tipo-R.
MemRead

RegDst = 1 RegDst = 0 S9: Ao registo A é somado


IorD = 1
IorD = 1
MemWrite
MemToReg = 0
RegWrite
MemToReg = 0
RegWrite
SignImm e ALUResult é guar-
dado em ALUOut.
S4: Mem
Writeback
S10: ALUOut é escrito no RF.
RegDst = 0
MemToReg = 1
RegWrite

addi rt,rs,imm
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 24/29

Extensão (2) - addi: FSM (2) - S9 + S10


O CPU calcula o resultado na ALU e escreve-o no Banco de Registos: S9
ALUSrcA = 1
S9: São selecionados o reg. A e SignImm (ALUSrcA = 1, ALUSrcB = 10) e calculada a operação na ALU. ALUSrcB = 10
ALUOp = 00
O valor de ALUOp é igual a 00 para somar. O ALUResult é guardado em ALUOut.
CLK
PCWrite 0
Reset 0 PCEn
Branch
IorD Control PCSrc
MemWrite Unit ALUControl2:0
IRWrite ALUSrcB1:0
31:26 ALUSrcA
Op
5:0 RegWrite
Funct

010
MemToReg
RegDst

CLK CLK CLK 1 (add)


CLK 0 CLK 1
0 SrcA
X WE 25:21 WE3 A Zero CLK X
PC' PC Instr A1 RD1 1 0
0 RD 10
ALU

Adr 20:16 B ALUResult ALUOut


EN A EN A2 RD2 00 1
1 0
Instr / Data 0 20:16 4 01 SrcB
0 0
Memory 15:11 A3 10
CLK 1 0 Register
WD 11
0 File
Data WD3
1
<<2

SignImm
15:0
Sign Extend addi rt,rs,imm

S10
S10: O valor em ALUOut é escrito no Banco de Registos. RegDst = 0 seleciona o registo destino rt. RegDst = 0
MemToReg = 0
MemToReg = 0, significa que o valor a escrever em WD3 vem de ALUOut. RegWrite
RegWrite é activado para escrever no RF, completando a execução da instrução do tipo-I.
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 25/29

13
18/06/2021

Extensão (3) - j: Datapath S11


PCSrc = 10
P: Como modificar o CPU para suportar j? PCWrite

IorD MemWrite IRWrite RegDst MemtoReg RegWrite ALUSrcA ALUControl2:0 Branch PCWrite PCSrc1:0

ALUSrcB1:0
PCEn
1

CLK CLK CLK CLK


CLK
0 SrcA
WE 25:21 WE3 A 31:28 Zero CLK
PC' PC Instr A1 RD1 1 00
0 RD

ALU
Adr 20:16 B ALUResult ALUOut
EN A EN A2 RD2 00 01
1
Instr / Data 0 20:16 4 01 SrcB
1 0 10
Memory 15:11 A3 10 PCJump
CLK 1 Register
WD 11 (JTA)
0 File
Data WD3
1
<<2 27:0
<<2

SignImm
15:0
Sign Extend
25:0 (jump)
JTA = (PC+4)31:28 : (Imm25:0<<2)

R: 1. Modificamos o datapath para calcular o valor PC' no caso da instrução 'j'.


JTA (Jump Target Address) = (PC + 4)31:28 : Imm25:0<<2 ; ( requere mais um "<<2" )
O multiplexer PCSrc aceita uma terceira entrada JTA, selecionada com PCSrc = 10 .
2. Adicionamos um estado (S11) ao controlador FSM para gerar PCSrc = 10 e PCWrite.
(O PCWrite é ativado para forçar PCEn=1).
© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 26/29

Extensão (4) - j: FSM


S1:
S0: Fetch
IorD = 0 Decode
S11: Jump
Reset AluSrcA = 0
ALUSrcB = 01 ALUSrcA = 0
ALUOp = 00 ALUSrcB = 11 Op = J
PCSrc = 00 ALUOp = 00 PCSrc = 10
IRWrite PCWrite
PCWrite
Op = ADDI
Op = BEQ
Op = LW
or Op = R-type
S2: MemAdr Op = SW S6:
Execute S9: ADDI
S8: Branch
Execute
ALUSrcA = 1
ALUSrcA = 1 ALUSrcA = 1 ALUSrcB = 00 ALUSrcA = 1
ALUSrcB = 10 ALUSrcB = 00 ALUOp = 01 ALUSrcB = 10
ALUOp = 00 ALUOp = 10 PCSrc = 01 ALUOp = 00
Branch

Op = SW
Op = LW S7: ALU
S3:
S5: MemWrite
Writeback S10: ADDI
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

Figura 7.42 Controlador FSM com as extensões addi e j


© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 27/29

14
18/06/2021

Revisão (1) - MIPS Single-Cycle

Jump MemToReg
Control
MemWrite
Unit
Branch
PCSrc
ALUControl2:0
31:26
Op ALUSrc
5:0
Funct RegDst
RegWrite

CLK CLK
CLK
0 25:21 WE3 SrcA Zero WE
0 PC' PC Instr A1 RD1 0 Result
1 A RD

ALU
1 ALUResult ReadData
A RD 1
Instruction 20:16
A2 RD2 0 SrcB Data
Memory
A3 1 Memory
Register WriteData
WD3 WD
File
20:16
PCJump 0
15:11
1
WriteReg4:0
PCPlus4
+

SignImm
4 15:0 <<2
Sign Extend PCBranch

+
27:0 31:28

25:0
<<2

© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 28/29

Revisão (2) - MIPS Multicycle


CLK
PCWrite
Branch PCEn
IorD Control PCSrc1:0
MemWrite Unit ALUControl2:0
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 31:28 Zero CLK
PC' PC Instr A1 RD1 1 00
0 RD
ALU

Adr 20:16 B ALUResult ALUOut


EN A EN A2 RD2 00 01
1
Instr / Data 20:16 4 01 SrcB 10
0
Memory 15:11 A3 10
CLK 1 Register
WD 11 PCJump
0 File
Data WD3
1
27:0
<<2
<<2

ImmExt
15:0
Sign Extend
25:0 (Addr)

*O ISA só suporta: lw/sw, tipo-R, beq + addi e j.


© A. Nunes da Cruz IAC - MIPS - Multicycle: Unidade de Controlo 29/29

15

Você também pode gostar