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 destul de hard-codat in aceasta faza. Cuvantul asistentului ramane final la corectare.

Task 1 (0.5p). rom.v Generati codul acesta folosind toolul 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). simulati unitTestCpu.v

Unele zone sunt rosii, pentru a investiga ce mai trebuie implementat: De la instante si procese, expandati pana ajungeti la cpu.v. Adaugati semnalele la fereastra (rclick → add to wave window). Re-lansati (Re-launch).

Task 3 (2p). Pentru LDI. Modificati decode_unit.v

Pentru a scrie in registrul Rd, trebuie sa controlam 2 semnale: writeback_value (control_unit.v) si signals[CONTROL_REG_RD_WRITE] (signal_generation_unit.v)

Task 4 (2p). Pentru STS. Modificati 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 sa controlam 2 semnale: signals[`CONTROL_REG_RR_READ] si signals[`CONTROL_MEM_WRITE] (signal_generation_unit.v).

Inspectati bus_interface_unit.v.

Valoarea scrisa pe bus, este transmisa prin data_to_store din control_unit.v. La acest laborator va fi preluata 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? Modificati semnalele corespunzatoare în signal_generation_unit.v .

Adresa indirecta este transmisa la bus_interface_unit prin indirect_address (o cuplare de alu_rr si alu_rd), inspectați control_unit.v.

Valoarea scrisa pe bus este transmisa 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 sa controlam 2 semnale: signals[`CONTROL_REG_RD_WRITE] si signals[`CONTROL_MEM_READ]

Inspectati bus_interface_unit.v.

Valoarea scrisa pe bus este transmisa prin writeback_value din control_unit.v.

Task 7 (1p). Pentru MOV. Modificati decode_unit.v

Modificati scheletul astfel incat mov sa fie executata 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.
cn2/laboratoare/03/exercitii.1571396066.txt.gz · Last modified: 2019/10/18 13:54 by serban_ioan.ciofu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0