ΗΥ-225: Οργάνωση Υπολογιστών
Άνοιξη 2007 |
Τμ. Επ. Υπολογιστών © Πανεπιστήμιο Κρήτης |
[Up: Table of Contents] [Prev: 7. Linked List] |
[printer version, in PDF] [9. Verilog Intro. 2 - Next] |
Στο μάθημά μας θα χρησιμοποιήσουμε τη γλώσσα περιγραφής hardware "Verilog" που είναι η μία από τις δύο δημοφιλέστερες (παγκοσμίως) HDL --η άλλη είναι η "VHDL". Η Verilog είναι μεγάλη και περίπλοκη γλώσσα, με πολλές δυνατότητες και πολλούς τρόπους να κάνει κανείς το κάθε τι. Σε αυτό το μάθημα θα μάθετε και θα χρησιμοποιήσουμε ένα πολύ μικρό, μόνο, υποσύνολο της Verilog. Ο σκοπός των σημερινών ασκήσεων είναι η εξοικείωσή σας με την Verilog και τα συναφή εργαλεία:
Όταν μιά πύλη έχει εισόδους x, δηλαδή εισόδους με άγνωστη τιμή, τότε η τιμή εξόδου της προκύπτει ως εξής. Θεωρούμε όλους τους δυνατούς συνδυασμούς 1 και 0 σε όλες τις εισόδους με τιμή x. Γιά κάθε τέτοιο συνδυασμό εξετάζουμε τι τιμή θα είχε η έξοδος. Αν όλες αυτές οι τιμές είναι 0, τότε η τιμή εξόδου είναι 0. Αν όλες οι παραπάνω τιμές είναι 1, τότε η τιμή εξόδου είναι 1. Αν όμως μερικές από τις παραπάνω τιμές είναι 0 και μερικές είναι 1, τότε η τιμή εξόδου είναι x, που σημαίνει ότι η αβεβαιότητα που υπάρχει γιά τις τιμές των εισόδων που είναι x, επηρεάζει την έξοδο σε αυτή την περίπτωση, και κάνει την τιμή της να είναι επίσης αβέβαιη. Με βάση αυτή τη λογική, η τιμή εξόδου μιάς πύλης AND και μιάς πύλης OR, όταν οι είσοδοί τους είναι 0, 1, ή x, θα είναι:
AND: inA-> 0 1 x OR: inA-> 0 1 x inB: inB: 0 0 0 0 0 0 1 x 1 0 1 x 1 1 1 1 x 0 x x x x 1 x
module top; wire outA, outB; reg inA, inB, inC; // Instantiate two AND gates: // lib8_and and1(outA, inA, inB); lib8_and and2(outB, outA, inC); endmoduleΣτην περιγραφή αυτή ορίζεται ένα "module" με το όνομα "top". Μέσα του, στην αρχή, δηλώνονται τα σύρματα (wire) outA και outB (που είναι έξοδοι πυλών), καθώς και οι είσοδοι πυλών inA, inB, και inC. Παρά το γεγονός ότι και αυτά τα σήματα (inA, inB, inC) είναι τρόπον τινά απλά σύρματα, πρέπει να δηλωθούν "reg", επειδή στο κύκλωμά μας δεν υπάρχει κανείς που να τα οδηγεί, και κατά συνέπεια, ο μόνος τρόπος να κρατάνε ό,τι τιμή τους βάζουμε είναι να δηλωθούν "reg" (κάτι σαν "καταχωρητής", αλλά όχι το ίδιο με τους δικούς μας καταχωρητές).
Στη συνέχεια, μέσα στο module "top", υλοποιούμε (instantiate) δύο αντίτυπα μιάς πύλης AND. Και τα δύο είναι αντίτυπα της ίδιας πύλης ονόματι "lib8_and" από μιά κατάλληλη βιβλιοθήκη που θα πούμε παρακάτω. Το πρώτο αντίτυπο (instance) είναι το "and1", και το δεύτερο είναι το "and2". Η πύλη lib8_and έχει οριστεί με τρείς "πόρτες", δηλαδή τρία σήματα επικοινωνίας με τον έξω (της) κόσμο: το πρώτο (σε σειρά) είναι η έξοδός της, και τα επόμενα δύο είναι οι είσοδοί της. Επομένως, βάσει αυτής της σειράς ορισμού, που πρέπει να μας την έχει δώσει αυτός που έφτιαξε τη βιβλιοθήκη, στο αντίτυπο and1 η έξοδος συνδέεται στο (τροφοδοτεί το) σήμα outA, ενώ οι είσοδοι συνδέονται στα (τροφοδοτούνται από τα) σήματα inA και inB. Στο αντίτυπο and2, η έξοδος πάει στο outB, ενώ είσοδοι είναι τα outA και inC.
Το module top, έτσι "σκέτο" όπως το ορίσαμε παραπάνω, αν περάσει από τον προσομοιωτή "Verilog-XL" της Verilog, δεν θα βγάλει κανένα αποτέλεσμα, αφού κανένα ενδιαφέρον συμβάν (γεγονός - event) δεν γεννιέται από καμία πηγή: δεν υπάρχουν συγκεκριμένα σήματα εισόδου για να δώσουν εξόδους. Επομένως πρέπει να επεκτείνουμε το module έτσι ώστε να εφαρμόσουμε ακολουθίες εισόδου (test vectors) και να παρατηρήσουμε τις τιμές σε εξωτερικούς και εσωτερικούς κόμβους του κυκλώματος. Οι επεκτάσεις αυτές δεν αποτελούν τμήμα του κυκλώματος, αλλά το περιβάλλον ελέγχου ("test bench"). Για λόγους απλότητας, σε αυτή την άσκηση, θα τοποθετήσουμε την περιγραφή του κυκλώματος στο ίδιο αρχείο με το περιβάλλον ελέγχου:
module top; wire outA, outB; reg inA, inB, inC; // Instantiate two AND gates: // lib8_and and1(outA, inA, inB); lib8_and and2(outB, outA, inC); // Test Bench // initial begin // Start Tracing (signalscan) // $shm_open("Test.shm"); $shm_probe(top, "AS"); // print the values of "outA" and "outB" at stdout // each time one of them changes // $monitor($time, ": outA=%b, outB=%b\n", outA, outB); // Test vectors // #100 inA = 1; inB = 1; inC = 1; #900 inA = 0; #1000 inA = 1; #1000 inB = 0; inC = 0; #1000 inA = 0; #1000 inA = 1; #1000 inB = 1; #100 inA = 0; #1000 // Stop Tracing // $shm_close(); end endmodule
Ο προσομοιωτής της Verilog και το εργαλείο ελέγχου κυματομορφών που θα χρησιμοποιήσετε --της εταιρείας Cadence και τα δύο-- είναι εργαλεία μεγάλης εμπορικής αξίας, τα οποία το Πανεπιστήμιο Κρήτης έχει αγοράσει γιά εσωτερική χρήση και γιά εκπαιδευτικούς και ερευνητικούς σκοπούς μόνο, με τη βοήθεια του οργανισμού "Europractice" της Ευρωπαϊκής Ενωσης, και τρέχουν μόνο κάτω από αυστηρούς περιορισμούς χρήσης (license). Τα εργαλεία αυτά είναι διαθέσιμα μόνο για μηχανήματα αρχιτεκτονικής Sparc/Solaris. Για τους σκοπούς του μαθήματος θα σας δοθεί πρόσβαση στα παρακάτω μηχανήματα, που έχουν τέτοια κατάλληλη αρχιτεκτονική και στα οποία τρέχουν τα παραπάνω εργαλεία. Για να τρέξετε τον προσομοιωτή:
% xhost + % rlogin [katalliloMixanima] % setenv DISPLAY [arxikoMixanima]:0.0 % source ~hy225/verilog/scripts/cds_ldv.sh % verilog lib8.v ask8.vόπου [arxikoMixanima] είναι το όνομα της μηχανής από την οποία κάνετε rlogin, και [katalliloMixanima] είναι ένα από τα:
Το script "cds_ldv.sh"
προσθέτει τα paths και environment variables που χρειάζεστε
γιά να τρέξετε τα εργαλεία
(εάν το shell σας παραπονεθεί ότι "setenv: too many arguments",
θέσετε τις μεταβλητές του "PATH" και "LD_LIBRARY_PATH"
στα απολύτως απαραίτητα και μόνο, πρίν κάνετε source το cds_ldv.sh
--επίσης, μην κάνετε source το cds_ldv.sh πάνω από μία φορά
σε κάθε παράθυρο).
Η τελευταία από τις παραπάνω εντολές τρέχει την Verilog-XL.
Τα ονόματα των δύο αρχείων με κατάληξη ".v"
πρέπει να δωθουν ως παράμετροι με τη σειρά που φαίνονται παραπάνω,
διότι πρώτα πρέπει να οριστούν η πύλη lib8_and κλπ. στο αρχείο "lib8.v",
και μετά να την χρησιμοποιήστε εσείς στο αρχείο "ask8.v".
Όταν θα τρέξει ο προσομοιωτής,
ελέγξτε ότι οι έξοδοι έχουν την αναμενόμενη τιμή,
με βάση τις εισόδους που δώσαμε στο test bench.
Το signalscan αναπαριστά τη τιμή x με κόκκινη γραμμή
τόσο στο επίπεδο 0 όσο και στο επίπεδο 1.
Παρατηρήστε τη συμπεριφορά των εξόδων σε κάθε μία από τις
χρονικές στιγμές 2ns, 3ns, 4ns, 6ns.
Πόση ώρα μένει η έξοδος στην τιμή x σε κάθε περίπτωση
και γιατί;
ΠΡΟΣΟΧΗ:
σε ώρες πυκνής χρήσης, αποφύγετε να μένετε πολλή ώρα
μέσα στο εργαλείο Signalscan:
έχουμε περιορισμένο αριθμό αδειών χρήσης (licenses),
κι έτσι άλλοι συνάδελφοί σας μπορεί να μην μπορούν να μπούν σε αυτό.
(Το ίδιο ισχύει και γιά την Verilog XL,
αλλά αυτό το εργαλείο ούτως ή άλλως τρέχει πολύ γρήγορα
γιά τα (πολύ μικρά!) δικά σας κυκλώματα...).
Παραδώστε, όπως και στις προηγούμενες ασκήσεις,
ένα χαρακτηριστικό στιγμιότυπο από το Signalscan της άσκησης 8.4,
"ask8.4.jpg",
και τα σχόλια σας για τις τιμές στις εξόδους,
"ask8.4.txt",
πακεταρισμένα στο αρχείο "ask8.zip",
μέσω:
Άσκηση 8.4:
Ελεγχος Κυματομορφών με το Signalscan
Οταν τελειώσει η προσομοίωση,
παρατηρήστε ότι στο directory που τρέξατε το πρόγραμμα
υπάρχει και ένα νέο subdirectory ονόματι "Test.shm".
Αυτό δημιουργείται από τις οδηγίες στο ask8.v που είπαμε,
και περιέχει όλες τις τιμές για όλα τα σήματα
καθ' όλη τη διάρκεια της προσομοίωσης.
Χρησιμοποιήστε το εργαλείο "Signalscan",
πάντα στα ίδια κατάλληλα μηχανήματα όπως παραπάνω,
γιά να δείτε μιά γραφική αναπαράσταση των κυματομορφών
του κυκλώματός σας:
% cd Test.shm
% signalscan
Αφού τρέξει το γραφικό περιβάλλον του προγράμματος,
ακολουθήστε τα εξής βήματα:
zip ask8.zip ask8.4.jpg ask8.4.txt
~hy225/bin/submit 8
[Up: Table of Contents] [Prev: 7. Linked List] |
[printer version, in PDF] [9. Verilog Intro. 2 - Next] |
Up to the Home Page of CS-225
|
© copyright
University of Crete, Greece.
Last updated: 23 Apr. (26/4: zip) 2007, by M. Katevenis. |