ΗΥ-225: Οργάνωση Υπολογιστών
Άνοιξη 2003
Τμ. Επ. Υπολογιστών
Πανεπιστήμιο Κρήτης
[print-optimized version here]

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

Προθεσμία έως Δευτέρα 24 Μαρτίου (βδομάδα 6)
Υπενθύμιση: Διαγωνισμός Προόδου Σάββατο, 5 Απριλίου, ώρα 10:00 - 12:00

Ο σκοπός αυτής της σειράς ασκήσεων είναι η παρουσίαση ορισμένων επιπλέον δυνατοτήτων της γλώσσας Verilog και η περαιτέρω εξοικείωση σας με τα συναφή εργαλεία. Συγκεκριμένα θα χρησιμοποιήσουμε:

Οι επιμέρους άσκησεις της σειράς 8 περιλαμβάνουν: Registered ALU-MUX example circuit

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

Το κύκλωμα με το οποίο θα ξεκινήσουμε φαίνεται στο σχήμα δίπλα. Τα άσπρα βέλη χρησιμοποιούνται για να δείξουν ότι τα σύρματα αυτά είναι είσοδοι ή έξοδοι απο το σύστημα μας. Το σύστημα διαβάζει τις εισόδους in_a και in_b σε κάθε κύκλο ρολογιού clk, υπολογίζει την πράξη μεταξύ τους --όπως ορίζει το alu_op-- και τέλος αποθηκεύει στον καταχωρητή εξόδου είτε το αποτέλεσμα αυτό ή την είσοδο in_b (από τον καταχωρητή εισόδου). Ο κώδικας που περιγράφει το κύκλωμα αυτό σε Verilog είναι ο εξής:
    module ask8a (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:
        lib8_reg #32 r0 (reg_a, in_a, clk);
        lib8_reg #32 r1 (reg_b, in_b, clk);

        // ALU:
        lib8_alu #32 alu0 (alu_out, reg_a, reg_b, alu_op);

        // mux:
        lib8_mux2 #32 m0 (mux_out, alu_out, reg_b, mux_sel);

        // output register:
        lib8_reg #32 r2 (out, mux_out, clk);
    endmodule 
Γράψτε το παραπάνω module στο αρχείο "ask8a.v" --αυτή είναι η περιγραφή του κυκλώματος. Σε αυτήν την άσκηση, το περιβάλλον ελέγχου (test bench) θα είναι σε ξεχωριστό αρχείο, και δίδεται έτοιμο:
~hy225/verilog/test/test8a.v

Αντιγράψτε το αρχείο αυτό στην περιοχή σας. Η βασική δομή του έχει ως εξής:

    `define clk_period 10

    module test;
        ...
        // clock:
        reg clk;
        initial clk = 1;
        always begin
                #(`clk_period / 2)
                clk = ~clk;
        end
        ...
        // instantiate the design:
        ask8a 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/lib8.v
που περιέχει τη βιβλιοθήκη των modules που χρησιμοποιεί το ask8a, δηλ. καταχωρητές (lib8_reg), αριθμητική/λογική μονάδα (lib8_alu), και πολυπλέκτες (lib8_mux2). Για να τρέξετε την προσομοίωση ακολουθήστε βήματα όπως εκείνα της άσκησης 4:
        % xhost +
        % rlogin  [katalliloMixanima]
        % setenv  DISPLAY [arxikoMixanima]:0.0
        % source  ~hy225/verilog/scripts/cds_ldv.sh
        % verilog lib8.v ask8a.v test8a.v
όπου [arxikoMixanima] είναι το όνομα της μηχανής από την οποία κάνετε rlogin, και [katalliloMixanima] είναι ένα από τα:
apraktias, livas, levantes, pounentes, graegos, zefyros

Ελέγξτε ότι οι έξοδοι έχουν σωστή τιμή με βάση τις εισόδους. Προσοχή στο ποιές είσοδοι περνούν απο καταχωρητή και ποιές όχι!


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

Χρησιμοποιήστε το εργαλείο signalscan, όπως στην άσκηση 4.2, γιά να δείτε τις κυματομορφές για τα σήματα του κυκλώματός. ΠΡΟΣΟΧΗ: σε ώρες πυκνής χρήσης, αποφύγετε να μένετε πολλή ώρα μέσα στο εργαλείο signalscan: έχουμε περιορισμένο αριθμό αδειών χρήσης (licenses), κι έτσι άλλοι συνάδελφοί σας μπορεί να μην μπορούν να μπούν σε αυτό. Registered ALU-MUX example circuit

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

Τροποποιήστε το κύκλωμα που σας δόθηκε παραπάνω, ώστε να γίνει όπως στο σχήμα εδώ. Η καινούρια προσθήκη επιτρέπει το αποτέλεσμα να είναι ίσο με (in_a + 4), όταν mux_sel == 0. Τα στοιχεία που είναι καινούρια, ή που πρέπει να αλλάξουν απο το προηγούμενο σχέδιο, είναι απεικονισμένα με παχύτερες γραμμές. Γιά τον μεγαλύτερο πολυπλέκτη, θα χρειαστεί να αλλάξετε το module mux2 στο αμέσως μεγαλύτερο, "mux4", και να συνδέσετε μια τυχαία τιμή στην τελευταία του είσοδο (π.χ. ένα σύρμα με την τιμή 0). Οι πόρτες του module mux4 έχουν δηλωθεί στη βιβλιοθήκη, κατ' αναλογία με τις πόρτες του module mux2, με τη σειρά: έξοδος, είσοδος00, είσοδος01, είσοδος10, είσοδος11, σήμα ελέγχου. Σύρματα με σταθερές τιμές μπορείτε να ορίσετε π.χ. με:
        wire [31:0] const_in;
        assign const_in = 32'h4; 
Υλοποιήστε την επέκταση αυτή σε ένα διαφορετικό αρχείο, "ask8b.v", με όνομα module "ask8b" αντί "ask8a", και δοκιμάστε την όπως προηγουμένως, χρησιμοποιώντας όμως το αρχείο "~hy225/verilog/test/test8b.v". Παραδώστε, όπως και στις προηγούμενες ασκήσεις, τον κώδικά σας ask8b.v, ένα χαρακτηριστικό στιγμιότυπο από το signalscan της άσκησης 8.2, και ένα άλλο από το Signalscan της άσκησης 8.3, πακεταρισμένα στο αρχείο "ask8.tar", μέσω:
        tar -cvf ask8.tar   ask8b.v signals82.jpg signals83.jpg
        ~hy225/bin/submit 8


Up to the Home Page of CS-225
 
 
© copyright University of Crete, Greece.
Originally written by S. Lyberis and G. Sapountzis.
Last updated: 16 Mar. 2003, by M. Katevenis.