1. TR働畛NG 畉I H畛C BCH KHOA H N畛I
VI畛N O T畉O SAU 畉I H畛C
BI T畉P L畛N
KI畛M CH畛NG VI M畉CH
畛 ti:
KI畛M CH畛NG B畉NG PH働NG PHP M
PH畛NG B畛 X畛 L MIPS
Nh坦m th畛c hi畛n: L DON THI畛N
C XUN TO畉N
L TH畛 NH NG畛C
Gi畉ng vi棚n h動畛ng d畉n: TS. NGUY畛N 畛C MINH
H N畛i, 1-2015
10. 9
畛c l畛nh t畛 b畛 nh畛 ( Instruction Fetch IF):
S畛 d畛ng 畛a ch畛 l動u trong thanh ghi PC 畛 gi畉i m達 ra m達 m叩y c畛a c但u l畛nh ti畉p
theo v l動u vo thanh ghi trung gian IF/ID.
Gi叩 tr畛 PC 動畛c c畛ng th棚m 4 v l動u vo thanh ghi trung gian IF/ID.
Gi畉i m達 l畛nh v 畛c c叩c thanh ghi (Intruction Decode ID):
S畛 d畛ng m達 m叩y c畛a c但u l畛nh l動u trong thanh ghi IF/ID lm 畉u vo cho kh畛i
Regfile.
Kh畛i Control s畛 d畛ng ph畉n opcode c畛a m達 m叩y c畛a c但u l畛nh 畛 gi畉i m達 thnh c叩c
t鱈n hi畛u i畛u khi畛n, ngoi t鱈n hi畛u SignEx 動畛c s畛 d畛ng cho kh畛i m畛 r畛ng, c叩c t鱈n
hi畛u kh叩c 動畛c l動u vo thanh ghi trung gian ID/EX.
畛c c叩c thanh ghi Rs, Rt t畛 b畛 thanh ghi v l動u vo thanh ghi trung gian
ID/EX Kh畛i m畛 r畛ng s畛 d畛ng t鱈n hi畛u SignEx t畛 kh畛i Control 畛 m畛 r畛ng d畉u hay
m畛 r畛ng zero c畛a 16 bit th畉p c畛a m達 m叩y thnh 32 bit v l動u vo thanh ghi ID/EX.
畛a ch畛 c叩c thanh ghi Rs, Rt, Rd 動畛c l動u vo thanh ghi ID/EX.
T鱈nh to叩n k畉t qu畉 c畛a c但u l畛nh ho畉c 畛a ch畛 (Execution EX):
Kh畛i ALU s畛 d畛ng c叩c 畉u vo 達 動畛c l動u trong thanh ghi ID/EX 畛 t鱈nh to叩n
v l動u k畉t qu畉 vo thanh ghi trung gian EX/MEM.
M畛t b畛 mux 動畛c d湛ng 畛 l畛a ch畛n thanh ghi 鱈ch t畛 2 thanh ghi Rt, Rd v l動u 畛a
ch畛 vo thanh ghi EX/MEM.
畛a ch畛 m畛i c畛a PC sau c但u l畛nh BNE c滴ng 動畛c t鱈nh to叩n trong kh畛i ny.
M畛t s畛 b畛 mux 動畛c d湛ng 畛 l畛a ch畛n gi叩 tr畛 m畛i cho PC t畛 c叩c c但u l畛nh r畉
nh叩nh BNE, J, JR.
C叩c t鱈n hi畛u i畛u khi畛n MemWrite, MemtoReg v RegWrite 動畛c l動u ti畉p vo
thanh ghi EX/MEM.
畛c ho畉c ghi d畛 li畛u tr棚n b畛 nh畛 d畛 li畛u ( Memory access MEM):
S畛 d畛ng k畉t qu畉 t鱈nh to叩n t畛 kh畛i ALU v t鱈n hi畛u i畛u khi畛n MemWrite t畛 thanh
ghi EX/MEM 畛 th畛c hi畛n 畛c ho畉c ghi vo b畛 nh畛 d畛 li畛u. K畉t qu畉 畛c ghi vo
thanh ghi trung gian MEM/WB.
C叩c gi叩 tr畛 畉u ra c畛a ALU, 畛a ch畛 thanh ghi 鱈ch c湛ng v畛i 2 t鱈n hi畛u i畛u khi畛n
MemtoReg v RegWrite 動畛c ghi l畉i vo thanh ghi MEM/WB
Ghi k畉t qu畉 vo thanh ghi ( Write back WB):
S畛 d畛ng t鱈n hi畛u MemtoReg t畛 thanh ghi MEM/WB 畛 l畛a ch畛n d畛 li畛u c畉n ghi
vo thanh ghi.
S畛 d畛ng 畛a ch畛 thanh ghi 鱈ch v t鱈n hi畛u cho ph辿p ghi RegWrite 畛 th畛c hi畛n
c担ng vi畛c ghi d畛 li畛u vo b畛 thanh ghi.
11. 10
1.6 C叩c 畛ng d畛ng c畛a b畛 x畛 l箪 MIPS
Ki畉n tr炭c MIPS 動畛c s畛 d畛ng r畛ng r達i trong c叩c 畛ng d畛ng c担ng nghi畛p nh動 DVD player,
Netwoking, camera s畛,
DVD player
(Pioneer DVR-
57H)
Networking
3COM 3102 Business IP Phone
3COM 3106 Cordless Phone
12. 11
Canon EOS 450D
Sony playstation PSX (CPU Type: LSI/MIPS R3000A, Architecture: 32 bit,
Clockspeed 33,8 MHz)
Sony Playstation Portable ( CPU 333MHz MIPS R4000) [2]
13. 12
Ph畉n 2. Ph但n t鱈ch v th畛c hi畛n ki畛m ch畛ng
Ph畉n ny ph但n t鱈ch v ph但n chia c叩c ch畛c nng c畛a s畉n ph畉m t畛 坦 l畉p ra k畉 ho畉ch thi畉t
k畉, ph叩t tri畛n s畉n ph畉m.
2.1 L畛a ch畛n ph動董ng ph叩p ki畛m ch畛ng
2.1.1. T畉m quan tr畛ng c畛a ki畛m ch畛ng thi畉t k畉
Ki畛m ch畛ng vi m畉ch l qu叩 tr狸nh t狸m ki畉m ph叩t hi畛n l畛i trong thi畉t k畉 vi m畉ch.
L畛i trong thi畉t k畉 vi m畉ch l s畛 sai kh叩c trong ho畉t 畛ng c畛a thi畉t k畉 v畛i y棚u c畉u k畛 thu畉t
畉t ra. Nh畛ng l畛i ny c坦 th畛 x畉y ra trong qu叩 tr狸nh thi畉t k畉, qu叩 tr狸nh s畉n xu畉t vi m畉ch ho畉c
qu叩 tr狸nh s畛 d畛ng vi m畉ch trong h畛 th畛ng. D湛 l l畛i x畉y ra trong qu叩 tr狸nh no th狸 chi ph鱈
畛 kh畉c ph畛c c滴ng th動畛ng kh叩 l畛n do 坦 c畉n ph叩t hi畛n s畛m l畛i 畛 tr叩nh t畛n nhi畛u th畛i
gian, c担ng s畛c v ti畛n b畉n 畛 s畛a l畛i.
2.1.2. C叩c lo畉i ki畛m ch畛ng trong quy tr狸nh thi畉t k畉 vi m畉ch
M畛t s畛 lo畉i ki畛m ch畛ng th動畛ng d湛ng trong quy tr狸nh thi畉t k畉 vi m畉ch l ki畛m ch畛ng b畉ng
h狸nh v畉, ki畛m ch畛ng d湛ng m担 ph畛ng v ki畛m ch畛ng h狸nh th畛c.
Ki畛m ch畛ng m担 ph畛ng Ki畛m ch畛ng h狸nh th畛c
Ki畛m ch畛ng d畛a tr棚n xung nh畛p. C叩c gi叩 tr畛
畉u vo 動畛c 動a vo b畉n thi畉t k畉 h畛 th畛ng
v cho ph辿p m叩y t鱈nh th畛c hi畛n vi畛c t鱈nh
to叩n 畉u ra
Ki畛m ch畛ng d湛ng c叩c c担ng th畛c, m担 h狸nh
to叩n h畛c 畛 m担 h狸nh h畛 th畛ng v ch畛ng
minh t鱈nh ho畉t 畛ng 炭ng c畛a m畉ch.
働u i畛m:
Tr畛c quan v畛i ng動畛i s畛 d畛ng
Kh担ng qu叩 kh坦 畛 thi畉t l畉p h畛 th畛ng
m担 ph畛ng vi m畉ch
働u i畛m:
Kh畉 nng t狸m 動畛c l畛i cao h董n
Th畛i gian ki畛m ch畛ng c坦 th畛 nh畛
h董n
畛 bao ph畛 l畛n h董n
Nh動畛c i畛m:
畛 bao ph畛 kh担ng cao
T畛n ti nguy棚n t鱈nh to叩n, m畉t nhi畛u
th畛i gian 畛 m担 ph畛ng h畉t c叩c
tr動畛ng h畛p ki畛m ch畛ng cho vi m畉ch.
T畛i 動u m畉ch 畉nh h動畛ng l畛n 畉n t畛c
畛 m担 ph畛ng
Nh動畛c i畛m:
Kh坦 h狸nh dung v thi畉t l畉p m担 h狸nh
to叩n h畛c cho m畉ch
Quy tr狸nh thi畉t l畉p m担 h狸nh to叩n h畛c
m畉t nhi畛u th畛i gian
15. 14
B畛 x畛 l箪 MIPS sau khi 動畛c thi畉t k畉 kh担ng ch畛 畉t nh畛ng ch畛c nng k挑 thu畉t m
c畉n 畉t y棚u c畉u phi ch畛c nng nh動 sau:
D畛 s畛 d畛ng trong vi畛c m担 ph畛ng
叩p 畛ng 動畛c c叩c c但u l畛nh c董 b畉n
D畛 dng n但ng c畉p v s畛a l畛i khi c畉n thi畉t.
Gi叩 thnh h畛p l箪
MIPS ho畉t 畛ng 畛n 畛nh v c坦 畛 tin c畉y cao
Nng l動畛ng ti棚u th畛 th畉p
Tuy nhi棚n trong khu担n kh畛 c畛a bi t畉p l畛n ny, ch炭ng em ch畛 d畛ng l畉i 畛 vi畛c
nghi棚n c畛u v m担 t畉 ki畉n tr炭c c畛a b畛 x畛 l箪 MIPS, kh担ng 畉t v畉n 畛 gi叩 thnh
lm m畛t ti棚u ch鱈 叩nh gi叩.
2.3.2. S董 畛 thi畉t k畉
C叩c th担ng s畛 畉u vo v 畉u ra c畛a thi畉t k畉:
C畛ng S畛 bit H動畛ng M担 t畉
IReady 1 Input T鱈n hi畛u b叩o b畛 nh畛 l畛nh s畉n
sng g畛i d畛 li畛u
IData 32 Input M達 l畛nh 動畛c l畉y t畛 b畛 nh畛 l畛nh
DataIn 32 Input D畛 li畛u 動畛c 畛c ra t畛 b畛 nh畛 d畛
li畛u
16. 15
DReady 1 Input T鱈n hi畛u i畛u khi畛n vi畛c 畛c d畛
li畛u vo t畛 b畛 nh畛 d畛 li畛u
IAddr 30 Output 畛a ch畛 l畛nh trong b畛 nh畛 l畛nh
c畉n th畛c thi
IRead 1 Output T鱈n hi畛u i畛u khi畛n vi畛c 畛c 畛a
ch畛 ch畛a l畛nh c畉n th畛c thi trong
b畛 nh畛 l畛nh
DRead 1 Output T鱈n hi畛u i畛u khi畛n vi畛c 畛c t畛
b畛 nh畛 d畛 li畛u
DAddr 30 Output 畛a ch畛 trong b畛 nh畛 d畛 li畛u c畉n
畛c/ghi d畛 li畛u
DWrite 4 Output T鱈n hi畛u i畛u khi畛n vi畛c ghi vo
b畛 nh畛 d畛 li畛u
DataOut 32 Output D畛 li畛u 動畛c ghi vo b畛 nh畛 d畛
li畛u
2.3.3. Thi畉t k畉 chi ti畉t t畛ng kh畛i
Trong ph畉n ny nh坦m s畉 t畉p trung tr狸nh by m畛t s畛 kh畛i quan tr畛ng trong ki畉n tr炭c MIPS
Pipeline
Kh畛i Control Unit :
L kh畛i sinh ra c叩c t鱈n hi畛u i畛u khi畛n cho con Mips khi c坦 l畛nh c畛a b棚n ngoi 動a
vo d動畛i d畉ng m達 l畛nh.
畉u vo : Op[5:0] , Funct[ 5:0] l畉y t畛 m達 l畛nh.
Zero l畉y t畛 畉u ra c畛a kh畛i ALU
畉u ra : C叩c t鱈n hi畛u 畛 i畛u khi畛n c叩c kh畛i kh叩c l :
+) T鱈n hi畛u 動a d畛 li畛u t畛 b畛 nh畛 ra thanh ghi Memtoreg
+) T鱈n hi畛u Regwrite, Memwrite
+) T鱈n hi畛u ch畛n ALUSrc, PCSrc, RegDst
+) T鱈n hi畛u ALUControl
17. 16
Kh畛i Register File :
L kh畛i thanh ghi c畛a con Mips. 畉u vo s畉 l 畛a ch畛 c畛a c叩c thanh ghi 動a vo t畛
m達 l畛nh v d畛 li畛u quay v畛 thanh ghi t畛 giai o畉n WB. 畉u ra s畉 l d畛 li畛u n畉m
trong thanh ghi m 畛a ch畛 l畛nh tr畛 t畛i.
畉u vo : +) RegwriteW : t鱈n hi畛u cho ph辿p 畛c m達 l畛nh t動董ng 畛ng vo
thanh ghi qua WB
+) M達 l畛nh t動董ng 畛ng c畛a Rs, Rt : InstrD[25:21], InstrD[20:16]
+) D畛 li畛u tr畉 v畛 WriteRegW[4:0] v t鱈n hi畛u k畉t qu畉 ResultW
畉u ra : D畛 li畛u 動畛c 畛c trong 2 thanh ghi m m達 l畛nh truy c畉p t畛i 畛a ch畛 c畛a n坦
Readdata1, Readdata2
Kh畛i ALU :
L kh畛i ph畛c v畛 nhi畛m v畛 t鱈nh to叩n.
畉u vo : +) T鱈n hi畛u ch畛n lo畉i t鱈nh to叩n : c畛ng, tr畛, nh但n, chia : ALUControl 動畛c
sinh ra t畛 ControlUnit
+) D畛 li畛u 動畛c 畛c t畛 2 thanh ghi trong t畉p thanh ghi Register file
Readdata1, Readdata2 32 bit
畉u ra: +) D畛 li畛u ra sau khi 動畛c t鱈nh to叩n ALUOut 32 bit.
+) T鱈n hi畛u Zero s畛 d畛ng trong l畛nh r畉 nh叩nh beq, bne.
18. 17
Kh畛i SignExt :
Kh畛i 動畛c s畛 d畛ng v畛i nhi畛m v畛 chuy畛n 畛i d畛 li畛u d畛ch t畛 16 bit trong m達 l畛nh
thnh 32 bit 畛 th畛c hi畛n cho nhi畛m v畛 t鱈nh to叩n.
畉u vo : D畛 li畛u d畛ch 動畛c l畉y trong 16 bit cu畛i c畛a m達 l畛nh Instr[15:0]
畉u ra : D畛 li畛u dich 動畛c chuy畛n thnh 32 bit b畉ng c叩ch l畉y 16 bit 畉u b畉ng bit th畛 16
v 16 bit cu畛i l Instr[15:0]. y[31:0] = [16(Instr[15]), Instr[15:0]].
T畛 c叩c kh畛i tr棚n v m畛t s畛 kh畛i logic c董 b畉n kh叩c ta x但y d畛ng 動畛c b畛 MIPS a
xung nh畛p nh動 h狸nh v畉:
畛 a xung nh畛p ta chia l畛nh thnh 5 giai o畉n IF, ID, EX, MEM, WB. M畛i giai o畉n 動畛c
th畛c hi畛n trong m畛t chu k畛. Trong s董 畛 g畛m c坦 c叩c kh畛i ch鱈nh nh動 l kh畛i Control Unit,
kh畛i Register File, kh畛i ALU, kh畛i SignExt.
T畛 MIPS a xung nh畛p ch炭ng ta ti畉n hnh pipeline b畛 vi x畛 l箪 b畉ng c叩ch th棚m
vo c叩c thanh ghi tr畉ng th叩i IFID, IDEX, EXMEM, MEMWB, PC. C叩c thanh ghi s畉 th畛c
hi畛n nhi畛m v畛 chuy畛n ti畉p d畛 li畛u gi畛a c叩c kh但u
19. 18
2.4 Th畛c hi畛n c叩c ph辿p to叩n trong MIPS d湛ng C++
Trong ph畉n ny nh坦m s畛 d畛ng c叩c ph辿p to叩n c坦 trong th動 vi畛n C 畛 t鱈nh to叩n. C叩c
ph辿p to叩n (Instruction) 動畛c s畛 d畛ng l : c畛ng, tr畛, nh但n, chia 動畛c m達 h坦a t動董ng 畛ng v畛i
c叩c s畛 t畛 0 畉n 3 v 動畛c sinh ng畉u nhi棚n trong file Instruction.txt, c叩c to叩n h畉ng(Data)
c滴ng 動畛c sinh ra ng畉u nhi棚n trong file data.txt. C叩c gi叩 tr畛 trong hai file ny c滴ng l 畉u
vo cho qu叩 tr狸nh m担 ph畛ng m畉ch b畉ng techbench. Sau khi t鱈nh to叩n b畉ng c叩c ph辿p to叩n c坦
trong th動 vi畛n C, k畉t qu畉 畉u ra s畉 動畛c ghi vo file output.txt.
H狸nh b棚n d動畛i s畉 minh h畛a cho qu叩 tr狸nh t鱈nh to叩n s畛 d畛ng th動 vi畛n C:
K畉t qu畉 so s叩nh gi叩 tr畛 畉u ra c畛a hai ki畛u t鱈nh to叩n s畉 ki畛m ch畛ng 畛 ch鱈nh x叩c c畛a vi畛c
thi畉t k畉t m畉nh (verilog). T畛 坦 ta c坦 th畛 ph叩t hi畛n c叩c l畛i (n畉u c坦) trong qu叩 tr狸nh thi畉t k畉.
20. 19
Code C++:
#include<iostream>
#include<stdio.h>
#include<conio.h>
#include <cstdlib>
#include<ctime>
using namespace std;
long add (long a, long b);
long sub (long a, long b);
long mul (long a, long b);
long divi (long a, long b);
int main()
{
int A[100],B[100],KQ[100];
long i,j ,a,b ;
int test_case;
srand(time(0));
//L畉y gi叩 tr畛 to叩n h畉ng ng畉u nhi棚n r畛i 動a vo file Toanhang.txt
freopen("instruction.txt","w",stdout);
for (int n=1;n<=50;n++)
{
int x=rand()%4;
cout<<x<<" ";
}
fclose(stdout);
//L畉y hai to叩n t畛 ng畉u nhi棚n r畛i 動a vo file 畉u vo input.txt
freopen("data.txt","w",stdout);
for (int m=1;m<=50;m++)
{
//srand(time(0));
a = rand();
b = rand();
cout<<a<<" "<<b<<endl ;
}
fclose(stdout);
//Cho to叩n h畉ng vo m畉ng A
freopen("data.txt","r",stdin);
for ( i=1;i<=50;i++)
{
cin>>A[i*2-1]>>A[i*2];
}
fclose(stdin);
//Cho to叩n t畛 vo m畉g B
freopen("instruction.txt","r",stdin);
for ( j=1;j<=50;j++)
cin>>B[j];
fclose(stdin);
for (test_case=1;test_case<=50;test_case++){
switch (B[test_case])
{
21. 20
case 0: {
KQ[test_case]=add(A[test_case*2-1],A[test_case*2]);
break;
}
case 1: {
KQ[test_case]=sub(A[test_case*2-1],A[test_case*2]);
break;
}
case 2:{
KQ[test_case]=mul(A[test_case*2-1],A[test_case*2]);
break;
}
case 3:{
KQ[test_case]=divi(A[test_case*2-1],A[test_case*2]);
break;
}
default: cout<< "ma lenh sai";
}
}
// ghi k畉t qu畉 vo file 畉u ra output.txt
freopen("output.txt","w",stdout);
for (int k=1;k<=50;k++)
cout<<KQ[k]<<" ";
fclose(stdout);
}
long add(long a,long b)
{
return a+b;
}
long sub (long a,long b)
{
return a-b;
}
long mul(long a,long b)
{
return a*b;
}
long divi ( long a, long b)
{
return a/b;
}
22. 21
Ph畉n 3. K畉t qu畉 t畛ng h畛p v m担 ph畛ng
Ph畉n ny tr狸nh by v畛 c叩c ph動董ng 叩n k畛 thu畉t 動畛c s畛 d畛ng 畛 thi畉t k畉 s畉n ph畉m.
C坦 th畛 l l畛a ch畛n c叩c linh ki畛n ph畉n c畛ng cho m畉ch.
C坦 th畛 l l畛a ch畛n thu畉t to叩n th畛c hi畛n m畛t ch畛c nng m畉ch.
C坦 th畛 l l畛a ch畛n ki畉n tr炭c m畉ch
3.1 S董 畛 kh畛i c畛a s畉n ph畉m
Ph畉n ny lm r探 c叩c kh畛i th畛c hi畛n ch畛c nng trong m畉ch, k畉t n畛i v giao ti畉p gi畛a c叩c
kh畛i. Ph畉n ny ph畉i lm r探 動畛c t鱈n hi畛u vo v ra kh畛i t畛ng kh畛i.
3.2 Thu畉t to叩n, linh ki畛n, ki畉n tr炭c m畉ch
Ph畉n ny lm r探 vi畛c l畛a ch畛n thu畉t to叩n hay linh ki畛n ph畉n c畛ng hay ki畉n tr炭c m畉ch 畛
th畛c hi畛n c叩c kh畛i ch畛c nng
M畛i kh畛i ch畛c nng n棚n n棚u ra 鱈t nh畉t 2 ph動董ng 叩n th畛c hi畛n v l畛a ch畛n d畛a tr棚n c叩c ti棚u
ch鱈 k畛 thu畉t 畛nh l動畛ng.