Σειρά Ασκήσεων 5:
Γνωριμία με την Γλώσσα Verilog
Προθεσμία έως Τετάρτη 14 Μαρτίου (βδομάδα 6)
Σημείωση: Ανακοίνωση Διαγωνισμού Προόδου:
Πέμπτη 22 Μαρτίου, 7:00 - 9:00 μ.μ.,
αίθουσες Θ-201, Θ-202, Θ-206, Θ-207
(η συμμετοχή των φοιτητών είναι υποχρεωτική).
Γλώσσες Περιγραφής Hardware (HDL)
Σήμερα, η σχεδίαση hardware σε βιομηχανικό επίπεδο
στηρίζεται πρώτ' απ' όλα στις
Γλώσσες Περιγραφής Hardware (Hardware Description Languages - HDL).
Χρησιμοποιόντας αυτές,
μπορεί κανείς να περιγράψει με ακρίβεια
την επιθυμητή λειτουργία
ή την υλοποίηση ενός ψηφιακού συστήματος,
ή (συνήθως) και τα δύο.
Αυτό είναι εξαιρετικά σημαντικό,
πρώτον γιά την προσομοίωση (simulation) ενός σχεδίου,
δηλαδή γιά να προσπαθήσει ένα πρόγραμμα υπολογιστή,
ο "προσομοιωτής", να μιμηθεί
τον αναμενόμενο τρόπο λειτουργίας του πραγματικού ψηφιακού συστήματος,
δίνοντας μας έτσι τη δυνατότητα
να βρούμε και να διορθώσουμε τα λάθη σχεδίασης,
καθώε επίσης και να μελετήσουμε την επίδοση του υπό σχεδίαση συστήματος.
Δεύτερον,
όταν η περιγραφή του υπό σχεδιαση ψηφιακού συστήματος
γίνει με κατάλληλο τρόπο,
υπάρχουν εργαλεία αυτόματης σύνθεσης
που μπορούν διαβάζοντας αυτή την περιγραφή
να την μετατρέψουν σε άλλη μορφή, χαμηλότερου επιπέδου,
κατάλληλη γιά αυτόματη κατασκευή του πραγματικού συστήματος
(κάτι σαν compilation προγράμματος, δηλαδή).
Στο μάθημά μας θα χρησιμοποιήσουμε τη γλώσσα περιγραφής hardware
"Verilog"
που είναι η μία από τις δύο δημοφιλέστερες (παγκοσμίως) HDL
--η άλλη είναι η "VHDL"--
και μάλλον (η Verilog) η πλέον δημοφιλής στη βιομηχανία.
Η Verilog είναι μεγάλη και περίπλοκη γλώσσα,
με πολλές δυνατότητες και πολλούς τρόπους να κάνει κανείς το κάθε τι.
Σε αυτό το μάθημα θα μάθετε και θα χρησιμοποιήσουμε
ένα πολύ μικρό, μόνο, υποσύνολο της Verilog.
Το υποσύνολο αυτό θα σας διδαχτεί από τον κ. Σ. Λυμπέρη,
βοηθό του μαθήματος, την ώρα Φροντιστηρίου:
-
Σεμινάριο Verilog: Πέμπτη, 8 Μαρτίου, 7:15 - 9:00 μ.μ., Θ-201
Ο σκοπός της παρούσας σειράς ασκήσεων είναι
η εξοικείωσή σας με την Verilog και τα συναφή εργαλεία.
Θα συμπληρώσετε ένα ήδη έτοιμο αρχείο σε Verilog
και θα το περάσετε από όλα τα εργαλεία
που θα χρησιμοποιηθούν στις μετέπειτα ασκήσεις του μαθήματος.
Οι επιμέρους άσκησεις της σειράς 5 περιλαμβάνουν:
-
Μελέτη ενός κυκλώματος και της περιγραφής του σε Verilog που δίδονται.
-
Προσομοίωση του κώδικα με τον interpreter της Verilog-XL.
-
Ελεγχος των εξόδων του συστήματός σας
με το εργαλείο κυματομορφών Signalscan.
-
Επέκταση του κώδικα για να περιλαμβάνει νέα κυκλώματα
και επαναπροσομοίωση και επανέλεγχο εξόδων.
Ασκηση 5.1: Περιγραφή Κυκλώματος σε Verilog
Το κύκλωμα με το οποίο θα ξεκινήσουμε φαίνεται στο παρακάτω σχήμα.
Τα άσπρα βέλη χρησιμοποιούνται για να δείξουν
ότι τα σύρματα αυτά είναι είσοδοι ή έξοδοι απο το σύστημα μας.
Το σύστημα διαβάζει τις εισόδους in_a και in_b
σε κάθε κύκλο ρολογιού clk,
υπολογίζει την πράξη μεταξύ τους
--όπως ορίζει το alu_op--
και τέλος αποθηκεύει στον καταχωρητή εξόδου
είτε το αποτέλεσμα αυτό ή την είσοδο in_b
(από τον καταχωρητή εισόδου).
Ο κώδικας που περιγράφει το κύκλωμα αυτό σε Verilog
είναι ο εξής:
module ask5a (in_a, in_b, alu_op, mux_sel, out, clk);
input clk; // βασικά σήματα
input [31:0] in_a, in_b; // είσοδοι δεδομένων
input [1:0] alu_op; // σήματα ελέγχου
input mux_sel;
output [31:0] out; // έξοδος δεδομένων
// Δήλωση εσωτερικών συρμάτων:
wire [31:0] reg_a, reg_b, alu_out, mux_out;
// Καταχωρητές:
Reg #32 r0 (reg_a, in_a, clk);
Reg #32 r1 (reg_b, in_b, clk);
Reg #32 r2 (out, mux_out, clk);
// ALU:
ALU #32 alu0 (alu_out, reg_a, reg_b, alu_op);
// Πολυπλέκτης:
Mux2 #32 m0 (mux_out, alu_out, reg_b, mux_sel);
endmodule
Γράψτε το παραπάνω module σε ένα αρχείο,
π.χ. το "ask5a.v".
Το module ask5a που έχουμε ορίσει,
αν περάσει μόνο του απο τον interpreter της Verilog XL,
δεν θα βγάλει κανένα αποτέλεσμα,
αφού κανένα event δεν μπορεί να δημιουργηθεί από καμία πηγή
(δεν υπάρχουν συγκεκριμένα σήματα εισόδου για να δώσουν εξόδους).
Το ρόλο αυτό θα καλύψει ένα δεύτερο (έτοιμο) αρχείο
που θα αντιγράψετε στην περιοχή σας:
~hy225/verilog/test/test5a.v
Ο σκοπός αυτού του αρχείου είναι να
χρησιμοποιήσει το module ask5a που ορίσαμε παραπάνω,
να του δώσει μερικές ακολουθίες σημάτων εισόδου,
και να τυπώσει στην οθόνη τις τιμές εξόδου γιά 10 κύκλους ρολογιού.
Η βασική δομή του έχει ως εξής:
module test;
...
ask5a a0 (a, b, op, sel, c, clk);
...
initial begin
...
@(posedge clk);
a = h'AB00;
b = h'1;
op = b'00;
sel = 0;
$display ("%h", out);
@(posedge clk);
...
end
...
endmodule
Θα χρειαστεί επίσης να αντιγράψετε στην περιοχή σας το αρχείο:
~hy225/verilog/lib/lib5.v
που περιέχει τα βοηθητικά modules που χρησιμοποιεί το ask5a,
δηλ. καταχωρητές (Reg),
ALU (ALU),
πολυπλέκτες (Mux2).
Δημιουργήστε ένα αρχείο "files.cv"
που να περιέχει τα ονόματα των τριών αρχείων
που πρέπει να μεταγλωττιστούν,
με τη σωστή σειρά:
- πρώτα το lib5.v,
- μετά το ask5a.v,
που χρησιμοποιεί τα έτοιμα modules
και ορίζει το ask5a, και
- τέλος το test5a.v
που χρησιμοποιεί το ask5a.
Ο προσομοιωτής της Verilog και το εργαλείο ελέγχου κυματομορφών
που θα χρησιμοποιήσετε --της εταιρείας Cadence και τα δύο--
είναι εργαλεία μεγάλης εμπορικής αξίας,
τα οποία το Πανεπιστήμιο Κρήτης έχει αγοράσει
γιά εσωτερική χρήση
και γιά εκπαιδευτικούς και ερευνητικούς σκοπούς μόνο,
με τη βοήθεια του οργανισμού "Europractice"
της Ευρωπαϊκής Ενωσης,
και τρέχουν μόνο κάτω από αυστηρούς περιορισμούς χρήσης (license).
Τα εργαλεία αυτά μπορείτε να τρέξετε μόνο σε ένα μηχάνημα,
που στήθηκε ειδικά για το σκοπό αυτό, στο οποίο θα πρέπει να κάνετε:
% rlogin zefyros
% set path = ($path /vlsi/tools/bin)
% setenv LD_LIBRARY_PATH $LD_LIBRARY_PATH\:/vlsi/tools/lib
% verilog -f files.cv
(/vlsi/tools/bin είναι το directory των εργαλείων,
και /vlsi/tools/lib είναι το directory των δυναμικών βιβλιοθηκών τους
--αν δεν έχετε ήδη τη μεταβλητή LD_LIBRARY_PATH ορισμένη,
αρκεί το "setenv LD_LIBRARY_PATH /vlsi/tools/lib"
αντί της τρίτης εντολής παραπάνω).
Η τελευταία από τις παραπάνω εντολές τρέχει την Verilog XL.
Ελέγξτε ότι οι έξοδοι έχουν τη σωστή τους τιμή
με βάση τις εισόδους.
Προσοχή στο ποιές είσοδοι περνούν απο καταχωρητή,
και ποιές όχι....
Ασκηση 5.2: Ελεγχος Κυματομορφών με Signalscan
Οταν τελειώσει η προσομοίωση,
παρατηρήστε ότι στο directory που τρέξατε το πρόγραμμα
υπάρχει και ένα νέο subdirectory ονόματι "Test.shm".
Αυτό δημιουργείται λόγω ορισμένων εντολών
που υπάρχουν στο "test5a.v",
και περιέχει όλες τις τιμές για όλα τα σήματα
καθ' όλη τη διάρκεια της προσομοίωσης.
Χρησιμοποιήστε το εργαλείο "Signalscan",
πάντα στο μηχάνημα zefyros,
γιά να δείτε μιά γραφική αναπαράσταση των κυματομορφών
του κυκλώματός σας:
% signalscan
Αφού τρέξει το γραφικό περιβάλλον του προγράμματος,
ακολουθήστε τα εξής βήματα:
-
Ανοίξτε το αρχείο της προσομοίωσης με "File->Open Simulation File",
και διαλέγοντας το αρχείο "Test.trn"
που βρίσκεται μέσα στο directory "Test.shm".
-
Επιλέξτε "Windows->Design Browser".
-
Από το υποπαράθυρο "Instances in Current Context"
βλέπετε τα ονόματα των modules που έχουν οριστεί
(με ιεραρχικό τρόπο).
Επιλέξτε το test.
-
Aπο το πιο κάτω υποπαράθυρο (Nodes/Variables in Current Context),
επιλέξτε όλα τα σήματα του test (a, b, op, sel, c, clk).
-
Πατήστε το Add, Close κουμπί (πάνω δεξιά). Έτσι, τα
επιλεγμένα σήματα μεταφέρονται στο κεντρικό παράθυρο και ο
Design Browser κλείνει.
-
Ολα τα σήματα που μας ενδιαφέρουν φαίνονται πλέον.
Ελέγξτε και πάλι τις τιμές τους.
-
Πάλι με τον Design Browser, αν κατέβουμε παρακάτω
(στο module ask5a που φαίνεται ως a0 - όπως έχει δηλωθεί),
μπορούμε να διαλέξουμε και τα εσωτερικά σήματα του ask5a.
Επιλέξτε τα, και παρατηρήστε στο κεντρικό παράθυρο
τις καθυστερήσεις που εισάγονται απο κάθε στοιχείο
(propagation delays, clock-to-q times, ...)
ΠΡΟΣΟΧΗ:
σε ώρες πυκνής χρήσης, αποφύγετε να μένετε πολλή ώρα
μέσα στο εργαλείο Signalscan:
έχουμε περιορισμένο αριθμό αδειών χρήσης (licenses),
κι έτσι άλλοι συνάδελφοί σας μπορεί να μην μπορούν να μπούν σε αυτό.
(Το ίδιο ισχύει και γιά την Verilog XL,
αλλά αυτό το εργαλείο ούτως ή άλλως τρέχει πολύ γρήγορα
γιά τα (πολύ μικρά!) δικά σας κυκλώματα...).
Ασκηση 5.3: Τροποποίηση του Κυκλώματος
Τροποποιήστε το κύκλωμα που σας δόθηκε παραπάνω,
ώστε να γίνει όπως στο επόμενο σχήμα.
Η καινούρια προσθήκη επιτρέπει το αποτέλεσμα να είναι ίσο με
(in_a + 4), όταν mux_sel == 0.
Τα στοιχεία που είναι καινούρια,
ή που πρέπει να αλλάξουν απο το προηγούμενο σχέδιο,
είναι απεικονισμένα με παχύτερες γραμμές.
Γιά τον μεγαλύτερο πολυπλέκτη,
θα χρειαστεί να αλλάξετε το module mux2
στο αμέσως μεγαλύτερο, "mux4",
και να συνδέσετε μια τυχαία τιμή στην τελευταία του είσοδο
(π.χ. ένα σύρμα με την τιμή 0).
Σύρματα με σταθερές τιμές μπορείτε να ορίσετε π.χ. με:
wire [31:0] const_in = 32'h4;
Υλοποιήστε την επέκταση αυτή σε ένα διαφορετικό αρχείο,
"ask5b.v",
με όνομα module "ask5b" αντί "ask5a",
και δοκιμάστε την όπως προηγουμένως,
χρησιμοποιώντας όμως το αρχείο "test_ask5b.v"
απο την περιοχή ~hy225/verilog/test/.
Παραδώστε, όπως και στις προηγούμενες ασκήσεις,
τον κώδικά σας ask5b.v,
ένα χαρακτηριστικό στιγμιότυπο από το Signalscan της άσκησης 5.2,
και ένα άλλο από το Signalscan της άσκησης 5.3,
πακεταρισμένα στο αρχείο "ask5.tar.gz",
μέσω:
tar -cvf ask5.tar ask5b.v signals52.jpg signals53.jpg
gzip ask5.tar
~hy225/bin/submit 5