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

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

Προθεσμία έως Παρασκευή 26 Μαρτίου 2010, ώρα 23:59
[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 που δίδονται.
  • Προσομοίωση του κώδικα με το ModelSim
  • Επέκταση του κώδικα για να περιλαμβάνει νέα κυκλώματα και επαναπροσομοίωση και έλεγχο εξόδων.
  • Registered ALU-MUX example circuit

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

    Το κύκλωμα με το οποίο θα ξεκινήσουμε φαίνεται στο σχήμα δίπλα. Τα άσπρα βέλη χρησιμοποιούνται για να δείξουν ότι τα σύρματα αυτά είναι είσοδοι ή έξοδοι απο το σύστημα μας. Το σύστημα διαβάζει τις εισόδους in_a και in_b σε κάθε κύκλο ρολογιού clk, υπολογίζει την πράξη μεταξύ τους --όπως ορίζει το alu_op-- και τέλος αποθηκεύει στον καταχωρητή εξόδου είτε το αποτέλεσμα αυτό ή την είσοδο in_b (από τον καταχωρητή εισόδου). Ο κώδικας που περιγράφει το κύκλωμα αυτό σε Verilog είναι ο εξής:
         `timescale 1ns/1ps
         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) θα είναι σε ξεχωριστό αρχείο, και δίδεται έτοιμο:
    test9a.v
    Αντιγράψτε το αρχείο αυτό στην περιοχή σας. Η βασική δομή του έχει ως εξής:
        `timescale 1ns/1ps
        `define clk_period 10
        `define hold 1
    
        module test;
     
    	reg [31:0] in_a, in_b;
    	reg [1:0] alu_op;
    	reg mux_sel;
    	wire [31:0] out;
    
            // 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
    
    Θα χρειαστεί επίσης να αντιγράψετε στην περιοχή σας το αρχείο:
    lib9.v
    που περιέχει τη βιβλιοθήκη των modules του ask9a: καταχωρητές (lib9_reg), αριθμητική-λογική μονάδα (lib9_alu), και πολυπλέκτες (lib9_mux2). Τρέξετε τον προσομοιωτή όπως στην άσκηση 8.3. Ελέγξτε ότι οι έξοδοι έχουν σωστή τιμή με βάση τις εισόδους. Προσοχή στο ποιές είσοδοι περνούν απο καταχωρητή και ποιές όχι!

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

    Χρησιμοποιήστε το ModelSim, όπως στην άσκηση 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", και δοκιμάστε την όπως προηγουμένως, χρησιμοποιώντας όμως το αρχείο "test9b.v".

    Παραδώστε (submit), με τον τρόπο των προηγουμένων ασκήσεων, τρία αρχεία: τον κώδικά σας ask9b.v, ένα χαρακτηριστικό στιγμιότυπο από το ModelSim της άσκησης 9.2, wave92.jpg, και ένα άλλο από το ModelSim της άσκησης 9.3, wave93.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: , by C. Kachris.