ΠΕΡΙΕΧΟΜΕΝΑ
Προετοιμάζοντας VHDL μοντέλα για εξομοίωση
Ορισμός τεστ εισόδου Stimuli (Forces)
Αρχεία διαταγών (Command Files)
QuickVHDL Simulator Command Summary
1. Προετοιμάζοντας VHDL μοντέλα για εξομοίωση
Ο κατάλογος εργασίας
Δημιουργούμε έναν κατάλογο εργασίας (working project directory) , στον οποίο θα τοποθετούμε τα VHDL πηγαία αρχεία (source files) και τα αρχεία διαταγών εξομοίωσης (simulation command files).
Παράδειγμα : Ο κατάλογος εργασίας μας είναι ~/nelson/ee530.
Βιβλιοθήκη VHDL σχεδιάσεων
Ο VHDL compiler τοποθετεί όλα τα μεταφρασμένα (compiled) αρχεία και τα σχετιζόμενα δεδομένα (data) σε έναν ειδικό κατάλογο βιβλιοθήκης σχεδιάσεων, ο οποίος ονομάζεται “work”, και θα πρέπει να βρίσκεται μέσα στον κατάλογο εργασίας μας. Ο εξομοιωτής QuickHDL θα τοποθετεί αυτόματα όλα τα μοντέλα σε αυτόν τον κατάλογο.
cd ee530
qhlib work
qhdel m1 : για να διαγράψουμε την οντότητα m1 και όλες τις αρχιτεκτονικές της
qhdel m1 a1 : για να διαγράψουμε μόνο την αρχιτεκτονική α1 της οντότητας m1.
ΠΟΤΕ δεν χρησιμοποιούμε εντολές του Unix ή το Windows File Manager για να μετακινήσουμε (move), αντιγράψουμε (copy) κλπ κάποιο αρχείο μέσα στον κατάλογο βιβλιοθήκης σχεδιάσεων “work”. Πάντα χρησιμοποιούμε την εντολή qhdel.
Δημιουργία VHDL μοντέλων
Χρησιμοποιούμε έναν κειμενογράφο για να δημιουργήσουμε τα VHDL μοντέλα και τα τοποθετούμε στο κατάλογο εργασίας. Για κάθε VHDL σχεδιαστική μονάδα τοποθετούμε την οντότητά της (entity) και την αρχιτεκτονική της (architecture) σε ένα μονό αρχείο και χρησιμοποιούμε το όνομα της οντότητας σαν το όνομα του αρχείου, με την προέκταση “.vhd”.
Παράδειγμα:
Όνομα οντότητας : entity model1 is …
Όνομα αρχείου : model1.vhd
Μετάφραση (compiling) VHDL μοντέλων
Μεταφράζουμε κάθε σχεδιαστική μονάδα με την εντολή qvhcom με έναν από τους παρακάτω τρόπους:
qvhcom model1.vhd
qvhcom –source model1.vhd
Ο δεύτερος τρόπος εμφανίζει μία γραμμή πηγή (source line) με κάθε μήνυμα λάθους, ενώ ο πρώτος εμφανίζει μόνο μηνύματα λάθους. Το μεταφρασμένο μοντέλο αυτόματα τοποθετείται στην βιβλιοθήκη.
Σημείωση: Ένα ‘make file’ μπορεί να δημιουργηθεί για την βιβλιοθήκη εργασίας με την εντολή : qhmake. Η εκτέλεση του make file κάνει όλα τα out-of-date VHDL αρχεία στην βιβλιοθήκη να μεταφρασθούν πάλι (recompiled).
2. Χρήση του QuickVHDL εξομοιωτή
Overview of VHDL Model Simulation
Μία μοντελοποιημένη σχεδιαστική ενότητα δοκιμάζεται και εκτιμάται με τον καθορισμό ενός δοκιμαστικού διεγέρτη (test stimuli) ο οποίος εφαρμόζεται σε όλες τις εισόδους της, εξομοιώνοντας την λειτουργίας της μονάδας καθώς εφαρμόζεται το stimuli, και πιάνοντας τιμές από τις εξόδους και άλλα σήματα μέσα στην μονάδα τα οποία μπορούν να εξεταστούν για να καθορίσουμε αν η μονάδα συμπεριφέρθηκε κατάλληλα.
Ο εξομοιωτής QuickHDL φορτώνει ένα μεταφρασμένο VHDL μοντέλο, επιτρέπει να ορισθούν test stimuli (τα οποία ονομάζονται “forces”) είτε αλληλεπιδραστικά (interactively) είτε μέσω ενός “command file”, και τότε εξομοιώνει την λειτουργία της σχεδίασης, εμφανίζοντας καθορισμένα σήματα σε μορφή λίστας και/ή σαν χρονικά διαγράμματα κυματομορφών. Οι τιμές των σημάτων μπορούν να εξετασθούν μέσα στον εξομοιωτή ή να σωθούν σε αρχεία και να εξετασθούν off-line. Κάποια ή και όλα τα σήματα σε ένα μοντέλο μπορούν να επιλεχθούν και να εμφανισθούν. Είναι σημαντικό να συλλέξουμε όσο το δυνατόν περισσότερες πληροφορίες για τα σήματα για να απλοποιήσουμε την διόρθωση (debugging) ενός μοντέλου.
Για να εκσφαλματώσουμε (debug) ένα VHDL μοντέλο, ο χρήστης πρέπει να αλληλεπιδράσει (interact) με τον εξομοιωτή ορίζοντας “breakpoints”, τα οποία σταματούν την εξομοίωση σε επιλεγμένες VHDL δηλώσεις (statements) μέσα στο μοντέλο, και σε αυτό το σημείο ο χρήστης μπορεί να εξετάσει σήματα και/ή να αλλάξει τιμές των σημάτων.
Καθώς βρίσκονται σφάλματα σε ένα μοντέλο, το VHDL πηγαίο αρχείο μπορεί να συνταχθεί (edited), επαναμεταφρασθεί (recompiled) και επαναφορτωθεί (reload) στον εξομοιωτή. Η εξομοίωση μπορεί τότε να επαναληφθεί μέχρι να επιτευχθούν επιθυμητά αποτελέσματα.
Τυπική διαδικασία εξομοίωσης
Κλήση του εξομοιωτή (simulator) και φόρτωμα (load) του VHDL μοντέλου.
Εμφάνιση του VHDL μοντέλου ανοίγοντας ένα παράθυρο Source.
Εμφάνιση σημάτων σε ένα μοντέλο ανοίγοντας ένα παράθυρο Signal.
Ανοίγουμε ένα παράθυρο List για να εμφανίσουμε επιλεγμένες (captured) τιμές σημάτων σε μορφή πίνακα κατά την διάρκεια της εξομοίωσης και/ή ένα παράθυρο Wave για να εμφανίσουμε τιμές σημάτων με την μορφή κυματομορφών λογικού αναλυτή.
Ορίζουμε input stimuli (διεγέρτη εισόδων ή αλλιώς “forces”) για κάθε σήμα εισόδου.
Τρέχουμε την εξομοίωση για τον επιθυμητό αριθμό χρονικών μονάδων.
Μελετάμε τα αποτελέσματα στα παράθυρα List / Wave.
Σώζουμε το παράθυρο List σε ένα εκτυπώσιμο αρχείο.
Κάνουμε πάλι την εξομοίωση για νέο input stimuli ή διορθώνουμε και κάνουμε πάλι compile το μοντέλο και μετά επαναλαμβάνουμε την εξομοίωση.
Κλήση του εξομοιωτή (simulator)
Στο Unix shell command πληκτρολογούμε qhsim για να εμφανίσουμε το παρακάτω Startup παράθυρο.
εικόνα 1
“Simulator resolution” : κάνουμε κλικ στην επιθυμητή μονάδα χρόνου (“ns” είναι η default επιλογή).
“Library” : αν δεν είναι ήδη καταχωρημένη σαν default, εισάγουμε “work”.
“Entity” : κάνουμε κλικ στην top-level οντότητα (entity) του μοντέλου που θα εξομοιωθεί.
“Architecture” : αν υπάρχουν περισσότερες από μία αρχιτεκτονικές για την επιλεγμένη οντότητα, κάνουμε κλικ στην συγκεκριμένη αρχιτεκτονική που πρόκειται να εξομοιωθεί.
Κάνουμε κλικ στο κουμπί Load για να φορτώσουμε το μοντέλο και να εμφανίσουμε το παράθυρο Main.
Για να γλιτώσουμε χρόνο, το παράθυρο Startup μπορεί να παρακαμθεί με το να περιλάβουμε το όνομα της οντότητας στη Unix command line: qhsim model1.
Το παράθυρο Main του QuickHDL εξομοιωτή
Η κλήση του εξομοιωτή QuickHDL παράγει το παράθυρο Main, όπως φαίνεται παρακάτω. Οι εντολές εξομοίωσης μπορούν να εισαχθούν μέσω της μπάρας μενού που υπάρχει κατά μήκος της κορυφής του παραθύρου ή πληκτρολογώντας αυτές στο prompt μέσα στο παράθυρο ή διαβάζοντας αυτές από ένα αρχείο διαταγών (command file).
εικόνα 2
Η μπάρα των μενού περιέχει pull-down menus και κουμπιά για φόρτωμα (load) μοντέλων, για εμφάνιση VHDL δομών (structures) και πηγαίου κώδικα (source code), για εμφάνιση σημάτων και μεταβλητών και των τιμών τους κατά την διάρκεια της εξομοίωσης, για το τρέξιμο και επανεκκίνηση εξομοιώσεων.
File pull-down menu:
Restart design : Επαναφορτώνει (reload) το μοντέλο εξομοίωσης και επανατοποθετεί (reset) το χρόνο στο 0.
Load new design : Εμφανίζει ένα νέο παράθυρο Startup.
Execute command file: Επιλογή από pop-up menu, ενός αρχείου διαταγών για να εκτελεσθεί.
Quit : Έξοδος από τον εξομοιωτή χωρίς σώσιμο δεδομένων.
View pull-down menu: Ανοίγει άλλα παράθυρα του εξομοιωτή.
Properties button: Παράγει ένα pop-up menu για να θέσουμε :
Α. Default μήκος του τρεξίματος της εξομοίωσης.
Β. Όριο στον αριθμό των “deltas” μέσα σε μία χρονική μονάδα (για αποτροπή ταλαντώσεων).
Step button : Εξομοιώνει μία VHDL πρόταση (αν έχει σταματήσει –paused- η εξομοίωση).
Step Over button : Το ίδιο με το Step, αλλά εκτελεί μία ολόκληρη VHDL λειτουργία (function) ή διαδικασία (procedure) σαν μία απλή πρόταση.
Run pull-down menu: Τρέχει την εξομοίωση για ένα ορισμένο χρόνο:
n time units : εξομοιώνει για n μονάδες χρόνου.
Time’High: εξομοιώνει για έναν αριθμό μονάδων χρόνου ο οποίος είναι ίσος με τον μέγιστο ακέραιο σε υπολογιστή SUN.
Continue: Επαναφέρει την εκτέλεση σε μία σταματημένη (paused) εξομοίωση.
Break button : Παύει (break – pause) την τρέχουσα εξομοίωση.
Εμφάνιση VHDL μοντέλων
Κατά την διάρκεια της εξομοίωσης και του debugging, είναι χρήσιμο να εμφανίζουμε την ιεραρχία των μοντέλων και VHDL προτάσεις στα παράθυρα Structure και Source αντίστοιχα.
Ένα παράθυρο Source, όπως φαίνεται παρακάτω, εμφανίζει πηγαίες (source) VHDL προτάσεις για την ενεργή σχεδιαστική μονάδα, με αριθμούς γραμμής αριστερά και scroll bars για να κοιτάξουμε στο μοντέλο. Σε αυτό το παράθυρο, μπορούμε να θέσουμε breakpoint για debugging κάνοντας κλικ σε έναν αριθμό γραμμής και να επιλέξουμε σήματα για να τα εξετάσουμε ή να τα αλλάξουμε, κατά την διάρκεια της εξομοίωσης.
εικόνα 3
Μπορούμε να ανοίξουμε ένα Source παράθυρο είτε από την μπάρα μενού του παραθύρου Main επιλέγοντας View -> Source ή πληκτρολογώντας την εντολή : view source.
Ένα παράθυρο Structure εμφανίζει την δομική ιεραρχία μιας σχεδίασης όπως φαίνεται παρακάτω.
εικόνα 4
Ανοίγουμε ένα παράθυρο Structure είτε από την μπάρα μενού του παραθύρου Main επιλέγοντας View -> Structure ή πληκτρολογώντας την εντολή view structure.
Kάθε στοιχείο στην ιεραρχία της σχεδίασης εμφανίζεται ως :
instantiation_label:entity(architecture).
Κάνοντας κλικ στο όνομα μιας σχεδιαστικής μονάδας στο παράθυρο Structure επιλέγουμε αυτό σαν “current design unit” (τρέχουσα σχεδιαστική μονάδα), για να εμφανισθεί στο παράθυρο Source.
Η ιεραρχία μπορεί να επεκταθεί ή να συσταλεί ως εξής:
[+] Name: κάνουμε κλικ στο [+] για να επεκτείνουμε ένα κομμάτι, να δούμε τα δομικά στοιχεία που αυτό περιέχει.
[-] Name: κάνουμε κλικ στο [-] για συστολή
[ ] Name: Το κομμάτι δεν περιέχει lower-level στοιχεία.
Εμφάνιση τιμών των VHDL σημάτων
Ο σκοπός της εξομοίωσης είναι να εκτιμήσουμε την ορθότητα ενός VHDL μοντέλου. Αυτό γίνεται με την εμφάνιση διαφόρων σημάτων μέσα στο μοντέλο, εφαρμόζοντας stimuli στα εξωτερικά σήματα εισόδου, παρατηρώντας τις τιμές των σημάτων κατά την διάρκεια της εξομοίωσης και συγκρίνοντας τις παρατηρημένες τιμές με τις αναμενόμενες τιμές.
Το παράθυρο Signals εμφανίζει όλα τα ονόματα των σημάτων μέσα στην τρέχουσα περιοχή (current region) καθώς και τις εξομοιωμένες τιμές τους. Η τρέχουσα περιοχή επιλέγεται μέσω του παραθύρου Structure όπως περιγράφηκε παραπάνω).
εικόνα 5
Ανοίγουμε ένα παράθυρο Signal είτε από τη μπάρα μενού, του παραθύρου Main επιλέγοντας View -> Signal ή πληκτρολογώντας την εντολή: view signals.
Τα ονόματα των σημάτων εμφανίζονται με ιεραρχικό τρόπο. Τα σύνθετα (composite) σήματα μπορούν να εμφανιστούν σε ατομικά (individual) στοιχεία:
[+] Name: κάνουμε κλικ στο [+] για επέκταση, να δούμε τα στοιχεία που αυτό περιέχει.
[-] Name: κάνουμε κλικ στο [-] για συστολή
[ ] Name: Το σήμα δεν είναι σύνθετο (δεν επεκτείνεται)
Μπορούμε να επιλέξουμε ένα σήμα κάνοντας κλικ σε αυτό, και να το αφήσουμε πάλι κάνοντας κλικ.
Το παράθυρο Signals παρέχει τα παρακάτω buttons και pull-down menus:
Props: αλλάζει τη διαμόρφωση εμφάνισης (display format).
Force: αλλάζει την τιμή ενός επιλεγμένου σήματος.
Wave: προσθέτει επιλεγμένα σήματα στο παράθυρο Wave.
List: προσθέτει επιλεγμένα σήματα στο παράθυρο List.
Log: προσθέτει επιλεγμένα σήματα στο αρχείο Log.
Το παράθυρο List, εμφανίζει σε μορφή πίνακα τις τιμές από την εξομοίωση των επιλεγμένων σημάτων. Κάθε σειρά αναπαριστά ένα στιγμιότυπο των τιμών των σημάτων που έχουν παρθεί στο χρόνο που φαίνεται στις δύο πρώτες αριστερές στήλες.
εικόνα 6
Το παράθυρο List το ανοίγουμε είτε από την μπάρα μενού του Main επιλέγοντας : View -> List ή πληκτρολογώντας την εντολή : view list.
Ο χρόνος εξομοίωσης δίνεται στην επιλεγμένη μονάδα χρόνου (default είναι σε ns) συν κάποιο αριθμό VHDL “delta” (απειροελάχιστα μικρή, μη-μηδενική χρονική αύξηση).
Το format και/ή τα περιεχόμενα του παραθύρου List μπορούν να σωθούν μέσω του μενού του παραθύρου List.
File -> Write to file : Σώζει ολόκληρο το List παράθυρο σε ένα αρχείο ASCII το οποίο μπορεί να εξεταστεί και να τυπωθεί.
File -> Save configuration : Σώζει την λίστα των ονομάτων των σημάτων και τα format τους σε ένα αρχείο, το οποίο μπορεί να εκτελεστεί αργότερα σαν αρχείο διαταγών (command file) και να αναπαράγει το format του παραθύρου List.
Το format του παραθύρου List μπορεί να αλλαχθεί μέσω της ακόλουθης List Signals φόρμας, η οποία παράγεται κάνοντας κλικ στο Signals του παραθύρου List.
εικόνα 7
Για να αλλάξουμε τον τρόπο που ένα σήμα εμφανίζεται στο παράθυρο List, επιλέγουμε το σήμα στη φόρμα List Signals. Τότε, οι παρακάτω ιδιότητες (properties) του σήματος μπορούν να αλλαχθούν.
- Display radix (binary, hex, decimal, κλπ). Συχνά μερικά δεκαεξαδικά (hex) ψηφία είναι πιο ευκολοδιάβαστα από πολλά δυαδικά (binary) ψηφία.
- Width , ο αριθμός των στηλών που χρησιμοποιείται για την εμφάνιση των τιμών.
- Label , το όνομα του σήματος που εμφανίζεται στην οθόνη. Μικρά ονόματα σημάτων δίνουν πιο συμπαγή εμφάνιση.
Το μενού Edit της φόρμας List Signals, μπορεί να χρησιμοποιηθεί για cut και paste σημάτων, έτσι ώστε να επαναπροσδιορίσουμε την σειρά που τα σήματα εμφανίζονται στο παράθυρο List.
Το παράθυρο Wave εμφανίζει τις τιμές των επιλεγμένων σημάτων, σαν κυματομορφές λογικού αναλυτή.
εικόνα 8
Τα παράθυρο Wave το ανοίγουμε είτε από το μενού του παραθύρου Main επιλέγοντας : View - > Wave ή πληκτρολογώντας την εντολή : view wave.
Το παράθυρο Wave έχει τις παρακάτω επιλογές :
- File -> Write postscript : Σώζει ολόκληρο το παράθυρο Wave σε ένα εκτυπώσιμο postscript αρχείο.
- File -> Save configuration : Σώζει τα ονόματα των σημάτων και τα format τους σε ένα αρχείο το οποίο μπορεί να επαναφορτωθεί αργότερα.
- Zoom: Μεγέθυνση/σμίκρυνση των εμφανιζομένων κυματομορφών.
- Cursor: Εμφανίζει έναν κάθετο κέρσορα, όπως φαίνεται για χρόνο 66 στην παραπάνω εικόνα, ο οποίος μπορεί να μετακινηθεί και να βοηθήσει στην εξέταση των τιμών των σημάτων, σε ένα δοσμένο χρόνο. Σύρουμε (drag) τον κέρσορα στο επιθυμητό σημείο, δείχνοντας στο κουτί που έχει τον χρόνο, κρατώντας κάτω το αριστερό πλήκτρο του ποντικιού και μετακινώντας το ποντίκι αριστερά ή δεξιά.
Τα scroll bars χρησιμοποιούνται για να μετακινούμε την εικόνα δεξιά, αριστερά, πάνω και κάτω.
Στα αριστερά κάθε σήματος υπάρχει ένα κουτί:
- Κάνουμε κλικ στο [+] για να επεκτείνουμε ένα σήμα.
- Κάνουμε κλικ στο [-] για να ‘μαζέψουμε’ ένα σήμα.
- Ένα άδειο κουτί, δείχνει σήμα ενός bit.
3. Ορισμός τεστ εισόδου Stimuli (Forces)
Το “force value” είναι ένα ζευγάρι τιμής-καθυστέρησης το οποίο ορίζει ένα διεγέρτη (stimulus) που θα εφαρμοσθεί σε ένα σήμα και το χρόνο στον οποίο θα εφαρμοσθεί. Ο χρόνος εκφράζεται σαν μία καθυστέρηση από τον τρέχοντα χρόνο εξομοίωσης. Πολλαπλά ζεύγη χρόνου-καθυστέρησης μπορούν να ορισθούν με μία εντολή “force”, και αν επιθυμούμε ένα σχέδιο (pattern) μπορεί να επαναλαμβάνεται.
force signal_name value1 time1, value2 time2, … [-rep n]
Αν το προαιρετικό –rep n ορίζεται, το pattern επαναλαμβάνεται με μία περίοδο n χρονικών μονάδων.
Παραδείγματα : (υποθέτουμε ότι ο τρέχον χρόνος είναι Τ)
Force σήμα “abc” στη λογική τιμή ‘1’ στο χρόνο Τ+20: force abc 1 20
Force “abc” στο ‘0’ σε χρόνο Τ, ‘1’ σε χρόνο Τ+20 και ‘0’ σε χρόνο Τ+40:force abc 0 0 , 1 20, 0 40
Δημιουργία μίας κυματομορφής ρολογιού στο σήμα “clk” με περίοδο 40, με τιμή ‘0’ για το πρώτο μισό και ‘1’ για το δεύτερο μισό: force clk 0 0, 1 20 -rep 40
Για παράδειγμα ο δεκαδικός αριθμός 123 μπορεί να εκφρασθεί ως:
Decimal : 123 ή 10#123
Hexadecimal: 16#7Β
Binary: 2#1111011
Παράδειγμα: Να γεμίσουμε (float) ένα 32-bit data bus για το χρόνο 25:
force data ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 25
Παραδείγματα:
clk - σήμα clk στο τρέχον περιβάλλον
/clk - σήμα clk στο top-level μοντέλο
/blk1/clk - σήμα clk μέσα στο μπλοκ blk1
/blk1/blk2/clk - σήμα clk μέσα στο μπλοκ blk2 του μπλοκ blk1
Παράδειγμα διαδικασίας:
- Ορίζουμε τιμές force για το βήμα 1, σε σχέση με το χρόνο 0.
- Τρέχουμε την εξομοίωση για Τ1 χρονικές μονάδες (ο χρόνος τώρα είναι Τ1).
- Ορίζουμε τιμές force για το βήμα 2, σε σχέση με το χρόνο Τ1.
- Τρέχουμε την εξομοίωση για Τ2 χρονικές μονάδες (ο χρόνος τώρα είναι Τ1+Τ2 )
Τρέξιμο της εξομοίωσης
Μία εξομοίωση μπορεί να τρέξει για προκαθορισμένο χρονικό διάστημα, να τρέξει μέχρι να μην υπάρχουν άλλα δρομολογημένα γεγονότα ή να τρέξει μέχρι να φτάσει σε κάποιο breakpoint.
Από το παράθυρο Main επιλέγουμε: Run -> n time units , ή πληκτρολογούμε την εντολή : run n , όπου n είναι ο αριθμός των χρονικών μονάδων που θα εξομοιωθούν.
Από το παράθυρο Main επιλέγουμε : Run -> Time’High , το οποίο τρέχει για ένα αριθμό χρονικών μονάδων που είναι ίσος με τον μέγιστο ακέραιο σε ένα SUN.
Κουμπί Step από το παράθυρο Main: Εξομοιώνει μία πρόταση VHDL (αν η εξομοίωση έχει σταματήσει). Αυτό γίνεται και με την εντολή step.
Κουμπί Step Over από το παράθυρο Main: Το ίδιο με το Step, με την διαφορά ότι μεταχειρίζεται μία ολόκληρη VHDL function ή procedure σαν μία πρόταση. Το ίδιο γίνεται και με την εντολή step over.
Για να ανακτήσουμε συνεχή εξομοίωση, από το μενού του παραθύρου Main επιλέγουμε Continue ή πληκτρολογούμε την εντολή continue.
Αλλαγή και/ή επανεξομοίωση (resimulating) ενός VHDL μοντέλου
Μετά την εκτέλεση μίας εξομοίωσης, μπορεί να είναι επιθυμητό να θέλουμε να εξομοιώσουμε πάλι το μοντέλο με διαφορετικό input stimuli ή να το επανεξομοιώσουμε αφού έχουμε κάνει διορθώσεις σε αυτό.
Επανεξομοίωση του ίδιου μοντέλου:
Ο χρόνος εξομοίωσης μπορεί να επανακαθορισθεί (reset) στο 0 και το μοντέλο να εξομοιωθεί πάλι. Παρόλα αυτά όλες οι force statements πρέπει να εισαχθούν πάλι ή να διαβασθούν από ένα αρχείο διαταγών (command file).
- Από το μενού του παραθύρου Main επιλέγουμε: File -> Restart design ή πληκτρολογούμε την εντολή restart.
- Η επανεκκίνηση σβήνει όλες τις τιμές των σημάτων, αλλά όλα τα format των παραθύρων διατηρούνται.
Διόρθωση και επανεξομοίωση ενός μοντέλου:
Αν κάποιο λάθος βρεθεί σε ένα μοντέλο, το διορθώνουμε, το μεταφράζουμε πάλι (recompile) και μετά το επανεξομοιώνουμε.
- Συντάσουμε (edit) το VHDL πηγαίο αρχείο για να διορθώσουμε το μοντέλο. Αν επιθυμούμε μπορούμε να καλέσουμε τον default κειμενογράφο, πληκτρολογώντας την εντολή edit source.
- Επαναμεταφράζουμε (recompile) την διορθωμένη σχεδιαστική ενότητα και όποιες άλλες σχεδιαστικές μονάδες εξαρτώνται από την διορθωμένη μονάδα. Μπορούμε να επανεξομοιώσουμε από το παράθυρο Main δίνοντας την εντολή qvhcom.
- Από το μενού του παραθύρου Main επιλέγουμε : File -> Restart ή γράφουμε την εντολή restart.
- Επανεισάγουμε τις force statements ή τις διαβάζουμε από ένα command file.
- Τρέχουμε την εξομοίωση.
4. Αρχεία διαταγών (Command Files)
Ένα αρχείο διαταγών είναι ένα αρχείο κειμένου το οποίο περιέχει μία λίστα διαταγών του εξομοιωτή οι οποίες εκτελούνται με την έκδοση μιας εντολής “DO”. Αυτό παρέχει ένα βολικό τρόπο για την ανάπτυξη ενός τεστ για το VHDL μοντέλο, το οποίο μπορεί να ξαναχρησιμοποιηθεί για πολλαπλές εξομοιώσεις, όπως συνήθως χρειάζονται κατά την διάρκεια του debugging. Αυτό μας γλιτώνει από το να γράφουμε όλες τις εντολές για κάθε εξομοίωση.
Παράδειγμα αρχείου διαταγών:
list rd wr
list -hex abus dbus
force wr 0 0
force rd 0 0 , 1 20 -rep 40
force dbus ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 0
force abus 16#000 0, 16#004 40, 16#008 80, 16#00C 120
run 150
Αυτό το αρχείο διαταγών ανοίγει ένα list window, εμφανίζει σήματα ενός bit, τα “wr” και “rd”, εμφανίζει multi-bit σήματα “abus” και “dbus” σε δεκαεξαδική μορφή, δημιουργεί κυματομορφές για τα τέσσερα σήματα και εξομοιώνει για 150 χρονικές μονάδες.
Αν ένα VHDL μοντέλο δεν συμπεριφέρεται όπως αναμένεται, ο εξομοιωτής μας παρέχει έναν αριθμό χαρακτηριστικών που βοηθούν στην ανίχνευση του προβλήματος.
Εμφάνιση όλων των σημάτων
Συλλογή (capture) και εμφάνιση όλων των σημάτων που μπορεί να σχετίζονται με το μέρος που περιέχει το λάθος, σε παράθυρο List/Wave . Δεν υπάρχει η ανάγκη να μαντέψουμε τι κάνει ένα σήμα, όταν οι τιμές του μπορούν να εμφανισθούν και να εξετασθούν.
Χρήση Breakpoints
Ένα “breakpoint” είναι μία τοποθεσία σε ένα μοντέλο στο οποίο η εξομοίωση μπορεί να ανασταλεί προσωρινά. Όταν αναστέλλεται η εξομοίωση, η κατάσταση ενός μοντέλου μπορεί να εξετασθεί και/ή να αλλαχθεί και μετά να συνεχισθεί η εξομοίωση.
Παράδειγμα:
on break examine wr , rd ;
continue
Το παράθυρο Process
Μπορούμε να παρακολουθήσουμε ποιές διεργασίες (processes) είναι ενεργές και ποιες έχουν δρομολογηθεί για να εκτελεσθούν μέσω του παραθύρου Process, το οποίο εμφανίζει μία λίστα από διεργασίες καθώς και τις VHDL διαδρομές (paths) τους. Μπορούμε να επιλέξουμε μέσω δύο κουμπιών:
Πρόσθετες πληροφορίες εμφανίζονται στα αριστερά των ονομάτων των διεργασιών:
Παρακάτω υπάρχει ένα sample source file new_wm.vhdl το οποίο είναι ένας ελεγκτής για ένα πλυντήριο:
LIBRARY ieee,arithmetic;
USE ieee.std_logic_1164.ALL;
Use arithmetic.std_logic_arith.ALL;
ENTITY new_wm IS PORT (clk :IN std_ulogic;
ober :IN BOOLEAN;
coin :IN BOOLEAN;
double:IN BOOLEAN;
T :IN BOOLEAN;
reset :IN std_ulogic;
count :OUT bit);
END new_wm;
ARCHITECTURE style_case OF new_wm IS
TYPE states IS (idle,soak,wash,rins,spin,espera);
SIGNAL present_state : states := idle;
BEGIN
washing : PROCESS (clk)
BEGIN
IF (clk = '1' AND clk'LAST_VALUE ='0') THEN
IF (reset = '0') THEN
present_state <= idle;
ELSE CASE present_state IS
WHEN idle => IF coin THEN present_state <= soak;
ELSE present_state <= idle;
END IF;
WHEN soak => IF T THEN present_state <= wash;
ELSE present_state <= soak;
END IF;
WHEN wash => IF T THEN present_state <= rins;
ELSE present_state <= wash;
END IF;
WHEN rins => IF (T AND double)
THEN present_state <= wash;
else case T is
when true => present_state <= spin;
when false => present_state <= rins;
end case;
END IF;
WHEN spin => IF T THEN present_state <= idle;
else case ober is
when true => count <= '0';
present_state <= espera;
when false => present_state <= spin;
end case;
END IF;
WHEN espera => IF (ober) THEN present_state <= espera;
ELSE count <= '1';
present_state <= spin;
END IF;
END CASE;
END IF;
END IF;
END PROCESS washing;
END style_case;
Για compile και κλήση QuickVHDL για το παραπάνω παράδειγμα:
$ qvhcom -93 -synth -nosynchk src/new_wm.vhdl
$ qhsim new_wm style_case