«Σχεδιασμός Ολοκληρωμένων Κυκλωμάτων» Χειμερινό εξάμηνο 2016-2017 Συναρτήσεις, Διαδικασίες και Δομές Ελέγχου Λειτουργίας Κυκλωμάτων (testbenches) Παρασκευάς Κίτσος http://diceslab.cied.teiwest.gr Επίκουρος Καθηγητής Tμήμα Μηχανικών Πληροφορικής ΤΕ E-mail: pkitsos@teimes.gr Αντίρριο 09/12/2016 1
ΔΟΜΗ ΠΑΡΟΥΣΙΑΣΗΣ Συναρτήσεις Διαδικασίες Δομές ελέγχου ορθής λειτουργίας 2
ΣΥΝΑΡΤΗΣΕΙΣ Η Συνάρτηση (Function) είναι ένα τμήμα ακολουθιακού κώδικα Χρησιμοποιείται για μετατροπές τύπων δεδομένων, λογικές πράξεις, αριθμητικούς υπολογισμούς κλπ Αποτελεί είδος υποπρογράμματος το οποίο επιστρέφει μια μοναδική τιμή Καλούνται από εκφράσεις που βρίσκονται στο κώδικα 3
ΣΥΝΤΑΞΗ ΣΥΝΑΡΤΗΣΗΣ FUNCTION όνομα συνάρτησης [<λίστα_παραμ>] RETURN τύπος_δεδομένων IS [δηλώσεις] BEGIN ακολουθιακές εντολές END όνομα συνάρτησης; Η <λίστα_παραμ> καθορίζει τις παραμέτρους των εισόδων της συνάρτησης Π.χ. <λίστα_παραμ> =[constant] όνομα_σταθεράς: τύπος_σταθεράς; ή <λίστα_παραμ> =signal όνομα_σήματος: τύπος_σήματος; Π.χ. FUNCTION f1 (a, b: INTEGER; SIGNAL c: STD_LOGIC_VECTOR) RETURN BOOLEAN IS BEGIN (sequential statements) END f1; 4
ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΗΣ Η συνάρτηση καλείται ως τμήμα μιας παράστασης Η παράσταση μπορεί να εμφανίζεται είτε μόνη της είτε να συνδέεται με μια εντολή (συντρέχουσα ή ακολουθιακή) Παραδείγματα κλήσης X<=conv_integer(a); (η παράσταση εμφανίζεται μόνη της) If x>maximum(a, b); (η παράσταση συνδέεται με μια εντολή) 5
ΠΑΡΑΔΕΙΓΜΑ (ΣΥΝΑΡΤΗΣΗ conv_integer) -----------------Σώμα συνάρτησης------------------------------ FUNCTION conv_integer (SIGNAL vector: STD_LOGIC_VECTOR) RETURN INTEGER IS VARIABLE result: INTEGER RANGE 0 to 2**vector 'LENGTH -1; BEGIN IF (vector(vector 'HIGH)='1') THEN result := 1; ELSE result := 0; END IF; FOR i IN (vector 'HIGH -1) DOWNTO (vector 'LOW) LOOP result := result ** 2; IF (vector(i)='1') THEN result := result + 1; END IF; END LOOP; RETURN result; END conv_integer; -------------------Κλήση συνάρτησης---------------------------------------... y <= conv_integer(a); 6
ΔΙΑΔΙΚΑΣΙΕΣ Οι διαδικασίες (PROCEDURES) είναι παρόμοιες με τις συναρτήσεις Όμως, μπορεί να επιστρέψει περισσότερες τιμές Συντάσσεται όπως φαίνεται παρακάτω PROCEDURE όνομα_διαδικασίας [<λίστα_παραμ>] IS [δηλώσεις] BEGIN (ακολουθιακές εντολές) END όνομα_διαδικασίας; 7
ΔΙΑΔΙΚΑΣΙΕΣ Η <λίστα_παραμέτρων> καθορίζει τις παραμέτρους εισόδου και εξόδου Π.χ. <λίστα_παραμέτρων>= [CONSTANT] όνομα_σταθεράς: κατάσταση λειτουργίας; <λίστα_παραμέτρων>= signal όνομα_σήματος: κατάσταση λειτουργίας; < λίστα_παραμέτρων>= VARIABLE όνομα_μεταβλητής: κατάσταση λειτουργίας; Η κλήση μιας διαδικασίας αποτελεί μια εντολή από μόνη της Μπορεί να εμφανίζεται μόνη της Ή να σχετίζεται με μια άλλη εντολή Παραδείγματα κλήσης compute_min_max(in1, in2, in3, out1, out2); -- εντολή από μόνη της divide(dividend, divisor, quotient, remainder); -- εντολή από μόνη της IF (a>b) THEN compute_min_max(in1, in2, in3, out1, out2); -- κλήση διαδικασίας που συνδέεται με μια άλλη εντολή 8
ΘΕΣΗ ΣΥΝΑΡΤΗΣΗΣ ΚΑΙ ΔΙΑΔΙΚΑΣΙΑΣ 9
ΔΙΑΔΙΚΑΣΙΑ ΣΤΟ ΚΥΡΙΩΣ ΚΩΔΙΚΑ 1 ------------------------------------------------------ 2 LIBRARY ieee; 3 USE ieee.std_logic_1164.all; 4 ------------------------------------------------------ 5 ENTITY min_max IS 6 GENERIC (limit : INTEGER := 255); 7 PORT ( ena: IN BIT; 8 inp1, inp2: IN INTEGER RANGE 0 TO limit; 9 min_out, max_out: OUT INTEGER RANGE 0 TO limit); 10 END min_max; 11 ------------------------------------------------------ 12 ARCHITECTURE my_architecture OF min_max IS 13 -------------------------- 14 PROCEDURE sort (SIGNAL in1, in2: IN INTEGER RANGE 0 TO limit; 15 SIGNAL min, max: OUT INTEGER RANGE 0 TO limit) IS 16 BEGIN 17 IF (in1 > in2) THEN 18 max <= in1; 19 min <= in2; 20 ELSE 21 max <= in2; 22 min <= in1; 23 END IF; 24 END sort; 25 -------------------------- 26 BEGIN 27 PROCESS (ena) 28 BEGIN 29 IF (ena='1') THEN sort (inp1, inp2, min_out, max_out); 30 END IF; 31 END PROCESS; 32 END my_architecture; 10
ΔΙΑΔΙΚΑΣΙΑ ΣΕ ΠΑΚΕΤΟ 1 ------------ Package: --------------------------- 2 LIBRARY ieee; 3 USE ieee.std_logic_1164.all; 4 ------------------------------------- 5 PACKAGE my_package IS 6 CONSTANT limit: INTEGER := 255; 7 PROCEDURE sort (SIGNAL in1, in2: IN INTEGER RANGE 0 TO limit; 8 SIGNAL min, max: OUT INTEGER RANGE 0 TO limit); 9 END my_package; 10 ------------------------------------- 11 PACKAGE BODY my_package IS 12 PROCEDURE sort (SIGNAL in1, in2: IN INTEGER RANGE 0 TO limit; 13 SIGNAL min, max: OUT INTEGER RANGE 0 TO limit) IS 14 BEGIN 15 IF (in1 > in2) THEN 16 max <= in1; 17 min <= in2; 18 ELSE 19 max <= in2; 20 min <= in1; 21 END IF; 22 END sort; 23 END my_package; 24 ------------------------------------------------- 1 --------- Main code: ---------------------------- 2 LIBRARY ieee; 3 USE ieee.std_logic_1164.all; 4 USE work.my_package.all; 5 ------------------------------------- 6 ENTITY min_max IS 7 GENERIC (limit: INTEGER := 255); 8 PORT ( ena: IN BIT; 9 inp1, inp2: IN INTEGER RANGE 0 TO limit; 10 min_out, max_out: OUT INTEGER RANGE 0 TO limit); 11 END min_max; 12 ------------------------------------- 13 ARCHITECTURE my_architecture OF min_max IS 14 BEGIN 15 PROCESS (ena) 16 BEGIN 17 IF (ena='1') THEN sort (inp1, inp2, min_out, max_out); 18 END IF; 19 END PROCESS; 20 END my_architecture; 11
ΠΡΟΣΟΜΟΙΩΣΗ 12
Η ΕΝΤΟΛΗ ASSERT H εντολή ASSERT είναι μη συνθέσιμη και χρησιμοποιείται για επιστροφή μηνυμάτων όταν εντοπίζονται προβλήματα κατά τη προσομοίωση Σύνταξη: ASSERT συνθήκη Επίπεδο σοβαρότητας Σημείωση (note) Σφάλμα (error) [REPORT μήνυμα"] Προειδοποίηση (warning) Αποτυχία (failure) [SEVERITY επίπεδο_σοβαρότητας]; Π.χ. ASSERT a'length = b'length REPORT "Error: vectors do not have same length!" SEVERITY failure; Σημείωση: Η εντολή ASSERT δε παράγει υλικό (κύκλωμα). Το εργαλείο σύνθεσης απλώς θα παραβλέψει ή θα δώσει ένα μήνυμα προειδοποίησης 13
ΔΟΜΕΣ ΕΛΕΓΧΟΥ ΟΡΘΗΣ ΛΕΙΤΟΥΡΓΙΑΣ H VHDL χρησιμοποιεί έναν κύκλο προσομοίωσης για τη μοντελοποίηση της διέγερσης (stimulus) και της απόκρισης (response) των ψηφιακών κυκλωμάτων Υπάρχουν τρεις τρόποι για να εφαρμοστεί ο κύκλος προσομοίωσης ενός συστήματος Χειροκίνητη εισαγωγή τιμών στα σήματα εισόδων Με do files Και με testbences Στη πράξη δημιουργούμε ένα «σενάριο» λειτουργίας του συστήματος ενημερώνοντας τα σήματα εισόδων 14
ΔΟΜΕΣ ΕΛΕΓΧΟΥ ΟΡΘΗΣ ΛΕΙΤΟΥΡΓΙΑΣ To testbech είναι ένα εικονικό κύκλωμα το οποίο εφαρμόζει εισόδους προς διέγερση (stimulus) και λαμβάνει εξόδους (απόκρισηresponce) από το πραγματικό κύκλωμα Processes Generating Stimuli Design Under Test (DUT) Observed Outputs 15
TESTBENCH To testbench αντιστοιχεί στο ψηλότερο επίπεδο ιεραρχίας Η entity ενός testbech δεν περιλαμβάνει δηλώσεις ακροδεκτών Μπορεί να περιλαμβάνει όμως generics Στο testbench δηλώνεται το component του συνολικού κυκλώματος 16
ΣΥΓΚΡΙΣΕΙΣ ΤΙΜΩΝ ΕΞΟΔΟΥ Testbench VHDL Design actual results =? Representative Inputs Manual Calculations or Reference Software Implementation (C, Java, Matlab ) expected results 17
TESTBENCH Το ίδιο testbench μπορεί να χρησιμοποιηθεί για τον έλεγχο διαφορετικών υλοποιήσεων της ίδιας αρχιτεκτονικής testbench design entity Architecture 1 Architecture 2.... Architecture N 18
ΟΡΓΑΝΩΣΗ ΠΕΡΙΓΡΑΦΗΣ TESTBENCH ENTITY testbench IS -- no PORT statement necessary END testbench; ARCHITECTURE example IS testbench COMPONENT entity_under_test PORT(...) END COMPONENT; BEGIN Generate_waveforms_for_test; Instantiate_component; Monitoring_statements; END example; 19
TESTBENCH ΠΥΛΗΣ XOR ΤΡΙΩΝ LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY xor3_tb IS END xor3_tb; ΕΙΣΟΔΩΝ ARCHITECTURE behavioral OF xor3_tb IS -- Component declaration of the tested unit COMPONENT xor3 PORT( A : IN STD_LOGIC; B : IN STD_LOGIC; C : IN STD_LOGIC; Result : OUT STD_LOGIC ); END COMPONENT; -- Stimulus signals - signals mapped to the input and inout ports of tested entity SIGNAL test_vector: STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL test_result : STD_LOGIC; 20
TESTBENCH ΠΥΛΗΣ XOR ΤΡΙΩΝ BEGIN UUT : xor3 PORT MAP ( A => test_vector(2), B => test_vector(1), C => test_vector(0), Result => test_result); ΕΙΣΟΔΩΝ Testing: PROCESS BEGIN test_vector <= "000"; WAIT FOR 10 ns; test_vector <= "001"; WAIT FOR 10 ns; test_vector <= "010"; WAIT FOR 10 ns; test_vector <= "011"; WAIT FOR 10 ns; test_vector <= "100"; WAIT FOR 10 ns; test_vector <= "101"; WAIT FOR 10 ns; test_vector <= "110"; WAIT FOR 10 ns; test_vector <= "111"; WAIT FOR 10 ns; END PROCESS; END behavioral; 21
ΔΗΜΙΟΥΡΓΙΑ ΠΕΡΙΟΔΙΚΩΝ ΣΗΜΑΤΩΝ: ΡΟΛΟΙ Για τον έλεγχο της λειτουργίας σύγχρονων κυκλωμάτων χρειάζεται η δημιουργία μιας εικονικής γεννήτριας ρολογιού Περιγράφεται σε ξεχωριστή διεργασία στο testbench σε σχέση με τη διέγερση των άλλων εισόδων του κυκλώματος CONSTANT clk1_period : TIME := 20 ns; CONSTANT clk2_period : TIME := 200 ns; SIGNAL clk1 : STD_LOGIC; SIGNAL clk2 : STD_LOGIC := 0 ; BEGIN... clk1_generator: PROCESS clk1 <= 0 ; WAIT FOR clk1_period/2; clk1 <= 1 ; WAIT FOR clk1_period/2; END PROCESS; clk2 <= not clk2 after clk2_period/2;... END behavioral; 22
ΔΗΜΙΟΥΡΓΙΑ RESET CONSTANT reset1_width : TIME := 100 ns; CONSTANT reset2_width : TIME := 150 ns; SIGNAL reset1 : STD_LOGIC; SIGNAL reset2 : STD_LOGIC := 1 ; BEGIN... reset1_generator: PROCESS reset1 <= 1 ; WAIT FOR reset1_width; reset1 <= 0 ; WAIT; END PROCESS; reset2_generator: PROCESS WAIT FOR reset2_width; reset2 <= 0 ; WAIT; END PROCESS;... END behavioral; 23
ΣΥΝΗΘΕΣ ΛΑΘΟΣ SIGNAL test_vector : STD_LOGIC_VECTOR(2 downto 0); SIGNAL reset : STD_LOGIC; BEGIN... generator1: PROCESS reset <= 1 ; WAIT FOR 100 ns reset <= 0 ; test_vector <="000"; WAIT; END PROCESS; generator2: PROCESS WAIT FOR 200 ns test_vector <="001"; WAIT FOR 600 ns test_vector <="011"; END PROCESS;... END behavioral; 24
Απορίες???? 25