Differences

This shows you the differences between two versions of the page.

Link to this comparison view

cn2:laboratoare:03:exercitii [2023/10/24 22:25]
laura_elena.nicoara
— (current)
Line 1: Line 1:
-<note tip> 
-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//​. ​ 
-</​note>​ 
  
-**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 **[[https://​ocw.cs.pub.ro/​courses/​cn2/​laboratoare/​03#​resurse|Resurse]]** 
-</​note>​ 
-    
-//​input.txt://​ 
-<​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 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 
-  * Pentru a scrie în registrul Rd, trebuie să controlam 2 semnale: 
-    * **writeback_value** (control_unit.v) - valoarea constantei K din corpul instrucțiunii;​ 
-    * **signals[CONTROL_REG_RD_WRITE]** (signal_generation_unit.v) - activat pentru a permite scrierea în registrul destinație,​ în stagiul WB. 
- 
-**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. 
- 
-<​hidden>​ 
-<​note>​Instrucțiunea STS folosește registrul ''​Rr'',​ în opcode ar trebui să fie 4 litere ''​r'',​ nu ''​d''​.(În [[http://​ww1.microchip.com/​downloads/​en/​devicedoc/​atmel-0856-avr-instruction-set-manual.pdf|AVR Instruction Set Manual]] e un typo.)</​note>​ 
-</​hidden>​ 
- 
-**Task 5** (4p). Pentru LD_Y (i). 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 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 
-  * 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. 
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