citius-altius-fortius processor...citius-altius-fortius processor versiyon 1.02 15/04/2008 proje...
TRANSCRIPT
CITIUS-ALTIUS-FORTIUS
PROCESSOR
Versiyon 1.02
15/04/2008
PROJE SORUMLUSU : BERKAY AYBAR
MURAT GOKSEL
E-MAIL : [email protected], [email protected]
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 2
ICINDEKILER
Tablo Listesi.............................................................................................................................
Figur Listesi.............................................................................................................................
1 GIRIS....................................................................................................................................
1.1 FPGA .................................................................................................................
1.2 RISC Islemci .......................................................................................................
1.3 EDA Yazilimlari ..................................................................................................
2 FPGA ile Fiziksel Islemci Tasarimi Uygulamasi................................................................
2.1 RISC Komut Seti Mimarisi....................................................................................
2.2 RISC Islemci Mimarisi ............................................................................................
2.3 RISC Islemci Verilog Uygulamasi..........................................................................
2.3.1 Komut Yakalama Birimi.........................................................................
2.3.2 Komut Cozumleme Birimi....................................................................
2.3.3 Kontrol Unitesi....................................................................................
2.3.4 Calisma Unitesi....................................................................................
2.3.5 Hafiza Birimleri..................................................................................
2.4 16 bitlik Pipeline Islemci Uygulamasi
2.4.1 Pipeline Tehlikeleri..................................................................................
2.5 Donanim Uygulamasi....................................................................................................
3 Sonuclar ....................................................................................................................................
4 Gelicekte Yapilmasi Gereken Calismalar..................................................................................
5 Sonuc........................................................................................................................................
Referanslar...............................................................................................................................
Appendiks.................................................................................................................................
A. Komut Aciklamari...........................................................................................................
B. CAF Processor Verilog Kodu................................................................................................
C. CAF Processor Testbench Verilog Kodu...............................................................................
D. Simulasyon Sonuclari...................................................................................................
E. Kaynaklar.............................................................................................................................
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 3
CAF PROCESSOR PROJE OZETI
Bu proje kapsaminda verilen komut setinin tasarimda oncelikli olarak en verimli sekilde
gerceklenmesi on gorulmustur. Tasarimi zenginlestirmek icin verilen komut setine ek olarak
guncel islemcilerde kullanilan yaygin komutlar da eklenicektir(orn: POP, PUSH… ). Tasarim 16-
bitlik pipelined RISC mimarisi gerceklestirilerek uygulanacaktir. CAF_Processor tasariminin dort
farkli bolumden olusmasi on gorulmustur, bunlar sirasiyla;
1) Komut Yakalama Bolumu (Instruction Fetch Stage)
2) Komut Cozumleme Bolumu (Instruction Decoding Stage)
3) Calisma Bolumu (Execution Stage)
4) Geri Okuma Bolumu( Write Back Stage)
Her bolum bir veya birden fazla verilog modulunden olusacaktir.
Projenin iki fazdan olusturulmasi on gorulmustur. Birinci faz verilen komut kumesinin ve buna
ek olarak guncel komutlarin kullanilacagi 16-bitlik RISC islemci tasarimidir. Ikinci faz da ek olarak
IEEE 754 Floating Point Unitesi nin de donanima entegre edilip komut kumesini zenginlestirmek
ayni zamanda tasarlanicak islemcinin islem yapabilme gucunu artirmak olarak hedeflenmistir.
Proje kapsamin da tasarlanicak islemci ile ornek bir FIR filtre uygulamasi yapilmasi
planlanmaktadir.
Proje kapsaminda ozellikle fonksyonel simulasyonlari ve post-synthesis simulasyonlarini
gerceklestirmek icin gerekli olan EDA yazilimlari ve bir gelistirme boardi talep edilmektedir.
‘C’, ‘A’, ‘F’ harfleri latince Citius- Altius- Fortius kelimelerinin bas harflerinden gelmektedir.
Latince de bu kelimeler sirasiyla “Daha hizli, Daha Yuksek, Daha Guclu” anlamina gelmektedir.
Tasarlanicak islemcininde butun bu ozellikleri saglamasi hedeflendigi icin bu isim proje icin
uygun gorulmustur.
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 4
Add Addition 1
Addi Addition (immediate) 2
Sub Subtraction 3
Subi Subtraction (immediate) 4
Mul Multiplication 5
Muli Multiplication (immediate) 6
Mulu Multiplication (unsigned) 7
Cmp Compare 8
And AND 9
Andi AND (immediate) 10
Or OR 11
Ori OR (immediate) 12
Not NOT 13
Xor XOR 14
Xori XOR (immediate) 15
Sll Logical shift left 16
Srl Logical shift right 17
Sla Arithmetic shift left 18
Sra Arithmetic shift right 19
Lw Load word 20
Sw Store word 21
Mov Move data between registers 22
Movi Move data (immediate) 23
Beq Branch if equal to 0 24
Bne Branch if not equal to 0 25
Ba Branch always 26
BL Branch and Link 27
Nop No operation 28
Hlt Halt 29
Syscall System call (software interrupt) 30
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 5
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 6
1 GIRIS
1.1 FPGA
Bu projenin amaci FPGA icerisinde 16 bitlik RISC islemci tasarlamak ve bu islemciyi kullanarak bir
uygulama gerceklestirmektir. Bu p roje raporu ileride egitim amacli kullanicagi dusunulerek
sayisal tasarim ve FPGA teknolojisi hakkinda genel bilgilerde icermektedir.
FPGA teknolojisi sayisal tasarimcilara cok buyuk esneklik saglamaktadir.Bunun en buyuk
sebeplerinden biri FPGA in tekrar programlanabilmesidir. Ayni zamanda FPGA lerin kismen
dusuk fiyatli olmasi ve FPGA sirketlerinin(Xilinx, Altera, Actel gibi...) sagladiklari gelismis yazilim
araclari sayisal tasarimla ugrasan donanim muhendislerinin hayatini kolaylastirir.
FPGA ile yeni calismaya baslayan genc muhensdiler genellikle FPGA yi farkli bir tur mikroislemci
sanarlar. Fakat FPGA kullanim amaci ile mikroislemcinin kullanim amaci bir cok zaman
birbirlerinden cok farklidir. FPGA in iki farkli kullanim alani vardir bunlardan ilki ASIC prototip
gerceklemesidir. ASIC tasarimcilari yaptiklari tasarimlari bilgisayar uzerinde yaptiklari
simulasyonlardan sonra FPGA uzerine tasirlar. Cunku FPGA uzerine tasinan bir tasarim gercek
zamanda fonksyonellik gosterir . Tasarimci kendisinden istenen tasarimin kriterleri gerceklesip
gerceklesmedigini bu evrede test etme sansi bulunur.Tasarim muhendisleri icin tasarimlarinin
kriterleri olusturup olusturmadigini gormelerini saglayan onemli bir firsattir. Bundan sonraki adim
tasarimin ASIC(Chip) in fabrikasyonu icin proses e gonderilmesidir. FPGA baska bir kullanim alani
ise dusuk hacimde sistem uretimlerinde ASIC ye bir alternatiftir. ASIC uretimi cok maliyetli bir is
oldugu icin ancak yuksek hacimde uretim yapildigi zaman ASIC in birim fiyati makul bir degere
ulasir. Ama eger yuksek hacimli bir uretim yapilmayacaksa ASIC uretimi cok pahali olabilir. Bu
noktada FPGA boslugu doldurur tasarimcilara hem fiyat hemde tasarim kolayligi acisindan cok
fazla avantaj saglar. Tasarlanicak olan spesifik devre FPGA icinde gerceklestirilir ve sistem icinde
calistirilir.
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 7
1.2 RISC Islemci Bu projede yer alan islemci mimarisi RISC islemci mimarisidir. RISC (Reduced Instruction Set
Computer )”Komut Seti Azaltilmis Bilgisayar” anlamina gelmektedir. Komut setinin azaltilmasi,
cogu zaman islemcinin komut kumesindeki kompleks komutlarin cikartilmasi ile gerceklesir. Bu
RISC islemci mimarisini daha az kompleks yapar. RISC islemcilerde asil amac tasarlanan komut
kumesini basit yapmak ve bunun sonucunda komutlari hizli isleyen bir islemci elde etmektir.
RISC islemcilerde komutlarin islenmesi bir saat cevrimi surer ve komutlarin uzunlugu sabittir.
RISC islemci mimarisi bir baska islemci mimarisi olan CISC(Complex Instruction Set Computer)
mimarisine alternatif olarak tasarlanmistir. Gunumuzde kullanilan bir cok kisisel bilgasayar CISC
mimarisi icerir. 1970 lerin basinda ilk mikroislemci tasarlandiginda hafiza birimleri pahali
oldugundan komutlari mumkun oldugu kompleks tasarlayip olusturulucak programlarin hafizada
daha az yer kaplanmasi amaclanmistir. O donemde hafiza birimleri maliyetli oldugu icin islemci
tasarimcilarini bu yola yoneltmistir. Hafiza maliyetlerinin dusmesi tasarimcilari RISC islemci
mimarisine yoneltmistir.
RISC ve CISC komut setleri arasindaki iliskiyi guzel bir analoji yaparak aciklamaya calisalim.
Ornegin latin alfabesi kullanarak yazilmis bir kitap in toplam sayfa sayisi ile ayni kitabin Cince
yazilmis versiyonu ayni sayida degildir. Cince yazilan kitap cok daha az sayfadan olusur bunun
sebebi Cın alfabesinde 4000 den fazla farkli sembolun olusudur. Semboller cok spesifik anlamlar
icerebilirler fakat bunun sonucunda cok kompleks ve ogrenmesi cok zordur. Latin alfabesinde ise
sadece 26 farkli sembol vardir. Bununla beraber ayni kitap cok daha fazla sayfa icermektedir.
RISC islemci ve CISC islemci komut seti arasindaki farkda buna cok benzerdir. CISC islemcileri
cozumlemek cok daha karisik ve zordur.
Genel RISC mimarisi dort bolumden olusmustur. Bunlar sirasiyla
1. Komut Yakalama Evresi(Instruction Fetch Stage)
2. Komut Cozumleme Evresi(Instruction Decode Stage)
3. Komut Calistirma Evresi (Instruction Execution Stage)
4. Geri Yazma Evresi(Write Back)
Ilerleyen bolumlerde CAF islemci tasarimi ve mimarisi ile ilgili daha detayli bilgi verilecektir.
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 8
1.3 EDA Yazilimlari
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 9
2 FPGA ile Fiziksel Islemci Uygulamasi 2.1 Komut Seti Mimarisi Genel olarak RISC islemcilerde basit ve tekduze bir komut formati kullanilir. RISC islemcilerde cok
fazla komut formati olmamasi komut cozumlemesini onemli olcude kolaylastirir. CAF islemci
komut mimarisi de 30 komut tan olusmustur. Ileride ek komutlarin mimariye eklenmesi
planlanmisitir.
Genel RISC islemci mimarisinde iki veya uc farkli adresleme teknigi kullanilir ve en genel
adresleme teknikleri “immediate”, “direct” ve “indexed” dir. CAF islemci komut setinde de ayni
sekilde uc farkli adresleme teknigi kullanilmistir. Diger gerekli adresleme modlari bu temel
adresleme modlarindan elde edilebir.
CAF islemcisindeki komutlari fonksiyonelliklerine gore gruplandirildiginda dort farkli gruba ayrilir.
1. Brans(Dallanma) Komutlari (Branch Instructions)
2. Veri Isleme Komutlari(Data Processing Instructions)
3. Yukleme ve Depolama Komutlari(Load&Store Instructions)
4. Kesme ve Diger Komutlar(Interrupt)
Brans Komutlari: CAF islemcide uc cesit Brans komutu vardir bunlar kosulsuz(Branch Always),
Kosullu(Branch Equal, Branch Not Equal) ve altprogramlardir(Branc&Link). Brans komutlari
program sayacinin icerigini degistirerek hafiza icerisinde farkli bir bolgeye yonlendirirler. Kosullu
brans komutlarinda programi yonlendirmek icin kosulun saglanmasi gerekir. Kosul saglanirsa
program sayaci ana-rutinden cikar ve altprogramin komutlarini islemeye baslar. CAF islemcide
kosulsuz brans komutu program sayacini 1Kbyte ileri veya geri goturebilirler. Kosullu brans
komutu ise ancak 256 byte ileri veya geri goturebilir.
Veri Isleme Komutlari:
Yukleme ve Depolama Komutlari:
Kesme ve Diger Komutlar:
CAF_Processor Komut Kumesi Komut Sembol Opcode Ornek Anlam Yorum
Toplama add 00 0001
Toplama Immediate
addi 00 0010
Cikarma sub 00 0011
Cikarma Immediate
Subi 00 0100
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 10
Carpma Mul 00 0101
Carpma Immediate
Muli 00 0110
Carpma Isaretsiz
mulu 00 0111
Kiyaslama Cmp 00 1000
Ve And 00 1001
Ve Immediate
Andi 00 1010
Veya Or 00 1011
Veya Immediate
Ori 00 1100
Not Not 00 1101
Xor Xor 00 1110
Xor immediate
Xori 00 1111
Mantiksal sola
kaydirma
Sll 01 0000
Mantiksal saga
kaydirma
Sri 01 0001
Aritmetik sola
kaydirma
Sla 01 0010
Aritmetik saga
kaydirma
Sra 01 0011
Kelime Yukleme
Lw 01 0100
Kelime Depolama
Sw 01 0101
Tasima
mov 01 0110
Tasima Immediate
Movi 01 0111
Kosul(Eger ‘0’ a esit
ise)
Beq 01 1000
Kosul (Eger ‘0’ esit degil
ise)
Bne 01 1001
Kosul her zaman
Ba 01 1010
Kosul ve baglama
BL 01 1011
İslem yok Nop 01 1100
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 11
Dur Halt 01 1101
Kesme Syscall 01 1110
CAF Islemci
Ek Komutlar
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 12
2.2 RISC Islemci Mimarisi RISC islemcilerin komut setinin basit ve kisa olmasi mimarinin de daha az kompleks olmasinda
buyuk bir etkendir. RISC mimarisinin bir baska ozelligi, “yukleme(load)” ve “depolama(store)”
komutlarinin disindaki tum komutlar veriyi islemci icerisindeki yazicilardan okur veya yazarlar.
Sadece “yukleme(load)” ve “depolama(store)” komutlari disardaki hafiza birimiyle arayuz saglar.
Islemcinin icindeki yazicilar(register) disardaki hafiza birimlerinden(ana hafiza veya cache hafiza)
cok daha hizli oldugundan komutlarin cok daha hizli ve efektif calistirilmasi mumkun olur.
Genel RISC islemci mimarisinde “yazici dosyalari(register file)” denilen yazici kumesi bulunur.
Yazicilar islemci icerisinde gecici olarak sayisal veri depolamasinda kullanilir. RISC islemci
mimarisinde cok sayida genel amacli yazici bulundugundan komut isleme sirasinda gerekli olan
veriler burada saklanabilir. Bu da ana hafiza birimine olan bagimliligi azaltir ve islemcinin
performansini arttirir. Bilindigi gibi islemcinin disinda bulunan hafiza birimine ulasmak icerdeki
yazicilara ulasmaktan cok daha fazla zaman alir.
Yazici dosyalari ayni zamanda hizli ve efektif altprogram calistirilmasi icinde kullanilir. Genel RISC
islemci mimarisinde herhangi bir zamanda anarutin komut sirasinda giderken yazici dosyalarinin
belli bir kismina ulasilabilir. Ornegin CAF islemcide 16 tane 16-bitlik genel amacli yazici dosyasi
bulunur fakat bunlardan sadece ilk 8 tanesine ulasilabilir. Bir altprogram cagrildigi zaman
altprogramin geri kalan 8 yaziciya ulasma hakki vardir. Boylece altprogram cagrildigi zaman
anarutindeki veriler yazicilarda tutulur.
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 13
2.3 RISC Islemci Verilog Uygulamasi
2.3.1 Komut Yakalama Evresi(Instruction Fetch Unit)
Komut yakalama evresinde komut, hafizada program sayacinin gosterdigi yerden alinir ve komut
yazicisina yazilir(IF_IR). Program sayaci komut adres bilgisini tutar ve komutlar islendikce
icerigini iki artirir. Her komut 2byte
oldugu icin program sayacida iki artirilir.
Hafizadan komut okunmasi icin
“read_instruction_n” sinyalide sifira
cekilir. Bir sonraki saat cevriminde
hafizadan alinan komut, IF_IR yazicisina
depolanir. Komut yakalama evresi her
saat cevriminde bu operasyonu yeni
komutlar icin gerceklestirir. Boylece
komut adresi bir sonraki komut icin
hazirlanirken ayni zamanda o anda gelen
komut da IF_IR yazicisinda depolanir.
Eger brans gelmediyse programi
olusturan komutlar sirali bir sekilde
calisir. Eger bir brans operasyonu
calistirilirsa o zaman program_sayicisina
brans in oldugu adres aktarilir.
Figur 1.1 Komut Yakalama Evresi
//Komut_Yakalama: Komut Yakalama Evresi always@(posedge clk or reset_n) begin if(~reset_n) begin PC <= 0; //program sayaci ilk kosulu read_instruction_n <= 0; end else begin read_instruction_n <= 0; if(branch_active) begin PC <= branch_pc_reg; IF_IR <= branch_instruction; IF_PC <=branch_pc_reg; end else begin PC <= PC + 2; IF_IR <= instruction; // Komut Yakalama Komut Yazicisi IF_IR <= PC + 2; end end end
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 14
2.3.2 Komut Cozumleme Evresi
Komut cozumleme evresinde IF_IR sayacinda depolanan komut cozumlenir ve genel amacli
yazicilarda (yazici dosyasi ) bulunan veri, calistirma evresinde kullanilmak uzere komut cozucu
yazicilarina aktarilir. Yazici dosyalarinda bulunan verilerin komut cozucu yazicilarina
aktarilmasinin sebebi verilen komutun
yazici dosyasi icinden herhangi bir
yazicidan veriyi aktarabilmesidir. Bu
progamciya esneklik saglar. Asagidaki
verilog kodu komut cozumleyici evrenin
kodunu gostermistir. Verilog kodunda
ornek olmasi icin sadece “ADD” ve “ADDi”
komutlari cozumlenmistir. Always blogu
icinde sadece “case statement”
kullanilmistir. Komut cozumleme evresinin
butun kismi Apendiks B kisminda
bulunabilir.
Figur 1.2 Komut Cozumleme Evresi //Komut_Cozucu Evresi always@(posedge clk) begin case(IF_IR[15:10]) 6'b00_0001:begin ID_opcode <= `ADD; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; 6'b00_0010:begin ID_opcode <= `ADDi; ID_Ra <= R[10:8]; ID_imm_offset[7:0] <= IF_IR[7:0]; . . . . end case end // always blok sonu
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 15
2.3.3 Calistirma Evresi(Execution Stage)
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 16
2.3.4 Geri Yazma Evresi (Write Back Stage)
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 17
Apendiks A : Komut Aciklamalari
1) ADD(Toplama) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 1 X Ra Rb Rc
Opcode
2 ) Addi(Toplama-Immediate) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 1 0 Ra Immediate
Opcode
3)Sub(Cikarma) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 1 1 X Ra Rb Rc
Opcode
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 18
4)Subi(Cikarma-Immediate) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 1 0 0 Ra Immediate
Opcode
5) Mul(Carpma) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 1 0 1 X Ra Rb Rc
Opcode
6 ) Muli(Carpma-Immediate) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 1 1 0 Ra Immediate
Opcode
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 19
7) Mulu(Carpma-Isaretsiz) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 1 1 1 X Ra Rb Rc
Opcode
8)Cmp(Kiyaslama) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 0 0 0 X Ra Rb Rc
Opcode
9)And(Ve) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 0 0 1 X Ra Rb Rc
Opcode
10)Andi(Ve-Immediate) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 0 1 0 Ra Immediate
Opcode
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 20
11 )Or(Veya) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 0 1 1 X Ra Rb Rc
Opcode
12)Ori (Veya-Immediate) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 1 0 0 Ra Immediate
Opcode
13)Xori(Exor-Immediate) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 1 0 1 Ra Immediate
Opcode
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 21
14)Xor(Exor) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 1 1 0 X Ra Rb Rc
Opcode
15)Sll(Mantiksal – Sola Kaydirma) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 1 1 1 1 Immediate Rb Rc
Opcode
16)Srl(Mantiksal – Saga Kaydirma) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 0 0 0 Immediate Rb Rc
Opcode
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 22
17)Sra(Aritmatik-Saga Kaydirma) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 0 0 1 Immediate Rb Rc
Opcode
18)Sla(Aritmatik-Sola Kaydirma) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 0 1 0 Immediate Rb Rc
Opcode
19)Not 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 0 1 1 X Ra Rb Rc
Opcode
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 23
20)Lw(Kelime Yukleme) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 1 0 0 X Ra Rb Rc
Opcode
21)Sw(Kelime Depolama) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 1 0 1 X Ra Rb Rc
Opcode
22) Movi(Veri tasima Immediate) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 1 1 1 Ra Immediate
Opcode
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 24
23) Mov(Veri Tasima) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 0 1 1 0 X XXX Rb Rc
Opcode
24)Beq(Brans Esit) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 1 0 0 0 Kosul Immediate
Opcode
25)Bnq(Brans Esit Degil) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 1 0 0 1 Kosul Immediate
Opcode
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 25
26)Ba(Branch always) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 1 0 1 0 Immediate
Opcode
27)Nop(No Operation) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 1 0 1 1 Kosul Immediate
Opcode
28)Hlt(Halt) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 1 1 0 0 Kosul Immediate
Opcode
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 26
29)Syscall(System calll) 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 1 1 1 0 1 Kosul Immediate
Opcode
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 27
Apendiks B : Verilog Kodu
Not: Verilog kodunda kullanilan degiskenler verilogdaki anahtar kelimelerle uyum gostermesi icin Ingilizce
isimlendirme yapilmistir. Yorum satirlarinda degiskenlerle ilgili gerekli Turkce aciklamalar yapilmistir.
//CAF_Islemci.v // global_parametreler ` //Komutlar ve Opcode lar `define ADD 6'b00_0001 `define ADDi 6'b00_0010 `define SUB 6'b00_0011 `define SUBi 6'b00_0100 `define MUL 6'b00_0101 `define MULi 6'b00_0110 `define MULu 6'b00_0111 `define CMP 6'b00_1000 `define AND 6'b00_1001 `define ANDi 6'b00_1010 `define OR 6'b00_1011 `define ORi 6'b00_1100 `define XORi 6'b00_1101 `define XOR 6'b00_1110 `define SLL 6'b00_1111 `define SRL 6'b01_0000 `define SRA 6'b01_0001 `define SLA 6'b01_0010 `define NOT 6'b01_0011 `define LW 6'b01_0100 `define SW 6'b01_0101 `define MOV 6'b01_0110 `define MOVi 6'b01_0111 `define BEQ 6'b01_1000 `define BNQ 6'b01_1001 `define BA 6'b01_1010 `define NOP 6'b01_1011 `define HLT 6'b01_1100 `define SYSCALL 6'b01_1101
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 28
module CAF ( clk, reset_n, read_instruction_n, instruction_address, instruction, read_data_n, write_data_n, data_address, data_in, data_out ); //Islemcinin giris ve cikis sinyalleri input clk; input reset_n; output read_instruction_n; output [15:0] instruction_address; input [15:0] instruction; output read_data_n; output write_data_n; output [15:0] data_address; input [15:0] data_in; output [15:0] data_out; //Islemcinin yazicilari reg [15:0] data; reg read_instruction_n; reg read_data_n; reg write_data_n; reg [15:0] PC; //Program Sayaci reg [15:0] LR; //Link Yazicisi reg [15:0] SP; //Stack Gostericisi reg [15:0] R[15:0];// general regs reg N_Flag; //condition flags (N = negative) reg Z_Flag; //Zero reg C_Flag; //Carry reg V_Flag; //Overflow reg branch_taken;
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 29
reg [15:0] branch_target; reg [32:0] ALU_out_reg; reg [15:0] DR; integer i, ex_i; integer found_i, found_ex_i; //pipeline yazicilari reg [15:0] IF_IR; reg [15:0] IF_PC; reg [15:0] ID_PC; reg [15:0] ID_Ra; reg [15:0] ID_Rb; reg [15:0] ID_Rc; reg [32:0] EX_ALU_out; reg [5:0] ID_opcode; reg [5:0] EX_opcode; reg [10:0] ID_imm_offset; reg [7:0] EX_imm_offset; reg [3:0] ID_cond; reg [2:0] ID_Rd_code; reg [2:0] EX_Rd_code; //// assign instruction_address = PC; assign dataout = (~write_data_n) ? DR : 16'bZZZZZZZZZZZZZZZZ; //tri-state //Fonksiyon Tanimlari function condition_satisfy; input [3:0] cond_code; begin case(cond_code) 4'b0000 : condition_satisfy = Z_Flag; 4'b0001 : condition_satisfy = ~Z_Flag; 4'b0010 : condition_satisfy = C_Flag; 4'b0011 : condition_satisfy = ~C_Flag; 4'b0100 : condition_satisfy = N_Flag; 4'b0101 : condition_satisfy = ~N_Flag; 4'b0110 : condition_satisfy = V_Flag; 4'b0111 : condition_satisfy = ~V_Flag; 4'b1000 : condition_satisfy = (C_Flag & (~Z_Flag)); 4'b1001 : condition_satisfy = ((~C_Flag) & Z_Flag); 4'b1010 : condition_satisfy = (N_Flag == V_Flag); 4'b1011 : condition_satisfy = (N_Flag != V_Flag); 4'b1100 : condition_satisfy = Z_Flag & (N_Flag == V_Flag); 4'b1101 : condition_satisfy = Z_Flag & (N_Flag != V_Flag); 4'b1110 : condition_satisfy = 1'b1; default: condition_satisfy = 1'b1;
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 30
endcase end endfunction //////////////////////////////////////////////////// //Komut_Yakalama: Komut Yakalama Evresi always @ (posedge clk ) begin if(reset_n == 0) begin PC = 0; //program sayaci ilk kosulu read_instruction_n = 0; end else begin read_instruction_n = 0; PC = PC + 2; IF_IR = instruction; // Komut Yakalama Komut Yazicisi IF_IR = PC + 2; end end //Komut_Cozucu Evresi always@(posedge clk) begin case(IF_IR[15:10]) 6'b00_0001:begin ID_opcode <= `ADD; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b00_0010:begin ID_opcode <= `ADDi; ID_Ra <= R[IF_IR[10:8]]; ID_imm_offset[7:0] <= IF_IR[7:0]; end 6'b00_0011:begin ID_opcode <=`SUB; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b00_0100:begin ID_opcode <= `SUBi; ID_Ra <= R[IF_IR[10:8]]; ID_imm_offset[7:0] <= IF_IR[7:0]; end
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 31
6'b00_0101:begin ID_opcode <= `MUL; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b00_0110:begin ID_opcode <= `MULi; ID_Ra <= R[IF_IR[10:8]]; ID_imm_offset <= R[IF_IR[7:0]]; end 6'b00_0111:begin ID_opcode <= `MULu; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b00_1000:begin ID_opcode <= `CMP; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b00_1001:begin ID_opcode <= `AND; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b00_1010:begin ID_opcode <= `ANDi; ID_Ra <= R[IF_IR[10:8]]; ID_imm_offset <= R[IF_IR[7:0]]; end 6'b00_1011:begin ID_opcode <= `OR; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b00_1100:begin ID_opcode <= `ORi; ID_Ra <= R[IF_IR[10:8]]; ID_imm_offset[7:0] <= IF_IR[7:0]; end 6'b00_1101:begin
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 32
ID_opcode <= `XOR; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b00_1110:begin ID_opcode <= `XORi; ID_Ra <= R[IF_IR[10:8]]; ID_imm_offset[7:0] <= IF_IR[7:0]; end 6'b00_1111:begin ID_opcode <= `SLL; ID_imm_offset[4:0] <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b01_0000:begin ID_opcode <= `SRL; ID_imm_offset[4:0] <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b01_0001:begin ID_opcode <= `SLA; ID_imm_offset[4:0] <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b01_0010:begin ID_opcode <= `SRA; ID_imm_offset[4:0] <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b01_0011:begin ID_opcode <= `NOT; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b01_0100:begin ID_opcode <= `LW; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 33
6'b01_0101:begin ID_opcode <= `SW; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b01_0110:begin ID_opcode <= `MOVi; ID_Ra <= R[IF_IR[8:6]]; ID_imm_offset[7:0] <= IF_IR[7:0]; end 6'b01_0111:begin ID_opcode <= `MOV; ID_Ra <= R[IF_IR[5:3]]; ID_Rb <= R[IF_IR[2:0]]; end 6'b01_1000:begin ID_opcode <= `BEQ; ID_cond <= IF_IR[11:8]; ID_imm_offset[7:0] <= IF_IR[7:0]; end
6'b01_1001:begin ID_opcode <= `BNQ; ID_cond <= IF_IR[11:8]; ID_imm_offset[7:0] <= IF_IR[7:0]; end 6'b01_1010:begin ID_opcode <= `BA; ID_imm_offset[9:0] <= IF_IR[9:0]; end 6'b01_1011:begin ID_opcode <= `NOP; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b01_1100:begin ID_opcode <= `HLT; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]]; ID_Rc <= R[IF_IR[2:0]]; end 6'b01_1101:begin ID_opcode <= `SYSCALL; ID_Ra <= R[IF_IR[8:6]]; ID_Rb <= R[IF_IR[5:3]];
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 34
ID_Rc <= R[IF_IR[2:0]]; end endcase end //Calisma Evresi always@(posedge clk)begin if(~reset_n)begin read_data_n <= 1'b1; write_data_n <= 1'b1; end else begin read_data_n <= 1'b1; write_data_n <= 1'b1; if(branch_taken)begin // EX_opcode <=6'b000000; branch_taken <= 1'b0; end else begin case(ID_opcode) // `ADD : ALU_out_reg <= ID_Rb + ID_Rc; `ADDi : ALU_out_reg <= ID_Ra + ID_imm_offset; `SUB : ALU_out_reg <= ID_Rb - ID_Rc; `SUBi : ALU_out_reg <= ID_Ra - ID_imm_offset; `MUL : ALU_out_reg <= ID_Rb * ID_Rc; `MULi : ALU_out_reg <= ID_Ra * ID_imm_offset; `MULu : ALU_out_reg <= ID_Ra * ID_imm_offset; `CMP : ALU_out_reg <= ID_Rb - ID_Rc; `ANDi : ALU_out_reg <= ID_Ra & ID_imm_offset; `AND : ALU_out_reg <= ID_Rb & ID_Rc; `ORi : ALU_out_reg <= ID_Ra | ID_imm_offset; `OR : ALU_out_reg <= ID_Rb | ID_Rc; `XORi : ALU_out_reg <= ID_Ra ^ ID_imm_offset; `XOR : ALU_out_reg <= ID_Rb ^ ID_Rc; `SLL : ALU_out_reg <= ID_Rb << ID_imm_offset[9:6]; `SRL : ALU_out_reg <= ID_Rb >> ID_imm_offset[9:6]; `SRA : ALU_out_reg <= ID_Rb >> ID_imm_offset[9:6]; `SLA : ALU_out_reg <= ID_Rb >> ID_imm_offset[9:6]; `NOT : ALU_out_reg <= 0 - ID_Ra; `LW : ALU_out_reg <= ID_Ra + ID_Rb; `SW : ALU_out_reg <= ID_Ra + ID_Rb; `MOVi : ALU_out_reg <= {24'b0, ID_imm_offset}; `MOV : ALU_out_reg <= {R[IF_IR], R[IF_IR]}; `BEQ : begin
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 35
if(condition_satisfy(ID_cond))begin for(i = 15; i > 8; i = i-1) ALU_out_reg[i] <= ID_imm_offset[7]; ALU_out_reg[8:1] <= ID_imm_offset[7:0]; ALU_out_reg[0] <=1'b0; branch_taken <= 1'b1; branch_target <= (ID_PC +2) + ALU_out_reg[15:0]; end end `BNQ : begin if(~condition_satisfy(ID_cond))begin for(i = 15; i > 8; i = i-1) ALU_out_reg[i] <= ID_imm_offset[7]; ALU_out_reg[8:1] <= ID_imm_offset[7:0]; ALU_out_reg[0] <=1'b0; branch_taken <= 1'b1; branch_target <= (ID_PC +2) + ALU_out_reg[15:0]; end end `BA : begin for(i = 15; i > 8; i = i-1) ALU_out_reg[i] <= ID_imm_offset[7]; ALU_out_reg[8:1] <= ID_imm_offset[7:0]; ALU_out_reg[0] <=1'b0; branch_taken <= 1'b1; branch_target <= (ID_PC +2) + ALU_out_reg[15:0]; end `NOP : begin branch_taken <= 1'b1; branch_target <= ID_PC - 2; end `HLT : begin branch_taken <= 1'b1; branch_target <= ID_PC - 2; end `SYSCALL :begin branch_taken <= 1'b1; branch_target <= ID_PC - 2; end endcase // Bu bolum Flag operasyonlarini kontrol etmek icin yazilmistir. //
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 36
case(ID_opcode)//2nd part of operation `ADD, `SUB, `CMP, `MUL : begin EX_ALU_out[15:0] <= ALU_out_reg[15:0]; N_Flag <= ALU_out_reg[15]; Z_Flag <= (ALU_out_reg[15:0] == 0); //if(ID_imm_offset[2:0] != 3'b000) begin C_Flag <= ALU_out_reg[16]; V_Flag <= (ALU_out_reg[16] != ALU_out_reg[15]); // end if; end `ADDi, `SUBi : begin EX_ALU_out[15:0] <= ALU_out_reg[15:0]; N_Flag <= ALU_out_reg[15]; Z_Flag <= (ALU_out_reg[15:0] == 0); if(ID_imm_offset[2:0] != 3'b000) begin C_Flag <= ALU_out_reg[16]; V_Flag <= (ALU_out_reg[16] != ALU_out_reg[15]); end end `MULi : begin EX_ALU_out[31:0] <= ALU_out_reg[31:0]; N_Flag <= ALU_out_reg[31]; Z_Flag <= (ALU_out_reg[31:0] == 0); if(ID_imm_offset[2:0] != 3'b000) begin C_Flag <= ALU_out_reg[16]; V_Flag <= (ALU_out_reg[32] != ALU_out_reg[31]); end end `AND, `XOR, `XORi, `OR , `NOT: begin EX_ALU_out[15:0] <= ALU_out_reg[15:0]; N_Flag <= ALU_out_reg[15]; Z_Flag <= (ALU_out_reg[15:0] == 0); end endcase EX_opcode = ID_opcode; EX_Rd_code = ID_Rd_code; end end // process sonu end // calisma evresi sonu /////////////////////////////////////////////////////////////////////////// //Geri Yazma /////////////////////////////////////////////////////////////////////////// always@(posedge clk)begin
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 37
if(~reset_n) for( i = 0; i <16 ; i = i + 1) R[i]<= 0; else begin case (EX_opcode) `ADD, `ADDi, `SUB, `SUBi, `AND, `ANDi, OR, `ORi, `XOR, `XORi, `MUL, `MULi, `MULu, `CMP, `SLL, `SRL, `SRA, `SRL, `NOT : begin R[EX_Rd_code] <= EX_ALU_out; end `LW : R[EX_Rd_code] <= data; `MOVi : R[EX_Rd_code] <= data; endcase end end endmodule
CAF Processor Versiyon1.00
FPGA ile CPU tasarimi Page 38