Академический Документы
Профессиональный Документы
Культура Документы
UNIVERSITY
Objectives
After completing this lecture, you will be able to: Understand the features of HDLs and Verilog HDL Describe the HDL-based design flow Describe D ib th the basic b i features f t of f the th modules d l in i Verilog V il HDL Describe how to model a design in structural style Describe how to model a design in dataflow style Describe how to model a design in behavioral style Describe how to model a design g in mixed style y Describe how to simulate/verify a design using Verilog HDL
Slides are adopted from Digital System Designs and Practices Using Verilog HDL and FPGAs , John Wiley ECE301 VLSI System Design FALL 2011 S.Sivanantham
Importance of HDLs
HDL is an acronym of Hardware Description Language. Two most commonly used HDLs: Verilog HDL (also called Verilog for short) VHDL (V (Very hi high-speed h di integrated t t d circuits i it HDL) Features of HDLs: Design can be described at a very abstract level. level Functional verification can be done early in the design cycle. Designing with HDLs is analogous to computer programming.
FALL 2011
S.Sivanantham
FALL 2011
S.Sivanantham
CPLD/FPGA
Device selected
Device selected
Post-synthesis verification
Post-synthesis verification
Timing analysis
Timing analysis
Programming
Programming
Prototyping
Prototyping
Prototyping
FALL 2011
S.Sivanantham
Implem mentation
Synthesis
Back-end design
1
ECE301 VLSI System Design
7 GND
FALL 2011
S.Sivanantham
Lexical Conventions
Verilog HDL uses almost the same lexical conventions as C language. Identifiers consists of alphanumeric characters, _, and $. Verilog is a case-sensitive case sensitive language just like C. C White space: blank space (\b), tabs (\t), and new line (\n). Comments: // indicates that the remaining of the line is a comment. /* .*/ indicates what in between them are comments. Sized number: <size>`<base format><number> 4`b1001 --- a 4-bit binary number 16`habcd --- a 16-bit hexadecimal number
ECE301 VLSI System Design FALL 2011 S.Sivanantham
Lexical Conventions
Unsized number: `<base format><number> 2007 --- a 32-bit decimal number by default `habc --- a 32-bit hexadecimal number x or z values: l x denotes d t an unknown k value; l z denotes d t a high impedance value. Negative g number: -<size>`<base format><number> -4`b1001 --- a 4-bit binary number -16`habcd --- a 16-bit hexadecimal number _ and ? 16`b0101_1001_1110_0000 8`b01??_11?? --- equivalent to a 8`b01zz_11zz
ECE301 VLSI System Design FALL 2011 S.Sivanantham
Lexical Conventions
String: Back to School and Have a Nice Semester Coding style: Use lowercase letters for all signal names, names variable names, names and port names. Use uppercase letters for names of constants and userdefined types. Use meaningful names for signals, ports, functions, and p parameters.
FALL 2011
S.Sivanantham
Value 0 1 x z
Meaning Logic 0, false condition Logic 1, 1 true condition Unknown logic value High impedance
FALL 2011
S.Sivanantham
Data Types
Verilog HDL has two classes of data types. Nets mean any hardware connection points. Variables represent any data storage elements.
FALL 2011
S.Sivanantham
Data Types
A net variable can be referenced anywhere in a module. must be driven by a primitive, continuous assignment, force release, release or module port. port A variable can be referenced anywhere y in a module. can be assigned value only within a procedural statement, task, or function. cannot be an input or inout port in a module.
FALL 2011
S.Sivanantham
FALL 2011
S.Sivanantham
Port Declaration
Port Declaration input: input ports. output: output ports. inout: i t bidirectional bidi ti l ports t Port Connection Rules Named association Positional association
FALL 2011
S.Sivanantham
Port Declaration
module half_adder (x, y, s, c); input p x, , y; output s, c; // -- half adder body-- // // instantiate primitive gates (s, , x, , y); xor xor1 ( Can only be connected by using positional association and and1 (c, x, y); endmodule Instance name is optional. module full_adder (x, y, cin, s, cout); input x, y, cin; output s, cout; wire s1,c1,c2; // outputs of both half adders // -- full adder body-- // Connecting by using positional association // instantiate the half adder Connecting by using named association half_adder ha_1 (x, y, s1, c1); half_adder ha_2 (.x(cin), .y(s1), .s(s), .c(c2)); or (cout, c1, c2); Instance name is necessary. necessary endmodule
ECE301 VLSI System Design FALL 2011 S.Sivanantham
Structural modeling
// gate-level hierarchical description of 4-bit adder // gate gate-level level description of half adder module half_adder (x, y, s, c); input x, y; output s, c; // half h lf adder dd body b d // instantiate primitive gates xor (s,x,y); and (c,x,y); ( , ,y); endmodule
FALL 2011
S.Sivanantham
Structural modeling
// gate-level description of full adder module full_adder full adder (x, (x y, y cin, cin s, s cout); input x, y, cin; output s, cout; wire s1, c1, c2; // outputs of both half adders // full f ll adder dd body b d // instantiate the half adder half_adder ha_1 (x, y, s1, c1); half_adder ha_2 ( (cin, , s1, , s, , c2); ); or (cout, c1, c2); endmodule
FALL 2011
S.Sivanantham
Structural modeling
// gate-level description of 4-bit adder module four_bit_adder four bit adder (x (x, y y, c c_in, in sum, sum c c_out); out); input [3:0] x, y; input c_in; output p [3:0] [ ] sum; output c_out; wire c1, c2, c3; // intermediate carries // four_bit adder body // instantiate the full adder full_adder fa_1 (x[0], y[0], c_in, sum[0], c1); full_adder fa_2 (x[1], y[1], c1, sum[1], c2); f ll dd fa_3 full_adder f 3 (x[2], ( [2] y[2], [2] c2, 2 sum[2], [2] c3); 3) full_adder fa_4 (x[3], y[3], c3, sum[3], c_out); endmodule
FALL 2011
S.Sivanantham
Hierarchical Design
y x
cout
c0
S y[3] y Cout S s[3] x[3] x Cin c3 y[2] y Cout S s[2] x x y x[2] x Cin c2 y[1] y Cout S s[1] x[1] x Cin c1 y[0] y Cout S s[0] x[0] x Cin
cout
c0
cin x y s
s c2 cout
s1 y HA
c HA
c1
FALL 2011
S.Sivanantham
Dataflow Modeling
module full_adder_dataflow(x, y, c_in, sum, c_out); // I/O port declarations input x, y, c_in; output sum, c_out; // specify the function of a full adder assign #5 {c_out, sum} = x + y + c_in; endmodule
cin x y
FALL 2011
S.Sivanantham
Behavioral Modeling
module full_adder_behavioral(x, y, c_in, sum, c_out); // I/O port declarations input x, y, c_in; output sum, c_out; reg sum, c_out; // sum and c_out need to be declared as reg types. // specify if the h function f i of f a full f ll adder dd always @(x, y, c_in)// can also use always @(*) or always@(x or y or c_in) #5 {c_out, sum} = x + y + c_in; endmodule
FALL 2011
S.Sivanantham
s c2 cout
y HA
FALL 2011
S.Sivanantham
Top-Level Block
FALL 2011
S.Sivanantham
FALL 2011
S.Sivanantham
FALL 2011
S.Sivanantham
FALL 2011
S.Sivanantham
fa_1.ha_2.S
[0] [0]
[1] [1]
full_adder
x y Cin S Cout
[1]
[2] [2]
[3] [3]
sum[3:0] c_out
x[3:0] y[3:0]
[3:0] [3:0]
[0] [0]
fa_1.ha_1.S
fa_1.ha_2.C
fa_1.Cout
fa_2
fa_3
fa_4
FALL 2011
S.Sivanantham
FALL 2011
S.Sivanantham
# # # # # # # # # # # # #
280ns 300ns 320ns 340ns 360ns 380ns 400ns 420ns 440ns 460ns 480ns 500ns 520ns 540ns
0 0 1 1 1 1 1 1 1 1 1 1 1 1
e f 0 1 2 3 4 5 6 7 8 9 a b
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0e 0f 01 02 03 04 05 06 07 08 09 0a 0b 0c
S.Sivanantham
FALL 2011
S.Sivanantham