This is an old revision of the document!
Folosiți semnale cât mai generice. _ex. Verificați semnalele grupurilor de instrucțiuni in detrimentul tipurilor de instrucțiuni.
Checkerul este hard-codat în aceasta fază.
Pentru punctajul bonus, pe lângă implementarea exercițiilor 6 & 7, trebuie explicat fluxul de execuție al instrucțiunilor LD_Y și STS.
Task 1 (0.5p). Modificați rom.v
Generați codul mașină corespunzător acestor instrucțiuni folosind tool-ul AVR.
input.txt:
ldi r29, 10
sts 10, r29
ldi r29, 0
ldi r28, 138
ld r27, y
lds r28, 10
mov r27, r28
Task 2 (0.5p). Simulați checker_view.v
Unele zone sunt roșii, pentru a investiga ce mai trebuie implementat:
Din fereastra Scope, expandați până ajungeți la instanța _cpu;
Adaugați semnalele din fereastra Objects în fereastra cu semnale (rclick → Add to wave window);
Re-lansați simularea pentru a popula semnalele adăugate (Relaunch Simulation).
Task 3 (2p). Pentru LDI. Modificati decode_unit.v
Task 4 (3p). Pentru STS pe 16 biți. 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 (4p). Pentru LD_Y (i). Modificati decode_unit.v
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 citită din memorie (scrisă de memorie pe magistrală) este transmisă prin writeback_value din control_unit.v.
Task 6 (0.5p BONUS). Pentru LDS pe 16 biți. 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 citită din memorie (scrisă de memorie pe magistrală) este transmisă prin writeback_value din control_unit.v.
Task 7 (0.5p BONUS). Pentru MOV. Modificati decode_unit.v
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.