Differences

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

Link to this comparison view

ac-is:tutoriale:3-ise-debug [2021/09/20 18:36]
127.0.0.1 external edit
ac-is:tutoriale:3-ise-debug [2021/10/03 14:16] (current)
eduard.ciurezu
Line 1: Line 1:
-= Debugging folosind Xilinx ISE =+====== Debugging folosind Xilinx ISE ======
  
 +/*
 <note tip> <note tip>
 Tutorialul este disponibil și sub formă de slideshow apăsând pe imaginea de mai jos. Tutorialul este disponibil și sub formă de slideshow apăsând pe imaginea de mai jos.
Line 6: Line 7:
 {{gallery>​.:​3-ise-debug?​lightbox&​0&​~1}} {{gallery>​.:​3-ise-debug?​lightbox&​0&​~1}}
 </​note>​ </​note>​
 +*/
  
   * Tutorialul își propune depanarea unui modul folosind uneltele de debugging puse la dispoziție de simulatorul ISim, integrat în Xilinx ISE. Ca exemplu, se va folosi un sumator cu propagare a transportului (ripple carry). O posibilă implementare în Verilog a acestuia, care conține câteva greșeli, este prezentată în figura următoare.   * Tutorialul își propune depanarea unui modul folosind uneltele de debugging puse la dispoziție de simulatorul ISim, integrat în Xilinx ISE. Ca exemplu, se va folosi un sumator cu propagare a transportului (ripple carry). O posibilă implementare în Verilog a acestuia, care conține câteva greșeli, este prezentată în figura următoare.
 +
 {{ .:​3-ise-debug:​01.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​01.jpg?​direct&​400 |}}
 +
   * Modulul de test folosit pentru simulare este următorul.   * Modulul de test folosit pentru simulare este următorul.
 +
 {{ .:​3-ise-debug:​02.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​02.jpg?​direct&​400 |}}
 +
   * Simularea inițială a modului poate fi observată în figura următoare. Se observă că semnalul ''​sum''​ conține valori nedefinite (''​x''​) pe toată durata de simulare a modulului.   * Simularea inițială a modului poate fi observată în figura următoare. Se observă că semnalul ''​sum''​ conține valori nedefinite (''​x''​) pe toată durata de simulare a modulului.
 +
 {{ .:​3-ise-debug:​03.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​03.jpg?​direct&​400 |}}
 +
   * Pentru a ne ușura analiza semnalelor vom schimba modul în care aceastea sunt afișate. Apăsând //​click-dreapta//​ pe un semnal vom alege ca acesta să fie afișat ca un număr în baza 10, fără semn.   * Pentru a ne ușura analiza semnalelor vom schimba modul în care aceastea sunt afișate. Apăsând //​click-dreapta//​ pe un semnal vom alege ca acesta să fie afișat ca un număr în baza 10, fără semn.
 +
 {{ .:​3-ise-debug:​04.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​04.jpg?​direct&​400 |}}
 + 
   * După ce schimbăm toate semnalele, diagrama va arăta în felul următor.   * După ce schimbăm toate semnalele, diagrama va arăta în felul următor.
 +
 {{ .:​3-ise-debug:​05.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​05.jpg?​direct&​400 |}}
 +
   * Putem expanda un semnal pe mai multi biți pentru a inspecta toți biții acestuia.   * Putem expanda un semnal pe mai multi biți pentru a inspecta toți biții acestuia.
 +
 {{ .:​3-ise-debug:​06.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​06.jpg?​direct&​400 |}}
 +
   * Se poate observa că doar bitul 7 din ''​sum''​ este nedefinit.   * Se poate observa că doar bitul 7 din ''​sum''​ este nedefinit.
 +
 {{ .:​3-ise-debug:​07.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​07.jpg?​direct&​400 |}}
 +
   * Putem vedea variabilele interne ale unui modul dacă selectăm instanța acestuia din lista de instanțe. În cadrul ierarhiei, modulul nostru se află imediat sub modulul //​test_adder//​ iar instanța acestuia se numește //uut// (//unit under test//).   * Putem vedea variabilele interne ale unui modul dacă selectăm instanța acestuia din lista de instanțe. În cadrul ierarhiei, modulul nostru se află imediat sub modulul //​test_adder//​ iar instanța acestuia se numește //uut// (//unit under test//).
