Zadání závěrečného projektu CPU
Vytvořte vlastní procesor v Logisim Evolution, navrhněte pro něj instrukční sadu, popište ji tak, aby podle dokumentace šel psát strojový kód i assembler, a předveďte funkčnost na krátkém programu.
Nejde o kopii existující architektury, ale o vlastní, konzistentní a obhajitelný návrh. Velkou část parametrů si volíte sami. Důležité je, aby výsledkem byl skutečně programovatelný a obecný procesor, ne jen jednoúčelový sekvenční obvod.
- Obecnost procesoru: procesor musí být schopen realizovat běžné programové konstrukce jako výpočty, práci s pamětí, podmínky a cykly.
- Zajímavé I/O: I/O nemá být jen formální. Navrhněte takové vstupy a výstupy, které dávají smysl i z pohledu programování.
- Programovatelnost: CPU musí jít rozumně programovat v assembleru.
- Jednocyklovost: procesor by měl být alespoň téměř jednocyklový. Ideální stav je, že jedna instrukce znamená jeden takt; případné výjimky musí být malé, dobře zdůvodněné a nesmí z CPU dělat obecně mikrokódovaný vícekrokový automat.
Můžete zvolit akumulátorovou, GPR i jinou ISA, pevnou i variabilní velikost opcode, Harvard i Von Neumann architekturu, vlastní flagy i vlastní způsob I/O. Hodnotí se hlavně konzistence návrhu, kvalita dokumentace a to, zda se na CPU dá skutečně něco rozumného naprogramovat.
Co musí procesor umět
V návrhu musí být možné, přímo nebo pomocí krátké posloupnosti instrukcí, realizovat alespoň následující schopnosti:
- provést ALU operaci nad daty v CPU
- přesouvat data mezi registry
- načítat a ukládat data do paměti na vypočtenou adresu
- načíst konstantu z instrukce do registru
- změnit tok programu skokem
- rozhodovat se podle podmínky
- komunikovat s I/O zařízeními
Ne každá z těchto věcí musí být nutně jedna konkrétní instrukce. Je přípustné některé operace realizovat kombinací více instrukcí, pokud to zůstane rozumné, zdokumentované a v ukázkovém programu předvedené.
Aby byl procesor považován za obecný, musí na něm jít psát programy s cykly, větvením a prací nad proměnnými daty, ne pouze pevná lineární posloupnost kroků.
Co se odevzdává
Součástí projektu jsou čtyři hlavní výstupy:
- dokumentace procesoru
- samotný procesor jako obvod v Logisimu
customasmdefinice instrukční sady (#ruledef, případně#subruledef)- jednoduchý výpočetní program v assembleru pro váš procesor
1. Dokumentace procesoru
Dokumentace je klíčová část projektu. Musí být dostatečně přesná na to, aby podle ní šlo:
- pochopit architekturu procesoru
- ručně zakódovat instrukci do strojového kódu
- napsat
customasmpravidla - napsat a odladit jednoduchý program
Dokumentace má být psaná věcně a odborně. Má být stručná, ale úplná: není cílem psát dlouhé omáčky, ale přesně a jednoznačně popsat vše, co je potřeba pro pochopení a používání procesoru.
Jako inspiraci si projděte příklady známých architektur. Skutečné dokumentace reálných procesorů bývají velmi rozsáhlé a jdou do mnohem větší hloubky. Vaše dokumentace nemusí být tak dlouhá ani tak detailní, ale musí přesně popsat základní princip operace procesoru a jeho instrukcí.
Jednou z nejdůležitějších povinných částí dokumentace je tabulka mapování instrukcí do strojového kódu. Nestačí pouze slovní popis instrukcí. Musí existovat přehledná tabulka, ze které bude na první pohled patrné, jak vypadají formáty všech instrukcí a co znamenají jednotlivá bitová pole.
Minimální obsah dokumentace
Dokumentace musí obsahovat alespoň:
- stručný popis architektury CPU
- zvolené šířky:
- dat
- adres
- instrukcí
- registrů a pamětí
- informaci, zda jde o Harvard nebo Von Neumann architekturu
- popis všech programátorsky viditelných registrů
- popis speciálních registrů, pokud existují
- popis příznaků (
flags), pokud existují - popis datové paměti, instrukční paměti a jejich role
- popis všech I/O rozhraní a jejich programátorského použití
- kompletní seznam instrukcí
U každé instrukce musí být uvedeno
- jméno instrukce a její assemblerová syntaxe
- význam operandů
- chování instrukce slovně nebo v pseudokódu
- odkud instrukce čte data a kam ukládá výsledek
- jak se chová vůči
PC - jak ovlivňuje
flags, pokud nějaké používáte - binární formát instrukce
- význam jednotlivých bitových polí
- způsob kódování operandů
- případná omezení, zakázané kombinace nebo nedefinované chování
Dále se požaduje
- tabulka mapování instrukcí do strojového kódu
- jasný popis adresních režimů, pokud jich procesor používá více
- popis práce s immediate hodnotami
- popis podmíněného větvení nebo jiného mechanismu podmíněného vykonání
- popis toho, jak CPU realizuje požadované obecné schopnosti z předchozí sekce
- zdůvodnění hlavních návrhových rozhodnutí a kompromisů
Tabulka mapování instrukcí
Tabulka mapování instrukcí je povinná. Doporučený formát je spreadsheet, typicky Excel nebo LibreOffice Calc, případně jiný ekvivalentní tabulkový editor.
Očekává se tabulka, ve které:
- každý řádek odpovídá jedné instrukci nebo jedné konkrétní variantě instrukce
- bity instrukce jsou znázorněny v úzkých sloupcích
- související bity tvoří pomocí
merge cellsjedno společné pole - v každém takto sloučeném poli je napsáno, co dané bity znamenají
- bity s pevnou hodnotou jsou vizuálně odlišené, typicky podmíněným formátováním
- je na první pohled vidět, které bity jsou
0a které1, například červeně a zeleně - napravo od bitového formátu je uvedena assemblerová syntaxe instrukce včetně operandů
V tabulce musí být alespoň
- název nebo mnemonika instrukce
- assemblerová syntaxe instrukce včetně operandů
- úplný bitový formát instrukce
- vyznačený opcode
- vyznačené operandové části instrukce
- popis významu každého operandového pole
- informace, co se do daného pole zapisuje:
- číslo registru
- immediate hodnota
- podmínka
- ALU podoperace
- směr přenosu
- nebo jiný význam podle vašeho návrhu
- pokud je to relevantní, i poznámka k šířce a interpretaci hodnoty, například zda jde o
u8,s8nebo adresu
Detailní informace o parametrech instrukcí, jejich významu, omezeních nebo chování nemusí být nutně všechny přímo v tabulce. Mohou být kdekoliv v dokumentaci, pokud je dokumentace jako celek úplná a přehledná.
Na druhou stranu platí, že pokud tabulka mapování instrukcí obsahuje všechny důležité informace o instrukcích přehledným a dobře čitelným způsobem, není nutné tyto informace znovu duplicitně přepisovat jinam. Tabulka je v takovém případě plnohodnotnou a nedílnou součástí dokumentace.
Úprava tabulky
Na vizuální úpravě záleží. Tabulka má být přehledná a rychle čitelná.
Očekává se zejména:
- rozumné řazení instrukcí, například podle opcode, podle délky opcode nebo po skupinách podobných instrukcí
- konzistentní práce s barvami
- konzistentní orientace bitů, typicky
MSBvlevo aLSBvpravo - viditelné oddělení konstantních bitů od operandů
- dostatečně popsaná hlavička tabulky
Pokud budou mít podobné typy operandů v různých instrukcích podobné pozice, tabulka bude přehlednější a současně se vám tím zjednoduší návrh řídicí logiky i customasm pravidel.
Dobrá dokumentace má být dostatečně přesná na to, aby si jiný člověk podle ní dokázal ručně zakódovat několik instrukcí, napsat malý program v assembleru a pochopit, proč procesor funguje právě takto.
2. Procesor jako obvod v Logisimu
V Logisim Evolution vytvořte skutečný procesor, který odpovídá vaší dokumentaci.
Požadavky na obvod
- jde o synchronní sekvenční obvod
- obsahuje programovou paměť a mechanismus načítání instrukcí
- obsahuje
PCa bez skokové instrukce postupuje na další instrukci - umí vykonat instrukce popsané v dokumentaci
- je programovatelný pomocí strojového kódu odpovídajícího navržené ISA
- je alespoň téměř jednocyklový
- Použijte registrovou banku
- Jako ALU procesoru použijte jedno z:
- Vaše ALU z předchozí úlohy
- Vaše ALU, ale upravené tak, aby vám lépe fungovalo v procesoru (větší data, další/jiné operace, Logisimová aritmetika, etc.)
- Postavte nové alespoň stejně dobré ALU jako požaduje zadání jeho úkolu (ale můžete použít Logisimovou aritmetiku pro zjednodušení)
- Všechny stavové registry procesoru se budou ukazovat v záložce "State" v Logisimu
- Celý procesor lze ovládat z jednoho přehledného místa o velikosti jedné obrazovky
- tzn. IO, clock, atd. by měly být pohromadě
- stav registrů musí být vidět taky - ale na to stačí ta záložka "State"
- je výhodné (pro vás i pro mě), aby odsud bylo vidět i kterou instrukci CPU spouští
- buď tam můžete umístit celý instrukční dekodér, nebo sadu LED diod, které se rozsvítí podle toho, jaká instrukce se pouští
V návrhu se očekává
- datová cesta odpovídající sadě instrukcí
- kontrolní jednotka, která instrukci dekóduje na kontrolní signály
- rozumně navržená sada registrů
- podpora práce s pamětí
- podpora podmínek, pokud je CPU používá
- podpora I/O
Kvalita návrhu
- všechny důležité signály, registry, sběrnice, piny a IO moduly musí být pojmenované
- šířky vodičů musí být konzistentní a jednoznačné
- v diagramu musí být zřejmé, kudy tečou data a odkud se berou kontrolní signály
- pokud používáte flagy nebo stavové signály, musí být zřejmé, kde vznikají a kde se používají
- pokud má některá instrukce výjimku z jednocyklovosti, musí to být z návrhu i dokumentace patrné
I/O
I/O je významná část projektu. Očekává se, že navrhnete něco zajímavějšího než pouze formální jeden vstup a jeden výstup.
Vhodné příklady:
- tlačítka nebo přepínače jako vstup a LED nebo hex displej jako výstup
- klávesnice a TTY
- LED matrix
- vlastní paměťově mapované nebo instrukčně ovládané periferie
Nejde jen o připojení periferie k procesoru, ale i o to, aby ji šlo smysluplně použít v programu.
3. customasm ruledef pro procesor
K procesoru vytvořte customasm definici, která odpovídá vaší ISA a umožní generovat strojový kód pro Logisim.
Požaduje se
- korektní
#ruledefpro všechny instrukce, které používáte #subruledefvšude, kde dává smysl, např. pro registry, podmínky nebo podvarianty instrukcí- správně nastavená šířka instrukční paměti a exportu
- konzistence mezi dokumentací, assemblerem a skutečným hardwarem
V customasm je potřeba správně nastavit #bankdef podle šířky vašich instrukcí. Jinak bude assembler generovat výstup v jiném formátu, než jaký očekává váš procesor v Logisimu. Také je potřeba vyexportovat soubor ve formátu pro Logisim paměť správné šířky. Pokud jednu nebo obě tyto věci zanedbáte, nepřenese se strojový kód do Logisimu správně.
Příklad pro procesor s 22bit instrukcí:
#bankdef code ; na nazvu nezalezi
{
#bits 22 ; upravte podle sirky instrukci
#addr 0x0000
#size 0x8000 ; upravte podle velikosti vasi ROM
#outp 0x0000
}
Je vhodné doplnit
- pseudoinstrukce, pokud zjednoduší programování
- komentáře vysvětlující méně zjevné části kódování
- krátký příklad použití assembleru
Pokud se liší dokumentace, customasm pravidla a chování procesoru v Logisimu, je to chyba návrhu. Všechny tři vrstvy musí popisovat stejný procesor.
4. Jednoduchý výpočetní program v customasm
Napište krátký program, který na vašem CPU skutečně něco počítá a zároveň předvede důležité vlastnosti návrhu.
Program musí ukázat
- aritmetiku nebo jiný netriviální výpočet
- práci s registry
- alespoň jednu řídicí konstrukci:
- podmínku
- cyklus
- nebo obojí
- smysluplné použití I/O
Program nemá být pouze
- jednorázové nastavení několika registrů
- lineární posloupnost bez rozhodování
- prosté vypsání konstant bez výpočtu
- výpočty na neinicializovaných nebo nulových registrech
Co k programu doplňte
- stručný popis, co program dělá
- jaké má vstupy
- co je jeho výstup
- jak se program spouští v Logisimu
- proč je zvolený program vhodný jako ukázka schopností CPU
Vhodné příklady programů:
- součet nebo průměr několika hodnot
- maximum nebo minimum v poli
- násobení opakovaným sčítáním nebo square a multiply
- výpočet faktoriálu nebo mocniny v malé datové šířce
- zpracování vstupu z klávesnice nebo přepínačů a zobrazení výsledku na displeji, TTY nebo LED matrixi
- fibonacciho posloupnost
- collatzova konjektura
- výpočet GCD nebo LCM
- ...
Zkrátka, ukázkový program by měl demonstrovat, že chápete programování v asembleru, a měl dostatečně využívat výpočetní sílu vašeho procesoru.
Pokud máte nějaký nápad a chtěli byste pomoct odhadnout komplexitu implementace v assembleru, můžete mi napsat.Doporučení k návrhu
- Začněte návrhem ISA a teprve z ní odvozujte datovou cestu.
- U každé instrukce si explicitně rozmyslete, odkud tečou data a kam se ukládají.
- Snažte se, aby podobné operandy byly ve strojovém kódu na podobných pozicích.
- Pokud některou schopnost omezíte, vždy si ověřte, že ji lze pohodlně nahradit krátkou sekvencí jiných instrukcí.
- Zvažujte jednoduchost hardware a jednoduchost programování zároveň.
Studijní opora
Při návrhu vycházejte zejména z:
- Materiálů na moodlu
- Poznámky z hodin
- Jednoduché architektury (ISA)
- customasm
- CPU - Programování