ΗΥ-225: Οργάνωση Υπολογιστών
Άνοιξη 2009
Τμ. Επ. Υπολογιστών
© Πανεπιστήμιο Κρήτης

Σειρά Ασκήσεων 9:
Δεύτερη Γνωριμία με τη Γλώσσα Verilog

Προθεσμία έως Πέμπτη 26 Μαρτίου 2009, ώρα 23:59 (βδομάδα 8)
Υπενθύμιση Διαγωνισμού Προόδου: Σάββατο, 21 Μαρτίου 2009, ώρα 9:15 - 11:05 π.μ.
[Up - Table of Contents]
[Prev - 8. Verilog Intro. 1]
[printer version - PDF]
[10. Processor Datapath - Next]
Ο σκοπός αυτής της σειράς ασκήσεων είναι η παρουσίαση ορισμένων επιπλέον δυνατοτήτων της γλώσσας Verilog και η περαιτέρω εξοικείωση σας με τα συναφή εργαλεία. Συγκεκριμένα θα χρησιμοποιήσουμε:
  • Συνδυαστικά και ακολουθιακά στοιχεία από τη βιβλιοθήκη του μαθήματος (lib9_mux2, lib9_mux4, lib9_alu, lib9_reg).
  • Σταθερές και σήματα πολλών bits.
  • Ρολόϊ.
    Οι επιμέρους άσκησεις της σειράς 9 περιλαμβάνουν:
  • Μελέτη ενός κυκλώματος και της περιγραφής του σε Verilog που δίδονται.
  • Προσομοίωση του κώδικα με τον compiler Ιcarus Verilog.
  • Έλεγχος των εξόδων του συστήματος με το εργαλείο κυματομορφών gtkwave .
  • Επέκταση του κώδικα για να περιλαμβάνει νέα κυκλώματα και επαναπροσομοίωση και έλεγχο εξόδων.
  • Registered ALU-MUX example circuit

    Άσκηση 9.1:   Περιγραφή Κυκλώματος σε Verilog

    Το κύκλωμα με το οποίο θα ξεκινήσουμε φαίνεται στο σχήμα δίπλα. Τα άσπρα βέλη χρησιμοποιούνται για να δείξουν ότι τα σύρματα αυτά είναι είσοδοι ή έξοδοι απο το σύστημα μας. Το σύστημα διαβάζει τις εισόδους in_a και in_b σε κάθε κύκλο ρολογιού clk, υπολογίζει την πράξη μεταξύ τους --όπως ορίζει το alu_op-- και τέλος αποθηκεύει στον καταχωρητή εξόδου είτε το αποτέλεσμα αυτό ή την είσοδο in_b (από τον καταχωρητή εισόδου). Ο κώδικας που περιγράφει το κύκλωμα αυτό σε Verilog είναι ο εξής:
        module ask9a (out, in_a, in_b, alu_op, mux_sel, clk);
            output [31:0] out;          // data output
            input  [31:0] in_a, in_b;   // data inputs
            input   [1:0] alu_op;       // control inputs
            input         mux_sel;
            input  clk;                 // clock
    
            // declare internal signals:
            wire [31:0] reg_a, reg_b, alu_out, mux_out;
    
            // input registers:
            lib9_reg #32 r0 (reg_a, in_a, clk);
            lib9_reg #32 r1 (reg_b, in_b, clk);
    
            // ALU:
            lib9_alu #32 alu0 (alu_out, reg_a, reg_b, alu_op);
    
            // mux:
            lib9_mux2 #32 m0 (mux_out, alu_out, reg_b, mux_sel);
    
            // output register:
            lib9_reg #32 r2 (out, mux_out, clk);
        endmodule 
    
    Γράψτε το παραπάνω module στο αρχείο "ask9a.v" --αυτή είναι η περιγραφή του κυκλώματος. Σε αυτήν την άσκηση, το περιβάλλον ελέγχου (test bench) θα είναι σε ξεχωριστό αρχείο, και δίδεται έτοιμο:
    ~hy225/verilog/test/test9a.v
    Αντιγράψτε το αρχείο αυτό στην περιοχή σας. Η βασική δομή του έχει ως εξής:
        `define clk_period 10
    
        module test;
            ...
            // clock:
            reg clk;
            initial clk = 1;
            always begin
                    #(`clk_period / 2)
                    clk = ~clk;
            end
            ...
            // instantiate the design:
            ask9a a0 (out, in_a, in_b, alu_op, mux_sel, clk);
            ...
            // vectors:
            initial begin
                ...
                @(posedge clk);
                #(`hold);
                in_a    = 3;
                in_b    = 'hFFFF;
                alu_op  = 0;
                mux_sel = 1;
                @(posedge clk);
                ...
            end
            ...
        endmodule
    
    Θα χρειαστεί επίσης να αντιγράψετε στην περιοχή σας το αρχείο:
    ~hy225/verilog/lib/lib9.v
    που περιέχει τη βιβλιοθήκη των modules του ask9a: καταχωρητές (lib9_reg), αριθμητική-λογική μονάδα (lib9_alu), και πολυπλέκτες (lib9_mux2). Τρέξετε τον προσομοιωτή όπως στην άσκηση 8.3. Ελέγξτε ότι οι έξοδοι έχουν σωστή τιμή με βάση τις εισόδους. Προσοχή στο ποιές είσοδοι περνούν απο καταχωρητή και ποιές όχι!

    Άσκηση 9.2:   Έλεγχος Κυματομορφών με gtkwave

    Χρησιμοποιήστε το εργαλείο gtkwave, όπως στην άσκηση 8.4, γιά να δείτε τις κυματομορφές για τα σήματα.

    Άσκηση 9.3: Τροποποίηση του Κυκλώματος

    Registered ALU-MUX example circuit Τροποποιήστε το κύκλωμα που σας δόθηκε παραπάνω, ώστε να γίνει όπως στο σχήμα εδώ. Η καινούρια προσθήκη επιτρέπει το αποτέλεσμα να είναι ίσο με (in_a + 4), όταν mux_sel == 0. Τα στοιχεία που είναι καινούρια, ή που πρέπει να αλλάξουν απο το προηγούμενο σχέδιο, είναι απεικονισμένα με παχύτερες γραμμές. Γιά τον μεγαλύτερο πολυπλέκτη, θα χρειαστεί να αλλάξετε το module lib9_mux2 στο αμέσως μεγαλύτερο, "lib9_mux4", και να συνδέσετε μια τυχαία τιμή στην τελευταία του είσοδο (π.χ. ένα σύρμα με την τιμή 0). Οι πόρτες του module lib9_mux4 έχουν δηλωθεί στη βιβλιοθήκη, κατ' αναλογία με τις πόρτες του module lib9_mux2, με τη σειρά: έξοδος, είσοδος00, είσοδος01, είσοδος10, είσοδος11, σήμα ελέγχου. Σύρματα με σταθερές τιμές κανονικά θα έπρεπε να μπορούσατε να ορίσετε π.χ. με:
            wire [31:0] const_in;
            assign const_in = 32'h4; 
    
    Όμως, λόγω κάποιου bug που σχετίζεται και με τη δική μας (ΗΥ-225) βιβλιοθήκη, δηλώστε την επάνω είσοδο της νέας ALU σαν (αρχικοποιημένο) reg:
            reg [31:0] const_in;
            initial const_in = 32'h4;
    
    Υλοποιήστε την επέκταση αυτή σε ένα διαφορετικό αρχείο, "ask9b.v", με όνομα module "ask9b" αντί "ask9a", και δοκιμάστε την όπως προηγουμένως, χρησιμοποιώντας όμως το αρχείο "~hy225/verilog/test/test9b.v".

    Παραδώστε (submit), με τον τρόπο των προηγουμένων ασκήσεων, τρία αρχεία: τον κώδικά σας ask9b.v, ένα χαρακτηριστικό στιγμιότυπο από το gtkwave της άσκησης 9.2, gtkwave92.jpg, και ένα άλλο από το gtkwave της άσκησης 9.3, gtkwave93.jpg.



    [Up - Table of Contents]
    [Prev - 8. Verilog Intro. 1]
    [printer version - PDF]
    [10. Processor Datapath - Next]

    Up to the Home Page of CS-225
     
    © copyright University of Crete, Greece.
    Last updated: 26 Apr. 2009, by M. Katevenis.