This shows you the differences between two versions of the page.
cn2:laboratoare:03:exercitii [2021/10/23 14:50] george_mircea.grosu |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | Hinturi generice: | ||
- | Incercati sa folositi semnale cat mai generice. Preferati sa folositi grupuri in loc de tipuri de instructiuni. | ||
- | Checkerul este hard-codat in aceasta faza. | ||
- | **Task 1** (0.5p). Modificați rom.v | ||
- | |||
- | Generați codul mașină corespunzător acestor instrucțiuni folosind tool-ul AVR. | ||
- | <note> | ||
- | * Comandă rulare: **java -jar avrasm.jar input.txt output.txt** | ||
- | * avrasm.jar îl găsiți în secțiunea de **Resurse** | ||
- | </note> | ||
- | |||
- | <code> | ||
- | ldi r29, 10 | ||
- | sts 10, r29 | ||
- | ldi r29, 0 | ||
- | ldi r28, 138 | ||
- | ld r27, y | ||
- | lds r28, 10 | ||
- | mov r27, r28 | ||
- | </code> | ||
- | **Task 2** (0.5p). Simulați unitTestCpu.v | ||
- | |||
- | Unele zone sunt roșii, pentru a investiga ce mai trebuie implementat: | ||
- | * De la instanțe și procese, expandați până ajungeți la cpu.v. Adaugați semnalele în fereastră (rclick -> add to wave window); | ||
- | * Re-lansați (Re-launch). | ||
- | |||
- | **Task 3** (2p). Pentru LDI. Modificati decode_unit.v | ||
- | * Pentru a scrie în registrul Rd, trebuie să controlam 2 semnale: **writeback_value** (control_unit.v) și **signals[CONTROL_REG_RD_WRITE]** (signal_generation_unit.v) | ||
- | |||
- | **Task 4** (2p). Pentru STS. Modificați decode_unit.v | ||
- | * Atenție la calcularea adresei - adică ce valoare atribuim în opcode_imd. Memoria de date e mapată între 0x0040 și 0x00BF. | ||
- | * Pentru a scrie pe bus, trebuie să controlăm 2 semnale: **signals[`CONTROL_REG_RR_READ]** și **signals[`CONTROL_MEM_WRITE]** (signal_generation_unit.v). | ||
- | * Inspectați bus_interface_unit.v | ||
- | * Valoarea scrisă pe bus, este transmisă prin data_to_store din control_unit.v. În acest laborator va fi preluată din variabila de buffer pipeline alu_rr. | ||
- | |||
- | **Task 5** (2p). Pentru LD. Modificati decode_unit.v | ||
- | |||
- | * Trebuie generate mai multe semnale pentru o adresare //indirectă//: | ||
- | * CONTROL_REG_RR_READ și CONTROL_REG_RD_READ în etapa de decode (ID) | ||
- | * CONTROL_MEM_READ în etapa memory access (MEM) | ||
- | * CONTROL_REG_RD_WRITE în etapa register write back (WB) | ||
- | |||
- | * Ultimele două semnale sunt active și pentru o adresare directă a memoriei? Modificați semnalele corespunzatoare în signal_generation_unit.v | ||
- | * Adresa //indirectă// este transmisă la bus_interface_unit prin indirect_address (o cuplare a alu_rr și alu_rd), inspectați control_unit.v | ||
- | * Valoarea scrisă pe bus este transmisă prin writeback_value din control_unit.v. | ||
- | |||
- | **Task 6** (2p). Pentru LDS. Modificati decode_unit.v (Atenție la calcularea adresei) | ||
- | * Pentru a citi de pe bus, trebuie să controlam 2 semnale: **signals[`CONTROL_REG_RD_WRITE]** și **signals[`CONTROL_MEM_READ]** | ||
- | * Inspectați bus_interface_unit.v. | ||
- | * Valoarea scrisă pe bus este transmisă prin writeback_value din control_unit.v. | ||
- | |||
- | **Task 7** (1p). Pentru MOV. Modificati decode_unit.v | ||
- | * Modificați scheletul astfel încât MOV să fie executată corect. | ||
- | |||
- | |||
- | ==Greseli comune intalnite in laborator:== | ||
- | * Ati setat opcode_rr in loc de opcode_rd. | ||
- | * Ati setat opcode_rd in loc de opcode_rr. | ||
- | * Ati calculat adresa directa considerand 7 biti, in loc de adresa specificata in datasheet. La LDS si STS cautati forma {~8, 8, 10, 9, 3, 2, 1, 0}. | ||
- | * Ati uitat sa setati grupurile in decode_unit.v. | ||
- | * Nu ati setat CONTROL_REG_RR_READ si CONTROL_REG_RD_READ pentru toate instructiunile care au nevoie de ele (de ce are nevoie LD Y sa citeasca 2 registre?). | ||
- | * LDI, STS(16-bit) și LDS(16-bit) folosesc doar 4 biti in loc de 5 biti pentru codificarea opcode_rr/opcode_rd. Totusi, aceste instructiuni pot opera doar pe registri R16-R31, asadar o decodificare corectă seteaza bitul cel mai semnificativ al lui opcode_rr/opcode_rd la valoarea 1. | ||
- | * Ati setat o valoare gresita in decode_unit.v | ||
- | * Nu ati adaugat toate semnalele la wave window. Nu ati inspectat unit testele sa vedeti exact care pas returneaza 1'bx, si ce semnale nu sunt pe valorile asteptate. |