ΠΑΝΕΠΙΣΤΗΜΙΟ ΙΩΑΝΝΙΝΩΝ ΑΝΟΙΚΤΑ ΑΚΑΔΗΜΑΪΚΑ ΜΑΘΗΜΑΤΑ Αρχιτεκτονική Υπολογιστών Αρχιτεκτονικό σύνολο εντολών Διδάσκων: Επίκουρος Καθηγητής Αριστείδης Ευθυμίου
Άδειες Χρήσης Το παρόν εκπαιδευτικό υλικό υπόκειται σε άδειες χρήσης Creative Commons. Για εκπαιδευτικό υλικό, όπως εικόνες, που υπόκειται σε άλλου τύπου άδειας χρήσης, η άδεια χρήσης αναφέρεται ρητώς.
ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Γλώσσα περιγραφής υλικού: Verilog Αρης Ευθυμίου
Το σημερινό μάθημα! Η γλώσσα περιγραφής υλικού Verilog Περίληψη των αντίστοιχων μαθημάτων Ψηφιακής σχεδίασης έμφαση σε πρακτική χρήση, όχι ολοκληρωμένη παρουσίαση! Σκοπός: Στα επόμενα 3 εργαστήρια θα χρησιμοποιήσετε Verilog Κυρίως μικρές αλλαγές σε έτοιμο κώδικα Σημαντικότερο να κατανοείτε τον υπάρχοντα κώδικα παρά να γράφετε δικό σας Επίσης βοηθά στην περιγραφή τμημάτων του επεξεργαστή 2
Τι είναι η γλώσσα Verilog! Γλώσσα περιγραφής υλικού (hardware descripdon language)! Επιτρέπει τη περιγραφή (μοντελοποίηση) ψηφιακών συστημάτων! Γιατί όχι διαγράμματα κυκλωμάτων, πίνακες αλήθειας, χάρτες Karnaugh,... ; Ταχύτητα ανάπτυξης μοντέλου Δυνατότητα απευθείας προσομοίωσης Δυνατότητα «σύνθεσης» υλικού: μετάφρασης σε «δίκτυο» λογικών πυλών (netlist) και βελτιστοποίησης (βλ. χάρτες Karnaugh κτλ) 3
Τι είναι (2)! Είναι γλώσσα προγραμματισμού; Ναι όταν χρησιμοποιείται για έλεγχο/οδήγηση προσομοίωσης ενός συστήματος (test- bench): παροχή εισόδου, έλεγχος εξόδου Οχι όταν περιγράφει πραγματικό υλικό! Τρία επίπεδα περιγραφής: Επίπεδο διαρθρωτικό (structural): περιγράφει τις συνδέσεις μεταξύ λογικών πυλών ή άλλων μονάδων Υποσύνολο συνθέσιμης περιγραφής «συμπεριφοράς» (synthesizable behavioural) Υποσύνολο μή- συνθέσιμης περιγραφής «συμπεριφοράς» (non- synthesizable behavioural)! για test- benches, αρχικά μοντέλα συστημάτων 4
Τυπική χρήση SYNTHESIZABLE VERILOG (DESIGN) LOGIC SYNTHESIS TOOL BEHAVIOURAL VERILOG (TEST-BENCH) SIMULATOR GATE-LEVEL VERILOG (THE NETLIST) 5
Τιμές! Βασικό δομικό κομμάτι είναι το bit με 4 «λογικές» τιμές: 0, 1 προφανώς! x δεν ξέρουμε την τιμή (ή δεν μας ενδιαφέρει) z δεν οδηγείται (τρι- κατάστατη οδήγηση)! Συμβουλή: αποφεύγετε ονόματα μεταβλητών x, z αν και χρησιμοποιούνται συχνά ως ονόματα εισόδων εξόδων! Οι τιμές μεταδίδονται μέσω καλωδίων nets! Κρατούνται σε καταχωρητές registers! Συνδιάζονται με τελεστές δημιουργώντας λογικές εκφράσεις! Οι εκφράσεις μπορούν να εκχωριθούν (assign) σε καλώδια ή καταχωρητές 6
Καλώδια! Τα καλώδια αναπαριστούν συνδέσεις μονάδων! Υπάρχουν διάφοροι τύποι, αλλά το πιο κοινό είδος ονομάζεται wire! Δεν κρατούν τιμές απλά τις μεταφέρουν wire w; assign w = a & b; Αναθέσεις τιμών σε καλώδια γίνονται μόνο μία φορά! Οποιαδήποτε αλλαγή στα a,b εμφανίζεται αμέσως στο w 7
Καταχωρητές (reg)! Ενας reg κρατάει μια τιμή που του εκχωρείται μέχρι την επόμενη εκχώριση όπως μια μεταβλητή σε γλώσσα προγραμματισμού! Χρησιμοποιείται για να περιγράψει στοιχεία αποθήκευσης flip- flops, μανταλωτές (latches), μνήμες,! Χρησιμοποιείται και για συνδιαστική λογική, γιατί είναι πιο βολικός από το τύπο net αλλά θέλει προσοχή στη χρήση/σύνταξη για να μην υπονοηθεί (infer) στοιχείο αποθήκευσης 8
Διανύσματα (vector)! Ενα bit δεν μπορεί να κάνει πολλά!! Συνήθως χρειαζόμαστε μια ομάδα από bits, όπου η θέση καθενός έχει σημασία (π.χ. αναπαράσταση ενός αριθμού) λέγονται διανύσματα (vectors) υπάρχουν και σε reg και σε wire! Περιγραφή διανύσματος: [ upper : lower ] Καλύτερα upper >= lower lower μπορεί να είναι οποιοσδήποτε αριθμός (όχι υποχρεωτικά 0)! Η Verilog συμπληρώνει με 0 στα αριστερά ό,τι bit λείπουν κατά την ανάθεση Νεότερες εκδόσεις της γλώσσας προσθέτουν προσημασμένους τύπους reg, wire 9
Διανύσματα - παράδειγμα wire [31:0] data; reg [31:16] upper_half; reg [15:0] lower_half; always @(data) begin lower_half = upper_half = lower_half = upper_half = end data[15:0]; data[31:0]; 0; data; extended with 0s 16 LSBs only. 10
Σταθερές - literals! Οι σταθερές συνήθως έχουν δηλωμένο μέγεθος και ξεκινούν με size base size σε bits, b binary, o octal, h hexadecimal, d decimal! Το x ή z θέτει 1 bit για b, 3 bit για o, 4 bit για h! Αν το πιο σημαντικό bit είναι 0, x or z, επεκτείνεται αυτόματα μέχρι το αριστερό άκρο wire [31:0] data1, [15:0] data2; wire enable; tri [31:0] bus; tri declares a tri-state wire, i.e. can be [0,1,z] assign assign assign assign enable data1 data2 bus assign data2 = = = = 1 b0; 32 h0000_0000; 16 d256; 32 bz; = 16 b0101 b = binary h = hex (underscore is ignored, helps visually) d = decimal assigns z to all 32 bits of the bus assigns 0000000000000101 to data2 11
Συνένωση διανυσμάτων! Για συνένωση (concatenadon) διανυσμάτων χρησιμοποιούμε: { vector1, vector2,..., vectorn }! Για συνένωση n φορές του ίδιου διανύσματος, χρησιμοποιούμε: { n { vector } }! Μπορεί να χρησιμοποιηθεί και στο αριστερό μέρος μιας ανάθεσης wire [31:0] data1, [15:0] data2, [3:0] data3; wire a, b, c, d; assign data3 = 4 b0011; assign data2 = {4{data3}}; assign data1 = {16 d0, data2}; assigns 00000000000000000011001100110011 to data1 assigns 0011001100110011 to data2 assign {a,b,c,d} = data3; 12
Τελεστές!!!!!! Arithmedc: + - * / % Logical: &&! Bitwise: & ^ ~ ~^ Comparison: ==!= > < >= <= Reducdon: & ~& ~ ^ ~^ Shi : << >> 13
Αριθμητικές πράξεις wire [3:0] x, y, sum, diff, prod, div, mod; assign x = 4 b1100; 12 assign y = 4 b0011; 3 assign assign assign assign sum prod div mod = = = = x x x x + * / % y; y; y; y; sum gets 15 prod gets lower 4 bits of 8 b10_0100, i.e. 4 b0100 div gets 4 mod gets 0! Αν οποιοδήποτε bit τελεστέου έχει x ή z, όλα τα bit του αποτελέσματος είναι x! Αν το αποτέλεσμα έχει μεγαλύτερο μήκος σε bits, μόνο τα λιγότερο σημαντικά bits εκχωρούνται αν γίνει υπερχείλιση,... wire [3:0] x, y, sum, carry; assign x = 4 b1100; 12 assign y = 4 b0100; 4 assign sum = x + y; 4 b0000 assign {carry, sum} = x + y; 5 b1_0000 14
Συγκρίσεις, λογικές πράξεις! Οι συγκρίσεις (<,>,...) θέλουν προσοχή για αρνητικούς αριθμούς κανονικά οι συγκρίσεις ακολουθούν τη δήλωση των reg, wire απρόσημοι με όσα είπαμε εδω! Οι λογικές πράξεις υποθέτουν ότι οι τελεστέοι είναι 1 bit (boolean) υπάρχουν ειδικοί τελεστές για δυαδικές πράξεις wire [3:0] x, y, z; assign x = 4 b1100; assign y = 4 b0011; 12 3 assign z = (((x == 4 d0) && (y > x))!(y < 4 d10)) 15
Δυαδικές (λογικές) πράξεις!!!! Bitwise AND & Bitwise OR Bitwise XOR ^ Bitwise NOT ~ wire[3:0] a, b, z1, z2, z3, z4; assign a = 4 b1100; assign b = 4 b0111; 12 7 assign assign assign assign z1 z2 z3 z4 = = = = a & b; a b; a ^ b; ~a; z1 z2 z3 z4 gets gets gets gets 0100 1111 1011 0011 16
Τελεστές αναγωγής (reducdon)!!!! Αναγωγική AND / NAND &expr ~&expr Αναγωγική OR / NOR expr ~ expr Αναγωγική XOR / XNOR ^expr ~^expr Κάνει τη λογική πράξη σε όλα τα bit ενός διανύσματος, μεταξύ τους wire[3:0] a, b; wire z1, z2, z3, z4, z5; assign a = 4 b1100; assign b = 4 b0111; assign assign assign assign assign z1 z2 z3 z4 z5 = = = = = &a; &a[3:2]; b; ^a; ~^b; z1 z2 z3 z4 z5 gets gets gets gets gets (1 & 1 & 0 & 0) = 0 (1 & 1) = 1 (0 1 1 1) = 1 (1 ^ 1 ^ 0 ^ 0) = 0 ~(0 ^ 1 ^ 1 ^ 1) = ~(1) = 0 17
Τελεστές ολίσθησης! Αριστερή ολίσθηση <<! Δεξιά ολίσθηση >> Συμπληρώνονται με 0 wire [3:0] a, b, z1, z2, z3, z4; assign a = 4 b1100; assign b = 4 b0111; assign assign assign assign z1 z2 z3 z4 = = = = a a a a << >> >> << 1; 2; 5; 5; z1 z2 z3 z4 gets gets gets gets 1000 0011 0000 0000 18
Ενότητες (modules)! Η ενότητα είναι το δομικό στοιχείο κατασκευής ιεραρχικών κυκλωμάτων μοιάζουν με κλάσεις σε ΟΟ γλώσσες προγραμματισμού Καλή πρακτική: κάθε module σε ξεχωριστό αρχείο με όνομα ίδιο με αυτό του module! Αφού οριστεί/δηλωθεί, μια ενότητα μπορεί να χρησιμοποιηθεί πολλές φορές ως συστατικό άλλων ενοτήτων υπόσταση/στιγμιότυπο - instance! Για παράδειγμα μια λογική πύλη AND αποτελεί μια ενότητα αλλά υπάρχει σε πολλά σημεία σε ένα κύκλωμα δηλ. έχει πολλά instances! Η υψηλότερου επιπέδου (top level) ενότητα αποτελεί το (συνολικό) κύκλωμα Αν και δέν υπάρχουν instances της, η δήλωση θεωρείται και instance 19
Επικοινωνία ενοτήτων! Οι υποστάσεις ενοτήτων επικοινωνούν μέσω θυρών (port)! Κάθε θύρα είναι ένα ονομαζόμενο σήμα ή διάνυσμα σημάτων! Θύρες εισόδου πρέπει να συνδεθούν με (οδηγηθούν από) regs ή wires εσωτερικά είναι πάντα wire! Θύρες εξόδου οδηγούν wires της (υπερ)ενότητας στην οποία τοποθετείται μια υπόσταση της ενότητας εσωτερικά μπορούν να είναι reg ή wire 20
Δηλώσεις ορισμάτων/θυρών Τρία είδη:! Σήματα/διανύσματα εισόδου! εξόδου! αμφίδρομα (bidirecdonal) module foo (a, b, c); input wire [6:0] a; output wire [13:0] b; inout tri c; vector of input wires vector of output wires tri-state input/output assign b = {a, {7{c}}; assign c = b[0]? 1 bz : a[0]; drive out with a[0] if b[0] is true endmodule P.S. Can you see a problem with the circuit above? 21
Υποστάσεις instances module foo (one, two); input wire one; output wire two; module foo (one, two); input wire one; output wire two; assign two = ~one; assign two = ~one; endmodule module bar (a, b); input wire a; output wire b; foo u_foo(a, b); endmodule Instance name positional args endmodule module bar (a, b); input wire a; output wire b; foo u_foo(.one(a),.two(b) ); named args endmodule Η υπόσταση χρειάζεται ένα όνομα Οι πόρτες συνδέονται είτε με τη σειρά ορισμού, είτε, καλύτερα, με τα ονόματα θυρών 22
Διεργασίες 1/2! Τα κυκλώματα δεν «υπολογίζουν» σειριακά όπως τα προγράμματα όλα τα τμήματα λειτουργούν ταυτόχρονα! Τα συνδιαστικά κυκλώματα ανταποκρίνονται σε κάθε αλλαγή εισόδου, ξανα- υπολογίζοντας την έξοδό τους! Τα (σύγχρονα) ακολουθιακά κυκλώματα ανταποκρίνονται στις μεταβολές του σήματος ρολογιού! Η Verilog παρέχει δομές διεργασιών για να χειριζόμαστε αυτές τις δύο κατηγορίες κυκλωμάτων 23
Διεργασίες 2/2! Κάθε διεργασία έχει επικεφαλίδα (header) και κύριο σώμα (body)! Η επικεφαλίδα ορίζει μια λίστα από σήματα τα οποία η διεργασία πρέπει να παρακολουθεί για αλλαγές τιμών (sensi[vity list)! Το κύριο σώμα ορίζει τί πρέπει να γίνει όταν ένα σήμα εισόδου αλλάξει σε απλές περιπτώσεις είναι ένα σύνολο εντολών που υπολογίζει το σήμα εξόδου Εκχωρίσεις τιμών επιτρέπονται μόνο σε reg μέσα σε διεργασίες 24
Συνδιαστικές διεργασίες module decode_2_to_4 (x, z); input wire [1:0] x; output reg [3:0] z; module NAND (x, y, z); input wire x, y; output reg z; always @(x) begin : decode_proc z[0] = (x == 2 b00); z[1] = (x == 2 b01); z[2] = (x == 2 b10); z[3] = (x == 2 b11); end always @(x or y) z = ~(x & y); endmodule module mux(a, b, c, q); endmodule input a,b,c; output q; reg q; always @( a or b or c ) if (c == 1 b1) q = a; else q = b; endmodule If items are missing from the sensitivity list, the logic will not simulate correctly. always @(*) always @(x) z = ~(x & y); 25
Ακολουθιακές διεργασίες module D_LATCH (d, ck, q); module D_FF(d, ck, q); input d, ck; output q; input d, ck; output q; reg q; reg q; always @( d or ck ) if (ck == 1 b1) q = d; endmodule always @( posedge ck ) q <= d; endmodule! Η επικεφαλίδα περιέχει μια ακμή ρολογιού, ή! έναν αριθμό από σήματα, αλλά δεν εκχωρούνται τιμές σε όλες τις περιπτώσεις υπονοείται (infer) μανταλωτής (latch) συχνό λάθος. ο χρήστης ήθελε συνδιαστική διεργασία 26
Αναθέσεις τιμών Τρία είδη ανάθεσης τιμών:! Συνεχόμενη (condnuous): εντολή assign η έξοδος ξανα- υπολογίζεται αυτόματα όταν αλλάζει μία από τις εισόδους μόνο για καλώδια: wire, tri, αναθέσεις σε καλώδια μόνο με assign ή ως έξοδοι modules! Φραγής (blocking): με τον τελεστή = όπως σε γλώσσες προγραμματισμού: η σειρά εκτέλεσης έχει σημασία π.χ. a = #5 b;! Μή- φραγής (non- blocking): με τον τελεστή <= η σειρά δεν έχει σημασία π.χ. a <= #5 b; καθυστέρηση 27
Φραγή και αναθέσεις! Στις αναθέσεις φραγής, η επόμενη εντολή εκτελείται αφού γίνει η ανάθεση (και περάσει η καθυστέρηση, #.. αν υπάρχει)! Αντίθετα στις αναθέσεις μή- φραγής, η επόμενη εντολή εκτελείται «ταυτόχρονα» με την ανάθεση! Παράδειγμα (έστω a = 0, b=1) a = b; a <= b; c = a + 1; c <= a + 1; Αποτέλεσμα: a = 1, c = 2 Αποτέλεσμα: a = 1, c = 1 28
Αναθέσεις τιμών - κανόνες! Σε ακολουθιακές διεργασίες δεν χρησιμοποιούμε αναθέσεις φραγής! Πρέπει να υπάρχει μία μόνο διεργασία που εκχωρεί τιμή σε ένα reg! Σε συνδιαστικές διεργασίες χρησιμοποιούμε μόνο αναθέσεις φραγής! Σε μία διεργασία έχουμε μόνο ένα είδος ανάθεσης always @( posedge ck or posedge rst) if (rst == 1 b1) q <= 1 b0; else q <= d; always @(x or y) begin : logic_proc z = (x == 2 b00); if (y == 1 b1) z = x[0]; end 29
Εντολές ελέγχου! Υπάρχουν εντολές ελέγχου if- then- else, case, και επαναλήψεων: while, for, forever! Χρησιμοποιούμε begin end για περισσότερες από μία εντολή οι περιπτώσεις της case, δεν χρειάζονται break σαν την C (Java?) και αν χρειάζονται περισσότερες εντολές πρέπει να περικλείονται σε begin end. reg [N-1:0] out; always @(*) begin case (sel) 0: out <= #(`MUX_D) in0; 1: out <= #(`MUX_D) in1; endcase end 30
Διεργασίες inidal! Εκτός από τις always, υπάρχει ένας άλλος τρόπος για περιγραφή διεργασιών με την δεσμευμένη λέξη inidal! Αυτές οι διεργασίες δεν χρησιμοποιούνται για σύνθεση κυκλωμάτων αλλά μόνο για μοντελοποίηση υψηλού επιπέδου και οδήγηση προσομοίωσης (test- bench)! Χρήσεις: αρχικοποίηση reg σημάτων καλύτερα να χρησιμοποιεί κανείς ένα σήμα reset παραγωγή σημάτων εισόδου για έλεγχο κυκλώματος 31
Test benches! Περιγράφουν το περιβάλον μέσα στο οποίο θα τοποθετηθεί το κύκλωμα υπό σχεδίαση! Δεν κατασκευάζεται μπορεί να χρησιμοποιήσει μή- συνθέσιμες δομές Verilog! Παράγει εισόδους, σήματα χρονισμού (ρολόι)! Ελέγχει τις εξόδους για λάθη! Παραπέμπω στις διαφάνειες της Ψηφιακή σχεδίασης για λεπτομέρειες 32
Αρχικοποίηση καταχωρητών module dff_le_r (q, d, lden, reset, clk); output reg [31:0] q; input clk; input reset; input lden; input [31:0] d; always @(posedge clk or negedge reset) begin if (!reset) dff_le_r pc( q <= 'h0;.q(pc_r), else if (lden) begin.d(nextpc), q <= #`DFF_D d;.lden(1'b1), end.clk(clk), end.reset(reset) endmodule ); 33
Επόμενο μάθημα Σχεδίαση επεξεργαστή 1ο μέρος: δίαυλος δεδομένων 34
Τέλος Ενότητας
Χρηματοδότηση Το παρόν εκπαιδευτικό υλικό έχει αναπτυχθεί στα πλαίσια του εκπαιδευτικού έργου του διδάσκοντα. Το έργο «Ανοικτά Ακαδημαϊκά Μαθήματα στο Πανεπιστήμιο Ιωαννίνων» έχει χρηματοδοτήσει μόνο τη αναδιαμόρφωση του εκπαιδευτικού υλικού. Το έργο υλοποιείται στο πλαίσιο του Επιχειρησιακού Προγράμματος «Εκπαίδευση και Δια Βίου Μάθηση» και συγχρηματοδοτείται από την Ευρωπαϊκή Ένωση (Ευρωπαϊκό Κοινωνικό Ταμείο) και από εθνικούς πόρους.
Σημειώματα
Σημείωμα Ιστορικού Εκδόσεων Έργου Το παρόν έργο αποτελεί την έκδοση 1.0. Έχουν προηγηθεί οι κάτωθι εκδόσεις: Έκδοση 1.0 διαθέσιμη εδώ. http:ecourse.uoi.gr/course/view.php?id=1307.
Σημείωμα Αναφοράς Copyright Πανεπιστήμιο Ιωαννίνων, Διδάσκων: Επίκουρος Καθηγητής Αριστείδης Ευθυμίου. «Αρχιτεκτονική Υπολογιστών. Αρχιτεκτονικό σύνολο εντολών». Έκδοση: 1.0. Ιωάννινα 2014. Διαθέσιμο από τη δικτυακή διεύθυνση: http:ecourse.uoi.gr/course/view.php?id=1307.
Σημείωμα Αδειοδότησης Το παρόν υλικό διατίθεται με τους όρους της άδειας χρήσης Creative Commons Αναφορά Δημιουργού - Παρόμοια Διανομή, Διεθνής Έκδοση 4.0 [1] ή μεταγενέστερη. [1] https:creativecommons.org/licenses/by-sa/4.0/.