This is an old revision of the document!
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.
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 unitTestCpu.v
Unele zone sunt roșii, pentru a investiga ce mai trebuie implementat:
Task 3 (2p). Pentru LDI. Modificati decode_unit.v
Task 4 (2p). 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 (2p). 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ă de 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 citită de pe bus este transmisă prin writeback_value din control_unit.v.
Task 7 (1p). 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.