HY523 Εργαςτηριακό Σχεδύαςη Ψηφιακών Κυκλωμϊτων με εργαλεύα Ηλεκτρονικού Σχεδιαςτικού Αυτοματιςμού Διδϊςκων: Χ. Σωτηρύου http://www.csd.uoc.gr/~hy523 1 Περιεχόμενα Λειτουργικόσ Ζλεγχοσ και Προςομείωςθ Κάλυψθ από Πλαίςιο Ελζγχου Παράδειγμα Προςομείωςθσ Χρόνοσ και Γεγονότα Γεγονότα και Κακυςτεριςεισ Κακυςτεριςεισ ςε Ανακζςεισ Αςυμφωνία μεταξφ Προςομείωςθσ και Σφνκεςθσ Τφποι Αρχείων 2 1
Λειτουργικόσ Έλεγχοσ Ελζγχουμε τθν κάκε μονάδα χωριςτά Προδιαγραφζσ Χρονιςμόσ (ανά κφκλο Τιμζσ ςθμάτων Λειτουργίασ Συνδζουμε τισ επιμζρουσ μονάδεσ ςτο ςυνολικό ςχζδιο Ελζγχουμε τθν ςυνολικι λειτουργία 3 Λειτουργικόσ Έλεγχοσ Για κάκε μονάδα υλοποιοφμε ζνα πλαίςιο ελζγχου testbench Εμφανίηει τθν υπό ζλεγχο μονάδα Εφαρμόηει διανφςματα ειςόδων ςτον χρόνο Ελζγχει τα διανφςματα εξόδων ςτον χρόνο Μεκοδολογίεσ ελζγχου 1. Μθ-αυτόματα Ο μθχανικόσ ελζγχει ότι τα ςιματα είναι ςωςτά 2. Αυτόματα Οι τιμζσ ελζγχονται αυτόματα ζναντι των αναμενόμενων 4 2
Κϊλυψη Περιγραφόσ από Πλαύςιο Ελϋγχου Οι περιςςότεροι προςομειωτζσ υποςτθρίηουν ζλεγχο κάλυψθσ του κϊδικα HDL Όςο μεγαλφτερθ θ κάλυψθ (ςε %, τόςο καλφτερο το πλαίςιο ελζγχου 5 Παρϊδειγμα testbench Testbench module half_adder_testbench; reg a, b; wire sum, cout; Μονάδα half_adder half_adder_instance (a, b, sum, cout; initial a = 0; b = 0; #5 $display( a: %x, b: %x, sum: %x, cout: %x, a, b, sum, cout; a = 1; #5 $display( a: %x, b: %x, sum: %x, cout: %x, a, b, sum, cout; B = 1; #5 $display( a: %x, b: %x, sum: %x, cout: %x, a, b, sum, cout; a = 0; #5 $display( a: %x, b: %x, sum: %x, cout: %x, a, b, sum, cout; module half_adder(a, b, sum, cout; wire sum = a ^ b; wire cout = a & b; module; module; 6 3
Προςομοιωτόσ Παράκυρο κειμζνου 7 Προςομοιωτόσ Παράκυρο κυμματομορφϊν 8 4
Παρϊδειγμα Μετρητόσ 8-bit Σχζδιο Μετρθτι module counter(clk, reset, count; input clk, reset; output [7:0] count; Reg [7:0] count; Μονάδα Ελζγχου module counter_testbench; reg clk, reset; wire [7:0] count; counter counter_instance (clk, reset, count; always (@posedge clk if (reset count = #2 8 b0; else count = #2 count + 1; module 9 initial clk = 0; $monitor("time %d ns: count=%d", $time, count; #100 reset = 1; #150 reset = 0; always #20 clk = ~clk; module Παρϊδειγμα Μετρητόσ 8-bit time 0 ns: count= x time 102 ns: count= 0 time 262 ns: count= 1 time 302 ns: count= 2 time 342 ns: count= 3 time 382 ns: count= 4 time 422 ns: count= 5 time 462 ns: count= 6 10 5
Χρόνοσ και Γεγονότα Ανάκεςθ Register_data_type = expression; Register_data_type <= expression; Σθμαςιολογία Κλειδωμζνθ (blocking ανάκεςθ θ ζκφραςθ αξιολογείται και γίνεται θ ανάκεςθ πριν τθν εκτζλεςθ επόμενθσ γραμμισ i. Αξιολόγθςθ άμεςα Δεξιά και Ανάκεςθ Αριςτερά, ii. Εκτζλεςθ εν ςειρά τθσ επόμενθσ πρόταςθσ. Μθ κλειδωμζνθ (non-blocking ανάκεςθ θ ζκφραςθ αξιολογείται, αλλά θ ανάκεςθ κα γίνει ςτο τζλοσ του τρζχοντοσ βιματοσ χρόνου και θ εκτζλεςθ ςυνεχίηει i. Αξιολόγθςθ άμεςα Δεξιά, ii. Ανάκεςθ αριςτερά ςτο τζλοσ του χρόνου Δ, iii. Άμεςθ εκτζλεςθ τθσ επόμενθσ πρόταςθσ. 11 Γεγονότα και Καθυςτερόςεισ Εξωτερικι Κακυςτζρθςθ #5 a = b + c; #4 d = a; @t=5:a = b + c ; //b, c @t=5 // @t=9: d = a ; // a @t=9 // Εςωτερικι Κακυςτζρθςθ a = #5 b + c; d = #4 a; @t=5:a = b + c ; //b, c @t=0 // @t=9:d = a; // a @t =5 // Με μθ-κλειδωμζνεσ ανακζςεισ a <= #5 b + c; d <= #4 a; @t=5: a = b + c; //b, c @t=0 // @t=4:d = a; // a @t =0 // 12 6
Γεγονότα και Καθυςτερόςεισ Κάκε πρόταςθ ςυνδζεται με τον αρχικό τθσ χρόνο Τμιματα initial, always λειτουργοφν ςειριακά, εκτόσ αν περιζχουν ανακζςεισ <= initial a = 0; b = 0; c = 0; clk = 0; always clk = #10 1; clk = #10 0; wire #4 [3:0] comb = a + b; 0 10, 20, 30, 40, 50 4, 14, 34 0 10 20 30 40 50 always @(posedge clk a <= b + 1; always @(posedge clk b <= c + 1; always @(posedge clk c <= #5 a + 1; 10, 30 10, 30 15, 35 13 Παρϊδειγμα Καθυςτερόςεων ςε Αναθϋςεισ Περιγραφι Verilog module va(a, b, c1, c2, c3, c4; input a, b; output c1, c2, c3, c4; reg c1, c2, c3, c4; always @(a or b #3 c1 = (a & b; always @(a or b c2 = #3 (a & b; always @(a or b #3 c3 <= (a & b; always @(a or b c4 <= #3 (a & b; module 14 Testbench `timescale 1ns/10ps module va_testbench; reg a, b; wire c1, c2, c3, c4; va va_inst (a, b, c1, c2, c3, c4; initial a = 0; b = 0; $monitor("time %d ns: a=%b, b=%b, c1=%b, c2=%b, c3=%b, c4=%b", $time, a, b, c1, c2, c3, c4; #50 #1 a = 1; b = 1; #3 a = 0; #1 a = 1; #100 a = 1; b = 1; module 7
Παρϊδειγμα Καθυςτερόςεων ςε Αναθϋςεισ always @(a or b #3 c1 = (a & b; always @(a or b c2 = #3 (a & b; always @(a or b #3 c3 <= (a & b; always @(a or b c4 <= #3 (a & b; 15 Παρϊδειγμα Καθυςτερόςεων ςε Αναθϋςεισ Περιγραφι Verilog `timescale 1ns/10ps module alt_va; reg c2; reg a; initial a = 1; always @(a c2 = #3 a; always #1 a = ~a; module Ποια θ διαφορά μεταξφ c2 = #3 a; και c2 <= #3 a; 16 8
Παρϊδειγμα Καθυςτερόςεων ςε Αναθϋςεισ always @(a c2 = #3 a; always @(a c2 <= #3 a; 17 Καθυςτερόςεισ Συνδϋςεων Παραδείγματα wire a,b,c; assign #2 c = a & b; wire a,b,d; wire #2 c; assign c = a & b; assign d = a & b; 18 9
Εξαρτόςεισ μεταξύ παρϊλληλων Τμημϊτων Περιγραφι Verilog Αξιολόγθςθ 1 ου, 2 ου Αξιολόγθςθ 2 ου, 1 ου always @(posedge clock y1 = a; clock a clock a always @(posedge clock if (y1 == 1 y2 = b; else y2 = 0; b y1 y2 b y1 y2 Αςυμφωνία προςομοίωςθσ ςυμπεριφοράσ και ςφνκεςθσ b a clock y1 y2 19 Τύποι Αρχεύων Προςομεύωςησ Verilog SAIF Προςομοιωτισ SDF (EVCD Τφποσ Αρχείου SDF (Standard Delay Format SAIF (Switching Activity Interchange Format (EVCD ((ExtedVerilog Change Dump Περιγραφι Περιγραφι τθσ κακυςτζρθςθ για τισ πφλεσ, από ακίδα ειςόδου ςε ακίδα εξόδου Περιγραφι μεταβάςεων, για κάκε ςιμα του κυκλϊματοσ Περιγραφι κατάςταςθσ και μεταβάςεων ςτον χρόνο, για κάκε ςιμα του κυκλϊματοσ, βάςθ ενόσ Πλαιςίου Ελζγχου 20 10
SDF Παρϊδειγμα - 1 (DELAYFILE (SDFVERSION "OVI 2.1" (DESIGN "ex2_counter" (DATE "Mon Jun 24 00:52:51 2002" (VENDOR "tutorial_lib" (PROGRAM "Synopsys PrimeTime" (VERSION "2002.03" (DIVIDER / (VOLTAGE 3.10:3.10:3.10 (PROCESS "1.500:1.500:1.500" (TEMPERATURE 25.00:25.00:25.00 (TIMESCALE 1ns (CELL Min:Typical:Max (CELLTYPE "ex2_counter" (INSTANCE (DELAY (ABSOLUTE (INTERCONNECT clk1 g13/cp (0.367:0.367:0.367 (0.377:0.377:0.377 (INTERCONNECT clk1 g12/cp (0.367:0.367:0.367 (0.377:0.377:0.377 (INTERCONNECT clk1 g3/cp (0.164:0.164:0.164 (0.152:0.152:0.152 (INTERCONNECT clk1 g2/cp (0.164:0.164:0.164 (0.152:0.152:0.152 (INTERCONNECT clk1 g1/cp (0.164:0.164:0.164 (0.152:0.152:0.152 (INTERCONNECT bit1 g1/d (0.061:0.061:0.061 (0.055:0.055:0.055 (INTERCONNECT bit2 g2/d (0.061:0.061:0.061 (0.055:0.055:0.055... Header Information Καθσζηέρηζη διαζύνδεζης 21 Καθσζηερήζεις Καθσζηερήζεις Ανόδοσ Καθόδοσ SDF Παρϊδειγμα - 2 (CELL (CELLTYPE "AN2" (INSTANCE g4 (DELAY (ABSOLUTE (IOPATH A Z (0.514:0.514:0.514 (0.301:0.301:0.301 (IOPATH B Z (0.874:0.874:0.874 (1.032:1.032:1.032 Καθσζηέρηζη Πύλης (CELL Min:Typical:Max (CELLTYPE "FD2" (INSTANCE g1 (DELAY (ABSOLUTE (IOPATH (posedge CP Q (1.189:1.189:1.189 (0.816:0.816:0.816 (IOPATH (posedge CP QN (0.324:0.324:0.324 (IOPATH (negedge CD Q (1.200:1.200:1.200 (0.840:0.840:0.840 (IOPATH (negedge CD QN (0.276:0.276:0.276 (1.200:1.200:1.200 (TIMINGCHECK (SETUP D (posedge CP (0.250:0.250:0.250 (HOLD D (posedge CP (0.400:0.400:0.400 Περιοριζμοί Πύλης 22 11
SAIF Παρϊδειγμα - 1 (SAIFILE (SAIFVERSION "2.0" (DIRECTION "backward" (DESIGN (DATE "Mon Mar 20 11:53:29 2006" (VENDOR "Synopsys, Inc" (PROGRAM_NAME "VCS-Scirocco-MX Power Compiler" (VERSION "1.0" (DIVIDER / (TIMESCALE 1 ns (DURATION 10000.00 (INSTANCE tb (INSTANCE macinst (NET (z\[32\] (T0 6488 (T1 3493 (TX 18 (TC 26 (IG 0 (z\[31\] (T0 4736 (T1 5246 (TX 18 (TC 33 (IG 0 (z\[30\] (T0 4916 (T1 5065 (TX 18 (TC 28 (IG 0... Header Information Πληροθορίες Καηάζηαζης ανά net 23 SAIF Παρϊδειγμα - 2 (INSTANCE U3 (PORT (Y (T0 4989 (T1 5004 (TX 6 (COND ((D1*!D0 (!D1*D0 (RISE (IOPATH S (TC 0 (IG 0 COND ((D1*!D0 (!D1*D0 (FALL (IOPATH S (TC 0 (IG 0 COND ((S*D0 (S*!D0 (RISE (IOPATH D1 (TC 62 (IG 0 COND ((S*D0 (S*!D0 (FALL (IOPATH D1 (TC 63 (IG 0 COND ((!S*D1 (!S*!D1 (RISE (IOPATH D0 (TC 146 (IG 0 COND ((!S*D1 (!S*!D1 (FALL (IOPATH D0 (TC 145 (IG 0 COND_DEFAULT (TC 0 (IG 0 Αλλαγές καηαζηάζεων ζηις ακίδες ηης πύλης 24 12
EVCD Παρϊδειγμα $date Sep 20, 2005 10:20:45 $ $version TOOL: ncsim 05.10-p004 $ $timescale 10 ps $ $scope module AAA_tmax_testbench_1_16 $ $scope module dut $ $var port 1! reset_dlx_d $ $var port 1 " reset_dlx_c $ $var port 1 # sync_async $ $var port 1 $ INT $ $var port 1 % CLI $ $var port 1 & FREEZE $ $var port 1 ' STOP_fetch $ $var port 1 ( reset_ctrl $ $var port 1, global_g1 $ $var port 1 - global_g2 $ $upscope $ $upscope $ $definitions $... Header Information Θύρες/Σήμαηα ηης μονάδας 25 EVCD Παρϊδειγμα #0 $dumpports pd 6 0! pn 6 6 " pd 6 0 # pn 6 6 $ px 6 6 % pn 6 6 & pn 6 6 ' pd 6 0 ( pn 6 6 px 6 6 * pn 6 6 + pd 6 0,... $ #100 ph 0 6 G #5000 pd 6 0 pu 0 6 + #5500 pu 0 6, #7500 pd 6 0, #10500 pu 0 6 - Αρτική Καηάζηαζη ζηις Θύρες/Σήμαηα ηης Μονάδας Αλλαγές ζηον τρόνο προζομείωζης 26 13