-  ​{{ .:​3-ise-debug:​08.jpg?​direct&​400 |}}+ 
 +{{ .:​3-ise-debug:​08.jpg?​direct&​400 |}} 
   * Putem deschide codul sursă al unei instanțe în simulator făcând //​dublu-click//​ pe aceasta.   * Putem deschide codul sursă al unei instanțe în simulator făcând //​dublu-click//​ pe aceasta.
 +
 {{ .:​3-ise-debug:​09.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​09.jpg?​direct&​400 |}}
 +
   * În cadrul editorului de cod putem activa un breakpoint la linia curentă folosind tasta //F9// sau făcând click pe porțiunea gri din dreapta numărului liniei.   * În cadrul editorului de cod putem activa un breakpoint la linia curentă folosind tasta //F9// sau făcând click pe porțiunea gri din dreapta numărului liniei.
 {{ .:​3-ise-debug:​10.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​10.jpg?​direct&​400 |}}
 +
   * În continuare vom activa 2 breakpoint-uri,​ la liniile 35 și 37, pentru a putea inspecta starea variabilelor în fiecare iterație și la sfârșitul ciclului.   * În continuare vom activa 2 breakpoint-uri,​ la liniile 35 și 37, pentru a putea inspecta starea variabilelor în fiecare iterație și la sfârșitul ciclului.
 +
 {{ .:​3-ise-debug:​11.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​11.jpg?​direct&​400 |}}
 +
   * Repornim simularea folosind butonul //​Restart//​.   * Repornim simularea folosind butonul //​Restart//​.
 +
 {{ .:​3-ise-debug:​12.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​12.jpg?​direct&​400 |}}
 +
   * Se poate observa că la începutul simulării toate variabilele instanței //uut// sunt nedefinite, lucru normal deoarece simularea nu a început încă .   * Se poate observa că la începutul simulării toate variabilele instanței //uut// sunt nedefinite, lucru normal deoarece simularea nu a început încă .
 +
 {{ .:​3-ise-debug:​13.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​13.jpg?​direct&​400 |}}
 +
   * Folosim butonul //Run All// pentru a porni simularea continuă.   * Folosim butonul //Run All// pentru a porni simularea continuă.
 +
 {{ .:​3-ise-debug:​14.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​14.jpg?​direct&​400 |}}
 +
   * Simularea se va opri la orice breakpoint întâlnit. În cazul nostrul, primul breakpoint întâlnit este cel de la linia 35, iar simularea se va opri **înainte** de a executa instrucțiunea de la linia 35. În acest moment al simulării putem vedea că ambele intrări ale modului au valoarea 0, contorul ciclului are valoarea 0 (ne aflăm în prima iterație), iar ieșirile sunt încă nedefinite, deoarece încă nu le-am atribuit nici o valoare.   * Simularea se va opri la orice breakpoint întâlnit. În cazul nostrul, primul breakpoint întâlnit este cel de la linia 35, iar simularea se va opri **înainte** de a executa instrucțiunea de la linia 35. În acest moment al simulării putem vedea că ambele intrări ale modului au valoarea 0, contorul ciclului are valoarea 0 (ne aflăm în prima iterație), iar ieșirile sunt încă nedefinite, deoarece încă nu le-am atribuit nici o valoare.
 +
 {{ .:​3-ise-debug:​15.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​15.jpg?​direct&​400 |}}
 +
   * Vom rula simularea în continuare folosind butonul //Run All//. Simularea se va opri din nou la breakpoint-ul de la linia 35, însă în momentul acesta ne aflăm în a doua iterație a ciclului. Putem vedea lucrul acesta inspectând valoarea contorului, care este 1 (prima valoare a contorului a fost 0). În această iterație vedem că primul bit al lui ''​sum''​ a fost setat la valoarea 0.   * Vom rula simularea în continuare folosind butonul //Run All//. Simularea se va opri din nou la breakpoint-ul de la linia 35, însă în momentul acesta ne aflăm în a doua iterație a ciclului. Putem vedea lucrul acesta inspectând valoarea contorului, care este 1 (prima valoare a contorului a fost 0). În această iterație vedem că primul bit al lui ''​sum''​ a fost setat la valoarea 0.
 {{ .:​3-ise-debug:​16.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​16.jpg?​direct&​400 |}}
 +
   * Rulăm în continuare simularea, folosind butonul //Run All//, până când execuția ciclului se termină și ajungem la breakpoint-ul de la linia 37. În acest moment, pentru o implementare corectă, suma celor două intrări ar trebui să fie calculată complet. Observăm însă că cel mai semnificativ bit al lui ''​sum''​ a rămas nedefinit. Înseamnă că ciclul nostru s-a terminat prea repede. Inspectând condiția de oprire, vedem că ieșirea din ciclu se face când ''​i''​ devine 7. Iterația corespunzătoare lui ''​i == 7''​ nu se execută, ceea ce explică de ce bitul 7 din ''​sum''​ este nedefinit.   * Rulăm în continuare simularea, folosind butonul //Run All//, până când execuția ciclului se termină și ajungem la breakpoint-ul de la linia 37. În acest moment, pentru o implementare corectă, suma celor două intrări ar trebui să fie calculată complet. Observăm însă că cel mai semnificativ bit al lui ''​sum''​ a rămas nedefinit. Înseamnă că ciclul nostru s-a terminat prea repede. Inspectând condiția de oprire, vedem că ieșirea din ciclu se face când ''​i''​ devine 7. Iterația corespunzătoare lui ''​i == 7''​ nu se execută, ceea ce explică de ce bitul 7 din ''​sum''​ este nedefinit.
 +
 {{ .:​3-ise-debug:​17.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​17.jpg?​direct&​400 |}}
 +
   * Modificăm codul corectând cu condiția corectă: ''​i < 8''​.   * Modificăm codul corectând cu condiția corectă: ''​i < 8''​.
 +
 {{ .:​3-ise-debug:​18.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​18.jpg?​direct&​400 |}}
 +
   * După ce am modificat codul modulului este necesar să recompilăm simularea pentru a vedea efectele schimbării. Folosim butonul //​Re-launch//​ pentru a recompila și rerula simularea.   * După ce am modificat codul modulului este necesar să recompilăm simularea pentru a vedea efectele schimbării. Folosim butonul //​Re-launch//​ pentru a recompila și rerula simularea.
 +
 {{ .:​3-ise-debug:​19.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​19.jpg?​direct&​400 |}}
 +
   * Eliminăm breakpoint-urile făcând click pe ele, sau folosind tasta //F9//, pentru a putea rula ușor simularea până la capăt. La o primă vedere, din fereastra de variabile, rezultatul pare a fi corect, semnalele nedefinite au dispărut, iar suma pare a fi calculată corect.   * Eliminăm breakpoint-urile făcând click pe ele, sau folosind tasta //F9//, pentru a putea rula ușor simularea până la capăt. La o primă vedere, din fereastra de variabile, rezultatul pare a fi corect, semnalele nedefinite au dispărut, iar suma pare a fi calculată corect.
 +
 {{ .:​3-ise-debug:​20.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​20.jpg?​direct&​400 |}}
 +
   * Inspectarea digramei de semnale, însă, arată că suma dintre 10 și 40 este 39.   * Inspectarea digramei de semnale, însă, arată că suma dintre 10 și 40 este 39.
 +
 {{ .:​3-ise-debug:​21.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​21.jpg?​direct&​400 |}}
 +
   * Adăugăm din nou breakpoint-urile anterioare și reluăm simularea de la început cu butonul //​Restart//​.   * Adăugăm din nou breakpoint-urile anterioare și reluăm simularea de la început cu butonul //​Restart//​.
 +
 {{ .:​3-ise-debug:​22.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​22.jpg?​direct&​400 |}}
 +
   * Rulăm simularea până ajungem în prima iterație a celei de-a doua perechi de numere adunate. Recunoaștem această stare după valorile ''​00101000''​ și ''​00001010''​ prezente la intrările ''​a''​ și ''​b''​ și valoarea ''​0''​ a controului ''​i''​. Valoarea sumei, ''​00000000'',​ este rămasă de la adunarea anterioară.   * Rulăm simularea până ajungem în prima iterație a celei de-a doua perechi de numere adunate. Recunoaștem această stare după valorile ''​00101000''​ și ''​00001010''​ prezente la intrările ''​a''​ și ''​b''​ și valoarea ''​0''​ a controului ''​i''​. Valoarea sumei, ''​00000000'',​ este rămasă de la adunarea anterioară.
 +
 {{ .:​3-ise-debug:​23.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​23.jpg?​direct&​400 |}}
 +
   * În a doua iterație vedem că suma calculată în prima iterație pentru cel mai puțin semnificativ bit al lui ''​sum''​ este **1**. Din datele de intrare: ''​a[0] == 0'',​ ''​b[0] == 0''​ și ''​c_in == 0''​ am deduce că această sumă ar trebui să fie **0**. Inspectând expresia pentru calcul sumei, observăm că rezultatul pentru toți biții lui ''​sum''​ se calculează cu ''​b[1]''​.   * În a doua iterație vedem că suma calculată în prima iterație pentru cel mai puțin semnificativ bit al lui ''​sum''​ este **1**. Din datele de intrare: ''​a[0] == 0'',​ ''​b[0] == 0''​ și ''​c_in == 0''​ am deduce că această sumă ar trebui să fie **0**. Inspectând expresia pentru calcul sumei, observăm că rezultatul pentru toți biții lui ''​sum''​ se calculează cu ''​b[1]''​.
 +
 {{ .:​3-ise-debug:​24.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​24.jpg?​direct&​400 |}}
 +
   * Modificăm codul, corectând cu expresia corectă a sumei, care depinde de ''​i'',​ ''​b[i]''​.   * Modificăm codul, corectând cu expresia corectă a sumei, care depinde de ''​i'',​ ''​b[i]''​.
 +
 {{ .:​3-ise-debug:​25.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​25.jpg?​direct&​400 |}}
 +
   * Dezactivăm breakpoint-urile,​ recompilăm simularea și inspectăm din nou diagrama de semnale. Cu modificările făcute, circuitul pare să funcționeze corect (cel puțin pentru cele 4 cazuri testate).   * Dezactivăm breakpoint-urile,​ recompilăm simularea și inspectăm din nou diagrama de semnale. Cu modificările făcute, circuitul pare să funcționeze corect (cel puțin pentru cele 4 cazuri testate).
 +
 {{ .:​3-ise-debug:​26.jpg?​direct&​400 |}} {{ .:​3-ise-debug:​26.jpg?​direct&​400 |}}
 +
   * În continuare, pentru a ne asigura de funcționarea corectă a modului, acesta trebuie testat folosind mai multe combinații pentru variabilele de intrare (în special cazuri limită). La descoperirea unei erori în output, vom relua procesul de debugging, pentru a găsi și corecta bug-ul.   * În continuare, pentru a ne asigura de funcționarea corectă a modului, acesta trebuie testat folosind mai multe combinații pentru variabilele de intrare (în special cazuri limită). La descoperirea unei erori în output, vom relua procesul de debugging, pentru a găsi și corecta bug-ul.
-{{ .:​3-ise-debug:​27.jpg?​direct&​400 |}} 
  
 +{{ .:​3-ise-debug:​27.jpg?​direct&​400 |}}
  
-== Resurse == 
  
- ​* ​<​html><​a class="​media mediafile mf_pdf"​ href="/​ac/wiki/​tutoriale/​3-ise-debug?​do=export_pdf">​PDF tutorial</​a></​html>​+<​html><​a class="​media mediafile mf_pdf"​ href="https://ocw.cs.pub.ro/​courses/​ac-is/​tutoriale/​3-ise-debug?​do=export_pdf">​PDF tutorial</​a></​html>​
ac-is/tutoriale/3-ise-debug.1632152205.txt.gz · Last modified: 2021/10/01 20:17 (external edit)
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