ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων Verilog: Μια πιο κοντινή ματιά Χειμερινό Εξάμηνο 2009 2010
Δομή της γλώσσας Μοιάζει αρκετά με τη C Preprocessor Keywords Τελεστές = ==,!= <, >, <=, >= &&? : & and or ~ not ^ xor `timescale 1ns / 1ns `define dh 2 (e.g q <= #`dh d) `undef dh `ifdef dh / `ifndef dh... `else... `if `include def.h Γλώσσα «event driven» University of Crete ΗΥ220 2
Sensitivity lists Λογικές εκφράσεις με or posedge και negedge Ρολόγια, reset... always @(posedge clk or negedge rst_)... always @(opcode or b or c) if (opcode == 32 h52a0234e) a = b ^ (~c); always @(posedge a or posedge b) always @(posedge a, posedge b) always #5 clk=~clk Παράλειψη παραγόντων RHS και αυτών που γίνονται read δίνουν λάθη στην προσομοίωση Προσοχή στο hardware που θέλουμε να περιγράψουμε ργρ University of Crete ΗΥ220 3
Initial and always block initial begin // run once a=0; b=0; #5; a=1; b=1; Runs when simulation starts Terminates when control reaches the Good for providing stimulus not synthesizable always@(...) begin // run always a <= b & c; Runs when simulation starts Restart twhen control reaches the Good for modeling hardware maybe synthesizable University of Crete ΗΥ220 4
Τιμές σημάτων Four valued logic i i i l 0 ή 1 Ζ X Έξοδος τρικατάστατου οδηγητή Καλώδιο χωρίς ανάθεση Αρχική τιμή των regs Έξοδος πύλης με είσοδο/ους Ζ Ταυτόχρονη ανάθεση 0 και 1 από δύο ή περισσότερες πηγές (multi source logic) [πηγή = always block] Προσοχή στην αρχικοποίηση (regs) initial... always @(posedge clk) if (reset)... else... 0 1 X Z 0 0 0 0 0 1 0 1 X X X 0 X X X Z 0 X X X University of Crete ΗΥ220 5
Τιμές σημάτων if (a==1 bx) // report error εχει νόημα για το simulation αλλα σε πραγματικο κυκλωμα δεν έχει νόημα University of Crete ΗΥ220 6
Concatenation «Hardwired» πράξεις 3 a απαραίτητες σε μια HDL 5 b 8 c wire [2:0] a; wire [4:0] b; wire [7:0] c = {a, b}; wire [7:0] unsigned; wire [15:0] sign_ext = { (unsigned[7]? 8 hff : 8 h0), unsigned }; University of Crete ΗΥ220 7
Concatenation II wire [2:0] a; wire [4:0] b; wire [7:0] c = {a, b}; wire [11:0] d = {2{b}, b}; wire [11:0] d = {b, b, b}; wire [25:0] e = {2{3{b}}, a}; University of Crete ΗΥ220 8
if statement always@(a or b or data1 or ) if (a==0) y = data1; else begin if (b==0) y = data2; else y = data3; data1 data2 data3 b a y University of Crete ΗΥ220 9
nested if statement always@(a or b or data1 ) if (a==0) if (b==0) y = data1; else y = data2; always@(a or b or data1 ) if (a==0) begin if (b==0) y = data1; else y = data2; The else is paired with the nearest unfinished if statement University of Crete ΗΥ220 10
if statement latch always@(a or b or data1 or ) if (a==0) y1 = data1; else y2 = data2; University of Crete ΗΥ220 11
if statement mux a always@(a or b or data1 or ) y1 = 0; y2 = 0; if (a==0) y1 = data1; else y2 = data2; data1 0 0 data2 ~a y1 y2 University of Crete ΗΥ220 12
case statement always @(a or b or c or d or sel ) begin case (sel) 2 b00: out <= a; 2 b01: out <= b; 2 b10: out <= c; 2 b11: out <= d; default: out <= 5 bx; case University of Crete ΗΥ220 13
eg e.g. Gray code with case statement always @(a or b or c or d or sel ) begin case (sel) 2 b00: out <= 2 b00; 2 b01: out <= 2 b01; 2 b10: out <= 2 b11; 2 b11: out <= 2 b10; default: out <= 2 bx; case Binary Grey 00 => 00 01 => 01 11 => 11 10 => 10 University of Crete ΗΥ220 14
case statement latch! always @(a or b or c or d or sel ) begin case (sel) 2 b00: out <= a; 2 b01: out <= b; 2 b10: out <= c; case University of Crete ΗΥ220 15
For While τa γνωστά integer i; ; Μόνο μέσα σε blocks! Δεν υπάρχει break ουτε continue!!! Δεν υπάρχει i++, ++i κτλ! j=0; Κυρίως για j=j+1; testbenches!!! // the famous i variable :) initial begin for ( i=0; i<10; i=i+1 )beging $display ( i= %d,i); integer j; //reg [3:0] j is OK! initial begin while(j < 10)begin $display ( j= %b,j); University of Crete ΗΥ220 16
For While Synthesizable integer i; // the famous i variable :) always@(b or c) begin for ( i=1; i<5; i=i+1 i )beginb i a(i) <= b(i) & c(i); b(1) c(1) b(2) c(2) b(3) c(3) b(4) c(4) a(1) a(2) a(3) a(4) University of Crete ΗΥ220 17
For While Not Synthesizable! integer i; // the famous i variable :) always@(*) begin for ( i=1; i<5; i=i+1 i )begin a <= i; #10; a = 3 b100 University of Crete ΗΥ220 18
Παραμετρικά modules module RegLd( D, Q, load, clk); parameter N = 8; parameter dh = 2; input [N-1:0] D; output [N-1:0] Q; input load, clk; reg [N-1:0] Q; Μπορούμε να έχουμε παραμέτρους σε ένα module Default μέγεθος πολύ βολικό! always @(posedge clk) if (load) Q = #dh D; RegLd reg0(d0, q0, ld, clk); module RegLd #(16,2) reg1(d1, q1, ld, clk); RegLd reg2(d2, q2, ld, clk); defparam reg2.n = 4; defparam reg2.dh = 4; University of Crete ΗΥ220 19
Τρικατάστατοι οδηγητές Εκμετάλλευση της κατάστασης Ζ Χρήση του τύπου inout module tristate(en, clk, data); input en, clk; inout [7:0] data; wire [7:0] data = (en)? data_out : 8 bz; always @(posedge clk) begin if (!en) case (data)... module wire [7:0] bus; tristate tr0(en0, clk, bus); tristate tr1(en1, clk, bus); tristate tr2(en2, clk, bus); University of Crete ΗΥ220 20
Μνήμες Αναδρομικά: array of array Συνήθως non synthesizable Ειδική αρχικοποίηση $readmemh $readmemb wire [15:0] word_in; wire [15:0] word_out; wire [ 9:0] addr; reg [15:0] memory [1023:0]; always @(posedge clk) begin if (we) memory[addr] = word_in; else word_out = memory[addr]; always @(negedge rst_n) $readmemh( memory.dat, memory); memory.dat: 0F00 00F1 0F02 University of Crete ΗΥ220 21
Συναρτήσεις Functions (1/3) Δήλωση (declaration): function [ range_or_type ] fname; input _ declarations statements function Επιστρεφόμενη τιμή (return value): Ανάθεση στο σώμα του function fname = expression; Κλήση (function call): fname ( expression, ) University of Crete ΗΥ220 22
Συναρτήσεις Functions (2/3) Χαρακτηριστικά συναρτήσεων: Επιστρέφει 1 τιμή (default: 1 bit) Μπορεί να έχει πολλαπλά ορίσματα εισόδου (πρέπει να έχει τουλάχιστον ένα) Μπορούν να καλούν άλλες functions αλλά όχι tasks. Δεν υποστηρίζουν αναδρομή (non recursive) Εκτελούνται σε μηδέν χρόνο προσομοίωσης Δεν επιτρέπονται χρονικές λειτουργίες (π.χ. dl delays, events) Χρησιμοποιούνται για συνδυαστική λογική και συνθέτονται συνήθως ετσι. προσοχή στον κώδικα για να γίνει σωστά σύνθεση University of Crete ΗΥ220 23
Συναρτήσεις Functions (3/3) Function examples: function calc_parity; input [31:0] val; begin calc_parity = ^val; function function [15:0] average; input [15:0] a, b, c, d; begin average = (a + b + c + d) >> 2; function; University of Crete ΗΥ220 24
Verilog Tasks (1/2) Τυπικές procedures Πολλαπλά ορίσματα input, output και inout Δεν υπάρχει συγκεκριμένη τιμή επιστροφής (χρησιμοποιεί μ τα όρισματα output) ) Δεν υποστηρίζουν αναδρομή (non recursive) Μπορούν να καλούν άλλες tasks και functions Μπορούν να περιέχουν delays, events και χρονικές λειτουργίες Προσοχή στη σύνθεση University of Crete ΗΥ220 25
Verilog Tasks (2/2) Task example: task ReverseByte; input [7:0] a; output [7:0] ra; integer j; begin for (j = 7; j >=0; j=j-1) j begin ra[j] = a[7-j]; task University of Crete ΗΥ220 26
Functions and Tasks Ορίζονται μέσα σε modules και είναι τοπικές Δεν μπορούν να έχουν always και initial blocks αλλά μπορούν να καλούνται μέσα από αυτά Μπορούν να έχουν ότι εκφράσεις μπαίνουν σε blocks University of Crete ΗΥ220 27
Functions Μπορούν να καλούν άλλες functions αλλά όχι tasks Εκτελούνται σε μηδενικό χρόνο προσομοίωσης Δεν μπορούν περιέχουν χρονικές λειτουργίες (delay, events κτλ) Έχουν τουλάχιστον 1 είσοδο και μπορούν να έχουν πολλές Functions vs Tasks Tasks Μπορούν να καλούν άλλες tasks και functions Μπορούν να διαρκούν μη μηδενικό χρόνο προσομοίωσης Μπορούν να περιέχουν χρονικές λειτουργίες (delay, events κτλ) Μπορούν να έχουν μηδέν ή περισσότερα ορίσματα εισόδων, εξοδων και inout Επιστρέφουν μια τιμή, δεν έχουν Δεν επιστρέφουν τιμή αλλά εξόδους βγάζουν έξοδο από τα ορίσματα εξόδου και inout University of Crete ΗΥ220 28
System Tasks and Functions Tasks and functions για έλεγχο της προσομοίωσης Ξεκινούν με "$" (e.g., $monitor) Standard της γλώσσας Παράδειγμα system task: $display $display("format-string", expr1,, exprn); format string regular ASCII mixed with formatting characters %d decimal, %b binary, %h hex, %t time, etc. other arguments: any expression, including wires and regs $display("error at time %t: value is %h, expected %h", $time, actual_value, expected_value); University of Crete ΗΥ220 29
Χρήσιμες System Tasks $time τρέχον χρόνος προσομοίωσης $monitor τυπώνει όταν αλλάζει τιμή ένα όρισμα ( 1 μόνο κάθε φορά νέες κλήσεις ακυρώνουν τις προηγούμενες ) $monitor("cs=%b, ns=%b", cs, ns) Έλεγχος προσομοίωσης $stop διακοπή simulation $finish τερματισμόςsimulation Υπάρχουν και συναρτήσεις για file I/O ( $fopen, $fclose, $fwrite etc ) University of Crete ΗΥ220 30
Events in Verilog (1/3) Δουλεύει μόνο όταν κάτι αλλάξει Όλο το simulation δουλεύει γύρω από μια ουρά από γεγονότα (event queue) Περιέχει events και ετικέτες με το χρόνο στον οποίο θα εκτελεστούν Καμιά εγγύηση για τη σειρά εκτέλεσης γεγονότων που πρέπει να γίνουν στον ίδιο χρόνο!!! always clk = #(`period p / 2) ~clk; always @(posedge clk) a = b + 1; always @(posedge clk) b = c + 1;! University of Crete ΗΥ220 31
Events in Verilog (3/3) 2 τύποι events Evaluation : υπολογίζουν τις συναρτήσεις των εισόδων της έκφρασης (RHS) Update : Αλλάζουν τις εξόδους (LHS) Λαμβάνουν υπόψιν delays nonb assignments Evaluation: διαβάζει τις τιμές b και c, υπολογίζει, αποθηκεύει εσωτερικά και προγραμματίζει Update: Γράφει το νέο a και ένα update dt event προγραμματίζει evaluation events για κώδικα που a <= b + c εξαρτάται από το α. University of Crete ΗΥ220 32
Blocking vs Non blocking assignments and Events Blocking = Evaluation/read (RHS) και assignment/write (LHS) (update event) στον ίδιο χρόνο Εκτέλεση σειριακή Non blocking boc <= Evaluation και assignment σε 2 βήματα 1. Evaluation στο δεξί μέλος (RHS) άμεσα 2. Assignment t( (update) στο αριστερό μέλος (LHS) όταν τελειώσουν όλα τα evaluations του τρέχοντος χρόνου always @(posedge clk) always @(posedge clk) a = b; always @(posedge clk) b = a; Swap? a <= b; always @(posedge clk) b <= a; University of Crete ΗΥ220 33
Οι πύλες έχουν καθυστέρηση!!! Α Β C tmp Z Α Β C tmp Z 0 5 10 15 20 25 ns Έστω καθυστερήσεις:t and =2nsκαι T or = 1ns Έστω ότι τα καλώδια δεν έχουν καθυστέρηση 3 Μονοπάτια (paths) προς την έξοδο: A Z, ( 1ns ) B tmp Z ( 3 ns ) C tmp Z( 3 ns ) Η συμπεριφορά του κυκλώματος φαίνεται στις κυματομορφές (waveforms) University of Crete ΗΥ220 34
Οι πύλες έχουν καθυστέρηση!!! Α Β C tmp Z Α Β C tmp Z 0 5 10 15 20 25 ns Έστω καθυστερήσεις:t and =2nsκαι T or = 1ns Έστω ότι τα καλώδια δεν έχουν καθυστέρηση 3 Μονοπάτια (paths) προς την έξοδο: A Z, ( 1ns ) B tmp Z ( 3 ns ) C tmp Z( 3 ns ) Η συμπεριφορά του κυκλώματος φαίνεται στις κυματομορφές (waveforms) always@(a or b or c) begin tmp = #2 B & C; Z = #1 A tmp; University of Crete ΗΥ220 35
Απλή Λογική με ρολόι Α Β C Z T clk = 10 ns Τ and = 2 ns, T or = 1 ns T c2q = 2 ns, T su = 1 ns, T hd = 0.5 ns Clk Q Clk Α Β C Z Q Ικανοποιούνται οι περιορισμοί Setup και Hold του Flip Flop p? 0 5 10 15 20 25 ΟΚ Παραβίαση ns Άγνωστη Τιμή University of Crete ΗΥ220 36
Delays and Events Regular / Inter Assignment delays #5 a = b + c; // a=b+c at time 5 #4 d = a; // d=a new at time 9 new Intra Assignment delays Evaluation του RHS πρίν τηνκαθυστέρηση With blocking assignments: a = #5 b + c; // a=b+c(t=0) at time 5 d = a; // d=a new at time 5 With non blocking assignments: a <= #5 b + c; // a=b+c at time 5 d <= a; // d=a old at time 0 University of Crete ΗΥ220 37
Delays and Events a = #10 ~b; = begin b_temp = ~b; #10 a = b_temp; University of Crete ΗΥ220 38
Κάθε έκφραση συνδέεται με έναν αρχικό χρόνο Initial και always: εσωτερικά σειριακά εκτός από non blocking assignments 0 10 20 30 40 50 Events Example 0 initial begin a = 0; b = 0; c = 0; clk = 0; 10, 20, 30, 40, 50 always begin clk = #10 1; clk = #10 0; wire #4 [3:0] comb = a + b; always @(posedge clk) a <= b + 1; always @(posedge clk) b <= c + 1; always @(posedge clk) c <= #5 a + 1; 4, 14, 34 10, 30 10, 30 15, 35 University of Crete ΗΥ220 39
Synthesizable Verilog Η καθυστέρηση που βάζουμε δεν είναι αυτή που θα υπάρχει στο τελικό κύκλωμα!!! Α Β C tmp Z tmp = #2 B & C; Z = #1 A tmp; Στο πραγματικό κύκλωμα η πύλη AND: 90nm (πχ. Pentium III) 2ns 65nm (πχ. Pentium 4) 0.5ns 45nm (πχ. Core Duo) 0.4ns University of Crete ΗΥ220 40
assignments and delays always@(a or b) #3 c1 = a&b; always@(a or b) c1 = #3 a&b; always@(a or b) #3 c1 <= a&b; always@(a or b) c1 <= #3 a&b; University of Crete ΗΥ220 41
assignments and delays 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; University of Crete ΗΥ220 42
Delays in wires wire a,b,c; assign #2 c = a & b; University of Crete ΗΥ220 43
Delays in wires II wire a,b,d; wire #2 c; assign c = a & b; assign d = a & b; University of Crete ΗΥ220 44
Παράλληλα Blocks fork / join Επιτρέπει την παράλληλη εκτέλεση ενός σειριακού block Προσοχή στα race conditions Δεν υποστηρίζονται εύκολα στη σύνθεση Μπορούν να υπάρχουν nested td Βασική δομή fork parallel-statement1; parallel-statement2; join University of Crete ΗΥ220 45
Sequential vs Parallel Blocks reg x,y; reg [1:0] z; initial begin x = 1 b0; // time 0 #5 y = 1 b1; // time 5 #10 z = {x,y};// time 15 reg x,y; reg [1:0] z; initial begin fork x = 1 b0; // time 0 #5 y = 1 b1; // time 5 #10 z = {x,y};// time 10 join University of Crete ΗΥ220 46
Modelsim Χρησιμοποιείται για την προσομοίωση κυκλωμάτων σε Verilog, VHDL Ουσιαστικά είναι ένας debugger για HDLs University of Crete ΗΥ220 47
Modelsim Introduction 1. Δημιουργία βιβλιοθήκης ββ 2. Compile του κώδικα 3. Εκτέλεση και προσομοίωση University of Crete ΗΥ220 48
Modelsim Window University of Crete ΗΥ220 49
Backup slides University of Crete ΗΥ220 50
Events in Verilog (2/3) Βασική ροή προσομοίωσης Εκτέλεση των events για τον τρέχοντα χρόνο Οι εκτέλεση events αλλάζει την κατάσταση του συστήματος και μπορεί να προκαλέσει προγραμματισμό events για το μέλλον Όταν τελειώσουν τα events του τρέχοντα χρόνου προχωράμε ρά στα αμέσως επόμενα ε χρονικά! t 0 + period t 0 University of Crete ΗΥ220 51