ΗΥ220 Εργαστήριο Ψηφιακών Κυκλωμάτων Εισαγωγή στη Verilog Χειμερινό Εξάμηνο 2009 2010
Hardware vs Software Γιατί να σχεδιάζουμε σε Hardware? Γρήγορη εκτέλεση (~10x) Χαμηλή κατανάλωση ισχύος (~10x) αλλά πολύ δυσκολότερο να σχεδιάζουμε σε HW (cycle accurate) και υψηλό κόστος Univeristy of Crete ΗΥ220 2
Η εξέλιξη ξηστη σχεδίαση ψηφιακών κυκλωμάτων Μεγάλη εξέλιξη τα τελευταία 30 χρόνια Στις αρχές σχεδιάζαμε με λυχνίες(vacuum tubes) και transistors. Μετα ήρθαν τα ολοκληρωμένα κυκλώματα ( Integrated Circuits ICs ) SSI λίγες πύλες ( Small Scale Integration) MSI εκατοντάδες πύλες ( Medium Scale Integration) LSI χιλιάδες πύλες ( Large Scale Integration) VLSI εκατοντάδες χιλιάδες έως πολλά εκατομμύρια ( Very Large Scale Integration) Ανάγκη για τεχνικές Computer Aided Design (CAD) και γλώσσες περιγραφής υλικού για να μπορούμε μ να σχεδιάζουμε και να επαληθεύουμε τα κυκλώματα. Univeristy of Crete ΗΥ220 3
Intel l8086 Processor 1978 29.000 transistors t 5 MHz operation 4 Univeristy of Crete ΗΥ220
Cell Processor, PS3 2008 9 Processors 234M transistors (~10.000 i8086) Clock speed: 4GHz 230 GFlops 5 Univeristy of Crete ΗΥ220
Transistor Counts 1,000,000 K 1 Billion Transistors 100,000 10,000 1,000 Pentium 100 10 8086 i386 80286 Pentium III Pentium II Pentium Pro i486 Pentium Source: Intel 1 1975 1980 1985 1990 1995 2000 2005 2010 Projected Univeristy of Crete ΗΥ220 6
Productivity Trends 10,000,000 Co omplexity Lo ogic Transi stor per Ch hip (M M) 10,000 1,000 1,000,000 100,000 100 10,000 1,000 10 100 1 0.1 0.01 10 Logic Tr./Chip Tr./Staff Month. x x x x x x x x 58%/Yr. compounded Complexity growth rate 21%/Yr. compound Productivity growth rate 100,000 100,000,000 10,000 10,000,000 1,000 1,000,000 100 100,000 10 10,000 1 1,000 0.1 100 Prod ductivity (K) Trans../Staff Mo o. 0.001 1 0.01 10 1981 1983 1985 1987 1989 1991 1993 1995 1997 1999 2001 2003 2005 2007 2009 Source: Sematech Complexity outpaces design productivity Courtesy, ITRS Roadmap Univeristy of Crete ΗΥ220 7
Requirements Τυπική Ροή Σχεδίασης (Design Flow) Verilog, VHDL Simulate Synthesis Gate level Model Simulate Test Bench ASIC or FPGA Place & Route Timing Model Simulate Univeristy of Crete ΗΥ220 8
Ιεραρχικές Μεθοδολογίες Σχεδίασης Top Down ή Bottom Up Συνήθως μια μίξη Τελικό σύστημα αποτελείται από τα Leaf blocks που τρέχουν όλα παράλληλα. Univeristy of Crete ΗΥ220 9
Τι είναι η Verilog; Verilog Hardware Description Language (HDL) Μία υψηλού επιπέδου γλώσσα που μπορεί να αναπαριστά και να προσομοιώνει ψηφιακά κυκλώματα. Hardware concurrency Parallel Activity Flow Semantics for Signal Value and Time Παραδείγματα σχεδίασης με Verilog HDL Intel Pentium, AMD K5, K6, Athlon, ARM7, etc Thousands of ASIC designs using Verilog HDL Other HDL : VHDL, SystemC, SystemVerilog Univeristy of Crete ΗΥ220 10
Design Abstraction Levels SYSTEM Matlab, SystemC, SystemVerilog + MODULE GATE Verilog, VHDL CIRCUIT S n+ G DEVICE n+ D VLSI Univeristy of Crete ΗΥ220 11
Transistor Counts 1,000,000 K 1 Billion Transistors 100,000 10,000 1,000 Pentium 100 10 8086 Discrete i386 80286 Pentium III Pentium II Pentium Pro i486 Pentium Verilog,VHDL 1 1975 1980 1985 1990 1995 2000 2005 2010 Projected SystemC Source: Intel Univeristy of Crete ΗΥ220 12
Αναπαράσταση Ψηφιακών Συστημάτων H Verilog HDL χρησιμοποιείται για να φτιάξουμε το μοντέλο ενός συστήματος. Λόγοι: Ορισμός Απαιτήσεων (requirements specification) Documentation Έλεγχος μέσω προσομoίωσης (simulation) Λειτουργική Επαλήθευση (formal verification)! Μπορούμε να το συνθέσουμε! Στόχος Αξιόπιστη διεργασία σχεδίασης με χαμηλές απαιτήσεις κόστους και χρόνου Αποφυγή και πρόληψη λαθών σχεδίασης Univeristy of Crete ΗΥ220 13
NAND: Dtfl Dataflow Module module nand(a, b, f); a b g1 t NAND g2 f input a, b; output f; endmodule Univeristy of Crete ΗΥ220 14
NAND: Dtfl Dataflow Module module nand(a, b, f); a b g1 t g2 f input a, b; output f; endmodule Univeristy of Crete ΗΥ220 15
NAND: Dtfl Dataflow Module module nand(a, b, f); a b g1 t g2 f input a, b; output f; wire t; assign t = a & b; assign f = ~t; endmodule Univeristy of Crete ΗΥ220 16
Mux: Dtfl Dataflow Module module sel(a, b, sel, f); a b f input a, b, sel; output f; endmodule sel a b sel f x y 0 x x y 1 y Univeristy of Crete ΗΥ220 17
Mux: Bh Behavioral lmodule module sel(a, b, sel, f); a b sel f input a, b, sel; output f; reg f; always @(sel or a or b) begin a b sel f end endmodule x y 0 x x y 1 y Univeristy of Crete ΗΥ220 18
Mux: Bh Behavioral lmodule module sel(a, b, sel, f); a f b sel a b sel f x y 0 x x y 1 y input a, b, sel; output f; reg f; always @(sel or a or b) begin if (sel==0) f <= a; else f <= b; end endmodule Univeristy of Crete ΗΥ220 19
Μανταλωτής D (D Latch) Lth) Στοιχείο μνήμης (Flip Flop) Latch D Q Data and Load inputs Πίνακας Αληθείας (Data) D Ld Q Q Ld (Load) 0 0 Q t-1 Q t-1 0 1 0 1 1 0 Q t-1 Q t-1 1 1 1 0 Q Univeristy of Crete ΗΥ220 20
Lth Latches: Bh Behavioral lmodule module latch(d, g, q); input d, g; output q; reg q; D G Q x 0 Q endmodule G 0 1 0 1 1 1 Univeristy of Crete ΗΥ220 21
Lth Latches: Bh Behavioral lmodule D G Q x 0 Q module latch(d, g, q); input d, g; output q; reg q; always @(g or d) begin if (g) q = d; end 0 1 0 endmodule 1 1 1 Univeristy of Crete ΗΥ220 22
Lth Latches with CLR: Bh Behavioral lmodule module latch(d, g, clr, q); input d, g, clr; output q; reg q; D G CLR Q endmodule x x 1 0 0 1 0 0 1 1 0 1 Univeristy of Crete ΗΥ220 23
Lth Latches with CLR: Bh Behavioral lmodule module latch(d, g, clr, q); input d, g, clr; output q; reg q; D G CLR Q x x 1 0 0 1 0 0 1 1 0 1 always @(g or d or clr) begin if (clr) q = 1'b0; else if (g) q = d; end endmodule Univeristy of Crete ΗΥ220 24
Ακμοπυροδότητο D Flip Flop Στοιχείο μνήμης (Flip Flop) D Flip Flop D Q Master Slave Latches Εσωτερικά Ακμοπυροδότητο (edge triggered) Το πιο ευρέως χρησιμοποιούμενο Data and Clock inputs Αποθηκεύει την τιμή του D μόνο κατά την ακμή του ρολογιού (συνήθως τη θετική) Q t+1 = D t Απαιτεί χρόνο αποκατάστασης (Setup) και συγκράτησης (Hold) των δεδομένων εισόδου Clk (Clock) Η λέξη Flip Flop είναι ταυτισμένη με το aκμοπυροδότητο D Flip Flop Univeristy of Crete ΗΥ220 25
DFF: Behavioral Bh lmodule module dff(d, clk, q); input d, clk; output q; reg q; C CLK Q endmodule 0 0 1 1 Univeristy of Crete ΗΥ220 26
DFF: Behavioral Bh lmodule module dff(d, clk, q); input d, clk; output q; reg q; D CLK Q always @(posedge clk) 0 0 begin q <= d; 1 1 end endmodule Univeristy of Crete ΗΥ220 27
DFF with SET: Bh Behavioral lmodule module dff(d, clk, s, q); input d, clk, s; output q; d clk S q x 1 1 0 0 0 1 0 1 endmodule Univeristy of Crete ΗΥ220 28
DFF with SET: Bh Behavioral lmodule module dff(d, clk, s, q); input d, clk, s; output q; reg q; d clk S q always @(posedge clk) begin x 1 1 if (s) q <= 1'b1; 0 0 0 else q <= d; 1 0 1 end endmodule Univeristy of Crete ΗΥ220 29
Counters: Behavioral Bh lmodule module counters (CLK, CLR, Q); input CLK, CLR; output [3:0] Q; reg [3:0] tmp; CLR CLK Q X 0000 0 Q+1 endmodule Univeristy of Crete ΗΥ220 30
Counters: Behavioral Bh lmodule module counters (CLK, CLR, Q); input CLK, CLR; output [3:0] Q; reg [3:0] tmp; CLR CLK Q always @(posedge CLK or posedge CLR) begin if (CLR) tmp <= 4'b0000; else X 0000 tmp <= tmp + 1'b1; 0 Q+1 end end assign Q = tmp; endmodule Univeristy of Crete ΗΥ220 31
Βασικό όblock: Module module and_ff(a, b, f); a b input a, b; t g1 g2 f output f; endmodule Univeristy of Crete ΗΥ220 32
Βασικό όblock: Module module nand(a, b, q, clk); a b clk g1 t D SET g2 CLR Q Q q input a, b, clk; output q; wire t; and g1(a, b, t), d_ ff g2(t, clk, q); endmodule Univeristy of Crete ΗΥ220 33
Πόρτες ενός Module in1 in2 in3 arith1 bi_out out module arith1 (bi_out, out, in1, in2, in3); inout bi_out; output out; input in1, in2; input in3; endmodule Univeristy of Crete ΗΥ220 34
Modules vs Instances Instantiation είναι η διαδικασία δημιουργίας αντικειμένου από το module. module nand(out, a, b,); input a, b; output out; wire out = ~ (a & b); endmodule Univeristy of Crete ΗΥ220 35
Pi Primitivesiti Επίπεδο Πυλών and, nand, or, nor, xor, xnor, not, buf Παράδειγμα: and N25 (out, A, B) // instance name and #10 (out, A, B) // delay or #15 N33(out, A, B) // name + delay Univeristy of Crete ΗΥ220 36
Verilog Modeling Structural Για να συνδέουμε τα modules e.g. counter counter_1( clk, enable, count_out); Dataflow όταν χρησιμοποιούμε βασικές πύλες e.g. wire = (a & b) (c & d); Behavioral or Procedural procedural calls e.g. always @(posedge clk) begin end Univeristy of Crete ΗΥ220 37
Verilog Modeling Synthesizable vs Not Synthesizable e.g. a <= #10 b + 1; RTL (Register Transfer Level) όταν η σχεδίαση γίνεται σε επίπεδο registers Univeristy of Crete ΗΥ220 38
Συμβάσεις στην γλώσσα Verilog Η Verilog είναι case sensitive. Λέξεις κλειδιά είναι σε μικρά. Σχόλια Για μία γραμμή είναι // Για πολλές /* */ Βασικές τιμές 1 bit σημάτων 0: λογική τιμή 0. 1: λογική τιμή 1 x: άγνωστη τιμή z: ασύνδετο σήμα,high impedance Univeristy of Crete ΗΥ220 39
Αναπαράσταση αριθμών Αριθμοί <size> <base_format> <number> <size> δείχνει τον αριθμό απο bits <base_format> μπορεί να είναι : d, h, b, o (default: d) Όταν το <size> λείπει το μέγεθος καθορίζεται από τον compiler Όταν το <number> έχει πολλα ψηφία μπορούμε να το χωρίζουμε με _ (underscore) )όπου θέλουμε 100 // 100 4 b1111 // 15, 4 bits 6 h3a // 58, 6 bits 6 b111010 // 58, 6 bits 12 h13x // 304+x, 12 bits 8 b10_10_1110 // 174, 8 bits Univeristy of Crete ΗΥ220 40
Τελεστές (Operators) Arithmetic + * / % Logical! && Rl Relational l < > <= >= Equality ==!= Bit wise ~ & ^ ^~ (ή ~^) Reduction & ~& ~ ^ ^~(ή ~^) Shift << >> Concatenation/Replication {A,B, } {4{A}} (πολλούς τελεστέους) Conditional * Εφαρμόζεται μόνο σε έναν τελεστέο x? y : z (3 τελεστέους) Univeristy of Crete ΗΥ220 41
Τελεστές (Operators) Arithmetic + * / % Logical! && ΠΡΟΣΟΧΗ Rl Relational l < > <= >= λ ί Equality ==!= Bit wise ~ & ^ ^~ (ή ~^) Reduction & ~& ~ ^ ^~(ή ~^) Shift << >> Concatenation/Replication {A,B, } {4{A}} (πολλούς τελεστέους) Conditional * Εφαρμόζεται μόνο σε έναν τελεστέο x? y : z (3 τελεστέους) στην υλοποίηση Univeristy of Crete ΗΥ220 42
Χρόνος Προσομοίωσης `timescale<time_unit>/<time_precision> i i i i i time_unit: μονάδα μέτρησης χρόνου time_precision: i i ελάχιστο χρόνο βήματα κατά την προσομοίωση. Μονάδες χρόνου : s, ms, us, ns, ps, fs #<time> : αναμονή για χρόνο <time> #5 a=8 h1a 8h1a @ ( <σήμα> ): αναμονή μέχρι το σήμα να αλλάξει τιμή (event) @ (posedge clk)// θετική ακμή @ (negedge clk)// αρνητική ακμή @ () (a) @ (a or b or c) Univeristy of Crete ΗΥ220 43
Module Body declarations always blocks: Μπορεί να περιέχει πάνω από όένα initial block: Μπορεί να περιέχει ένα ή κανένα. modules/primitives instantiations module test(a, b,); input a;output b; reg b; wire c; always @(posedge a)begin b = #2 a; end always @(negedge a) begin b = #2 ~c; end not N1 (c, a) initial begin b = 0; end endmodule Univeristy of Crete ΗΥ220 44
Τύποι μεταβλητών στην Verilog integer wire reg tri // αριθμός // καλώδιο σύρμα // register // tristate Univeristy of Crete ΗΥ220 45
Wires Συνδυαστική λογική (δεν έχει μνήμη) ) Γράφος εξαρτήσεων Μπορεί να περιγράψει και ιδιαίτερα πολύπλοκη λογική wire sum = a ^ b; wire c = sum b; wire a = ~d; wire sum;... assign sum = a ^ b; wire muxout = (sel == 1)? a : b; wire op = ~(a & ((b)? ~c : d) ^ (~e)); Univeristy of Crete ΗΥ220 46
Σύρματα και συνδυαστική λογική module endmodule d Δήλωση εισόδων εξόδων Concurrent statements module adder(a, b, sum, cout); input a, b; output sum, cout; wire sum = a ^ b; wire cout = a & b; endmodule Univeristy of Crete ΗΥ220 47
Regs και ακολουθιακή ήλογική Στοιχεία μνήμης κάτι ανάλογο με μεταβλητές στη C Μόνο regs (οχι wires) παίρνουν τιμή σε initial και always blocks. Χρήση των begin και end για grouping πολλών προτάσεων Όπου χρησιμοποιούμε reg δεν σημαίνει οτι θα συμπεριφέρεται σαν καταχωρητής!!! reg a; initial begin a = 0; #5; a = 1; end reg q; always @(posedge clk) begin q = #2 (load)? d : q; end Univeristy of Crete ΗΥ220 48
Regs και συνδυαστική ήλογική Αν η συνάρτηση F() είναι πολύπλοκη τότε in1 in2 in3 Συνδιαστική Λογική F() out reg out; always @(in1 or in2 or in3) out = f(in1,in2,in3); reg out; Ισοδύναμα always @(in1 or in2 or in3) out = in1 (in2 & in3); wire out = in1 (in2 & in3); Univeristy of Crete ΗΥ220 49
Αναθέσεις (Assignments) blocking = always @(posedge clk) begin a = b; c = a; // c παίρνει τιμή του b end non blocking <= always @(posedge clk) begin a <= b; c <= a; // c παίρνει παλιά τιμή του a end b b a a c c Univeristy of Crete ΗΥ220 50
Αναθέσεις (Assignments) blocking = (η σειρα εχει σημασια!) always @( posedge clk) begin Z=Y; Y=X; y=x; z=y; non blocking <= η σειρα ΔΕΝ εχει σημασια always @(posedge clk) begin a <= b; c <= a; // c παίρνει παλιά τιμή του a end b a c Univeristy of Crete ΗΥ220 51
Αναθέσεις (Assignments) blocking = η σειρα εχει σημασια! always @( posedge clk) begin Z=Y; Y=X; // shift register y=x; z=y; //parallel ff. non blocking <= η σειρα ΔΕΝ εχει σημασια! always @(posedge clk) begin a <= b; c <= a; // c παίρνει παλιά τιμή του a end b a c Univeristy of Crete ΗΥ220 52
Assignments: Example time 0 : a = #10 b time 10 : c = a a(t=10) = b(t=0) c(t=10) = a(t=10) = b(t=0) time 0 : #10 time 10 : a = b time 10 : c = a a(t=10) = b(t=10) c(t=10) = a(t=10) = b(t=10) time 0 : a <= #10 b time 0 : c <= a a(t=10) = b(t=0) c(t=0) = a(t=0) Univeristy of Crete ΗΥ220 53
Κανόνες Πορτών Module Τα input και inout έχουν τύπο wire μέσα στο module Ta outputs μπορεί να έχουν τύπο wire ή reg Univeristy of Crete ΗΥ220 54
Συνδέσεις μεταξύ ξύinstances Με βάση την θέση module adder(sum, In1, In2) adder (A, B, C) // Sum = A, In1 = B, In2 = C Συσχετίζοντας ονόματα (το καλύτερο) module adder(sum, In1, In2) adder (.In2(B),.In1(A),.Sum(C)) // Sum = C, In1 = A, In2 = B Univeristy of Crete ΗΥ220 55
Buses (1/2) in1[1:0] in2[1:0] in1[1] in1[0] in2[1] in2[0] arith2 out[0] out[1:0] out[1] module arith2 (out, in1, in2); output [1:0] out; input [1:0] in1, in2; endmodule Univeristy of Crete ΗΥ220 56
Καμία διαφορά στη συμπεριφορά Συμβάσεις: [high : low] [msb : lsb] Προσοχή στις αναθέσεις (μήκη) και τις συνδέσεις εκτός του module Buses (2/2) module adder(a, b, sum, cout); input [7:0] a, b; output [7:0] sum; output cout; wire [8:0] tmp = a + b; wire [7:0] sum = tmp[7:0]; wire cout = tmp[8]; endmodule Univeristy of Crete ΗΥ220 57
Conditional lstatements t t If Else Το γνωστό if else Μόνο μεσα σε blocks! Επιτρέπονται πολλαπλά και nested ifs Πολλά Else if... Αν υπάρχει μόνο 1 πρόταση δεν χρειάζεται begin end module mux(a, b, sel, out ); input [4:0] a, b; input sel; output [4:0] out; reg [4:0] out; always @(a or b or sel) begin if ( sel == 0 ) begin out <= a; end else out <= b; end endmodule Univeristy of Crete ΗΥ220 58
Case Statementt t Το γνωστό case Μόνο μεσα σε blocks! Μόνο σταθερές εκφράσεις Δεν υπάρχει break! Υπάρχει default! module mux (a, b, c, d, sel, out ); input [4:0] a, b, c,d; input [1:0] sel; output [4:0] out; reg [4:0] out; 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; endcase end endmodule Univeristy of Crete ΗΥ220 59
Συνθέσιμος Κώδικας Ο Synthesizable κώδικας μπορεί να γίνει synthesize και να πάρουμε gate level μοντέλο για ASIC/FPGA. π.χ. wire [7:0] sum = tmp[7:0] & {8{a}}; wire cout = tmp[8]; Non synthesizable κώδικας χρησιμοποιείται μόνο για προσομοίωση και αφαιρείται κατά την διαδικασία της σύνθεσης (logic synthesis). π.χ. initial begin a = 0; b = 0; #5 a = 1; b = 1; end Univeristy of Crete ΗΥ220 60
Χρήση Καθυστέρησης στην Verilog Λειτουργική Επαλήθευση Functional Verification (RTL Model) Η καθυστέρηση είναι προσεγγιστική. Π.χ. always @(posedge clk) q <= #2 d; // FF με 2 μονάδες καθυστέρηση Συνήθως θεωρούμε ότι η συνδυαστική λογική δεν έχει καθυστέρηση. π.χ. wire a = (b & c) d; // μόνο την λειτουργία όχι καθυστέρηση πυλών Η καθυστέρηση χρησιμοποιείται κυρίως στο testbench κώδικα για να φτιάξουμε τα inputs. Χρονική Επαλήθευση Timing Verification Αναλυτικά κάθε πύλη έχει καθυστέρηση. Συνήθως κάνουμε timing verification σε gate level model το οποίο φτιάχνεται από όένα synthesis tool. Univeristy of Crete ΗΥ220 61
Ιεραρχικός Έλεγχος Κάθε module ξεχωριστά Block level simulation Testing Έλεγχος των προδιαγραφών, της λειτουργίας και των χρονισμών των σημάτων Όλο το design μαζί System level simulation Έλεγχος της συνολικής λειτουργίας και των διεπαφών Univeristy of Crete ΗΥ220 62
Έλεγχος σωστής λειτουργίας Testbench : top module που κάνει instantiate το module που τεστάρουμε, δημιουργεί τις τιμές των εισόδων του (stimulus) και ελέγχει ότι οι έξοδοί του παίρνουν σωστές τιμές. 2 προσεγγίσεις : Έλεγχος εξόδων και χρονισμού με το μάτι Έλεγχος εξόδων και χρονισμού μέσω κώδικα δλδ. αυτόματη σύγκριση των αναμενόμενων εξόδων. Univeristy of Crete ΗΥ220 63
Ένα απλό «test tbench» module tb_half_add; add; reg a, b; wire s, c; module half_add(a, b, sum, cout); input a, b; output sum, cout; half_add add0(a, b, s, c); wire sum = a ^ b; wire cout = a & b; initial begin endmodule a = 0; b = 0; #5 $display("a: %x, b: %x, s: %x, c: %x", a, b, s, c); a = 1; #5 $display("a: %x, b: %x, s: %x, c: %x", a, b, s, c); b = 1; #5 $display("a: a: %x, b: %x, s: %x, c: %x", a, b, s, c); a = 0; #5 $display("a: %x, b: %x, s: %x, c: %x", a, b, s, c); end endmodule Univeristy of Crete ΗΥ220 64
Simulator Univeristy of Crete ΗΥ220 65
Simulator Univeristy of Crete ΗΥ220 66
Μετρητής 8 bits (1/3) module counter(clk, reset, out); input clk, reset; output [7:0] out; wire [7:0] next_ value = out + 1; reg [7:0] out; always @(posedge clk) begin if (reset) out = #2 8 b0; else out = #2 next_value; end module clοck(out); output out; reg out; initial out = 1 b0; always out = #10 ~out; endmodule endmodule Univeristy of Crete ΗΥ220 67
Μετρητής 8 bits (2/3) module test; wire clk; reg reset; wire [7:0] count; clock clk0(clk); counter cnt0(clk, reset, count); initial begin reset = 1; @(posedge g clk); @(posedge clk); reset = #2 0; @(posedge clk); #300; $stop; end endmodule Univeristy of Crete ΗΥ220 68
Μετρητής 8 bits (3/3) clk reset count 00 01 02 03 04 05 06 counter.v clock.v test.vt Univeristy of Crete ΗΥ220 69
Backup slides Univeristy of Crete ΗΥ220 70
Mux: Dtfl Dataflow Module Module sel(a, b, sel, f); input a, b, sel; output f; endmodule a b sel f x y 0 x x y 1 y Univeristy of Crete ΗΥ220 71
Mux: Dtfl Dataflow Module Module sel(a, b, sel, f); input a, b, sel; output f; wire nsel, f1, f2; assign nsel = ~sel; assign f1 = a & nsel; assign f2 = b & sel; a b sel f x y 0 x assign f = f1 f2; endmodule x y 1 y Univeristy of Crete ΗΥ220 72
Mux: Dtfl Dataflow Module II module sel(a, b, sel, f); a b f input a, b, sel; output f; assign f = sel? a : b; sel endmodule a b sel f x y 0 x x y 1 y Univeristy of Crete ΗΥ220 73