Processen en processoren/Planning/Practica/Practicum 1
In dit practicum construeer je een eigen microprocessor uit gates/poorten en voorgegeven bouwstenen. Ik beveel aan de opdracht in groepjes van twee studenten te maken. Zie /groepsindeling voor de groepen.
Inhoud
Tool: HADES
De processor construeer je gebruikmakend van de tool HADES. In deze simulatietool kun je poorten en verbindingen daartussen tekenen, je ontwerp hierarchisch ordenen (met subdesigns) en het geheel simuleren.
Hierarchisch ontwerp
Je kunt een ontwerp in HADES verdelen over meerdere bestanden. Maak eerst de basisbouwsteen, sla hem op en kies in het menu Edit > Create Symbol. Daarna kun je in een ontwerp op een hoger niveau met contextmenu > Create > Create subdesign... de basisbouwsteen als blokje openen. De Ipins van de basisbouwsteen worden invoerlijnen van het blokje, de Opins worden uitvoerlijnen.
Tips voor gebruik van HADES
Kijk in de HADES-Kurzreferenz (duits) of het HADES-tutorial (engels). Het is handig een aantal sneltoetsen te kennen:
- m verschuif de component onder de muis; M verschuif het draadeinde onder de muis
- c kopiëer de component onder de muis
- e bewerk het subdesign onder de muis of de parameters van de component onder de muis (b.v. aantal bits van een register)
- w creëer een aftakking van het draadje onder de muis
- x wis het draadsegment onder de muis
- z zoom out; Z zoom in
Meer sneltoetsen vind je op pagina 47 van de HADES-tutorial.
Meer tips
- Het is handig om alle designs in één enkele map te plaatsen. HADES slaat altijd het absolute pad van een subdesign op; daarom kun je subdesigns niet zonder meer verplaatsen. Als je dat toch wilt, moet je elk superdesign in een teksteditor bewerken en het absolute pad veranderen.
- Als de aansluitingen van een component op de juiste plaats lijken te liggen maar niet werken, probeer contextmenu > wire > autoconnect SimObject. Dan worden alle in- en uitgangen van het object waar de muis naar wijst aangesloten aan draadjes die op de juiste plek liggen.
Opdrachtomschrijving
Beschrijving van de CPU. In dit bestand staan ook een aantal tips die je helpen de CPU te bouwen.
Aanvullingen
- De 5-bits-constanten die je bij sommige instructies kunt opgeven en de displacement worden d.m.v. sign extension opgeschaald naar 16-bits-constanten.
- In de opdrachtomschrijving staat dat je op 25 maart het eerste deel van het verslag moet inleveren. Daarmee bedoel ik: de principiële opbouw van de CPU (een schema van de datastromen tussen de onderdelen) en eventuele keuzes die je nu al hebt gemaakt, b.v. als je wilt afwijken van het schema in figuur 1 van de opdrachtomschrijving.
- Er stond een fout in de beschrijving van READ en WRITE die ik op 25 maart heb gecorrigeerd.
- Je mag naast de rtlib-bestanddelen die in de opdrachtomschrijving genoemd worden ook andere bestanddelen gebruiken die ongeveer even complex zijn. rtlib > logic > Or kan je b.v. helpen de zero-vlag te berekenen; rtlib > io > SelectBit kun je gebruiken om één bit uit een vector te kiezen.
- Sommigen combineren een klok-invoer met een enable-invoer (met het idee dat de combinatie-invoer alleen van 0 naar 1 springt als een waarde in het register moet worden opgeslagen). Dat is gevaarlijk: Het kan gebeuren dat tijdens een berekening die invoer even op 1 springt en gelijk daarna weer op 0, omdat ergens een vertraging zit. Dan worden waarden per ongeluk in het register opgeslagen. Gebruik in dergelijke gevallen altijd een register of flipflop met een aparte enable-invoer.
- De deadline van dinsdag 21 april 2011 wordt opgeschoven tot 14.00 uur, zodat je ook na het hoorcollege nog jouw uitwerking kunt doorsturen.
Deadlines
Let op de vier deadlines die in de beschrijving van de CPU vermeld staan. Als je een deadline mist heeft dat gevolgen voor je cijfer!
Inleveren: Je kunt de uitwerking per e-mail sturen naar David N. Jansen, D.(mijn achternaam)@cs.ru.nl. Het voorbeeldprogramma mag je alternatief direct in de subpagina /voorbeeld invoeren.
Hulpbestanden
- computer.hds is een globaal design waar je je CPU in kunt plakken. (Enige verschil met vorig jaar: de klok loopt nu iets sneller.)
- Het RAM wordt automatisch geinitialiseerd met de gegevens die in bestand hello.rom staan (in dezelfde directory als computer.hds). Je kunt b.v. het .rom-bestand van het eerste voorbeeldprogramma gebruiken. Als je het RAM wilt bekijken of veranderen, kies het menupunt “edit” (of toets 'e' terwijl de muis naar het RAM wijst).
- assembler.c is een eenvoudige assembler voor de assembly-taal die de opgave voorschrijft.
- In deze assembler heb ik aan de mnemonics die in de opdrachtomschrijving staan instructies Jcc label toegevoegd die je kunt gebruiken om sprongen op te schrijven. Een dergelijke mnemonic wordt intern vertaald als ADDIFcc R7,label – (adres van de instructie+1), zodat je niet zelf de adressen hoeft uit te rekenen.
Met een slangetje ~ voor het source-register kun je aangeven dat de not-bit gezet moet worden. Voorbeeld: MOVIFT R3, ~R6 plaatst dus het geïnverteerde bitpatroon van R6 in R3.
- In deze assembler heb ik aan de mnemonics die in de opdrachtomschrijving staan instructies Jcc label toegevoegd die je kunt gebruiken om sprongen op te schrijven. Een dergelijke mnemonic wordt intern vertaald als ADDIFcc R7,label – (adres van de instructie+1), zodat je niet zelf de adressen hoeft uit te rekenen.
- Voorbeeldprogramma's voor de practicum-assembler. Om deze pagina te bekijken moet je inloggen (studenten mogen publieke pagina's niet bewerken).
- relocate.sh is een programma dat het makkelijker maakt HADES-bestanden van iemand anders te gebruiken.
- Ga in een shell (of commando-venster) naar de map waarin de .hds-bestanden staan en start daar relocate.sh op. Het programma vervangt alle absolute paden van subdesigns door „./”, d.w.z. er wordt aangenomen dat de subdesign in dezelfde map staat als de hoofddesign.
- Als je sommige esoterische ingebouwde componenten gebruikt worden die na het toepassen van deze utility niet meer correct weergegeven; dan moet je het backup-bestand (.hds.bak) terughalen en met de hand bewerken.
Correctie
Ik heb op Pinkstermaandag de laatste uitwerkingen nagekeken en de cijfers in Blackboard gezet. Veel van de ingeleverde uitwerkingen waren incompleet. Daarom heb ik een manier bedacht die het mij toestaat om ook bij incomplete uitwerkingen tot een beoordeling te komen: Voor elk belangrijk onderdeel kreeg de student punten, en voor elk werkend instructieformaat ook. De punten werden als volgt verdeeld:
- Registerbank: max. 1 pt
- Veel voorkomende fouten:
- Het moet mogelijk zijn om tegelijk twee registers te lezen en één van die registers te veranderen. Sommigen hebben slechts één register aangesloten.
- Maar niet in elke klokcyclus worden registers veranderd; zie de opmerking hieronder bij vlaggen.
- Vlaggen (opslag voor de vier vlaggen): max. 0,5 pt
- Veel voorkomende fouten:
- De enable-invoer wordt niet goed gedefinieerd. (Omdat niet in elke klokcyclus de vlaggen veranderen, moet er een mogelijkheid zijn om de vlaggen op hun oude waarde te laten staan.) Het is overigens gevaarlijk om de enable- en de klok-invoer samen te voegen; als de enable-invoer dan op een ongunstig moment van 0 naar 1 springt veranderen gelijk de vlaggen terwijl dat eigenlijk alleen mag op het moment dat de klok-invoer van 0 naar 1 springt.
- Tester (onderzoekt of de vlaggen voldoen aan de gegeven voorwaarde): max. 0,75 pt
- Timer (zorgt ervoor dat fetch- en execute-fase elkaar afwisselen): max. 0,75 pt
- Veel voorkomende fouten:
- Na een reset begint de processor met een heel korte fetch-cyclus omdat hij niet wacht tot een gunstig moment voor een (normaal lange) fetch-cyclus.
- De HALTED-uitvoer staat op 1 totdat de eerste instructie uitgevoerd wordt, omdat het instructieregister bij de reset op 0 gezet wordt.
- ALU: max. 1,25 pt
- Veel voorkomende fouten:
- De vlaggenberekeningen kloppen niet. Bij voorbeeld wordt de carry-vlag altijd gezet op basis van de som van de invoeren, zelfs als een andere operatie gekozen is. De overflow-vlag moet na additie gezet worden volgens de regels die ik in het hoorcollege van 22 februari heb uitgelegd.
- Instructies fetchen en uitvoeren: max. 3,5pt (0,5 pt voor fetchen en 0,5 pt per instructieformaat)
- Veel voorkomende fouten:
- In de fetch-fase wordt de programmateller niet opgehoogd, of wordt niet nRE=0 gezet.
- Een signed constant wordt niet volgens de regels van sign extension opgeschaald. Bij voorbeeld moet 0 1110bin opgeschaald worden naar 0000 0000 0000 1110bin en 1 0010bin naar 1111 1111 1111 0010bin.
- LOADHI vermenigvuldigt zijn constante niet met 16 of verandert de vlaggen.
- De not-bit in de instructie wordt verkeerd behandeld. Het is niet de bedoeling dat het registernummer wordt geïnverteerd (dat zou de programmeur kunnen doen door een ander registernummer te kiezen – een dergelijke feature is zinloos), maar de registerinhoud (dat kan pas terwijl het programma wordt uitgevoerd – die feature is wel zinvol en maakt het mogelijk met ADDC een subtractie uit te voeren).
- Verslag: max. 1 pt
- Assembly-programma: max. 0,5 pt
- Veel voorkomende fouten:
- Er wordt niet uitgelegd wat het programma doet en welke uitkomst gewenst is.
- Een programma moet een zichtbaar resultaat produceren en eindigen met HALT.
Algemeen veel voorkomende fouten:
- Kortsluitingen (ca. 0,2 pt aftrek)
- Slordige tekening met lijnen over componenten heen of componenten over elkaar heen (ca. 0,1–0,2 pt aftrek)
- onduidelijke namen van signalen, b.v. „i0” of „reset” i.p.v. „notreset”.
Het cijfer voor het practicum is het aantal punten + 0,75. Zo hoefde ik niemand die (een deel van) het practicum heeft gedaan een cijfer ≤ 1 te geven. Het gemiddelde cijfer is 6,665. Zie ook deze statistiek.