data memory

Transkrypt

data memory
Prosty procesor dla framgentu listy
rozkazów MIPSa
(rysunki pochodza˛ z ksiażki
˛ Hennessy’ego i Pattersona)
– p. 1/33
Wst˛ep
Naszym celem bedzie
˛
zaprojektowanie prostego procesora
realizujacego
˛
fragment listy rozkazów MIPS:
rozkazy komunikacji z pamieci
˛ a:
˛ lw, sw
rozkazy arytmetyczno-logiczne: add, sub, and, or, slt
skoki beq, j
Obejrzymy trzy rozwiazania:
˛
Implementacja jednocyklowa
Implementacja wielocyklowa
Przetwarzanie potokowe
– p. 2/33
Implementacja jednocyklowa – wst˛ep
Wykonanie każdego z naszych rozkazów zaczyna sie˛ tak samo:
Wysłanie licznika rozkazów (PC) do jednostki pamieci
˛ i
odczytanie stamtad
˛ odpowiedniego rozkazu.
Odczytanie wartości jednego lub dwóch rejestrów
(specyfikowanych przez pieciobitowe
˛
pola rozkazu)
Dalsze czynności zależa˛ od rozkazu, chociaż sa˛ one podobne,
szczególnie dla rozkazów z jednej grupy. Każdy rozkaz (oprócz j)
użyje np. ALU.
W naszej pierwszej implementacji wykonanie każdego rozkazu
bedzie
˛
zajmowało jeden cykl zegarowy.
Zapis (do pamieci
˛ lub do rejestrów) nastepuje
˛
raz w całym cyklu
(na zboczu opadajacym).
˛
Odczyt jest możliwy w każdym momencie.
– p. 3/33
Ogólny schemat połaczeń
˛
4
Add
Add
Data
PC
Address Instruction
Instruction
memory
Register #
Registers
Register #
ALU
Address
Data
memory
Register #
Data
– p. 4/33
Pobranie rozkazu
Zakładamy, że mamy dwie jednostki pamieci:
˛ osobna˛ dla rozkazów
(instruction memory) oraz dla danych (data memory).
Add
4
PC
Read
address
Instruction
Instruction
memory
– p. 5/33
Rejestry i ALU
5
Register
numbers
5
5
Data
Read
register 1
4
Read
data 1
Read
register 2
Write
register
ALU operation
Zero
Data
Registers
ALU ALU
result
Read
data 2
Write
Data
RegWrite
a. Registers
b. ALU
– p. 6/33
Pami˛eć danych i rozszerzanie danych
MemWrite
Address
Read
data
16
Write
data
Data
memory
Sign
extend
32
MemRead
a. Data memory unit
b. Sign-extension unit
– p. 7/33
Skok warunkowy
Wykonanie rozkazu skoku warunkowego polega na:
Odczytaniu dwóch rejestrów
Porównaniu ich przez ALU (operacja˛ odejmowania)
Przekształceniu stałej: rozszerzenie stałej 16-bitowej do
32-bitowej i przesuniecie
˛
o dwa bity w lewo
Dodaniu stałej do PC+4
– p. 8/33
Skok warunkowy
PC+4 from instruction datapath
Add Sum
Branch
target
Shift
left 2
Instruction
Read
register 1
Read
data 1
Read
register 2
Write
register
4
ALU operation
ALU Zero
Registers
To branch
control logic
Read
data 2
Write
data
RegWrite
16
Sign
extend
32
– p. 9/33
Uwaga o opóźnionych skokach
MIPS realizuje tzw. opóźnione skoki (delayed branches) – rozkaz
znajdujacy
˛ sie˛ w pamieci
˛ bezpośrednio za rozkazem skoku wykonuje
sie˛ niezależnie od tego, czy skok nastepuje,
˛
czy nie.
Nie implementujemy tego rozwiazania.
˛
Podobnie zreszta˛ jak SPIM
(chociaż tam można je wymusić, uruchamiajac
˛ program z
odpowiednim parametrem).
– p. 10/33
Układ dla rozkazów arytm.-log. oraz lw, sw
Read
register 1
Instruction
4
Read
data 1
Read
register 2
Registers Read
Write
data 2
register
MemWrite
ALUSrc
0
M
u
x
1
Write
data
MemtoReg
Zero
ALU ALU
result
Address
Write
data
RegWrite
16
ALU operation
Sign
extend
32
Read
data
1
M
u
x
0
Data
memory
MemRead
– p. 11/33
PCSrc
M
u
x
Add
Add
4
ALU
result
Shift
left 2
PC
Read
address
Instruction
Instruction
memory
Read
register 1
ALUSrc
Read
data 1
ALU operation
MemWrite
Read
register 2
Registers Read
Write
data 2
register
MemtoReg
Zero
M
u
x
Write
data
ALU ALU
result
Address
Write
data
RegWrite
16
4
Sign
extend
32
Read
data
M
u
x
Data
memory
MemRead
– p. 12/33
Formaty rozkazów – przypomnienie
Typ R:
6 bitów – kod operacji (bity 31:26)
5 bitów – numer rejestru źródłowego 1, rs (bity 25:21)
5 bitów – numer rejestru źródłowego 2, rt (bity 20:16)
5 bitów – numer rejestru wynikowego, rd (bity 15:11)
5 bitów – shamt (my je ignorujemy)
6 bitów – rodzaj operacji, funkcja (bity 5:0)
Typ I, lw, sw:
6 bitów – kod operacji (bity 31:26)
5 bitów – numer rejestru bazowego adresu (bity 25:21)
5 bitów – numer rejestru (źródłowego dla sw, wynikowego dla lw (bity
20:16)
16 bitów – stała (bity 15:0)
Typ I, beq: jak wyżej, oba numery rejestów to rejestry źródłowe do
porównania.
– p. 13/33
PCSrc
0
M
u
x
Add
Add
4
Instruction [25:21]
PC
Read
register 1
Instruction [20:16]
Instruction
[31:0]
Instruction
memory
Instruction [15:11]
0
M
u
x
1
RegDst
Instruction [15:0]
Read
register 2
Write
register
Write
data
16
1
Shift
left 2
RegWrite
Read
address
ALU
result
MemWrite
Read
data 1
ALUSrc
Read
data 2
0
M
u
x
1
Registers
Sign
extend
MemtoReg
Zero
ALU ALU
result
Address
Read
data
1
M
u
x
0
Data
Write memory
data
32
ALU
control
MemRead
Instruction [5:0]
ALUOp
– p. 14/33
Sterowanie
Na podstawie bitów 31:26 (kod operacji) generowane sa˛
odpowiednie sygnały sterujace
˛ (prosty układ kombinacyjny)
Sygnał ALUOp jest dwubitowy: 00 – lw lub sw (dodawaj), 01 - beq
(odejmuj), 10 - typu R
Rodzaj operacji dla ALU przy kodzie 10 dospecyfikowywany
przez bity funkcyjne 5:0
– p. 15/33
Pełny układ (ale jeszcze bez skoku j)
0
M
u
x
Add
Add
4
Control
Instruction [25–21]
PC
Read
address
Instruction [20–16]
Instruction
[31–0]
Instruction
memory
0
M
u
Instruction [15–11] x
1
Read
register 1
Read
register 2
Write
register
Write
data
Instruction [15–0]
16
1
Shift
left 2
RegDst
Branch
MemRead
MemtoReg
ALUOp
MemWrite
ALUSrc
RegWrite
Instruction [31–26]
ALU
result
Read
data 1
Zero
Read
data 2
Registers
Sign
extend
0
M
u
x
1
ALU ALU
result
Address
Read
data
1
M
u
x
0
Data
Write memory
data
32
ALU
control
Instruction [5–0]
– p. 16/33
add $t0, $t1, $t2
0
M
u
x
Add
Add
4
Control
Instruction [25–21]
PC
Read
address
Instruction [20–16]
Instruction
[31–0]
Instruction
memory
0
M
u
Instruction [15–11] x
1
Read
register 1
Read
register 2
Write
register
Write
data
Instruction [15–0]
16
1
Shift
left 2
RegDst
Branch
MemRead
MemtoReg
ALUOp
MemWrite
ALUSrc
RegWrite
Instruction [31–26]
ALU
result
Read
data 1
Zero
Read
data 2
Registers
Sign
extend
0
M
u
x
1
ALU ALU
result
Address
Read
data
1
M
u
x
0
Data
Write memory
data
32
ALU
control
Instruction [5–0]
– p. 17/33
lw $t0, 8($t2)
0
M
u
x
Add
Add
4
Control
Instruction [25–21]
PC
Read
address
Instruction [20–16]
Instruction
[31–0]
Instruction
memory
0
M
u
Instruction [15–11] x
1
Read
register 1
Read
register 2
Write
register
Write
data
Instruction [15–0]
16
1
Shift
left 2
RegDst
Branch
MemRead
MemtoReg
ALUOp
MemWrite
ALUSrc
RegWrite
Instruction [31–26]
ALU
result
Read
data 1
Zero
Read
data 2
Registers
Sign
extend
0
M
u
x
1
ALU ALU
result
Address
Read
data
1
M
u
x
0
Data
Write memory
data
32
ALU
control
Instruction [5–0]
– p. 18/33
beq $t0, $t1, 8
0
M
u
x
Add
Add
4
Control
Instruction [25–21]
PC
Read
address
Instruction [20–16]
Instruction
[31–0]
Instruction
memory
0
M
u
Instruction [15–11] x
1
Read
register 1
Read
register 2
Write
register
Write
data
Instruction [15–0]
16
1
Shift
left 2
RegDst
Branch
MemRead
MemtoReg
ALUOp
MemWrite
ALUSrc
RegWrite
Instruction [31–26]
ALU
result
Read
data 1
Zero
Read
data 2
Registers
Sign
extend
0
M
u
x
1
ALU ALU
result
Address
Read
data
1
M
u
x
0
Data
Write memory
data
32
ALU
control
Instruction [5–0]
– p. 19/33
Dodajemy skok bezwarunkowy
Instruction [25–0]
26
Shift
left 2
Jump address [31–0]
28
PC + 4 [31–28]
Add
Add
4
Control
Instruction [25–21]
PC
Read
address
Instruction [20–16]
Instruction
[31–0]
Instruction
memory
0
M
u
Instruction [15–11] x
1
Read
register 1
Read
register 2
Write
register
Write
data
Instruction [15–0]
16
1
M
u
x
M
u
x
1
0
Shift
left 2
RegDst
Jump
Branch
MemRead
MemtoReg
ALUOp
MemWrite
ALUSrc
RegWrite
Instruction [31–26]
ALU
result
0
Read
data 1
Zero
Read
data 2
Registers
Sign
extend
0
M
u
x
1
ALU ALU
result
Address
Read
data
1
M
u
x
0
Data
Write memory
data
32
ALU
control
Instruction [5–0]
– p. 20/33
Wady i zalety implementacji jednocyklowej
Przedstawiona implementacja nie jest używana w praktyce
Konieczność duplikacji sprz˛etu – dodatkowe sumatory
Cykl zegarowy dopasowany do najwolniejszego rozkazu (operacje
na pamieci)
˛
Zaleta: prostota
Inne rozwiazania:
˛
zmienna długość cyklu – skomplikowane
technicznie, implementacja wielocyklowa – o tym za chwile,
˛
przetwarzanie potokowe – o tym za tydzień, ...
– p. 21/33
Wady i zalety implementacji jednocyklowej
Przykładowe czasy działania naszych podukładów i wykonywania
rozkazów:
IMem 200 ps, RegRead 100, ALU 200, DMem 200, RegWrite 100
Rozkaz typu R: 200 + 100 + 200 + 0 + 100 = 600
lw: 200 + 100 + 200 + 200 + 100 = 800
sw: 200 + 100 + 200 + 200 + 0 = 700
Skok warunkowy: 200 + 100 + 200 + 0 + 0 = 500
Skok bezwarunkowy: 200 + 100 + 0 + 0 + 0 = 300
Potrzebujemy zatem cyklu długości 800 ps.
Rozważmy nastepuj
˛ acy
˛ zestaw rozkazów: 25% odczytów pamieci,
˛
10% zapisów, 45% rozkazów typu R, 15% skoków warunkowych,
5% skoków bezwarunkowych
Średni czas wykonania instrukcji:
0, 25 · 800 + 0, 10 · 700 + 0, 45 · 600 + 0, 15 · 500 + 0, 05 · 300 = 630 ps.
– p. 22/33
Implementacja wielocyklowa
Krótszy cykl zegarowy
rozkazy dzielone na fazy (kroki), każda faza – jeden cykl.
Rozkazy moga˛ mieć różne liczby faz.
Jedna ALU (bez żadnych dodatkowych sumatorów).
Wspólna pamieć
˛ programu i danych.
Kilka dodatkowych rejestrów przechowujacych
˛
dane potrzebne w
kolejnych fazach
PC
Address
Instruction
register
A
Register #
Registers
Register #
Instruction
Memory or data
Data
Data
Memory
data
register
ALU
ALUOut
B
Register #
– p. 23/33
Implementacja wielocyklowa – cd.
Każdy z rejestrów MDR, A, B, ALUOut przechowuje dane z fazy k
dla fazy k + 1
Rejestr IR przechowuje rozkaz przez wszystkie fazy jego
wykonania.
Dlatego tylko IR potrzebuje sygnału zezwolenia na zapis.
Niektóre układy bed
˛ a˛ używane wiecej
˛
niż raz na rozkaz, dlatego
musimy dodać kilka multiplekserów (i rozszerzyć wcześniejsze) –
np.:
mamy teraz dwa źródła adresów dla pamieci
˛
ALU wylicza adresy skoków
– p. 24/33
Implementacja wielocyklowa (bez skoków j)
PC
0
M
u
x
1
Address
Memory
MemData
Write
data
Instruction
[25–21]
Read
register 1
Instruction
[20–16]
Read
register 2
Registers
Write
Read
register
data 2
Instruction
[15–0]
Instruction
register
Instruction
[15–0]
Memory
data
register
0
M
Instruction u
x
[15–11]
1
Read
data 1
A
Zero
ALU ALU
result
B
4
Write
data
0
M
u
x
1
0
M
u
x
1
ALUOut
0
1M
u
2 x
3
16
Sign
extend
32
Shift
left 2
– p. 25/33
Pełna implementacja wielocyklowa
PCSource
PCWriteCond
PCWrite
ALUOp
Outputs
IorD
MemRead
ALUSrcB
Control
ALUSrcA
MemWrite
MemtoReg
Op
[5–0]
RegWrite
IRWrite
0
RegDst
26
Instruction [25-0]
PC
0
M
u
x
1
Instruction
[31–26]
Address
Memory
MemData
Write
data
Instruction
[25–21]
Read
register 1
Instruction
[20–16]
Read
register 2
Registers
Write
Read
register
data 2
Instruction
[15–0]
Instruction
register
Instruction
[15–0]
Memory
data
register
0
M
Instruction u
x
[15–11]
1
Read
data 1
A
16
Sign
extend
B
4
32
28
Shift
left 2
M
1 u
x
2
PC [31–28]
Zero
ALU ALU
result
Write
data
0
M
u
x
1
0
M
u
x
1
Shift
left 2
Jump
address
[31–0]
ALUOut
0
1M
u
2 x
3
ALU
control
Instruction [5–0]
– p. 26/33
F1 - Pobranie rozkazu
IR <= Memory[PC]
PC <= PC + 4
Powyższe operacje moga˛ wykonywać sie˛ równolegle. Sygnały
sterujace:
˛
MemRead - 1
IRWrite - 1
IorD - 0
ALUSrcA - 0 (PC)
ALUSrcB - 01 (stała 4)
ALUOp – 00 (dodawanie)
PCSource – 0
PCWrite – 1
– p. 27/33
F2 - Dekodowanie oraz odczytu rejestrów
A <= Reg[IR[25:21]]
B <= Reg[IR[20:16]]
ALUOut <= PC + (sign-extend (IR[15-0] « 2)
Powyższe operacje wykonujemy przy każdej instrukcji - niezależnie od
kodu operacji. Zauważmy, że nawet jeśli konkretna instrukcja tego nie
wymaga, to wykonane operacje w niczym nie zaszkodza.
˛ Sygnały
sterujace:
˛
ALUSrcA - 0 (PC)
ALUSrcB - 11 (przesunieta
˛ i rozszerzona stała z rozkazu)
ALUOp - 00 (dodawanie)
– p. 28/33
F3 - Wykonanie, obliczenie adresu lub skok
Pierwszy cykl, który zależy od kodu operacji. ALU wykonuje jedna˛ z
czterech możliwych akcji (na danych przygotowanych w poprzednich
cyklach):
Obliczenie adresu: ALUOut <= A + sign-extend
(IR[15:0])
ALUSrcA - 1, ALUSrcB - 10, ALUOp - 00 (dodawanie)
Operacja arytmetyczno-logiczna (typu R): ALUOut <= A op B
ALUSrcA - 1, ALUSrcB - 00, ALUOp - 10 (decyduje pole funk.)
Skok warunkowy: if (A==B) PC <=ALUOut
ALUSrcA - 1, ALUSrcB - 00, ALUOp - 01 (odejmowanie),
PCWriteCond - 1, PCSource - 01
Skok: PC <= konkatenacja(PC[31:28], IR[25:0], 00)
PCWrite - 1, PCSource - 10
– p. 29/33
F4 - Dost˛ep do pami˛eci lub dokończenie Rrozkazu
Dostep
˛ do pamieci:
˛ MDR <= Memory [ALUOut] lub Memory
[ALUOut] <= B
MemRead lub MemWrite - 1, IorD - 1
Dokończenie rozkazu arytmetyczno-logicznego:
Reg[IR[15-11]] <= ALUout
RegDst - 1, RegWrite - 1, MemtoReg - 0,
– p. 30/33
F5 - Dokończenie odczytu pami˛eci
Reg[IR[20-16]] <= MDR
RegDst - 0, RegWrite - 1, MemtoReg - 1,
– p. 31/33
Jednosta sterujaca
˛
Tym razem jednostaka sterujaca
˛ bedzie
˛
układem sekwencyjnym,
dokładniej automatem Moore’a. Wejście – kod operacji, stany to fazy,
wyjścia – sygnały sterujace.
˛
Instruction fetch
Instruction decode/
Register fetch
MemRead
ALUSrcA = 0
IorD = 0
IRWrite
ALUSrcB = 01
ALUOp = 00
PCWrite
PCSource = 00
0
Start
1
ALUSrcA = 0
ALUSrcB = 11
ALUOp = 00
')
Memory-reference FSM
(Figure 5.33)
R-type FSM
(Figure 5.34)
Q'
)
(O
p
=
R
'BE
'LW
Branch FSM
(Figure 5.35)
(Op = 'J')
(
e)
p
-ty
p=
=
Op
p
(O
(O
r
') o
SW
='
Jump FSM
(Figure 5.36)
– p. 32/33
Instruction fetch
Instruction decode/
register fetch
MemRead
ALUSrcA = 0
IorD = 0
IRWrite
ALUSrcB = 01
ALUOp = 00
PCWrite
PCSource = 00
0
Start
1
ALUSrcA = 0
ALUSrcB = 11
ALUOp = 00
')
SW
ALUSrcA = 1
ALUSrcB = 10
ALUOp = 00
= 'B
(Op
p
(O
6
8
ALUSrcA = 1
ALUSrcB = 00
ALUOp = 10
Jump
completion
9
ALUSrcA = 1
ALUSrcB = 00
ALUOp = 01
PCWriteCond
PCSource = 01
PCWrite
PCSource = 10
p
(O
=
')
W
'S
(Op = 'LW')
Branch
completion
Execution
2
(Op = 'J')
)
=
R-
ty
') o
'LW
(O
Memory address
computation
pe
r (O
p=
EQ
')
'
p=
Memory
access
3
Memory
access
5
MemRead
IorD = 1
R-type completion
7
MemWrite
IorD = 1
RegDst = 1
RegWrite
MemtoReg = 0
Memory read
completon step
4
RegDst = 1
RegWrite
MemtoReg = 0
– p. 33/33

Podobne dokumenty